xref: /arm-trusted-firmware/plat/arm/common/arm_image_load.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2016-2021, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <common/bl_common.h>
9*91f16700Schasinglulu #include <common/desc_image_load.h>
10*91f16700Schasinglulu #if defined(SPD_spmd)
11*91f16700Schasinglulu #include <plat/arm/common/fconf_arm_sp_getter.h>
12*91f16700Schasinglulu #endif
13*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h>
14*91f16700Schasinglulu #include <plat/common/platform.h>
15*91f16700Schasinglulu 
16*91f16700Schasinglulu #pragma weak plat_flush_next_bl_params
17*91f16700Schasinglulu #pragma weak plat_get_bl_image_load_info
18*91f16700Schasinglulu #pragma weak plat_get_next_bl_params
19*91f16700Schasinglulu 
20*91f16700Schasinglulu static bl_params_t *next_bl_params_cpy_ptr;
21*91f16700Schasinglulu 
22*91f16700Schasinglulu /*******************************************************************************
23*91f16700Schasinglulu  * This function flushes the data structures so that they are visible
24*91f16700Schasinglulu  * in memory for the next BL image.
25*91f16700Schasinglulu  ******************************************************************************/
26*91f16700Schasinglulu void plat_flush_next_bl_params(void)
27*91f16700Schasinglulu {
28*91f16700Schasinglulu 	assert(next_bl_params_cpy_ptr != NULL);
29*91f16700Schasinglulu 
30*91f16700Schasinglulu 	flush_bl_params_desc_args(bl_mem_params_desc_ptr,
31*91f16700Schasinglulu 		bl_mem_params_desc_num,
32*91f16700Schasinglulu 		next_bl_params_cpy_ptr);
33*91f16700Schasinglulu }
34*91f16700Schasinglulu 
35*91f16700Schasinglulu #if defined(SPD_spmd) && BL2_ENABLE_SP_LOAD
36*91f16700Schasinglulu /*******************************************************************************
37*91f16700Schasinglulu  * This function appends Secure Partitions to list of loadable images.
38*91f16700Schasinglulu  ******************************************************************************/
39*91f16700Schasinglulu static void plat_add_sp_images_load_info(struct bl_load_info *load_info)
40*91f16700Schasinglulu {
41*91f16700Schasinglulu 	bl_load_info_node_t *curr_node = load_info->head;
42*91f16700Schasinglulu 	bl_load_info_node_t *prev_node;
43*91f16700Schasinglulu 
44*91f16700Schasinglulu 	/* Shortcut for empty SP list */
45*91f16700Schasinglulu 	if (sp_mem_params_descs[0].image_id == 0) {
46*91f16700Schasinglulu 		ERROR("No Secure Partition Image available\n");
47*91f16700Schasinglulu 		return;
48*91f16700Schasinglulu 	}
49*91f16700Schasinglulu 
50*91f16700Schasinglulu 	/* Traverse through the bl images list */
51*91f16700Schasinglulu 	do {
52*91f16700Schasinglulu 		curr_node = curr_node->next_load_info;
53*91f16700Schasinglulu 	} while (curr_node->next_load_info != NULL);
54*91f16700Schasinglulu 
55*91f16700Schasinglulu 	prev_node = curr_node;
56*91f16700Schasinglulu 
57*91f16700Schasinglulu 	for (unsigned int index = 0; index < MAX_SP_IDS; index++) {
58*91f16700Schasinglulu 		if (sp_mem_params_descs[index].image_id == 0) {
59*91f16700Schasinglulu 			return;
60*91f16700Schasinglulu 		}
61*91f16700Schasinglulu 		curr_node = &sp_mem_params_descs[index].load_node_mem;
62*91f16700Schasinglulu 		/* Populate the image information */
63*91f16700Schasinglulu 		curr_node->image_id = sp_mem_params_descs[index].image_id;
64*91f16700Schasinglulu 		curr_node->image_info = &sp_mem_params_descs[index].image_info;
65*91f16700Schasinglulu 
66*91f16700Schasinglulu 		prev_node->next_load_info = curr_node;
67*91f16700Schasinglulu 		prev_node = curr_node;
68*91f16700Schasinglulu 	}
69*91f16700Schasinglulu 
70*91f16700Schasinglulu 	INFO("Reached Max number of SPs\n");
71*91f16700Schasinglulu }
72*91f16700Schasinglulu #endif
73*91f16700Schasinglulu 
74*91f16700Schasinglulu /*******************************************************************************
75*91f16700Schasinglulu  * This function returns the list of loadable images.
76*91f16700Schasinglulu  ******************************************************************************/
77*91f16700Schasinglulu struct bl_load_info *plat_get_bl_image_load_info(void)
78*91f16700Schasinglulu {
79*91f16700Schasinglulu #if defined(SPD_spmd) && BL2_ENABLE_SP_LOAD
80*91f16700Schasinglulu 	bl_load_info_t *bl_load_info;
81*91f16700Schasinglulu 
82*91f16700Schasinglulu 	bl_load_info = get_bl_load_info_from_mem_params_desc();
83*91f16700Schasinglulu 	plat_add_sp_images_load_info(bl_load_info);
84*91f16700Schasinglulu 
85*91f16700Schasinglulu 	return bl_load_info;
86*91f16700Schasinglulu #else
87*91f16700Schasinglulu 	return get_bl_load_info_from_mem_params_desc();
88*91f16700Schasinglulu #endif
89*91f16700Schasinglulu }
90*91f16700Schasinglulu 
91*91f16700Schasinglulu /*******************************************************************************
92*91f16700Schasinglulu  * ARM helper function to return the list of executable images.Since the default
93*91f16700Schasinglulu  * descriptors are allocated within BL2 RW memory, this prevents BL31/BL32
94*91f16700Schasinglulu  * overlay of BL2 memory. Hence this function also copies the descriptors to a
95*91f16700Schasinglulu  * pre-allocated memory indicated by ARM_BL2_MEM_DESC_BASE.
96*91f16700Schasinglulu  ******************************************************************************/
97*91f16700Schasinglulu struct bl_params *arm_get_next_bl_params(void)
98*91f16700Schasinglulu {
99*91f16700Schasinglulu 	bl_mem_params_node_t *bl2_mem_params_descs_cpy
100*91f16700Schasinglulu 			= (bl_mem_params_node_t *)ARM_BL2_MEM_DESC_BASE;
101*91f16700Schasinglulu 	const bl_params_t *next_bl_params;
102*91f16700Schasinglulu 
103*91f16700Schasinglulu 	next_bl_params_cpy_ptr =
104*91f16700Schasinglulu 		(bl_params_t *)(ARM_BL2_MEM_DESC_BASE +
105*91f16700Schasinglulu 		(bl_mem_params_desc_num * sizeof(bl_mem_params_node_t)));
106*91f16700Schasinglulu 
107*91f16700Schasinglulu 	/*
108*91f16700Schasinglulu 	 * Copy the memory descriptors to ARM_BL2_MEM_DESC_BASE area.
109*91f16700Schasinglulu 	 */
110*91f16700Schasinglulu 	(void) memcpy(bl2_mem_params_descs_cpy, bl_mem_params_desc_ptr,
111*91f16700Schasinglulu 		(bl_mem_params_desc_num * sizeof(bl_mem_params_node_t)));
112*91f16700Schasinglulu 
113*91f16700Schasinglulu 	/*
114*91f16700Schasinglulu 	 * Modify the global 'bl_mem_params_desc_ptr' to point to the
115*91f16700Schasinglulu 	 * copied location.
116*91f16700Schasinglulu 	 */
117*91f16700Schasinglulu 	bl_mem_params_desc_ptr = bl2_mem_params_descs_cpy;
118*91f16700Schasinglulu 
119*91f16700Schasinglulu 	next_bl_params = get_next_bl_params_from_mem_params_desc();
120*91f16700Schasinglulu 	assert(next_bl_params != NULL);
121*91f16700Schasinglulu 
122*91f16700Schasinglulu 	/*
123*91f16700Schasinglulu 	 * Copy 'next_bl_params' to the reserved location after the copied
124*91f16700Schasinglulu 	 * memory descriptors.
125*91f16700Schasinglulu 	 */
126*91f16700Schasinglulu 	(void) memcpy(next_bl_params_cpy_ptr, next_bl_params,
127*91f16700Schasinglulu 						(sizeof(bl_params_t)));
128*91f16700Schasinglulu 
129*91f16700Schasinglulu 	populate_next_bl_params_config(next_bl_params_cpy_ptr);
130*91f16700Schasinglulu 
131*91f16700Schasinglulu 	return next_bl_params_cpy_ptr;
132*91f16700Schasinglulu }
133*91f16700Schasinglulu 
134*91f16700Schasinglulu /*******************************************************************************
135*91f16700Schasinglulu  * This function returns the list of executable images
136*91f16700Schasinglulu  ******************************************************************************/
137*91f16700Schasinglulu struct bl_params *plat_get_next_bl_params(void)
138*91f16700Schasinglulu {
139*91f16700Schasinglulu 	return arm_get_next_bl_params();
140*91f16700Schasinglulu }
141*91f16700Schasinglulu 
142