1a8aa7fecSYatharth Kochar /*
2*a5566f65SHarrison Mutai * Copyright (c) 2016-2024, Arm Limited and Contributors. All rights reserved.
3a8aa7fecSYatharth Kochar *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
5a8aa7fecSYatharth Kochar */
6a8aa7fecSYatharth Kochar
75b8d50e4SSathees Balya #include <assert.h>
809d40e0eSAntonio Nino Diaz #include <common/bl_common.h>
909d40e0eSAntonio Nino Diaz #include <common/desc_image_load.h>
10cb3b5344SManish Pandey #if defined(SPD_spmd)
11cb3b5344SManish Pandey #include <plat/arm/common/fconf_arm_sp_getter.h>
12cb3b5344SManish Pandey #endif
13bd9344f6SAntonio Nino Diaz #include <plat/arm/common/plat_arm.h>
1409d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
15a8aa7fecSYatharth Kochar
16a8aa7fecSYatharth Kochar #pragma weak plat_flush_next_bl_params
17a8aa7fecSYatharth Kochar #pragma weak plat_get_bl_image_load_info
18a8aa7fecSYatharth Kochar #pragma weak plat_get_next_bl_params
19a8aa7fecSYatharth Kochar
20*a5566f65SHarrison Mutai #if TRANSFER_LIST
21*a5566f65SHarrison Mutai static bl_params_t next_bl_params_cpy;
22*a5566f65SHarrison Mutai #endif
23*a5566f65SHarrison Mutai bl_params_t *next_bl_params_cpy_ptr;
24a8aa7fecSYatharth Kochar
25a8aa7fecSYatharth Kochar /*******************************************************************************
26a8aa7fecSYatharth Kochar * This function flushes the data structures so that they are visible
27a8aa7fecSYatharth Kochar * in memory for the next BL image.
28a8aa7fecSYatharth Kochar ******************************************************************************/
plat_flush_next_bl_params(void)29a8aa7fecSYatharth Kochar void plat_flush_next_bl_params(void)
30a8aa7fecSYatharth Kochar {
315b8d50e4SSathees Balya assert(next_bl_params_cpy_ptr != NULL);
325b8d50e4SSathees Balya
335b8d50e4SSathees Balya flush_bl_params_desc_args(bl_mem_params_desc_ptr,
345b8d50e4SSathees Balya bl_mem_params_desc_num,
355b8d50e4SSathees Balya next_bl_params_cpy_ptr);
36a8aa7fecSYatharth Kochar }
37a8aa7fecSYatharth Kochar
3846789a7cSBalint Dobszay #if defined(SPD_spmd) && BL2_ENABLE_SP_LOAD
39cb3b5344SManish Pandey /*******************************************************************************
40cb3b5344SManish Pandey * This function appends Secure Partitions to list of loadable images.
41cb3b5344SManish Pandey ******************************************************************************/
plat_add_sp_images_load_info(struct bl_load_info * load_info)42c33ff198SOlivier Deprez static void plat_add_sp_images_load_info(struct bl_load_info *load_info)
43cb3b5344SManish Pandey {
44abe6ce1dSHeyi Guo bl_load_info_node_t *curr_node = load_info->head;
45abe6ce1dSHeyi Guo bl_load_info_node_t *prev_node;
46cb3b5344SManish Pandey
47abe6ce1dSHeyi Guo /* Shortcut for empty SP list */
48abe6ce1dSHeyi Guo if (sp_mem_params_descs[0].image_id == 0) {
49cb3b5344SManish Pandey ERROR("No Secure Partition Image available\n");
50cb3b5344SManish Pandey return;
51cb3b5344SManish Pandey }
52cb3b5344SManish Pandey
53cb3b5344SManish Pandey /* Traverse through the bl images list */
54cb3b5344SManish Pandey do {
55abe6ce1dSHeyi Guo curr_node = curr_node->next_load_info;
56abe6ce1dSHeyi Guo } while (curr_node->next_load_info != NULL);
57cb3b5344SManish Pandey
58abe6ce1dSHeyi Guo prev_node = curr_node;
5947fe4c4fSHeyi Guo
60abe6ce1dSHeyi Guo for (unsigned int index = 0; index < MAX_SP_IDS; index++) {
61abe6ce1dSHeyi Guo if (sp_mem_params_descs[index].image_id == 0) {
62abe6ce1dSHeyi Guo return;
63abe6ce1dSHeyi Guo }
64abe6ce1dSHeyi Guo curr_node = &sp_mem_params_descs[index].load_node_mem;
65cb3b5344SManish Pandey /* Populate the image information */
66abe6ce1dSHeyi Guo curr_node->image_id = sp_mem_params_descs[index].image_id;
67abe6ce1dSHeyi Guo curr_node->image_info = &sp_mem_params_descs[index].image_info;
68cb3b5344SManish Pandey
69abe6ce1dSHeyi Guo prev_node->next_load_info = curr_node;
70abe6ce1dSHeyi Guo prev_node = curr_node;
71abe6ce1dSHeyi Guo }
72abe6ce1dSHeyi Guo
73cb3b5344SManish Pandey INFO("Reached Max number of SPs\n");
74cb3b5344SManish Pandey }
75cb3b5344SManish Pandey #endif
76cb3b5344SManish Pandey
77a8aa7fecSYatharth Kochar /*******************************************************************************
78a8aa7fecSYatharth Kochar * This function returns the list of loadable images.
79a8aa7fecSYatharth Kochar ******************************************************************************/
plat_get_bl_image_load_info(void)806c77e749SSandrine Bailleux struct bl_load_info *plat_get_bl_image_load_info(void)
81a8aa7fecSYatharth Kochar {
8246789a7cSBalint Dobszay #if defined(SPD_spmd) && BL2_ENABLE_SP_LOAD
83cb3b5344SManish Pandey bl_load_info_t *bl_load_info;
84cb3b5344SManish Pandey
85cb3b5344SManish Pandey bl_load_info = get_bl_load_info_from_mem_params_desc();
86cb3b5344SManish Pandey plat_add_sp_images_load_info(bl_load_info);
87cb3b5344SManish Pandey
88cb3b5344SManish Pandey return bl_load_info;
89cb3b5344SManish Pandey #else
90a8aa7fecSYatharth Kochar return get_bl_load_info_from_mem_params_desc();
91cb3b5344SManish Pandey #endif
92a8aa7fecSYatharth Kochar }
93a8aa7fecSYatharth Kochar
94a8aa7fecSYatharth Kochar /*******************************************************************************
955b8d50e4SSathees Balya * ARM helper function to return the list of executable images.Since the default
965b8d50e4SSathees Balya * descriptors are allocated within BL2 RW memory, this prevents BL31/BL32
975b8d50e4SSathees Balya * overlay of BL2 memory. Hence this function also copies the descriptors to a
985b8d50e4SSathees Balya * pre-allocated memory indicated by ARM_BL2_MEM_DESC_BASE.
995b8d50e4SSathees Balya ******************************************************************************/
arm_get_next_bl_params(void)1005b8d50e4SSathees Balya struct bl_params *arm_get_next_bl_params(void)
1015b8d50e4SSathees Balya {
102*a5566f65SHarrison Mutai bl_mem_params_node_t *bl2_mem_params_descs_cpy __unused;
103*a5566f65SHarrison Mutai const bl_params_t *next_bl_params __unused;
104*a5566f65SHarrison Mutai
105*a5566f65SHarrison Mutai #if TRANSFER_LIST
106*a5566f65SHarrison Mutai next_bl_params_cpy_ptr = &next_bl_params_cpy;
107*a5566f65SHarrison Mutai SET_PARAM_HEAD(next_bl_params_cpy_ptr, PARAM_BL_PARAMS, VERSION_2, 0U);
108*a5566f65SHarrison Mutai #else
109*a5566f65SHarrison Mutai bl2_mem_params_descs_cpy =
110*a5566f65SHarrison Mutai (bl_mem_params_node_t *)ARM_BL2_MEM_DESC_BASE;
1115b8d50e4SSathees Balya
1125b8d50e4SSathees Balya next_bl_params_cpy_ptr =
1135b8d50e4SSathees Balya (bl_params_t *)(ARM_BL2_MEM_DESC_BASE +
1145b8d50e4SSathees Balya (bl_mem_params_desc_num * sizeof(bl_mem_params_node_t)));
1155b8d50e4SSathees Balya
1165b8d50e4SSathees Balya /*
1175b8d50e4SSathees Balya * Copy the memory descriptors to ARM_BL2_MEM_DESC_BASE area.
1185b8d50e4SSathees Balya */
1195b8d50e4SSathees Balya (void) memcpy(bl2_mem_params_descs_cpy, bl_mem_params_desc_ptr,
1205b8d50e4SSathees Balya (bl_mem_params_desc_num * sizeof(bl_mem_params_node_t)));
1215b8d50e4SSathees Balya
1225b8d50e4SSathees Balya /*
1235b8d50e4SSathees Balya * Modify the global 'bl_mem_params_desc_ptr' to point to the
1245b8d50e4SSathees Balya * copied location.
1255b8d50e4SSathees Balya */
1265b8d50e4SSathees Balya bl_mem_params_desc_ptr = bl2_mem_params_descs_cpy;
1275b8d50e4SSathees Balya
1285b8d50e4SSathees Balya next_bl_params = get_next_bl_params_from_mem_params_desc();
1295b8d50e4SSathees Balya assert(next_bl_params != NULL);
1305b8d50e4SSathees Balya
1315b8d50e4SSathees Balya /*
1325b8d50e4SSathees Balya * Copy 'next_bl_params' to the reserved location after the copied
1335b8d50e4SSathees Balya * memory descriptors.
1345b8d50e4SSathees Balya */
1355b8d50e4SSathees Balya (void) memcpy(next_bl_params_cpy_ptr, next_bl_params,
1365b8d50e4SSathees Balya (sizeof(bl_params_t)));
1375b8d50e4SSathees Balya
1385b8d50e4SSathees Balya populate_next_bl_params_config(next_bl_params_cpy_ptr);
139*a5566f65SHarrison Mutai #endif /* TRANSFER_LIST */
1405b8d50e4SSathees Balya
1415b8d50e4SSathees Balya return next_bl_params_cpy_ptr;
1425b8d50e4SSathees Balya }
1435b8d50e4SSathees Balya
1445b8d50e4SSathees Balya /*******************************************************************************
1455b8d50e4SSathees Balya * This function returns the list of executable images
146a8aa7fecSYatharth Kochar ******************************************************************************/
plat_get_next_bl_params(void)1476c77e749SSandrine Bailleux struct bl_params *plat_get_next_bl_params(void)
148a8aa7fecSYatharth Kochar {
1495b8d50e4SSathees Balya return arm_get_next_bl_params();
150a8aa7fecSYatharth Kochar }
1515b8d50e4SSathees Balya
152