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