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