1e62748e3SManish V Badarkhe /* 2e62748e3SManish V Badarkhe * Copyright (c) 2022 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 12*40e1fad6SManish 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 17*40e1fad6SManish Pandey #define ALIGNED_UP(x, a) __extension__ ({ \ 18*40e1fad6SManish Pandey __typeof__(a) _a = (a); \ 19*40e1fad6SManish Pandey __typeof__(a) _one = 1; \ 20*40e1fad6SManish Pandey assert(IS_POWER_OF_TWO(_a)); \ 21*40e1fad6SManish Pandey ((x) + (_a - _one)) & ~(_a - _one); \ 22*40e1fad6SManish Pandey }) 23*40e1fad6SManish Pandey 24*40e1fad6SManish Pandey #define ALIGNED_DOWN(x, a) __extension__ ({ \ 25*40e1fad6SManish Pandey __typeof__(a) _a = (a); \ 26*40e1fad6SManish Pandey __typeof__(a) _one = 1; \ 27*40e1fad6SManish Pandey assert(IS_POWER_OF_TWO(_a)); \ 28*40e1fad6SManish Pandey (x) & ~(_a - _one); \ 29*40e1fad6SManish Pandey }) 30*40e1fad6SManish Pandey 31*40e1fad6SManish Pandey #define DRTM_PAGE_SIZE (4 * (1 << 10)) 32*40e1fad6SManish Pandey #define DRTM_PAGE_SIZE_STR "4-KiB" 33*40e1fad6SManish Pandey 34e62748e3SManish V Badarkhe enum drtm_retc { 35e62748e3SManish V Badarkhe SUCCESS = SMC_OK, 36e62748e3SManish V Badarkhe NOT_SUPPORTED = SMC_UNK, 37e62748e3SManish V Badarkhe INVALID_PARAMETERS = -2, 38e62748e3SManish V Badarkhe DENIED = -3, 39e62748e3SManish V Badarkhe NOT_FOUND = -4, 40e62748e3SManish V Badarkhe INTERNAL_ERROR = -5, 41e62748e3SManish V Badarkhe MEM_PROTECT_INVALID = -6, 42e62748e3SManish V Badarkhe }; 43e62748e3SManish V Badarkhe 442a1cdee4Sjohpow01 typedef struct { 452a1cdee4Sjohpow01 uint64_t tpm_features; 462a1cdee4Sjohpow01 uint64_t minimum_memory_requirement; 472a1cdee4Sjohpow01 uint64_t dma_prot_features; 482a1cdee4Sjohpow01 uint64_t boot_pe_id; 492a1cdee4Sjohpow01 uint64_t tcb_hash_features; 502a1cdee4Sjohpow01 } drtm_features_t; 512a1cdee4Sjohpow01 52*40e1fad6SManish Pandey struct __packed drtm_dl_args_v1 { 53*40e1fad6SManish Pandey uint16_t version; /* Must be 1. */ 54*40e1fad6SManish Pandey uint8_t __res[2]; 55*40e1fad6SManish Pandey uint32_t features; 56*40e1fad6SManish Pandey uint64_t dlme_paddr; 57*40e1fad6SManish Pandey uint64_t dlme_size; 58*40e1fad6SManish Pandey uint64_t dlme_img_off; 59*40e1fad6SManish Pandey uint64_t dlme_img_ep_off; 60*40e1fad6SManish Pandey uint64_t dlme_img_size; 61*40e1fad6SManish Pandey uint64_t dlme_data_off; 62*40e1fad6SManish Pandey uint64_t dce_nwd_paddr; 63*40e1fad6SManish Pandey uint64_t dce_nwd_size; 64*40e1fad6SManish Pandey drtm_dl_dma_prot_args_v1_t dma_prot_args; 65*40e1fad6SManish Pandey } __aligned(__alignof(uint16_t /* First member's type, `uint16_t version' */)); 66*40e1fad6SManish Pandey 672a1cdee4Sjohpow01 drtm_memory_region_descriptor_table_t *drtm_build_address_map(void); 682a1cdee4Sjohpow01 uint64_t drtm_get_address_map_size(void); 692a1cdee4Sjohpow01 70*40e1fad6SManish Pandey /* 71*40e1fad6SManish Pandey * Version-independent type. May be used to avoid excessive line of code 72*40e1fad6SManish Pandey * changes when migrating to new struct versions. 73*40e1fad6SManish Pandey */ 74*40e1fad6SManish Pandey typedef struct drtm_dl_args_v1 struct_drtm_dl_args; 75*40e1fad6SManish Pandey 76e62748e3SManish V Badarkhe #endif /* DRTM_MAIN_H */ 77