summaryrefslogtreecommitdiffstats
path: root/include/services/drtm_svc.h
blob: 69b314f08408ef7e6cbdd5f6f9bddef6d1adb01d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
/*
 * Copyright (c) 2022 Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier:    BSD-3-Clause
 *
 * DRTM service
 *
 * Authors:
 *	Lucian Paul-Trifu <lucian.paultrifu@gmail.com>
 *	Brian Nezvadovitz <brinez@microsoft.com> 2021-02-01
 *
 */

#ifndef ARM_DRTM_SVC_H
#define ARM_DRTM_SVC_H

/*
 * SMC function IDs for DRTM Service
 * Upper word bits set: Fast call, SMC64, Standard Secure Svc. Call (OEN = 4)
 */
#define DRTM_FID(func_num)				\
	((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) |		\
	(SMC_64 << FUNCID_CC_SHIFT) |			\
	(OEN_STD_START << FUNCID_OEN_SHIFT) |		\
	((func_num) << FUNCID_NUM_SHIFT))

#define DRTM_FNUM_SVC_VERSION		U(0x110)
#define DRTM_FNUM_SVC_FEATURES		U(0x111)
#define DRTM_FNUM_SVC_UNPROTECT_MEM	U(0x113)
#define DRTM_FNUM_SVC_DYNAMIC_LAUNCH	U(0x114)
#define DRTM_FNUM_SVC_CLOSE_LOCALITY	U(0x115)
#define DRTM_FNUM_SVC_GET_ERROR		U(0x116)
#define DRTM_FNUM_SVC_SET_ERROR		U(0x117)
#define DRTM_FNUM_SVC_SET_TCB_HASH	U(0x118)
#define DRTM_FNUM_SVC_LOCK_TCB_HASH	U(0x119)

#define ARM_DRTM_SVC_VERSION		DRTM_FID(DRTM_FNUM_SVC_VERSION)
#define ARM_DRTM_SVC_FEATURES		DRTM_FID(DRTM_FNUM_SVC_FEATURES)
#define ARM_DRTM_SVC_UNPROTECT_MEM	DRTM_FID(DRTM_FNUM_SVC_UNPROTECT_MEM)
#define ARM_DRTM_SVC_DYNAMIC_LAUNCH	DRTM_FID(DRTM_FNUM_SVC_DYNAMIC_LAUNCH)
#define ARM_DRTM_SVC_CLOSE_LOCALITY	DRTM_FID(DRTM_FNUM_SVC_CLOSE_LOCALITY)
#define ARM_DRTM_SVC_GET_ERROR		DRTM_FID(DRTM_FNUM_SVC_GET_ERROR)
#define ARM_DRTM_SVC_SET_ERROR		DRTM_FID(DRTM_FNUM_SVC_SET_ERROR)
#define ARM_DRTM_SVC_SET_TCB_HASH	DRTM_FID(DRTM_FNUM_SVC_SET_TCB_HASH)
#define ARM_DRTM_SVC_LOCK_TCB_HASH	DRTM_FID(DRTM_FNUM_SVC_LOCK_TCB_HASH)

#define ARM_DRTM_FEATURES_TPM		U(0x1)
#define ARM_DRTM_FEATURES_MEM_REQ	U(0x2)
#define ARM_DRTM_FEATURES_DMA_PROT	U(0x3)
#define ARM_DRTM_FEATURES_BOOT_PE_ID	U(0x4)
#define ARM_DRTM_FEATURES_TCB_HASHES	U(0x5)

#define is_drtm_fid(_fid) \
	(((_fid) >= ARM_DRTM_SVC_VERSION) && ((_fid) <= ARM_DRTM_SVC_LOCK_TCB_HASH))

/* ARM DRTM Service Calls version numbers */
#define ARM_DRTM_VERSION_MAJOR		U(0)
#define ARM_DRTM_VERSION_MAJOR_SHIFT	16
#define ARM_DRTM_VERSION_MAJOR_MASK	U(0x7FFF)
#define ARM_DRTM_VERSION_MINOR		U(1)
#define ARM_DRTM_VERSION_MINOR_SHIFT	0
#define ARM_DRTM_VERSION_MINOR_MASK	U(0xFFFF)

#define ARM_DRTM_VERSION						\
	((((ARM_DRTM_VERSION_MAJOR) & ARM_DRTM_VERSION_MAJOR_MASK) <<	\
	ARM_DRTM_VERSION_MAJOR_SHIFT)					\
	| (((ARM_DRTM_VERSION_MINOR) & ARM_DRTM_VERSION_MINOR_MASK) <<	\
	ARM_DRTM_VERSION_MINOR_SHIFT))

#define ARM_DRTM_FUNC_SHIFT	U(63)
#define ARM_DRTM_FUNC_MASK	ULL(0x1)
#define ARM_DRTM_FUNC_ID	U(0x0)
#define ARM_DRTM_FEAT_ID	U(0x1)
#define ARM_DRTM_FEAT_ID_MASK	ULL(0xff)

/*
 * Definitions for DRTM features as per DRTM beta0 section 3.3,
 * Table 6 DRTM_FEATURES
 */
