Merge branch 'fix/use_conflict_cb_for_regi2c_when_regdma_rf_is_used' into 'master'

feat(sleep): applied regi2c conflict process at regdma rf

See merge request espressif/esp-idf!51770
This commit is contained in:
Island
2026-08-17 14:43:56 +08:00
11 changed files with 124 additions and 4 deletions

View File

@@ -138,6 +138,25 @@ void pau_regdma_trigger_extra_link_restore(void);
bool pau_regdma_enable_aon_link_entry(bool enable);
#endif
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
/**
* @brief Callback function type for modem link protect.
*
*/
typedef void (* pau_regdma_modem_link_protect_cb_t)(bool protect);
/**
* @brief Register the modem link trigger hook callback function
* @param cb the callback function
*/
void pau_regdma_register_modem_link_protect(pau_regdma_modem_link_protect_cb_t cb);
/**
* @brief Unregister the modem link trigger hook callback function
*/
void pau_regdma_unregister_modem_link_protect(void);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
#ifdef __cplusplus
}
#endif

View File

@@ -27,12 +27,19 @@ ESP_LOG_ATTR_TAG(TAG, "pau_regdma");
typedef struct {
pau_hal_context_t *hal;
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_modem_link_protect_cb_t modem_link_protect;
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
} pau_context_t;
pau_context_t * __attribute__((weak)) IRAM_ATTR PAU_instance(void)
{
static pau_hal_context_t pau_hal = { .dev = NULL };
static pau_context_t pau_context = { .hal = &pau_hal };
static pau_context_t pau_context = { .hal = &pau_hal,
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
.modem_link_protect = NULL,
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
};
/* periph_module_enable don not need to be put in iram because it is
* called before the flash is powered off and will not be called again. */
@@ -61,6 +68,25 @@ void pau_regdma_set_entry_link_addr(pau_regdma_link_addr_t *link_entries)
pau_hal_set_regdma_entry_link_addr(PAU_instance()->hal, link_entries);
}
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
void pau_regdma_register_modem_link_protect(pau_regdma_modem_link_protect_cb_t cb)
{
PAU_instance()->modem_link_protect = cb;
}
void pau_regdma_unregister_modem_link_protect(void)
{
PAU_instance()->modem_link_protect = NULL;
}
static void IRAM_ATTR pau_regdma_invoke_modem_link_procect(bool protect)
{
if (PAU_instance()->modem_link_protect) {
PAU_instance()->modem_link_protect(protect);
}
}
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY
#if SOC_PM_PAU_REGDMA_LINK_MODEM
void pau_regdma_set_modem_link_addr(void *link_addr)
@@ -71,18 +97,30 @@ void pau_regdma_set_modem_link_addr(void *link_addr)
void IRAM_ATTR pau_regdma_trigger_modem_link_backup(bool blocking)
{
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_invoke_modem_link_procect(true);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_hal_start_regdma_modem_link(PAU_instance()->hal, true, blocking);
if (blocking) {
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
}
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_invoke_modem_link_procect(false);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
}
void IRAM_ATTR pau_regdma_trigger_modem_link_restore(bool blocking)
{
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_invoke_modem_link_procect(true);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_hal_start_regdma_modem_link(PAU_instance()->hal, false, blocking);
if (blocking) {
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
}
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_invoke_modem_link_procect(false);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
}
void IRAM_ATTR pau_regdma_modem_link_complete(void)
@@ -113,14 +151,30 @@ void IRAM_ATTR pau_clear_regdma_done_status(void)
#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND
void IRAM_ATTR pau_regdma_trigger_wifimac_link_backup(bool blocking)
{
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_invoke_modem_link_procect(true);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, true, blocking);
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
if (blocking) {
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
}
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_invoke_modem_link_procect(false);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
}
void IRAM_ATTR pau_regdma_trigger_wifimac_link_restore(bool blocking)
{
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_invoke_modem_link_procect(true);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, false, blocking);
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
if (blocking) {
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
}
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_invoke_modem_link_procect(false);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
}
#endif
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */

View File

