feat(modem): add phy retention related api

This commit is contained in:
cjin
2026-09-15 11:36:15 +08:00
parent 520f9ec6a5
commit ff113a01f9
14 changed files with 226 additions and 50 deletions
@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -25,25 +25,58 @@ extern "C" {
*/ */
void pau_regdma_set_entry_link_addr(pau_regdma_link_addr_t *link_entries); void pau_regdma_set_entry_link_addr(pau_regdma_link_addr_t *link_entries);
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
#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 * @param link_addr linked lists address
*/ */
void pau_regdma_set_modem_link_addr(void *link_addr); void pau_regdma_set_modem_link_addr(void *link_addr);
#endif // SOC_PM_PAU_REGDMA_LINK_MODEM
/** /**
* @brief Software trigger regdma to perform modem link backup * @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 * @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);
#endif
/**
* @brief Completion process of regdma for modem link retention
*
*/
void pau_regdma_modem_link_complete(void);
/**
* @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 || SOC_PM_SUPPORT_PMU_MODEM_STATE */
#if SOC_PM_RETENTION_SW_TRIGGER_REGDMA #if SOC_PM_RETENTION_SW_TRIGGER_REGDMA
/** /**
@@ -90,7 +123,6 @@ void pau_regdma_trigger_extra_link_restore(void);
*/ */
bool pau_regdma_enable_aon_link_entry(bool enable); bool pau_regdma_enable_aon_link_entry(bool enable);
#endif #endif
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
@@ -10,16 +10,17 @@
#include "sdkconfig.h" #include "sdkconfig.h"
#include "esp_err.h" #include "esp_err.h"
#include "esp_sleep.h" #include "esp_sleep.h"
#include "esp_attr.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
#define SLEEP_MODEM_SKIP_I2C_MST_CLK_RETENTION (BIT(0)) #define SLEEP_MODEM_SKIP_I2C_MST_CLK_RETENTION (BIT(0))
#define SLEEP_MODEM_SKIP_WIFI_RETENTION (BIT(1)) #define SLEEP_MODEM_SKIP_WIFI_RETENTION (BIT(1))
#define SLEEP_MODEM_RESET_RETENTION (0) #define SLEEP_MODEM_RESET_RETENTION (0)
#endif // SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #endif // SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
typedef enum { typedef enum {
SLEEP_MODEM_WIFI = 1, SLEEP_MODEM_WIFI = 1,
SLEEP_MODEM_BT = 2, SLEEP_MODEM_BT = 2,
@@ -90,9 +91,14 @@ void sleep_modem_mac_bb_power_up_prepare(void);
#endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD #endif // SOC_PM_RETENTION_HAS_CLOCK_BUG && CONFIG_MAC_BB_PD
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #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 restore true for restore the PHY context, false for backup the PHY context
*/ */
@@ -210,7 +216,7 @@ void esp_pm_register_light_sleep_default_params_config_callback(update_light_sle
*/ */
void esp_pm_unregister_light_sleep_default_params_config_callback(void); void esp_pm_unregister_light_sleep_default_params_config_callback(void);
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
/** /**
* @brief Init phy link. * @brief Init phy link.
* *
@@ -278,7 +284,7 @@ esp_err_t sleep_phy_link_deinit(void *link_context);
* @param flags A bitmap to indicate the PHY link regdma description configuration flag * @param flags A bitmap to indicate the PHY link regdma description configuration flag
*/ */
void sleep_phy_link_config(void *link_context, uint32_t flags); void sleep_phy_link_config(void *link_context, uint32_t flags);
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */ #endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY | SOC_PM_SUPPORT_PMU_MODEM_STATE */
#ifdef __cplusplus #ifdef __cplusplus
} }
@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -276,6 +276,22 @@ void sleep_retention_do_extra_retention(bool backup_or_restore);
void sleep_retention_do_system_retention(bool backup_or_restore); void sleep_retention_do_system_retention(bool backup_or_restore);
#endif #endif
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
/**
* @brief Software trigger REGDMA to do phy linked list retention
*
* @param backup_or_restore true for backup register context to memory
* or false for restore to register from memory
* @param blocking Software wait for REGDMA to complete
*/
void sleep_retention_do_phy_retention(bool backup_or_restore, 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 || SOC_PM_SUPPORT_PMU_MODEM_STATE */
#endif // SOC_PAU_SUPPORTED #endif // SOC_PAU_SUPPORTED
#ifdef __cplusplus #ifdef __cplusplus
@@ -16,7 +16,7 @@
#include "esp_private/sleep_modem.h" #include "esp_private/sleep_modem.h"
#include "esp_private/sleep_retention.h" #include "esp_private/sleep_retention.h"
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
#define SARADC_TSENS_REG (0x6000e058) #define SARADC_TSENS_REG (0x6000e058)
#define SARADC_TSENS_PU (BIT(22)) #define SARADC_TSENS_PU (BIT(22))
@@ -180,4 +180,4 @@ esp_err_t sleep_phy_link_deinit(void *link_context)
#endif #endif
return ESP_OK; return ESP_OK;
} }
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */ #endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE */
+38 -9
View File
@@ -68,26 +68,55 @@ 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); pau_hal_set_regdma_entry_link_addr(PAU_instance()->hal, link_entries);
} }
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
#if SOC_PM_PAU_REGDMA_LINK_MODEM #if SOC_PM_PAU_REGDMA_LINK_WIFIMAC
void pau_regdma_set_modem_link_addr(void *link_addr) void pau_regdma_set_modem_link_addr(void *link_addr)
{ {
pau_hal_set_regdma_modem_link_addr(PAU_instance()->hal, link_addr); pau_hal_set_regdma_modem_link_addr(PAU_instance()->hal, link_addr);
} }
#endif #endif // SOC_PM_PAU_REGDMA_LINK_WIFIMAC
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); 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_regdma_done_int_enable(PAU_instance()->hal);
pau_hal_stop_regdma_modem_link(PAU_instance()->hal);
} }
#endif
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 || SOC_PM_SUPPORT_PMU_MODEM_STATE */
#if SOC_PM_RETENTION_SW_TRIGGER_REGDMA #if SOC_PM_RETENTION_SW_TRIGGER_REGDMA
void IRAM_ATTR pau_regdma_set_system_link_addr(void *link_addr) void IRAM_ATTR pau_regdma_set_system_link_addr(void *link_addr)
+12 -9
View File
@@ -129,8 +129,7 @@ void IRAM_ATTR mac_bb_power_up_cb_execute(void)
#endif ///CONFIG_MAC_BB_PD #endif ///CONFIG_MAC_BB_PD
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
typedef struct sleep_modem_config { typedef struct sleep_modem_config {
_lock_t phy_link_lock; _lock_t phy_link_lock;
void *phy_link; void *phy_link;
@@ -196,20 +195,24 @@ __attribute__((unused)) void sleep_modem_phy_deinit(sleep_modem_type_t modem_mas
_lock_release(&s_sleep_modem.phy_link_lock); _lock_release(&s_sleep_modem.phy_link_lock);
} }
void IRAM_ATTR sleep_modem_do_phy_retention(bool restore) void IRAM_ATTR sleep_modem_phy_retention_complete(void)
{ {
sleep_phy_link_config(s_sleep_modem.phy_link, 1); sleep_retention_phy_retention_complete();
sleep_retention_do_phy_retention(!restore, wifimac_link_is_sel); }
sleep_phy_link_config(s_sleep_modem.phy_link, 0);
void IRAM_ATTR sleep_modem_do_phy_retention(bool restore, uint8_t flags)
{
sleep_phy_link_config(s_sleep_modem.phy_link, flags);
sleep_retention_do_phy_retention(!restore, true);
sleep_phy_link_config(s_sleep_modem.phy_link, SLEEP_MODEM_RESET_RETENTION);
if (!restore) { if (!restore) {
s_sleep_modem.phy_link_done = 1; s_sleep_modem.phy_link_done = 1;
} }
sleep_modem_state_phy_link_config(s_sleep_modem.wifi.phy_link, 0);
} }
inline __attribute__((always_inline)) bool sleep_modem_phy_link_enabled(void) 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) inline __attribute__((always_inline)) bool sleep_modem_phy_link_done(void)
@@ -217,7 +220,7 @@ inline __attribute__((always_inline)) bool sleep_modem_phy_link_done(void)
return (s_sleep_modem.phy_link_done == 1); return (s_sleep_modem.phy_link_done == 1);
} }
#endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY */ #endif /* SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE */
bool modem_domain_pd_allowed(void) bool modem_domain_pd_allowed(void)
{ {
@@ -999,3 +999,34 @@ void IRAM_ATTR sleep_retention_do_system_retention(bool backup_or_restore)
} }
} }
#endif #endif
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
void IRAM_ATTR sleep_retention_do_phy_retention(bool backup_or_restore, 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.
*/
#if SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY
_lock_acquire_recursive(&s_retention.lock);
#endif
if (backup_or_restore) {
pau_regdma_trigger_modem_link_backup(blocking);
} else {
pau_regdma_trigger_modem_link_restore(blocking);
}
#if SOC_PM_PAU_REGDMA_COMMON_PHY_LINK_ENTRY
_lock_release_recursive(&s_retention.lock);
#endif
}
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 || SOC_PM_SUPPORT_PMU_MODEM_STATE
+4 -2
View File
@@ -15,14 +15,16 @@ void pau_hal_set_regdma_entry_link_addr(pau_hal_context_t *hal, pau_regdma_link_
lp_aon_ll_set_regdma_link_addr((uint32_t)(*link_addr)[0]); lp_aon_ll_set_regdma_link_addr((uint32_t)(*link_addr)[0]);
} }
void IRAM_ATTR pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore) void IRAM_ATTR pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore, bool blocking)
{ {
pau_ll_clear_regdma_backup_done_intr_state(hal->dev); pau_ll_clear_regdma_backup_done_intr_state(hal->dev);
pau_ll_set_regdma_select_wifimac_link(hal->dev); pau_ll_set_regdma_select_wifimac_link(hal->dev);
pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore); pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore);
pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev); pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev);
while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW)); if (blocking) {
while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW));
}
} }
void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal) void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal)
+15 -3
View File
@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -18,14 +18,26 @@ void pau_hal_set_regdma_entry_link_addr(pau_hal_context_t *hal, pau_regdma_link_
* REGDMA link 3 */ * REGDMA link 3 */
} }
void IRAM_ATTR pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore) void IRAM_ATTR pau_hal_regdma_wait_done(pau_hal_context_t *hal)
{
while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW));
}
void IRAM_ATTR pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore, bool blocking)
{ {
pau_ll_clear_regdma_backup_done_intr_state(hal->dev); pau_ll_clear_regdma_backup_done_intr_state(hal->dev);
pau_ll_set_regdma_select_wifimac_link(hal->dev); pau_ll_set_regdma_select_wifimac_link(hal->dev);
pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore); pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore);
pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev); pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev);
while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW)); if (blocking) {
pau_hal_regdma_wait_done(hal);
}
}
bool IRAM_ATTR pau_hal_get_regdma_done_status(pau_hal_context_t *hal)
{
return (pau_ll_get_regdma_intr_status(hal->dev) & 0x1);
} }
void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal) void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal)
+4 -2
View File
@@ -18,14 +18,16 @@ void pau_hal_set_regdma_entry_link_addr(pau_hal_context_t *hal, pau_regdma_link_
* REGDMA link 3 */ * REGDMA link 3 */
} }
void IRAM_ATTR pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore) void IRAM_ATTR pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore, bool blocking)
{ {
pau_ll_clear_regdma_backup_done_intr_state(hal->dev); pau_ll_clear_regdma_backup_done_intr_state(hal->dev);
pau_ll_set_regdma_select_wifimac_link(hal->dev); pau_ll_set_regdma_select_wifimac_link(hal->dev);
pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore); pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore);
pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev); pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev);
while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW)); if (blocking) {
while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW));
}
} }
void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal) void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal)
+4 -2
View File
@@ -26,14 +26,16 @@ void pau_hal_set_regdma_entry_link_addr(pau_hal_context_t *hal, pau_regdma_link_
lp_sys_ll_set_pau_link_addr((uint32_t)(*link_addr)[0]); lp_sys_ll_set_pau_link_addr((uint32_t)(*link_addr)[0]);
} }
void IRAM_ATTR pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore) void IRAM_ATTR pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore, bool blocking)
{ {
pau_ll_clear_regdma_backup_done_intr_state(hal->dev); pau_ll_clear_regdma_backup_done_intr_state(hal->dev);
pau_ll_set_regdma_select_wifimac_link(hal->dev); pau_ll_set_regdma_select_wifimac_link(hal->dev);
pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore); pau_ll_set_regdma_wifimac_link_backup_direction(hal->dev, backup_or_restore);
pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev); pau_ll_set_regdma_wifimac_link_backup_start_enable(hal->dev);
while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW)); if (blocking) {
while (!(pau_ll_get_regdma_intr_raw_signal(hal->dev) & PAU_DONE_INT_RAW));
}
} }
void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal) void IRAM_ATTR pau_hal_stop_regdma_modem_link(pau_hal_context_t *hal)
+41 -5
View File
@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -37,8 +37,8 @@ typedef struct {
*/ */
void pau_hal_set_regdma_entry_link_addr(pau_hal_context_t *hal, pau_regdma_link_addr_t *link_addr); void pau_hal_set_regdma_entry_link_addr(pau_hal_context_t *hal, pau_regdma_link_addr_t *link_addr);
#if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY #if SOC_PM_SUPPORT_REGDMA_TRIGGERED_PHY || SOC_PM_SUPPORT_PMU_MODEM_STATE
#if SOC_PM_PAU_REGDMA_LINK_MODEM #if SOC_PM_PAU_REGDMA_LINK_WIFIMAC
/** /**
* @brief Set regdma modem link address * @brief Set regdma modem link address
* *
@@ -46,15 +46,23 @@ void pau_hal_set_regdma_entry_link_addr(pau_hal_context_t *hal, pau_regdma_link_
* @param link_addr modem link address value * @param link_addr modem link address value
*/ */
#define pau_hal_set_regdma_modem_link_addr(hal, addr) pau_ll_set_regdma_wifimac_link_addr((hal)->dev, (addr)) #define pau_hal_set_regdma_modem_link_addr(hal, addr) pau_ll_set_regdma_wifimac_link_addr((hal)->dev, (addr))
#endif #endif // SOC_PM_PAU_REGDMA_LINK_WIFIMAC
/**
* @brief Wait until regdma completes
*
* @param hal regdma hal context
*/
void pau_hal_regdma_wait_done(pau_hal_context_t *hal);
/** /**
* @brief Start transmission on regdma modem link * @brief Start transmission on regdma modem link
* *
* @param hal regdma hal context * @param hal regdma hal context
* @param backup_or_restore false:restore true:backup * @param backup_or_restore false:restore true:backup
* @param blocking software wait till regdma completes
*/ */
void pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore); void pau_hal_start_regdma_modem_link(pau_hal_context_t *hal, bool backup_or_restore, bool blocking);
/** /**
* @brief Stop transmission on regdma modem link * @brief Stop transmission on regdma modem link
@@ -90,6 +98,34 @@ void pau_hal_start_regdma_system_link(pau_hal_context_t *hal, bool backup_or_res
void pau_hal_stop_regdma_system_link(pau_hal_context_t *hal); void pau_hal_stop_regdma_system_link(pau_hal_context_t *hal);
#endif #endif
/**
* @brief Enable regdma done interrupt
*
* @param hal regdma hal context
*/
#define pau_hal_regdma_done_int_enable(hal) pau_ll_set_regdma_backup_done_intr_enable((hal)->dev)
/**
* @brief Disable regdma done interrupt
*
* @param hal regdma hal context
*/
#define pau_hal_regdma_done_int_disable(hal) pau_ll_set_regdma_backup_done_intr_disable((hal)->dev)
/**
* @brief Get regdma done interrupt status
*
* @param hal regdma hal context
*/
bool pau_hal_get_regdma_done_status(pau_hal_context_t *hal);
/**
* @brief Clear regdma done interrupt status
*
* @param hal regdma hal context
*/
#define pau_hal_clear_regdma_backup_done_intr_state(hal) pau_ll_clear_regdma_backup_done_intr_state((hal)->dev)
#if SOC_PM_PAU_REGDMA_LINK_MULTI_ADDR #if SOC_PM_PAU_REGDMA_LINK_MULTI_ADDR
/** /**
* @brief Set regdma extra link address * @brief Set regdma extra link address
@@ -1463,6 +1463,10 @@ config SOC_PM_PAU_REGDMA_LINK_MODEM
bool bool
default y default y
config SOC_PM_PAU_REGDMA_LINK_WIFIMAC
bool
default y
config SOC_PM_PAU_REGDMA_UPDATE_CACHE_BEFORE_WAIT_COMPARE config SOC_PM_PAU_REGDMA_UPDATE_CACHE_BEFORE_WAIT_COMPARE
bool bool
default y default y
@@ -569,7 +569,8 @@
#define SOC_PM_PAU_LINK_NUM (4) #define SOC_PM_PAU_LINK_NUM (4)
#define SOC_PM_PAU_REGDMA_LINK_MULTI_ADDR (1) #define SOC_PM_PAU_REGDMA_LINK_MULTI_ADDR (1)
#define SOC_PM_PAU_REGDMA_LINK_MODEM (1) #define SOC_PM_PAU_REGDMA_LINK_MODEM (1)
#define SOC_PM_PAU_REGDMA_LINK_WIFIMAC (1)
#define SOC_PM_PAU_REGDMA_UPDATE_CACHE_BEFORE_WAIT_COMPARE (1) #define SOC_PM_PAU_REGDMA_UPDATE_CACHE_BEFORE_WAIT_COMPARE (1)
#define SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED (1) #define SOC_PM_PMU_MIN_SLP_SLOW_CLK_CYCLE_FIXED (1)