blob: c105b56a792f535284840771b258996b9d4feb7e [file] [log] [blame]
Manish V Badarkhe8a766032022-02-23 11:26:53 +00001/*
Stuart Yoder8ee38522024-01-09 17:51:38 -06002 * Copyright (c) 2022-2024 Arm Limited. All rights reserved.
Manish V Badarkhe8a766032022-02-23 11:26:53 +00003 *
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 Pandeyfef989c2022-06-21 15:36:45 +010012#include <assert.h>
Manish V Badarkhe8a766032022-02-23 11:26:53 +000013#include <lib/smccc.h>
14
Manish V Badarkhecc2c7432022-02-24 20:22:39 +000015#include "drtm_dma_prot.h"
16
Manish Pandeyfef989c2022-06-21 15:36:45 +010017#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 Badarkhead035ce2022-06-21 18:08:50 +010034#define DL_ARGS_GET_DMA_PROT_TYPE(a) (((a)->features >> 3) & 0x7U)
Manish V Badarkhe19b22f92022-06-17 11:42:17 +010035#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 Badarkhe24cb9202022-09-21 10:04:16 +010039/*
Manish V Badarkhe9a578ba2024-12-11 17:49:29 +000040 * Minimum size of Event Log in DLME data (64 KiB)
41 */
42#define ARM_DRTM_MIN_EVENT_LOG_SIZE U(0x10000)
43
44/*
Manish V Badarkhe24cb9202022-09-21 10:04:16 +010045 * Range(Min/Max) of DRTM parameter structure versions supported
46 */
47#define ARM_DRTM_PARAMS_MIN_VERSION U(1)
48#define ARM_DRTM_PARAMS_MAX_VERSION U(1)
49
Manish Pandeycabcad52022-06-23 10:43:31 +010050enum drtm_dlme_el {
51 DLME_AT_EL1 = MODE_EL1,
52 DLME_AT_EL2 = MODE_EL2
53};
54
Manish V Badarkhe8a766032022-02-23 11:26:53 +000055enum drtm_retc {
56 SUCCESS = SMC_OK,
57 NOT_SUPPORTED = SMC_UNK,
58 INVALID_PARAMETERS = -2,
59 DENIED = -3,
60 NOT_FOUND = -4,
61 INTERNAL_ERROR = -5,
62 MEM_PROTECT_INVALID = -6,
Stuart Yoder8ee38522024-01-09 17:51:38 -060063 COPROCESSOR_ERROR = -7,
64 OUT_OF_RESOURCE = -8,
65 INVALID_DATA = -9,
66 SECONDARY_PE_NOT_OFF = -10,
67 ALREADY_CLOSED = -11,
68 TPM_ERROR = -12
Manish V Badarkhe8a766032022-02-23 11:26:53 +000069};
70
johpow01baa3e6c2022-03-11 17:50:58 -060071typedef struct {
72 uint64_t tpm_features;
73 uint64_t minimum_memory_requirement;
74 uint64_t dma_prot_features;
75 uint64_t boot_pe_id;
76 uint64_t tcb_hash_features;
77} drtm_features_t;
78
Manish Pandeyfef989c2022-06-21 15:36:45 +010079struct __packed drtm_dl_args_v1 {
Manish V Badarkhea28563e2022-06-22 13:11:14 +010080 uint16_t version; /* Must be 1. */
Manish Pandeyfef989c2022-06-21 15:36:45 +010081 uint8_t __res[2];
82 uint32_t features;
83 uint64_t dlme_paddr;
84 uint64_t dlme_size;
85 uint64_t dlme_img_off;
86 uint64_t dlme_img_ep_off;
87 uint64_t dlme_img_size;
88 uint64_t dlme_data_off;
89 uint64_t dce_nwd_paddr;
90 uint64_t dce_nwd_size;
91 drtm_dl_dma_prot_args_v1_t dma_prot_args;
92} __aligned(__alignof(uint16_t /* First member's type, `uint16_t version' */));
93
Manish V Badarkhea28563e2022-06-22 13:11:14 +010094struct __packed dlme_data_header_v1 {
95 uint16_t version; /* Must be 1. */
96 uint16_t this_hdr_size;
97 uint8_t __res[4];
98 uint64_t dlme_data_size;
99 uint64_t dlme_prot_regions_size;
100 uint64_t dlme_addr_map_size;
101 uint64_t dlme_tpm_log_size;
102 uint64_t dlme_tcb_hashes_table_size;
Stuart Yoderbb0d9c52024-01-10 14:10:45 -0600103 uint64_t dlme_acpi_tables_region_size;
Manish V Badarkhea28563e2022-06-22 13:11:14 +0100104 uint64_t dlme_impdef_region_size;
105} __aligned(__alignof(uint16_t /* First member's type, `uint16_t version'. */));
106
107typedef struct dlme_data_header_v1 struct_dlme_data_header;
108
johpow01baa3e6c2022-03-11 17:50:58 -0600109drtm_memory_region_descriptor_table_t *drtm_build_address_map(void);
110uint64_t drtm_get_address_map_size(void);
111
Manish Pandeyfef989c2022-06-21 15:36:45 +0100112/*
113 * Version-independent type. May be used to avoid excessive line of code
114 * changes when migrating to new struct versions.
115 */
116typedef struct drtm_dl_args_v1 struct_drtm_dl_args;
117
Manish V Badarkhe8a766032022-02-23 11:26:53 +0000118#endif /* DRTM_MAIN_H */