diff options
author | Anson Huang <Anson.Huang@nxp.com> | 2019-11-22 14:17:46 +0800 |
---|---|---|
committer | Anson Huang <Anson.Huang@nxp.com> | 2019-12-13 10:41:30 +0800 |
commit | 79a482c0c5c0dbd59a393fc252ffc85a33c980bb (patch) | |
tree | 4636020d4935821a72abbb6c48c0fb6a3d4ab400 | |
parent | d3150a3f33c225b852be8bd7e7b143616234d69b (diff) |
imx8qm: turn off A53 cluster for cpu hotplug
The issue of A53 cluster runtime power ON/OFF has been
identified as fifo reset issue, and there is software
workaround to avoid such issue and A53 cluster now can
be turned OFF.
Signed-off-by: Nitin Garg <nitin.garg@nxp.com>
Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
-rw-r--r-- | bl31/aarch64/bl31_entrypoint.S | 39 | ||||
-rw-r--r-- | plat/imx/imx8qm/imx8qm_psci.c | 8 |
2 files changed, 43 insertions, 4 deletions
diff --git a/bl31/aarch64/bl31_entrypoint.S b/bl31/aarch64/bl31_entrypoint.S index 1ad26e4f..5ee7a840 100644 --- a/bl31/aarch64/bl31_entrypoint.S +++ b/bl31/aarch64/bl31_entrypoint.S @@ -23,6 +23,41 @@ */ func bl31_entrypoint +#ifdef PLAT_imx8qm + ldr x21, stm + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] /* 16 */ + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] + str w20, [x21] /* 32 */ +#endif /* --------------------------------------------------------------- * Stash the previous bootloader arguments x0 - x3 for later use. * --------------------------------------------------------------- @@ -132,6 +167,10 @@ func bl31_entrypoint b el3_exit endfunc bl31_entrypoint +.ltorg +stm: + .quad 0x5D1B0020 + /* -------------------------------------------------------------------- * This CPU has been physically powered up. It is either resuming from * suspend or has simply been turned on. In both cases, call the BL31 diff --git a/plat/imx/imx8qm/imx8qm_psci.c b/plat/imx/imx8qm/imx8qm_psci.c index bdba37c6..e5e5576f 100644 --- a/plat/imx/imx8qm/imx8qm_psci.c +++ b/plat/imx/imx8qm/imx8qm_psci.c @@ -80,8 +80,8 @@ int imx_pwr_domain_on(u_register_t mpidr) sc_pm_set_resource_power_mode(ipc_handle, cluster_id == 0 ? SC_R_A53 : SC_R_A72, SC_PM_PW_MODE_ON); - if (cluster_id == 1) - sc_pm_req_low_power_mode(ipc_handle, SC_R_A72, SC_PM_PW_MODE_ON); + sc_pm_req_low_power_mode(ipc_handle, cluster_id == 0 ? + SC_R_A53 : SC_R_A72, SC_PM_PW_MODE_ON); if (sc_pm_set_resource_power_mode(ipc_handle, ap_core_index[cpu_id + PLATFORM_CLUSTER0_CORE_COUNT * cluster_id], @@ -124,8 +124,8 @@ void imx_pwr_domain_off(const psci_power_state_t *target_state) if (is_local_state_off(CLUSTER_PWR_STATE(target_state))) { cci_disable_snoop_dvm_reqs(cluster_id); - if (cluster_id == 1) - sc_pm_req_low_power_mode(ipc_handle, SC_R_A72, SC_PM_PW_MODE_OFF); + sc_pm_req_low_power_mode(ipc_handle, cluster_id == 0 ? + SC_R_A53 : SC_R_A72, SC_PM_PW_MODE_OFF); } printf("turn off cluster:%d core:%d\n", cluster_id, cpu_id); } |