Merge branch 'fix/fix_sleep_exception_in_spi_flash_rom_impl_v5.4' into 'release/v5.4'

fix(esp_hw_support): fix sleep exception in spi flash rom impl (v5.4)

See merge request espressif/esp-idf!46447
This commit is contained in:
Jiang Jiang Jian
2026-03-12 03:38:34 +08:00
11 changed files with 46 additions and 17 deletions
+3 -2
View File
@@ -508,12 +508,13 @@ static void s_do_deep_sleep_phy_callback(void)
#endif #endif
static int s_cache_suspend_cnt = 0; static int s_cache_suspend_cnt = 0;
static uint32_t s_cache_state = 0;
// Must be called from critical sections. // Must be called from critical sections.
static void IRAM_ATTR suspend_cache(void) { static void IRAM_ATTR suspend_cache(void) {
s_cache_suspend_cnt++; s_cache_suspend_cnt++;
if (s_cache_suspend_cnt == 1) { if (s_cache_suspend_cnt == 1) {
spi_flash_disable_cache(esp_cpu_get_core_id(), NULL); spi_flash_disable_cache(esp_cpu_get_core_id(), &s_cache_state);
} }
} }
@@ -522,7 +523,7 @@ static void IRAM_ATTR resume_cache(void) {
s_cache_suspend_cnt--; s_cache_suspend_cnt--;
assert(s_cache_suspend_cnt >= 0 && DRAM_STR("cache resume doesn't match suspend ops")); assert(s_cache_suspend_cnt >= 0 && DRAM_STR("cache resume doesn't match suspend ops"));
if (s_cache_suspend_cnt == 0) { if (s_cache_suspend_cnt == 0) {
spi_flash_restore_cache(esp_cpu_get_core_id(), 0); spi_flash_restore_cache(esp_cpu_get_core_id(), s_cache_state);
} }
} }
@@ -2,3 +2,4 @@ CONFIG_PM_SLP_IRAM_OPT=y
CONFIG_PM_RTOS_IDLE_OPT=y CONFIG_PM_RTOS_IDLE_OPT=y
CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y
CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION=y CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION=y
CONFIG_SPI_FLASH_ROM_IMPL=y
+2 -2
View File
@@ -139,8 +139,8 @@ PROVIDE( spi_flash_check_and_flush_cache = 0x400001a4 );
PROVIDE( spi_flash_mmap_get_free_pages = 0x400001a8 ); PROVIDE( spi_flash_mmap_get_free_pages = 0x400001a8 );
PROVIDE( spi_flash_cache2phys = 0x400001ac ); PROVIDE( spi_flash_cache2phys = 0x400001ac );
PROVIDE( spi_flash_phys2cache = 0x400001b0 ); PROVIDE( spi_flash_phys2cache = 0x400001b0 );
PROVIDE( spi_flash_disable_cache = 0x400001b4 ); PROVIDE( rom_spi_flash_disable_cache = 0x400001b4 );
PROVIDE( spi_flash_restore_cache = 0x400001b8 ); PROVIDE( rom_spi_flash_restore_cache = 0x400001b8 );
PROVIDE( spi_flash_cache_enabled = 0x400001bc ); PROVIDE( spi_flash_cache_enabled = 0x400001bc );
PROVIDE( spi_flash_enable_cache = 0x400001c0 ); PROVIDE( spi_flash_enable_cache = 0x400001c0 );
PROVIDE( spi_cache_mode_switch = 0x400001c4 ); PROVIDE( spi_cache_mode_switch = 0x400001c4 );
+2 -2
View File
@@ -144,8 +144,8 @@ PROVIDE( spi_flash_check_and_flush_cache = 0x400001b4 );
PROVIDE( spi_flash_mmap_get_free_pages = 0x400001b8 ); PROVIDE( spi_flash_mmap_get_free_pages = 0x400001b8 );
PROVIDE( spi_flash_cache2phys = 0x400001bc ); PROVIDE( spi_flash_cache2phys = 0x400001bc );
PROVIDE( spi_flash_phys2cache = 0x400001c0 ); PROVIDE( spi_flash_phys2cache = 0x400001c0 );
PROVIDE( spi_flash_disable_cache = 0x400001c4 ); PROVIDE( rom_spi_flash_disable_cache = 0x400001c4 );
PROVIDE( spi_flash_restore_cache = 0x400001c8 ); PROVIDE( rom_spi_flash_restore_cache = 0x400001c8 );
PROVIDE( spi_flash_cache_enabled = 0x400001cc ); PROVIDE( spi_flash_cache_enabled = 0x400001cc );
PROVIDE( spi_flash_enable_cache = 0x400001d0 ); PROVIDE( spi_flash_enable_cache = 0x400001d0 );
PROVIDE( spi_cache_mode_switch = 0x400001d4 ); PROVIDE( spi_cache_mode_switch = 0x400001d4 );
@@ -18,8 +18,8 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
spi_flash_disable_cache = 0x40000204; rom_spi_flash_disable_cache = 0x40000204;
spi_flash_restore_cache = 0x40000208; rom_spi_flash_restore_cache = 0x40000208;
spi_flash_cache_enabled = 0x4000020c; spi_flash_cache_enabled = 0x4000020c;
spi_flash_enable_cache = 0x40000210; spi_flash_enable_cache = 0x40000210;
esp_enable_cache_flash_wrap = 0x40000214; esp_enable_cache_flash_wrap = 0x40000214;
@@ -18,8 +18,8 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
spi_flash_disable_cache = 0x400001f0; rom_spi_flash_disable_cache = 0x400001f0;
spi_flash_restore_cache = 0x400001f4; rom_spi_flash_restore_cache = 0x400001f4;
spi_flash_cache_enabled = 0x400001f8; spi_flash_cache_enabled = 0x400001f8;
esp_enable_cache_flash_wrap = 0x40000200; esp_enable_cache_flash_wrap = 0x40000200;
@@ -18,8 +18,8 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
spi_flash_disable_cache = 0x40000204; rom_spi_flash_disable_cache = 0x40000204;
spi_flash_restore_cache = 0x40000208; rom_spi_flash_restore_cache = 0x40000208;
spi_flash_cache_enabled = 0x4000020c; spi_flash_cache_enabled = 0x4000020c;
spi_flash_enable_cache = 0x40000210; spi_flash_enable_cache = 0x40000210;
esp_enable_cache_flash_wrap = 0x40000214; esp_enable_cache_flash_wrap = 0x40000214;
@@ -18,8 +18,8 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
spi_flash_disable_cache = 0x400001e8; rom_spi_flash_disable_cache = 0x400001e8;
spi_flash_restore_cache = 0x400001ec; rom_spi_flash_restore_cache = 0x400001ec;
spi_flash_cache_enabled = 0x400001f0; spi_flash_cache_enabled = 0x400001f0;
esp_enable_cache_flash_wrap = 0x400001f8; esp_enable_cache_flash_wrap = 0x400001f8;
+2 -2
View File
@@ -196,8 +196,8 @@ PROVIDE( spi_flash_check_and_flush_cache = 0x40000bdc );
PROVIDE( spi_flash_mmap_get_free_pages = 0x40000be8 ); PROVIDE( spi_flash_mmap_get_free_pages = 0x40000be8 );
PROVIDE( spi_flash_cache2phys = 0x40000bf4 ); PROVIDE( spi_flash_cache2phys = 0x40000bf4 );
PROVIDE( spi_flash_phys2cache = 0x40000c00 ); PROVIDE( spi_flash_phys2cache = 0x40000c00 );
PROVIDE( spi_flash_disable_cache = 0x40000c0c ); PROVIDE( rom_spi_flash_disable_cache = 0x40000c0c );
PROVIDE( spi_flash_restore_cache = 0x40000c18 ); PROVIDE( rom_spi_flash_restore_cache = 0x40000c18 );
PROVIDE( spi_flash_cache_enabled = 0x40000c24 ); PROVIDE( spi_flash_cache_enabled = 0x40000c24 );
PROVIDE( spi_flash_enable_cache = 0x40000c30 ); PROVIDE( spi_flash_enable_cache = 0x40000c30 );
PROVIDE( spi_cache_mode_switch = 0x40000c3c ); PROVIDE( spi_cache_mode_switch = 0x40000c3c );
+26 -1
View File
@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -19,6 +19,10 @@
#include "esp32p4/rom/opi_flash.h" #include "esp32p4/rom/opi_flash.h"
#endif #endif
#if SOC_BRANCH_PREDICTOR_SUPPORTED
#include "riscv/rv_utils.h"
#endif
#define SPI_IDX 1 #define SPI_IDX 1
#if CONFIG_IDF_TARGET_ESP32 #if CONFIG_IDF_TARGET_ESP32
@@ -765,3 +769,24 @@ void esp_rom_opiflash_cache_mode_config(esp_rom_spiflash_read_mode_t mode, const
#endif // IDF_TARGET #endif // IDF_TARGET
#endif // CONFIG_SPI_FLASH_ROM_DRIVER_PATCH #endif // CONFIG_SPI_FLASH_ROM_DRIVER_PATCH
#if CONFIG_SPI_FLASH_ROM_IMPL
extern void rom_spi_flash_disable_cache(uint32_t cpuid, uint32_t *saved_state);
void spi_flash_disable_cache(uint32_t cpuid, uint32_t *saved_state)
{
#if SOC_BRANCH_PREDICTOR_SUPPORTED
//branch predictor will start cache request as well
rv_utils_dis_branch_predictor();
#endif
rom_spi_flash_disable_cache(cpuid, saved_state);
}
extern void rom_spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_state);
void spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_state)
{
rom_spi_flash_restore_cache(cpuid, saved_state);
#if SOC_BRANCH_PREDICTOR_SUPPORTED
rv_utils_en_branch_predictor();
#endif
}
#endif
+2
View File
@@ -362,6 +362,7 @@ void IRAM_ATTR spi_flash_enable_cache(uint32_t cpuid)
#endif #endif
} }
#if !CONFIG_SPI_FLASH_ROM_IMPL
void IRAM_ATTR spi_flash_disable_cache(uint32_t cpuid, uint32_t *saved_state) void IRAM_ATTR spi_flash_disable_cache(uint32_t cpuid, uint32_t *saved_state)
{ {
#if SOC_BRANCH_PREDICTOR_SUPPORTED #if SOC_BRANCH_PREDICTOR_SUPPORTED
@@ -383,6 +384,7 @@ bool IRAM_ATTR spi_flash_cache_enabled(void)
{ {
return cache_hal_is_cache_enabled(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); return cache_hal_is_cache_enabled(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL);
} }
#endif
#if CONFIG_IDF_TARGET_ESP32S2 #if CONFIG_IDF_TARGET_ESP32S2
IRAM_ATTR void esp_config_instruction_cache_mode(void) IRAM_ATTR void esp_config_instruction_cache_mode(void)