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