change(esp_hw_support): disable CPU wait-for-event mode on cpu start

This commit is contained in:
wuzhenghui 2025-01-14 21:34:44 +08:00 committed by BOT
parent 36ae237691
commit 1e11f287e1
8 changed files with 50 additions and 3 deletions

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -247,6 +247,16 @@ FORCE_INLINE_ATTR void esp_cpu_intr_set_mtvt_addr(const void *mtvt_addr)
} }
#endif //#if SOC_INT_CLIC_SUPPORTED #endif //#if SOC_INT_CLIC_SUPPORTED
#if SOC_CPU_SUPPORT_WFE
/**
* @brief Disable the WFE (wait for event) feature for CPU.
*/
FORCE_INLINE_ATTR void rv_utils_disable_wfe_mode(void)
{
rv_utils_wfe_mode_enable(false);
}
#endif
#if SOC_CPU_HAS_FLEXIBLE_INTC #if SOC_CPU_HAS_FLEXIBLE_INTC
/** /**
* @brief Set the interrupt type of a particular interrupt * @brief Set the interrupt type of a particular interrupt

View File

@ -218,7 +218,9 @@ void IRAM_ATTR call_start_cpu1(void)
*/ */
esp_cpu_intr_set_mtvt_addr(&_mtvt_table); esp_cpu_intr_set_mtvt_addr(&_mtvt_table);
#endif #endif
#if SOC_CPU_SUPPORT_WFE
rv_utils_disable_wfe_mode();
#endif
ets_set_appcpu_boot_addr(0); ets_set_appcpu_boot_addr(0);
bootloader_init_mem(); bootloader_init_mem();
@ -419,6 +421,9 @@ void IRAM_ATTR call_start_cpu0(void)
*/ */
esp_cpu_intr_set_mtvt_addr(&_mtvt_table); esp_cpu_intr_set_mtvt_addr(&_mtvt_table);
#endif #endif
#if SOC_CPU_SUPPORT_WFE
rv_utils_disable_wfe_mode();
#endif
rst_reas[0] = esp_rom_get_reset_reason(0); rst_reas[0] = esp_rom_get_reset_reason(0);
#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE #if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2020-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -148,6 +148,20 @@ FORCE_INLINE_ATTR void rv_utils_set_mtvt(uint32_t mtvt_val)
RV_WRITE_CSR(MTVT_CSR, mtvt_val); RV_WRITE_CSR(MTVT_CSR, mtvt_val);
} }
#if SOC_CPU_SUPPORT_WFE
/**
* @brief Set the MEXSTATUS_WFFEN value, used to enable/disable wait for event mode.
*/
FORCE_INLINE_ATTR void rv_utils_wfe_mode_enable(bool en)
{
if (en) {
RV_SET_CSR(MEXSTATUS, MEXSTATUS_WFFEN);
} else {
RV_CLEAR_CSR(MEXSTATUS, MEXSTATUS_WFFEN);
}
}
#endif
/** /**
* @brief Get the current CPU raw interrupt level * @brief Get the current CPU raw interrupt level
*/ */

View File

@ -53,6 +53,14 @@
#define MSTATUS_SXL 0x0000000C00000000 #define MSTATUS_SXL 0x0000000C00000000
#define MSTATUS64_SD 0x8000000000000000 #define MSTATUS64_SD 0x8000000000000000
#define MEXSTATUS_SOFT_RST 0x00000003
#define MEXSTATUS_LPMD 0x0000000C
#define MEXSTATUS_WFFEN 0x00000010
#define MEXSTATUS_EXPT_VLD 0x00000020
#define MEXSTATUS_LOCKUP 0x00000040
#define MEXSTATUS_NMISTS 0x00000080
#define MEXSTATUS_BUSEER 0x00000100
#define SSTATUS_UIE 0x00000001 #define SSTATUS_UIE 0x00000001
#define SSTATUS_SIE 0x00000002 #define SSTATUS_SIE 0x00000002
#define SSTATUS_UPIE 0x00000010 #define SSTATUS_UPIE 0x00000010

View File

@ -379,6 +379,10 @@ config SOC_CPU_HAS_FLEXIBLE_INTC
bool bool
default y default y
config SOC_CPU_SUPPORT_WFE
bool
default y
config SOC_INT_CLIC_SUPPORTED config SOC_INT_CLIC_SUPPORTED
bool bool
default y default y

View File

@ -153,6 +153,7 @@
#define SOC_CPU_CORES_NUM (1U) #define SOC_CPU_CORES_NUM (1U)
#define SOC_CPU_INTR_NUM 32 #define SOC_CPU_INTR_NUM 32
#define SOC_CPU_HAS_FLEXIBLE_INTC 1 #define SOC_CPU_HAS_FLEXIBLE_INTC 1
#define SOC_CPU_SUPPORT_WFE 1
#define SOC_INT_CLIC_SUPPORTED 1 #define SOC_INT_CLIC_SUPPORTED 1
#define SOC_INT_HW_NESTED_SUPPORTED 1 // Support for hardware interrupts nesting #define SOC_INT_HW_NESTED_SUPPORTED 1 // Support for hardware interrupts nesting
#define SOC_BRANCH_PREDICTOR_SUPPORTED 1 #define SOC_BRANCH_PREDICTOR_SUPPORTED 1

View File

@ -215,6 +215,10 @@ config SOC_CPU_HAS_FLEXIBLE_INTC
bool bool
default y default y
config SOC_CPU_SUPPORT_WFE
bool
default y
config SOC_INT_PLIC_SUPPORTED config SOC_INT_PLIC_SUPPORTED
bool bool
default n default n

View File

@ -126,6 +126,7 @@
#define SOC_CPU_CORES_NUM (1U) #define SOC_CPU_CORES_NUM (1U)
#define SOC_CPU_INTR_NUM 32 #define SOC_CPU_INTR_NUM 32
#define SOC_CPU_HAS_FLEXIBLE_INTC 1 #define SOC_CPU_HAS_FLEXIBLE_INTC 1
#define SOC_CPU_SUPPORT_WFE 1
#define SOC_INT_PLIC_SUPPORTED 0 //riscv platform-level interrupt controller #define SOC_INT_PLIC_SUPPORTED 0 //riscv platform-level interrupt controller
#define SOC_INT_CLIC_SUPPORTED 1 #define SOC_INT_CLIC_SUPPORTED 1
#define SOC_INT_HW_NESTED_SUPPORTED 1 // Support for hardware interrupts nesting #define SOC_INT_HW_NESTED_SUPPORTED 1 // Support for hardware interrupts nesting