diff --git a/components/esp_hw_support/include/esp_cpu.h b/components/esp_hw_support/include/esp_cpu.h index c0b84749bf2..f0f441b713e 100644 --- a/components/esp_hw_support/include/esp_cpu.h +++ b/components/esp_hw_support/include/esp_cpu.h @@ -578,6 +578,14 @@ FORCE_INLINE_ATTR void esp_cpu_branch_prediction_enable(void) { rv_utils_en_branch_predictor(); } + +/** + * @brief Disable branch prediction + */ +FORCE_INLINE_ATTR void esp_cpu_branch_prediction_disable(void) +{ + rv_utils_dis_branch_predictor(); +} #endif //#if SOC_BRANCH_PREDICTOR_SUPPORTED #ifdef __cplusplus diff --git a/components/riscv/include/riscv/rv_utils.h b/components/riscv/include/riscv/rv_utils.h index c0d3a64b2f0..cc8c608e4ae 100644 --- a/components/riscv/include/riscv/rv_utils.h +++ b/components/riscv/include/riscv/rv_utils.h @@ -27,6 +27,13 @@ extern "C" { #define CSR_PCCR_MACHINE 0x7e2 #endif /* SOC_CPU_HAS_CSR_PC */ +#if SOC_BRANCH_PREDICTOR_SUPPORTED +#define MHCR 0x7c1 +#define MHCR_RS (1<<4) /* R/W, address return stack set bit */ +#define MHCR_BFE (1<<5) /* R/W, allow predictive jump set bit */ +#define MHCR_BTB (1<<12) /* R/W, branch target prediction enable bit */ +#endif //SOC_BRANCH_PREDICTOR_SUPPORTED + #if SOC_CPU_HAS_FPU /* FPU bits in mstatus start at bit 13 */ @@ -363,12 +370,13 @@ FORCE_INLINE_ATTR bool rv_utils_compare_and_set(volatile uint32_t *addr, uint32_ #if SOC_BRANCH_PREDICTOR_SUPPORTED FORCE_INLINE_ATTR void rv_utils_en_branch_predictor(void) { -#define MHCR 0x7c1 -#define MHCR_RS (1<<4) /* R/W, address return stack set bit */ -#define MHCR_BFE (1<<5) /* R/W, allow predictive jump set bit */ -#define MHCR_BTB (1<<12) /* R/W, branch target prediction enable bit */ RV_SET_CSR(MHCR, MHCR_RS|MHCR_BFE|MHCR_BTB); } + +FORCE_INLINE_ATTR void rv_utils_dis_branch_predictor(void) +{ + RV_CLEAR_CSR(MHCR, MHCR_RS|MHCR_BFE|MHCR_BTB); +} #endif #ifdef __cplusplus diff --git a/components/spi_flash/cache_utils.c b/components/spi_flash/cache_utils.c index f4cb5c18fda..153a2c3670d 100644 --- a/components/spi_flash/cache_utils.c +++ b/components/spi_flash/cache_utils.c @@ -371,12 +371,19 @@ void IRAM_ATTR spi_flash_enable_cache(uint32_t cpuid) void IRAM_ATTR spi_flash_disable_cache(uint32_t cpuid, uint32_t *saved_state) { +#if SOC_BRANCH_PREDICTOR_SUPPORTED + //branch predictor will start cache request as well + esp_cpu_branch_prediction_disable(); +#endif cache_hal_suspend(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); } void IRAM_ATTR spi_flash_restore_cache(uint32_t cpuid, uint32_t saved_state) { cache_hal_resume(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL); +#if SOC_BRANCH_PREDICTOR_SUPPORTED + esp_cpu_branch_prediction_enable(); +#endif } bool IRAM_ATTR spi_flash_cache_enabled(void)