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 <platform_def.h> 8ab13adddSAndre Przywara 9ab13adddSAndre Przywara #include <arch.h> 10ab13adddSAndre Przywara #include <arch_helpers.h> 11ab13adddSAndre Przywara #include <common/bl_common.h> 12ab13adddSAndre Przywara #include <common/debug.h> 13*dcf6d4f8SAndre Przywara #include <lib/mmio.h> 14ab13adddSAndre Przywara #include <lib/xlat_tables/xlat_mmu_helpers.h> 15ab13adddSAndre Przywara #include <lib/xlat_tables/xlat_tables_defs.h> 16ab13adddSAndre Przywara 174f2b9848SAndre Przywara #include <rpi_shared.h> 18ab13adddSAndre Przywara 19ab13adddSAndre Przywara /* Data structure which holds the extents of the trusted SRAM for BL1 */ 20ab13adddSAndre Przywara static meminfo_t bl1_tzram_layout; 21ab13adddSAndre Przywara 22ab13adddSAndre Przywara meminfo_t *bl1_plat_sec_mem_layout(void) 23ab13adddSAndre Przywara { 24ab13adddSAndre Przywara return &bl1_tzram_layout; 25ab13adddSAndre Przywara } 26ab13adddSAndre Przywara 27ab13adddSAndre Przywara /******************************************************************************* 28ab13adddSAndre Przywara * Perform any BL1 specific platform actions. 29ab13adddSAndre Przywara ******************************************************************************/ 30ab13adddSAndre Przywara void bl1_early_platform_setup(void) 31ab13adddSAndre Przywara { 32*dcf6d4f8SAndre Przywara /* use the 19.2 MHz clock for the architected timer */ 33*dcf6d4f8SAndre Przywara mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_CONTROL_OFFSET, 0); 34*dcf6d4f8SAndre Przywara mmio_write_32(RPI3_INTC_BASE_ADDRESS + RPI3_INTC_PRESCALER_OFFSET, 35*dcf6d4f8SAndre Przywara 0x80000000); 36*dcf6d4f8SAndre Przywara 37ab13adddSAndre Przywara /* Initialize the console to provide early debug support */ 38ab13adddSAndre Przywara rpi3_console_init(); 39ab13adddSAndre Przywara 40ab13adddSAndre Przywara /* Allow BL1 to see the whole Trusted RAM */ 41ab13adddSAndre Przywara bl1_tzram_layout.total_base = BL_RAM_BASE; 42ab13adddSAndre Przywara bl1_tzram_layout.total_size = BL_RAM_SIZE; 43ab13adddSAndre Przywara } 44ab13adddSAndre Przywara 45ab13adddSAndre Przywara /****************************************************************************** 46ab13adddSAndre Przywara * Perform the very early platform specific architecture setup. This only 47ab13adddSAndre Przywara * does basic initialization. Later architectural setup (bl1_arch_setup()) 48ab13adddSAndre Przywara * does not do anything platform specific. 49ab13adddSAndre Przywara *****************************************************************************/ 50ab13adddSAndre Przywara void bl1_plat_arch_setup(void) 51ab13adddSAndre Przywara { 52ab13adddSAndre Przywara rpi3_setup_page_tables(bl1_tzram_layout.total_base, 53ab13adddSAndre Przywara bl1_tzram_layout.total_size, 54ab13adddSAndre Przywara BL_CODE_BASE, BL1_CODE_END, 55ab13adddSAndre Przywara BL1_RO_DATA_BASE, BL1_RO_DATA_END 56ab13adddSAndre Przywara #if USE_COHERENT_MEM 57ab13adddSAndre Przywara , BL_COHERENT_RAM_BASE, BL_COHERENT_RAM_END 58ab13adddSAndre Przywara #endif 59ab13adddSAndre Przywara ); 60ab13adddSAndre Przywara 61ab13adddSAndre Przywara enable_mmu_el3(0); 62ab13adddSAndre Przywara } 63ab13adddSAndre Przywara 64ab13adddSAndre Przywara void bl1_platform_setup(void) 65ab13adddSAndre Przywara { 66ab13adddSAndre Przywara uint32_t __unused rev; 67ab13adddSAndre Przywara int __unused rc; 68ab13adddSAndre Przywara 69ab13adddSAndre Przywara rc = rpi3_vc_hardware_get_board_revision(&rev); 70ab13adddSAndre Przywara 71ab13adddSAndre Przywara if (rc == 0) { 72ab13adddSAndre Przywara const char __unused *model, __unused *info; 73ab13adddSAndre Przywara 74ab13adddSAndre Przywara switch (rev) { 75ab13adddSAndre Przywara case 0xA02082: 76ab13adddSAndre Przywara model = "Raspberry Pi 3 Model B"; 77ab13adddSAndre Przywara info = "(1GB, Sony, UK)"; 78ab13adddSAndre Przywara break; 79ab13adddSAndre Przywara case 0xA22082: 80ab13adddSAndre Przywara model = "Raspberry Pi 3 Model B"; 81ab13adddSAndre Przywara info = "(1GB, Embest, China)"; 82ab13adddSAndre Przywara break; 83ab13adddSAndre Przywara case 0xA020D3: 84ab13adddSAndre Przywara model = "Raspberry Pi 3 Model B+"; 85ab13adddSAndre Przywara info = "(1GB, Sony, UK)"; 86ab13adddSAndre Przywara break; 87ab13adddSAndre Przywara default: 88ab13adddSAndre Przywara model = "Unknown"; 89ab13adddSAndre Przywara info = "(Unknown)"; 90ab13adddSAndre Przywara ERROR("rpi3: Unknown board revision 0x%08x\n", rev); 91ab13adddSAndre Przywara break; 92ab13adddSAndre Przywara } 93ab13adddSAndre Przywara 94ab13adddSAndre Przywara NOTICE("rpi3: Detected: %s %s [0x%08x]\n", model, info, rev); 95ab13adddSAndre Przywara } else { 96ab13adddSAndre Przywara ERROR("rpi3: Unable to detect board revision\n"); 97ab13adddSAndre Przywara } 98ab13adddSAndre Przywara 99ab13adddSAndre Przywara /* Initialise the IO layer and register platform IO devices */ 100ab13adddSAndre Przywara plat_rpi3_io_setup(); 101ab13adddSAndre Przywara } 102