summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnson Huang <Anson.Huang@nxp.com>2019-11-22 14:17:46 +0800
committerAnson Huang <Anson.Huang@nxp.com>2019-12-13 10:41:30 +0800
commit79a482c0c5c0dbd59a393fc252ffc85a33c980bb (patch)
tree4636020d4935821a72abbb6c48c0fb6a3d4ab400
parentd3150a3f33c225b852be8bd7e7b143616234d69b (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.S39
-rw-r--r--plat/imx/imx8qm/imx8qm_psci.c8
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);
}