xref: /arm-trusted-firmware/plat/st/stm32mp1/services/stm32mp1_svc_setup.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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