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