xref: /rk3399_ARM-atf/plat/amd/common/plat_xfer_list.c (revision 3690228c21db89bec9859ccddccdb1742da35440)
1c41edd80SMaheedhar Bollapalli /*
2c41edd80SMaheedhar Bollapalli  * Copyright (c) 2023-2025, Advanced Micro Devices, Inc. All rights reserved.
3c41edd80SMaheedhar Bollapalli  *
4c41edd80SMaheedhar Bollapalli  * SPDX-License-Identifier: BSD-3-Clause
5c41edd80SMaheedhar Bollapalli  */
6c41edd80SMaheedhar Bollapalli #include <stddef.h>
7b5d0740eSHarrison Mutai 
8ea453871SMaheedhar Bollapalli #include <platform_def.h>
9c41edd80SMaheedhar Bollapalli 
10b5d0740eSHarrison Mutai #include <arch_helpers.h>
11b5d0740eSHarrison Mutai #include <common/debug.h>
12b5d0740eSHarrison Mutai #include <transfer_list.h>
13c41edd80SMaheedhar Bollapalli 
14c41edd80SMaheedhar Bollapalli static struct transfer_list_header *tl_hdr;
15ea453871SMaheedhar Bollapalli static int32_t tl_ops_holder;
16ea453871SMaheedhar Bollapalli 
populate_data_from_xfer_list(void)17ea453871SMaheedhar Bollapalli bool populate_data_from_xfer_list(void)
18ea453871SMaheedhar Bollapalli {
19ea453871SMaheedhar Bollapalli 	bool ret = true;
20ea453871SMaheedhar Bollapalli 
21ea453871SMaheedhar Bollapalli 	tl_hdr = (struct transfer_list_header *)FW_HANDOFF_BASE;
22ea453871SMaheedhar Bollapalli 	tl_ops_holder = transfer_list_check_header(tl_hdr);
23ea453871SMaheedhar Bollapalli 
24ea453871SMaheedhar Bollapalli 	if ((tl_ops_holder != TL_OPS_ALL) && (tl_ops_holder != TL_OPS_RO)) {
25ea453871SMaheedhar Bollapalli 		ret = false;
26ea453871SMaheedhar Bollapalli 	}
27ea453871SMaheedhar Bollapalli 
28ea453871SMaheedhar Bollapalli 	return ret;
29ea453871SMaheedhar Bollapalli }
30c41edd80SMaheedhar Bollapalli 
transfer_list_populate_ep_info(entry_point_info_t * bl32,entry_point_info_t * bl33)31c41edd80SMaheedhar Bollapalli int32_t transfer_list_populate_ep_info(entry_point_info_t *bl32,
32c41edd80SMaheedhar Bollapalli 				       entry_point_info_t *bl33)
33c41edd80SMaheedhar Bollapalli {
34ea453871SMaheedhar Bollapalli 	int32_t ret = tl_ops_holder;
35c41edd80SMaheedhar Bollapalli 	struct transfer_list_entry *te = NULL;
36ea453871SMaheedhar Bollapalli 	struct entry_point_info *ep = NULL;
37c41edd80SMaheedhar Bollapalli 
38ea453871SMaheedhar Bollapalli 	if ((tl_ops_holder == TL_OPS_ALL) || (tl_ops_holder == TL_OPS_RO)) {
39c41edd80SMaheedhar Bollapalli 		transfer_list_dump(tl_hdr);
40c41edd80SMaheedhar Bollapalli 		while ((te = transfer_list_next(tl_hdr, te)) != NULL) {
41c41edd80SMaheedhar Bollapalli 			ep = transfer_list_entry_data(te);
42c41edd80SMaheedhar Bollapalli 			if (te->tag_id == TL_TAG_EXEC_EP_INFO64) {
43c41edd80SMaheedhar Bollapalli 				switch (GET_SECURITY_STATE(ep->h.attr)) {
44c41edd80SMaheedhar Bollapalli 				case NON_SECURE:
45c41edd80SMaheedhar Bollapalli 					*bl33 = *ep;
46*90294080SSaivardhan Thatikonda 					break;
47c41edd80SMaheedhar Bollapalli 				case SECURE:
48c41edd80SMaheedhar Bollapalli 					*bl32 = *ep;
49573ec228SAkshay Belsare #if defined(SPD_opteed)
50573ec228SAkshay Belsare 					/*
51573ec228SAkshay Belsare 					 * Populate the args expected by opteed,
52573ec228SAkshay Belsare 					 * arg0 - dt address,
53573ec228SAkshay Belsare 					 * arg1 - Xfer List Convention Version,
54573ec228SAkshay Belsare 					 * arg3 - Xfer List address
55573ec228SAkshay Belsare 					 * remaining args are set to 0.
56573ec228SAkshay Belsare 					 */
57573ec228SAkshay Belsare 					if (transfer_list_set_handoff_args(tl_hdr, bl32) == NULL) {
581fb3446eSMaheedhar Bollapalli 						ERROR("Invalid transfer list\n");
591fb3446eSMaheedhar Bollapalli 					}
60573ec228SAkshay Belsare #endif /* SPD_opteed */
61*90294080SSaivardhan Thatikonda 					break;
62c41edd80SMaheedhar Bollapalli 				default:
63c41edd80SMaheedhar Bollapalli 					ERROR("Unrecognized Image Security State %lu\n",
64c41edd80SMaheedhar Bollapalli 					      GET_SECURITY_STATE(ep->h.attr));
65c41edd80SMaheedhar Bollapalli 					ret = TL_OPS_NON;
66c41edd80SMaheedhar Bollapalli 				}
67*90294080SSaivardhan Thatikonda 				/*
68*90294080SSaivardhan Thatikonda 				 * Clearing the transfer list handoff entry data.
69*90294080SSaivardhan Thatikonda 				 */
70*90294080SSaivardhan Thatikonda 				memset(ep, 0, te->data_size);
71*90294080SSaivardhan Thatikonda 
72*90294080SSaivardhan Thatikonda 				if (transfer_list_rem(tl_hdr, te) == false) {
73*90294080SSaivardhan Thatikonda 					INFO("Failed to remove handoff info\n");
74*90294080SSaivardhan Thatikonda 				}
75c41edd80SMaheedhar Bollapalli 			}
76c41edd80SMaheedhar Bollapalli 		}
77c41edd80SMaheedhar Bollapalli 	}
78ea453871SMaheedhar Bollapalli 
79c41edd80SMaheedhar Bollapalli 	return ret;
80c41edd80SMaheedhar Bollapalli }
81ea453871SMaheedhar Bollapalli 
transfer_list_retrieve_dt_address(void)82ea453871SMaheedhar Bollapalli void *transfer_list_retrieve_dt_address(void)
83ea453871SMaheedhar Bollapalli {
84ea453871SMaheedhar Bollapalli 	void *dtb = NULL;
85ea453871SMaheedhar Bollapalli 	struct transfer_list_entry *te = NULL;
86ea453871SMaheedhar Bollapalli 
87ea453871SMaheedhar Bollapalli 	if ((tl_ops_holder == TL_OPS_ALL) || (tl_ops_holder == TL_OPS_RO)) {
88ea453871SMaheedhar Bollapalli 		te = transfer_list_find(tl_hdr, TL_TAG_FDT);
89ea453871SMaheedhar Bollapalli 		if (te != NULL) {
90ea453871SMaheedhar Bollapalli 			dtb = transfer_list_entry_data(te);
91ea453871SMaheedhar Bollapalli 		}
92ea453871SMaheedhar Bollapalli 	}
93ea453871SMaheedhar Bollapalli 
94ea453871SMaheedhar Bollapalli 	return dtb;
95ea453871SMaheedhar Bollapalli }
96