1*a42bad37SYann Gautier /* 2*a42bad37SYann Gautier * Copyright (c) 2014-2019, STMicroelectronics - All Rights Reserved 3*a42bad37SYann Gautier * 4*a42bad37SYann Gautier * SPDX-License-Identifier: BSD-3-Clause 5*a42bad37SYann Gautier */ 6*a42bad37SYann Gautier 7*a42bad37SYann Gautier #include <stdbool.h> 8*a42bad37SYann Gautier #include <stdint.h> 9*a42bad37SYann Gautier 10*a42bad37SYann Gautier #include <common/debug.h> 11*a42bad37SYann Gautier #include <common/runtime_svc.h> 12*a42bad37SYann Gautier #include <lib/psci/psci.h> 13*a42bad37SYann Gautier #include <tools_share/uuid.h> 14*a42bad37SYann Gautier 15*a42bad37SYann Gautier #include <stm32mp1_smc.h> 16*a42bad37SYann Gautier 17*a42bad37SYann Gautier /* STM32 SiP Service UUID */ 18*a42bad37SYann Gautier DEFINE_SVC_UUID2(stm32_sip_svc_uid, 19*a42bad37SYann Gautier 0xa778aa50, 0xf49b, 0x144a, 0x8a, 0x5e, 20*a42bad37SYann Gautier 0x26, 0x4d, 0x59, 0x94, 0xc2, 0x14); 21*a42bad37SYann Gautier 22*a42bad37SYann Gautier /* Setup STM32MP1 Standard Services */ 23*a42bad37SYann Gautier static int32_t stm32mp1_svc_setup(void) 24*a42bad37SYann Gautier { 25*a42bad37SYann Gautier /* 26*a42bad37SYann Gautier * PSCI is the only specification implemented as a Standard Service. 27*a42bad37SYann Gautier * Invoke PSCI setup from here. 28*a42bad37SYann Gautier */ 29*a42bad37SYann Gautier return 0; 30*a42bad37SYann Gautier } 31*a42bad37SYann Gautier 32*a42bad37SYann Gautier /* 33*a42bad37SYann Gautier * Top-level Standard Service SMC handler. This handler will in turn dispatch 34*a42bad37SYann Gautier * calls to PSCI SMC handler. 35*a42bad37SYann Gautier */ 36*a42bad37SYann Gautier static uintptr_t stm32mp1_svc_smc_handler(uint32_t smc_fid, u_register_t x1, 37*a42bad37SYann Gautier u_register_t x2, u_register_t x3, 38*a42bad37SYann Gautier u_register_t x4, void *cookie, 39*a42bad37SYann Gautier void *handle, u_register_t flags) 40*a42bad37SYann Gautier { 41*a42bad37SYann Gautier uint32_t ret1 = 0U, ret2 = 0U; 42*a42bad37SYann Gautier bool ret_uid = false, ret2_enabled = false; 43*a42bad37SYann Gautier 44*a42bad37SYann Gautier switch (smc_fid) { 45*a42bad37SYann Gautier case STM32_SIP_SVC_CALL_COUNT: 46*a42bad37SYann Gautier ret1 = STM32_COMMON_SIP_NUM_CALLS; 47*a42bad37SYann Gautier break; 48*a42bad37SYann Gautier 49*a42bad37SYann Gautier case STM32_SIP_SVC_UID: 50*a42bad37SYann Gautier /* Return UUID to the caller */ 51*a42bad37SYann Gautier ret_uid = true; 52*a42bad37SYann Gautier break; 53*a42bad37SYann Gautier 54*a42bad37SYann Gautier case STM32_SIP_SVC_VERSION: 55*a42bad37SYann Gautier /* Return the version of current implementation */ 56*a42bad37SYann Gautier ret1 = STM32_SIP_SVC_VERSION_MAJOR; 57*a42bad37SYann Gautier ret2 = STM32_SIP_SVC_VERSION_MINOR; 58*a42bad37SYann Gautier ret2_enabled = true; 59*a42bad37SYann Gautier break; 60*a42bad37SYann Gautier 61*a42bad37SYann Gautier default: 62*a42bad37SYann Gautier WARN("Unimplemented STM32MP1 Service Call: 0x%x\n", smc_fid); 63*a42bad37SYann Gautier ret1 = SMC_UNK; 64*a42bad37SYann Gautier break; 65*a42bad37SYann Gautier } 66*a42bad37SYann Gautier 67*a42bad37SYann Gautier if (ret_uid) { 68*a42bad37SYann Gautier SMC_UUID_RET(handle, stm32_sip_svc_uid); 69*a42bad37SYann Gautier } 70*a42bad37SYann Gautier 71*a42bad37SYann Gautier if (ret2_enabled) { 72*a42bad37SYann Gautier SMC_RET2(handle, ret1, ret2); 73*a42bad37SYann Gautier } 74*a42bad37SYann Gautier 75*a42bad37SYann Gautier SMC_RET1(handle, ret1); 76*a42bad37SYann Gautier } 77*a42bad37SYann Gautier 78*a42bad37SYann Gautier /* Register Standard Service Calls as runtime service */ 79*a42bad37SYann Gautier DECLARE_RT_SVC(stm32mp1_sip_svc, 80*a42bad37SYann Gautier OEN_SIP_START, 81*a42bad37SYann Gautier OEN_SIP_END, 82*a42bad37SYann Gautier SMC_TYPE_FAST, 83*a42bad37SYann Gautier stm32mp1_svc_setup, 84*a42bad37SYann Gautier stm32mp1_svc_smc_handler 85*a42bad37SYann Gautier ); 86