feat(modem): add phy retention related api

This commit is contained in:
cjin
2026-09-04 10:27:25 +08:00
parent a79519d844
commit 3c875310d1
15 changed files with 245 additions and 55 deletions
@@ -28,7 +28,7 @@ void pau_regdma_set_entry_link_addr(pau_regdma_link_addr_t *link_entries);
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY
#if SOC_PM_PAU_REGDMA_LINK_MODEM
/**
* @brief Set the address of WiFi MAC REGDMA Link in modem state
* @brief Set the address of modem REGDMA Link in modem state
* @param link_addr linked lists address
*/
void pau_regdma_set_modem_link_addr(void *link_addr);
@@ -36,26 +36,62 @@ void pau_regdma_set_modem_link_addr(void *link_addr);
/**
* @brief Software trigger regdma to perform modem link backup
*
* @param blocking software waits for regdma to complete
*/
void pau_regdma_trigger_modem_link_backup(void);
void pau_regdma_trigger_modem_link_backup(bool blocking);
/**
* @brief Software trigger regdma to perform modem link restore
*
* @param blocking software waits for regdma to complete
*/
void pau_regdma_trigger_modem_link_restore(void);
void pau_regdma_trigger_modem_link_restore(bool blocking);
/**
* @brief Completion process of regdma for modem link retention
*
*/
void pau_regdma_modem_link_complete(void);
#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND
/**
* @brief Software trigger REGDMA backup on WiFi MAC SEL link
*/
void pau_regdma_trigger_wifimac_link_backup(void);
void pau_regdma_trigger_wifimac_link_backup(bool blocking);
/**
* @brief Software trigger REGDMA restore on WiFi MAC SEL link
*/
void pau_regdma_trigger_wifimac_link_restore(void);
void pau_regdma_trigger_wifimac_link_restore(bool blocking);
#endif
/**
* @brief Enable pau done interrupt
*
*/
void pau_regdma_done_int_enable(void);
/**
* @brief Disable pau done interrupt
*
*/
void pau_regdma_done_int_disable(void);
/**
* @brief Check pau done interrupt status
*
*/
bool pau_get_regdma_done_status(void);
/**
* @brief Clear pau done interrupt status
*
*/
void pau_clear_regdma_done_status(void);
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */
#if SOC_PM_RETENTION_SW_TRIGGER_REGDMA
/**
* @brief Set the address of system REGDMA Link in active state
@@ -101,7 +137,6 @@ void pau_regdma_trigger_extra_link_restore(void);
*/
bool pau_regdma_enable_aon_link_entry(bool enable);
#endif
#endif
#ifdef __cplusplus
}
@@ -10,6 +10,7 @@
#include "sdkconfig.h"
#include "esp_err.h"
#include "esp_sleep.h"
#include "esp_attr.h"
#ifdef __cplusplus
extern "C" {
@@ -90,9 +91,14 @@ void sleep_modem_mac_bb_power_up_prepare(void);
#endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY
/**
* @brief Phy retention completes
*
*/
void sleep_modem_phy_retention_complete(void);
/**
* @brief The retention action in the modem state of PHY module
* @brief The retention action of PHY module
*
* @param restore true for restore the PHY context, false for backup the PHY context
* @param flags Configure flags for phy link
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -340,7 +340,7 @@ void sleep_retention_do_extra_retention(bool backup_or_restore);
void sleep_retention_do_system_retention(bool backup_or_restore);
#endif
#if SOC_PM_SUPPORT_PMU_MODEM_STATE
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY
/**
* @brief Software trigger REGDMA to do phy linked list retention
*
@@ -348,9 +348,16 @@ void sleep_retention_do_system_retention(bool backup_or_restore);
* or false for restore to register from memory
* @param wifimac_link_is_sel true to use dedicated WiFi MAC link,
* false to use modem entry link
* @param blocking Software wait for REGDMA to complete
*/
void sleep_retention_do_phy_retention(bool backup_or_restore, bool wifimac_link_is_sel);
#endif /*SOC_PM_SUPPORT_PMU_MODEM_STATE */
void sleep_retention_do_phy_retention(bool backup_or_restore, bool wifimac_link_is_sel, bool blocking);
/**
* @brief Completion process of REGDMA for PHY linked list retention
*
*/
void sleep_retention_phy_retention_complete(void);
#endif /*SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */
#endif // SOC_PAU_SUPPORTED
#ifdef __cplusplus
@@ -44,7 +44,6 @@ typedef struct {
#define DESC_SKIP_WIFI_ENTRY_CNT (4)
#define DESC_SKIP_WIFI_RESTORE_ENTRY_CNT (1)
void *regdma_desc[DESC_IDX_I2C_MST_DIS + 1 + DESC_SKIP_WIFI_ENTRY_CNT];
} sleep_phy_link_context_t;
static esp_err_t sleep_phy_retention_init(void *arg)
@@ -112,7 +111,6 @@ esp_err_t sleep_phy_link_init(void **link_head)
REGDMA_PHY_LINK(0x0b), REGDMA_PHY_LINK(0x15), REGDMA_PHY_LINK(0x16), REGDMA_PHY_LINK(0x17) /* WiFi Related entries */
};
static DRAM_ATTR sleep_phy_link_context_t phy_link_context;
for (int i = 0; (err == ESP_OK) && (i < ARRAY_SIZE(phy_link_context.regdma_desc)); i++) {
void *desc = sleep_retention_find_link_by_id(id_array[i]);
if (desc) {
+39 -10
View File
@@ -69,32 +69,61 @@ void pau_regdma_set_modem_link_addr(void *link_addr)
}
#endif
void IRAM_ATTR pau_regdma_trigger_modem_link_backup(void)
void IRAM_ATTR pau_regdma_trigger_modem_link_backup(bool blocking)
{
pau_hal_start_regdma_modem_link(PAU_instance()->hal, true, blocking);
if (blocking) {
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
}
}
void IRAM_ATTR pau_regdma_trigger_modem_link_restore(bool blocking)
{
pau_hal_start_regdma_modem_link(PAU_instance()->hal, false, blocking);
if (blocking) {
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
}
}
void IRAM_ATTR pau_regdma_modem_link_complete(void)
{
pau_hal_start_regdma_modem_link(PAU_instance()->hal, true);
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
}
void IRAM_ATTR pau_regdma_trigger_modem_link_restore(void)
void IRAM_ATTR pau_regdma_done_int_enable(void)
{
pau_hal_start_regdma_modem_link(PAU_instance()->hal, false);
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
pau_hal_regdma_done_int_enable(PAU_instance()->hal);
}
void IRAM_ATTR pau_regdma_done_int_disable(void)
{
pau_hal_regdma_done_int_disable(PAU_instance()->hal);
}
bool IRAM_ATTR pau_get_regdma_done_status(void)
{
return pau_hal_get_regdma_done_status(PAU_instance()->hal);
}
void IRAM_ATTR pau_clear_regdma_done_status(void)
{
pau_hal_clear_regdma_backup_done_intr_state(PAU_instance()->hal);
}
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */
#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND
void IRAM_ATTR pau_regdma_trigger_wifimac_link_backup(void)
void IRAM_ATTR pau_regdma_trigger_wifimac_link_backup(bool blocking)
{
pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, true);
pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, true, blocking);
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
}
void IRAM_ATTR pau_regdma_trigger_wifimac_link_restore(void)
void IRAM_ATTR pau_regdma_trigger_wifimac_link_restore(bool blocking)
{
pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, false);
pau_hal_start_regdma_wifimac_link(PAU_instance()->hal, false, blocking);
pau_hal_stop_regdma_wifimac_link(PAU_instance()->hal);
}
#endif
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */
#if SOC_PM_RETENTION_SW_TRIGGER_REGDMA
void IRAM_ATTR pau_regdma_set_system_link_addr(void *link_addr)
+10 -6
View File
@@ -130,7 +130,6 @@ void mac_bb_power_up_cb_execute(void)
#endif ///CONFIG_MAC_BB_PD
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY
typedef struct sleep_modem_config {
_lock_t phy_link_lock;
void *phy_link;
@@ -196,11 +195,16 @@ __attribute__((unused)) void sleep_modem_phy_deinit(sleep_modem_type_t modem_mas
_lock_release(&s_sleep_modem.phy_link_lock);
}
void IRAM_ATTR sleep_modem_do_phy_retention(bool restore, bool wifimac_link_is_sel)
void IRAM_ATTR sleep_modem_phy_retention_complete(void)
{
sleep_phy_link_config(s_sleep_modem.phy_link, 1);
sleep_retention_do_phy_retention(!restore, wifimac_link_is_sel);
sleep_phy_link_config(s_sleep_modem.phy_link, 0);
sleep_retention_phy_retention_complete();
}
void IRAM_ATTR sleep_modem_do_phy_retention(bool restore, bool wifimac_link_is_sel, uint8_t flags)
{
sleep_phy_link_config(s_sleep_modem.phy_link, flags);
sleep_retention_do_phy_retention(!restore, wifimac_link_is_sel, true);
sleep_phy_link_config(s_sleep_modem.phy_link, SLEEP_MODEM_RESET_RETENTION);
if (!restore) {
s_sleep_modem.phy_link_done = 1;
}
@@ -208,7 +212,7 @@ void IRAM_ATTR sleep_modem_do_phy_retention(bool restore, bool wifimac_link_is_s
inline __attribute__((always_inline)) bool sleep_modem_phy_link_enabled(void)
{
return (s_sleep_modem.phy_link != NULL);
return s_sleep_modem.modem_mask;
}
inline __attribute__((always_inline)) bool sleep_modem_phy_link_done(void)
+18 -7
View File
@@ -1303,8 +1303,8 @@ void IRAM_ATTR sleep_retention_do_system_retention(bool backup_or_restore)
}
#endif
#if SOC_PM_SUPPORT_PMU_MODEM_STATE
void IRAM_ATTR sleep_retention_do_phy_retention(bool backup_or_restore, bool wifimac_link_is_sel)
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY
void IRAM_ATTR sleep_retention_do_phy_retention(bool backup_or_restore, bool wifimac_link_is_sel, bool blocking)
{
/* since the PHY link and other module links are within the sleep-retention entry (4) context,
* add mutex protection to avoid data race.
@@ -1315,24 +1315,35 @@ void IRAM_ATTR sleep_retention_do_phy_retention(bool backup_or_restore, bool wif
if (backup_or_restore) {
#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND
if (wifimac_link_is_sel) {
pau_regdma_trigger_wifimac_link_backup();
pau_regdma_trigger_wifimac_link_backup(blocking);
} else
#endif
{
pau_regdma_trigger_modem_link_backup();
pau_regdma_trigger_modem_link_backup(blocking);
}
} else {
#if SOC_PM_PAU_REGDMA_MODEM_WIFIMAC_WORKAROUND
if (wifimac_link_is_sel) {
pau_regdma_trigger_wifimac_link_restore();
pau_regdma_trigger_wifimac_link_restore(blocking);
} else
#endif
{
pau_regdma_trigger_modem_link_restore();
pau_regdma_trigger_modem_link_restore(blocking);
}
}
#if SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY
_lock_release_recursive(&s_retention.lock);
#endif
}
#endif /*SOC_PM_SUPPORT_PMU_MODEM_STATE */
void IRAM_ATTR sleep_retention_phy_retention_complete(void)
{
#if SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY
_lock_acquire_recursive(&s_retention.lock);
#endif
pau_regdma_modem_link_complete();
#if SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY
_lock_release_recursive(&s_retention.lock);
#endif
}
#endif // SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY