xref: /arm-trusted-firmware/include/services/drtm_svc.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022 Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier:    BSD-3-Clause
5*91f16700Schasinglulu  *
6*91f16700Schasinglulu  * DRTM service
7*91f16700Schasinglulu  *
8*91f16700Schasinglulu  * Authors:
9*91f16700Schasinglulu  *	Lucian Paul-Trifu <lucian.paultrifu@gmail.com>
10*91f16700Schasinglulu  *	Brian Nezvadovitz <brinez@microsoft.com> 2021-02-01
11*91f16700Schasinglulu  *
12*91f16700Schasinglulu  */
13*91f16700Schasinglulu 
14*91f16700Schasinglulu #ifndef ARM_DRTM_SVC_H
15*91f16700Schasinglulu #define ARM_DRTM_SVC_H
16*91f16700Schasinglulu 
17*91f16700Schasinglulu /*
18*91f16700Schasinglulu  * SMC function IDs for DRTM Service
19*91f16700Schasinglulu  * Upper word bits set: Fast call, SMC64, Standard Secure Svc. Call (OEN = 4)
20*91f16700Schasinglulu  */
21*91f16700Schasinglulu #define DRTM_FID(func_num)				\
22*91f16700Schasinglulu 	((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) |		\
23*91f16700Schasinglulu 	(SMC_64 << FUNCID_CC_SHIFT) |			\
24*91f16700Schasinglulu 	(OEN_STD_START << FUNCID_OEN_SHIFT) |		\
25*91f16700Schasinglulu 	((func_num) << FUNCID_NUM_SHIFT))
26*91f16700Schasinglulu 
27*91f16700Schasinglulu #define DRTM_FNUM_SVC_VERSION		U(0x110)
28*91f16700Schasinglulu #define DRTM_FNUM_SVC_FEATURES		U(0x111)
29*91f16700Schasinglulu #define DRTM_FNUM_SVC_UNPROTECT_MEM	U(0x113)
30*91f16700Schasinglulu #define DRTM_FNUM_SVC_DYNAMIC_LAUNCH	U(0x114)
31*91f16700Schasinglulu #define DRTM_FNUM_SVC_CLOSE_LOCALITY	U(0x115)
32*91f16700Schasinglulu #define DRTM_FNUM_SVC_GET_ERROR		U(0x116)
33*91f16700Schasinglulu #define DRTM_FNUM_SVC_SET_ERROR		U(0x117)
34*91f16700Schasinglulu #define DRTM_FNUM_SVC_SET_TCB_HASH	U(0x118)
35*91f16700Schasinglulu #define DRTM_FNUM_SVC_LOCK_TCB_HASH	U(0x119)
36*91f16700Schasinglulu 
37*91f16700Schasinglulu #define ARM_DRTM_SVC_VERSION		DRTM_FID(DRTM_FNUM_SVC_VERSION)
38*91f16700Schasinglulu #define ARM_DRTM_SVC_FEATURES		DRTM_FID(DRTM_FNUM_SVC_FEATURES)
39*91f16700Schasinglulu #define ARM_DRTM_SVC_UNPROTECT_MEM	DRTM_FID(DRTM_FNUM_SVC_UNPROTECT_MEM)
40*91f16700Schasinglulu #define ARM_DRTM_SVC_DYNAMIC_LAUNCH	DRTM_FID(DRTM_FNUM_SVC_DYNAMIC_LAUNCH)
41*91f16700Schasinglulu #define ARM_DRTM_SVC_CLOSE_LOCALITY	DRTM_FID(DRTM_FNUM_SVC_CLOSE_LOCALITY)
42*91f16700Schasinglulu #define ARM_DRTM_SVC_GET_ERROR		DRTM_FID(DRTM_FNUM_SVC_GET_ERROR)
43*91f16700Schasinglulu #define ARM_DRTM_SVC_SET_ERROR		DRTM_FID(DRTM_FNUM_SVC_SET_ERROR)
44*91f16700Schasinglulu #define ARM_DRTM_SVC_SET_TCB_HASH	DRTM_FID(DRTM_FNUM_SVC_SET_TCB_HASH)
45*91f16700Schasinglulu #define ARM_DRTM_SVC_LOCK_TCB_HASH	DRTM_FID(DRTM_FNUM_SVC_LOCK_TCB_HASH)
46*91f16700Schasinglulu 
47*91f16700Schasinglulu #define ARM_DRTM_FEATURES_TPM		U(0x1)
48*91f16700Schasinglulu #define ARM_DRTM_FEATURES_MEM_REQ	U(0x2)
49*91f16700Schasinglulu #define ARM_DRTM_FEATURES_DMA_PROT	U(0x3)
50*91f16700Schasinglulu #define ARM_DRTM_FEATURES_BOOT_PE_ID	U(0x4)
51*91f16700Schasinglulu #define ARM_DRTM_FEATURES_TCB_HASHES	U(0x5)
52*91f16700Schasinglulu 
53*91f16700Schasinglulu #define is_drtm_fid(_fid) \
54*91f16700Schasinglulu 	(((_fid) >= ARM_DRTM_SVC_VERSION) && ((_fid) <= ARM_DRTM_SVC_LOCK_TCB_HASH))
55*91f16700Schasinglulu 
56*91f16700Schasinglulu /* ARM DRTM Service Calls version numbers */
57*91f16700Schasinglulu #define ARM_DRTM_VERSION_MAJOR		U(0)
58*91f16700Schasinglulu #define ARM_DRTM_VERSION_MAJOR_SHIFT	16
59*91f16700Schasinglulu #define ARM_DRTM_VERSION_MAJOR_MASK	U(0x7FFF)
60*91f16700Schasinglulu #define ARM_DRTM_VERSION_MINOR		U(1)
61*91f16700Schasinglulu #define ARM_DRTM_VERSION_MINOR_SHIFT	0
62*91f16700Schasinglulu #define ARM_DRTM_VERSION_MINOR_MASK	U(0xFFFF)
63*91f16700Schasinglulu 
64*91f16700Schasinglulu #define ARM_DRTM_VERSION						\
65*91f16700Schasinglulu 	((((ARM_DRTM_VERSION_MAJOR) & ARM_DRTM_VERSION_MAJOR_MASK) <<	\
66*91f16700Schasinglulu 	ARM_DRTM_VERSION_MAJOR_SHIFT)					\
67*91f16700Schasinglulu 	| (((ARM_DRTM_VERSION_MINOR) & ARM_DRTM_VERSION_MINOR_MASK) <<	\
68*91f16700Schasinglulu 	ARM_DRTM_VERSION_MINOR_SHIFT))
69*91f16700Schasinglulu 
70*91f16700Schasinglulu #define ARM_DRTM_FUNC_SHIFT	U(63)
71*91f16700Schasinglulu #define ARM_DRTM_FUNC_MASK	ULL(0x1)
72*91f16700Schasinglulu #define ARM_DRTM_FUNC_ID	U(0x0)
73*91f16700Schasinglulu #define ARM_DRTM_FEAT_ID	U(0x1)
74*91f16700Schasinglulu #define ARM_DRTM_FEAT_ID_MASK	ULL(0xff)
75*91f16700Schasinglulu 
76*91f16700Schasinglulu /*
77*91f16700Schasinglulu  * Definitions for DRTM features as per DRTM beta0 section 3.3,
78*91f16700Schasinglulu  * Table 6 DRTM_FEATURES
79*91f16700Schasinglulu  */
80*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT		U(33)
81*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK		ULL(0xF)
82*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_DEFAULT	ULL(0x1)
83*91f16700Schasinglulu 
84*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT		U(32)
85*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK		ULL(0x1)
86*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_TPM_HASH_NOT_SUPPORTED	ULL(0x0)
87*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_TPM_HASH_SUPPORTED	ULL(0x1)
88*91f16700Schasinglulu 
89*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT		U(0)
90*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_FW_HASH_MASK		ULL(0xFFFFFFFF)
91*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA256		ULL(0xB)
92*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA384		ULL(0xC)
93*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA512		ULL(0xD)
94*91f16700Schasinglulu 
95*91f16700Schasinglulu #define ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT		U(32)
96*91f16700Schasinglulu #define ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK		ULL(0xFFFFFFFF)
97*91f16700Schasinglulu 
98*91f16700Schasinglulu #define ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT	U(0)
99*91f16700Schasinglulu #define ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK	ULL(0xFFFFFFFF)
100*91f16700Schasinglulu 
101*91f16700Schasinglulu #define ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT	U(8)
102*91f16700Schasinglulu #define ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK	ULL(0xF)
103*91f16700Schasinglulu 
104*91f16700Schasinglulu #define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT	U(0)
105*91f16700Schasinglulu #define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK	ULL(0xFF)
106*91f16700Schasinglulu #define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_COMPLETE	ULL(0x1)
107*91f16700Schasinglulu #define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_REGION	ULL(0x2)
108*91f16700Schasinglulu 
109*91f16700Schasinglulu #define ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT	U(0)
110*91f16700Schasinglulu #define ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK	ULL(0xFF)
111*91f16700Schasinglulu 
112*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_SET_PCR_SCHEMA(reg, val)			\
113*91f16700Schasinglulu 	do {								\
114*91f16700Schasinglulu 		reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK \
115*91f16700Schasinglulu 		<< ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT)) | (((val) & \
116*91f16700Schasinglulu 		ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK) <<		\
117*91f16700Schasinglulu 		ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT));		\
118*91f16700Schasinglulu 	} while (false)
119*91f16700Schasinglulu 
120*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_SET_TPM_HASH(reg, val)			\
121*91f16700Schasinglulu 	do {								\
122*91f16700Schasinglulu 		reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK	\
123*91f16700Schasinglulu 		<< ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT)) | (((val) &	\
124*91f16700Schasinglulu 		ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK) <<			\
125*91f16700Schasinglulu 		ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT));			\
126*91f16700Schasinglulu 	} while (false)
127*91f16700Schasinglulu 
128*91f16700Schasinglulu #define ARM_DRTM_TPM_FEATURES_SET_FW_HASH(reg, val)			\
129*91f16700Schasinglulu 	do {								\
130*91f16700Schasinglulu 		reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_FW_HASH_MASK	\
131*91f16700Schasinglulu 		<< ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT)) | (((val) &	\
132*91f16700Schasinglulu 		ARM_DRTM_TPM_FEATURES_FW_HASH_MASK) <<			\
133*91f16700Schasinglulu 		ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT));			\
134*91f16700Schasinglulu 	} while (false)
135*91f16700Schasinglulu 
136*91f16700Schasinglulu #define ARM_DRTM_MIN_MEM_REQ_SET_DCE_SIZE(reg, val)			\
137*91f16700Schasinglulu 	do {								\
138*91f16700Schasinglulu 		reg = (((reg) & ~(ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK	\
139*91f16700Schasinglulu 		<< ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT)) | (((val) &	\
140*91f16700Schasinglulu 		ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK) <<			\
141*91f16700Schasinglulu 		ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT));			\
142*91f16700Schasinglulu 	} while (false)
143*91f16700Schasinglulu 
144*91f16700Schasinglulu #define ARM_DRTM_MIN_MEM_REQ_SET_MIN_DLME_DATA_SIZE(reg, val)		\
145*91f16700Schasinglulu 	do {								\
146*91f16700Schasinglulu 		reg = (((reg) &						\
147*91f16700Schasinglulu 		~(ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK <<	\
148*91f16700Schasinglulu 		ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT)) |	\
149*91f16700Schasinglulu 		(((val) & ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK) \
150*91f16700Schasinglulu 		<< ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT));	\
151*91f16700Schasinglulu 	} while (false)
152*91f16700Schasinglulu 
153*91f16700Schasinglulu #define ARM_DRTM_DMA_PROT_FEATURES_SET_MAX_REGIONS(reg, val)		\
154*91f16700Schasinglulu 	do {								\
155*91f16700Schasinglulu 		reg = (((reg) &						\
156*91f16700Schasinglulu 		~(ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK <<	\
157*91f16700Schasinglulu 		ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT)) |	\
158*91f16700Schasinglulu 		(((val) & ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK)	\
159*91f16700Schasinglulu 		<< ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT));	\
160*91f16700Schasinglulu 	} while (false)
161*91f16700Schasinglulu 
162*91f16700Schasinglulu #define ARM_DRTM_DMA_PROT_FEATURES_SET_DMA_SUPPORT(reg, val) \
163*91f16700Schasinglulu 	do {								\
164*91f16700Schasinglulu 		reg = (((reg) &						\
165*91f16700Schasinglulu 		~(ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK <<	\
166*91f16700Schasinglulu 		ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT)) |	\
167*91f16700Schasinglulu 		(((val) & ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK)	\
168*91f16700Schasinglulu 		<< ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT));	\
169*91f16700Schasinglulu 	} while (false)
170*91f16700Schasinglulu 
171*91f16700Schasinglulu #define ARM_DRTM_TCB_HASH_FEATURES_SET_MAX_NUM_HASHES(reg, val)		\
172*91f16700Schasinglulu 	do {								\
173*91f16700Schasinglulu 		reg = (((reg) &						\
174*91f16700Schasinglulu 		~(ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK <<	\
175*91f16700Schasinglulu 		ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT)) |	\
176*91f16700Schasinglulu 		(((val) &						\
177*91f16700Schasinglulu 		ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK) <<	\
178*91f16700Schasinglulu 		ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT));	\
179*91f16700Schasinglulu 	} while (false)
180*91f16700Schasinglulu 
181*91f16700Schasinglulu /* Definitions for DRTM address map */
182*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT	U(55)
183*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK	ULL(0x3)
184*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_NC	ULL(0)
185*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WC	ULL(1)
186*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WT	ULL(2)
187*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WB	ULL(3)
188*91f16700Schasinglulu 
189*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT	U(52)
190*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK	ULL(0x7)
191*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NORMAL	ULL(0)
192*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NCAR	ULL(1)
193*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_DEVICE	ULL(2)
194*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NV	ULL(3)
195*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_RSVD	ULL(4)
196*91f16700Schasinglulu 
197*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT	U(0)
198*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK	ULL(0xFFFFFFFFFFFFF)
199*91f16700Schasinglulu 
200*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_SET_CACHEABILITY(reg, val)		\
201*91f16700Schasinglulu 	do {								\
202*91f16700Schasinglulu 		reg = (((reg) &						\
203*91f16700Schasinglulu 		~(ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK << 	\
204*91f16700Schasinglulu 		ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT)) |	\
205*91f16700Schasinglulu 		(((val) &						\
206*91f16700Schasinglulu 		ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK) <<		\
207*91f16700Schasinglulu 		ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT));		\
208*91f16700Schasinglulu 	} while (false)
209*91f16700Schasinglulu 
210*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_SET_REGION_TYPE(reg, val)		\
211*91f16700Schasinglulu 	do {								\
212*91f16700Schasinglulu 		reg = (((reg) &						\
213*91f16700Schasinglulu 		~(ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK <<		\
214*91f16700Schasinglulu 		ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT)) |		\
215*91f16700Schasinglulu 		(((val) & ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK)	\
216*91f16700Schasinglulu 		<< ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT));	\
217*91f16700Schasinglulu 	} while (false)
218*91f16700Schasinglulu 
219*91f16700Schasinglulu #define ARM_DRTM_REGION_SIZE_TYPE_SET_4K_PAGE_NUM(reg, val)		\
220*91f16700Schasinglulu 	do {								\
221*91f16700Schasinglulu 		reg = (((reg) &						\
222*91f16700Schasinglulu 		~(ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK <<		\
223*91f16700Schasinglulu 		ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT)) |		\
224*91f16700Schasinglulu 		(((val) & ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK)	\
225*91f16700Schasinglulu 		<< ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT));	\
226*91f16700Schasinglulu 	} while (false)
227*91f16700Schasinglulu 
228*91f16700Schasinglulu /* Initialization routine for the DRTM service */
229*91f16700Schasinglulu int drtm_setup(void);
230*91f16700Schasinglulu 
231*91f16700Schasinglulu /* Handler to be called to handle DRTM SMC calls */
232*91f16700Schasinglulu uint64_t drtm_smc_handler(uint32_t smc_fid,
233*91f16700Schasinglulu 			  uint64_t x1,
234*91f16700Schasinglulu 			  uint64_t x2,
235*91f16700Schasinglulu 			  uint64_t x3,
236*91f16700Schasinglulu 			  uint64_t x4,
237*91f16700Schasinglulu 			  void *cookie,
238*91f16700Schasinglulu 			  void *handle,
239*91f16700Schasinglulu 			  uint64_t flags);
240*91f16700Schasinglulu 
241*91f16700Schasinglulu #endif /* ARM_DRTM_SVC_H */
242