1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2017-2020, 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 9*91f16700Schasinglulu #include <platform_def.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <arch.h> 12*91f16700Schasinglulu #include <common/desc_image_load.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include "uniphier.h" 15*91f16700Schasinglulu 16*91f16700Schasinglulu #define UNIPHIER_BL33_OFFSET 0x04000000UL 17*91f16700Schasinglulu #define UNIPHIER_BL33_MAX_SIZE 0x00800000UL 18*91f16700Schasinglulu 19*91f16700Schasinglulu #define UNIPHIER_SCP_OFFSET 0x04800000UL 20*91f16700Schasinglulu #define UNIPHIER_SCP_MAX_SIZE 0x00020000UL 21*91f16700Schasinglulu 22*91f16700Schasinglulu static struct bl_mem_params_node uniphier_image_descs[] = { 23*91f16700Schasinglulu { 24*91f16700Schasinglulu .image_id = SCP_BL2_IMAGE_ID, 25*91f16700Schasinglulu 26*91f16700Schasinglulu SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, 27*91f16700Schasinglulu VERSION_2, image_info_t, 0), 28*91f16700Schasinglulu .image_info.image_base = UNIPHIER_SCP_OFFSET, 29*91f16700Schasinglulu .image_info.image_max_size = UNIPHIER_SCP_MAX_SIZE, 30*91f16700Schasinglulu 31*91f16700Schasinglulu SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, 32*91f16700Schasinglulu VERSION_2, entry_point_info_t, 33*91f16700Schasinglulu NON_SECURE | NON_EXECUTABLE), 34*91f16700Schasinglulu 35*91f16700Schasinglulu .next_handoff_image_id = INVALID_IMAGE_ID, 36*91f16700Schasinglulu }, 37*91f16700Schasinglulu { 38*91f16700Schasinglulu .image_id = BL31_IMAGE_ID, 39*91f16700Schasinglulu 40*91f16700Schasinglulu SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, 41*91f16700Schasinglulu VERSION_2, image_info_t, 0), 42*91f16700Schasinglulu .image_info.image_base = UNIPHIER_BL31_OFFSET, 43*91f16700Schasinglulu .image_info.image_max_size = UNIPHIER_BL31_MAX_SIZE, 44*91f16700Schasinglulu 45*91f16700Schasinglulu SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, 46*91f16700Schasinglulu VERSION_2, entry_point_info_t, 47*91f16700Schasinglulu SECURE | EXECUTABLE | EP_FIRST_EXE), 48*91f16700Schasinglulu .ep_info.pc = UNIPHIER_BL31_OFFSET, 49*91f16700Schasinglulu .ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX, 50*91f16700Schasinglulu DISABLE_ALL_EXCEPTIONS), 51*91f16700Schasinglulu 52*91f16700Schasinglulu #ifdef UNIPHIER_LOAD_BL32 53*91f16700Schasinglulu .next_handoff_image_id = BL32_IMAGE_ID, 54*91f16700Schasinglulu #else 55*91f16700Schasinglulu .next_handoff_image_id = BL33_IMAGE_ID, 56*91f16700Schasinglulu #endif 57*91f16700Schasinglulu }, 58*91f16700Schasinglulu #ifdef UNIPHIER_LOAD_BL32 59*91f16700Schasinglulu { 60*91f16700Schasinglulu .image_id = BL32_IMAGE_ID, 61*91f16700Schasinglulu 62*91f16700Schasinglulu SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, 63*91f16700Schasinglulu VERSION_2, image_info_t, 0), 64*91f16700Schasinglulu .image_info.image_base = UNIPHIER_BL32_OFFSET, 65*91f16700Schasinglulu .image_info.image_max_size = UNIPHIER_BL32_MAX_SIZE, 66*91f16700Schasinglulu 67*91f16700Schasinglulu SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, 68*91f16700Schasinglulu VERSION_2, entry_point_info_t, 69*91f16700Schasinglulu SECURE | EXECUTABLE), 70*91f16700Schasinglulu .ep_info.pc = UNIPHIER_BL32_OFFSET, 71*91f16700Schasinglulu .ep_info.spsr = SPSR_64(MODE_EL3, MODE_SP_ELX, 72*91f16700Schasinglulu DISABLE_ALL_EXCEPTIONS), 73*91f16700Schasinglulu 74*91f16700Schasinglulu .next_handoff_image_id = BL33_IMAGE_ID, 75*91f16700Schasinglulu }, 76*91f16700Schasinglulu #endif 77*91f16700Schasinglulu { 78*91f16700Schasinglulu .image_id = BL33_IMAGE_ID, 79*91f16700Schasinglulu 80*91f16700Schasinglulu SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, 81*91f16700Schasinglulu VERSION_2, image_info_t, 0), 82*91f16700Schasinglulu .image_info.image_base = UNIPHIER_BL33_OFFSET, 83*91f16700Schasinglulu .image_info.image_max_size = UNIPHIER_BL33_MAX_SIZE, 84*91f16700Schasinglulu 85*91f16700Schasinglulu SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, 86*91f16700Schasinglulu VERSION_2, entry_point_info_t, 87*91f16700Schasinglulu NON_SECURE | EXECUTABLE), 88*91f16700Schasinglulu .ep_info.pc = UNIPHIER_BL33_OFFSET, 89*91f16700Schasinglulu .ep_info.spsr = SPSR_64(MODE_EL2, MODE_SP_ELX, 90*91f16700Schasinglulu DISABLE_ALL_EXCEPTIONS), 91*91f16700Schasinglulu 92*91f16700Schasinglulu .next_handoff_image_id = INVALID_IMAGE_ID, 93*91f16700Schasinglulu }, 94*91f16700Schasinglulu }; 95*91f16700Schasinglulu REGISTER_BL_IMAGE_DESCS(uniphier_image_descs) 96*91f16700Schasinglulu 97*91f16700Schasinglulu /* 98*91f16700Schasinglulu * image_info.image_base and ep_info.pc are the offset from the memory base. 99*91f16700Schasinglulu * When ENABLE_PIE is set, we never know the real memory base at link-time. 100*91f16700Schasinglulu * Fix-up the addresses by adding the run-time detected base. 101*91f16700Schasinglulu */ 102*91f16700Schasinglulu void uniphier_init_image_descs(uintptr_t mem_base) 103*91f16700Schasinglulu { 104*91f16700Schasinglulu int i; 105*91f16700Schasinglulu 106*91f16700Schasinglulu for (i = 0; i < ARRAY_SIZE(uniphier_image_descs); i++) { 107*91f16700Schasinglulu uniphier_image_descs[i].image_info.image_base += mem_base; 108*91f16700Schasinglulu uniphier_image_descs[i].ep_info.pc += mem_base; 109*91f16700Schasinglulu } 110*91f16700Schasinglulu } 111*91f16700Schasinglulu 112*91f16700Schasinglulu struct image_info *uniphier_get_image_info(unsigned int image_id) 113*91f16700Schasinglulu { 114*91f16700Schasinglulu struct bl_mem_params_node *desc; 115*91f16700Schasinglulu 116*91f16700Schasinglulu desc = get_bl_mem_params_node(image_id); 117*91f16700Schasinglulu assert(desc); 118*91f16700Schasinglulu return &desc->image_info; 119*91f16700Schasinglulu } 120