diff --git a/plat/imx/common/imx_sip_handler.c b/plat/imx/common/imx_sip_handler.c index 22a7f2b83bc1e2253a904a7672897183955b7a7f..2e50cf3044a31c771b857eb649d046da0ea06af5 100644 --- a/plat/imx/common/imx_sip_handler.c +++ b/plat/imx/common/imx_sip_handler.c @@ -76,3 +76,29 @@ int imx_cpufreq_handler(uint32_t smc_fid, return 0; } + +static bool wakeup_src_irqsteer; + +bool imx_is_wakeup_src_irqsteer(void) +{ + return wakeup_src_irqsteer; +} + +int imx_wakeup_src_handler(uint32_t smc_fid, + u_register_t x1, + u_register_t x2, + u_register_t x3) +{ + switch (x1) { + case IMX_SIP_WAKEUP_SRC_IRQSTEER: + wakeup_src_irqsteer = true; + break; + case IMX_SIP_WAKEUP_SRC_SCU: + wakeup_src_irqsteer = false; + break; + default: + return SMC_UNK; + } + + return SMC_OK; +} diff --git a/plat/imx/common/imx_sip_svc.c b/plat/imx/common/imx_sip_svc.c index 89b9df8c55bcceed562d49928dffacab949edfaf..a4b8ff297af9929cf628b4ca507477b81b2b37fa 100644 --- a/plat/imx/common/imx_sip_svc.c +++ b/plat/imx/common/imx_sip_svc.c @@ -32,6 +32,8 @@ static uintptr_t imx_sip_handler(unsigned int smc_fid, case IMX_SIP_CPUFREQ: SMC_RET1(handle, imx_cpufreq_handler(smc_fid, x1, x2, x3)); break; + case IMX_SIP_WAKEUP_SRC: + SMC_RET1(handle, imx_wakeup_src_handler(smc_fid, x1, x2, x3)); #endif default: WARN("Unimplemented i.MX SiP Service Call: 0x%x\n", smc_fid); diff --git a/plat/imx/common/include/imx_sip_svc.h b/plat/imx/common/include/imx_sip_svc.h index 4ba7b87acf0ff9d2b1281374e917c62d158652a2..4de219478cbfcbaaaca5b6f7549edd75cfa748b1 100644 --- a/plat/imx/common/include/imx_sip_svc.h +++ b/plat/imx/common/include/imx_sip_svc.h @@ -14,11 +14,17 @@ #define IMX_SIP_SRTC 0xC2000002 #define IMX_SIP_SRTC_SET_TIME 0x00 +#define IMX_SIP_WAKEUP_SRC 0xC2000009 +#define IMX_SIP_WAKEUP_SRC_SCU 0x1 +#define IMX_SIP_WAKEUP_SRC_IRQSTEER 0x2 + #if (defined(PLAT_IMX8QM) || defined(PLAT_IMX8QX)) int imx_cpufreq_handler(uint32_t smc_fid, u_register_t x1, u_register_t x2, u_register_t x3); int imx_srtc_handler(uint32_t smc_fid, void *handle, u_register_t x1, u_register_t x2, u_register_t x3, u_register_t x4); +int imx_wakeup_src_handler(uint32_t smc_fid, u_register_t x1, + u_register_t x2, u_register_t x3); #endif #endif /* __IMX_SIP_SVC_H__ */ diff --git a/plat/imx/common/include/plat_imx8.h b/plat/imx/common/include/plat_imx8.h index 8d83173fdb78f1d34d4b23448eac79a120307948..952ad530243ce72ce785cc11eb6ef4e3c16f9d7f 100644 --- a/plat/imx/common/include/plat_imx8.h +++ b/plat/imx/common/include/plat_imx8.h @@ -23,5 +23,6 @@ void __dead2 imx_system_reset(void); int imx_validate_power_state(unsigned int power_state, psci_power_state_t *req_state); void imx_get_sys_suspend_power_state(psci_power_state_t *req_state); +bool imx_is_wakeup_src_irqsteer(void); #endif /* PLAT_IMX8_H */