xref: /arm-trusted-firmware/include/lib/transfer_list.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2023, Linaro Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef __TRANSFER_LIST_H
8*91f16700Schasinglulu #define __TRANSFER_LIST_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <stdbool.h>
11*91f16700Schasinglulu #include <stdint.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #include <lib/utils_def.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #define	TRANSFER_LIST_SIGNATURE		U(0x006ed0ff)
16*91f16700Schasinglulu #define TRANSFER_LIST_VERSION		U(0x0001)
17*91f16700Schasinglulu 
18*91f16700Schasinglulu // Init value of maximum alignment required by any TE data in the TL
19*91f16700Schasinglulu // specified as a power of two
20*91f16700Schasinglulu #define TRANSFER_LIST_INIT_MAX_ALIGN	U(3)
21*91f16700Schasinglulu 
22*91f16700Schasinglulu // alignment required by TE header start address, in bytes
23*91f16700Schasinglulu #define TRANSFER_LIST_GRANULE		U(8)
24*91f16700Schasinglulu 
25*91f16700Schasinglulu // version of the register convention used.
26*91f16700Schasinglulu // Set to 1 for both AArch64 and AArch32 according to fw handoff spec v0.9
27*91f16700Schasinglulu #define REGISTER_CONVENTION_VERSION_MASK (1 << 24)
28*91f16700Schasinglulu 
29*91f16700Schasinglulu #ifndef __ASSEMBLER__
30*91f16700Schasinglulu 
31*91f16700Schasinglulu enum transfer_list_tag_id {
32*91f16700Schasinglulu 	TL_TAG_EMPTY = 0,
33*91f16700Schasinglulu 	TL_TAG_FDT = 1,
34*91f16700Schasinglulu 	TL_TAG_HOB_BLOCK = 2,
35*91f16700Schasinglulu 	TL_TAG_HOB_LIST = 3,
36*91f16700Schasinglulu 	TL_TAG_ACPI_TABLE_AGGREGATE = 4,
37*91f16700Schasinglulu };
38*91f16700Schasinglulu 
39*91f16700Schasinglulu enum transfer_list_ops {
40*91f16700Schasinglulu 	TL_OPS_NON,	// invalid for any operation
41*91f16700Schasinglulu 	TL_OPS_ALL,	// valid for all operations
42*91f16700Schasinglulu 	TL_OPS_RO,	// valid for read only
43*91f16700Schasinglulu 	TL_OPS_CUS,	// either abort or switch to special code to interpret
44*91f16700Schasinglulu };
45*91f16700Schasinglulu 
46*91f16700Schasinglulu struct transfer_list_header {
47*91f16700Schasinglulu 	uint32_t	signature;
48*91f16700Schasinglulu 	uint8_t		checksum;
49*91f16700Schasinglulu 	uint8_t		version;
50*91f16700Schasinglulu 	uint8_t		hdr_size;
51*91f16700Schasinglulu 	uint8_t		alignment;	// max alignment of TE data
52*91f16700Schasinglulu 	uint32_t	size;		// TL header + all TEs
53*91f16700Schasinglulu 	uint32_t	max_size;
54*91f16700Schasinglulu 	/*
55*91f16700Schasinglulu 	 * Commented out element used to visualize dynamic part of the
56*91f16700Schasinglulu 	 * data structure.
57*91f16700Schasinglulu 	 *
58*91f16700Schasinglulu 	 * Note that struct transfer_list_entry also is dynamic in size
59*91f16700Schasinglulu 	 * so the elements can't be indexed directly but instead must be
60*91f16700Schasinglulu 	 * traversed in order
61*91f16700Schasinglulu 	 *
62*91f16700Schasinglulu 	 * struct transfer_list_entry entries[];
63*91f16700Schasinglulu 	 */
64*91f16700Schasinglulu };
65*91f16700Schasinglulu 
66*91f16700Schasinglulu struct transfer_list_entry {
67*91f16700Schasinglulu 	uint16_t	tag_id;
68*91f16700Schasinglulu 	uint8_t		reserved0;	// place holder
69*91f16700Schasinglulu 	uint8_t		hdr_size;
70*91f16700Schasinglulu 	uint32_t	data_size;
71*91f16700Schasinglulu 	/*
72*91f16700Schasinglulu 	 * Commented out element used to visualize dynamic part of the
73*91f16700Schasinglulu 	 * data structure.
74*91f16700Schasinglulu 	 *
75*91f16700Schasinglulu 	 * Note that padding is added at the end of @data to make to reach
76*91f16700Schasinglulu 	 * a 8-byte boundary.
77*91f16700Schasinglulu 	 *
78*91f16700Schasinglulu 	 * uint8_t	data[ROUNDUP(data_size, 8)];
79*91f16700Schasinglulu 	 */
80*91f16700Schasinglulu };
81*91f16700Schasinglulu 
82*91f16700Schasinglulu void transfer_list_dump(struct transfer_list_header *tl);
83*91f16700Schasinglulu struct transfer_list_header *transfer_list_init(void *addr, size_t max_size);
84*91f16700Schasinglulu 
85*91f16700Schasinglulu struct transfer_list_header *transfer_list_relocate(struct transfer_list_header *tl,
86*91f16700Schasinglulu 						    void *addr, size_t max_size);
87*91f16700Schasinglulu enum transfer_list_ops transfer_list_check_header(const struct transfer_list_header *tl);
88*91f16700Schasinglulu 
89*91f16700Schasinglulu void transfer_list_update_checksum(struct transfer_list_header *tl);
90*91f16700Schasinglulu bool transfer_list_verify_checksum(const struct transfer_list_header *tl);
91*91f16700Schasinglulu 
92*91f16700Schasinglulu bool transfer_list_set_data_size(struct transfer_list_header *tl,
93*91f16700Schasinglulu 				 struct transfer_list_entry *entry,
94*91f16700Schasinglulu 				 uint32_t new_data_size);
95*91f16700Schasinglulu 
96*91f16700Schasinglulu void *transfer_list_entry_data(struct transfer_list_entry *entry);
97*91f16700Schasinglulu bool transfer_list_rem(struct transfer_list_header *tl, struct transfer_list_entry *entry);
98*91f16700Schasinglulu 
99*91f16700Schasinglulu struct transfer_list_entry *transfer_list_add(struct transfer_list_header *tl,
100*91f16700Schasinglulu 					      uint16_t tag_id, uint32_t data_size,
101*91f16700Schasinglulu 					      const void *data);
102*91f16700Schasinglulu 
103*91f16700Schasinglulu struct transfer_list_entry *transfer_list_add_with_align(struct transfer_list_header *tl,
104*91f16700Schasinglulu 							 uint16_t tag_id, uint32_t data_size,
105*91f16700Schasinglulu 							 const void *data, uint8_t alignment);
106*91f16700Schasinglulu 
107*91f16700Schasinglulu struct transfer_list_entry *transfer_list_next(struct transfer_list_header *tl,
108*91f16700Schasinglulu 					       struct transfer_list_entry *last);
109*91f16700Schasinglulu 
110*91f16700Schasinglulu struct transfer_list_entry *transfer_list_find(struct transfer_list_header *tl,
111*91f16700Schasinglulu 					       uint16_t tag_id);
112*91f16700Schasinglulu 
113*91f16700Schasinglulu #endif /*__ASSEMBLER__*/
114*91f16700Schasinglulu #endif /*__TRANSFER_LIST_H*/
115