From e06d7108ada2b78d7e7776fc73bfd17d3d37c754 Mon Sep 17 00:00:00 2001 From: hebinglin Date: Wed, 24 Dec 2025 21:14:17 +0800 Subject: [PATCH] change(esp_hw_support): no need cpu retention when sleep hw reject --- .../lowpower/port/esp32c5/sleep_cpu.c | 12 +++++++----- .../lowpower/port/esp32c6/sleep_cpu.c | 14 ++++++++------ .../lowpower/port/esp32c61/sleep_cpu.c | 12 +++++++----- .../lowpower/port/esp32h2/sleep_cpu.c | 14 ++++++++------ .../lowpower/port/esp32h21/sleep_cpu.c | 12 +++++++----- .../lowpower/port/esp32h4/sleep_cpu.c | 17 +++++++++-------- .../lowpower/port/esp32p4/sleep_cpu.c | 12 +++++++----- 7 files changed, 53 insertions(+), 40 deletions(-) diff --git a/components/esp_hw_support/lowpower/port/esp32c5/sleep_cpu.c b/components/esp_hw_support/lowpower/port/esp32c5/sleep_cpu.c index c87a9416b8..6c874503f1 100644 --- a/components/esp_hw_support/lowpower/port/esp32c5/sleep_cpu.c +++ b/components/esp_hw_support/lowpower/port/esp32c5/sleep_cpu.c @@ -321,14 +321,16 @@ esp_err_t IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, uin #endif esp_err_t err = do_cpu_retention(goto_sleep, wakeup_opt, reject_opt, lslp_mem_inf_fpu, dslp); + if (err == ESP_OK) { #if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME - validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); + validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); #endif - rv_core_noncritical_regs_restore(frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clic_frame); + rv_core_noncritical_regs_restore(frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clic_frame); + } #if __riscv_zcmp && SOC_CPU_ZCMP_WORKAROUND restore_mintthresh(mintthresh); #endif diff --git a/components/esp_hw_support/lowpower/port/esp32c6/sleep_cpu.c b/components/esp_hw_support/lowpower/port/esp32c6/sleep_cpu.c index 3d6ffba5f2..803043519e 100644 --- a/components/esp_hw_support/lowpower/port/esp32c6/sleep_cpu.c +++ b/components/esp_hw_support/lowpower/port/esp32c6/sleep_cpu.c @@ -328,15 +328,17 @@ esp_err_t IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, uin esp_err_t err = do_cpu_retention(goto_sleep, wakeup_opt, reject_opt, lslp_mem_inf_fpu, dslp); + if (err == ESP_OK) { #if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME - validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); + validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); #endif - rv_core_noncritical_regs_restore(frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.intpri_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.plic_frame); + rv_core_noncritical_regs_restore(frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.intpri_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.plic_frame); + } restore_mstatus(mstatus); return err; } diff --git a/components/esp_hw_support/lowpower/port/esp32c61/sleep_cpu.c b/components/esp_hw_support/lowpower/port/esp32c61/sleep_cpu.c index b00035e2bf..f03bef5c4e 100644 --- a/components/esp_hw_support/lowpower/port/esp32c61/sleep_cpu.c +++ b/components/esp_hw_support/lowpower/port/esp32c61/sleep_cpu.c @@ -321,14 +321,16 @@ esp_err_t IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, uin #endif esp_err_t err = do_cpu_retention(goto_sleep, wakeup_opt, reject_opt, lslp_mem_inf_fpu, dslp); + if (err == ESP_OK) { #if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME - validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); + validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); #endif - rv_core_noncritical_regs_restore(frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clic_frame); + rv_core_noncritical_regs_restore(frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clic_frame); + } #if __riscv_zcmp && SOC_CPU_ZCMP_WORKAROUND restore_mintthresh(mintthresh); #endif diff --git a/components/esp_hw_support/lowpower/port/esp32h2/sleep_cpu.c b/components/esp_hw_support/lowpower/port/esp32h2/sleep_cpu.c index 3bd4bd5c15..4e6ea69768 100644 --- a/components/esp_hw_support/lowpower/port/esp32h2/sleep_cpu.c +++ b/components/esp_hw_support/lowpower/port/esp32h2/sleep_cpu.c @@ -328,15 +328,17 @@ esp_err_t IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, uin esp_err_t err = do_cpu_retention(goto_sleep, wakeup_opt, reject_opt, lslp_mem_inf_fpu, dslp); + if (err == ESP_OK) { #if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME - validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); + validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); #endif - rv_core_noncritical_regs_restore(frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.intpri_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.plic_frame); + rv_core_noncritical_regs_restore(frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.intpri_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.plic_frame); + } restore_mstatus(mstatus); return err; } diff --git a/components/esp_hw_support/lowpower/port/esp32h21/sleep_cpu.c b/components/esp_hw_support/lowpower/port/esp32h21/sleep_cpu.c index cf278ac485..1eb4cd0a5f 100644 --- a/components/esp_hw_support/lowpower/port/esp32h21/sleep_cpu.c +++ b/components/esp_hw_support/lowpower/port/esp32h21/sleep_cpu.c @@ -326,14 +326,16 @@ esp_err_t IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, uin esp_err_t err = do_cpu_retention(goto_sleep, wakeup_opt, reject_opt, lslp_mem_inf_fpu, dslp); + if (err == ESP_OK) { #if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME - validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); + validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); #endif - rv_core_noncritical_regs_restore(frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.intpri_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.plic_frame); + rv_core_noncritical_regs_restore(frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.intpri_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.plic_frame); + } restore_mstatus(mstatus); return err; } diff --git a/components/esp_hw_support/lowpower/port/esp32h4/sleep_cpu.c b/components/esp_hw_support/lowpower/port/esp32h4/sleep_cpu.c index 6bd141837c..66172c56eb 100644 --- a/components/esp_hw_support/lowpower/port/esp32h4/sleep_cpu.c +++ b/components/esp_hw_support/lowpower/port/esp32h4/sleep_cpu.c @@ -403,10 +403,11 @@ esp_err_t IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, uin esp_err_t err = do_cpu_retention(goto_sleep, wakeup_opt, reject_opt, lslp_mem_inf_fpu, dslp); + if (err == ESP_OK) { #if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME - validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); + validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); #endif - + } #if CONFIG_PM_ESP_SLEEP_POWER_DOWN_CPU && !CONFIG_FREERTOS_UNICORE // Start core1 if (core_id == 0) { @@ -416,12 +417,12 @@ esp_err_t IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, uin atomic_store(&s_smp_retention_state[core_id], SMP_RESTORE_START); #endif - - rv_core_noncritical_regs_restore(); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clic_frame[core_id]); - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame[core_id]); - + if (err == ESP_OK) { + rv_core_noncritical_regs_restore(); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.cache_config_frame); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clic_frame[core_id]); + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clint_frame[core_id]); + } #if CONFIG_PM_ESP_SLEEP_POWER_DOWN_CPU && !CONFIG_FREERTOS_UNICORE atomic_store(&s_smp_retention_state[core_id], SMP_RESTORE_DONE); #endif diff --git a/components/esp_hw_support/lowpower/port/esp32p4/sleep_cpu.c b/components/esp_hw_support/lowpower/port/esp32p4/sleep_cpu.c index 7430bba8fa..bee6f869b7 100644 --- a/components/esp_hw_support/lowpower/port/esp32p4/sleep_cpu.c +++ b/components/esp_hw_support/lowpower/port/esp32p4/sleep_cpu.c @@ -307,10 +307,11 @@ esp_err_t TCM_IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, esp_err_t err = do_cpu_retention(goto_sleep, wakeup_opt, reject_opt, lslp_mem_inf_fpu, dslp); + if (err == ESP_OK) { #if CONFIG_PM_CHECK_SLEEP_RETENTION_FRAME - validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); + validate_retention_frame_crc((uint32_t*)frame, sizeof(RvCoreNonCriticalSleepFrame) - sizeof(long), (uint32_t *)(&frame->frame_crc)); #endif - + } #if CONFIG_PM_ESP_SLEEP_POWER_DOWN_CPU && !CONFIG_FREERTOS_UNICORE // Start core1 if (core_id == 0) { @@ -320,9 +321,10 @@ esp_err_t TCM_IRAM_ATTR esp_sleep_cpu_retention(uint32_t (*goto_sleep)(uint32_t, atomic_store(&s_smp_retention_state[core_id], SMP_RESTORE_START); #endif - - cpu_domain_dev_regs_restore(s_cpu_retention.retent.clic_frame[core_id]); - rv_core_noncritical_regs_restore(); + if (err == ESP_OK) { + cpu_domain_dev_regs_restore(s_cpu_retention.retent.clic_frame[core_id]); + rv_core_noncritical_regs_restore(); + } #if CONFIG_PM_ESP_SLEEP_POWER_DOWN_CPU && !CONFIG_FREERTOS_UNICORE atomic_store(&s_smp_retention_state[core_id], SMP_RESTORE_DONE);