|
|
@@ -31,6 +31,18 @@
|
|
|
#include "esp_spi_flash.h"
|
|
|
#include "esp_log.h"
|
|
|
|
|
|
+#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)
|
|
|
|
|
|
static void IRAM_ATTR spi_flash_disable_cache(uint32_t cpuid, uint32_t* saved_state);
|
|
|
static void IRAM_ATTR spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_state);
|
|
|
@@ -256,13 +268,10 @@ void IRAM_ATTR spi_flash_enable_interrupts_caches_no_os(void)
|
|
|
* Cache_Flush before Cache_Read_Enable, even if cached data was not modified.
|
|
|
*/
|
|
|
|
|
|
-static const uint32_t cache_mask = DPORT_APP_CACHE_MASK_OPSDRAM | DPORT_APP_CACHE_MASK_DROM0 |
|
|
|
- DPORT_APP_CACHE_MASK_DRAM1 | DPORT_APP_CACHE_MASK_IROM0 |
|
|
|
- DPORT_APP_CACHE_MASK_IRAM1 | DPORT_APP_CACHE_MASK_IRAM0;
|
|
|
-
|
|
|
static void IRAM_ATTR spi_flash_disable_cache(uint32_t cpuid, uint32_t* saved_state)
|
|
|
{
|
|
|
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) {
|
|
|
@@ -281,6 +290,7 @@ static void IRAM_ATTR spi_flash_disable_cache(uint32_t cpuid, uint32_t* saved_st
|
|
|
|
|
|
static void IRAM_ATTR spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_state)
|
|
|
{
|
|
|
+ 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);
|
|
|
@@ -290,7 +300,6 @@ static void IRAM_ATTR spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_sta
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
IRAM_ATTR bool spi_flash_cache_enabled(void)
|
|
|
{
|
|
|
bool result = (DPORT_REG_GET_BIT(DPORT_PRO_CACHE_CTRL_REG, DPORT_PRO_CACHE_ENABLE) != 0);
|
|
|
@@ -299,3 +308,12 @@ IRAM_ATTR bool spi_flash_cache_enabled(void)
|
|
|
#endif
|
|
|
return result;
|
|
|
}
|
|
|
+
|
|
|
+void IRAM_ATTR spi_flash_enable_cache(uint32_t cpuid)
|
|
|
+{
|
|
|
+ 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);
|
|
|
+}
|