diff options
author | Jacky Bai <ping.bai@nxp.com> | 2020-03-31 16:56:36 +0800 |
---|---|---|
committer | Jacky Bai <ping.bai@nxp.com> | 2020-03-31 17:47:34 +0800 |
commit | d0f9e10acd628e4f9ce13944a4046fb219cf1174 (patch) | |
tree | a0889fce953e892127c0a8d70f3606f221f21507 /plat/imx/imx8m/imx8mp | |
parent | 25ce865155010545fa70256bbc2089b464c79f87 (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>
Diffstat (limited to 'plat/imx/imx8m/imx8mp')
-rw-r--r-- | plat/imx/imx8m/imx8mp/imx8mp_psci.c | 30 |
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))) { |