xref: /optee_os/core/arch/arm/plat-stm32mp1/nsec-service/stm32mp1_svc_setup.c (revision 5c59f97dc54289624df803a5638db351f60c5856)
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)16 static 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)59 enum 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