forked from espressif/esp-idf
fix(esp_hw_support): fix mmu retention code cache safety
This commit is contained in:
@@ -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);
|
void esp_deep_sleep_deregister_phy_hook(esp_deep_sleep_cb_t old_dslp_cb);
|
||||||
#endif
|
#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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -770,41 +770,6 @@ esp_err_t esp_sleep_cpu_retention_init(void);
|
|||||||
esp_err_t esp_sleep_cpu_retention_deinit(void);
|
esp_err_t esp_sleep_cpu_retention_deinit(void);
|
||||||
#endif // ESP_SLEEP_POWER_DOWN_CPU
|
#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
|
* @brief Configure to isolate all GPIO pins in sleep state
|
||||||
*/
|
*/
|
||||||
|
@@ -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) {
|
if (s_mmu_retention.retent.mmu_table_frame) {
|
||||||
heap_caps_free((void *)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;
|
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) {
|
if (s_mmu_retention.retent.mmu_table_frame == NULL) {
|
||||||
void *frame = mmu_domain_mmu_table_sleep_frame_alloc_and_init();
|
void *frame = mmu_domain_mmu_table_sleep_frame_alloc_and_init();
|
||||||
@@ -136,16 +136,6 @@ err:
|
|||||||
return ESP_ERR_NO_MEM;
|
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)
|
bool mmu_domain_pd_allowed(void)
|
||||||
{
|
{
|
||||||
return (s_mmu_retention.retent.mmu_table_frame != NULL);
|
return (s_mmu_retention.retent.mmu_table_frame != NULL);
|
||||||
|
@@ -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) {
|
if (s_mmu_retention.retent.mmu_table_frame) {
|
||||||
heap_caps_free((void *)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;
|
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) {
|
if (s_mmu_retention.retent.mmu_table_frame == NULL) {
|
||||||
void *frame = mmu_domain_mmu_table_sleep_frame_alloc_and_init();
|
void *frame = mmu_domain_mmu_table_sleep_frame_alloc_and_init();
|
||||||
@@ -136,16 +136,6 @@ err:
|
|||||||
return ESP_ERR_NO_MEM;
|
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)
|
bool mmu_domain_pd_allowed(void)
|
||||||
{
|
{
|
||||||
return (s_mmu_retention.retent.mmu_table_frame != NULL);
|
return (s_mmu_retention.retent.mmu_table_frame != NULL);
|
||||||
|
@@ -34,6 +34,8 @@ entries:
|
|||||||
if SOC_PM_SUPPORT_TOP_PD = y:
|
if SOC_PM_SUPPORT_TOP_PD = y:
|
||||||
sleep_clock:clock_domain_pd_allowed (noflash)
|
sleep_clock:clock_domain_pd_allowed (noflash)
|
||||||
sleep_system_peripheral:peripheral_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:modem_domain_pd_allowed (noflash)
|
||||||
sleep_modem:periph_inform_out_light_sleep_overhead (noflash)
|
sleep_modem:periph_inform_out_light_sleep_overhead (noflash)
|
||||||
if IDF_TARGET_ESP32P4 = n && IDF_TARGET_ESP32C61 = n : # TODO: IDF-6496, IDF-9304
|
if IDF_TARGET_ESP32P4 = n && IDF_TARGET_ESP32C61 = n : # TODO: IDF-6496, IDF-9304
|
||||||
|
Reference in New Issue
Block a user