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