diff --git a/boards/espressif/esp32_devkitc/esp32_devkitc_procpu.yaml b/boards/espressif/esp32_devkitc/esp32_devkitc_procpu.yaml index 7a1a124e7d7ba..eb4bfe5eddbf6 100644 --- a/boards/espressif/esp32_devkitc/esp32_devkitc_procpu.yaml +++ b/boards/espressif/esp32_devkitc/esp32_devkitc_procpu.yaml @@ -19,4 +19,5 @@ supported: - counter - entropy - input + - retained_mem vendor: espressif diff --git a/boards/espressif/esp32_ethernet_kit/esp32_ethernet_kit_procpu.yaml b/boards/espressif/esp32_ethernet_kit/esp32_ethernet_kit_procpu.yaml index f6fd5a5f410ca..e659af6337777 100644 --- a/boards/espressif/esp32_ethernet_kit/esp32_ethernet_kit_procpu.yaml +++ b/boards/espressif/esp32_ethernet_kit/esp32_ethernet_kit_procpu.yaml @@ -11,4 +11,5 @@ supported: - nvs - pwm - i2s + - retained_mem vendor: espressif diff --git a/boards/espressif/esp32c3_devkitc/esp32c3_devkitc.yaml b/boards/espressif/esp32c3_devkitc/esp32c3_devkitc.yaml index f2b98e3e4ed67..98775569c8f5e 100644 --- a/boards/espressif/esp32c3_devkitc/esp32c3_devkitc.yaml +++ b/boards/espressif/esp32c3_devkitc/esp32c3_devkitc.yaml @@ -15,4 +15,5 @@ supported: - spi - counter - entropy + - retained_mem vendor: espressif diff --git a/boards/espressif/esp32c3_devkitm/esp32c3_devkitm.yaml b/boards/espressif/esp32c3_devkitm/esp32c3_devkitm.yaml index 38153891381d8..07b9e086f306d 100644 --- a/boards/espressif/esp32c3_devkitm/esp32c3_devkitm.yaml +++ b/boards/espressif/esp32c3_devkitm/esp32c3_devkitm.yaml @@ -16,4 +16,5 @@ supported: - spi - counter - entropy + - retained_mem vendor: espressif diff --git a/boards/espressif/esp32c3_rust/esp32c3_rust.yaml b/boards/espressif/esp32c3_rust/esp32c3_rust.yaml index a82552337b42a..56b21cb2f09dc 100644 --- a/boards/espressif/esp32c3_rust/esp32c3_rust.yaml +++ b/boards/espressif/esp32c3_rust/esp32c3_rust.yaml @@ -18,4 +18,5 @@ supported: - spi - counter - entropy + - retained_mem vendor: espressif diff --git a/boards/espressif/esp32c6_devkitc/esp32c6_devkitc_hpcore.yaml b/boards/espressif/esp32c6_devkitc/esp32c6_devkitc_hpcore.yaml index 895ef8060057b..12c51d5a85ea7 100644 --- a/boards/espressif/esp32c6_devkitc/esp32c6_devkitc_hpcore.yaml +++ b/boards/espressif/esp32c6_devkitc/esp32c6_devkitc_hpcore.yaml @@ -18,6 +18,7 @@ supported: - i2c - i2s - netif:openthread + - retained_mem testing: ignore_tags: diff --git a/boards/espressif/esp32h2_devkitm/esp32h2_devkitm.yaml b/boards/espressif/esp32h2_devkitm/esp32h2_devkitm.yaml index a232d69192997..899de0728597e 100644 --- a/boards/espressif/esp32h2_devkitm/esp32h2_devkitm.yaml +++ b/boards/espressif/esp32h2_devkitm/esp32h2_devkitm.yaml @@ -18,3 +18,4 @@ supported: - i2c - i2s - netif:openthread + - retained_mem diff --git a/boards/espressif/esp32s2_devkitc/esp32s2_devkitc.yaml b/boards/espressif/esp32s2_devkitc/esp32s2_devkitc.yaml index b3598a28d9c04..2d7210b7ab4e2 100644 --- a/boards/espressif/esp32s2_devkitc/esp32s2_devkitc.yaml +++ b/boards/espressif/esp32s2_devkitc/esp32s2_devkitc.yaml @@ -20,6 +20,7 @@ supported: - input - can - dma + - retained_mem testing: ignore_tags: - bluetooth diff --git a/boards/espressif/esp32s2_saola/esp32s2_saola.yaml b/boards/espressif/esp32s2_saola/esp32s2_saola.yaml index e8a37ffd2edca..93cda37469933 100644 --- a/boards/espressif/esp32s2_saola/esp32s2_saola.yaml +++ b/boards/espressif/esp32s2_saola/esp32s2_saola.yaml @@ -18,6 +18,7 @@ supported: - counter - entropy - input + - retained_mem testing: ignore_tags: - bluetooth diff --git a/boards/espressif/esp32s3_devkitc/esp32s3_devkitc_procpu.yaml b/boards/espressif/esp32s3_devkitc/esp32s3_devkitc_procpu.yaml index ae1de5034e7e4..05957a2bbec2c 100644 --- a/boards/espressif/esp32s3_devkitc/esp32s3_devkitc_procpu.yaml +++ b/boards/espressif/esp32s3_devkitc/esp32s3_devkitc_procpu.yaml @@ -17,4 +17,5 @@ supported: - pwm - dma - input + - retained_mem vendor: espressif diff --git a/boards/espressif/esp32s3_devkitm/esp32s3_devkitm_procpu.yaml b/boards/espressif/esp32s3_devkitm/esp32s3_devkitm_procpu.yaml index e153c2e9f8178..dab37d7c5436e 100644 --- a/boards/espressif/esp32s3_devkitm/esp32s3_devkitm_procpu.yaml +++ b/boards/espressif/esp32s3_devkitm/esp32s3_devkitm_procpu.yaml @@ -18,4 +18,5 @@ supported: - dma - input - video + - retained_mem vendor: espressif diff --git a/boards/espressif/esp32s3_eye/esp32s3_eye_procpu.yaml b/boards/espressif/esp32s3_eye/esp32s3_eye_procpu.yaml index 0f1ec31c71f5a..94c81acfeb83a 100644 --- a/boards/espressif/esp32s3_eye/esp32s3_eye_procpu.yaml +++ b/boards/espressif/esp32s3_eye/esp32s3_eye_procpu.yaml @@ -18,4 +18,5 @@ supported: - dma - input - video + - retained_mem vendor: espressif diff --git a/boards/espressif/esp_wrover_kit/esp_wrover_kit_procpu.yaml b/boards/espressif/esp_wrover_kit/esp_wrover_kit_procpu.yaml index 88bcdc3289b18..855a7ddb37e7f 100644 --- a/boards/espressif/esp_wrover_kit/esp_wrover_kit_procpu.yaml +++ b/boards/espressif/esp_wrover_kit/esp_wrover_kit_procpu.yaml @@ -17,4 +17,5 @@ supported: - spi - counter - entropy + - retained_mem vendor: espressif diff --git a/dts/riscv/espressif/esp32c3/esp32c3_common.dtsi b/dts/riscv/espressif/esp32c3/esp32c3_common.dtsi index ecd8b807a2d00..271ae1ccda6a1 100644 --- a/dts/riscv/espressif/esp32c3/esp32c3_common.dtsi +++ b/dts/riscv/espressif/esp32c3/esp32c3_common.dtsi @@ -100,6 +100,12 @@ zephyr,memory-region = "SRAM1"; }; + rtc_fast_ram: memory@50000000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50000000 DT_SIZE_K(8)>; + zephyr,memory-region = "RTC_FAST_RAM"; + }; + intc: interrupt-controller@600c2000 { compatible = "espressif,esp32-intc"; #address-cells = <0>; diff --git a/dts/riscv/espressif/esp32c6/esp32c6_common.dtsi b/dts/riscv/espressif/esp32c6/esp32c6_common.dtsi index 34d70c43121ee..b4808afaae7ef 100644 --- a/dts/riscv/espressif/esp32c6/esp32c6_common.dtsi +++ b/dts/riscv/espressif/esp32c6/esp32c6_common.dtsi @@ -103,7 +103,7 @@ #address-cells = <1>; #size-cells = <1>; compatible = "zephyr,memory-region", "mmio-sram"; - reg = <0x50000000 DT_SIZE_K(16)>; + reg = <0x50000000 (DT_SIZE_K(16) - 0x10)>; zephyr,memory-region = "SRAMLP "; shmlp: memory@50003fe0 { diff --git a/dts/xtensa/espressif/esp32/esp32_common.dtsi b/dts/xtensa/espressif/esp32/esp32_common.dtsi index 0b035bcdcdd49..6e3a6251cf3a0 100644 --- a/dts/xtensa/espressif/esp32/esp32_common.dtsi +++ b/dts/xtensa/espressif/esp32/esp32_common.dtsi @@ -138,6 +138,18 @@ }; }; + rtc_fast_ram: memory@3ff80000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x3ff80000 DT_SIZE_K(8)>; + zephyr,memory-region = "RTC_FAST_RAM"; + }; + + rtc_slow_ram: memory@50000000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50000000 DT_SIZE_K(8)>; + zephyr,memory-region = "RTC_SLOW_RAM"; + }; + icache0: icache0@400d0000 { compatible = "zephyr,memory-region", "mmio-sram"; reg = <0x400d0000 DT_SIZE_K(11456)>; diff --git a/dts/xtensa/espressif/esp32s2/esp32s2_common.dtsi b/dts/xtensa/espressif/esp32s2/esp32s2_common.dtsi index 416acd5ce4a98..5f33688c354de 100644 --- a/dts/xtensa/espressif/esp32s2/esp32s2_common.dtsi +++ b/dts/xtensa/espressif/esp32s2/esp32s2_common.dtsi @@ -116,6 +116,18 @@ }; }; + rtc_fast_ram: memory@3ff9e000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x3ff9e000 DT_SIZE_K(8)>; + zephyr,memory-region = "RTC_FAST_RAM"; + }; + + rtc_slow_ram: memory@50000000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50000000 DT_SIZE_K(8)>; + zephyr,memory-region = "RTC_SLOW_RAM"; + }; + icache0: icache0@40080000 { compatible = "zephyr,memory-region"; reg = <0x40080000 DT_SIZE_K(7680)>; diff --git a/dts/xtensa/espressif/esp32s3/esp32s3_common.dtsi b/dts/xtensa/espressif/esp32s3/esp32s3_common.dtsi index bd70801e63b0a..ed5cb8a0c39fc 100644 --- a/dts/xtensa/espressif/esp32s3/esp32s3_common.dtsi +++ b/dts/xtensa/espressif/esp32s3/esp32s3_common.dtsi @@ -161,6 +161,18 @@ #mbox-cells = <1>; }; + rtc_slow_ram: memory@50000000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50000000 DT_SIZE_K(8)>; + zephyr,memory-region = "RTC_SLOW_RAM"; + }; + + rtc_fast_ram: memory@600fe000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x600fe000 DT_SIZE_K(8)>; + zephyr,memory-region = "RTC_FAST_RAM"; + }; + intc: interrupt-controller@600c2000 { #interrupt-cells = <3>; #address-cells = <0>; diff --git a/soc/espressif/esp32/default.ld b/soc/espressif/esp32/default.ld index 1809b258721c9..cc9fb8bb7fc29 100644 --- a/soc/espressif/esp32/default.ld +++ b/soc/espressif/esp32/default.ld @@ -34,6 +34,14 @@ procpu_ext_ram_org = DCACHE1_START; procpu_ext_ram_len = DCACHE1_SIZE; #endif +/* RTC RAM memory segments */ +rtc_slow_org = RCT_SLOW_RAM_START; +rtc_slow_len = RCT_SLOW_RAM_SIZE; +rtc_data_org = RCT_FAST_RAM_START; +rtc_data_len = RCT_FAST_RAM_SIZE; +rtc_iram_org = RCT_FAST_RAM_START + 0x140000; +rtc_iram_len = RCT_FAST_RAM_SIZE; + /* Aliases */ #define FLASH_CODE_REGION irom0_0_seg #define RODATA_REGION drom0_0_seg @@ -87,9 +95,9 @@ MEMORY irom0_0_seg(RX): org = procpu_irom_org, len = procpu_irom_len drom0_0_seg(R): org = procpu_drom_org, len = procpu_drom_len - rtc_iram_seg(RWX): org = 0x400c0000, len = 0x2000 - rtc_slow_seg(RW): org = 0x50000000, len = 0x2000 - CONFIG_RESERVE_RTC_MEM - rtc_data_seg(RW): org = 0x3ff80000, len = 0x2000 + rtc_iram_seg(RWX): org = rtc_iram_org, len = rtc_iram_len + rtc_slow_seg(RW): org = rtc_slow_org, len = rtc_slow_len - CONFIG_RESERVE_RTC_MEM + rtc_data_seg(RW): org = rtc_data_org, len = rtc_data_len /* We reduced the size of rtc_slow_seg by CONFIG_RESERVE_RTC_MEM value. * It reserves the amount of RTC slow memory that we use for this memory segment. @@ -98,7 +106,7 @@ MEMORY * org = 0x50000000 + 0x2000 - CONFIG_RESERVE_RTC_MEM */ #if (CONFIG_RESERVE_RTC_MEM > 0) - rtc_slow_reserved_seg(RW): org = 0x50000000 + 0x2000 - CONFIG_RESERVE_RTC_MEM, + rtc_slow_reserved_seg(RW): org = rtc_slow_org + rtc_slow_len - CONFIG_RESERVE_RTC_MEM, len = CONFIG_RESERVE_RTC_MEM #endif diff --git a/soc/espressif/esp32/memory.h b/soc/espressif/esp32/memory.h index f03dc9d804f98..9076748fba9fa 100644 --- a/soc/espressif/esp32/memory.h +++ b/soc/espressif/esp32/memory.h @@ -26,6 +26,14 @@ #define SRAM2_DRAM_USER_START (SRAM2_DRAM_START + SRAM2_DRAM_SHM_SIZE) #define SRAM2_DRAM_USER_SIZE (SRAM2_DRAM_END - SRAM2_DRAM_USER_START) +/* RTC SLOW RAM (8kB) */ +#define RCT_SLOW_RAM_START DT_REG_ADDR(DT_NODELABEL(rtc_slow_ram)) +#define RCT_SLOW_RAM_SIZE DT_REG_SIZE(DT_NODELABEL(rtc_slow_ram)) + +/* RTC FAST RAM (8kB) */ +#define RCT_FAST_RAM_START DT_REG_ADDR(DT_NODELABEL(rtc_fast_ram)) +#define RCT_FAST_RAM_SIZE DT_REG_SIZE(DT_NODELABEL(rtc_fast_ram)) + /** Simplified memory map for the bootloader. * Make sure the bootloader can load into main memory without overwriting itself. * diff --git a/soc/espressif/esp32c3/default.ld b/soc/espressif/esp32c3/default.ld index a76a91c0f9b28..566600dc3d6f4 100644 --- a/soc/espressif/esp32c3/default.ld +++ b/soc/espressif/esp32c3/default.ld @@ -28,6 +28,10 @@ user_idram_size = (user_dram_end - user_dram_seg_org); user_iram_seg_len = user_idram_size; user_dram_seg_len = user_idram_size; +/* RTC RAM memory segment */ +rtc_iram_org = RCT_FAST_RAM_START; +rtc_iram_len = RCT_FAST_RAM_SIZE; + /* Aliases */ #define FLASH_CODE_REGION irom0_0_seg #define RODATA_REGION drom0_0_seg @@ -73,7 +77,7 @@ MEMORY irom0_0_seg(RX): org = IROM_SEG_ORG, len = IROM_SEG_LEN drom0_0_seg (R): org = DROM_SEG_ORG, len = DROM_SEG_LEN - rtc_iram_seg(RWX): org = 0x50000000, len = 0x2000 - CONFIG_RESERVE_RTC_MEM + rtc_iram_seg(RWX): org = rtc_iram_org, len = rtc_iram_len - CONFIG_RESERVE_RTC_MEM /* We reduced the size of rtc_iram_seg by CONFIG_RESERVE_RTC_MEM value. It reserves the amount of RTC fast memory that we use for this memory segment. @@ -82,7 +86,7 @@ MEMORY The aim of this is to keep data that will not be moved around and have a fixed address. */ #if (CONFIG_RESERVE_RTC_MEM > 0) - rtc_reserved_seg(RW): org = 0x50000000 + 0x2000 - CONFIG_RESERVE_RTC_MEM, + rtc_reserved_seg(RW): org = rtc_iram_org + rtc_iram_len - CONFIG_RESERVE_RTC_MEM, len = CONFIG_RESERVE_RTC_MEM #endif diff --git a/soc/espressif/esp32c3/memory.h b/soc/espressif/esp32c3/memory.h index 07eab679ad301..14d39a3736701 100644 --- a/soc/espressif/esp32c3/memory.h +++ b/soc/espressif/esp32c3/memory.h @@ -13,6 +13,9 @@ #define SRAM1_SIZE DT_REG_SIZE(DT_NODELABEL(sram1)) /* ICache size is fixed to 16KB on ESP32-C3 */ #define ICACHE_SIZE SRAM0_SIZE +/* RTC FAST RAM (8kB) */ +#define RCT_FAST_RAM_START DT_REG_ADDR(DT_NODELABEL(rtc_fast_ram)) +#define RCT_FAST_RAM_SIZE DT_REG_SIZE(DT_NODELABEL(rtc_fast_ram)) /** Simplified memory map for the bootloader. * Make sure the bootloader can load into main memory without overwriting itself. diff --git a/soc/espressif/esp32c6/default.ld b/soc/espressif/esp32c6/default.ld index 6ceda54289e47..a6846e5b81739 100644 --- a/soc/espressif/esp32c6/default.ld +++ b/soc/espressif/esp32c6/default.ld @@ -68,11 +68,11 @@ MEMORY drom0_0_seg(R): org = DROM_SEG_ORG, len = DROM_SEG_LEN #if CONFIG_ULP_COPROC_ENABLED - lp_ram_seg(RW): org = LPSRAM_IRAM_START + ULP_COPROC_RESERVE_MEM, - len = LPSRAM_SIZE - ULP_COPROC_RESERVE_MEM - CONFIG_RESERVE_RTC_MEM + lp_ram_seg(RW): org = LPSRAM_IRAM_START + ULP_COPROC_RESERVE_MEM, + len = LPSRAM_SIZE - ULP_COPROC_RESERVE_MEM - CONFIG_RESERVE_RTC_MEM #else - lp_ram_seg(RW): org = LPSRAM_IRAM_START, - len = 0x4000 - CONFIG_RESERVE_RTC_MEM + lp_ram_seg(RW): org = LPSRAM_IRAM_START, + len = LPSRAM_SIZE - CONFIG_RESERVE_RTC_MEM #endif /* We reduced the size of lp_ram_seg by CONFIG_RESERVE_RTC_MEM value. It reserves the amount of LP memory that we use for this memory segment. @@ -82,8 +82,13 @@ MEMORY The aim of this is to keep data that will not be moved around and have a fixed address. */ #if (CONFIG_RESERVE_RTC_MEM > 0) - lp_reserved_seg(RW) : org = LPSRAM_IRAM_START + 0x4000 - CONFIG_RESERVE_RTC_MEM, - len = CONFIG_RESERVE_RTC_MEM +#if CONFIG_ULP_COPROC_ENABLED + lp_reserved_seg(RW): org = LPSRAM_IRAM_START + LPSRAM_SIZE - ULP_COPROC_RESERVE_MEM - CONFIG_RESERVE_RTC_MEM, + len = CONFIG_RESERVE_RTC_MEM +#else + lp_reserved_seg(RW): org = LPSRAM_IRAM_START + LPSRAM_SIZE - CONFIG_RESERVE_RTC_MEM, + len = CONFIG_RESERVE_RTC_MEM +#endif #endif #ifdef CONFIG_GEN_ISR_TABLES diff --git a/soc/espressif/esp32h2/default.ld b/soc/espressif/esp32h2/default.ld index 05923837b6531..2058fc897d6f7 100644 --- a/soc/espressif/esp32h2/default.ld +++ b/soc/espressif/esp32h2/default.ld @@ -67,8 +67,8 @@ MEMORY irom0_0_seg(RX): org = IROM_SEG_ORG, len = IROM_SEG_LEN drom0_0_seg(R): org = DROM_SEG_ORG, len = DROM_SEG_LEN - lp_ram_seg(RW): org = LPSRAM_IRAM_START, - len = LPSRAM_SIZE - CONFIG_RESERVE_RTC_MEM + lp_ram_seg(RW): org = LPSRAM_IRAM_START, + len = LPSRAM_SIZE - CONFIG_RESERVE_RTC_MEM /* We reduced the size of lp_ram_seg by CONFIG_RESERVE_RTC_MEM value. It reserves the amount of LP memory that we use for this memory segment. @@ -78,8 +78,8 @@ MEMORY The aim of this is to keep data that will not be moved around and have a fixed address. */ #if (CONFIG_RESERVE_RTC_MEM > 0) - lp_reserved_seg(RW) : org = LPSRAM_IRAM_START + LPSRAM_SIZE - CONFIG_RESERVE_RTC_MEM, - len = CONFIG_RESERVE_RTC_MEM + lp_reserved_seg(RW): org = LPSRAM_IRAM_START + LPSRAM_SIZE - CONFIG_RESERVE_RTC_MEM, + len = CONFIG_RESERVE_RTC_MEM #endif #ifdef CONFIG_GEN_ISR_TABLES diff --git a/soc/espressif/esp32s2/default.ld b/soc/espressif/esp32s2/default.ld index 227c1d591489c..6f2db020091f2 100644 --- a/soc/espressif/esp32s2/default.ld +++ b/soc/espressif/esp32s2/default.ld @@ -40,6 +40,14 @@ ext_ram_org = DCACHE1_START; ext_ram_len = DCACHE1_SIZE; #endif +/* RTC RAM memory segments */ +rtc_slow_org = RCT_SLOW_RAM_START; +rtc_slow_len = RCT_SLOW_RAM_SIZE; +rtc_data_org = RCT_FAST_RAM_START; +rtc_data_len = RCT_FAST_RAM_SIZE; +rtc_iram_org = RCT_FAST_RAM_START + 0xd2000; +rtc_iram_len = RCT_FAST_RAM_SIZE; + /* Aliases */ #define FLASH_CODE_REGION irom0_0_seg #define RODATA_REGION drom0_0_seg @@ -83,9 +91,9 @@ MEMORY irom0_0_seg(RX): org = user_irom_org, len = user_irom_len drom0_0_seg(R): org = user_drom_org, len = user_drom_len - rtc_iram_seg(RWX): org = 0x40070000, len = 0x2000 - CONFIG_RESERVE_RTC_MEM - rtc_slow_seg(RW): org = 0x50000000, len = 0x2000 - rtc_data_seg(RW) : org = 0x3ff9e000, len = 0x2000 - CONFIG_RESERVE_RTC_MEM + rtc_iram_seg(RWX): org = rtc_iram_org, len = rtc_iram_len - CONFIG_RESERVE_RTC_MEM + rtc_slow_seg(RW): org = rtc_slow_org, len = rtc_slow_len + rtc_data_seg(RW): org = rtc_data_org, len = rtc_data_len - CONFIG_RESERVE_RTC_MEM /* We reduced the size of rtc_data_seg and rtc_iram_seg by CONFIG_RESERVE_RTC_MEM value. It reserves the amount of RTC fast memory that we use for this memory segment. @@ -95,7 +103,7 @@ MEMORY The aim of this is to keep data that will not be moved around and have a fixed address. */ #if (CONFIG_RESERVE_RTC_MEM > 0) - rtc_reserved_seg(RW): org = 0x3ff9e000 + 0x2000 - CONFIG_RESERVE_RTC_MEM, + rtc_reserved_seg(RW): org = rtc_data_org + rtc_data_len - CONFIG_RESERVE_RTC_MEM, len = CONFIG_RESERVE_RTC_MEM #endif diff --git a/soc/espressif/esp32s2/memory.h b/soc/espressif/esp32s2/memory.h index 92d49dd3dc472..35649bc28032c 100644 --- a/soc/espressif/esp32s2/memory.h +++ b/soc/espressif/esp32s2/memory.h @@ -11,6 +11,14 @@ #define SRAM_DRAM_START DT_REG_ADDR(DT_NODELABEL(sram0)) #define SRAM_CACHE_SIZE (CONFIG_ESP32S2_INSTRUCTION_CACHE_SIZE + CONFIG_ESP32S2_DATA_CACHE_SIZE) +/* RTC SLOW RAM (8k) */ +#define RCT_SLOW_RAM_START DT_REG_ADDR(DT_NODELABEL(rtc_slow_ram)) +#define RCT_SLOW_RAM_SIZE DT_REG_SIZE(DT_NODELABEL(rtc_slow_ram)) + +/* RTC FAST RAM (8k) */ +#define RCT_FAST_RAM_START DT_REG_ADDR(DT_NODELABEL(rtc_fast_ram)) +#define RCT_FAST_RAM_SIZE DT_REG_SIZE(DT_NODELABEL(rtc_fast_ram)) + /** Simplified memory map for the bootloader. * Make sure the bootloader can load into main memory without overwriting itself. * diff --git a/soc/espressif/esp32s3/default.ld b/soc/espressif/esp32s3/default.ld index a73a8dfeb9d1b..86292093f7984 100644 --- a/soc/espressif/esp32s3/default.ld +++ b/soc/espressif/esp32s3/default.ld @@ -37,6 +37,12 @@ procpu_ext_iram_org = procpu_irom_org; procpu_ext_iram_len = CONFIG_ESP_SPIRAM_SIZE; #endif +/* RTC RAM memory segments */ +rtc_iram_org = RCT_FAST_RAM_START; +rtc_iram_len = RCT_FAST_RAM_SIZE; +rtc_slow_org = RCT_SLOW_RAM_START; +rtc_slow_len = RCT_SLOW_RAM_SIZE; + /* Aliases */ #define FLASH_CODE_REGION irom0_0_seg #define RODATA_REGION drom0_0_seg @@ -95,7 +101,7 @@ MEMORY #endif /* RTC fast memory (executable). Persists over deep sleep. */ - rtc_iram_seg(RWX): org = 0x600fe000, len = 0x2000 - CONFIG_RESERVE_RTC_MEM + rtc_iram_seg(RWX): org = rtc_iram_org, len = rtc_iram_len - CONFIG_RESERVE_RTC_MEM /* We reduced the size of rtc_iram_seg by CONFIG_RESERVE_RTC_MEM value. * It reserves the amount of RTC fast memory that we use for this memory segment. @@ -105,12 +111,12 @@ MEMORY * The aim of this is to keep data that will not be moved around and have a fixed address. */ #if (CONFIG_RESERVE_RTC_MEM > 0) - rtc_reserved_seg(RW): org = 0x600fe000 + 0x2000 - CONFIG_RESERVE_RTC_MEM, + rtc_reserved_seg(RW): org = rtc_iram_org + rtc_iram_len - CONFIG_RESERVE_RTC_MEM, len = CONFIG_RESERVE_RTC_MEM #endif /* RTC slow memory (data accessible). Persists over deep sleep. */ - rtc_slow_seg(RW): org = 0x50000000, len = 0x2000 + rtc_slow_seg(RW): org = rtc_slow_org, len = rtc_slow_len #ifdef CONFIG_GEN_ISR_TABLES IDT_LIST(RW): org = 0x3ebfe010, len = 0x2000 diff --git a/soc/espressif/esp32s3/memory.h b/soc/espressif/esp32s3/memory.h index 9888542505325..7ec93526c4c8b 100644 --- a/soc/espressif/esp32s3/memory.h +++ b/soc/espressif/esp32s3/memory.h @@ -18,6 +18,14 @@ #define SRAM2_USER_DRAM_START (SRAM2_DRAM_START + CONFIG_ESP32S3_DATA_CACHE_SIZE) #define SRAM2_USER_DRAM_SIZE (SRAM2_SIZE - CONFIG_ESP32S3_DATA_CACHE_SIZE) +/* RTC SLOW RAM (8k) */ +#define RCT_SLOW_RAM_START DT_REG_ADDR(DT_NODELABEL(rtc_slow_ram)) +#define RCT_SLOW_RAM_SIZE DT_REG_SIZE(DT_NODELABEL(rtc_slow_ram)) + +/* RTC FAST RAM (8k) */ +#define RCT_FAST_RAM_START DT_REG_ADDR(DT_NODELABEL(rtc_fast_ram)) +#define RCT_FAST_RAM_SIZE DT_REG_SIZE(DT_NODELABEL(rtc_fast_ram)) + /** Simplified memory map for the bootloader. * Make sure the bootloader can load into main memory without overwriting itself. * diff --git a/tests/drivers/retained_mem/api/boards/esp32_devkitc_procpu.overlay b/tests/drivers/retained_mem/api/boards/esp32_devkitc_procpu.overlay new file mode 100644 index 0000000000000..99f22de85f005 --- /dev/null +++ b/tests/drivers/retained_mem/api/boards/esp32_devkitc_procpu.overlay @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + memory@50001f00 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50001f00 0x100>; + zephyr,memory-region = "RTC_SLOW_RAM_RETAINED_MEM"; + status = "okay"; + + retainedmem0: retainedmem { + compatible = "zephyr,retained-ram"; + status = "okay"; + }; + }; + + aliases { + retainedmemtestdevice = &retainedmem0; + }; +}; + +&rtc_slow_ram { + /* Shrink rtc_slow_ram size to avoid overlap with retained memory region: + * 8KB - 256 = 0x1f00 + */ + reg = <0x50000000 0x1f00>; +}; diff --git a/tests/drivers/retained_mem/api/boards/esp32c3_devkitm.overlay b/tests/drivers/retained_mem/api/boards/esp32c3_devkitm.overlay new file mode 100644 index 0000000000000..3e13515e50247 --- /dev/null +++ b/tests/drivers/retained_mem/api/boards/esp32c3_devkitm.overlay @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + memory@50001f00 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50001f00 0x100>; + zephyr,memory-region = "RTC_FAST_RAM_RETAINED_MEM"; + status = "okay"; + + retainedmem0: retainedmem { + compatible = "zephyr,retained-ram"; + status = "okay"; + }; + }; + + aliases { + retainedmemtestdevice = &retainedmem0; + }; +}; + +&rtc_fast_ram { + /* Shrink rtc_fast_ram size to avoid overlap with retained memory region: + * 8KB - 256 = 0x1f00 + */ + reg = <0x50000000 0x1f00>; +}; diff --git a/tests/drivers/retained_mem/api/boards/esp32c6_devkitc_hpcore.overlay b/tests/drivers/retained_mem/api/boards/esp32c6_devkitc_hpcore.overlay new file mode 100644 index 0000000000000..74c63f4823b41 --- /dev/null +++ b/tests/drivers/retained_mem/api/boards/esp32c6_devkitc_hpcore.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + memory@50003f00 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50003f00 0x100>; + zephyr,memory-region = "RTC_FAST_RAM_RETAINED_MEM"; + status = "okay"; + + retainedmem0: retainedmem { + compatible = "zephyr,retained-ram"; + status = "okay"; + }; + }; + + aliases { + retainedmemtestdevice = &retainedmem0; + }; +}; + +&sramlp { + /* Shrink sramlp size to avoid overlap with retained memory region: + * (16KB - 0x10) - 256 = 0x3ef0 + */ + reg = <0x50000000 0x3ef0>; +}; + +&shmlp { + /* Shift shmlp to keep it inside sramlp memory region: + * 0x50003fe0 - 256 = 0x50003ee0 + */ + reg = <0x50003ee0 0x10>; +}; diff --git a/tests/drivers/retained_mem/api/boards/esp32h2_devkitm.overlay b/tests/drivers/retained_mem/api/boards/esp32h2_devkitm.overlay new file mode 100644 index 0000000000000..255a01c868df6 --- /dev/null +++ b/tests/drivers/retained_mem/api/boards/esp32h2_devkitm.overlay @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + memory@50000f00 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50000f00 0x100>; + zephyr,memory-region = "RTC_FAST_RAM_RETAINED_MEM"; + status = "okay"; + + retainedmem0: retainedmem { + compatible = "zephyr,retained-ram"; + status = "okay"; + }; + }; + + aliases { + retainedmemtestdevice = &retainedmem0; + }; +}; + +&sramlp { + /* Shrink sramlp size to avoid overlap with retained memory region: + * 4KB - 256 = 0xf00 + */ + reg = <0x50000000 0xf00>; +}; diff --git a/tests/drivers/retained_mem/api/boards/esp32s2_saola.overlay b/tests/drivers/retained_mem/api/boards/esp32s2_saola.overlay new file mode 100644 index 0000000000000..99f22de85f005 --- /dev/null +++ b/tests/drivers/retained_mem/api/boards/esp32s2_saola.overlay @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + memory@50001f00 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50001f00 0x100>; + zephyr,memory-region = "RTC_SLOW_RAM_RETAINED_MEM"; + status = "okay"; + + retainedmem0: retainedmem { + compatible = "zephyr,retained-ram"; + status = "okay"; + }; + }; + + aliases { + retainedmemtestdevice = &retainedmem0; + }; +}; + +&rtc_slow_ram { + /* Shrink rtc_slow_ram size to avoid overlap with retained memory region: + * 8KB - 256 = 0x1f00 + */ + reg = <0x50000000 0x1f00>; +}; diff --git a/tests/drivers/retained_mem/api/boards/esp32s3_devkitm_procpu.overlay b/tests/drivers/retained_mem/api/boards/esp32s3_devkitm_procpu.overlay new file mode 100644 index 0000000000000..99f22de85f005 --- /dev/null +++ b/tests/drivers/retained_mem/api/boards/esp32s3_devkitm_procpu.overlay @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + memory@50001f00 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x50001f00 0x100>; + zephyr,memory-region = "RTC_SLOW_RAM_RETAINED_MEM"; + status = "okay"; + + retainedmem0: retainedmem { + compatible = "zephyr,retained-ram"; + status = "okay"; + }; + }; + + aliases { + retainedmemtestdevice = &retainedmem0; + }; +}; + +&rtc_slow_ram { + /* Shrink rtc_slow_ram size to avoid overlap with retained memory region: + * 8KB - 256 = 0x1f00 + */ + reg = <0x50000000 0x1f00>; +}; diff --git a/tests/drivers/retained_mem/api/testcase.yaml b/tests/drivers/retained_mem/api/testcase.yaml index b01a5e9adef2b..544a373ff524f 100644 --- a/tests/drivers/retained_mem/api/testcase.yaml +++ b/tests/drivers/retained_mem/api/testcase.yaml @@ -6,6 +6,12 @@ tests: - retained_mem drivers.retained_mem.api.ram: platform_allow: + - esp32_devkitc/esp32/procpu + - esp32s2_saola + - esp32s3_devkitm/esp32s3/procpu + - esp32c3_devkitm + - esp32c6_devkitc/esp32c6/hpcore + - esp32h2_devkitm - qemu_cortex_m3 - nrf5340dk/nrf5340/cpuapp - nrf54h20dk/nrf54h20/cpuapp