From ed1db9695e9a071ff683930647534ecfd155c0f3 Mon Sep 17 00:00:00 2001 From: Sylvio Alves Date: Sat, 7 Sep 2024 00:21:14 -0300 Subject: [PATCH] bugfix: soc: esp32: disable interrupts in flash operation When interrupts are placed in flash, it needs to be disabled when flash operations are called. This is not happening in current v3.7.0 release, causing system to crash whenever flash operations and interrupts happens simultaneously. Fixes #77952 Signed-off-by: Sylvio Alves --- soc/espressif/esp32/soc.c | 22 +++++++--------------- soc/espressif/esp32c3/soc.c | 21 ++++----------------- soc/espressif/esp32c6/soc.c | 7 ++++--- soc/espressif/esp32s2/soc.c | 17 ++++------------- soc/espressif/esp32s3/soc.c | 4 +++- west.yml | 2 +- 6 files changed, 23 insertions(+), 50 deletions(-) diff --git a/soc/espressif/esp32/soc.c b/soc/espressif/esp32/soc.c index bec3413ba42a35..8b4a1d9d036508 100644 --- a/soc/espressif/esp32/soc.c +++ b/soc/espressif/esp32/soc.c @@ -13,6 +13,7 @@ #include #include #include +#include #if CONFIG_ESP_SPIRAM #include #include @@ -139,17 +140,17 @@ void IRAM_ATTR __esp_platform_start(void) esp_timer_early_init(); + esp_mspi_pin_init(); + + esp_flash_app_init(); + + esp_mmu_map_init(); + #if CONFIG_SOC_ENABLE_APPCPU /* start the ESP32 APP CPU */ esp_start_appcpu(); #endif - esp_mmu_map_init(); - -#ifdef CONFIG_SOC_FLASH_ESP32 - esp_mspi_pin_init(); - spi_flash_init_chip_state(); -#endif #if CONFIG_ESP_SPIRAM esp_err_t err = esp_psram_init(); @@ -174,15 +175,6 @@ void IRAM_ATTR __esp_platform_start(void) (&_ext_ram_bss_end - &_ext_ram_bss_start) * sizeof(_ext_ram_bss_start)); #endif /* CONFIG_ESP_SPIRAM */ -/* Scheduler is not started at this point. Hence, guard functions - * must be initialized after esp_spiram_init_cache which internally - * uses guard functions. Setting guard functions before SPIRAM - * cache initialization will result in a crash. - */ -#if CONFIG_SOC_FLASH_ESP32 || CONFIG_ESP_SPIRAM - spi_flash_guard_set(&g_flash_guard_default_ops); -#endif - #endif /* !CONFIG_MCUBOOT */ esp_intr_initialize(); diff --git a/soc/espressif/esp32c3/soc.c b/soc/espressif/esp32c3/soc.c index 61a4cb4c83ff79..aa21357e72876a 100644 --- a/soc/espressif/esp32c3/soc.c +++ b/soc/espressif/esp32c3/soc.c @@ -21,6 +21,7 @@ #include #include #include "esp_private/esp_mmu_map_private.h" +#include #include @@ -66,28 +67,14 @@ void __attribute__((section(".iram1"))) __esp_platform_start(void) REG_CLR_BIT(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_SDIOSLAVE_EN); SET_PERI_REG_MASK(SYSTEM_WIFI_CLK_EN_REG, SYSTEM_WIFI_CLK_EN); -#ifdef CONFIG_SOC_FLASH_ESP32 + esp_timer_early_init(); + esp_mspi_pin_init(); - /** - * This function initialise the Flash chip to the user-defined settings. - * - * In bootloader, we only init Flash (and MSPI) to a preliminary - * state, for being flexible to different chips. - * In this stage, we re-configure the Flash (and MSPI) to required configuration - */ - spi_flash_init_chip_state(); + esp_flash_app_init(); esp_mmu_map_init(); -#endif /*CONFIG_SOC_FLASH_ESP32*/ - - esp_timer_early_init(); - -#if CONFIG_SOC_FLASH_ESP32 - spi_flash_guard_set(&g_flash_guard_default_ops); -#endif - #endif /* !CONFIG_MCUBOOT */ /*Initialize the esp32c3 interrupt controller */ diff --git a/soc/espressif/esp32c6/soc.c b/soc/espressif/esp32c6/soc.c index 2a30fe457310f3..1c8877d85416a4 100644 --- a/soc/espressif/esp32c6/soc.c +++ b/soc/espressif/esp32c6/soc.c @@ -19,6 +19,7 @@ #include #include #include "esp_private/esp_mmu_map_private.h" +#include #include @@ -58,9 +59,9 @@ void IRAM_ATTR __esp_platform_start(void) esp_timer_early_init(); -#if CONFIG_SOC_FLASH_ESP32 - spi_flash_guard_set(&g_flash_guard_default_ops); -#endif + esp_mspi_pin_init(); + + esp_flash_app_init(); esp_mmu_map_init(); diff --git a/soc/espressif/esp32s2/soc.c b/soc/espressif/esp32s2/soc.c index 05913df81cfc40..fd204209a86f21 100644 --- a/soc/espressif/esp32s2/soc.c +++ b/soc/espressif/esp32s2/soc.c @@ -98,10 +98,11 @@ void __attribute__((section(".iram1"))) __esp_platform_start(void) esp_config_data_cache_mode(); esp_rom_Cache_Enable_DCache(0); -#ifdef CONFIG_SOC_FLASH_ESP32 + esp_timer_early_init(); + esp_mspi_pin_init(); - spi_flash_init_chip_state(); -#endif /* CONFIG_SOC_FLASH_ESP32 */ + + esp_flash_app_init(); esp_mmu_map_init(); @@ -129,16 +130,6 @@ void __attribute__((section(".iram1"))) __esp_platform_start(void) #endif /* CONFIG_ESP_SPIRAM */ - esp_timer_early_init(); - - /* Scheduler is not started at this point. Hence, guard functions - * must be initialized after esp_spiram_init_cache which internally - * uses guard functions. Setting guard functions before SPIRAM - * cache initialization will result in a crash. - */ -#if CONFIG_SOC_FLASH_ESP32 || CONFIG_ESP_SPIRAM - spi_flash_guard_set(&g_flash_guard_default_ops); -#endif #endif /* !CONFIG_MCUBOOT */ esp_intr_initialize(); diff --git a/soc/espressif/esp32s3/soc.c b/soc/espressif/esp32s3/soc.c index ec9d603d6cd761..3026f8a01c7d91 100644 --- a/soc/espressif/esp32s3/soc.c +++ b/soc/espressif/esp32s3/soc.c @@ -151,12 +151,14 @@ void IRAM_ATTR __esp_platform_start(void) esp_mspi_pin_init(); - spi_flash_init_chip_state(); + esp_flash_app_init(); mspi_timing_flash_tuning(); esp_mmu_map_init(); + esp_mmu_map_init(); + #if CONFIG_ESP_SPIRAM esp_err_t err = esp_psram_init(); diff --git a/west.yml b/west.yml index 25dd5ca1001d41..a1d70435b68918 100644 --- a/west.yml +++ b/west.yml @@ -157,7 +157,7 @@ manifest: groups: - hal - name: hal_espressif - revision: 87e7902d7184a8280b4d13bce79801a723f4ddd8 + revision: 796b3f62af6dc10cb7c7953f73c81882d4011d8d path: modules/hal/espressif west-commands: west/west-commands.yml groups: