summaryrefslogtreecommitdiff
path: root/plat/imx/common
diff options
context:
space:
mode:
authorPeng Fan <peng.fan@nxp.com>2020-04-01 17:22:36 +0800
committerPeng Fan <peng.fan@nxp.com>2020-04-07 15:52:10 +0800
commitbfbf223ed855d31085d0a6469aa94357ae0c3674 (patch)
tree9647c324db3a967fddf7f26637ad417561329f8d /plat/imx/common
parent3511e46772a04136bbec67267360304c701edc6a (diff)
MLK-23727 imx8mp/n: support stop M7
Support stop M7 with SIP call. Per IC team, to rekick M7 need follow steps. If M7 already in WFI, perform below steps. a) Set [0x303A_002C].0=0 [ request SLEEPHOLDREQn ] b) Wait [0x303A_00EC].1 = 0 [ wait SLEEPHOLDACKn ] c) Set GPR.CPUWAIT=1 d) Set [0x303A_002C].0=1 [ de-assert SLEEPHOLDREQn ] e) Set SRC_M7_RCR[3:0] = 0xE0 [ reset M7 core/plat ] f) Wait SRC_M7_RCR[3:0] = 0x8 g) Init TCM or DDR h) Set GPR.INITVTOR i) Set GPR.CPUWAIT=0, M7 starting running Add a timeout check, if timeout, still perform force reset, in this way no need to rely on M7 team's image wfi support ready. Return a1,a2 to caller to check timeout or reset fail. Reviewed-by: Jacky Bai <ping.bai@nxp.com> Signed-off-by: Peng Fan <peng.fan@nxp.com>
Diffstat (limited to 'plat/imx/common')
-rw-r--r--plat/imx/common/imx_sip_svc.c4
-rw-r--r--plat/imx/common/include/imx_sip_svc.h5
2 files changed, 5 insertions, 4 deletions
diff --git a/plat/imx/common/imx_sip_svc.c b/plat/imx/common/imx_sip_svc.c
index 74b59e83..2fad4740 100644
--- a/plat/imx/common/imx_sip_svc.c
+++ b/plat/imx/common/imx_sip_svc.c
@@ -34,7 +34,7 @@ static uintptr_t imx_sip_handler(unsigned int smc_fid,
SMC_RET1(handle, imx_gpc_handler(smc_fid, x1, x2, x3));
break;
case IMX_SIP_SRC:
- SMC_RET1(handle, imx_src_handler(smc_fid, x1, x2, x3));
+ SMC_RET1(handle, imx_src_handler(smc_fid, x1, x2, x3, handle));
break;
case IMX_SIP_DDR_DVFS:
return dram_dvfs_handler(smc_fid, handle, x1, x2, x3);
@@ -52,7 +52,7 @@ static uintptr_t imx_sip_handler(unsigned int smc_fid,
SMC_RET1(handle, imx_gpc_handler(smc_fid, x1, x2, x3));
break;
case IMX_SIP_SRC:
- SMC_RET1(handle, imx_src_handler(smc_fid, x1, x2, x3));
+ SMC_RET1(handle, imx_src_handler(smc_fid, x1, x2, x3, handle));
break;
case IMX_SIP_HAB:
SMC_RET1(handle, imx_hab_handler(smc_fid, x1, x2, x3, x4));
diff --git a/plat/imx/common/include/imx_sip_svc.h b/plat/imx/common/include/imx_sip_svc.h
index 64a01c14..92bde837 100644
--- a/plat/imx/common/include/imx_sip_svc.h
+++ b/plat/imx/common/include/imx_sip_svc.h
@@ -29,6 +29,7 @@
#define IMX_SIP_SRC 0xc2000005
#define IMX_SIP_SRC_M4_START 0x00
#define IMX_SIP_SRC_M4_STARTED 0x01
+#define IMX_SIP_SRC_M4_STOP 0x02
#define IMX_SIP_GET_SOC_INFO 0xC2000006
@@ -66,7 +67,7 @@ int imx_soc_info_handler(uint32_t smc_fid, u_register_t x1,
int imx_gpc_handler(uint32_t smc_fid, u_register_t x1,
u_register_t x2, u_register_t x3);
int imx_src_handler(uint32_t smc_fid, u_register_t x1,
- u_register_t x2, u_register_t x3);
+ u_register_t x2, u_register_t x3, void *handle);
int dram_dvfs_handler(uint32_t smc_fid, void *handle,
u_register_t x1, u_register_t x2, u_register_t x3);
@@ -82,7 +83,7 @@ int dram_dvfs_handler(uint32_t smc_fid, void *handle,
int imx_gpc_handler(uint32_t smc_fid, u_register_t x1,
u_register_t x2, u_register_t x3);
int imx_src_handler(uint32_t smc_fid, u_register_t x1,
- u_register_t x2, u_register_t x3);
+ u_register_t x2, u_register_t x3, void *handle);
int imx_hab_handler(uint32_t smc_fid, u_register_t x1,
u_register_t x2, u_register_t x3, u_register_t x4);
#endif