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