mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 03:00:34 +03:00
Merge branch 'refactor/spi_flash_private_v5.5' into 'release/v5.5'
fix(spi_flash): fixed overboundary check skipping of erase and write_encrypted (v5.5) See merge request espressif/esp-idf!45657
This commit is contained in:
@@ -11,7 +11,6 @@
|
||||
#include "sdkconfig.h"
|
||||
#include "esp_check.h"
|
||||
#include "esp_log.h"
|
||||
#include "soc/soc_caps.h"
|
||||
#include "soc/rtc.h"
|
||||
#include "hal/mspi_ll.h"
|
||||
#include "hal/clk_tree_ll.h"
|
||||
@@ -36,7 +35,7 @@ void esp_clk_utils_mspi_speed_mode_sync_before_cpu_freq_switching(uint32_t targe
|
||||
if (target_cpu_src_freq <= clk_ll_xtal_load_freq_mhz()) {
|
||||
mspi_timing_change_speed_mode_cache_safe(true);
|
||||
}
|
||||
#elif SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED && CONFIG_SPIRAM
|
||||
#elif MSPI_TIMING_LL_PSRAM_FREQ_AXI_CONSTRAINED && CONFIG_SPIRAM
|
||||
/* On chips with AXI bus, currently there is a restriction that AXI frequency (usually equals to a portion of CPU
|
||||
* frequency) needs to be greater than or equal to MSPI PSRAM frequency to avoid writing MSPI FIFO overflow.
|
||||
*/
|
||||
@@ -58,7 +57,7 @@ void esp_clk_utils_mspi_speed_mode_sync_after_cpu_freq_switching(uint32_t target
|
||||
if (target_cpu_src_freq > clk_ll_xtal_load_freq_mhz()) {
|
||||
mspi_timing_change_speed_mode_cache_safe(false);
|
||||
}
|
||||
#elif SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED && CONFIG_SPIRAM
|
||||
#elif MSPI_TIMING_LL_PSRAM_FREQ_AXI_CONSTRAINED && CONFIG_SPIRAM
|
||||
/* On chips with AXI bus, currently there is a restriction that AXI frequency (usually equals to a portion of CPU
|
||||
* frequency) needs to be greater than or equal to MSPI PSRAM frequency to avoid writing MSPI FIFO overflow.
|
||||
*/
|
||||
|
||||
@@ -38,6 +38,9 @@ extern "C" {
|
||||
#define MSPI_LL_CORE_CLOCK_120_MHZ 120
|
||||
#define MSPI_TIMING_LL_CORE_CLOCK_MHZ_DEFAULT MSPI_LL_CORE_CLOCK_80_MHZ
|
||||
|
||||
// PSRAM frequency should be constrained by AXI frequency to avoid FIFO underflow.
|
||||
#define MSPI_TIMING_LL_PSRAM_FREQ_AXI_CONSTRAINED 1
|
||||
|
||||
/*---------------------------------------------------------------
|
||||
MSPI
|
||||
---------------------------------------------------------------*/
|
||||
|
||||
@@ -38,6 +38,9 @@ extern "C" {
|
||||
#define MSPI_LL_CORE_CLOCK_120_MHZ 120
|
||||
#define MSPI_TIMING_LL_CORE_CLOCK_MHZ_DEFAULT MSPI_LL_CORE_CLOCK_80_MHZ
|
||||
|
||||
// PSRAM frequency should be constrained by AXI frequency to avoid FIFO underflow.
|
||||
#define MSPI_TIMING_LL_PSRAM_FREQ_AXI_CONSTRAINED 1
|
||||
|
||||
/************************** MSPI pll clock configurations **************************/
|
||||
|
||||
/*
|
||||
|
||||
@@ -26,6 +26,9 @@
|
||||
#include "hal/misc.h"
|
||||
#include "hal/assert.h"
|
||||
|
||||
// PSRAM frequency should be constrained by AXI frequency to avoid FIFO underflow.
|
||||
#define MSPI_TIMING_LL_PSRAM_FREQ_AXI_CONSTRAINED 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@@ -48,6 +48,9 @@ extern "C" {
|
||||
#define MSPI_TIMING_LL_MSPI_ID_0 0
|
||||
#define MSPI_TIMING_LL_MSPI_ID_1 1
|
||||
|
||||
// PSRAM frequency should be constrained by AXI frequency to avoid FIFO underflow.
|
||||
#define MSPI_TIMING_LL_PSRAM_FREQ_AXI_CONSTRAINED 1
|
||||
|
||||
#define MSPI_TIMING_LL_HP_FLASH_CORE_CLK_DIV 4
|
||||
#define MSPI_TIMING_LL_LP_FLASH_CORE_CLK_DIV 6
|
||||
#define MSPI_TIMING_LL_FLASH_FDUMMY_RIN_SUPPORTED 1
|
||||
|
||||
@@ -1255,10 +1255,6 @@ config SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_SPI_MEM_FLASH_SUPPORT_HPM
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -483,7 +483,6 @@
|
||||
#define SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP (1)
|
||||
#define SOC_SPI_MEM_SUPPORT_TIMING_TUNING (1)
|
||||
#define SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR (1)
|
||||
#define SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED (1)
|
||||
#define SOC_SPI_MEM_FLASH_SUPPORT_HPM (1) /*!< Support High Performance Mode */
|
||||
#define SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY (1)
|
||||
|
||||
|
||||
@@ -863,10 +863,6 @@ config SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_SPI_MEM_FLASH_SUPPORT_HPM
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -349,7 +349,6 @@
|
||||
#define SOC_SPI_MEM_SUPPORT_WRAP (1)
|
||||
#define SOC_SPI_MEM_SUPPORT_TIMING_TUNING (1)
|
||||
#define SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR (1)
|
||||
#define SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED (1)
|
||||
#define SOC_SPI_MEM_FLASH_SUPPORT_HPM (1) /*!< Support High Performance Mode */
|
||||
#define SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP (1)
|
||||
#define SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY (1)
|
||||
|
||||
@@ -267,10 +267,6 @@ config SOC_SPI_MEM_SUPPORT_WRAP
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_MEMSPI_SRC_FREQ_64M_SUPPORTED
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -414,7 +414,6 @@
|
||||
#define SOC_SPI_MEM_SUPPORT_SW_SUSPEND (1)
|
||||
#define SOC_SPI_MEM_SUPPORT_CHECK_SUS (1)
|
||||
#define SOC_SPI_MEM_SUPPORT_WRAP (1)
|
||||
#define SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED (1)
|
||||
|
||||
#define SOC_MEMSPI_SRC_FREQ_64M_SUPPORTED 1
|
||||
#define SOC_MEMSPI_SRC_FREQ_32M_SUPPORTED 1
|
||||
|
||||
@@ -1691,10 +1691,6 @@ config SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR
|
||||
bool
|
||||
default y
|
||||
|
||||
@@ -618,7 +618,6 @@
|
||||
#define SOC_MEMSPI_TIMING_TUNING_BY_DQS (1)
|
||||
#define SOC_MEMSPI_TIMING_TUNING_BY_FLASH_DELAY (1)
|
||||
#define SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP (1)
|
||||
#define SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED (1)
|
||||
#define SOC_SPI_MEM_SUPPORT_TSUS_TRES_SEPERATE_CTR (1)
|
||||
|
||||
#define SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT (1)
|
||||
|
||||
@@ -165,8 +165,8 @@ extern rom_spiflash_api_func_t *esp_flash_api_funcs;
|
||||
#define rom_spiflash_api_funcs esp_flash_api_funcs_patched_ptr
|
||||
#endif
|
||||
|
||||
#if !CONFIG_SPI_FLASH_ROM_IMPL || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV
|
||||
// API funcs case 1 & 2
|
||||
#if !CONFIG_SPI_FLASH_ROM_IMPL
|
||||
// API funcs case 1: Not using ROM - define our own pointer and all functions
|
||||
static esp_err_t spiflash_start_default(esp_flash_t *chip);
|
||||
static esp_err_t spiflash_end_default(esp_flash_t *chip, esp_err_t err);
|
||||
static esp_err_t check_chip_pointer_default(esp_flash_t **inout_chip);
|
||||
@@ -180,25 +180,13 @@ DRAM_ATTR static rom_spiflash_api_func_t esp_flash_api_funcs_patched = {
|
||||
.flash_end_flush_cache = flash_end_flush_cache,
|
||||
};
|
||||
|
||||
# if !CONFIG_SPI_FLASH_ROM_IMPL
|
||||
// API funcs case 1: Not using ROM - define our own pointer and all functions
|
||||
DRAM_ATTR static rom_spiflash_api_func_t *esp_flash_api_funcs_patched_ptr = &esp_flash_api_funcs_patched;
|
||||
|
||||
# else // CONFIG_SPI_FLASH_ROM_IMPL
|
||||
// API funcs case 2: Using ROM APIs but patch all api_funcs by updating esp_flash_api_funcs from ROM
|
||||
void esp_flash_rom_api_funcs_init(void)
|
||||
{
|
||||
// Point esp_flash_api_funcs to our default structure
|
||||
esp_flash_api_funcs = &esp_flash_api_funcs_patched;
|
||||
}
|
||||
|
||||
# endif // CONFIG_SPI_FLASH_ROM_IMPL
|
||||
|
||||
#else // CONFIG_SPI_FLASH_ROM_IMPL && !ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV
|
||||
#else // CONFIG_SPI_FLASH_ROM_IMPL
|
||||
// Using ROM implementation
|
||||
|
||||
# if CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
// API funcs case 3: Using ROM APIs but patch start function to support flags parameter
|
||||
// API funcs case 2: Using ROM APIs but patch start function to support flags parameter
|
||||
static esp_err_t spiflash_start_default(esp_flash_t *chip);
|
||||
DRAM_ATTR static rom_spiflash_api_func_t esp_flash_api_funcs_patched;
|
||||
|
||||
@@ -211,6 +199,21 @@ void esp_flash_rom_api_funcs_init(void)
|
||||
esp_flash_api_funcs = &esp_flash_api_funcs_patched;
|
||||
}
|
||||
|
||||
# elif ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV
|
||||
// API funcs case 3: Using ROM APIs but patch flash_end_flush_cache function
|
||||
// When ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV, the api_funcs provided by ROM does not have flash_end_flush_cache member.
|
||||
static esp_err_t flash_end_flush_cache(esp_flash_t* chip, esp_err_t err, bool bus_acquired, uint32_t address, uint32_t length);
|
||||
DRAM_ATTR static rom_spiflash_api_func_t esp_flash_api_funcs_patched;
|
||||
|
||||
// Copy ROM structure to RAM and patch flash_end_flush_cache function
|
||||
void esp_flash_rom_api_funcs_init(void)
|
||||
{
|
||||
rom_spiflash_api_func_t *rom_ptr = esp_flash_api_funcs;
|
||||
memcpy(&esp_flash_api_funcs_patched, rom_ptr, sizeof(rom_spiflash_api_func_t));
|
||||
esp_flash_api_funcs_patched.flash_end_flush_cache = flash_end_flush_cache;
|
||||
esp_flash_api_funcs = &esp_flash_api_funcs_patched;
|
||||
}
|
||||
|
||||
# else
|
||||
// API funcs case 4: Using All ROM APIs directly
|
||||
void esp_flash_rom_api_funcs_init(void)
|
||||
@@ -219,14 +222,14 @@ void esp_flash_rom_api_funcs_init(void)
|
||||
}
|
||||
|
||||
# endif // CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
#endif // !CONFIG_SPI_FLASH_ROM_IMPL || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV
|
||||
#endif // !CONFIG_SPI_FLASH_ROM_IMPL
|
||||
|
||||
/* Static function to notify OS of a new SPI flash operation.
|
||||
|
||||
If returns an error result, caller must abort. If returns ESP_OK, caller must
|
||||
call rom_spiflash_api_funcs->end() before returning.
|
||||
*/
|
||||
#if !CONFIG_SPI_FLASH_ROM_IMPL || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV || CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
#if !CONFIG_SPI_FLASH_ROM_IMPL || CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
//Avoid constprop issue that place this function into flash.
|
||||
__attribute__((optimize("O0"))) //IDF-14941
|
||||
static esp_err_t spiflash_start_core(esp_flash_t *chip, uint32_t flags)
|
||||
@@ -245,9 +248,9 @@ static esp_err_t spiflash_start_default(esp_flash_t *chip)
|
||||
{
|
||||
return spiflash_start_core(chip, 0);
|
||||
}
|
||||
#endif //!CONFIG_SPI_FLASH_ROM_IMPL || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV || CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
#endif //!CONFIG_SPI_FLASH_ROM_IMPL || CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
|
||||
#if !CONFIG_SPI_FLASH_ROM_IMPL || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV
|
||||
#if !CONFIG_SPI_FLASH_ROM_IMPL
|
||||
/* Static function to notify OS that SPI flash operation is complete.
|
||||
*/
|
||||
static esp_err_t spiflash_end_default(esp_flash_t *chip, esp_err_t err)
|
||||
@@ -275,7 +278,13 @@ static esp_err_t check_chip_pointer_default(esp_flash_t **inout_chip)
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
#endif // !CONFIG_SPI_FLASH_ROM_IMPL
|
||||
|
||||
#if !CONFIG_SPI_FLASH_ROM_IMPL || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV
|
||||
/* ROM and patch information
|
||||
* Latest: No change
|
||||
* V1 (!ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV): Added to ROM
|
||||
*/
|
||||
static esp_err_t flash_end_flush_cache(esp_flash_t* chip, esp_err_t err, bool bus_acquired, uint32_t address, uint32_t length)
|
||||
{
|
||||
if (!bus_acquired) {
|
||||
@@ -782,7 +791,7 @@ esp_err_t esp_flash_erase_region(esp_flash_t *chip, uint32_t start, uint32_t len
|
||||
if (len == 0) {
|
||||
return ESP_OK;
|
||||
}
|
||||
if (len > chip->size - start) {
|
||||
if (start > chip->size || len > chip->size - start) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return rom_esp_flash_erase_region(chip, start, len);
|
||||
@@ -795,7 +804,7 @@ esp_err_t IRAM_ATTR esp_flash_erase_region(esp_flash_t *chip, uint32_t start, ui
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
if (len > chip->size - start) {
|
||||
if (start > chip->size || len > chip->size - start) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return rom_esp_flash_erase_region(chip, start, len);
|
||||
@@ -1299,7 +1308,7 @@ esp_err_t esp_flash_set_io_mode(esp_flash_t* chip, bool qe)
|
||||
}
|
||||
#endif //CONFIG_SPI_FLASH_ROM_IMPL
|
||||
|
||||
#if !(CONFIG_SPI_FLASH_ROM_IMPL && !ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV) || CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
#if !CONFIG_SPI_FLASH_ROM_IMPL || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV || CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
// use `esp_flash_write_encrypted` ROM version on chips later than C3, S3
|
||||
// For ESP32-C5, use IDF implementation when CPU frequency is 240MHz (calling start() with arg is required)
|
||||
FORCE_INLINE_ATTR esp_err_t s_encryption_write_lock(esp_flash_t *chip)
|
||||
@@ -1559,12 +1568,12 @@ esp_err_t IRAM_ATTR esp_flash_write_encrypted(esp_flash_t *chip, uint32_t addres
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
if (length > chip->size - address) {
|
||||
if (buffer == NULL || address > chip->size || length > chip->size - address) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return rom_esp_flash_write_encrypted(chip, address, buffer, length);
|
||||
}
|
||||
#endif // !(CONFIG_SPI_FLASH_ROM_IMPL && !ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV) || CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
#endif // !CONFIG_SPI_FLASH_ROM_IMPL || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV || CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ
|
||||
|
||||
//init suspend mode cmd, uses internal.
|
||||
esp_err_t esp_flash_suspend_cmd_init(esp_flash_t* chip)
|
||||
|
||||
@@ -146,7 +146,7 @@ esp_flash_t *esp_flash_default_chip = NULL;
|
||||
// 1. Frequency limit workaround is enabled (CONFIG_SPI_FLASH_FREQ_LIMIT_C5_240MHZ)
|
||||
// 2. Flash frequency requires timing tuning (80MHz or 120MHz, i.e., > 40MHz)
|
||||
// 3. CPU frequency reduction will trigger MSPI timing tuning to enter low speed mode
|
||||
// This happens when: SOC_SPI_MEM_PSRAM_FREQ_AXI_CONSTRAINED && CONFIG_SPIRAM &&
|
||||
// This happens when: MSPI_TIMING_LL_PSRAM_FREQ_AXI_CONSTRAINED && CONFIG_SPIRAM &&
|
||||
// (target_cpu_freq < CONFIG_SPIRAM_SPEED)
|
||||
// Note: The runtime check for CPU freq < PSRAM speed is done in clk_utils.c,
|
||||
// which calls mspi_timing_change_speed_mode_cache_safe(true) to enter low speed mode.
|
||||
|
||||
@@ -46,16 +46,18 @@ entries:
|
||||
esp_flash_api: s_verify_write (noflash)
|
||||
|
||||
if SPI_FLASH_ROM_IMPL = n || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV = y || SPI_FLASH_FREQ_LIMIT_C5_240MHZ = y:
|
||||
esp_flash_api: spiflash_start_default (noflash)
|
||||
esp_flash_api: spiflash_start_core (noflash)
|
||||
esp_flash_api: esp_flash_write_encrypted (noflash)
|
||||
|
||||
if SPI_FLASH_ROM_IMPL = n || SPI_FLASH_FREQ_LIMIT_C5_240MHZ = y:
|
||||
esp_flash_api: spiflash_start_default (noflash)
|
||||
esp_flash_api: spiflash_start_core (noflash)
|
||||
|
||||
if SPI_FLASH_ROM_IMPL = n || ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV = y:
|
||||
esp_flash_api: spiflash_end_default (noflash)
|
||||
esp_flash_api: check_chip_pointer_default (noflash)
|
||||
esp_flash_api: flash_end_flush_cache (noflash)
|
||||
|
||||
if SPI_FLASH_ROM_IMPL = n:
|
||||
esp_flash_api: spiflash_end_default (noflash)
|
||||
esp_flash_api: check_chip_pointer_default (noflash)
|
||||
esp_flash_api: esp_flash_get_size (noflash)
|
||||
esp_flash_api: esp_flash_erase_chip (noflash)
|
||||
esp_flash_api: esp_flash_get_chip_write_protect (noflash)
|
||||
|
||||
Reference in New Issue
Block a user