1ab13adddSAndre Przywara /* 2*c4c9e2bcSAbhi Singh * Copyright (c) 2015-2025, 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 9*c4c9e2bcSAbhi Singh #include "./include/rpi3_measured_boot.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> 21*c4c9e2bcSAbhi Singh #include <platform_def.h> 22ab13adddSAndre Przywara 234f2b9848SAndre Przywara #include <rpi_shared.h> 24ab13adddSAndre Przywara 25ab13adddSAndre Przywara /* Data structure which holds the extents of the trusted SRAM for BL2 */ 26ab13adddSAndre Przywara static meminfo_t bl2_tzram_layout __aligned(CACHE_WRITEBACK_GRANULE); 27ab13adddSAndre Przywara 28ab13adddSAndre Przywara /* Data structure which holds the MMC info */ 29ab13adddSAndre Przywara static struct mmc_device_info mmc_info; 30ab13adddSAndre Przywara 31*c4c9e2bcSAbhi Singh /* Variables that hold the eventlog addr and size for use in BL2 Measured Boot */ 32*c4c9e2bcSAbhi Singh static uint8_t *event_log_start; 33*c4c9e2bcSAbhi Singh static size_t event_log_size; 34*c4c9e2bcSAbhi Singh 35ab13adddSAndre Przywara static void rpi3_sdhost_setup(void) 36ab13adddSAndre Przywara { 37ab13adddSAndre Przywara struct rpi3_sdhost_params params; 38ab13adddSAndre Przywara 39ab13adddSAndre Przywara memset(¶ms, 0, sizeof(struct rpi3_sdhost_params)); 40ab13adddSAndre Przywara params.reg_base = RPI3_SDHOST_BASE; 41ab13adddSAndre Przywara params.bus_width = MMC_BUS_WIDTH_1; 42ab13adddSAndre Przywara params.clk_rate = 50000000; 43bd96d533SRob Newberry params.clk_rate_initial = (RPI3_SDHOST_MAX_CLOCK / HC_CLOCKDIVISOR_MAXVAL); 44ab13adddSAndre Przywara mmc_info.mmc_dev_type = MMC_IS_SD_HC; 45bd96d533SRob Newberry mmc_info.ocr_voltage = OCR_3_2_3_3 | OCR_3_3_3_4; 46ab13adddSAndre Przywara rpi3_sdhost_init(¶ms, &mmc_info); 47ab13adddSAndre Przywara } 48ab13adddSAndre Przywara 49*c4c9e2bcSAbhi Singh void rpi3_mboot_fetch_eventlog_info(uint8_t **eventlog_addr, size_t *eventlog_size) 50*c4c9e2bcSAbhi Singh { 51*c4c9e2bcSAbhi Singh *eventlog_addr = event_log_start; 52*c4c9e2bcSAbhi Singh *eventlog_size = event_log_size; 53*c4c9e2bcSAbhi Singh } 54*c4c9e2bcSAbhi Singh 55ab13adddSAndre Przywara /******************************************************************************* 56ab13adddSAndre Przywara * BL1 has passed the extents of the trusted SRAM that should be visible to BL2 57ab13adddSAndre Przywara * in x0. This memory layout is sitting at the base of the free trusted SRAM. 58ab13adddSAndre Przywara * Copy it to a safe location before its reclaimed by later BL2 functionality. 59ab13adddSAndre Przywara ******************************************************************************/ 60ab13adddSAndre Przywara 61ab13adddSAndre Przywara void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, 62ab13adddSAndre Przywara u_register_t arg2, u_register_t arg3) 63ab13adddSAndre Przywara { 64ab13adddSAndre Przywara meminfo_t *mem_layout = (meminfo_t *) arg1; 65ab13adddSAndre Przywara 66ab13adddSAndre Przywara /* Initialize the console to provide early debug support */ 67795aefe5SAndre Przywara rpi3_console_init(); 68ab13adddSAndre Przywara 69ab13adddSAndre Przywara /* Enable arch timer */ 70ab13adddSAndre Przywara generic_delay_timer_init(); 71ab13adddSAndre Przywara 72ab13adddSAndre Przywara /* Setup GPIO driver */ 730d92745eSAndre Przywara rpi3_gpio_init(); 74ab13adddSAndre Przywara 75ab13adddSAndre Przywara /* Setup the BL2 memory layout */ 76ab13adddSAndre Przywara bl2_tzram_layout = *mem_layout; 77ab13adddSAndre Przywara 78ab13adddSAndre Przywara /* Setup SDHost driver */ 79ab13adddSAndre Przywara rpi3_sdhost_setup(); 80ab13adddSAndre Przywara 81*c4c9e2bcSAbhi Singh /* populate eventlog addr and size for use in bl2 mboot */ 82*c4c9e2bcSAbhi Singh event_log_start = (uint8_t *)(uintptr_t)arg2; 83*c4c9e2bcSAbhi Singh event_log_size = arg3; 84*c4c9e2bcSAbhi Singh 85ab13adddSAndre Przywara plat_rpi3_io_setup(); 86ab13adddSAndre Przywara } 87ab13adddSAndre Przywara 88ab13adddSAndre Przywara void bl2_platform_setup(void) 89ab13adddSAndre Przywara { 90ab13adddSAndre Przywara /* 91ab13adddSAndre Przywara * This is where a TrustZone address space controller and other 92ab13adddSAndre Przywara * security related peripherals would be configured. 93ab13adddSAndre Przywara */ 94ab13adddSAndre Przywara } 95ab13adddSAndre Przywara 96ab13adddSAndre Przywara /******************************************************************************* 97ab13adddSAndre Przywara * Perform the very early platform specific architectural setup here. 98ab13adddSAndre Przywara ******************************************************************************/ 99ab13adddSAndre Przywara void bl2_plat_arch_setup(void) 100ab13adddSAndre Przywara { 101ab13adddSAndre Przywara rpi3_setup_page_tables(bl2_tzram_layout.total_base, 102ab13adddSAndre Przywara bl2_tzram_layout.total_size, 103ab13adddSAndre Przywara BL_CODE_BASE, BL_CODE_END, 104ab13adddSAndre Przywara BL_RO_DATA_BASE, BL_RO_DATA_END 105ab13adddSAndre Przywara #if USE_COHERENT_MEM 106ab13adddSAndre Przywara , BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END 107ab13adddSAndre Przywara #endif 108ab13adddSAndre Przywara ); 109ab13adddSAndre Przywara 110ab13adddSAndre Przywara enable_mmu_el1(0); 111ab13adddSAndre Przywara } 112ab13adddSAndre Przywara 113ab13adddSAndre Przywara /******************************************************************************* 114ab13adddSAndre Przywara * This function can be used by the platforms to update/use image 115ab13adddSAndre Przywara * information for given `image_id`. 116ab13adddSAndre Przywara ******************************************************************************/ 117ab13adddSAndre Przywara int bl2_plat_handle_post_image_load(unsigned int image_id) 118ab13adddSAndre Przywara { 119ab13adddSAndre Przywara int err = 0; 120ab13adddSAndre Przywara bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id); 121ab13adddSAndre Przywara #ifdef SPD_opteed 122ab13adddSAndre Przywara bl_mem_params_node_t *pager_mem_params = NULL; 123ab13adddSAndre Przywara bl_mem_params_node_t *paged_mem_params = NULL; 124ab13adddSAndre Przywara #endif 125ab13adddSAndre Przywara 126ab13adddSAndre Przywara assert(bl_mem_params != NULL); 127ab13adddSAndre Przywara 128ab13adddSAndre Przywara switch (image_id) { 129ab13adddSAndre Przywara case BL32_IMAGE_ID: 130ab13adddSAndre Przywara #ifdef SPD_opteed 131ab13adddSAndre Przywara pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID); 132ab13adddSAndre Przywara assert(pager_mem_params); 133ab13adddSAndre Przywara 134ab13adddSAndre Przywara paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID); 135ab13adddSAndre Przywara assert(paged_mem_params); 136ab13adddSAndre Przywara 137ab13adddSAndre Przywara err = parse_optee_header(&bl_mem_params->ep_info, 138ab13adddSAndre Przywara &pager_mem_params->image_info, 139ab13adddSAndre Przywara &paged_mem_params->image_info); 140ab13adddSAndre Przywara if (err != 0) 141ab13adddSAndre Przywara WARN("OPTEE header parse error.\n"); 142ab13adddSAndre Przywara #endif 143ab13adddSAndre Przywara bl_mem_params->ep_info.spsr = rpi3_get_spsr_for_bl32_entry(); 144ab13adddSAndre Przywara break; 145ab13adddSAndre Przywara 146ab13adddSAndre Przywara case BL33_IMAGE_ID: 147ab13adddSAndre Przywara /* BL33 expects to receive the primary CPU MPID (through r0) */ 148ab13adddSAndre Przywara bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr(); 149ab13adddSAndre Przywara bl_mem_params->ep_info.spsr = rpi3_get_spsr_for_bl33_entry(); 150ab13adddSAndre Przywara 151ab13adddSAndre Przywara /* Shutting down the SDHost driver to let BL33 drives SDHost.*/ 152ab13adddSAndre Przywara rpi3_sdhost_stop(); 153ab13adddSAndre Przywara break; 154ab13adddSAndre Przywara 155ab13adddSAndre Przywara default: 156ab13adddSAndre Przywara /* Do nothing in default case */ 157ab13adddSAndre Przywara break; 158ab13adddSAndre Przywara } 159ab13adddSAndre Przywara 160ab13adddSAndre Przywara return err; 161ab13adddSAndre Przywara } 162