xref: /arm-trusted-firmware/services/std_svc/drtm/drtm_main.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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