1 // SPDX-License-Identifier: BSD-3-Clause 2 /* 3 * Copyright (c) 2017-2020, STMicroelectronics 4 */ 5 6 #include <config.h> 7 #include <drivers/scmi-msg.h> 8 #include <kernel/thread.h> 9 #include <sm/optee_smc.h> 10 #include <sm/sm.h> 11 #include <sm/std_smc.h> 12 13 #include "bsec_svc.h" 14 #include "stm32mp1_smc.h" 15 sip_service(struct sm_ctx * ctx __unused,struct thread_smc_args * args)16static enum sm_handler_ret sip_service(struct sm_ctx *ctx __unused, 17 struct thread_smc_args *args) 18 { 19 switch (OPTEE_SMC_FUNC_NUM(args->a0)) { 20 case STM32_SIP_SVC_FUNC_CALL_COUNT: 21 args->a0 = STM32_SIP_SVC_FUNCTION_COUNT; 22 break; 23 case STM32_SIP_SVC_FUNC_VERSION: 24 args->a0 = STM32_SIP_SVC_VERSION_MAJOR; 25 args->a1 = STM32_SIP_SVC_VERSION_MINOR; 26 break; 27 case STM32_SIP_SVC_FUNC_UID: 28 args->a0 = STM32_SIP_SVC_UID_0; 29 args->a1 = STM32_SIP_SVC_UID_1; 30 args->a2 = STM32_SIP_SVC_UID_2; 31 args->a3 = STM32_SIP_SVC_UID_3; 32 break; 33 case STM32_SIP_SVC_FUNC_SCMI_AGENT0: 34 if (IS_ENABLED(CFG_STM32MP1_SCMI_SIP)) { 35 scmi_smt_fastcall_smc_entry(0); 36 args->a0 = STM32_SIP_SVC_OK; 37 } else { 38 args->a0 = ARM_SMCCC_RET_NOT_SUPPORTED; 39 } 40 break; 41 case STM32_SIP_SVC_FUNC_SCMI_AGENT1: 42 if (IS_ENABLED(CFG_STM32MP1_SCMI_SIP)) { 43 scmi_smt_fastcall_smc_entry(1); 44 args->a0 = STM32_SIP_SVC_OK; 45 } else { 46 args->a0 = ARM_SMCCC_RET_NOT_SUPPORTED; 47 } 48 break; 49 case STM32_SIP_SVC_FUNC_BSEC: 50 bsec_main(args); 51 break; 52 default: 53 return SM_HANDLER_PENDING_SMC; 54 } 55 56 return SM_HANDLER_SMC_HANDLED; 57 } 58 sm_platform_handler(struct sm_ctx * ctx)59enum sm_handler_ret sm_platform_handler(struct sm_ctx *ctx) 60 { 61 struct thread_smc_args *args = (void *)&ctx->nsec.r0; 62 63 if (!OPTEE_SMC_IS_FAST_CALL(args->a0)) 64 return SM_HANDLER_PENDING_SMC; 65 66 switch (OPTEE_SMC_OWNER_NUM(args->a0)) { 67 case OPTEE_SMC_OWNER_SIP: 68 return sip_service(ctx, args); 69 default: 70 return SM_HANDLER_PENDING_SMC; 71 } 72 } 73