1e35d0edbSJorge Ramirez-Ortiz /* 2e35d0edbSJorge Ramirez-Ortiz * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3e35d0edbSJorge Ramirez-Ortiz * 4e35d0edbSJorge Ramirez-Ortiz * SPDX-License-Identifier: BSD-3-Clause 5e35d0edbSJorge Ramirez-Ortiz */ 6e35d0edbSJorge Ramirez-Ortiz 7e35d0edbSJorge Ramirez-Ortiz #include <arch_helpers.h> 8e35d0edbSJorge Ramirez-Ortiz #include <assert.h> 9e35d0edbSJorge Ramirez-Ortiz #include <bl_common.h> 10e35d0edbSJorge Ramirez-Ortiz #include <console.h> 11e35d0edbSJorge Ramirez-Ortiz #include <debug.h> 120d8052a4SVictor Chong #include <desc_image_load.h> 1359149bbeSVictor Chong #include <dw_mmc.h> 1459149bbeSVictor Chong #include <emmc.h> 15e35d0edbSJorge Ramirez-Ortiz #include <errno.h> 16e35d0edbSJorge Ramirez-Ortiz #include <generic_delay_timer.h> 17e35d0edbSJorge Ramirez-Ortiz #include <mmio.h> 18*f3d522beSVictor Chong #include <optee_utils.h> 19e35d0edbSJorge Ramirez-Ortiz #include <partition/partition.h> 20e35d0edbSJorge Ramirez-Ortiz #include <platform.h> 21e35d0edbSJorge Ramirez-Ortiz #include <string.h> 22e35d0edbSJorge Ramirez-Ortiz #include "hi3798cv200.h" 23e35d0edbSJorge Ramirez-Ortiz #include "plat_private.h" 24e35d0edbSJorge Ramirez-Ortiz 25e35d0edbSJorge Ramirez-Ortiz /* Memory ranges for code and read only data sections */ 26e35d0edbSJorge Ramirez-Ortiz #define BL2_RO_BASE (unsigned long)(&__RO_START__) 27e35d0edbSJorge Ramirez-Ortiz #define BL2_RO_LIMIT (unsigned long)(&__RO_END__) 28e35d0edbSJorge Ramirez-Ortiz 29e35d0edbSJorge Ramirez-Ortiz /* Memory ranges for coherent memory section */ 30e35d0edbSJorge Ramirez-Ortiz #define BL2_COHERENT_RAM_BASE (unsigned long)(&__COHERENT_RAM_START__) 31e35d0edbSJorge Ramirez-Ortiz #define BL2_COHERENT_RAM_LIMIT (unsigned long)(&__COHERENT_RAM_END__) 32e35d0edbSJorge Ramirez-Ortiz 330d8052a4SVictor Chong static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE); 340d8052a4SVictor Chong 350d8052a4SVictor Chong #if !LOAD_IMAGE_V2 360d8052a4SVictor Chong 370d8052a4SVictor Chong /******************************************************************************* 380d8052a4SVictor Chong * This structure represents the superset of information that is passed to 390d8052a4SVictor Chong * BL31, e.g. while passing control to it from BL2, bl31_params 400d8052a4SVictor Chong * and other platform specific params 410d8052a4SVictor Chong ******************************************************************************/ 42e35d0edbSJorge Ramirez-Ortiz typedef struct bl2_to_bl31_params_mem { 43e35d0edbSJorge Ramirez-Ortiz bl31_params_t bl31_params; 44e35d0edbSJorge Ramirez-Ortiz image_info_t bl31_image_info; 45f336774bSVictor Chong image_info_t bl32_image_info; 46e35d0edbSJorge Ramirez-Ortiz image_info_t bl33_image_info; 47e35d0edbSJorge Ramirez-Ortiz entry_point_info_t bl33_ep_info; 48f336774bSVictor Chong entry_point_info_t bl32_ep_info; 49e35d0edbSJorge Ramirez-Ortiz entry_point_info_t bl31_ep_info; 50e35d0edbSJorge Ramirez-Ortiz } bl2_to_bl31_params_mem_t; 51e35d0edbSJorge Ramirez-Ortiz 52e35d0edbSJorge Ramirez-Ortiz static bl2_to_bl31_params_mem_t bl31_params_mem; 53e35d0edbSJorge Ramirez-Ortiz 54e35d0edbSJorge Ramirez-Ortiz meminfo_t *bl2_plat_sec_mem_layout(void) 55e35d0edbSJorge Ramirez-Ortiz { 56e35d0edbSJorge Ramirez-Ortiz return &bl2_tzram_layout; 57e35d0edbSJorge Ramirez-Ortiz } 58e35d0edbSJorge Ramirez-Ortiz 590d8052a4SVictor Chong #ifdef SCP_BL2_BASE 600d8052a4SVictor Chong void bl2_plat_get_scp_bl2_meminfo(meminfo_t *scp_bl2_meminfo) 610d8052a4SVictor Chong { 620d8052a4SVictor Chong /* 630d8052a4SVictor Chong * This platform has no SCP_BL2 yet 640d8052a4SVictor Chong */ 650d8052a4SVictor Chong } 660d8052a4SVictor Chong #endif 670d8052a4SVictor Chong #endif /* LOAD_IMAGE_V2 */ 680d8052a4SVictor Chong 690d8052a4SVictor Chong /******************************************************************************* 700d8052a4SVictor Chong * Transfer SCP_BL2 from Trusted RAM using the SCP Download protocol. 710d8052a4SVictor Chong * Return 0 on success, -1 otherwise. 720d8052a4SVictor Chong ******************************************************************************/ 730d8052a4SVictor Chong #if LOAD_IMAGE_V2 740d8052a4SVictor Chong int plat_poplar_bl2_handle_scp_bl2(image_info_t *scp_bl2_image_info) 750d8052a4SVictor Chong #else 760d8052a4SVictor Chong int bl2_plat_handle_scp_bl2(struct image_info *scp_bl2_image_info) 770d8052a4SVictor Chong #endif 780d8052a4SVictor Chong { 790d8052a4SVictor Chong /* 800d8052a4SVictor Chong * This platform has no SCP_BL2 yet 810d8052a4SVictor Chong */ 820d8052a4SVictor Chong return 0; 830d8052a4SVictor Chong } 840d8052a4SVictor Chong 850d8052a4SVictor Chong /******************************************************************************* 860d8052a4SVictor Chong * Gets SPSR for BL32 entry 870d8052a4SVictor Chong ******************************************************************************/ 880d8052a4SVictor Chong uint32_t poplar_get_spsr_for_bl32_entry(void) 890d8052a4SVictor Chong { 900d8052a4SVictor Chong /* 910d8052a4SVictor Chong * The Secure Payload Dispatcher service is responsible for 920d8052a4SVictor Chong * setting the SPSR prior to entry into the BL3-2 image. 930d8052a4SVictor Chong */ 940d8052a4SVictor Chong return 0; 950d8052a4SVictor Chong } 960d8052a4SVictor Chong 970d8052a4SVictor Chong /******************************************************************************* 980d8052a4SVictor Chong * Gets SPSR for BL33 entry 990d8052a4SVictor Chong ******************************************************************************/ 1000d8052a4SVictor Chong #ifndef AARCH32 1010d8052a4SVictor Chong uint32_t poplar_get_spsr_for_bl33_entry(void) 1020d8052a4SVictor Chong { 1030d8052a4SVictor Chong unsigned long el_status; 1040d8052a4SVictor Chong unsigned int mode; 1050d8052a4SVictor Chong uint32_t spsr; 1060d8052a4SVictor Chong 1070d8052a4SVictor Chong /* Figure out what mode we enter the non-secure world in */ 1080d8052a4SVictor Chong el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT; 1090d8052a4SVictor Chong el_status &= ID_AA64PFR0_ELX_MASK; 1100d8052a4SVictor Chong 1110d8052a4SVictor Chong mode = (el_status) ? MODE_EL2 : MODE_EL1; 1120d8052a4SVictor Chong 1130d8052a4SVictor Chong /* 1140d8052a4SVictor Chong * TODO: Consider the possibility of specifying the SPSR in 1150d8052a4SVictor Chong * the FIP ToC and allowing the platform to have a say as 1160d8052a4SVictor Chong * well. 1170d8052a4SVictor Chong */ 1180d8052a4SVictor Chong spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS); 1190d8052a4SVictor Chong return spsr; 1200d8052a4SVictor Chong } 1210d8052a4SVictor Chong #else 1220d8052a4SVictor Chong uint32_t poplar_get_spsr_for_bl33_entry(void) 1230d8052a4SVictor Chong { 1240d8052a4SVictor Chong unsigned int hyp_status, mode, spsr; 1250d8052a4SVictor Chong 1260d8052a4SVictor Chong hyp_status = GET_VIRT_EXT(read_id_pfr1()); 1270d8052a4SVictor Chong 1280d8052a4SVictor Chong mode = (hyp_status) ? MODE32_hyp : MODE32_svc; 1290d8052a4SVictor Chong 1300d8052a4SVictor Chong /* 1310d8052a4SVictor Chong * TODO: Consider the possibility of specifying the SPSR in 1320d8052a4SVictor Chong * the FIP ToC and allowing the platform to have a say as 1330d8052a4SVictor Chong * well. 1340d8052a4SVictor Chong */ 1350d8052a4SVictor Chong spsr = SPSR_MODE32(mode, plat_get_ns_image_entrypoint() & 0x1, 1360d8052a4SVictor Chong SPSR_E_LITTLE, DISABLE_ALL_EXCEPTIONS); 1370d8052a4SVictor Chong return spsr; 1380d8052a4SVictor Chong } 1390d8052a4SVictor Chong #endif /* AARCH32 */ 1400d8052a4SVictor Chong 1410d8052a4SVictor Chong #if LOAD_IMAGE_V2 1420d8052a4SVictor Chong int poplar_bl2_handle_post_image_load(unsigned int image_id) 1430d8052a4SVictor Chong { 1440d8052a4SVictor Chong int err = 0; 1450d8052a4SVictor Chong bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id); 146*f3d522beSVictor Chong #ifdef SPD_opteed 147*f3d522beSVictor Chong bl_mem_params_node_t *pager_mem_params = NULL; 148*f3d522beSVictor Chong bl_mem_params_node_t *paged_mem_params = NULL; 149*f3d522beSVictor Chong #endif 1500d8052a4SVictor Chong 1510d8052a4SVictor Chong assert(bl_mem_params); 1520d8052a4SVictor Chong 1530d8052a4SVictor Chong switch (image_id) { 1540d8052a4SVictor Chong #ifdef AARCH64 1550d8052a4SVictor Chong case BL32_IMAGE_ID: 156*f3d522beSVictor Chong #ifdef SPD_opteed 157*f3d522beSVictor Chong pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID); 158*f3d522beSVictor Chong assert(pager_mem_params); 159*f3d522beSVictor Chong 160*f3d522beSVictor Chong paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID); 161*f3d522beSVictor Chong assert(paged_mem_params); 162*f3d522beSVictor Chong 163*f3d522beSVictor Chong err = parse_optee_header(&bl_mem_params->ep_info, 164*f3d522beSVictor Chong &pager_mem_params->image_info, 165*f3d522beSVictor Chong &paged_mem_params->image_info); 166*f3d522beSVictor Chong if (err != 0) { 167*f3d522beSVictor Chong WARN("OPTEE header parse error.\n"); 168*f3d522beSVictor Chong } 169*f3d522beSVictor Chong 170*f3d522beSVictor Chong /* 171*f3d522beSVictor Chong * OP-TEE expect to receive DTB address in x2. 172*f3d522beSVictor Chong * This will be copied into x2 by dispatcher. 173*f3d522beSVictor Chong * Set this (arg3) if necessary 174*f3d522beSVictor Chong */ 175*f3d522beSVictor Chong /* bl_mem_params->ep_info.args.arg3 = PLAT_HIKEY_DT_BASE; */ 176*f3d522beSVictor Chong #endif 1770d8052a4SVictor Chong bl_mem_params->ep_info.spsr = poplar_get_spsr_for_bl32_entry(); 1780d8052a4SVictor Chong break; 1790d8052a4SVictor Chong #endif 1800d8052a4SVictor Chong 1810d8052a4SVictor Chong case BL33_IMAGE_ID: 1820d8052a4SVictor Chong /* BL33 expects to receive the primary CPU MPID (through r0) */ 1830d8052a4SVictor Chong bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr(); 1840d8052a4SVictor Chong bl_mem_params->ep_info.spsr = poplar_get_spsr_for_bl33_entry(); 1850d8052a4SVictor Chong break; 1860d8052a4SVictor Chong 1870d8052a4SVictor Chong #ifdef SCP_BL2_BASE 1880d8052a4SVictor Chong case SCP_BL2_IMAGE_ID: 1890d8052a4SVictor Chong /* The subsequent handling of SCP_BL2 is platform specific */ 1900d8052a4SVictor Chong err = plat_poplar_bl2_handle_scp_bl2(&bl_mem_params->image_info); 1910d8052a4SVictor Chong if (err) { 1920d8052a4SVictor Chong WARN("Failure in platform-specific handling of SCP_BL2 image.\n"); 1930d8052a4SVictor Chong } 1940d8052a4SVictor Chong break; 1950d8052a4SVictor Chong #endif 1960d8052a4SVictor Chong } 1970d8052a4SVictor Chong 1980d8052a4SVictor Chong return err; 1990d8052a4SVictor Chong } 2000d8052a4SVictor Chong 2010d8052a4SVictor Chong /******************************************************************************* 2020d8052a4SVictor Chong * This function can be used by the platforms to update/use image 2030d8052a4SVictor Chong * information for given `image_id`. 2040d8052a4SVictor Chong ******************************************************************************/ 2050d8052a4SVictor Chong int bl2_plat_handle_post_image_load(unsigned int image_id) 2060d8052a4SVictor Chong { 2070d8052a4SVictor Chong return poplar_bl2_handle_post_image_load(image_id); 2080d8052a4SVictor Chong } 2090d8052a4SVictor Chong 2100d8052a4SVictor Chong #else /* LOAD_IMAGE_V2 */ 2110d8052a4SVictor Chong 212e35d0edbSJorge Ramirez-Ortiz bl31_params_t *bl2_plat_get_bl31_params(void) 213e35d0edbSJorge Ramirez-Ortiz { 214e35d0edbSJorge Ramirez-Ortiz bl31_params_t *bl2_to_bl31_params = NULL; 215e35d0edbSJorge Ramirez-Ortiz 216e35d0edbSJorge Ramirez-Ortiz /* 217e35d0edbSJorge Ramirez-Ortiz * Initialise the memory for all the arguments that needs to 218e35d0edbSJorge Ramirez-Ortiz * be passed to BL3-1 219e35d0edbSJorge Ramirez-Ortiz */ 220e35d0edbSJorge Ramirez-Ortiz memset(&bl31_params_mem, 0, sizeof(bl2_to_bl31_params_mem_t)); 221e35d0edbSJorge Ramirez-Ortiz 222e35d0edbSJorge Ramirez-Ortiz /* Assign memory for TF related information */ 223e35d0edbSJorge Ramirez-Ortiz bl2_to_bl31_params = &bl31_params_mem.bl31_params; 224e35d0edbSJorge Ramirez-Ortiz SET_PARAM_HEAD(bl2_to_bl31_params, PARAM_BL31, VERSION_1, 0); 225e35d0edbSJorge Ramirez-Ortiz 226e35d0edbSJorge Ramirez-Ortiz /* Fill BL3-1 related information */ 227e35d0edbSJorge Ramirez-Ortiz bl2_to_bl31_params->bl31_image_info = &bl31_params_mem.bl31_image_info; 228e35d0edbSJorge Ramirez-Ortiz SET_PARAM_HEAD(bl2_to_bl31_params->bl31_image_info, 229e35d0edbSJorge Ramirez-Ortiz PARAM_IMAGE_BINARY, VERSION_1, 0); 230e35d0edbSJorge Ramirez-Ortiz 231f336774bSVictor Chong /* Fill BL3-2 related information if it exists */ 232f336774bSVictor Chong #ifdef BL32_BASE 233f336774bSVictor Chong bl2_to_bl31_params->bl32_ep_info = &bl31_params_mem.bl32_ep_info; 234f336774bSVictor Chong SET_PARAM_HEAD(bl2_to_bl31_params->bl32_ep_info, PARAM_EP, 235f336774bSVictor Chong VERSION_1, 0); 236f336774bSVictor Chong bl2_to_bl31_params->bl32_image_info = &bl31_params_mem.bl32_image_info; 237f336774bSVictor Chong SET_PARAM_HEAD(bl2_to_bl31_params->bl32_image_info, PARAM_IMAGE_BINARY, 238f336774bSVictor Chong VERSION_1, 0); 239f336774bSVictor Chong #endif 240f336774bSVictor Chong 241e35d0edbSJorge Ramirez-Ortiz /* Fill BL3-3 related information */ 242e35d0edbSJorge Ramirez-Ortiz bl2_to_bl31_params->bl33_ep_info = &bl31_params_mem.bl33_ep_info; 243e35d0edbSJorge Ramirez-Ortiz SET_PARAM_HEAD(bl2_to_bl31_params->bl33_ep_info, 244e35d0edbSJorge Ramirez-Ortiz PARAM_EP, VERSION_1, 0); 245e35d0edbSJorge Ramirez-Ortiz 246e35d0edbSJorge Ramirez-Ortiz /* BL3-3 expects to receive the primary CPU MPID (through x0) */ 247e35d0edbSJorge Ramirez-Ortiz bl2_to_bl31_params->bl33_ep_info->args.arg0 = 0xffff & read_mpidr(); 248e35d0edbSJorge Ramirez-Ortiz 249e35d0edbSJorge Ramirez-Ortiz bl2_to_bl31_params->bl33_image_info = &bl31_params_mem.bl33_image_info; 250e35d0edbSJorge Ramirez-Ortiz SET_PARAM_HEAD(bl2_to_bl31_params->bl33_image_info, 251e35d0edbSJorge Ramirez-Ortiz PARAM_IMAGE_BINARY, VERSION_1, 0); 252e35d0edbSJorge Ramirez-Ortiz 253e35d0edbSJorge Ramirez-Ortiz return bl2_to_bl31_params; 254e35d0edbSJorge Ramirez-Ortiz } 255e35d0edbSJorge Ramirez-Ortiz 256e35d0edbSJorge Ramirez-Ortiz struct entry_point_info *bl2_plat_get_bl31_ep_info(void) 257e35d0edbSJorge Ramirez-Ortiz { 2580d8052a4SVictor Chong #if DEBUG 2590d8052a4SVictor Chong bl31_params_mem.bl31_ep_info.args.arg1 = POPLAR_BL31_PLAT_PARAM_VAL; 2600d8052a4SVictor Chong #endif 2610d8052a4SVictor Chong 262e35d0edbSJorge Ramirez-Ortiz return &bl31_params_mem.bl31_ep_info; 263e35d0edbSJorge Ramirez-Ortiz } 264e35d0edbSJorge Ramirez-Ortiz 265e35d0edbSJorge Ramirez-Ortiz void bl2_plat_set_bl31_ep_info(image_info_t *image, 266e35d0edbSJorge Ramirez-Ortiz entry_point_info_t *bl31_ep_info) 267e35d0edbSJorge Ramirez-Ortiz { 268e35d0edbSJorge Ramirez-Ortiz SET_SECURITY_STATE(bl31_ep_info->h.attr, SECURE); 269e35d0edbSJorge Ramirez-Ortiz bl31_ep_info->spsr = SPSR_64(MODE_EL3, MODE_SP_ELX, 270e35d0edbSJorge Ramirez-Ortiz DISABLE_ALL_EXCEPTIONS); 271e35d0edbSJorge Ramirez-Ortiz } 272e35d0edbSJorge Ramirez-Ortiz 273f336774bSVictor Chong /******************************************************************************* 274f336774bSVictor Chong * Before calling this function BL32 is loaded in memory and its entrypoint 275f336774bSVictor Chong * is set by load_image. This is a placeholder for the platform to change 276f336774bSVictor Chong * the entrypoint of BL32 and set SPSR and security state. 277f336774bSVictor Chong * On Poplar we only set the security state of the entrypoint 278f336774bSVictor Chong ******************************************************************************/ 279f336774bSVictor Chong #ifdef BL32_BASE 280f336774bSVictor Chong void bl2_plat_set_bl32_ep_info(image_info_t *bl32_image_info, 281f336774bSVictor Chong entry_point_info_t *bl32_ep_info) 282f336774bSVictor Chong { 283f336774bSVictor Chong SET_SECURITY_STATE(bl32_ep_info->h.attr, SECURE); 284f336774bSVictor Chong /* 285f336774bSVictor Chong * The Secure Payload Dispatcher service is responsible for 286f336774bSVictor Chong * setting the SPSR prior to entry into the BL32 image. 287f336774bSVictor Chong */ 288f336774bSVictor Chong bl32_ep_info->spsr = 0; 289f336774bSVictor Chong } 290f336774bSVictor Chong 291f336774bSVictor Chong /******************************************************************************* 292f336774bSVictor Chong * Populate the extents of memory available for loading BL32 293f336774bSVictor Chong ******************************************************************************/ 294f336774bSVictor Chong void bl2_plat_get_bl32_meminfo(meminfo_t *bl32_meminfo) 295f336774bSVictor Chong { 296f336774bSVictor Chong /* 297f336774bSVictor Chong * Populate the extents of memory available for loading BL32. 298f336774bSVictor Chong */ 299f336774bSVictor Chong bl32_meminfo->total_base = BL32_BASE; 300f336774bSVictor Chong bl32_meminfo->free_base = BL32_BASE; 301f336774bSVictor Chong bl32_meminfo->total_size = 302f336774bSVictor Chong (TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE; 303f336774bSVictor Chong bl32_meminfo->free_size = 304f336774bSVictor Chong (TSP_SEC_MEM_BASE + TSP_SEC_MEM_SIZE) - BL32_BASE; 305f336774bSVictor Chong } 306f336774bSVictor Chong #endif /* BL32_BASE */ 307f336774bSVictor Chong 308e35d0edbSJorge Ramirez-Ortiz void bl2_plat_set_bl33_ep_info(image_info_t *image, 309e35d0edbSJorge Ramirez-Ortiz entry_point_info_t *bl33_ep_info) 310e35d0edbSJorge Ramirez-Ortiz { 311e35d0edbSJorge Ramirez-Ortiz SET_SECURITY_STATE(bl33_ep_info->h.attr, NON_SECURE); 3120d8052a4SVictor Chong bl33_ep_info->spsr = poplar_get_spsr_for_bl33_entry(); 313e35d0edbSJorge Ramirez-Ortiz bl33_ep_info->args.arg2 = image->image_size; 314e35d0edbSJorge Ramirez-Ortiz } 315e35d0edbSJorge Ramirez-Ortiz 316e35d0edbSJorge Ramirez-Ortiz void bl2_plat_flush_bl31_params(void) 317e35d0edbSJorge Ramirez-Ortiz { 318e35d0edbSJorge Ramirez-Ortiz flush_dcache_range((unsigned long)&bl31_params_mem, 319e35d0edbSJorge Ramirez-Ortiz sizeof(bl2_to_bl31_params_mem_t)); 320e35d0edbSJorge Ramirez-Ortiz } 321e35d0edbSJorge Ramirez-Ortiz 322e35d0edbSJorge Ramirez-Ortiz void bl2_plat_get_bl33_meminfo(meminfo_t *bl33_meminfo) 323e35d0edbSJorge Ramirez-Ortiz { 324e35d0edbSJorge Ramirez-Ortiz bl33_meminfo->total_base = DDR_BASE; 325e35d0edbSJorge Ramirez-Ortiz bl33_meminfo->total_size = DDR_SIZE; 326e35d0edbSJorge Ramirez-Ortiz bl33_meminfo->free_base = DDR_BASE; 327e35d0edbSJorge Ramirez-Ortiz bl33_meminfo->free_size = DDR_SIZE; 328e35d0edbSJorge Ramirez-Ortiz } 3290d8052a4SVictor Chong #endif /* LOAD_IMAGE_V2 */ 330e35d0edbSJorge Ramirez-Ortiz 331e35d0edbSJorge Ramirez-Ortiz void bl2_early_platform_setup(meminfo_t *mem_layout) 332e35d0edbSJorge Ramirez-Ortiz { 33315b54e7bSVictor Chong #if !POPLAR_RECOVERY 33459149bbeSVictor Chong dw_mmc_params_t params = EMMC_INIT_PARAMS(POPLAR_EMMC_DESC_BASE); 33515b54e7bSVictor Chong #endif 33659149bbeSVictor Chong 337e35d0edbSJorge Ramirez-Ortiz console_init(PL011_UART0_BASE, PL011_UART0_CLK_IN_HZ, PL011_BAUDRATE); 338e35d0edbSJorge Ramirez-Ortiz 339e35d0edbSJorge Ramirez-Ortiz /* Enable arch timer */ 340e35d0edbSJorge Ramirez-Ortiz generic_delay_timer_init(); 341e35d0edbSJorge Ramirez-Ortiz 342e35d0edbSJorge Ramirez-Ortiz bl2_tzram_layout = *mem_layout; 34359149bbeSVictor Chong 34415b54e7bSVictor Chong #if !POPLAR_RECOVERY 34559149bbeSVictor Chong /* SoC-specific emmc register are initialized/configured by bootrom */ 34659149bbeSVictor Chong INFO("BL2: initializing emmc\n"); 34759149bbeSVictor Chong dw_mmc_init(¶ms); 34815b54e7bSVictor Chong #endif 34959149bbeSVictor Chong 35059149bbeSVictor Chong plat_io_setup(); 351e35d0edbSJorge Ramirez-Ortiz } 352e35d0edbSJorge Ramirez-Ortiz 353e35d0edbSJorge Ramirez-Ortiz void bl2_plat_arch_setup(void) 354e35d0edbSJorge Ramirez-Ortiz { 355e35d0edbSJorge Ramirez-Ortiz plat_configure_mmu_el1(bl2_tzram_layout.total_base, 356e35d0edbSJorge Ramirez-Ortiz bl2_tzram_layout.total_size, 357e35d0edbSJorge Ramirez-Ortiz BL2_RO_BASE, 358e35d0edbSJorge Ramirez-Ortiz BL2_RO_LIMIT, 359e35d0edbSJorge Ramirez-Ortiz BL2_COHERENT_RAM_BASE, 360e35d0edbSJorge Ramirez-Ortiz BL2_COHERENT_RAM_LIMIT); 361e35d0edbSJorge Ramirez-Ortiz } 362e35d0edbSJorge Ramirez-Ortiz 363e35d0edbSJorge Ramirez-Ortiz void bl2_platform_setup(void) 364e35d0edbSJorge Ramirez-Ortiz { 365e35d0edbSJorge Ramirez-Ortiz } 366e35d0edbSJorge Ramirez-Ortiz 3670d8052a4SVictor Chong uintptr_t plat_get_ns_image_entrypoint(void) 368e35d0edbSJorge Ramirez-Ortiz { 3690d8052a4SVictor Chong #ifdef PRELOADED_BL33_BASE 3700d8052a4SVictor Chong return PRELOADED_BL33_BASE; 3710d8052a4SVictor Chong #else 3725a3ec61fSVictor Chong return PLAT_POPLAR_NS_IMAGE_OFFSET; 3730d8052a4SVictor Chong #endif 374e35d0edbSJorge Ramirez-Ortiz } 375