|
|
@@ -41,6 +41,8 @@
|
|
|
#include "soc/ext_mem_defs.h"
|
|
|
#endif
|
|
|
#include "esp_rom_spiflash.h"
|
|
|
+#include "hal/cache_hal.h"
|
|
|
+#include "hal/cache_ll.h"
|
|
|
#include <soc/soc.h>
|
|
|
#include "sdkconfig.h"
|
|
|
#ifndef CONFIG_FREERTOS_UNICORE
|
|
|
@@ -58,18 +60,6 @@
|
|
|
|
|
|
static __attribute__((unused)) const char *TAG = "cache";
|
|
|
|
|
|
-#define DPORT_CACHE_BIT(cpuid, regid) DPORT_ ## cpuid ## regid
|
|
|
-
|
|
|
-#define DPORT_CACHE_MASK(cpuid) (DPORT_CACHE_BIT(cpuid, _CACHE_MASK_OPSDRAM) | DPORT_CACHE_BIT(cpuid, _CACHE_MASK_DROM0) | \
|
|
|
- DPORT_CACHE_BIT(cpuid, _CACHE_MASK_DRAM1) | DPORT_CACHE_BIT(cpuid, _CACHE_MASK_IROM0) | \
|
|
|
- DPORT_CACHE_BIT(cpuid, _CACHE_MASK_IRAM1) | DPORT_CACHE_BIT(cpuid, _CACHE_MASK_IRAM0) )
|
|
|
-
|
|
|
-#define DPORT_CACHE_VAL(cpuid) (~(DPORT_CACHE_BIT(cpuid, _CACHE_MASK_DROM0) | \
|
|
|
- DPORT_CACHE_BIT(cpuid, _CACHE_MASK_DRAM1) | \
|
|
|
- DPORT_CACHE_BIT(cpuid, _CACHE_MASK_IRAM0)))
|
|
|
-
|
|
|
-#define DPORT_CACHE_GET_VAL(cpuid) (cpuid == 0) ? DPORT_CACHE_VAL(PRO) : DPORT_CACHE_VAL(APP)
|
|
|
-#define DPORT_CACHE_GET_MASK(cpuid) (cpuid == 0) ? DPORT_CACHE_MASK(PRO) : DPORT_CACHE_MASK(APP)
|
|
|
|
|
|
/**
|
|
|
* These two shouldn't be declared as static otherwise if `CONFIG_SPI_FLASH_ROM_IMPL` is enabled,
|
|
|
@@ -78,15 +68,9 @@ static __attribute__((unused)) const char *TAG = "cache";
|
|
|
void spi_flash_disable_cache(uint32_t cpuid, uint32_t *saved_state);
|
|
|
void spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_state);
|
|
|
|
|
|
+// Used only on ROM impl. in idf, this param unused, cache status hold by hal
|
|
|
static uint32_t s_flash_op_cache_state[2];
|
|
|
|
|
|
-#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
|
|
|
-/* esp32c6 does not has a register indicating if cache is enabled
|
|
|
- * so we use s static data to store to state of cache, every time
|
|
|
- * disable/restore api is called, the state will be updated
|
|
|
- */
|
|
|
-static volatile DRAM_ATTR bool s_cache_enabled = 1;
|
|
|
-#endif
|
|
|
|
|
|
#ifndef CONFIG_FREERTOS_UNICORE
|
|
|
static SemaphoreHandle_t s_flash_op_mutex;
|
|
|
@@ -239,7 +223,7 @@ void IRAM_ATTR spi_flash_enable_interrupts_caches_and_other_cpu(void)
|
|
|
s_flash_op_cpu = -1;
|
|
|
#endif
|
|
|
|
|
|
- // Re-enable cache on both CPUs. After this, cache (flash and external RAM) should work again.
|
|
|
+ // Re-enable cache. After this, cache (flash and external RAM) should work again.
|
|
|
spi_flash_restore_cache(cpuid, s_flash_op_cache_state[cpuid]);
|
|
|
#if SOC_IDCACHE_PER_CORE
|
|
|
//only needed if cache(s) is per core
|
|
|
@@ -359,6 +343,19 @@ void IRAM_ATTR spi_flash_enable_interrupts_caches_no_os(void)
|
|
|
|
|
|
#endif // CONFIG_FREERTOS_UNICORE
|
|
|
|
|
|
+
|
|
|
+void IRAM_ATTR spi_flash_enable_cache(uint32_t cpuid)
|
|
|
+{
|
|
|
+#if CONFIG_IDF_TARGET_ESP32
|
|
|
+ uint32_t cache_value = cache_ll_l1_get_enabled_bus(cpuid);
|
|
|
+
|
|
|
+ // Re-enable cache on this CPU
|
|
|
+ spi_flash_restore_cache(cpuid, cache_value);
|
|
|
+#else
|
|
|
+ spi_flash_restore_cache(0, 0); // TODO cache_value should be non-zero
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* The following two functions are replacements for Cache_Read_Disable and Cache_Read_Enable
|
|
|
* function in ROM. They are used to work around a bug where Cache_Read_Disable requires a call to
|
|
|
@@ -366,87 +363,17 @@ void IRAM_ATTR spi_flash_enable_interrupts_caches_no_os(void)
|
|
|
*/
|
|
|
void IRAM_ATTR spi_flash_disable_cache(uint32_t cpuid, uint32_t *saved_state)
|
|
|
{
|
|
|
-#if CONFIG_IDF_TARGET_ESP32
|
|
|
- uint32_t ret = 0;
|
|
|
- const uint32_t cache_mask = DPORT_CACHE_GET_MASK(cpuid);
|
|
|
- if (cpuid == 0) {
|
|
|
- ret |= DPORT_GET_PERI_REG_BITS2(DPORT_PRO_CACHE_CTRL1_REG, cache_mask, 0);
|
|
|
- while (DPORT_GET_PERI_REG_BITS2(DPORT_PRO_DCACHE_DBUG0_REG, DPORT_PRO_CACHE_STATE, DPORT_PRO_CACHE_STATE_S) != 1) {
|
|
|
- ;
|
|
|
- }
|
|
|
- DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL_REG, 1, 0, DPORT_PRO_CACHE_ENABLE_S);
|
|
|
- }
|
|
|
-#if !CONFIG_FREERTOS_UNICORE
|
|
|
- else {
|
|
|
- ret |= DPORT_GET_PERI_REG_BITS2(DPORT_APP_CACHE_CTRL1_REG, cache_mask, 0);
|
|
|
- while (DPORT_GET_PERI_REG_BITS2(DPORT_APP_DCACHE_DBUG0_REG, DPORT_APP_CACHE_STATE, DPORT_APP_CACHE_STATE_S) != 1) {
|
|
|
- ;
|
|
|
- }
|
|
|
- DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL_REG, 1, 0, DPORT_APP_CACHE_ENABLE_S);
|
|
|
- }
|
|
|
-#endif
|
|
|
- *saved_state = ret;
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S2
|
|
|
- *saved_state = Cache_Suspend_ICache();
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S3
|
|
|
- uint32_t icache_state, dcache_state;
|
|
|
- icache_state = Cache_Suspend_ICache() << 16;
|
|
|
- dcache_state = Cache_Suspend_DCache();
|
|
|
- *saved_state = icache_state | dcache_state;
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2
|
|
|
- uint32_t icache_state;
|
|
|
- icache_state = Cache_Suspend_ICache() << 16;
|
|
|
- *saved_state = icache_state;
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
|
|
|
- uint32_t icache_state;
|
|
|
- icache_state = Cache_Suspend_ICache();
|
|
|
- *saved_state = icache_state;
|
|
|
- s_cache_enabled = 0;
|
|
|
-#endif
|
|
|
+ cache_hal_suspend(CACHE_TYPE_ALL);
|
|
|
}
|
|
|
|
|
|
void IRAM_ATTR spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_state)
|
|
|
{
|
|
|
-#if CONFIG_IDF_TARGET_ESP32
|
|
|
- const uint32_t cache_mask = DPORT_CACHE_GET_MASK(cpuid);
|
|
|
- if (cpuid == 0) {
|
|
|
- DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL_REG, 1, 1, DPORT_PRO_CACHE_ENABLE_S);
|
|
|
- DPORT_SET_PERI_REG_BITS(DPORT_PRO_CACHE_CTRL1_REG, cache_mask, saved_state, 0);
|
|
|
- }
|
|
|
-#if !CONFIG_FREERTOS_UNICORE
|
|
|
- else {
|
|
|
- DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL_REG, 1, 1, DPORT_APP_CACHE_ENABLE_S);
|
|
|
- DPORT_SET_PERI_REG_BITS(DPORT_APP_CACHE_CTRL1_REG, cache_mask, saved_state, 0);
|
|
|
- }
|
|
|
-#endif
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S2
|
|
|
- Cache_Resume_ICache(saved_state);
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S3
|
|
|
- Cache_Resume_DCache(saved_state & 0xffff);
|
|
|
- Cache_Resume_ICache(saved_state >> 16);
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2
|
|
|
- Cache_Resume_ICache(saved_state >> 16);
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
|
|
|
- Cache_Resume_ICache(saved_state);
|
|
|
- s_cache_enabled = 1;
|
|
|
-#endif
|
|
|
+ cache_hal_resume(CACHE_TYPE_ALL);
|
|
|
}
|
|
|
|
|
|
-IRAM_ATTR bool spi_flash_cache_enabled(void)
|
|
|
+bool IRAM_ATTR spi_flash_cache_enabled(void)
|
|
|
{
|
|
|
-#if CONFIG_IDF_TARGET_ESP32
|
|
|
- bool result = (DPORT_REG_GET_BIT(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_CACHE_ENABLE) != 0);
|
|
|
-#if portNUM_PROCESSORS == 2
|
|
|
- result = result && (DPORT_REG_GET_BIT(DPORT_APP_CACHE_CTRL_REG, DPORT_APP_CACHE_ENABLE) != 0);
|
|
|
-#endif
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S2
|
|
|
- bool result = (REG_GET_BIT(EXTMEM_PRO_ICACHE_CTRL_REG, EXTMEM_PRO_ICACHE_ENABLE) != 0);
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2
|
|
|
- bool result = (REG_GET_BIT(EXTMEM_ICACHE_CTRL_REG, EXTMEM_ICACHE_ENABLE) != 0);
|
|
|
-#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32H2
|
|
|
- bool result = s_cache_enabled;
|
|
|
-#endif
|
|
|
- return result;
|
|
|
+ return cache_hal_is_cache_enabled(CACHE_TYPE_ALL);
|
|
|
}
|
|
|
|
|
|
#if CONFIG_IDF_TARGET_ESP32S2
|
|
|
@@ -987,16 +914,3 @@ esp_err_t esp_enable_cache_wrap(bool icache_wrap_enable)
|
|
|
return ESP_OK;
|
|
|
}
|
|
|
#endif // CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2
|
|
|
-
|
|
|
-void IRAM_ATTR spi_flash_enable_cache(uint32_t cpuid)
|
|
|
-{
|
|
|
-#if CONFIG_IDF_TARGET_ESP32
|
|
|
- uint32_t cache_value = DPORT_CACHE_GET_VAL(cpuid);
|
|
|
- cache_value &= DPORT_CACHE_GET_MASK(cpuid);
|
|
|
-
|
|
|
- // Re-enable cache on this CPU
|
|
|
- spi_flash_restore_cache(cpuid, cache_value);
|
|
|
-#else
|
|
|
- spi_flash_restore_cache(0, 0); // TODO cache_value should be non-zero
|
|
|
-#endif
|
|
|
-}
|