1*ab13adddSAndre Przywara /* 2*ab13adddSAndre Przywara * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 3*ab13adddSAndre Przywara * 4*ab13adddSAndre Przywara * SPDX-License-Identifier: BSD-3-Clause 5*ab13adddSAndre Przywara */ 6*ab13adddSAndre Przywara 7*ab13adddSAndre Przywara #include <assert.h> 8*ab13adddSAndre Przywara 9*ab13adddSAndre Przywara #include <platform_def.h> 10*ab13adddSAndre Przywara 11*ab13adddSAndre Przywara #include <arch_helpers.h> 12*ab13adddSAndre Przywara #include <common/bl_common.h> 13*ab13adddSAndre Przywara #include <common/debug.h> 14*ab13adddSAndre Przywara #include <common/desc_image_load.h> 15*ab13adddSAndre Przywara #include <lib/optee_utils.h> 16*ab13adddSAndre Przywara #include <lib/xlat_tables/xlat_mmu_helpers.h> 17*ab13adddSAndre Przywara #include <lib/xlat_tables/xlat_tables_defs.h> 18*ab13adddSAndre Przywara #include <drivers/generic_delay_timer.h> 19*ab13adddSAndre Przywara #include <drivers/rpi3/gpio/rpi3_gpio.h> 20*ab13adddSAndre Przywara #include <drivers/rpi3/sdhost/rpi3_sdhost.h> 21*ab13adddSAndre Przywara 22*ab13adddSAndre Przywara #include "rpi3_private.h" 23*ab13adddSAndre Przywara 24*ab13adddSAndre Przywara /* Data structure which holds the extents of the trusted SRAM for BL2 */ 25*ab13adddSAndre Przywara static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE); 26*ab13adddSAndre Przywara 27*ab13adddSAndre Przywara /* rpi3 GPIO setup function. */ 28*ab13adddSAndre Przywara static void rpi3_gpio_setup(void) 29*ab13adddSAndre Przywara { 30*ab13adddSAndre Przywara struct rpi3_gpio_params params; 31*ab13adddSAndre Przywara 32*ab13adddSAndre Przywara memset(¶ms, 0, sizeof(struct rpi3_gpio_params)); 33*ab13adddSAndre Przywara params.reg_base = RPI3_GPIO_BASE; 34*ab13adddSAndre Przywara 35*ab13adddSAndre Przywara rpi3_gpio_init(¶ms); 36*ab13adddSAndre Przywara } 37*ab13adddSAndre Przywara 38*ab13adddSAndre Przywara /* Data structure which holds the MMC info */ 39*ab13adddSAndre Przywara static struct mmc_device_info mmc_info; 40*ab13adddSAndre Przywara 41*ab13adddSAndre Przywara static void rpi3_sdhost_setup(void) 42*ab13adddSAndre Przywara { 43*ab13adddSAndre Przywara struct rpi3_sdhost_params params; 44*ab13adddSAndre Przywara 45*ab13adddSAndre Przywara memset(¶ms, 0, sizeof(struct rpi3_sdhost_params)); 46*ab13adddSAndre Przywara params.reg_base = RPI3_SDHOST_BASE; 47*ab13adddSAndre Przywara params.bus_width = MMC_BUS_WIDTH_1; 48*ab13adddSAndre Przywara params.clk_rate = 50000000; 49*ab13adddSAndre Przywara mmc_info.mmc_dev_type = MMC_IS_SD_HC; 50*ab13adddSAndre Przywara rpi3_sdhost_init(¶ms, &mmc_info); 51*ab13adddSAndre Przywara } 52*ab13adddSAndre Przywara 53*ab13adddSAndre Przywara /******************************************************************************* 54*ab13adddSAndre Przywara * BL1 has passed the extents of the trusted SRAM that should be visible to BL2 55*ab13adddSAndre Przywara * in x0. This memory layout is sitting at the base of the free trusted SRAM. 56*ab13adddSAndre Przywara * Copy it to a safe location before its reclaimed by later BL2 functionality. 57*ab13adddSAndre Przywara ******************************************************************************/ 58*ab13adddSAndre Przywara 59*ab13adddSAndre Przywara void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, 60*ab13adddSAndre Przywara u_register_t arg2, u_register_t arg3) 61*ab13adddSAndre Przywara { 62*ab13adddSAndre Przywara meminfo_t *mem_layout = (meminfo_t *) arg1; 63*ab13adddSAndre Przywara 64*ab13adddSAndre Przywara /* Initialize the console to provide early debug support */ 65*ab13adddSAndre Przywara rpi3_console_init(); 66*ab13adddSAndre Przywara 67*ab13adddSAndre Przywara /* Enable arch timer */ 68*ab13adddSAndre Przywara generic_delay_timer_init(); 69*ab13adddSAndre Przywara 70*ab13adddSAndre Przywara /* Setup GPIO driver */ 71*ab13adddSAndre Przywara rpi3_gpio_setup(); 72*ab13adddSAndre Przywara 73*ab13adddSAndre Przywara /* Setup the BL2 memory layout */ 74*ab13adddSAndre Przywara bl2_tzram_layout = *mem_layout; 75*ab13adddSAndre Przywara 76*ab13adddSAndre Przywara /* Setup SDHost driver */ 77*ab13adddSAndre Przywara rpi3_sdhost_setup(); 78*ab13adddSAndre Przywara 79*ab13adddSAndre Przywara plat_rpi3_io_setup(); 80*ab13adddSAndre Przywara } 81*ab13adddSAndre Przywara 82*ab13adddSAndre Przywara void bl2_platform_setup(void) 83*ab13adddSAndre Przywara { 84*ab13adddSAndre Przywara /* 85*ab13adddSAndre Przywara * This is where a TrustZone address space controller and other 86*ab13adddSAndre Przywara * security related peripherals would be configured. 87*ab13adddSAndre Przywara */ 88*ab13adddSAndre Przywara } 89*ab13adddSAndre Przywara 90*ab13adddSAndre Przywara /******************************************************************************* 91*ab13adddSAndre Przywara * Perform the very early platform specific architectural setup here. 92*ab13adddSAndre Przywara ******************************************************************************/ 93*ab13adddSAndre Przywara void bl2_plat_arch_setup(void) 94*ab13adddSAndre Przywara { 95*ab13adddSAndre Przywara rpi3_setup_page_tables(bl2_tzram_layout.total_base, 96*ab13adddSAndre Przywara bl2_tzram_layout.total_size, 97*ab13adddSAndre Przywara BL_CODE_BASE, BL_CODE_END, 98*ab13adddSAndre Przywara BL_RO_DATA_BASE, BL_RO_DATA_END 99*ab13adddSAndre Przywara #if USE_COHERENT_MEM 100*ab13adddSAndre Przywara , BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END 101*ab13adddSAndre Przywara #endif 102*ab13adddSAndre Przywara ); 103*ab13adddSAndre Przywara 104*ab13adddSAndre Przywara enable_mmu_el1(0); 105*ab13adddSAndre Przywara } 106*ab13adddSAndre Przywara 107*ab13adddSAndre Przywara /******************************************************************************* 108*ab13adddSAndre Przywara * This function can be used by the platforms to update/use image 109*ab13adddSAndre Przywara * information for given `image_id`. 110*ab13adddSAndre Przywara ******************************************************************************/ 111*ab13adddSAndre Przywara int bl2_plat_handle_post_image_load(unsigned int image_id) 112*ab13adddSAndre Przywara { 113*ab13adddSAndre Przywara int err = 0; 114*ab13adddSAndre Przywara bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id); 115*ab13adddSAndre Przywara #ifdef SPD_opteed 116*ab13adddSAndre Przywara bl_mem_params_node_t *pager_mem_params = NULL; 117*ab13adddSAndre Przywara bl_mem_params_node_t *paged_mem_params = NULL; 118*ab13adddSAndre Przywara #endif 119*ab13adddSAndre Przywara 120*ab13adddSAndre Przywara assert(bl_mem_params != NULL); 121*ab13adddSAndre Przywara 122*ab13adddSAndre Przywara switch (image_id) { 123*ab13adddSAndre Przywara case BL32_IMAGE_ID: 124*ab13adddSAndre Przywara #ifdef SPD_opteed 125*ab13adddSAndre Przywara pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID); 126*ab13adddSAndre Przywara assert(pager_mem_params); 127*ab13adddSAndre Przywara 128*ab13adddSAndre Przywara paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID); 129*ab13adddSAndre Przywara assert(paged_mem_params); 130*ab13adddSAndre Przywara 131*ab13adddSAndre Przywara err = parse_optee_header(&bl_mem_params->ep_info, 132*ab13adddSAndre Przywara &pager_mem_params->image_info, 133*ab13adddSAndre Przywara &paged_mem_params->image_info); 134*ab13adddSAndre Przywara if (err != 0) 135*ab13adddSAndre Przywara WARN("OPTEE header parse error.\n"); 136*ab13adddSAndre Przywara #endif 137*ab13adddSAndre Przywara bl_mem_params->ep_info.spsr = rpi3_get_spsr_for_bl32_entry(); 138*ab13adddSAndre Przywara break; 139*ab13adddSAndre Przywara 140*ab13adddSAndre Przywara case BL33_IMAGE_ID: 141*ab13adddSAndre Przywara /* BL33 expects to receive the primary CPU MPID (through r0) */ 142*ab13adddSAndre Przywara bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr(); 143*ab13adddSAndre Przywara bl_mem_params->ep_info.spsr = rpi3_get_spsr_for_bl33_entry(); 144*ab13adddSAndre Przywara 145*ab13adddSAndre Przywara /* Shutting down the SDHost driver to let BL33 drives SDHost.*/ 146*ab13adddSAndre Przywara rpi3_sdhost_stop(); 147*ab13adddSAndre Przywara break; 148*ab13adddSAndre Przywara 149*ab13adddSAndre Przywara default: 150*ab13adddSAndre Przywara /* Do nothing in default case */ 151*ab13adddSAndre Przywara break; 152*ab13adddSAndre Przywara } 153*ab13adddSAndre Przywara 154*ab13adddSAndre Przywara return err; 155*ab13adddSAndre Przywara } 156