1025514baSAnson Huang /* 2fcd41e86SJacky Bai * Copyright (c) 2015-2024, ARM Limited and Contributors. All rights reserved. 3025514baSAnson Huang * 4025514baSAnson Huang * SPDX-License-Identifier: BSD-3-Clause 5025514baSAnson Huang */ 6025514baSAnson Huang 7025514baSAnson Huang #include <stdint.h> 8fcd41e86SJacky Bai 9025514baSAnson Huang #include <common/debug.h> 10025514baSAnson Huang #include <common/runtime_svc.h> 11fcd41e86SJacky Bai #include <drivers/scmi-msg.h> 12025514baSAnson Huang #include <lib/pmf/pmf.h> 13025514baSAnson Huang #include <tools_share/uuid.h> 14fcd41e86SJacky Bai 15025514baSAnson Huang #include <imx_sip_svc.h> 16025514baSAnson Huang 17*11684655SJacky Bai #include <ele_api.h> 18*11684655SJacky Bai 19025514baSAnson Huang static int32_t imx_sip_setup(void) 20025514baSAnson Huang { 21025514baSAnson Huang return 0; 22025514baSAnson Huang } 23025514baSAnson Huang 24025514baSAnson Huang static uintptr_t imx_sip_handler(unsigned int smc_fid, 25025514baSAnson Huang u_register_t x1, 26025514baSAnson Huang u_register_t x2, 27025514baSAnson Huang u_register_t x3, 28025514baSAnson Huang u_register_t x4, 29025514baSAnson Huang void *cookie, 30025514baSAnson Huang void *handle, 31025514baSAnson Huang u_register_t flags) 32025514baSAnson Huang { 33025514baSAnson Huang switch (smc_fid) { 344a0ac3e3SPeng Fan case IMX_SIP_AARCH32: 354a0ac3e3SPeng Fan SMC_RET1(handle, imx_kernel_entry_handler(smc_fid, x1, x2, x3, x4)); 364a0ac3e3SPeng Fan break; 37fcd41e86SJacky Bai #if defined(PLAT_imx8ulp) 38fcd41e86SJacky Bai case IMX_SIP_SCMI: 39fcd41e86SJacky Bai scmi_smt_fastcall_smc_entry(0); 40fcd41e86SJacky Bai SMC_RET1(handle, 0); 41fcd41e86SJacky Bai break; 42ac5d69b6SJacky Bai case IMX_SIP_HIFI_XRDC: 43ac5d69b6SJacky Bai SMC_RET1(handle, imx_hifi_xrdc(smc_fid)); 44ac5d69b6SJacky Bai break; 45caee2733SJacky Bai case IMX_SIP_DDR_DVFS: 46caee2733SJacky Bai return dram_dvfs_handler(smc_fid, handle, x1, x2, x3); 47fcd41e86SJacky Bai #endif 4872196cbbSLeonard Crestez #if defined(PLAT_imx8mq) 4972196cbbSLeonard Crestez case IMX_SIP_GET_SOC_INFO: 5072196cbbSLeonard Crestez SMC_RET1(handle, imx_soc_info_handler(smc_fid, x1, x2, x3)); 5172196cbbSLeonard Crestez break; 5288a26465SJacky Bai case IMX_SIP_GPC: 5388a26465SJacky Bai SMC_RET1(handle, imx_gpc_handler(smc_fid, x1, x2, x3)); 5488a26465SJacky Bai break; 558962bdd6SJacky Bai case IMX_SIP_DDR_DVFS: 568962bdd6SJacky Bai return dram_dvfs_handler(smc_fid, handle, x1, x2, x3); 5772196cbbSLeonard Crestez #endif 589c336f61SJacky Bai #if defined(PLAT_imx8mm) || defined(PLAT_imx8mn) || defined(PLAT_imx8mp) 599c336f61SJacky Bai case IMX_SIP_DDR_DVFS: 609c336f61SJacky Bai return dram_dvfs_handler(smc_fid, handle, x1, x2, x3); 6144dea544SJacky Bai case IMX_SIP_GPC: 6244dea544SJacky Bai SMC_RET1(handle, imx_gpc_handler(smc_fid, x1, x2, x3)); 6344dea544SJacky Bai break; 649c336f61SJacky Bai #endif 65f56afc1fSLeonard Crestez #if (defined(PLAT_imx8qm) || defined(PLAT_imx8qx)) 66025514baSAnson Huang case IMX_SIP_SRTC: 67025514baSAnson Huang return imx_srtc_handler(smc_fid, handle, x1, x2, x3, x4); 68d3996c59SAnson Huang case IMX_SIP_CPUFREQ: 69d3996c59SAnson Huang SMC_RET1(handle, imx_cpufreq_handler(smc_fid, x1, x2, x3)); 70d3996c59SAnson Huang break; 71ebdbc25bSAnson Huang case IMX_SIP_WAKEUP_SRC: 72ebdbc25bSAnson Huang SMC_RET1(handle, imx_wakeup_src_handler(smc_fid, x1, x2, x3)); 73dbfa45e8SAnson Huang case IMX_SIP_OTP_READ: 74dbfa45e8SAnson Huang case IMX_SIP_OTP_WRITE: 75dbfa45e8SAnson Huang return imx_otp_handler(smc_fid, handle, x1, x2); 76869eebc3SAnson Huang case IMX_SIP_MISC_SET_TEMP: 77869eebc3SAnson Huang SMC_RET1(handle, imx_misc_set_temp_handler(smc_fid, x1, x2, x3, x4)); 78025514baSAnson Huang #endif 796d2c502aSIgor Opaniuk #if defined(PLAT_imx8mm) || defined(PLAT_imx8mq) || defined(PLAT_imx8mn) || \ 806d2c502aSIgor Opaniuk defined(PLAT_imx8mp) 819ce232feSIgor Opaniuk case IMX_SIP_SRC: 829ce232feSIgor Opaniuk SMC_RET1(handle, imx_src_handler(smc_fid, x1, x2, x3, handle)); 839ce232feSIgor Opaniuk break; 849ce232feSIgor Opaniuk #endif 85af799814SStefan Kerkmann #if defined(PLAT_imx8mm) || defined(PLAT_imx8mn) || defined(PLAT_imx8mp) || \ 86af799814SStefan Kerkmann defined(PLAT_imx8mq) 87720e7b66SAndrey Zhizhikin case IMX_SIP_HAB: 88720e7b66SAndrey Zhizhikin SMC_RET1(handle, imx_hab_handler(smc_fid, x1, x2, x3, x4)); 89720e7b66SAndrey Zhizhikin break; 90720e7b66SAndrey Zhizhikin #endif 91760f7941SAnson Huang case IMX_SIP_BUILDINFO: 92760f7941SAnson Huang SMC_RET1(handle, imx_buildinfo_handler(smc_fid, x1, x2, x3, x4)); 93*11684655SJacky Bai #if defined(PLAT_imx95) 94*11684655SJacky Bai case IMX_SIP_GET_SOC_INFO: 95*11684655SJacky Bai return imx9_soc_info_handler(smc_fid, handle); 96*11684655SJacky Bai #endif 97025514baSAnson Huang default: 98025514baSAnson Huang WARN("Unimplemented i.MX SiP Service Call: 0x%x\n", smc_fid); 99025514baSAnson Huang SMC_RET1(handle, SMC_UNK); 100025514baSAnson Huang break; 101025514baSAnson Huang } 102025514baSAnson Huang } 103025514baSAnson Huang 104025514baSAnson Huang /* Define a runtime service descriptor for fast SMC calls */ 105025514baSAnson Huang DECLARE_RT_SVC( 106025514baSAnson Huang imx_sip_svc, 107025514baSAnson Huang OEN_SIP_START, 108025514baSAnson Huang OEN_SIP_END, 109025514baSAnson Huang SMC_TYPE_FAST, 110025514baSAnson Huang imx_sip_setup, 111025514baSAnson Huang imx_sip_handler 112025514baSAnson Huang ); 113