1 /* 2 * Copyright (c) 2022-2025 Arm Limited. All rights reserved. 3 * 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 47 #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) 52 #define ARM_DRTM_FEATURES_DLME_IMG_AUTH U(0x6) 53 54 #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 */ 58 #define ARM_DRTM_VERSION_MAJOR U(1) 59 #define ARM_DRTM_VERSION_MAJOR_SHIFT 16 60 #define ARM_DRTM_VERSION_MAJOR_MASK U(0x7FFF) 61 #define ARM_DRTM_VERSION_MINOR U(0) 62 #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) 72 #define ARM_DRTM_FUNC_MASK ULL(0x1) 73 #define ARM_DRTM_FUNC_ID U(0x0) 74 #define ARM_DRTM_FEAT_ID U(0x1) 75 #define ARM_DRTM_FEAT_ID_MASK ULL(0xff) 76 77 /* 78 * Definitions for DRTM features as per DRTM 1.0 section 3.3, 79 * 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) 91 #define ARM_DRTM_TPM_FEATURES_FW_HASH_MASK ULL(0xFFFF) 92 #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 113 #define ARM_DRTM_DLME_IMAGE_AUTH_SUPPORT_SHIFT U(0) 114 #define ARM_DRTM_DLME_IMAGE_AUTH_SUPPORT_MASK ULL(0x1) 115 116 #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 185 #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 195 /* 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 242 /* Initialization routine for the DRTM service */ 243 int drtm_setup(void); 244 245 /* Handler to be called to handle DRTM SMC calls */ 246 uint64_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 */ 256