soc: nordic: add fn for setting constlat mode

Nordic SoCs implement an event system, for which the system can
optimize for low latency/high power or low power.

Add soc level implementation of reference counted API which will
optimize for low latency if any part of the system requires it.

Signed-off-by: Bjarki Arge Andreasen <bjarki.andreasen@nordicsemi.no>
This commit is contained in:
Bjarki Arge Andreasen 2024-10-16 15:36:50 +02:00 committed by Anas Nashif
parent 05529584a9
commit 3e6d6033bb
4 changed files with 131 additions and 0 deletions

View File

@ -29,3 +29,5 @@ if(CONFIG_TFM_PARTITION_PLATFORM)
$<TARGET_PROPERTY:tfm,TFM_BINARY_DIR>/api_ns/interface/include
)
endif()
zephyr_library_sources_ifdef(CONFIG_NRF_SYS_EVENT nrf_sys_event.c)

View File

@ -4,4 +4,8 @@
config HAS_NORDIC_DMM
bool
config NRF_SYS_EVENT
bool "nRF system event support"
select NRFX_POWER if !NRF_PLATFORM_HALTIUM
rsource "vpr/Kconfig"

View File

@ -0,0 +1,95 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <nrf_sys_event.h>
#if CONFIG_SOC_SERIES_NRF54HX
/*
* The 54HX is not yet supported by an nrfx driver nor the system controller so
* we implement an ISR and concurrent access safe reference counting implementation
* here using the nrfx hal.
*/
#include <hal/nrf_lrcconf.h>
static struct k_spinlock global_constlat_lock;
static uint16_t global_constlat_count;
int nrf_sys_event_request_global_constlat(void)
{
K_SPINLOCK(&global_constlat_lock) {
if (global_constlat_count == 0) {
#if CONFIG_SOC_NRF54H20_CPUAPP
nrf_lrcconf_task_trigger(NRF_LRCCONF010,
NRF_LRCCONF_TASK_CONSTLAT_ENABLE);
#elif CONFIG_SOC_NRF54H20_CPURAD
nrf_lrcconf_task_trigger(NRF_LRCCONF000,
NRF_LRCCONF_TASK_CONSTLAT_ENABLE);
nrf_lrcconf_task_trigger(NRF_LRCCONF020,
NRF_LRCCONF_TASK_CONSTLAT_ENABLE);
#else
#error "unsupported"
#endif
}
global_constlat_count++;
}
return 0;
}
int nrf_sys_event_release_global_constlat(void)
{
K_SPINLOCK(&global_constlat_lock) {
if (global_constlat_count == 1) {
#if CONFIG_SOC_NRF54H20_CPUAPP
nrf_lrcconf_task_trigger(NRF_LRCCONF010,
NRF_LRCCONF_TASK_CONSTLAT_DISABLE);
#elif CONFIG_SOC_NRF54H20_CPURAD
nrf_lrcconf_task_trigger(NRF_LRCCONF000,
NRF_LRCCONF_TASK_CONSTLAT_DISABLE);
nrf_lrcconf_task_trigger(NRF_LRCCONF020,
NRF_LRCCONF_TASK_CONSTLAT_DISABLE);
#else
#error "unsupported"
#endif
}
global_constlat_count--;
}
return 0;
}
#else
/*
* The nrfx power driver already contains an ISR and concurrent access safe reference
* counting API so we just use it directly when available.
*/
#include <nrfx_power.h>
int nrf_sys_event_request_global_constlat(void)
{
nrfx_err_t err;
err = nrfx_power_constlat_mode_request();
return (err == NRFX_SUCCESS || err == NRFX_ERROR_ALREADY) ? 0 : -EAGAIN;
}
int nrf_sys_event_release_global_constlat(void)
{
nrfx_err_t err;
err = nrfx_power_constlat_mode_free();
return (err == NRFX_SUCCESS || err == NRFX_ERROR_BUSY) ? 0 : -EAGAIN;
}
#endif

View File

@ -0,0 +1,30 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
/**
* @brief Request lowest latency for system events
*
* @details System will be configured for lowest latency after first
* call to nrf_sys_event_request_global_constlat() and will remain
* configured for lowest latency until matching number of calls to
* nrf_sys_event_release_global_constlat() occur.
*
* @retval 0 if successful
* @retval -errno code otherwise
*/
int nrf_sys_event_request_global_constlat(void);
/**
* @brief Release low latency request
*
* @see nrf_sys_event_request_global_constlat()
*
* @retval 0 if successful
* @retval -errno code otherwise
*/
int nrf_sys_event_release_global_constlat(void);