diff --git a/plat/st/stm32mp1/include/stm32mp1_context.h b/plat/st/stm32mp1/include/stm32mp1_context.h index 21214d35af5e43c278aa628e556bc12a955ae9b5..ed9a3dc72dfd468cef18a723eaac3f174742287e 100644 --- a/plat/st/stm32mp1/include/stm32mp1_context.h +++ b/plat/st/stm32mp1/include/stm32mp1_context.h @@ -10,10 +10,14 @@ #include <stdbool.h> #include <stdint.h> +#include <drivers/st/stm32_rtc.h> + #define DDR_CRC_GRANULE 32 void stm32_clean_context(void); -int stm32_save_context(uint32_t zq0cr0_zdata); +int stm32_save_context(uint32_t zq0cr0_zdata, + struct stm32_rtc_calendar *rtc_time, + unsigned long long stgen_cnt); int stm32_restore_context(void); unsigned long long stm32_get_stgen_from_context(void); int stm32_restore_backup_reg(void); diff --git a/plat/st/stm32mp1/stm32mp1_context.c b/plat/st/stm32mp1/stm32mp1_context.c index 2ab2fe9ca3f61cc750303c2a463e4f30822a8a61..9f8ead182d37d5905deda6beabe013454088fa4c 100644 --- a/plat/st/stm32mp1/stm32mp1_context.c +++ b/plat/st/stm32mp1/stm32mp1_context.c @@ -158,7 +158,9 @@ void stm32mp1_pm_restore_clock_cfg(size_t offset, uint8_t *data, size_t size) stm32mp_clk_disable(BKPSRAM); } -int stm32_save_context(uint32_t zq0cr0_zdata) +int stm32_save_context(uint32_t zq0cr0_zdata, + struct stm32_rtc_calendar *rtc_time, + unsigned long long stgen_cnt) { void *smc_context; void *cpu_context; @@ -185,8 +187,8 @@ int stm32_save_context(uint32_t zq0cr0_zdata) backup_data->zq0cr0_zdata = zq0cr0_zdata; - stm32_rtc_get_calendar(&backup_data->rtc); - backup_data->stgen = stm32mp_stgen_get_counter(); + memcpy(&backup_data->rtc, rtc_time, sizeof(struct stm32_rtc_calendar)); + backup_data->stgen = stgen_cnt; stm32mp1_clk_lp_save_opp_pll1_settings(backup_data->pll1_settings, sizeof(backup_data->pll1_settings)); diff --git a/plat/st/stm32mp1/stm32mp1_low_power.c b/plat/st/stm32mp1/stm32mp1_low_power.c index 0eda7b74f1954a944fa4c57f92366a5fad9830c8..1dda6725c02994ff3a618ae6b5780f3153fca948 100644 --- a/plat/st/stm32mp1/stm32mp1_low_power.c +++ b/plat/st/stm32mp1/stm32mp1_low_power.c @@ -38,6 +38,7 @@ static unsigned int gicc_pmr; static struct stm32_rtc_calendar sleep_time; static bool enter_cstop_done; static uint32_t int_stack[STM32MP_INT_STACK_SIZE]; +static unsigned long long stgen_cnt; extern void wfi_svc_int_enable(uintptr_t stack_addr); @@ -196,6 +197,9 @@ static void enter_cstop(uint32_t mode, uint32_t nsec_addr) stm32mp1_clock_stopmode_save(); + stm32_rtc_get_calendar(&sleep_time); + stgen_cnt = stm32mp_stgen_get_counter(); + if (mode == STM32_PM_CSTOP_ALLOW_STANDBY_DDR_SR) { /* * Save non-secure world entrypoint after standby in Backup @@ -205,7 +209,8 @@ static void enter_cstop(uint32_t mode, uint32_t nsec_addr) mmio_write_32(bkpr_core1_magic, BOOT_API_A7_CORE0_MAGIC_NUMBER); - if (stm32_save_context(zq0cr0_zdata) != 0) { + if (stm32_save_context(zq0cr0_zdata, &sleep_time, + stgen_cnt) != 0) { panic(); } @@ -227,8 +232,6 @@ static void enter_cstop(uint32_t mode, uint32_t nsec_addr) stm32mp_clk_disable(RTCAPB); - stm32_rtc_get_calendar(&sleep_time); - enter_cstop_done = true; } @@ -275,8 +278,7 @@ void stm32_exit_cstop(void) stdby_time_in_ms = stm32_rtc_diff_calendar(¤t_calendar, &sleep_time); - stm32mp_stgen_restore_counter(stm32_get_stgen_from_context(), - stdby_time_in_ms); + stm32mp_stgen_restore_counter(stgen_cnt, stdby_time_in_ms); stm32mp1_syscfg_enable_io_compensation();