From 526ff047cc7e09a9e90ae0a3d41587a1dc234370 Mon Sep 17 00:00:00 2001 From: Eric Holmberg Date: Thu, 10 Aug 2023 18:28:40 +1200 Subject: [PATCH] soc: xtensa: espressif_esp32: add SPIRAM heap offset and size The existing heap starts at the beginning of SPIRAM which is also occupied by the WiFi stack if CONFIG_ESP32_WIFI_NET_ALLOC_SPIRAM is enabled. This results in memory corruption. Update the linker description to add a _spiram_heap_start symbol and add a KConfig size option to allow the SPIRAM stack to be correctly located and sized. Requires matching commit in hal_espressif. Fixes: 61359 Signed-off-by: Eric Holmberg --- soc/xtensa/espressif_esp32/common/Kconfig.soc | 8 ++++++++ soc/xtensa/espressif_esp32/esp32/default.ld | 10 +++++++++- soc/xtensa/espressif_esp32/esp32s2/default.ld | 12 +++++++++++- soc/xtensa/espressif_esp32/esp32s3/default.ld | 11 ++++++++--- tests/boards/espressif_esp32/cache_coex/prj.conf | 1 - west.yml | 2 +- 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/soc/xtensa/espressif_esp32/common/Kconfig.soc b/soc/xtensa/espressif_esp32/common/Kconfig.soc index 3446e688243..c8eaad62d5b 100644 --- a/soc/xtensa/espressif_esp32/common/Kconfig.soc +++ b/soc/xtensa/espressif_esp32/common/Kconfig.soc @@ -37,6 +37,14 @@ config ESP_HEAP_SEARCH_ALL_REGIONS regions. If the region of desired capability is exhausted, memory will be allocated from other available region. +config ESP_SPIRAM_HEAP_SIZE + int "Size of SPIRAM heap" + default 262134 if SYS_HEAP_SMALL_ONLY + default 1048576 if !SYS_HEAP_SMALL_ONLY + depends on ESP_SPIRAM + help + Specify size of SPIRAM heap. + menu "SPI RAM config" depends on ESP_SPIRAM diff --git a/soc/xtensa/espressif_esp32/esp32/default.ld b/soc/xtensa/espressif_esp32/esp32/default.ld index beb79d027d1..83e2d0300d7 100644 --- a/soc/xtensa/espressif_esp32/esp32/default.ld +++ b/soc/xtensa/espressif_esp32/esp32/default.ld @@ -453,9 +453,12 @@ SECTIONS *libsubsys__net__ip.a:(.noinit .noinit.*) *libsubsys__net.a:(.noinit .noinit.*) #endif + _spiram_heap_start = ABSOLUTE(.); + . = . + CONFIG_ESP_SPIRAM_HEAP_SIZE; *(.ext_ram.bss*) - _ext_ram_data_end = ABSOLUTE(.) + CONFIG_ESP_SPIRAM_SIZE; + + _ext_ram_data_end = ABSOLUTE(.); } GROUP_LINK_IN(ext_ram_seg) #endif @@ -581,3 +584,8 @@ _heap_sentry = 0x3ffe3f20; ASSERT(((_iram_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)), "IRAM0 segment data does not fit.") + +#if defined(CONFIG_ESP_SPIRAM) +ASSERT(((_ext_ram_data_end - _ext_ram_data_start) <= CONFIG_ESP_SPIRAM_SIZE), + "External SPIRAM overflowed.") +#endif /* CONFIG_ESP_SPIRAM */ diff --git a/soc/xtensa/espressif_esp32/esp32s2/default.ld b/soc/xtensa/espressif_esp32/esp32s2/default.ld index 7aff462873b..bac485535e1 100644 --- a/soc/xtensa/espressif_esp32/esp32s2/default.ld +++ b/soc/xtensa/espressif_esp32/esp32s2/default.ld @@ -333,6 +333,7 @@ SECTIONS #if defined(CONFIG_ESP_SPIRAM) .ext_ram.bss (NOLOAD): { + _ext_ram_data_start = ABSOLUTE(.); _ext_ram_bss_start = ABSOLUTE(.); #if defined(CONFIG_ESP32_WIFI_NET_ALLOC_SPIRAM) @@ -342,10 +343,14 @@ SECTIONS *libsubsys__net__ip.a:(.noinit .noinit.*) *libsubsys__net.a:(.noinit .noinit.*) #endif + _spiram_heap_start = ABSOLUTE(.); + . = . + CONFIG_ESP_SPIRAM_HEAP_SIZE; *(.ext_ram.bss*) . = ALIGN(4); - _ext_ram_bss_end = ABSOLUTE(.) + CONFIG_ESP_SPIRAM_SIZE; + _ext_ram_bss_end = ABSOLUTE(.); + + _ext_ram_data_end = ABSOLUTE(.); } > ext_ram_seg #endif @@ -555,3 +560,8 @@ ASSERT(((__bss_end - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)), ASSERT(((_iram_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)), "IRAM0 segment data does not fit.") + +#if defined(CONFIG_ESP_SPIRAM) +ASSERT(((_ext_ram_data_end - _ext_ram_data_start) <= CONFIG_ESP_SPIRAM_SIZE), + "External SPIRAM overflowed.") +#endif /* CONFIG_ESP_SPIRAM */ diff --git a/soc/xtensa/espressif_esp32/esp32s3/default.ld b/soc/xtensa/espressif_esp32/esp32s3/default.ld index 24000b41e19..02014a2718d 100644 --- a/soc/xtensa/espressif_esp32/esp32s3/default.ld +++ b/soc/xtensa/espressif_esp32/esp32s3/default.ld @@ -231,6 +231,7 @@ SECTIONS /* This section holds .ext_ram.bss data, and will be put in PSRAM */ .ext_ram.bss (NOLOAD) : { + _ext_ram_data_start = ABSOLUTE(.); _ext_ram_bss_start = ABSOLUTE(.); *(.ext_ram.bss*) . = ALIGN(4); @@ -246,6 +247,10 @@ SECTIONS *libsubsys__net__ip.a:(.noinit .noinit.*) *libsubsys__net.a:(.noinit .noinit.*) #endif + _spiram_heap_start = ABSOLUTE(.); + . = . + CONFIG_ESP_SPIRAM_HEAP_SIZE; + + _ext_ram_data_end = ABSOLUTE(.); } > ext_ram_seg #endif @@ -678,6 +683,6 @@ ASSERT(((_iram_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)), "IRAM0 segment data does not fit.") #if defined(CONFIG_ESP_SPIRAM) -ASSERT(((ORIGIN(ext_ram_seg)) > _image_rodata_end), - "External RAM segment does not fit.") -#endif +ASSERT(((_ext_ram_data_end - _ext_ram_data_start) <= CONFIG_ESP_SPIRAM_SIZE), + "External SPIRAM overflowed.") +#endif /* CONFIG_ESP_SPIRAM */ diff --git a/tests/boards/espressif_esp32/cache_coex/prj.conf b/tests/boards/espressif_esp32/cache_coex/prj.conf index c0b89c29646..6265acda775 100644 --- a/tests/boards/espressif_esp32/cache_coex/prj.conf +++ b/tests/boards/espressif_esp32/cache_coex/prj.conf @@ -1,7 +1,6 @@ CONFIG_ESP_SPIRAM=y CONFIG_ESP_HEAP_MIN_EXTRAM_THRESHOLD=2048 CONFIG_HEAP_MEM_POOL_SIZE=98304 -CONFIG_ESP_HEAP_MEM_POOL_REGION_1_SIZE=100000 CONFIG_ESP_HEAP_SEARCH_ALL_REGIONS=n CONFIG_FLASH=y CONFIG_ENTROPY_GENERATOR=y diff --git a/west.yml b/west.yml index 562ad109405..5623e3bd45b 100644 --- a/west.yml +++ b/west.yml @@ -152,7 +152,7 @@ manifest: groups: - hal - name: hal_espressif - revision: ec90f3c49e3826ef2c56c5381aa068c4f482b31f + revision: 80d910ca89eab9bce03f59a4ade33f1fc30ce0ad path: modules/hal/espressif west-commands: west/west-commands.yml groups: