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