diff --git a/drivers/retained_mem/Kconfig.nrf b/drivers/retained_mem/Kconfig.nrf index 348361e5f6f..70aef8b504f 100644 --- a/drivers/retained_mem/Kconfig.nrf +++ b/drivers/retained_mem/Kconfig.nrf @@ -13,6 +13,6 @@ config RETAINED_MEM_NRF_RAM_CTRL bool "nRF RAM retention driver" default y depends on DT_HAS_ZEPHYR_RETAINED_RAM_ENABLED && RETAINED_MEM_ZEPHYR_RAM && POWEROFF - depends on SOC_FAMILY_NORDIC_NRF + depends on HAS_NORDIC_RAM_CTRL help Enable driver for Nordic RAM retention. diff --git a/drivers/retained_mem/retained_mem_nrf_ram_ctrl.c b/drivers/retained_mem/retained_mem_nrf_ram_ctrl.c index 8be3d5c35a3..08e777aa6fa 100644 --- a/drivers/retained_mem/retained_mem_nrf_ram_ctrl.c +++ b/drivers/retained_mem/retained_mem_nrf_ram_ctrl.c @@ -6,6 +6,7 @@ #include #include +#include #include @@ -22,7 +23,7 @@ static const struct ret_mem_region ret_mem_regions[] = { DT_FOREACH_STATUS_OKAY(zephyr_retained_ram, _BUILD_MEM_REGION) }; -static int retained_mem_nrf_init(void) +int z_nrf_retained_mem_retention_apply(void) { const struct ret_mem_region *rmr; @@ -33,5 +34,3 @@ static int retained_mem_nrf_init(void) return 0; } - -SYS_INIT(retained_mem_nrf_init, PRE_KERNEL_1, 0); diff --git a/include/zephyr/drivers/retained_mem/nrf_retained_mem.h b/include/zephyr/drivers/retained_mem/nrf_retained_mem.h new file mode 100644 index 00000000000..376673c92d1 --- /dev/null +++ b/include/zephyr/drivers/retained_mem/nrf_retained_mem.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef ZEPHYR_INCLUDE_DRIVERS_RETAINED_MEM_NRF_RETAINED_MEM_H +#define ZEPHYR_INCLUDE_DRIVERS_RETAINED_MEM_NRF_RETAINED_MEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if defined(CONFIG_RETAINED_MEM_NRF_RAM_CTRL) || defined(__DOXYGEN__) +/** @brief Apply memory retention settings. + * + * Memory retention settings to apply are derived from devicetree configuration. + * + * @retval 0 if the retention settings were applied successfully. + * @retval -ENOTSUP if retention configuration is not present in devicetree. + */ +int z_nrf_retained_mem_retention_apply(void); +#else +static inline int z_nrf_retained_mem_retention_apply(void) +{ + return -ENOTSUP; +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZEPHYR_INCLUDE_DRIVERS_RETAINED_MEM_NRF_RETAINED_MEM_H */ diff --git a/modules/hal_nordic/nrfx/CMakeLists.txt b/modules/hal_nordic/nrfx/CMakeLists.txt index fc3c8adb371..6bc5dfb15ad 100644 --- a/modules/hal_nordic/nrfx/CMakeLists.txt +++ b/modules/hal_nordic/nrfx/CMakeLists.txt @@ -109,7 +109,7 @@ zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_NRF92X ${MDK_DIR}/system_nrf92.c zephyr_library_sources(nrfx_glue.c) zephyr_library_sources(${HELPERS_DIR}/nrfx_flag32_allocator.c) -zephyr_library_sources_ifdef(CONFIG_RETAINED_MEM_NRF_RAM_CTRL ${HELPERS_DIR}/nrfx_ram_ctrl.c) +zephyr_library_sources_ifdef(CONFIG_HAS_NORDIC_RAM_CTRL ${HELPERS_DIR}/nrfx_ram_ctrl.c) zephyr_library_sources_ifdef(CONFIG_NRFX_GPPI ${HELPERS_DIR}/nrfx_gppi_dppi.c) zephyr_library_sources_ifdef(CONFIG_NRFX_PPI ${HELPERS_DIR}/nrfx_gppi_ppi.c) diff --git a/samples/boards/nordic/system_off/CMakeLists.txt b/samples/boards/nordic/system_off/CMakeLists.txt index 1cff779506b..986fca97f34 100644 --- a/samples/boards/nordic/system_off/CMakeLists.txt +++ b/samples/boards/nordic/system_off/CMakeLists.txt @@ -5,6 +5,6 @@ find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(nrf_system_off) target_sources(app PRIVATE src/main.c) -if (CONFIG_APP_USE_NRF_RETENTION OR CONFIG_APP_USE_RETAINED_MEM) +if (CONFIG_APP_USE_RETAINED_MEM) target_sources(app PRIVATE src/retained.c) endif() diff --git a/samples/boards/nordic/system_off/Kconfig b/samples/boards/nordic/system_off/Kconfig index c5a0f492d90..798927205bd 100644 --- a/samples/boards/nordic/system_off/Kconfig +++ b/samples/boards/nordic/system_off/Kconfig @@ -3,23 +3,9 @@ mainmenu "Nordic SYSTEM_OFF demo" -choice - prompt "Use retention" - optional - -config APP_USE_NRF_RETENTION - bool "Use state retention in system off using nRF POWER" - depends on SOC_COMPATIBLE_NRF52X && CRC - help - On some Nordic chips this application supports retaining - memory while in system off using POWER peripheral. - Select this to enable the feature. - config APP_USE_RETAINED_MEM bool "Use state retention in system off using retained_mem driver" - depends on RETAINED_MEM - -endchoice + select RETAINED_MEM config GRTC_WAKEUP_ENABLE bool "Use GRTC to wake up device from system off" diff --git a/samples/boards/nordic/system_off/README.rst b/samples/boards/nordic/system_off/README.rst index 7c98a4e8336..5124d087b77 100644 --- a/samples/boards/nordic/system_off/README.rst +++ b/samples/boards/nordic/system_off/README.rst @@ -13,10 +13,10 @@ deep sleep on Nordic platforms. RAM Retention ============= -This sample can also can demonstrate RAM retention. By selecting -``CONFIG_APP_USE_NRF_RETENTION=y`` or ``CONFIG_APP_USE_RETAINED_MEM=y`` -state related to number of boots, number of times system off was entered, -and total uptime since initial power-on are retained in a checksummed data structure. +This sample can also demonstrate RAM retention. +By selecting ``CONFIG_APP_USE_RETAINED_MEM=y`` state related to number of boots, +number of times system off was entered, and total uptime since initial power-on +are retained in a checksummed data structure. RAM is configured to keep the containing section powered while in system-off mode. Requirements diff --git a/samples/boards/nordic/system_off/boards/nrf52840dk_nrf52840.overlay b/samples/boards/nordic/system_off/boards/nrf52840dk_nrf52840.overlay new file mode 100644 index 00000000000..c203d90a0a1 --- /dev/null +++ b/samples/boards/nordic/system_off/boards/nrf52840dk_nrf52840.overlay @@ -0,0 +1,22 @@ +/ { + sram0@2003f000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x2003f000 DT_SIZE_K(4)>; + zephyr,memory-region = "RetainedMem"; + status = "okay"; + + retainedmem0: retainedmem { + compatible = "zephyr,retained-ram"; + status = "okay"; + }; + }; + + aliases { + retainedmemdevice = &retainedmem0; + }; +}; + +&sram0 { + /* Shrink SRAM size to avoid overlap with retained memory region */ + reg = <0x20000000 DT_SIZE_K(252)>; +}; diff --git a/samples/boards/nordic/system_off/boards/nrf52dk_nrf52832.overlay b/samples/boards/nordic/system_off/boards/nrf52dk_nrf52832.overlay new file mode 100644 index 00000000000..13e2e99ddf2 --- /dev/null +++ b/samples/boards/nordic/system_off/boards/nrf52dk_nrf52832.overlay @@ -0,0 +1,22 @@ +/ { + sram0@20007000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x20007000 DT_SIZE_K(4)>; + zephyr,memory-region = "RetainedMem"; + status = "okay"; + + retainedmem0: retainedmem { + compatible = "zephyr,retained-ram"; + status = "okay"; + }; + }; + + aliases { + retainedmemdevice = &retainedmem0; + }; +}; + +&sram0 { + /* Shrink SRAM size to avoid overlap with retained memory region */ + reg = <0x20000000 DT_SIZE_K(28)>; +}; diff --git a/samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l05_cpuapp_retained_mem.overlay b/samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l05_cpuapp.overlay similarity index 100% rename from samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l05_cpuapp_retained_mem.overlay rename to samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l05_cpuapp.overlay diff --git a/samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l10_cpuapp_retained_mem.overlay b/samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l10_cpuapp.overlay similarity index 100% rename from samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l10_cpuapp_retained_mem.overlay rename to samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l10_cpuapp.overlay diff --git a/samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l15_cpuapp_retained_mem.overlay b/samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l15_cpuapp.overlay similarity index 100% rename from samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l15_cpuapp_retained_mem.overlay rename to samples/boards/nordic/system_off/boards/nrf54l15dk_nrf54l15_cpuapp.overlay diff --git a/samples/boards/nordic/system_off/sample.yaml b/samples/boards/nordic/system_off/sample.yaml index 18f629c4e54..fcc96f6c44d 100644 --- a/samples/boards/nordic/system_off/sample.yaml +++ b/samples/boards/nordic/system_off/sample.yaml @@ -22,32 +22,17 @@ tests: - "system off demo" - "Retained data not supported" - "Entering system off; press sw0 to restart" - sample.boards.nrf.system_off.nrf_retained: + sample.boards.nrf.system_off.retained_mem: integration_platforms: - nrf52840dk/nrf52840 platform_allow: - nrf52840dk/nrf52840 - nrf52dk/nrf52832 - extra_configs: - - CONFIG_APP_USE_NRF_RETENTION=y - harness: console - harness_config: - type: multi_line - ordered: true - regex: - - "system off demo" - - "Retained data: INVALID" - - "Boot count: 1" - - "Off count: 0" - - "Active Ticks:" - - "Entering system off; press sw0 to restart" - sample.boards.nrf.system_off.retained_mem: - extra_args: DTC_OVERLAY_FILE="boards/nrf54l15dk_nrf54l15_cpuapp_retained_mem.overlay" - platform_allow: - nrf54l15dk/nrf54l15/cpuapp + - nrf54l15dk/nrf54l10/cpuapp + - nrf54l15dk/nrf54l05/cpuapp extra_configs: - CONFIG_APP_USE_RETAINED_MEM=y - - CONFIG_RETAINED_MEM=y harness: console harness_config: type: multi_line @@ -62,6 +47,8 @@ tests: sample.boards.nrf.system_off.grtc_wakeup: platform_allow: - nrf54l15dk/nrf54l15/cpuapp + - nrf54l15dk/nrf54l10/cpuapp + - nrf54l15dk/nrf54l05/cpuapp extra_configs: - CONFIG_GRTC_WAKEUP_ENABLE=y harness: console @@ -79,13 +66,13 @@ tests: - "Retained data not supported" - "Entering system off; wait 2 seconds to restart" sample.boards.nrf.system_off.retained_mem.grtc_wakeup: - extra_args: DTC_OVERLAY_FILE="boards/nrf54l15dk_nrf54l15_cpuapp_retained_mem.overlay" platform_allow: - nrf54l15dk/nrf54l15/cpuapp + - nrf54l15dk/nrf54l10/cpuapp + - nrf54l15dk/nrf54l05/cpuapp extra_configs: - CONFIG_APP_USE_RETAINED_MEM=y - CONFIG_GRTC_WAKEUP_ENABLE=y - - CONFIG_RETAINED_MEM=y harness: console harness_config: type: multi_line diff --git a/samples/boards/nordic/system_off/src/main.c b/samples/boards/nordic/system_off/src/main.c index b40b1ea26da..40c4f2bb7a5 100644 --- a/samples/boards/nordic/system_off/src/main.c +++ b/samples/boards/nordic/system_off/src/main.c @@ -35,7 +35,7 @@ int main(void) printf("\n%s system off demo\n", CONFIG_BOARD); - if (IS_ENABLED(CONFIG_APP_USE_NRF_RETENTION) || IS_ENABLED(CONFIG_APP_USE_RETAINED_MEM)) { + if (IS_ENABLED(CONFIG_APP_USE_RETAINED_MEM)) { bool retained_ok = retained_validate(); /* Increment for this boot attempt and update. */ @@ -81,7 +81,7 @@ int main(void) return 0; } - if (IS_ENABLED(CONFIG_APP_USE_NRF_RETENTION) || IS_ENABLED(CONFIG_APP_USE_RETAINED_MEM)) { + if (IS_ENABLED(CONFIG_APP_USE_RETAINED_MEM)) { /* Update the retained state */ retained.off_count += 1; retained_update(); diff --git a/samples/boards/nordic/system_off/src/retained.c b/samples/boards/nordic/system_off/src/retained.c index 66f6a353f04..316ec165d62 100644 --- a/samples/boards/nordic/system_off/src/retained.c +++ b/samples/boards/nordic/system_off/src/retained.c @@ -15,147 +15,24 @@ #include #include -#if CONFIG_APP_USE_NRF_RETENTION -#include - -/* nRF52 RAM (really, RAM AHB slaves) are partitioned as: - * * Up to 8 blocks of two 4 KiBy byte "small" sections - * * A 9th block of with 32 KiBy "large" sections - * - * At time of writing the maximum number of large sections is 6, all - * within the first large block. Theoretically there could be more - * sections in the 9th block, and possibly more blocks. - */ - -/* Inclusive address of RAM start */ -#define SRAM_BEGIN (uintptr_t)DT_REG_ADDR(DT_NODELABEL(sram0)) - -/* Exclusive address of RAM end */ -#define SRAM_END (SRAM_BEGIN + (uintptr_t)DT_REG_SIZE(DT_NODELABEL(sram0))) - -/* Size of a controllable RAM section in the small blocks */ -#define SMALL_SECTION_SIZE 4096 - -/* Number of controllable RAM sections in each of the lower blocks */ -#define SMALL_SECTIONS_PER_BLOCK 2 - -/* Span of a small block */ -#define SMALL_BLOCK_SIZE (SMALL_SECTIONS_PER_BLOCK * SMALL_SECTION_SIZE) - -/* Number of small blocks */ -#define SMALL_BLOCK_COUNT 8 - -/* Span of the SRAM area covered by small sections */ -#define SMALL_SECTION_SPAN (SMALL_BLOCK_COUNT * SMALL_BLOCK_SIZE) - -/* Inclusive address of the RAM range covered by large sections */ -#define LARGE_SECTION_BEGIN (SRAM_BEGIN + SMALL_SECTION_SPAN) - -/* Size of a controllable RAM section in large blocks */ -#define LARGE_SECTION_SIZE 32768 - -#elif CONFIG_APP_USE_RETAINED_MEM +#if DT_NODE_HAS_STATUS_OKAY(DT_ALIAS(retainedmemdevice)) const static struct device *retained_mem_device = DEVICE_DT_GET(DT_ALIAS(retainedmemdevice)); -#endif - -/* Set or clear RAM retention in SYSTEM_OFF for the provided object. - * - * @param ptr pointer to the start of the retainable object - * - * @param len length of the retainable object - * - * @param enable true to enable retention, false to clear retention - */ -static int ram_range_retain(const void *ptr, - size_t len, - bool enable) -{ - int rc = 0; - -#if CONFIG_APP_USE_NRF_RETENTION - /* This only works for nRF52 with the POWER module. - * The other Nordic chips use a different low-level API, - * which is not currently used by this variant. - */ - uintptr_t addr = (uintptr_t)ptr; - uintptr_t addr_end = addr + len; - - /* Error if the provided range is empty or doesn't lie - * entirely within the SRAM address space. - */ - if ((len == 0U) - || (addr < SRAM_BEGIN) - || (addr > (SRAM_END - len))) { - return -EINVAL; - } - - /* Iterate over each section covered by the range, setting the - * corresponding RAM OFF retention bit in the parent block. - */ - do { - uintptr_t block_base = SRAM_BEGIN; - uint32_t section_size = SMALL_SECTION_SIZE; - uint32_t sections_per_block = SMALL_SECTIONS_PER_BLOCK; - bool is_large = (addr >= LARGE_SECTION_BEGIN); - uint8_t block = 0; - - if (is_large) { - block = 8; - block_base = LARGE_SECTION_BEGIN; - section_size = LARGE_SECTION_SIZE; - - /* RAM[x] supports only 16 sections, each its own bit - * for POWER (0..15) and RETENTION (16..31). We don't - * know directly how many sections are present, so - * assume they all are; the true limit will be - * determined by the SRAM size. - */ - sections_per_block = 16; - } - - uint32_t section = (addr - block_base) / section_size; - - if (section >= sections_per_block) { - block += section / sections_per_block; - section %= sections_per_block; - } - - uint32_t section_mask = - (POWER_RAM_POWERSET_S0RETENTION_On - << (section + POWER_RAM_POWERSET_S0RETENTION_Pos)); - - if (enable) { - nrf_power_rampower_mask_on(NRF_POWER, block, section_mask); - } else { - nrf_power_rampower_mask_off(NRF_POWER, block, section_mask); - } - - /* Move to the first address in the next section. */ - addr += section_size - (addr % section_size); - } while (addr < addr_end); -#elif CONFIG_APP_USE_RETAINED_MEM - /* Retention setting cannot be controlled runtime with retained_mem API */ - (void)enable; - rc = retained_mem_write(retained_mem_device, 0, ptr, len); #else - #error "Unsupported retention setting" +#error "retained_mem region not defined" #endif - return rc; -} - -/* Retained data must be defined in a no-init section to prevent the C - * runtime initialization from zeroing it before anybody can see it. - * It is not necesarry when retained_mem driver is utilized - * as in this case retained data is stored in an area not initialized in runtime. - */ -__noinit struct retained_data retained; +struct retained_data retained; #define RETAINED_CRC_OFFSET offsetof(struct retained_data, crc) #define RETAINED_CHECKED_SIZE (RETAINED_CRC_OFFSET + sizeof(retained.crc)) bool retained_validate(void) { + int rc; + + rc = retained_mem_read(retained_mem_device, 0, (uint8_t *)&retained, sizeof(retained)); + __ASSERT_NO_MSG(rc == 0); + /* The residue of a CRC is what you get from the CRC over the * message catenated with its CRC. This is the post-final-xor * residue for CRC-32 (CRC-32/ISO-HDLC) which Zephyr calls @@ -174,19 +51,13 @@ bool retained_validate(void) /* Reset to accrue runtime from this session. */ retained.uptime_latest = 0; - /* Reconfigure to retain the state during system off, regardless of - * whether validation succeeded. Although these values can sometimes - * be observed to be preserved across System OFF, the product - * specification states they are not retained in that situation, and - * that can also be observed. - */ - (void)ram_range_retain(&retained, RETAINED_CHECKED_SIZE, true); - return valid; } void retained_update(void) { + int rc; + uint64_t now = k_uptime_ticks(); retained.uptime_sum += (now - retained.uptime_latest); @@ -196,4 +67,7 @@ void retained_update(void) RETAINED_CRC_OFFSET); retained.crc = sys_cpu_to_le32(crc); + + rc = retained_mem_write(retained_mem_device, 0, (uint8_t *)&retained, sizeof(retained)); + __ASSERT_NO_MSG(rc == 0); } diff --git a/soc/nordic/common/Kconfig b/soc/nordic/common/Kconfig index ef32e7403c1..e7e24ca8cf2 100644 --- a/soc/nordic/common/Kconfig +++ b/soc/nordic/common/Kconfig @@ -4,6 +4,9 @@ config HAS_NORDIC_DMM bool +config HAS_NORDIC_RAM_CTRL + bool "nRF RAM control helper support" + config NRF_SYS_EVENT bool "nRF system event support" select NRFX_POWER if !NRF_PLATFORM_HALTIUM diff --git a/soc/nordic/common/poweroff.c b/soc/nordic/common/poweroff.c index b3210da697d..99a2bcfb3d6 100644 --- a/soc/nordic/common/poweroff.c +++ b/soc/nordic/common/poweroff.c @@ -5,6 +5,7 @@ #include #include +#include #if defined(CONFIG_SOC_SERIES_NRF51X) || defined(CONFIG_SOC_SERIES_NRF52X) #include @@ -17,8 +18,45 @@ #include #endif +#if defined(CONFIG_HAS_NORDIC_RAM_CTRL) +#include +#endif + void z_sys_poweroff(void) { +#if defined(CONFIG_HAS_NORDIC_RAM_CTRL) + uint8_t *ram_start; + size_t ram_size; + +#if defined(NRF_MEMORY_RAM_BASE) + ram_start = (uint8_t *)NRF_MEMORY_RAM_BASE; +#else + ram_start = (uint8_t *)NRF_MEMORY_RAM0_BASE; +#endif + + ram_size = 0; +#if defined(NRF_MEMORY_RAM_SIZE) + ram_size += NRF_MEMORY_RAM_SIZE; +#endif +#if defined(NRF_MEMORY_RAM0_SIZE) + ram_size += NRF_MEMORY_RAM0_SIZE; +#endif +#if defined(NRF_MEMORY_RAM1_SIZE) + ram_size += NRF_MEMORY_RAM1_SIZE; +#endif +#if defined(NRF_MEMORY_RAM2_SIZE) + ram_size += NRF_MEMORY_RAM2_SIZE; +#endif + + /* Disable retention for all memory blocks */ + nrfx_ram_ctrl_retention_enable_set(ram_start, ram_size, false); +#endif + +#if defined(CONFIG_RETAINED_MEM_NRF_RAM_CTRL) + /* Restore retention for retained_mem driver regions defined in devicetree */ + (void)z_nrf_retained_mem_retention_apply(); +#endif + #if defined(CONFIG_SOC_SERIES_NRF54LX) nrfx_reset_reason_clear(UINT32_MAX); #endif diff --git a/soc/nordic/nrf52/Kconfig b/soc/nordic/nrf52/Kconfig index adb57916627..edc2b70d667 100644 --- a/soc/nordic/nrf52/Kconfig +++ b/soc/nordic/nrf52/Kconfig @@ -11,6 +11,7 @@ config SOC_SERIES_NRF52X imply XIP select HAS_NRFX select HAS_NORDIC_DRIVERS + select HAS_NORDIC_RAM_CTRL select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE select HAS_SWO select HAS_POWEROFF diff --git a/soc/nordic/nrf54h/Kconfig b/soc/nordic/nrf54h/Kconfig index 3e46ce83077..7698c26d9f2 100644 --- a/soc/nordic/nrf54h/Kconfig +++ b/soc/nordic/nrf54h/Kconfig @@ -21,6 +21,7 @@ config SOC_NRF54H20_CPUAPP_COMMON select CPU_HAS_FPU select CPU_HAS_CUSTOM_FIXED_SOC_MPU_REGIONS select HAS_NORDIC_DMM + select HAS_NORDIC_RAM_CTRL select HAS_SEGGER_RTT if ZEPHYR_SEGGER_MODULE select NRFS_HAS_CLOCK_SERVICE select NRFS_HAS_DVFS_SERVICE @@ -52,6 +53,7 @@ config SOC_NRF54H20_CPURAD_COMMON select NRFS_HAS_TEMP_SERVICE select NRFS_HAS_VBUS_DETECTOR_SERVICE select HAS_NORDIC_DMM + select HAS_NORDIC_RAM_CTRL select HAS_PM select HAS_POWEROFF diff --git a/soc/nordic/nrf54l/Kconfig b/soc/nordic/nrf54l/Kconfig index c4cd8e6aa0f..ab5f1c745b9 100644 --- a/soc/nordic/nrf54l/Kconfig +++ b/soc/nordic/nrf54l/Kconfig @@ -20,6 +20,7 @@ config SOC_NRF54L_CPUAPP_COMMON select CPU_HAS_FPU select HAS_HW_NRF_RADIO_IEEE802154 select HAS_POWEROFF + select HAS_NORDIC_RAM_CTRL config SOC_NRF54L05_CPUAPP select SOC_NRF54L_CPUAPP_COMMON