xref: /rk3399_ARM-atf/plat/qemu/common/qemu_bl2_mem_params_desc.c (revision 2b6f940a106dba87ebfcbc5befe707bc2c34ee58)
1301d27d9SRadoslaw Biernacki /*
2*8ffe0b2eSJean-Philippe Brucker  * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved.
3301d27d9SRadoslaw Biernacki  *
4301d27d9SRadoslaw Biernacki  * SPDX-License-Identifier: BSD-3-Clause
5301d27d9SRadoslaw Biernacki  */
6301d27d9SRadoslaw Biernacki 
7301d27d9SRadoslaw Biernacki #include <platform_def.h>
8301d27d9SRadoslaw Biernacki 
9301d27d9SRadoslaw Biernacki #include <common/desc_image_load.h>
10301d27d9SRadoslaw Biernacki #include <plat/common/platform.h>
11301d27d9SRadoslaw Biernacki 
1236802e2cSJens Wiklander #define SP_PKG_ENTRY(id) \
1336802e2cSJens Wiklander 	{ \
1436802e2cSJens Wiklander 		.image_id = (id), \
1536802e2cSJens Wiklander 		SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY, VERSION_2, \
1636802e2cSJens Wiklander 				      entry_point_info_t, \
1736802e2cSJens Wiklander 				      SECURE | NON_EXECUTABLE), \
1836802e2cSJens Wiklander 		SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY, \
1936802e2cSJens Wiklander 				      VERSION_2, image_info_t, \
2036802e2cSJens Wiklander 				      IMAGE_ATTRIB_SKIP_LOADING), \
2136802e2cSJens Wiklander 		.next_handoff_image_id = INVALID_IMAGE_ID, \
2236802e2cSJens Wiklander 	}
2336802e2cSJens Wiklander 
24301d27d9SRadoslaw Biernacki /*******************************************************************************
25301d27d9SRadoslaw Biernacki  * Following descriptor provides BL image/ep information that gets used
26301d27d9SRadoslaw Biernacki  * by BL2 to load the images and also subset of this information is
27301d27d9SRadoslaw Biernacki  * passed to next BL image. The image loading sequence is managed by
28301d27d9SRadoslaw Biernacki  * populating the images in required loading order. The image execution
29301d27d9SRadoslaw Biernacki  * sequence is managed by populating the `next_handoff_image_id` with
30301d27d9SRadoslaw Biernacki  * the next executable image id.
31301d27d9SRadoslaw Biernacki  ******************************************************************************/
32301d27d9SRadoslaw Biernacki static bl_mem_params_node_t bl2_mem_params_descs[] = {
33301d27d9SRadoslaw Biernacki #ifdef EL3_PAYLOAD_BASE
34301d27d9SRadoslaw Biernacki 	/* Fill EL3 payload related information (BL31 is EL3 payload) */
35301d27d9SRadoslaw Biernacki 	{ .image_id = BL31_IMAGE_ID,
36301d27d9SRadoslaw Biernacki 
37301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
38301d27d9SRadoslaw Biernacki 				entry_point_info_t,
39301d27d9SRadoslaw Biernacki 				SECURE | EXECUTABLE | EP_FIRST_EXE),
40301d27d9SRadoslaw Biernacki 	  .ep_info.pc = EL3_PAYLOAD_BASE,
41301d27d9SRadoslaw Biernacki 	  .ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
42301d27d9SRadoslaw Biernacki 				  DISABLE_ALL_EXCEPTIONS),
43301d27d9SRadoslaw Biernacki 
44301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
45301d27d9SRadoslaw Biernacki 				IMAGE_ATTRIB_PLAT_SETUP | IMAGE_ATTRIB_SKIP_LOADING),
46301d27d9SRadoslaw Biernacki 
47301d27d9SRadoslaw Biernacki 	  .next_handoff_image_id = INVALID_IMAGE_ID,
48301d27d9SRadoslaw Biernacki 	},
49301d27d9SRadoslaw Biernacki #else /* EL3_PAYLOAD_BASE */
50301d27d9SRadoslaw Biernacki #ifdef __aarch64__
51301d27d9SRadoslaw Biernacki 	/* Fill BL31 related information */
52301d27d9SRadoslaw Biernacki 	{ .image_id = BL31_IMAGE_ID,
53301d27d9SRadoslaw Biernacki 
54301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
55301d27d9SRadoslaw Biernacki 				entry_point_info_t,
56301d27d9SRadoslaw Biernacki 				SECURE | EXECUTABLE | EP_FIRST_EXE),
57301d27d9SRadoslaw Biernacki 	  .ep_info.pc = BL31_BASE,
58301d27d9SRadoslaw Biernacki 	  .ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX,
59301d27d9SRadoslaw Biernacki 				  DISABLE_ALL_EXCEPTIONS),
60301d27d9SRadoslaw Biernacki # if DEBUG
61301d27d9SRadoslaw Biernacki 	  .ep_info.args.arg1 = QEMU_BL31_PLAT_PARAM_VAL,
62301d27d9SRadoslaw Biernacki # endif
63301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
64301d27d9SRadoslaw Biernacki 				IMAGE_ATTRIB_PLAT_SETUP),
65301d27d9SRadoslaw Biernacki 	  .image_info.image_base = BL31_BASE,
66301d27d9SRadoslaw Biernacki 	  .image_info.image_max_size = BL31_LIMIT - BL31_BASE,
67301d27d9SRadoslaw Biernacki 
68301d27d9SRadoslaw Biernacki # ifdef QEMU_LOAD_BL32
69301d27d9SRadoslaw Biernacki 	  .next_handoff_image_id = BL32_IMAGE_ID,
70*8ffe0b2eSJean-Philippe Brucker # elif ENABLE_RME
71*8ffe0b2eSJean-Philippe Brucker 	  .next_handoff_image_id = RMM_IMAGE_ID,
72301d27d9SRadoslaw Biernacki # else
73301d27d9SRadoslaw Biernacki 	  .next_handoff_image_id = BL33_IMAGE_ID,
74301d27d9SRadoslaw Biernacki # endif
75301d27d9SRadoslaw Biernacki 	},
76301d27d9SRadoslaw Biernacki #endif /* __aarch64__ */
77*8ffe0b2eSJean-Philippe Brucker 
78*8ffe0b2eSJean-Philippe Brucker #if ENABLE_RME
79*8ffe0b2eSJean-Philippe Brucker 	/* Fill RMM related information */
80*8ffe0b2eSJean-Philippe Brucker 	{ .image_id = RMM_IMAGE_ID,
81*8ffe0b2eSJean-Philippe Brucker 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP,
82*8ffe0b2eSJean-Philippe Brucker 		VERSION_2, entry_point_info_t, EP_REALM | EXECUTABLE),
83*8ffe0b2eSJean-Philippe Brucker 	  .ep_info.pc = RMM_BASE,
84*8ffe0b2eSJean-Philippe Brucker 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP,
85*8ffe0b2eSJean-Philippe Brucker 		VERSION_2, image_info_t, 0),
86*8ffe0b2eSJean-Philippe Brucker 	  .image_info.image_base = RMM_BASE,
87*8ffe0b2eSJean-Philippe Brucker 	  .image_info.image_max_size = RMM_LIMIT - RMM_BASE,
88*8ffe0b2eSJean-Philippe Brucker 	  .next_handoff_image_id = BL33_IMAGE_ID,
89*8ffe0b2eSJean-Philippe Brucker 	},
90*8ffe0b2eSJean-Philippe Brucker #endif /* ENABLE_RME */
91*8ffe0b2eSJean-Philippe Brucker 
92301d27d9SRadoslaw Biernacki # ifdef QEMU_LOAD_BL32
93301d27d9SRadoslaw Biernacki 
94301d27d9SRadoslaw Biernacki #ifdef __aarch64__
95301d27d9SRadoslaw Biernacki #define BL32_EP_ATTRIBS		(SECURE | EXECUTABLE)
96301d27d9SRadoslaw Biernacki #define BL32_IMG_ATTRIBS	0
97301d27d9SRadoslaw Biernacki #else
98301d27d9SRadoslaw Biernacki #define BL32_EP_ATTRIBS		(SECURE | EXECUTABLE | EP_FIRST_EXE)
99301d27d9SRadoslaw Biernacki #define BL32_IMG_ATTRIBS	IMAGE_ATTRIB_PLAT_SETUP
100301d27d9SRadoslaw Biernacki #endif
101301d27d9SRadoslaw Biernacki 
102301d27d9SRadoslaw Biernacki 	/* Fill BL32 related information */
103301d27d9SRadoslaw Biernacki 	{ .image_id = BL32_IMAGE_ID,
104301d27d9SRadoslaw Biernacki 
105301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
106301d27d9SRadoslaw Biernacki 				entry_point_info_t, BL32_EP_ATTRIBS),
107301d27d9SRadoslaw Biernacki 	  .ep_info.pc = BL32_BASE,
108301d27d9SRadoslaw Biernacki 
109301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
110301d27d9SRadoslaw Biernacki 				image_info_t, BL32_IMG_ATTRIBS),
111301d27d9SRadoslaw Biernacki 
112301d27d9SRadoslaw Biernacki 	  .image_info.image_base = BL32_BASE,
113301d27d9SRadoslaw Biernacki 	  .image_info.image_max_size = BL32_LIMIT - BL32_BASE,
114301d27d9SRadoslaw Biernacki 
115*8ffe0b2eSJean-Philippe Brucker #if ENABLE_RME
116*8ffe0b2eSJean-Philippe Brucker 	  .next_handoff_image_id = RMM_IMAGE_ID,
117*8ffe0b2eSJean-Philippe Brucker #else
118301d27d9SRadoslaw Biernacki 	  .next_handoff_image_id = BL33_IMAGE_ID,
119*8ffe0b2eSJean-Philippe Brucker #endif
120301d27d9SRadoslaw Biernacki 	},
121301d27d9SRadoslaw Biernacki 
122301d27d9SRadoslaw Biernacki 	/*
123301d27d9SRadoslaw Biernacki 	 * Fill BL32 external 1 related information.
124301d27d9SRadoslaw Biernacki 	 * A typical use for extra1 image is with OP-TEE where it is the
125301d27d9SRadoslaw Biernacki 	 * pager image.
126301d27d9SRadoslaw Biernacki 	 */
127301d27d9SRadoslaw Biernacki 	{ .image_id = BL32_EXTRA1_IMAGE_ID,
128301d27d9SRadoslaw Biernacki 
129301d27d9SRadoslaw Biernacki 	   SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
130301d27d9SRadoslaw Biernacki 				 entry_point_info_t, SECURE | NON_EXECUTABLE),
131301d27d9SRadoslaw Biernacki 
132301d27d9SRadoslaw Biernacki 	   SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
133301d27d9SRadoslaw Biernacki 				 image_info_t, IMAGE_ATTRIB_SKIP_LOADING),
134301d27d9SRadoslaw Biernacki 	   .image_info.image_base = BL32_BASE,
135301d27d9SRadoslaw Biernacki 	   .image_info.image_max_size = BL32_LIMIT - BL32_BASE,
136301d27d9SRadoslaw Biernacki 
137301d27d9SRadoslaw Biernacki 	   .next_handoff_image_id = INVALID_IMAGE_ID,
138301d27d9SRadoslaw Biernacki 	},
139301d27d9SRadoslaw Biernacki 
140301d27d9SRadoslaw Biernacki 	/*
141301d27d9SRadoslaw Biernacki 	 * Fill BL32 external 2 related information.
142301d27d9SRadoslaw Biernacki 	 * A typical use for extra2 image is with OP-TEE where it is the
143301d27d9SRadoslaw Biernacki 	 * paged image.
144301d27d9SRadoslaw Biernacki 	 */
145301d27d9SRadoslaw Biernacki 	{ .image_id = BL32_EXTRA2_IMAGE_ID,
146301d27d9SRadoslaw Biernacki 
147301d27d9SRadoslaw Biernacki 	   SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
148301d27d9SRadoslaw Biernacki 				 entry_point_info_t, SECURE | NON_EXECUTABLE),
149301d27d9SRadoslaw Biernacki 
150301d27d9SRadoslaw Biernacki 	   SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
151301d27d9SRadoslaw Biernacki 				 image_info_t, IMAGE_ATTRIB_SKIP_LOADING),
152f58237ccSJens Wiklander #if defined(SPD_opteed) || defined(AARCH32_SP_OPTEE) || defined(SPMC_OPTEE)
153301d27d9SRadoslaw Biernacki 	   .image_info.image_base = QEMU_OPTEE_PAGEABLE_LOAD_BASE,
154301d27d9SRadoslaw Biernacki 	   .image_info.image_max_size = QEMU_OPTEE_PAGEABLE_LOAD_SIZE,
155301d27d9SRadoslaw Biernacki #endif
156301d27d9SRadoslaw Biernacki 	   .next_handoff_image_id = INVALID_IMAGE_ID,
157301d27d9SRadoslaw Biernacki 	},
15825ae7ad1SJens Wiklander 
15925ae7ad1SJens Wiklander #if defined(SPD_spmd)
16025ae7ad1SJens Wiklander 	/* Fill TOS_FW_CONFIG related information */
16125ae7ad1SJens Wiklander 	{
16225ae7ad1SJens Wiklander 	    .image_id = TOS_FW_CONFIG_ID,
16325ae7ad1SJens Wiklander 	    SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY,
16425ae7ad1SJens Wiklander 		    VERSION_2, entry_point_info_t, SECURE | NON_EXECUTABLE),
16525ae7ad1SJens Wiklander 	    SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
16625ae7ad1SJens Wiklander 		    VERSION_2, image_info_t, 0),
16725ae7ad1SJens Wiklander 	    .image_info.image_base = TOS_FW_CONFIG_BASE,
16825ae7ad1SJens Wiklander 	    .image_info.image_max_size = TOS_FW_CONFIG_LIMIT -
16925ae7ad1SJens Wiklander 					 TOS_FW_CONFIG_BASE,
17025ae7ad1SJens Wiklander 	    .next_handoff_image_id = INVALID_IMAGE_ID,
17125ae7ad1SJens Wiklander 	},
17225ae7ad1SJens Wiklander 
17336802e2cSJens Wiklander #if SPMD_SPM_AT_SEL2
17436802e2cSJens Wiklander 	/* Fill TB_FW_CONFIG related information */
17536802e2cSJens Wiklander 	{
17636802e2cSJens Wiklander 	    .image_id = TB_FW_CONFIG_ID,
17736802e2cSJens Wiklander 	    SET_STATIC_PARAM_HEAD(ep_info, PARAM_IMAGE_BINARY,
17836802e2cSJens Wiklander 		    VERSION_2, entry_point_info_t, SECURE | NON_EXECUTABLE),
17936802e2cSJens Wiklander 	    SET_STATIC_PARAM_HEAD(image_info, PARAM_IMAGE_BINARY,
18036802e2cSJens Wiklander 		    VERSION_2, image_info_t, 0),
18136802e2cSJens Wiklander 	    .image_info.image_base = TB_FW_CONFIG_BASE,
18236802e2cSJens Wiklander 	    .image_info.image_max_size = TB_FW_CONFIG_LIMIT - TB_FW_CONFIG_BASE,
18336802e2cSJens Wiklander 	    .next_handoff_image_id = INVALID_IMAGE_ID,
18436802e2cSJens Wiklander 	},
18536802e2cSJens Wiklander 
18636802e2cSJens Wiklander 	/*
18736802e2cSJens Wiklander 	 * Empty entries for SP packages to be filled in according to
18836802e2cSJens Wiklander 	 * TB_FW_CONFIG.
18936802e2cSJens Wiklander 	 */
19036802e2cSJens Wiklander 	SP_PKG_ENTRY(SP_PKG1_ID),
19136802e2cSJens Wiklander 	SP_PKG_ENTRY(SP_PKG2_ID),
19236802e2cSJens Wiklander 	SP_PKG_ENTRY(SP_PKG3_ID),
19336802e2cSJens Wiklander 	SP_PKG_ENTRY(SP_PKG4_ID),
19436802e2cSJens Wiklander 	SP_PKG_ENTRY(SP_PKG5_ID),
19536802e2cSJens Wiklander 	SP_PKG_ENTRY(SP_PKG6_ID),
19636802e2cSJens Wiklander 	SP_PKG_ENTRY(SP_PKG7_ID),
19736802e2cSJens Wiklander 	SP_PKG_ENTRY(SP_PKG8_ID),
19836802e2cSJens Wiklander #endif
19936802e2cSJens Wiklander #endif
200301d27d9SRadoslaw Biernacki # endif /* QEMU_LOAD_BL32 */
201301d27d9SRadoslaw Biernacki 
202301d27d9SRadoslaw Biernacki 	/* Fill BL33 related information */
203301d27d9SRadoslaw Biernacki 	{ .image_id = BL33_IMAGE_ID,
204301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
205301d27d9SRadoslaw Biernacki 				entry_point_info_t, NON_SECURE | EXECUTABLE),
206301d27d9SRadoslaw Biernacki # ifdef PRELOADED_BL33_BASE
207301d27d9SRadoslaw Biernacki 	  .ep_info.pc = PRELOADED_BL33_BASE,
208301d27d9SRadoslaw Biernacki 
209301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
210301d27d9SRadoslaw Biernacki 				IMAGE_ATTRIB_SKIP_LOADING),
211301d27d9SRadoslaw Biernacki # else /* PRELOADED_BL33_BASE */
212301d27d9SRadoslaw Biernacki 	  .ep_info.pc = NS_IMAGE_OFFSET,
213301d27d9SRadoslaw Biernacki 
214301d27d9SRadoslaw Biernacki 	  SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
215301d27d9SRadoslaw Biernacki 				0),
216301d27d9SRadoslaw Biernacki 	  .image_info.image_base = NS_IMAGE_OFFSET,
2179a006ad1SRadoslaw Biernacki 	  .image_info.image_max_size = NS_IMAGE_MAX_SIZE,
218301d27d9SRadoslaw Biernacki # endif /* !PRELOADED_BL33_BASE */
219301d27d9SRadoslaw Biernacki 
220301d27d9SRadoslaw Biernacki 	  .next_handoff_image_id = INVALID_IMAGE_ID,
221301d27d9SRadoslaw Biernacki 	}
222301d27d9SRadoslaw Biernacki #endif /* !EL3_PAYLOAD_BASE */
223301d27d9SRadoslaw Biernacki };
224301d27d9SRadoslaw Biernacki 
225301d27d9SRadoslaw Biernacki REGISTER_BL_IMAGE_DESCS(bl2_mem_params_descs)
226