xref: /arm-trusted-firmware/plat/qemu/common/qemu_bl2_mem_params_desc.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2017-2022, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <platform_def.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/desc_image_load.h>
10*91f16700Schasinglulu #include <plat/common/platform.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #define SP_PKG_ENTRY(id) \
13*91f16700Schasinglulu 	{ \
14*91f16700Schasinglulu 		.image_id = (id), \
15*91f16700Schasinglulu 		SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY, VERSION_2, \
16*91f16700Schasinglulu 				      entry_point_info_t, \
17*91f16700Schasinglulu 				      SECURE | NON_EXECUTABLE), \
18*91f16700Schasinglulu 		SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY, \
19*91f16700Schasinglulu 				      VERSION_2, image_info_t, \
20*91f16700Schasinglulu 				      IMAGE_ATTRIB_SKIP_LOADING), \
21*91f16700Schasinglulu 		.next_handoff_image_id = INVALID_IMAGE_ID, \
22*91f16700Schasinglulu 	}
23*91f16700Schasinglulu 
24*91f16700Schasinglulu /*******************************************************************************
25*91f16700Schasinglulu  * Following descriptor provides BL image/ep information that gets used
26*91f16700Schasinglulu  * by BL2 to load the images and also subset of this information is
27*91f16700Schasinglulu  * passed to next BL image. The image loading sequence is managed by
28*91f16700Schasinglulu  * populating the images in required loading order. The image execution
29*91f16700Schasinglulu  * sequence is managed by populating the `next_handoff_image_id` with
30*91f16700Schasinglulu  * the next executable image id.
31*91f16700Schasinglulu  ******************************************************************************/
32*91f16700Schasinglulu static bl_mem_params_node_t bl2_mem_params_descs[] = {
33*91f16700Schasinglulu #ifdef EL3_PAYLOAD_BASE
34*91f16700Schasinglulu 	/* Fill EL3 payload related information (BL31 is EL3 payload) */
35*91f16700Schasinglulu 	{ .image_id = BL31_IMAGE_ID,
36*91f16700Schasinglulu 
37*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
38*91f16700Schasinglulu 				entry_point_info_t,
39*91f16700Schasinglulu 				SECURE | EXECUTABLE | EP_FIRST_EXE),
40*91f16700Schasinglulu 	  .ep_info.pc = EL3_PAYLOAD_BASE,
41*91f16700Schasinglulu 	  .ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
42*91f16700Schasinglulu 				  DISABLE_ALL_EXCEPTIONS),
43*91f16700Schasinglulu 
44*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
45*91f16700Schasinglulu 				IMAGE_ATTRIB_PLAT_SETUP | IMAGE_ATTRIB_SKIP_LOADING),
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 	  .next_handoff_image_id = INVALID_IMAGE_ID,
48*91f16700Schasinglulu 	},
49*91f16700Schasinglulu #else /* EL3_PAYLOAD_BASE */
50*91f16700Schasinglulu #ifdef __aarch64__
51*91f16700Schasinglulu 	/* Fill BL31 related information */
52*91f16700Schasinglulu 	{ .image_id = BL31_IMAGE_ID,
53*91f16700Schasinglulu 
54*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
55*91f16700Schasinglulu 				entry_point_info_t,
56*91f16700Schasinglulu 				SECURE | EXECUTABLE | EP_FIRST_EXE),
57*91f16700Schasinglulu 	  .ep_info.pc = BL31_BASE,
58*91f16700Schasinglulu 	  .ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
59*91f16700Schasinglulu 				  DISABLE_ALL_EXCEPTIONS),
60*91f16700Schasinglulu # if DEBUG
61*91f16700Schasinglulu 	  .ep_info.args.arg1 = QEMU_BL31_PLAT_PARAM_VAL,
62*91f16700Schasinglulu # endif
63*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
64*91f16700Schasinglulu 				IMAGE_ATTRIB_PLAT_SETUP),
65*91f16700Schasinglulu 	  .image_info.image_base = BL31_BASE,
66*91f16700Schasinglulu 	  .image_info.image_max_size = BL31_LIMIT - BL31_BASE,
67*91f16700Schasinglulu 
68*91f16700Schasinglulu # ifdef QEMU_LOAD_BL32
69*91f16700Schasinglulu 	  .next_handoff_image_id = BL32_IMAGE_ID,
70*91f16700Schasinglulu # else
71*91f16700Schasinglulu 	  .next_handoff_image_id = BL33_IMAGE_ID,
72*91f16700Schasinglulu # endif
73*91f16700Schasinglulu 	},
74*91f16700Schasinglulu #endif /* __aarch64__ */
75*91f16700Schasinglulu # ifdef QEMU_LOAD_BL32
76*91f16700Schasinglulu 
77*91f16700Schasinglulu #ifdef __aarch64__
78*91f16700Schasinglulu #define BL32_EP_ATTRIBS		(SECURE | EXECUTABLE)
79*91f16700Schasinglulu #define BL32_IMG_ATTRIBS	0
80*91f16700Schasinglulu #else
81*91f16700Schasinglulu #define BL32_EP_ATTRIBS		(SECURE | EXECUTABLE | EP_FIRST_EXE)
82*91f16700Schasinglulu #define BL32_IMG_ATTRIBS	IMAGE_ATTRIB_PLAT_SETUP
83*91f16700Schasinglulu #endif
84*91f16700Schasinglulu 
85*91f16700Schasinglulu 	/* Fill BL32 related information */
86*91f16700Schasinglulu 	{ .image_id = BL32_IMAGE_ID,
87*91f16700Schasinglulu 
88*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
89*91f16700Schasinglulu 				entry_point_info_t, BL32_EP_ATTRIBS),
90*91f16700Schasinglulu 	  .ep_info.pc = BL32_BASE,
91*91f16700Schasinglulu 
92*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
93*91f16700Schasinglulu 				image_info_t, BL32_IMG_ATTRIBS),
94*91f16700Schasinglulu 
95*91f16700Schasinglulu 	  .image_info.image_base = BL32_BASE,
96*91f16700Schasinglulu 	  .image_info.image_max_size = BL32_LIMIT - BL32_BASE,
97*91f16700Schasinglulu 
98*91f16700Schasinglulu 	  .next_handoff_image_id = BL33_IMAGE_ID,
99*91f16700Schasinglulu 	},
100*91f16700Schasinglulu 
101*91f16700Schasinglulu 	/*
102*91f16700Schasinglulu 	 * Fill BL32 external 1 related information.
103*91f16700Schasinglulu 	 * A typical use for extra1 image is with OP-TEE where it is the
104*91f16700Schasinglulu 	 * pager image.
105*91f16700Schasinglulu 	 */
106*91f16700Schasinglulu 	{ .image_id = BL32_EXTRA1_IMAGE_ID,
107*91f16700Schasinglulu 
108*91f16700Schasinglulu 	   SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
109*91f16700Schasinglulu 				 entry_point_info_t, SECURE | NON_EXECUTABLE),
110*91f16700Schasinglulu 
111*91f16700Schasinglulu 	   SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
112*91f16700Schasinglulu 				 image_info_t, IMAGE_ATTRIB_SKIP_LOADING),
113*91f16700Schasinglulu 	   .image_info.image_base = BL32_BASE,
114*91f16700Schasinglulu 	   .image_info.image_max_size = BL32_LIMIT - BL32_BASE,
115*91f16700Schasinglulu 
116*91f16700Schasinglulu 	   .next_handoff_image_id = INVALID_IMAGE_ID,
117*91f16700Schasinglulu 	},
118*91f16700Schasinglulu 
119*91f16700Schasinglulu 	/*
120*91f16700Schasinglulu 	 * Fill BL32 external 2 related information.
121*91f16700Schasinglulu 	 * A typical use for extra2 image is with OP-TEE where it is the
122*91f16700Schasinglulu 	 * paged image.
123*91f16700Schasinglulu 	 */
124*91f16700Schasinglulu 	{ .image_id = BL32_EXTRA2_IMAGE_ID,
125*91f16700Schasinglulu 
126*91f16700Schasinglulu 	   SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
127*91f16700Schasinglulu 				 entry_point_info_t, SECURE | NON_EXECUTABLE),
128*91f16700Schasinglulu 
129*91f16700Schasinglulu 	   SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
130*91f16700Schasinglulu 				 image_info_t, IMAGE_ATTRIB_SKIP_LOADING),
131*91f16700Schasinglulu #if defined(SPD_opteed) || defined(AARCH32_SP_OPTEE) || defined(SPMC_OPTEE)
132*91f16700Schasinglulu 	   .image_info.image_base = QEMU_OPTEE_PAGEABLE_LOAD_BASE,
133*91f16700Schasinglulu 	   .image_info.image_max_size = QEMU_OPTEE_PAGEABLE_LOAD_SIZE,
134*91f16700Schasinglulu #endif
135*91f16700Schasinglulu 	   .next_handoff_image_id = INVALID_IMAGE_ID,
136*91f16700Schasinglulu 	},
137*91f16700Schasinglulu 
138*91f16700Schasinglulu #if defined(SPD_spmd)
139*91f16700Schasinglulu 	/* Fill TOS_FW_CONFIG related information */
140*91f16700Schasinglulu 	{
141*91f16700Schasinglulu 	    .image_id = TOS_FW_CONFIG_ID,
142*91f16700Schasinglulu 	    SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY,
143*91f16700Schasinglulu 		    VERSION_2, entry_point_info_t, SECURE | NON_EXECUTABLE),
144*91f16700Schasinglulu 	    SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
145*91f16700Schasinglulu 		    VERSION_2, image_info_t, 0),
146*91f16700Schasinglulu 	    .image_info.image_base = TOS_FW_CONFIG_BASE,
147*91f16700Schasinglulu 	    .image_info.image_max_size = TOS_FW_CONFIG_LIMIT -
148*91f16700Schasinglulu 					 TOS_FW_CONFIG_BASE,
149*91f16700Schasinglulu 	    .next_handoff_image_id = INVALID_IMAGE_ID,
150*91f16700Schasinglulu 	},
151*91f16700Schasinglulu 
152*91f16700Schasinglulu #if SPMD_SPM_AT_SEL2
153*91f16700Schasinglulu 	/* Fill TB_FW_CONFIG related information */
154*91f16700Schasinglulu 	{
155*91f16700Schasinglulu 	    .image_id = TB_FW_CONFIG_ID,
156*91f16700Schasinglulu 	    SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY,
157*91f16700Schasinglulu 		    VERSION_2, entry_point_info_t, SECURE | NON_EXECUTABLE),
158*91f16700Schasinglulu 	    SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
159*91f16700Schasinglulu 		    VERSION_2, image_info_t, 0),
160*91f16700Schasinglulu 	    .image_info.image_base = TB_FW_CONFIG_BASE,
161*91f16700Schasinglulu 	    .image_info.image_max_size = TB_FW_CONFIG_LIMIT - TB_FW_CONFIG_BASE,
162*91f16700Schasinglulu 	    .next_handoff_image_id = INVALID_IMAGE_ID,
163*91f16700Schasinglulu 	},
164*91f16700Schasinglulu 
165*91f16700Schasinglulu 	/*
166*91f16700Schasinglulu 	 * Empty entries for SP packages to be filled in according to
167*91f16700Schasinglulu 	 * TB_FW_CONFIG.
168*91f16700Schasinglulu 	 */
169*91f16700Schasinglulu 	SP_PKG_ENTRY(SP_PKG1_ID),
170*91f16700Schasinglulu 	SP_PKG_ENTRY(SP_PKG2_ID),
171*91f16700Schasinglulu 	SP_PKG_ENTRY(SP_PKG3_ID),
172*91f16700Schasinglulu 	SP_PKG_ENTRY(SP_PKG4_ID),
173*91f16700Schasinglulu 	SP_PKG_ENTRY(SP_PKG5_ID),
174*91f16700Schasinglulu 	SP_PKG_ENTRY(SP_PKG6_ID),
175*91f16700Schasinglulu 	SP_PKG_ENTRY(SP_PKG7_ID),
176*91f16700Schasinglulu 	SP_PKG_ENTRY(SP_PKG8_ID),
177*91f16700Schasinglulu #endif
178*91f16700Schasinglulu #endif
179*91f16700Schasinglulu # endif /* QEMU_LOAD_BL32 */
180*91f16700Schasinglulu 
181*91f16700Schasinglulu 	/* Fill BL33 related information */
182*91f16700Schasinglulu 	{ .image_id = BL33_IMAGE_ID,
183*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
184*91f16700Schasinglulu 				entry_point_info_t, NON_SECURE | EXECUTABLE),
185*91f16700Schasinglulu # ifdef PRELOADED_BL33_BASE
186*91f16700Schasinglulu 	  .ep_info.pc = PRELOADED_BL33_BASE,
187*91f16700Schasinglulu 
188*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
189*91f16700Schasinglulu 				IMAGE_ATTRIB_SKIP_LOADING),
190*91f16700Schasinglulu # else /* PRELOADED_BL33_BASE */
191*91f16700Schasinglulu 	  .ep_info.pc = NS_IMAGE_OFFSET,
192*91f16700Schasinglulu 
193*91f16700Schasinglulu 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
194*91f16700Schasinglulu 				0),
195*91f16700Schasinglulu 	  .image_info.image_base = NS_IMAGE_OFFSET,
196*91f16700Schasinglulu 	  .image_info.image_max_size = NS_IMAGE_MAX_SIZE,
197*91f16700Schasinglulu # endif /* !PRELOADED_BL33_BASE */
198*91f16700Schasinglulu 
199*91f16700Schasinglulu 	  .next_handoff_image_id = INVALID_IMAGE_ID,
200*91f16700Schasinglulu 	}
201*91f16700Schasinglulu #endif /* !EL3_PAYLOAD_BASE */
202*91f16700Schasinglulu };
203*91f16700Schasinglulu 
204*91f16700Schasinglulu REGISTER_BL_IMAGE_DESCS(bl2_mem_params_descs)
205