diff --git a/components/esp_hw_support/include/esp_private/esp_sleep_internal.h b/components/esp_hw_support/include/esp_private/esp_sleep_internal.h index 7805b71495..747d426cd9 100644 --- a/components/esp_hw_support/include/esp_private/esp_sleep_internal.h +++ b/components/esp_hw_support/include/esp_private/esp_sleep_internal.h @@ -108,6 +108,22 @@ esp_err_t esp_deep_sleep_register_phy_hook(esp_deep_sleep_cb_t new_dslp_cb); void esp_deep_sleep_deregister_phy_hook(esp_deep_sleep_cb_t old_dslp_cb); #endif +#if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP && SOC_PM_MMU_TABLE_RETENTION_WHEN_TOP_PD +/** + * @brief Backup or restore the MMU when the top domain is powered down. + * @param backup_or_restore decide to backup mmu or restore mmu + */ +void esp_sleep_mmu_retention(bool backup_or_restore); + +/** + * @brief Whether to allow the top domain to be powered off due to mmu domain requiring retention. + * + * In light sleep mode, only when the system can provide enough memory + * for mmu retention, the top power domain can be powered off. + */ +bool mmu_domain_pd_allowed(void); +#endif + #ifdef __cplusplus } #endif diff --git a/components/esp_hw_support/include/esp_sleep.h b/components/esp_hw_support/include/esp_sleep.h index 76233f1d62..7b9be75b0f 100644 --- a/components/esp_hw_support/include/esp_sleep.h +++ b/components/esp_hw_support/include/esp_sleep.h @@ -770,41 +770,6 @@ esp_err_t esp_sleep_cpu_retention_init(void); esp_err_t esp_sleep_cpu_retention_deinit(void); #endif // ESP_SLEEP_POWER_DOWN_CPU -#if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP && SOC_PM_MMU_TABLE_RETENTION_WHEN_TOP_PD -/** - * @brief Backup or restore the MMU when the top domain is powered down. - * @param backup_or_restore decide to backup mmu or restore mmu - */ -void esp_sleep_mmu_retention(bool backup_or_restore); - -/** - * @brief Mmu backup initialize when power down TOP domain - * - * @return - * - ESP_OK on success - * - ESP_ERR_NO_MEM not enough retention memory - */ -esp_err_t esp_sleep_mmu_retention_init(void); - -/** - * @brief Mmu backup de-initialize when power down TOP domain - * - * @return - * - ESP_OK on success - * - * Release system retention memory. - */ -esp_err_t esp_sleep_mmu_retention_deinit(void); - -/** - * @brief Whether to allow the top domain to be powered off due to mmu domain requiring retention. - * - * In light sleep mode, only when the system can provide enough memory - * for mmu retention, the top power domain can be powered off. - */ -bool mmu_domain_pd_allowed(void); -#endif - /** * @brief Configure to isolate all GPIO pins in sleep state */ diff --git a/components/esp_hw_support/lowpower/port/esp32c5/sleep_mmu.c b/components/esp_hw_support/lowpower/port/esp32c5/sleep_mmu.c index ac2f45da7b..3a1cad1728 100644 --- a/components/esp_hw_support/lowpower/port/esp32c5/sleep_mmu.c +++ b/components/esp_hw_support/lowpower/port/esp32c5/sleep_mmu.c @@ -112,7 +112,7 @@ IRAM_ATTR void esp_sleep_mmu_retention(bool backup_or_restore) } } -static esp_err_t esp_sleep_mmu_retention_deinit_impl(void) +static esp_err_t esp_sleep_mmu_retention_deinit(void) { if (s_mmu_retention.retent.mmu_table_frame) { heap_caps_free((void *)s_mmu_retention.retent.mmu_table_frame); @@ -121,7 +121,7 @@ static esp_err_t esp_sleep_mmu_retention_deinit_impl(void) return ESP_OK; } -static esp_err_t esp_sleep_mmu_retention_init_impl(void) +static esp_err_t esp_sleep_mmu_retention_init(void) { if (s_mmu_retention.retent.mmu_table_frame == NULL) { void *frame = mmu_domain_mmu_table_sleep_frame_alloc_and_init(); @@ -136,16 +136,6 @@ err: return ESP_ERR_NO_MEM; } -esp_err_t esp_sleep_mmu_retention_init(void) -{ - return esp_sleep_mmu_retention_init_impl(); -} - -esp_err_t esp_sleep_mmu_retention_deinit(void) -{ - return esp_sleep_mmu_retention_deinit_impl(); -} - bool mmu_domain_pd_allowed(void) { return (s_mmu_retention.retent.mmu_table_frame != NULL); diff --git a/components/esp_hw_support/lowpower/port/esp32c61/sleep_mmu.c b/components/esp_hw_support/lowpower/port/esp32c61/sleep_mmu.c index ac2f45da7b..3a1cad1728 100644 --- a/components/esp_hw_support/lowpower/port/esp32c61/sleep_mmu.c +++ b/components/esp_hw_support/lowpower/port/esp32c61/sleep_mmu.c @@ -112,7 +112,7 @@ IRAM_ATTR void esp_sleep_mmu_retention(bool backup_or_restore) } } -static esp_err_t esp_sleep_mmu_retention_deinit_impl(void) +static esp_err_t esp_sleep_mmu_retention_deinit(void) { if (s_mmu_retention.retent.mmu_table_frame) { heap_caps_free((void *)s_mmu_retention.retent.mmu_table_frame); @@ -121,7 +121,7 @@ static esp_err_t esp_sleep_mmu_retention_deinit_impl(void) return ESP_OK; } -static esp_err_t esp_sleep_mmu_retention_init_impl(void) +static esp_err_t esp_sleep_mmu_retention_init(void) { if (s_mmu_retention.retent.mmu_table_frame == NULL) { void *frame = mmu_domain_mmu_table_sleep_frame_alloc_and_init(); @@ -136,16 +136,6 @@ err: return ESP_ERR_NO_MEM; } -esp_err_t esp_sleep_mmu_retention_init(void) -{ - return esp_sleep_mmu_retention_init_impl(); -} - -esp_err_t esp_sleep_mmu_retention_deinit(void) -{ - return esp_sleep_mmu_retention_deinit_impl(); -} - bool mmu_domain_pd_allowed(void) { return (s_mmu_retention.retent.mmu_table_frame != NULL); diff --git a/components/esp_pm/linker.lf b/components/esp_pm/linker.lf index 6fe90c1ff3..2399e0690a 100644 --- a/components/esp_pm/linker.lf +++ b/components/esp_pm/linker.lf @@ -34,6 +34,8 @@ entries: if SOC_PM_SUPPORT_TOP_PD = y: sleep_clock:clock_domain_pd_allowed (noflash) sleep_system_peripheral:peripheral_domain_pd_allowed (noflash) + if SOC_PM_MMU_TABLE_RETENTION_WHEN_TOP_PD = y && PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP = y: + sleep_mmu:mmu_domain_pd_allowed (noflash) sleep_modem:modem_domain_pd_allowed (noflash) sleep_modem:periph_inform_out_light_sleep_overhead (noflash) if IDF_TARGET_ESP32P4 = n && IDF_TARGET_ESP32C61 = n : # TODO: IDF-6496, IDF-9304