blob: 56ae12959ce155f1dbfee37c5f818b4b1b3be36c [file] [log] [blame]
Manish V Badarkhee62748e2022-02-23 11:26:53 +00001/*
Manish V Badarkhe94127ae2025-02-25 18:24:47 +00002 * Copyright (c) 2022-2025 Arm Limited. All rights reserved.
Manish V Badarkhee62748e2022-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
Manish V Badarkhe8666bcf2025-03-06 15:45:18 +000017#include <lib/utils_def.h>
18
Manish V Badarkhee62748e2022-02-23 11:26:53 +000019/*
20 * SMC function IDs for DRTM Service
21 * Upper word bits set: Fast call, SMC64, Standard Secure Svc. Call (OEN = 4)
22 */
23#define DRTM_FID(func_num) \
24 ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \
25 (SMC_64 << FUNCID_CC_SHIFT) | \
26 (OEN_STD_START << FUNCID_OEN_SHIFT) | \
27 ((func_num) << FUNCID_NUM_SHIFT))
28
29#define DRTM_FNUM_SVC_VERSION U(0x110)
30#define DRTM_FNUM_SVC_FEATURES U(0x111)
31#define DRTM_FNUM_SVC_UNPROTECT_MEM U(0x113)
32#define DRTM_FNUM_SVC_DYNAMIC_LAUNCH U(0x114)
33#define DRTM_FNUM_SVC_CLOSE_LOCALITY U(0x115)
34#define DRTM_FNUM_SVC_GET_ERROR U(0x116)
35#define DRTM_FNUM_SVC_SET_ERROR U(0x117)
36#define DRTM_FNUM_SVC_SET_TCB_HASH U(0x118)
37#define DRTM_FNUM_SVC_LOCK_TCB_HASH U(0x119)
38
39#define ARM_DRTM_SVC_VERSION DRTM_FID(DRTM_FNUM_SVC_VERSION)
40#define ARM_DRTM_SVC_FEATURES DRTM_FID(DRTM_FNUM_SVC_FEATURES)
41#define ARM_DRTM_SVC_UNPROTECT_MEM DRTM_FID(DRTM_FNUM_SVC_UNPROTECT_MEM)
42#define ARM_DRTM_SVC_DYNAMIC_LAUNCH DRTM_FID(DRTM_FNUM_SVC_DYNAMIC_LAUNCH)
43#define ARM_DRTM_SVC_CLOSE_LOCALITY DRTM_FID(DRTM_FNUM_SVC_CLOSE_LOCALITY)
44#define ARM_DRTM_SVC_GET_ERROR DRTM_FID(DRTM_FNUM_SVC_GET_ERROR)
45#define ARM_DRTM_SVC_SET_ERROR DRTM_FID(DRTM_FNUM_SVC_SET_ERROR)
46#define ARM_DRTM_SVC_SET_TCB_HASH DRTM_FID(DRTM_FNUM_SVC_SET_TCB_HASH)
47#define ARM_DRTM_SVC_LOCK_TCB_HASH DRTM_FID(DRTM_FNUM_SVC_LOCK_TCB_HASH)
48
Manish V Badarkhee9467af2022-06-16 13:46:43 +010049#define ARM_DRTM_FEATURES_TPM U(0x1)
50#define ARM_DRTM_FEATURES_MEM_REQ U(0x2)
51#define ARM_DRTM_FEATURES_DMA_PROT U(0x3)
52#define ARM_DRTM_FEATURES_BOOT_PE_ID U(0x4)
53#define ARM_DRTM_FEATURES_TCB_HASHES U(0x5)
Manish V Badarkhe94127ae2025-02-25 18:24:47 +000054#define ARM_DRTM_FEATURES_DLME_IMG_AUTH U(0x6)
Manish V Badarkhee9467af2022-06-16 13:46:43 +010055
Manish V Badarkhee62748e2022-02-23 11:26:53 +000056#define is_drtm_fid(_fid) \
57 (((_fid) >= ARM_DRTM_SVC_VERSION) && ((_fid) <= ARM_DRTM_SVC_LOCK_TCB_HASH))
58
59/* ARM DRTM Service Calls version numbers */
Stuart Yoder9c36b902024-01-10 14:26:10 -060060#define ARM_DRTM_VERSION_MAJOR U(1)
Manish V Badarkhee62748e2022-02-23 11:26:53 +000061#define ARM_DRTM_VERSION_MAJOR_SHIFT 16
62#define ARM_DRTM_VERSION_MAJOR_MASK U(0x7FFF)
Stuart Yoder9c36b902024-01-10 14:26:10 -060063#define ARM_DRTM_VERSION_MINOR U(0)
Manish V Badarkhee62748e2022-02-23 11:26:53 +000064#define ARM_DRTM_VERSION_MINOR_SHIFT 0
65#define ARM_DRTM_VERSION_MINOR_MASK U(0xFFFF)
66
67#define ARM_DRTM_VERSION \
68 ((((ARM_DRTM_VERSION_MAJOR) & ARM_DRTM_VERSION_MAJOR_MASK) << \
69 ARM_DRTM_VERSION_MAJOR_SHIFT) \
70 | (((ARM_DRTM_VERSION_MINOR) & ARM_DRTM_VERSION_MINOR_MASK) << \
71 ARM_DRTM_VERSION_MINOR_SHIFT))
72
73#define ARM_DRTM_FUNC_SHIFT U(63)
Manish V Badarkhee9467af2022-06-16 13:46:43 +010074#define ARM_DRTM_FUNC_MASK ULL(0x1)
Manish V Badarkhee62748e2022-02-23 11:26:53 +000075#define ARM_DRTM_FUNC_ID U(0x0)
76#define ARM_DRTM_FEAT_ID U(0x1)
Manish V Badarkhee9467af2022-06-16 13:46:43 +010077#define ARM_DRTM_FEAT_ID_MASK ULL(0xff)
Manish V Badarkhee62748e2022-02-23 11:26:53 +000078
johpow012a1cdee2022-03-11 17:50:58 -060079/*
Stuart Yoderb94d5902024-01-10 14:22:03 -060080 * Definitions for DRTM features as per DRTM 1.0 section 3.3,
johpow012a1cdee2022-03-11 17:50:58 -060081 * Table 6 DRTM_FEATURES
82 */
83#define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT U(33)
84#define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK ULL(0xF)
85#define ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_DEFAULT ULL(0x1)
86
87#define ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT U(32)
88#define ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK ULL(0x1)
89#define ARM_DRTM_TPM_FEATURES_TPM_HASH_NOT_SUPPORTED ULL(0x0)
90#define ARM_DRTM_TPM_FEATURES_TPM_HASH_SUPPORTED ULL(0x1)
91
92#define ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT U(0)
Stuart Yoderc86cfa32024-01-10 14:16:26 -060093#define ARM_DRTM_TPM_FEATURES_FW_HASH_MASK ULL(0xFFFF)
johpow012a1cdee2022-03-11 17:50:58 -060094#define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA256 ULL(0xB)
95#define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA384 ULL(0xC)
96#define ARM_DRTM_TPM_FEATURES_FW_HASH_SHA512 ULL(0xD)
97
98#define ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT U(32)
99#define ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK ULL(0xFFFFFFFF)
100
101#define ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT U(0)
102#define ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK ULL(0xFFFFFFFF)
103
104#define ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT U(8)
105#define ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK ULL(0xF)
106
107#define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT U(0)
108#define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK ULL(0xFF)
109#define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_COMPLETE ULL(0x1)
110#define ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_REGION ULL(0x2)
111
112#define ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT U(0)
113#define ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK ULL(0xFF)
114
Manish V Badarkhe94127ae2025-02-25 18:24:47 +0000115#define ARM_DRTM_DLME_IMAGE_AUTH_SUPPORT_SHIFT U(0)
116#define ARM_DRTM_DLME_IMAGE_AUTH_SUPPORT_MASK ULL(0x1)
117
johpow012a1cdee2022-03-11 17:50:58 -0600118#define ARM_DRTM_TPM_FEATURES_SET_PCR_SCHEMA(reg, val) \
119 do { \
120 reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK \
121 << ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT)) | (((val) & \
122 ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_MASK) << \
123 ARM_DRTM_TPM_FEATURES_PCR_SCHEMA_SHIFT)); \
124 } while (false)
125
126#define ARM_DRTM_TPM_FEATURES_SET_TPM_HASH(reg, val) \
127 do { \
128 reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK \
129 << ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT)) | (((val) & \
130 ARM_DRTM_TPM_FEATURES_TPM_HASH_MASK) << \
131 ARM_DRTM_TPM_FEATURES_TPM_HASH_SHIFT)); \
132 } while (false)
133
134#define ARM_DRTM_TPM_FEATURES_SET_FW_HASH(reg, val) \
135 do { \
136 reg = (((reg) & ~(ARM_DRTM_TPM_FEATURES_FW_HASH_MASK \
137 << ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT)) | (((val) & \
138 ARM_DRTM_TPM_FEATURES_FW_HASH_MASK) << \
139 ARM_DRTM_TPM_FEATURES_FW_HASH_SHIFT)); \
140 } while (false)
141
142#define ARM_DRTM_MIN_MEM_REQ_SET_DCE_SIZE(reg, val) \
143 do { \
144 reg = (((reg) & ~(ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK \
145 << ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT)) | (((val) & \
146 ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_MASK) << \
147 ARM_DRTM_MIN_MEM_REQ_DCE_SIZE_SHIFT)); \
148 } while (false)
149
150#define ARM_DRTM_MIN_MEM_REQ_SET_MIN_DLME_DATA_SIZE(reg, val) \
151 do { \
152 reg = (((reg) & \
153 ~(ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK << \
154 ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT)) | \
155 (((val) & ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_MASK) \
156 << ARM_DRTM_MIN_MEM_REQ_MIN_DLME_DATA_SIZE_SHIFT)); \
157 } while (false)
158
159#define ARM_DRTM_DMA_PROT_FEATURES_SET_MAX_REGIONS(reg, val) \
160 do { \
161 reg = (((reg) & \
162 ~(ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK << \
163 ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT)) | \
164 (((val) & ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_MASK) \
165 << ARM_DRTM_DMA_PROT_FEATURES_MAX_REGIONS_SHIFT)); \
166 } while (false)
167
168#define ARM_DRTM_DMA_PROT_FEATURES_SET_DMA_SUPPORT(reg, val) \
169 do { \
170 reg = (((reg) & \
171 ~(ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK << \
172 ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT)) | \
173 (((val) & ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_MASK) \
174 << ARM_DRTM_DMA_PROT_FEATURES_DMA_SUPPORT_SHIFT)); \
175 } while (false)
176
177#define ARM_DRTM_TCB_HASH_FEATURES_SET_MAX_NUM_HASHES(reg, val) \
178 do { \
179 reg = (((reg) & \
180 ~(ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK << \
181 ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT)) | \
182 (((val) & \
183 ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_MASK) << \
184 ARM_DRTM_TCB_HASH_FEATURES_MAX_NUM_HASHES_SHIFT)); \
185 } while (false)
186
Manish V Badarkhe94127ae2025-02-25 18:24:47 +0000187#define ARM_DRTM_DLME_IMG_AUTH_SUPPORT(reg, val) \
188 do { \
189 reg = (((reg) & \
190 ~(ARM_DRTM_DLME_IMAGE_AUTH_SUPPORT_MASK << \
191 ARM_DRTM_DLME_IMAGE_AUTH_SUPPORT_SHIFT)) | \
192 (((val) & \
193 ARM_DRTM_DLME_IMAGE_AUTH_SUPPORT_MASK) << \
194 ARM_DRTM_DLME_IMAGE_AUTH_SUPPORT_SHIFT)); \
195 } while (false)
196
johpow012a1cdee2022-03-11 17:50:58 -0600197/* Definitions for DRTM address map */
198#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT U(55)
199#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK ULL(0x3)
200#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_NC ULL(0)
201#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WC ULL(1)
202#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WT ULL(2)
203#define ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_WB ULL(3)
204
205#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT U(52)
206#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK ULL(0x7)
207#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NORMAL ULL(0)
208#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NCAR ULL(1)
209#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_DEVICE ULL(2)
210#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NV ULL(3)
211#define ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_RSVD ULL(4)
212
213#define ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT U(0)
214#define ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK ULL(0xFFFFFFFFFFFFF)
215
216#define ARM_DRTM_REGION_SIZE_TYPE_SET_CACHEABILITY(reg, val) \
217 do { \
218 reg = (((reg) & \
219 ~(ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK << \
220 ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT)) | \
221 (((val) & \
222 ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_MASK) << \
223 ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_SHIFT)); \
224 } while (false)
225
226#define ARM_DRTM_REGION_SIZE_TYPE_SET_REGION_TYPE(reg, val) \
227 do { \
228 reg = (((reg) & \
229 ~(ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK << \
230 ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT)) | \
231 (((val) & ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_MASK) \
232 << ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_SHIFT)); \
233 } while (false)
234
235#define ARM_DRTM_REGION_SIZE_TYPE_SET_4K_PAGE_NUM(reg, val) \
236 do { \
237 reg = (((reg) & \
238 ~(ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK << \
239 ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT)) | \
240 (((val) & ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_MASK) \
241 << ARM_DRTM_REGION_SIZE_TYPE_4K_PAGE_NUM_SHIFT)); \
242 } while (false)
243
Manish V Badarkhe8666bcf2025-03-06 15:45:18 +0000244#define DRTM_LAUNCH_FEAT_DLME_IMG_AUTH_SHIFT U(6)
245#define DRTM_LAUNCH_FEAT_MEM_PROTECTION_TYPE_SHIFT U(3)
246#define DRTM_LAUNCH_FEAT_PCR_USAGE_SCHEMA_SHIFT U(1)
247#define DRTM_LAUNCH_FEAT_HASHING_TYPE_SHIFT U(0)
248
Boyan Karatotevf9635782025-02-05 10:48:20 +0000249#define DRTM_LAUNCH_FEAT_DLME_IMG_AUTH_WIDTH U(1)
250#define DRTM_LAUNCH_FEAT_MEM_PROTECTION_TYPE_WIDTH U(3)
251#define DRTM_LAUNCH_FEAT_PCR_USAGE_SCHEMA_WIDTH U(2)
252#define DRTM_LAUNCH_FEAT_HASHING_TYPE_WIDTH U(1)
Manish V Badarkhe8666bcf2025-03-06 15:45:18 +0000253
254#define DLME_IMG_AUTH U(0x1)
255#define REG_MEM_PROTECTION_TYPE U(0x1)
256#define DLME_AUTH_SCHEMA U(0x1)
257#define TPM_BASED_HASHING U(0x1)
258
Manish V Badarkhee62748e2022-02-23 11:26:53 +0000259/* Initialization routine for the DRTM service */
260int drtm_setup(void);
261
262/* Handler to be called to handle DRTM SMC calls */
263uint64_t drtm_smc_handler(uint32_t smc_fid,
264 uint64_t x1,
265 uint64_t x2,
266 uint64_t x3,
267 uint64_t x4,
268 void *cookie,
269 void *handle,
270 uint64_t flags);
271
272#endif /* ARM_DRTM_SVC_H */