1*b53c2c5fSPankaj Gupta /* 2*b53c2c5fSPankaj Gupta * Copyright 2018-2020 NXP 3*b53c2c5fSPankaj Gupta * 4*b53c2c5fSPankaj Gupta * SPDX-License-Identifier: BSD-3-Clause 5*b53c2c5fSPankaj Gupta * 6*b53c2c5fSPankaj Gupta */ 7*b53c2c5fSPankaj Gupta 8*b53c2c5fSPankaj Gupta #include <assert.h> 9*b53c2c5fSPankaj Gupta 10*b53c2c5fSPankaj Gupta #ifdef LS_EL3_INTERRUPT_HANDLER 11*b53c2c5fSPankaj Gupta #include <ls_interrupt_mgmt.h> 12*b53c2c5fSPankaj Gupta #endif 13*b53c2c5fSPankaj Gupta #include <mmu_def.h> 14*b53c2c5fSPankaj Gupta #include <plat_common.h> 15*b53c2c5fSPankaj Gupta 16*b53c2c5fSPankaj Gupta /* 17*b53c2c5fSPankaj Gupta * Placeholder variables for copying the arguments that have been passed to 18*b53c2c5fSPankaj Gupta * BL31 from BL2. 19*b53c2c5fSPankaj Gupta */ 20*b53c2c5fSPankaj Gupta #ifdef TEST_BL31 21*b53c2c5fSPankaj Gupta #define SPSR_FOR_EL2H 0x3C9 22*b53c2c5fSPankaj Gupta #define SPSR_FOR_EL1H 0x3C5 23*b53c2c5fSPankaj Gupta #else 24*b53c2c5fSPankaj Gupta static entry_point_info_t bl31_image_ep_info; 25*b53c2c5fSPankaj Gupta #endif 26*b53c2c5fSPankaj Gupta 27*b53c2c5fSPankaj Gupta static entry_point_info_t bl32_image_ep_info; 28*b53c2c5fSPankaj Gupta static entry_point_info_t bl33_image_ep_info; 29*b53c2c5fSPankaj Gupta 30*b53c2c5fSPankaj Gupta static dram_regions_info_t dram_regions_info = {0}; 31*b53c2c5fSPankaj Gupta static uint64_t rcw_porsr1; 32*b53c2c5fSPankaj Gupta 33*b53c2c5fSPankaj Gupta /* Return the pointer to the 'dram_regions_info structure of the DRAM. 34*b53c2c5fSPankaj Gupta * This structure is populated after init_ddr(). 35*b53c2c5fSPankaj Gupta */ 36*b53c2c5fSPankaj Gupta dram_regions_info_t *get_dram_regions_info(void) 37*b53c2c5fSPankaj Gupta { 38*b53c2c5fSPankaj Gupta return &dram_regions_info; 39*b53c2c5fSPankaj Gupta } 40*b53c2c5fSPankaj Gupta 41*b53c2c5fSPankaj Gupta /* Return the RCW.PORSR1 value which was passed in from BL2 42*b53c2c5fSPankaj Gupta */ 43*b53c2c5fSPankaj Gupta uint64_t bl31_get_porsr1(void) 44*b53c2c5fSPankaj Gupta { 45*b53c2c5fSPankaj Gupta return rcw_porsr1; 46*b53c2c5fSPankaj Gupta } 47*b53c2c5fSPankaj Gupta 48*b53c2c5fSPankaj Gupta /* 49*b53c2c5fSPankaj Gupta * Return pointer to the 'entry_point_info' structure of the next image for the 50*b53c2c5fSPankaj Gupta * security state specified: 51*b53c2c5fSPankaj Gupta * - BL33 corresponds to the non-secure image type; while 52*b53c2c5fSPankaj Gupta * - BL32 corresponds to the secure image type. 53*b53c2c5fSPankaj Gupta * - A NULL pointer is returned, if the image does not exist. 54*b53c2c5fSPankaj Gupta */ 55*b53c2c5fSPankaj Gupta entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type) 56*b53c2c5fSPankaj Gupta { 57*b53c2c5fSPankaj Gupta entry_point_info_t *next_image_info; 58*b53c2c5fSPankaj Gupta 59*b53c2c5fSPankaj Gupta assert(sec_state_is_valid(type)); 60*b53c2c5fSPankaj Gupta next_image_info = (type == NON_SECURE) 61*b53c2c5fSPankaj Gupta ? &bl33_image_ep_info : &bl32_image_ep_info; 62*b53c2c5fSPankaj Gupta 63*b53c2c5fSPankaj Gupta #ifdef TEST_BL31 64*b53c2c5fSPankaj Gupta next_image_info->pc = _get_test_entry(); 65*b53c2c5fSPankaj Gupta next_image_info->spsr = SPSR_FOR_EL2H; 66*b53c2c5fSPankaj Gupta next_image_info->h.attr = NON_SECURE; 67*b53c2c5fSPankaj Gupta #endif 68*b53c2c5fSPankaj Gupta 69*b53c2c5fSPankaj Gupta if (next_image_info->pc != 0U) { 70*b53c2c5fSPankaj Gupta return next_image_info; 71*b53c2c5fSPankaj Gupta } else { 72*b53c2c5fSPankaj Gupta return NULL; 73*b53c2c5fSPankaj Gupta } 74*b53c2c5fSPankaj Gupta } 75*b53c2c5fSPankaj Gupta 76*b53c2c5fSPankaj Gupta /* 77*b53c2c5fSPankaj Gupta * Perform any BL31 early platform setup common to NXP platforms. 78*b53c2c5fSPankaj Gupta * - Here is an opportunity to copy parameters passed by the calling EL (S-EL1 79*b53c2c5fSPankaj Gupta * in BL2 & S-EL3 in BL1) before they are lost (potentially). 80*b53c2c5fSPankaj Gupta * - This needs to be done before the MMU is initialized so that the 81*b53c2c5fSPankaj Gupta * memory layout can be used while creating page tables. 82*b53c2c5fSPankaj Gupta * - BL2 has flushed this information to memory, in order to fetch latest data. 83*b53c2c5fSPankaj Gupta */ 84*b53c2c5fSPankaj Gupta 85*b53c2c5fSPankaj Gupta void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, 86*b53c2c5fSPankaj Gupta u_register_t arg2, u_register_t arg3) 87*b53c2c5fSPankaj Gupta { 88*b53c2c5fSPankaj Gupta #ifndef TEST_BL31 89*b53c2c5fSPankaj Gupta int i = 0; 90*b53c2c5fSPankaj Gupta void *from_bl2 = (void *)arg0; 91*b53c2c5fSPankaj Gupta #endif 92*b53c2c5fSPankaj Gupta soc_early_platform_setup2(); 93*b53c2c5fSPankaj Gupta 94*b53c2c5fSPankaj Gupta #ifdef TEST_BL31 95*b53c2c5fSPankaj Gupta dram_regions_info.num_dram_regions = 2; 96*b53c2c5fSPankaj Gupta dram_regions_info.total_dram_size = 0x100000000; 97*b53c2c5fSPankaj Gupta dram_regions_info.region[0].addr = 0x80000000; 98*b53c2c5fSPankaj Gupta dram_regions_info.region[0].size = 0x80000000; 99*b53c2c5fSPankaj Gupta dram_regions_info.region[1].addr = 0x880000000; 100*b53c2c5fSPankaj Gupta dram_regions_info.region[1].size = 0x80000000; 101*b53c2c5fSPankaj Gupta 102*b53c2c5fSPankaj Gupta bl33_image_ep_info.pc = _get_test_entry(); 103*b53c2c5fSPankaj Gupta #else 104*b53c2c5fSPankaj Gupta /* 105*b53c2c5fSPankaj Gupta * Check params passed from BL2 should not be NULL, 106*b53c2c5fSPankaj Gupta */ 107*b53c2c5fSPankaj Gupta bl_params_t *params_from_bl2 = (bl_params_t *)from_bl2; 108*b53c2c5fSPankaj Gupta 109*b53c2c5fSPankaj Gupta assert(params_from_bl2 != NULL); 110*b53c2c5fSPankaj Gupta assert(params_from_bl2->h.type == PARAM_BL_PARAMS); 111*b53c2c5fSPankaj Gupta assert(params_from_bl2->h.version >= VERSION_2); 112*b53c2c5fSPankaj Gupta 113*b53c2c5fSPankaj Gupta bl_params_node_t *bl_params = params_from_bl2->head; 114*b53c2c5fSPankaj Gupta 115*b53c2c5fSPankaj Gupta /* 116*b53c2c5fSPankaj Gupta * Copy BL33 and BL32 (if present), entry point information. 117*b53c2c5fSPankaj Gupta * They are stored in Secure RAM, in BL2's address space. 118*b53c2c5fSPankaj Gupta */ 119*b53c2c5fSPankaj Gupta while (bl_params != NULL) { 120*b53c2c5fSPankaj Gupta if (bl_params->image_id == BL31_IMAGE_ID) { 121*b53c2c5fSPankaj Gupta bl31_image_ep_info = *bl_params->ep_info; 122*b53c2c5fSPankaj Gupta dram_regions_info_t *loc_dram_regions_info = 123*b53c2c5fSPankaj Gupta (dram_regions_info_t *) bl31_image_ep_info.args.arg3; 124*b53c2c5fSPankaj Gupta 125*b53c2c5fSPankaj Gupta dram_regions_info.num_dram_regions = 126*b53c2c5fSPankaj Gupta loc_dram_regions_info->num_dram_regions; 127*b53c2c5fSPankaj Gupta dram_regions_info.total_dram_size = 128*b53c2c5fSPankaj Gupta loc_dram_regions_info->total_dram_size; 129*b53c2c5fSPankaj Gupta VERBOSE("Number of DRAM Regions = %llx\n", 130*b53c2c5fSPankaj Gupta dram_regions_info.num_dram_regions); 131*b53c2c5fSPankaj Gupta 132*b53c2c5fSPankaj Gupta for (i = 0; i < dram_regions_info.num_dram_regions; 133*b53c2c5fSPankaj Gupta i++) { 134*b53c2c5fSPankaj Gupta dram_regions_info.region[i].addr = 135*b53c2c5fSPankaj Gupta loc_dram_regions_info->region[i].addr; 136*b53c2c5fSPankaj Gupta dram_regions_info.region[i].size = 137*b53c2c5fSPankaj Gupta loc_dram_regions_info->region[i].size; 138*b53c2c5fSPankaj Gupta VERBOSE("DRAM%d Size = %llx\n", i, 139*b53c2c5fSPankaj Gupta dram_regions_info.region[i].size); 140*b53c2c5fSPankaj Gupta } 141*b53c2c5fSPankaj Gupta rcw_porsr1 = bl31_image_ep_info.args.arg4; 142*b53c2c5fSPankaj Gupta } 143*b53c2c5fSPankaj Gupta 144*b53c2c5fSPankaj Gupta if (bl_params->image_id == BL32_IMAGE_ID) { 145*b53c2c5fSPankaj Gupta bl32_image_ep_info = *bl_params->ep_info; 146*b53c2c5fSPankaj Gupta } 147*b53c2c5fSPankaj Gupta 148*b53c2c5fSPankaj Gupta if (bl_params->image_id == BL33_IMAGE_ID) { 149*b53c2c5fSPankaj Gupta bl33_image_ep_info = *bl_params->ep_info; 150*b53c2c5fSPankaj Gupta } 151*b53c2c5fSPankaj Gupta 152*b53c2c5fSPankaj Gupta bl_params = bl_params->next_params_info; 153*b53c2c5fSPankaj Gupta } 154*b53c2c5fSPankaj Gupta #endif /* TEST_BL31 */ 155*b53c2c5fSPankaj Gupta 156*b53c2c5fSPankaj Gupta if (bl33_image_ep_info.pc == 0) { 157*b53c2c5fSPankaj Gupta panic(); 158*b53c2c5fSPankaj Gupta } 159*b53c2c5fSPankaj Gupta 160*b53c2c5fSPankaj Gupta /* 161*b53c2c5fSPankaj Gupta * perform basic initialization on the soc 162*b53c2c5fSPankaj Gupta */ 163*b53c2c5fSPankaj Gupta soc_init(); 164*b53c2c5fSPankaj Gupta } 165*b53c2c5fSPankaj Gupta 166*b53c2c5fSPankaj Gupta /******************************************************************************* 167*b53c2c5fSPankaj Gupta * Perform any BL31 platform setup common to ARM standard platforms 168*b53c2c5fSPankaj Gupta ******************************************************************************/ 169*b53c2c5fSPankaj Gupta void bl31_platform_setup(void) 170*b53c2c5fSPankaj Gupta { 171*b53c2c5fSPankaj Gupta NOTICE("Welcome to %s BL31 Phase\n", BOARD); 172*b53c2c5fSPankaj Gupta soc_platform_setup(); 173*b53c2c5fSPankaj Gupta 174*b53c2c5fSPankaj Gupta /* Console logs gone missing as part going to 175*b53c2c5fSPankaj Gupta * EL1 for initilizing Bl32 if present. 176*b53c2c5fSPankaj Gupta * console flush is necessary to avoid it. 177*b53c2c5fSPankaj Gupta */ 178*b53c2c5fSPankaj Gupta (void)console_flush(); 179*b53c2c5fSPankaj Gupta } 180*b53c2c5fSPankaj Gupta 181*b53c2c5fSPankaj Gupta void bl31_plat_runtime_setup(void) 182*b53c2c5fSPankaj Gupta { 183*b53c2c5fSPankaj Gupta #ifdef LS_EL3_INTERRUPT_HANDLER 184*b53c2c5fSPankaj Gupta ls_el3_interrupt_config(); 185*b53c2c5fSPankaj Gupta #endif 186*b53c2c5fSPankaj Gupta soc_runtime_setup(); 187*b53c2c5fSPankaj Gupta } 188*b53c2c5fSPankaj Gupta 189*b53c2c5fSPankaj Gupta /******************************************************************************* 190*b53c2c5fSPankaj Gupta * Perform the very early platform specific architectural setup shared between 191*b53c2c5fSPankaj Gupta * ARM standard platforms. This only does basic initialization. Later 192*b53c2c5fSPankaj Gupta * architectural setup (bl31_arch_setup()) does not do anything platform 193*b53c2c5fSPankaj Gupta * specific. 194*b53c2c5fSPankaj Gupta ******************************************************************************/ 195*b53c2c5fSPankaj Gupta void bl31_plat_arch_setup(void) 196*b53c2c5fSPankaj Gupta { 197*b53c2c5fSPankaj Gupta 198*b53c2c5fSPankaj Gupta ls_setup_page_tables(BL31_BASE, 199*b53c2c5fSPankaj Gupta BL31_END - BL31_BASE, 200*b53c2c5fSPankaj Gupta BL_CODE_BASE, 201*b53c2c5fSPankaj Gupta BL_CODE_END, 202*b53c2c5fSPankaj Gupta BL_RO_DATA_BASE, 203*b53c2c5fSPankaj Gupta BL_RO_DATA_END 204*b53c2c5fSPankaj Gupta #if USE_COHERENT_MEM 205*b53c2c5fSPankaj Gupta , BL_COHERENT_RAM_BASE, 206*b53c2c5fSPankaj Gupta BL_COHERENT_RAM_END 207*b53c2c5fSPankaj Gupta #endif 208*b53c2c5fSPankaj Gupta ); 209*b53c2c5fSPankaj Gupta enable_mmu_el3(0); 210*b53c2c5fSPankaj Gupta } 211