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