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