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 */ 7*91f16700Schasinglulu #ifndef DRTM_MAIN_H 8*91f16700Schasinglulu #define DRTM_MAIN_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <stdint.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <assert.h> 13*91f16700Schasinglulu #include <lib/smccc.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include "drtm_dma_prot.h" 16*91f16700Schasinglulu 17*91f16700Schasinglulu #define ALIGNED_UP(x, a) __extension__ ({ \ 18*91f16700Schasinglulu __typeof__(a) _a = (a); \ 19*91f16700Schasinglulu __typeof__(a) _one = 1; \ 20*91f16700Schasinglulu assert(IS_POWER_OF_TWO(_a)); \ 21*91f16700Schasinglulu ((x) + (_a - _one)) & ~(_a - _one); \ 22*91f16700Schasinglulu }) 23*91f16700Schasinglulu 24*91f16700Schasinglulu #define ALIGNED_DOWN(x, a) __extension__ ({ \ 25*91f16700Schasinglulu __typeof__(a) _a = (a); \ 26*91f16700Schasinglulu __typeof__(a) _one = 1; \ 27*91f16700Schasinglulu assert(IS_POWER_OF_TWO(_a)); \ 28*91f16700Schasinglulu (x) & ~(_a - _one); \ 29*91f16700Schasinglulu }) 30*91f16700Schasinglulu 31*91f16700Schasinglulu #define DRTM_PAGE_SIZE (4 * (1 << 10)) 32*91f16700Schasinglulu #define DRTM_PAGE_SIZE_STR "4-KiB" 33*91f16700Schasinglulu 34*91f16700Schasinglulu #define DL_ARGS_GET_DMA_PROT_TYPE(a) (((a)->features >> 3) & 0x7U) 35*91f16700Schasinglulu #define DL_ARGS_GET_PCR_SCHEMA(a) (((a)->features >> 1) & 0x3U) 36*91f16700Schasinglulu #define DL_ARGS_GET_DLME_ENTRY_POINT(a) \ 37*91f16700Schasinglulu (((a)->dlme_paddr + (a)->dlme_img_off + (a)->dlme_img_ep_off)) 38*91f16700Schasinglulu 39*91f16700Schasinglulu /* 40*91f16700Schasinglulu * Range(Min/Max) of DRTM parameter structure versions supported 41*91f16700Schasinglulu */ 42*91f16700Schasinglulu #define ARM_DRTM_PARAMS_MIN_VERSION U(1) 43*91f16700Schasinglulu #define ARM_DRTM_PARAMS_MAX_VERSION U(1) 44*91f16700Schasinglulu 45*91f16700Schasinglulu enum drtm_dlme_el { 46*91f16700Schasinglulu DLME_AT_EL1 = MODE_EL1, 47*91f16700Schasinglulu DLME_AT_EL2 = MODE_EL2 48*91f16700Schasinglulu }; 49*91f16700Schasinglulu 50*91f16700Schasinglulu enum drtm_retc { 51*91f16700Schasinglulu SUCCESS = SMC_OK, 52*91f16700Schasinglulu NOT_SUPPORTED = SMC_UNK, 53*91f16700Schasinglulu INVALID_PARAMETERS = -2, 54*91f16700Schasinglulu DENIED = -3, 55*91f16700Schasinglulu NOT_FOUND = -4, 56*91f16700Schasinglulu INTERNAL_ERROR = -5, 57*91f16700Schasinglulu MEM_PROTECT_INVALID = -6, 58*91f16700Schasinglulu }; 59*91f16700Schasinglulu 60*91f16700Schasinglulu typedef struct { 61*91f16700Schasinglulu uint64_t tpm_features; 62*91f16700Schasinglulu uint64_t minimum_memory_requirement; 63*91f16700Schasinglulu uint64_t dma_prot_features; 64*91f16700Schasinglulu uint64_t boot_pe_id; 65*91f16700Schasinglulu uint64_t tcb_hash_features; 66*91f16700Schasinglulu } drtm_features_t; 67*91f16700Schasinglulu 68*91f16700Schasinglulu struct __packed drtm_dl_args_v1 { 69*91f16700Schasinglulu uint16_t version; /* Must be 1. */ 70*91f16700Schasinglulu uint8_t __res[2]; 71*91f16700Schasinglulu uint32_t features; 72*91f16700Schasinglulu uint64_t dlme_paddr; 73*91f16700Schasinglulu uint64_t dlme_size; 74*91f16700Schasinglulu uint64_t dlme_img_off; 75*91f16700Schasinglulu uint64_t dlme_img_ep_off; 76*91f16700Schasinglulu uint64_t dlme_img_size; 77*91f16700Schasinglulu uint64_t dlme_data_off; 78*91f16700Schasinglulu uint64_t dce_nwd_paddr; 79*91f16700Schasinglulu uint64_t dce_nwd_size; 80*91f16700Schasinglulu drtm_dl_dma_prot_args_v1_t dma_prot_args; 81*91f16700Schasinglulu } __aligned(__alignof(uint16_t /* First member's type, `uint16_t version' */)); 82*91f16700Schasinglulu 83*91f16700Schasinglulu struct __packed dlme_data_header_v1 { 84*91f16700Schasinglulu uint16_t version; /* Must be 1. */ 85*91f16700Schasinglulu uint16_t this_hdr_size; 86*91f16700Schasinglulu uint8_t __res[4]; 87*91f16700Schasinglulu uint64_t dlme_data_size; 88*91f16700Schasinglulu uint64_t dlme_prot_regions_size; 89*91f16700Schasinglulu uint64_t dlme_addr_map_size; 90*91f16700Schasinglulu uint64_t dlme_tpm_log_size; 91*91f16700Schasinglulu uint64_t dlme_tcb_hashes_table_size; 92*91f16700Schasinglulu uint64_t dlme_impdef_region_size; 93*91f16700Schasinglulu } __aligned(__alignof(uint16_t /* First member's type, `uint16_t version'. */)); 94*91f16700Schasinglulu 95*91f16700Schasinglulu typedef struct dlme_data_header_v1 struct_dlme_data_header; 96*91f16700Schasinglulu 97*91f16700Schasinglulu drtm_memory_region_descriptor_table_t *drtm_build_address_map(void); 98*91f16700Schasinglulu uint64_t drtm_get_address_map_size(void); 99*91f16700Schasinglulu 100*91f16700Schasinglulu /* 101*91f16700Schasinglulu * Version-independent type. May be used to avoid excessive line of code 102*91f16700Schasinglulu * changes when migrating to new struct versions. 103*91f16700Schasinglulu */ 104*91f16700Schasinglulu typedef struct drtm_dl_args_v1 struct_drtm_dl_args; 105*91f16700Schasinglulu 106*91f16700Schasinglulu #endif /* DRTM_MAIN_H */ 107