Skip to content

Commit

Permalink
[nrf fromlist] soc: nordic: add fn for setting constlat mode
Browse files Browse the repository at this point in the history
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.

Upstream PR: zephyrproject-rtos/zephyr#79934

Signed-off-by: Bjarki Arge Andreasen <[email protected]>
  • Loading branch information
bjarki-andreasen committed Oct 28, 2024
1 parent 52e3063 commit fe29da2
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 0 deletions.
2 changes: 2 additions & 0 deletions soc/nordic/common/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,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)
4 changes: 4 additions & 0 deletions soc/nordic/common/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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"
95 changes: 95 additions & 0 deletions soc/nordic/common/nrf_sys_event.c
Original file line number Diff line number Diff line change
@@ -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
30 changes: 30 additions & 0 deletions soc/nordic/common/nrf_sys_event.h
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit fe29da2

Please sign in to comment.