summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacky Bai <ping.bai@nxp.com>2020-03-31 16:56:36 +0800
committerJacky Bai <ping.bai@nxp.com>2020-03-31 17:47:34 +0800
commitd0f9e10acd628e4f9ce13944a4046fb219cf1174 (patch)
treea0889fce953e892127c0a8d70f3606f221f21507
parent25ce865155010545fa70256bbc2089b464c79f87 (diff)
plat: imx8mp: Override the the domain suspend callback
The common domain suspend callback function is not suitable for i.MX8MP due to the wait mode workaround. it will be removed together with the wait mode workaround in the future. Signed-off-by: Jacky Bai <ping.bai@nxp.com>
-rw-r--r--plat/imx/imx8m/imx8mp/imx8mp_psci.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/plat/imx/imx8m/imx8mp/imx8mp_psci.c b/plat/imx/imx8m/imx8mp/imx8mp_psci.c
index 96bed88e..dfc8bb93 100644
--- a/plat/imx/imx8m/imx8mp/imx8mp_psci.c
+++ b/plat/imx/imx8m/imx8mp/imx8mp_psci.c
@@ -31,6 +31,35 @@ void imx_pwr_domain_off(const psci_power_state_t *target_state)
udelay(50);
}
+void imx_domain_suspend(const psci_power_state_t *target_state)
+{
+ uint64_t base_addr = BL31_BASE;
+ uint64_t mpidr = read_mpidr_el1();
+ unsigned int core_id = MPIDR_AFFLVL0_VAL(mpidr);
+
+ if (is_local_state_off(CORE_PWR_STATE(target_state))) {
+ plat_gic_cpuif_disable();
+ imx_set_cpu_secure_entry(core_id, base_addr);
+ imx_set_cpu_lpm(core_id, true);
+ } else {
+ dsb();
+ write_scr_el3(read_scr_el3() | SCR_FIQ_BIT);
+ isb();
+ }
+
+ if (!is_local_state_run(CLUSTER_PWR_STATE(target_state)))
+ imx_set_cluster_powerdown(core_id, CLUSTER_PWR_STATE(target_state));
+
+ if (is_local_state_off(SYSTEM_PWR_STATE(target_state))) {
+ if (!imx_m4_lpa_active()) {
+ imx_set_sys_lpm(core_id, true);
+ dram_enter_retention();
+ imx_anamix_override(true);
+ imx_noc_wrapper_pre_suspend(core_id);
+ }
+ }
+}
+
void imx_domain_suspend_finish(const psci_power_state_t *target_state)
{
uint64_t mpidr = read_mpidr_el1();
@@ -43,7 +72,6 @@ void imx_domain_suspend_finish(const psci_power_state_t *target_state)
dram_exit_retention();
imx_set_sys_lpm(core_id, false);
}
- imx_set_sys_wakeup(core_id, false);
}
if (!is_local_state_run(CLUSTER_PWR_STATE(target_state))) {