xref: /arm-trusted-firmware/include/services/rmmd_svc.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef RMMD_SVC_H
8*91f16700Schasinglulu #define RMMD_SVC_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <lib/smccc.h>
11*91f16700Schasinglulu #include <lib/utils_def.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu /* STD calls FNUM Min/Max ranges */
14*91f16700Schasinglulu #define RMI_FNUM_MIN_VALUE	U(0x150)
15*91f16700Schasinglulu #define RMI_FNUM_MAX_VALUE	U(0x18F)
16*91f16700Schasinglulu 
17*91f16700Schasinglulu /* Construct RMI fastcall std FID from offset */
18*91f16700Schasinglulu #define SMC64_RMI_FID(_offset)					  \
19*91f16700Schasinglulu 	((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT)			| \
20*91f16700Schasinglulu 	 (SMC_64 << FUNCID_CC_SHIFT)				| \
21*91f16700Schasinglulu 	 (OEN_STD_START << FUNCID_OEN_SHIFT)			| \
22*91f16700Schasinglulu 	 (((RMI_FNUM_MIN_VALUE + (_offset)) & FUNCID_NUM_MASK)	  \
23*91f16700Schasinglulu 	  << FUNCID_NUM_SHIFT))
24*91f16700Schasinglulu 
25*91f16700Schasinglulu #define is_rmi_fid(fid) __extension__ ({		\
26*91f16700Schasinglulu 	__typeof__(fid) _fid = (fid);			\
27*91f16700Schasinglulu 	((GET_SMC_NUM(_fid) >= RMI_FNUM_MIN_VALUE) &&	\
28*91f16700Schasinglulu 	 (GET_SMC_NUM(_fid) <= RMI_FNUM_MAX_VALUE) &&	\
29*91f16700Schasinglulu 	 (GET_SMC_TYPE(_fid) == SMC_TYPE_FAST)	   &&	\
30*91f16700Schasinglulu 	 (GET_SMC_CC(_fid) == SMC_64)              &&	\
31*91f16700Schasinglulu 	 (GET_SMC_OEN(_fid) == OEN_STD_START)      &&	\
32*91f16700Schasinglulu 	 ((_fid & 0x00FE0000) == 0U)); })
33*91f16700Schasinglulu 
34*91f16700Schasinglulu /*
35*91f16700Schasinglulu  * RMI_FNUM_REQ_COMPLETE is the only function in the RMI range that originates
36*91f16700Schasinglulu  * from the Realm world and is handled by the RMMD. The RMI functions are
37*91f16700Schasinglulu  * always invoked by the Normal world, forwarded by RMMD and handled by the
38*91f16700Schasinglulu  * RMM.
39*91f16700Schasinglulu  */
40*91f16700Schasinglulu 					/* 0x18F */
41*91f16700Schasinglulu #define RMM_RMI_REQ_COMPLETE		SMC64_RMI_FID(U(0x3F))
42*91f16700Schasinglulu 
43*91f16700Schasinglulu /* RMM_BOOT_COMPLETE arg0 error codes */
44*91f16700Schasinglulu #define E_RMM_BOOT_SUCCESS				(0)
45*91f16700Schasinglulu #define E_RMM_BOOT_UNKNOWN				(-1)
46*91f16700Schasinglulu #define E_RMM_BOOT_VERSION_MISMATCH			(-2)
47*91f16700Schasinglulu #define E_RMM_BOOT_CPUS_OUT_OF_RANGE			(-3)
48*91f16700Schasinglulu #define E_RMM_BOOT_CPU_ID_OUT_OF_RANGE			(-4)
49*91f16700Schasinglulu #define E_RMM_BOOT_INVALID_SHARED_BUFFER		(-5)
50*91f16700Schasinglulu #define E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED	(-6)
51*91f16700Schasinglulu #define E_RMM_BOOT_MANIFEST_DATA_ERROR			(-7)
52*91f16700Schasinglulu 
53*91f16700Schasinglulu /* The SMC in the range 0x8400 0191 - 0x8400 01AF are reserved for RSIs.*/
54*91f16700Schasinglulu 
55*91f16700Schasinglulu /*
56*91f16700Schasinglulu  * EL3 - RMM SMCs used for requesting RMMD services. These SMCs originate in Realm
57*91f16700Schasinglulu  * world and return to Realm world.
58*91f16700Schasinglulu  *
59*91f16700Schasinglulu  * These are allocated from 0x8400 01B0 - 0x8400 01CF in the RMM Service range.
60*91f16700Schasinglulu  */
61*91f16700Schasinglulu #define RMMD_EL3_FNUM_MIN_VALUE		U(0x1B0)
62*91f16700Schasinglulu #define RMMD_EL3_FNUM_MAX_VALUE		U(0x1CF)
63*91f16700Schasinglulu 
64*91f16700Schasinglulu /* Construct RMM_EL3 fastcall std FID from offset */
65*91f16700Schasinglulu #define SMC64_RMMD_EL3_FID(_offset)					  \
66*91f16700Schasinglulu 	((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT)				| \
67*91f16700Schasinglulu 	 (SMC_64 << FUNCID_CC_SHIFT)					| \
68*91f16700Schasinglulu 	 (OEN_STD_START << FUNCID_OEN_SHIFT)				| \
69*91f16700Schasinglulu 	 (((RMMD_EL3_FNUM_MIN_VALUE + (_offset)) & FUNCID_NUM_MASK)	  \
70*91f16700Schasinglulu 	  << FUNCID_NUM_SHIFT))
71*91f16700Schasinglulu 
72*91f16700Schasinglulu /* The macros below are used to identify GTSI calls from the SMC function ID */
73*91f16700Schasinglulu #define is_rmmd_el3_fid(fid) __extension__ ({		\
74*91f16700Schasinglulu 	__typeof__(fid) _fid = (fid);			\
75*91f16700Schasinglulu 	((GET_SMC_NUM(_fid) >= RMMD_EL3_FNUM_MIN_VALUE) &&\
76*91f16700Schasinglulu 	(GET_SMC_NUM(_fid) <= RMMD_EL3_FNUM_MAX_VALUE)  &&\
77*91f16700Schasinglulu 	(GET_SMC_TYPE(_fid) == SMC_TYPE_FAST)	    &&	\
78*91f16700Schasinglulu 	(GET_SMC_CC(_fid) == SMC_64)                &&	\
79*91f16700Schasinglulu 	(GET_SMC_OEN(_fid) == OEN_STD_START)        &&	\
80*91f16700Schasinglulu 	((_fid & 0x00FE0000) == 0U)); })
81*91f16700Schasinglulu 
82*91f16700Schasinglulu 					/* 0x1B0 - 0x1B1 */
83*91f16700Schasinglulu #define RMM_GTSI_DELEGATE		SMC64_RMMD_EL3_FID(U(0))
84*91f16700Schasinglulu #define RMM_GTSI_UNDELEGATE		SMC64_RMMD_EL3_FID(U(1))
85*91f16700Schasinglulu 
86*91f16700Schasinglulu /* Return error codes from RMM-EL3 SMCs */
87*91f16700Schasinglulu #define E_RMM_OK			 0
88*91f16700Schasinglulu #define E_RMM_UNK			-1
89*91f16700Schasinglulu #define E_RMM_BAD_ADDR			-2
90*91f16700Schasinglulu #define E_RMM_BAD_PAS			-3
91*91f16700Schasinglulu #define E_RMM_NOMEM			-4
92*91f16700Schasinglulu #define E_RMM_INVAL			-5
93*91f16700Schasinglulu 
94*91f16700Schasinglulu /* Return error codes from RMI SMCs */
95*91f16700Schasinglulu #define RMI_SUCCESS			0
96*91f16700Schasinglulu #define RMI_ERROR_INPUT			1
97*91f16700Schasinglulu 
98*91f16700Schasinglulu /* Acceptable SHA sizes for Challenge object */
99*91f16700Schasinglulu #define SHA256_DIGEST_SIZE	32U
100*91f16700Schasinglulu #define SHA384_DIGEST_SIZE	48U
101*91f16700Schasinglulu #define SHA512_DIGEST_SIZE	64U
102*91f16700Schasinglulu 
103*91f16700Schasinglulu /*
104*91f16700Schasinglulu  * Retrieve Realm attestation key from EL3. Only P-384 ECC curve key is
105*91f16700Schasinglulu  * supported. The arguments to this SMC are :
106*91f16700Schasinglulu  *    arg0 - Function ID.
107*91f16700Schasinglulu  *    arg1 - Realm attestation key buffer Physical address.
108*91f16700Schasinglulu  *    arg2 - Realm attestation key buffer size (in bytes).
109*91f16700Schasinglulu  *    arg3 - The type of the elliptic curve to which the requested
110*91f16700Schasinglulu  *           attestation key belongs to. The value should be one of the
111*91f16700Schasinglulu  *           defined curve types.
112*91f16700Schasinglulu  * The return arguments are :
113*91f16700Schasinglulu  *    ret0 - Status / error.
114*91f16700Schasinglulu  *    ret1 - Size of the realm attestation key if successful.
115*91f16700Schasinglulu  */
116*91f16700Schasinglulu 					/* 0x1B2 */
117*91f16700Schasinglulu #define RMM_ATTEST_GET_REALM_KEY	SMC64_RMMD_EL3_FID(U(2))
118*91f16700Schasinglulu 
119*91f16700Schasinglulu /*
120*91f16700Schasinglulu  * Retrieve Platform token from EL3.
121*91f16700Schasinglulu  * The arguments to this SMC are :
122*91f16700Schasinglulu  *    arg0 - Function ID.
123*91f16700Schasinglulu  *    arg1 - Platform attestation token buffer Physical address. (The challenge
124*91f16700Schasinglulu  *           object is passed in this buffer.)
125*91f16700Schasinglulu  *    arg2 - Platform attestation token buffer size (in bytes).
126*91f16700Schasinglulu  *    arg3 - Challenge object size (in bytes). It has to be one of the defined
127*91f16700Schasinglulu  *           SHA hash sizes.
128*91f16700Schasinglulu  * The return arguments are :
129*91f16700Schasinglulu  *    ret0 - Status / error.
130*91f16700Schasinglulu  *    ret1 - Size of the platform token if successful.
131*91f16700Schasinglulu  */
132*91f16700Schasinglulu 					/* 0x1B3 */
133*91f16700Schasinglulu #define RMM_ATTEST_GET_PLAT_TOKEN	SMC64_RMMD_EL3_FID(U(3))
134*91f16700Schasinglulu 
135*91f16700Schasinglulu /* ECC Curve types for attest key generation */
136*91f16700Schasinglulu #define ATTEST_KEY_CURVE_ECC_SECP384R1		0
137*91f16700Schasinglulu 
138*91f16700Schasinglulu /*
139*91f16700Schasinglulu  * RMM_BOOT_COMPLETE originates on RMM when the boot finishes (either cold
140*91f16700Schasinglulu  * or warm boot). This is handled by the RMM-EL3 interface SMC handler.
141*91f16700Schasinglulu  *
142*91f16700Schasinglulu  * RMM_BOOT_COMPLETE FID is located at the end of the available range.
143*91f16700Schasinglulu  */
144*91f16700Schasinglulu 					 /* 0x1CF */
145*91f16700Schasinglulu #define RMM_BOOT_COMPLETE		SMC64_RMMD_EL3_FID(U(0x1F))
146*91f16700Schasinglulu 
147*91f16700Schasinglulu /*
148*91f16700Schasinglulu  * The major version number of the RMM Boot Interface implementation.
149*91f16700Schasinglulu  * Increase this whenever the semantics of the boot arguments change making it
150*91f16700Schasinglulu  * backwards incompatible.
151*91f16700Schasinglulu  */
152*91f16700Schasinglulu #define RMM_EL3_IFC_VERSION_MAJOR	(U(0))
153*91f16700Schasinglulu 
154*91f16700Schasinglulu /*
155*91f16700Schasinglulu  * The minor version number of the RMM Boot Interface implementation.
156*91f16700Schasinglulu  * Increase this when a bug is fixed, or a feature is added without
157*91f16700Schasinglulu  * breaking compatibility.
158*91f16700Schasinglulu  */
159*91f16700Schasinglulu #define RMM_EL3_IFC_VERSION_MINOR	(U(2))
160*91f16700Schasinglulu 
161*91f16700Schasinglulu #define RMM_EL3_INTERFACE_VERSION				\
162*91f16700Schasinglulu 	(((RMM_EL3_IFC_VERSION_MAJOR << 16) & 0x7FFFF) |	\
163*91f16700Schasinglulu 		RMM_EL3_IFC_VERSION_MINOR)
164*91f16700Schasinglulu 
165*91f16700Schasinglulu #define RMM_EL3_IFC_VERSION_GET_MAJOR(_version) (((_version) >> 16) \
166*91f16700Schasinglulu 								& 0x7FFF)
167*91f16700Schasinglulu #define RMM_EL3_IFC_VERSION_GET_MAJOR_MINOR(_version) ((_version) & 0xFFFF)
168*91f16700Schasinglulu 
169*91f16700Schasinglulu #ifndef __ASSEMBLER__
170*91f16700Schasinglulu #include <stdint.h>
171*91f16700Schasinglulu 
172*91f16700Schasinglulu int rmmd_setup(void);
173*91f16700Schasinglulu uint64_t rmmd_rmi_handler(uint32_t smc_fid,
174*91f16700Schasinglulu 		uint64_t x1,
175*91f16700Schasinglulu 		uint64_t x2,
176*91f16700Schasinglulu 		uint64_t x3,
177*91f16700Schasinglulu 		uint64_t x4,
178*91f16700Schasinglulu 		void *cookie,
179*91f16700Schasinglulu 		void *handle,
180*91f16700Schasinglulu 		uint64_t flags);
181*91f16700Schasinglulu 
182*91f16700Schasinglulu uint64_t rmmd_rmm_el3_handler(uint32_t smc_fid,
183*91f16700Schasinglulu 		uint64_t x1,
184*91f16700Schasinglulu 		uint64_t x2,
185*91f16700Schasinglulu 		uint64_t x3,
186*91f16700Schasinglulu 		uint64_t x4,
187*91f16700Schasinglulu 		void *cookie,
188*91f16700Schasinglulu 		void *handle,
189*91f16700Schasinglulu 		uint64_t flags);
190*91f16700Schasinglulu 
191*91f16700Schasinglulu #endif /* __ASSEMBLER__ */
192*91f16700Schasinglulu #endif /* RMMD_SVC_H */
193