@@ -55,6 +55,9 @@
#include "soc/periph_defs.h"
#endif
#include "phy_init_deps.h"
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
#include "esp_private/esp_pau.h"
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
#ifndef PHY_INIT_MODEM_CLOCK_REQUIRED_BITS
#warning "PHY_INIT_MODEM_CLOCK_REQUIRED_BITS not defined; using default value 0"
@@ -73,6 +76,11 @@ extern bool pm_get_wifimac_regdma_link_selection(void);
#endif
#endif
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
extern void phy_i2c_enter_critical(void);
extern void phy_i2c_exit_critical(void);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
static const char* TAG = "phy_init";
static _lock_t s_phy_access_lock;
@@ -511,6 +519,17 @@ void esp_wifi_bt_power_domain_off(void)
#endif // SOC_PM_SUPPORT_MODEM_PD || SOC_PM_SUPPORT_WIFI_PD
}
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
void IRAM_ATTR esp_phy_regi2c_lock_apply(bool enable)
{
if (enable) {
phy_i2c_enter_critical();
} else {
phy_i2c_exit_critical();
}
}
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
void esp_phy_modem_init(uint8_t modem)
{
#if SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP || CONFIG_ESP_PHY_HW_SWITCH_RF
@@ -522,6 +541,9 @@ void esp_phy_modem_init(uint8_t modem)
}
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA
#if (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_register_modem_link_protect(esp_phy_regi2c_lock_apply);
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
if (sleep_modem_phy_init(modem) != ESP_OK) {
ESP_LOGE(TAG, "failed to initialize sleep modem phy");
}
@@ -552,9 +574,14 @@ void esp_phy_modem_deinit(uint8_t modem)
phy_init_flag();
#endif // CONFIG_IDF_TARGET_ESP32C3
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA
}
#if (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
#if SOC_PM_REGDMA_MODEM_LINK_PROTECT
pau_regdma_unregister_modem_link_protect();
#endif // SOC_PM_REGDMA_MODEM_LINK_PROTECT
}
sleep_modem_phy_deinit(modem);
#else
}
#endif // (SOC_PM_SUPPORT_PMU_MODEM_STATE && CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP) || CONFIG_ESP_PHY_HW_SWITCH_RF
_lock_release(&s_phy_access_lock);
#endif // SOC_PM_MODEM_RETENTION_BY_BACKUPDMA || CONFIG_ESP_WIFI_ENHANCED_LIGHT_SLEEP

View File

@@ -1383,6 +1383,10 @@ config SOC_PM_SUPPORT_PMU_MODEM_STATE
bool
default y
config SOC_PM_REGDMA_MODEM_LINK_PROTECT
bool
default y
config SOC_PM_SUPPORT_PMU_CLK_ICG
bool
default y

View File

@@ -559,6 +559,7 @@
#define SOC_PM_SUPPORT_PMU_MODEM_STATE (1)
/* macro redefine for pass esp_wifi headers md5sum check */
#define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE
#define SOC_PM_REGDMA_MODEM_LINK_PROTECT (1)
#define SOC_PM_SUPPORT_PMU_CLK_ICG (1)
#define SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG (1)

View File

@@ -1127,6 +1127,10 @@ config SOC_PM_SUPPORT_PMU_MODEM_STATE
bool
default y
config SOC_PM_REGDMA_MODEM_LINK_PROTECT
bool
default y
config SOC_PM_SUPPORT_PMU_CLK_ICG
bool
default y

View File

@@ -462,6 +462,7 @@
#define SOC_PM_SUPPORT_PMU_MODEM_STATE (1)
/* macro redefine for pass esp_wifi headers md5sum check */
#define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE
#define SOC_PM_REGDMA_MODEM_LINK_PROTECT (1)
#define SOC_PM_SUPPORT_PMU_CLK_ICG (1)
#define SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG (1)

View File

@@ -1043,6 +1043,10 @@ config SOC_PM_SUPPORT_PMU_MODEM_STATE
bool
default y
config SOC_PM_REGDMA_MODEM_LINK_PROTECT
bool
default y
config SOC_PM_SUPPORT_PMU_CLK_ICG
bool
default y

View File

@@ -430,6 +430,7 @@
#define SOC_PM_SUPPORT_PMU_MODEM_STATE (1)
/* macro redefine for pass esp_wifi headers md5sum check */
#define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE
#define SOC_PM_REGDMA_MODEM_LINK_PROTECT (1)
#define SOC_PM_SUPPORT_PMU_CLK_ICG (1)
#define SOC_PM_SUPPORT_MODEM_CLOCK_DOMAIN_ICG (1)

View File

@@ -1583,6 +1583,10 @@ config SOC_PM_SUPPORT_PMU_MODEM_STATE
bool
default y
config SOC_PM_REGDMA_MODEM_LINK_PROTECT
bool
default y
config SOC_PM_MODEM_STATE_USE_XTAL
bool
default y

View File

@@ -586,6 +586,7 @@
#define SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY (1)
#define SOC_PM_SUPPORT_PMU_MODEM_STATE (1)
#define MAC_SUPPORT_PMU_MODEM_STATE SOC_PM_SUPPORT_PMU_MODEM_STATE
#define SOC_PM_REGDMA_MODEM_LINK_PROTECT (1)
/* Since SOC APB and MODEM APB on ESP32-S31 are decoupled, XTAL can be used as SOC clock in modem state */
#define SOC_PM_MODEM_STATE_USE_XTAL (1)