1e62748e3SManish V Badarkhe /* 289f5c753SStuart Yoder * Copyright (c) 2022-2024 Arm Limited. All rights reserved. 3e62748e3SManish V Badarkhe * 4e62748e3SManish V Badarkhe * SPDX-License-Identifier: BSD-3-Clause 5e62748e3SManish V Badarkhe * 6e62748e3SManish V Badarkhe */ 7e62748e3SManish V Badarkhe #ifndef DRTM_MAIN_H 8e62748e3SManish V Badarkhe #define DRTM_MAIN_H 9e62748e3SManish V Badarkhe 10e62748e3SManish V Badarkhe #include <stdint.h> 11e62748e3SManish V Badarkhe 1240e1fad6SManish Pandey #include <assert.h> 13e62748e3SManish V Badarkhe #include <lib/smccc.h> 14e62748e3SManish V Badarkhe 15d54792bdSManish V Badarkhe #include "drtm_dma_prot.h" 16d54792bdSManish V Badarkhe 1740e1fad6SManish Pandey #define ALIGNED_UP(x, a) __extension__ ({ \ 1840e1fad6SManish Pandey __typeof__(a) _a = (a); \ 1940e1fad6SManish Pandey __typeof__(a) _one = 1; \ 2040e1fad6SManish Pandey assert(IS_POWER_OF_TWO(_a)); \ 2140e1fad6SManish Pandey ((x) + (_a - _one)) & ~(_a - _one); \ 2240e1fad6SManish Pandey }) 2340e1fad6SManish Pandey 2440e1fad6SManish Pandey #define ALIGNED_DOWN(x, a) __extension__ ({ \ 2540e1fad6SManish Pandey __typeof__(a) _a = (a); \ 2640e1fad6SManish Pandey __typeof__(a) _one = 1; \ 2740e1fad6SManish Pandey assert(IS_POWER_OF_TWO(_a)); \ 2840e1fad6SManish Pandey (x) & ~(_a - _one); \ 2940e1fad6SManish Pandey }) 3040e1fad6SManish Pandey 3140e1fad6SManish Pandey #define DRTM_PAGE_SIZE (4 * (1 << 10)) 3240e1fad6SManish Pandey #define DRTM_PAGE_SIZE_STR "4-KiB" 3340e1fad6SManish Pandey 342b13a985SManish V Badarkhe #define DL_ARGS_GET_DMA_PROT_TYPE(a) (((a)->features >> 3) & 0x7U) 3540814266SManish V Badarkhe #define DL_ARGS_GET_PCR_SCHEMA(a) (((a)->features >> 1) & 0x3U) 3640814266SManish V Badarkhe #define DL_ARGS_GET_DLME_ENTRY_POINT(a) \ 3740814266SManish V Badarkhe (((a)->dlme_paddr + (a)->dlme_img_off + (a)->dlme_img_ep_off)) 3840814266SManish V Badarkhe 39c503ded2SManish V Badarkhe /* 40*63d2020fSManish V Badarkhe * Minimum size of Event Log in DLME data (64 KiB) 41*63d2020fSManish V Badarkhe */ 42*63d2020fSManish V Badarkhe #define ARM_DRTM_MIN_EVENT_LOG_SIZE U(0x10000) 43*63d2020fSManish V Badarkhe 44*63d2020fSManish V Badarkhe /* 45c503ded2SManish V Badarkhe * Range(Min/Max) of DRTM parameter structure versions supported 46c503ded2SManish V Badarkhe */ 47c503ded2SManish V Badarkhe #define ARM_DRTM_PARAMS_MIN_VERSION U(1) 48c503ded2SManish V Badarkhe #define ARM_DRTM_PARAMS_MAX_VERSION U(1) 49c503ded2SManish V Badarkhe 50d1747e1bSManish Pandey enum drtm_dlme_el { 51d1747e1bSManish Pandey DLME_AT_EL1 = MODE_EL1, 52d1747e1bSManish Pandey DLME_AT_EL2 = MODE_EL2 53d1747e1bSManish Pandey }; 54d1747e1bSManish Pandey 55e62748e3SManish V Badarkhe enum drtm_retc { 56e62748e3SManish V Badarkhe SUCCESS = SMC_OK, 57e62748e3SManish V Badarkhe NOT_SUPPORTED = SMC_UNK, 58e62748e3SManish V Badarkhe INVALID_PARAMETERS = -2, 59e62748e3SManish V Badarkhe DENIED = -3, 60e62748e3SManish V Badarkhe NOT_FOUND = -4, 61e62748e3SManish V Badarkhe INTERNAL_ERROR = -5, 62e62748e3SManish V Badarkhe MEM_PROTECT_INVALID = -6, 6389f5c753SStuart Yoder COPROCESSOR_ERROR = -7, 6489f5c753SStuart Yoder OUT_OF_RESOURCE = -8, 6589f5c753SStuart Yoder INVALID_DATA = -9, 6689f5c753SStuart Yoder SECONDARY_PE_NOT_OFF = -10, 6789f5c753SStuart Yoder ALREADY_CLOSED = -11, 6889f5c753SStuart Yoder TPM_ERROR = -12 69e62748e3SManish V Badarkhe }; 70e62748e3SManish V Badarkhe 712a1cdee4Sjohpow01 typedef struct { 722a1cdee4Sjohpow01 uint64_t tpm_features; 732a1cdee4Sjohpow01 uint64_t minimum_memory_requirement; 742a1cdee4Sjohpow01 uint64_t dma_prot_features; 752a1cdee4Sjohpow01 uint64_t boot_pe_id; 762a1cdee4Sjohpow01 uint64_t tcb_hash_features; 772a1cdee4Sjohpow01 } drtm_features_t; 782a1cdee4Sjohpow01 7940e1fad6SManish Pandey struct __packed drtm_dl_args_v1 { 8040e1fad6SManish Pandey uint16_t version; /* Must be 1. */ 8140e1fad6SManish Pandey uint8_t __res[2]; 8240e1fad6SManish Pandey uint32_t features; 8340e1fad6SManish Pandey uint64_t dlme_paddr; 8440e1fad6SManish Pandey uint64_t dlme_size; 8540e1fad6SManish Pandey uint64_t dlme_img_off; 8640e1fad6SManish Pandey uint64_t dlme_img_ep_off; 8740e1fad6SManish Pandey uint64_t dlme_img_size; 8840e1fad6SManish Pandey uint64_t dlme_data_off; 8940e1fad6SManish Pandey uint64_t dce_nwd_paddr; 9040e1fad6SManish Pandey uint64_t dce_nwd_size; 9140e1fad6SManish Pandey drtm_dl_dma_prot_args_v1_t dma_prot_args; 9240e1fad6SManish Pandey } __aligned(__alignof(uint16_t /* First member's type, `uint16_t version' */)); 93d42119ccSManish V Badarkhe 94d42119ccSManish V Badarkhe struct __packed dlme_data_header_v1 { 95d42119ccSManish V Badarkhe uint16_t version; /* Must be 1. */ 96d42119ccSManish V Badarkhe uint16_t this_hdr_size; 97d42119ccSManish V Badarkhe uint8_t __res[4]; 98d42119ccSManish V Badarkhe uint64_t dlme_data_size; 99d42119ccSManish V Badarkhe uint64_t dlme_prot_regions_size; 100d42119ccSManish V Badarkhe uint64_t dlme_addr_map_size; 101d42119ccSManish V Badarkhe uint64_t dlme_tpm_log_size; 102d42119ccSManish V Badarkhe uint64_t dlme_tcb_hashes_table_size; 1035dde96b0SStuart Yoder uint64_t dlme_acpi_tables_region_size; 104d42119ccSManish V Badarkhe uint64_t dlme_impdef_region_size; 105d42119ccSManish V Badarkhe } __aligned(__alignof(uint16_t /* First member's type, `uint16_t version'. */)); 106d42119ccSManish V Badarkhe 107d42119ccSManish V Badarkhe typedef struct dlme_data_header_v1 struct_dlme_data_header; 10840e1fad6SManish Pandey 1092a1cdee4Sjohpow01 drtm_memory_region_descriptor_table_t *drtm_build_address_map(void); 1102a1cdee4Sjohpow01 uint64_t drtm_get_address_map_size(void); 1112a1cdee4Sjohpow01 11240e1fad6SManish Pandey /* 11340e1fad6SManish Pandey * Version-independent type. May be used to avoid excessive line of code 11440e1fad6SManish Pandey * changes when migrating to new struct versions. 11540e1fad6SManish Pandey */ 11640e1fad6SManish Pandey typedef struct drtm_dl_args_v1 struct_drtm_dl_args; 11740e1fad6SManish Pandey 118e62748e3SManish V Badarkhe #endif /* DRTM_MAIN_H */ 119