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