1025514baSAnson Huang /* 2025514baSAnson Huang * Copyright (c) 2015-2019, 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> 8025514baSAnson Huang #include <common/debug.h> 9025514baSAnson Huang #include <common/runtime_svc.h> 10025514baSAnson Huang #include <lib/pmf/pmf.h> 11025514baSAnson Huang #include <tools_share/uuid.h> 12025514baSAnson Huang #include <imx_sip_svc.h> 13025514baSAnson Huang 14025514baSAnson Huang static int32_t imx_sip_setup(void) 15025514baSAnson Huang { 16025514baSAnson Huang return 0; 17025514baSAnson Huang } 18025514baSAnson Huang 19025514baSAnson Huang static uintptr_t imx_sip_handler(unsigned int smc_fid, 20025514baSAnson Huang u_register_t x1, 21025514baSAnson Huang u_register_t x2, 22025514baSAnson Huang u_register_t x3, 23025514baSAnson Huang u_register_t x4, 24025514baSAnson Huang void *cookie, 25025514baSAnson Huang void *handle, 26025514baSAnson Huang u_register_t flags) 27025514baSAnson Huang { 28025514baSAnson Huang switch (smc_fid) { 294a0ac3e3SPeng Fan case IMX_SIP_AARCH32: 304a0ac3e3SPeng Fan SMC_RET1(handle, imx_kernel_entry_handler(smc_fid, x1, x2, x3, x4)); 314a0ac3e3SPeng Fan break; 3272196cbbSLeonard Crestez #if defined(PLAT_imx8mq) 3372196cbbSLeonard Crestez case IMX_SIP_GET_SOC_INFO: 3472196cbbSLeonard Crestez SMC_RET1(handle, imx_soc_info_handler(smc_fid, x1, x2, x3)); 3572196cbbSLeonard Crestez break; 3672196cbbSLeonard Crestez #endif 37f56afc1fSLeonard Crestez #if (defined(PLAT_imx8qm) || defined(PLAT_imx8qx)) 38025514baSAnson Huang case IMX_SIP_SRTC: 39025514baSAnson Huang return imx_srtc_handler(smc_fid, handle, x1, x2, x3, x4); 40d3996c59SAnson Huang case IMX_SIP_CPUFREQ: 41d3996c59SAnson Huang SMC_RET1(handle, imx_cpufreq_handler(smc_fid, x1, x2, x3)); 42d3996c59SAnson Huang break; 43ebdbc25bSAnson Huang case IMX_SIP_WAKEUP_SRC: 44ebdbc25bSAnson Huang SMC_RET1(handle, imx_wakeup_src_handler(smc_fid, x1, x2, x3)); 45dbfa45e8SAnson Huang case IMX_SIP_OTP_READ: 46dbfa45e8SAnson Huang case IMX_SIP_OTP_WRITE: 47dbfa45e8SAnson Huang return imx_otp_handler(smc_fid, handle, x1, x2); 48869eebc3SAnson Huang case IMX_SIP_MISC_SET_TEMP: 49869eebc3SAnson Huang SMC_RET1(handle, imx_misc_set_temp_handler(smc_fid, x1, x2, x3, x4)); 50025514baSAnson Huang #endif 51*9ce232feSIgor Opaniuk #if defined(PLAT_imx8mm) || defined(PLAT_imx8mq) 52*9ce232feSIgor Opaniuk case IMX_SIP_SRC: 53*9ce232feSIgor Opaniuk SMC_RET1(handle, imx_src_handler(smc_fid, x1, x2, x3, handle)); 54*9ce232feSIgor Opaniuk break; 55*9ce232feSIgor Opaniuk #endif 56760f7941SAnson Huang case IMX_SIP_BUILDINFO: 57760f7941SAnson Huang SMC_RET1(handle, imx_buildinfo_handler(smc_fid, x1, x2, x3, x4)); 58025514baSAnson Huang default: 59025514baSAnson Huang WARN("Unimplemented i.MX SiP Service Call: 0x%x\n", smc_fid); 60025514baSAnson Huang SMC_RET1(handle, SMC_UNK); 61025514baSAnson Huang break; 62025514baSAnson Huang } 63025514baSAnson Huang } 64025514baSAnson Huang 65025514baSAnson Huang /* Define a runtime service descriptor for fast SMC calls */ 66025514baSAnson Huang DECLARE_RT_SVC( 67025514baSAnson Huang imx_sip_svc, 68025514baSAnson Huang OEN_SIP_START, 69025514baSAnson Huang OEN_SIP_END, 70025514baSAnson Huang SMC_TYPE_FAST, 71025514baSAnson Huang imx_sip_setup, 72025514baSAnson Huang imx_sip_handler 73025514baSAnson Huang ); 74