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