#define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT		U(33)
#define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK		ULL(0xF)
#define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_DEFAULT	ULL(0x1)

#define ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT		U(32)
#define ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK		ULL(0x1)
#define ARM_DRTM_TPM_FEATURES_TPM_HASH_NOT_SUPPORTED	ULL(0x0)
#define ARM_DRTM_TPM_FEATURES_TPM_HASH_SUPPORTED	ULL(0x1)

#define ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT		U(0)
#define ARM_DRTM_TPM_FEATURES_FW_HASH_MASK		ULL(0xFFFFFFFF)
#define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA256		ULL(0xB)
#define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA384		ULL(0xC)
#define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA512		ULL(0xD)

#define ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT		U(32)
#define ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK		ULL(0xFFFFFFFF)

#define ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT	U(0)
#define ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK	ULL(0xFFFFFFFF)

#define ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT	U(8)
#define ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK	ULL(0xF)

#define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT	U(0)
#define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK	ULL(0xFF)
#define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_COMPLETE	ULL(0x1)
#define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_REGION	ULL(0x2)

#define ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT	U(0)
#define ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK	ULL(0xFF)

#define ARM_DRTM_TPM_FEATURES_SET_PCR_SCHEMA(reg, val)			\
	do {								\
		reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK \
		<< ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT)) | (((val) & \
		ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK) <<		\
		ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT));		\
	} while (false)

#define ARM_DRTM_TPM_FEATURES_SET_TPM_HASH(reg, val)			\
	do {								\
		reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK	\
		<< ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT)) | (((val) &	\
		ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK) <<			\
		ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT));			\
	} while (false)

#define ARM_DRTM_TPM_FEATURES_SET_FW_HASH(reg, val)			\
	do {								\
		reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_FW_HASH_MASK	\
		<< ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT)) | (((val) &	\
		ARM_DRTM_TPM_FEATURES_FW_HASH_MASK) <<			\
		ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT));			\
	} while (false)

#define ARM_DRTM_MIN_MEM_REQ_SET_DCE_SIZE(reg, val)			\
	do {								\
		reg = (((reg) & ~(ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK	\
		<< ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT)) | (((val) &	\
		ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK) <<			\
		ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT));			\
	} while (false)

#define ARM_DRTM_MIN_MEM_REQ_SET_MIN_DLME_DATA_SIZE(reg, val)		\
	do {								\
		reg = (((reg) &						\
		~(ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK <<	\
		ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT)) |	\
		(((val) & ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK) \
		<< ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT));	\
	} while (false)

#define ARM_DRTM_DMA_PROT_FEATURES_SET_MAX_REGIONS(reg, val)		\
	do {								\
		reg = (((reg) &						\
		~(ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK <<	\
		ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT)) |	\
		(((val) & ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK)	\
		<< ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT));	\
	} while (false)

#define ARM_DRTM_DMA_PROT_FEATURES_SET_DMA_SUPPORT(reg, val) \
	do {								\
		reg = (((reg) &						\
		~(ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK <<	\
		ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT)) |	\
		(((val) & ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK)	\
		<< ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT));	\
	} while (false)

#define ARM_DRTM_TCB_HASH_FEATURES_SET_MAX_NUM_HASHES(reg, val)		\
	do {								\
		reg = (((reg) &						\
		~(ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK <<	\
		ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT)) |	\
		(((val) &						\
		ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK) <<	\
		ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT));	\
	} while (false)

/* Definitions for DRTM address map */
#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT	U(55)
#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK	ULL(0x3)
#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_NC	ULL(0)
#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WC	ULL(1)
#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WT	ULL(2)
#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WB	ULL(3)

#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT	U(52)
#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK	ULL(0x7)
#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NORMAL	ULL(0)
#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NCAR	ULL(1)
#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_DEVICE	ULL(2)
#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NV	ULL(3)
#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_RSVD	ULL(4)

#define ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT	U(0)
#define ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK	ULL(0xFFFFFFFFFFFFF)

#define ARM_DRTM_REGION_SIZE_TYPE_SET_CACHEABILITY(reg, val)		\
	do {								\
		reg = (((reg) &						\
		~(ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK << 	\
		ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT)) |	\
		(((val) &						\
		ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK) <<		\
		ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT));		\
	} while (false)

#define ARM_DRTM_REGION_SIZE_TYPE_SET_REGION_TYPE(reg, val)		\
	do {								\
		reg = (((reg) &						\
		~(ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK <<		\
		ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT)) |		\
		(((val) & ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK)	\
		<< ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT));	\
	} while (false)

#define ARM_DRTM_REGION_SIZE_TYPE_SET_4K_PAGE_NUM(reg, val)		\
	do {								\
		reg = (((reg) &						\
		~(ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK <<		\
		ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT)) |		\
		(((val) & ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK)	\
		<< ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT));	\
	} while (false)

/* Initialization routine for the DRTM service */
int drtm_setup(void);

/* Handler to be called to handle DRTM SMC calls */
uint64_t drtm_smc_handler(uint32_t smc_fid,
			  uint64_t x1,
			  uint64_t x2,
			  uint64_t x3,
			  uint64_t x4,
			  void *cookie,
			  void *handle,
			  uint64_t flags);

#endif /* ARM_DRTM_SVC_H */