1*81528dbcSRoberto Vargas /* 2*81528dbcSRoberto Vargas * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3*81528dbcSRoberto Vargas * 4*81528dbcSRoberto Vargas * SPDX-License-Identifier: BSD-3-Clause 5*81528dbcSRoberto Vargas */ 6*81528dbcSRoberto Vargas #include <console.h> 7*81528dbcSRoberto Vargas #include <generic_delay_timer.h> 8*81528dbcSRoberto Vargas #include <plat_arm.h> 9*81528dbcSRoberto Vargas #include <platform.h> 10*81528dbcSRoberto Vargas 11*81528dbcSRoberto Vargas #pragma weak bl2_el3_early_platform_setup 12*81528dbcSRoberto Vargas #pragma weak bl2_el3_plat_arch_setup 13*81528dbcSRoberto Vargas #pragma weak bl2_el3_plat_prepare_exit 14*81528dbcSRoberto Vargas 15*81528dbcSRoberto Vargas static meminfo_t bl2_el3_tzram_layout; 16*81528dbcSRoberto Vargas 17*81528dbcSRoberto Vargas /* 18*81528dbcSRoberto Vargas * Perform arm specific early platform setup. At this moment we only initialize 19*81528dbcSRoberto Vargas * the console and the memory layout. 20*81528dbcSRoberto Vargas */ 21*81528dbcSRoberto Vargas void arm_bl2_el3_early_platform_setup(void) 22*81528dbcSRoberto Vargas { 23*81528dbcSRoberto Vargas /* Initialize the console to provide early debug support */ 24*81528dbcSRoberto Vargas console_init(PLAT_ARM_BOOT_UART_BASE, PLAT_ARM_BOOT_UART_CLK_IN_HZ, 25*81528dbcSRoberto Vargas ARM_CONSOLE_BAUDRATE); 26*81528dbcSRoberto Vargas 27*81528dbcSRoberto Vargas /* 28*81528dbcSRoberto Vargas * Allow BL2 to see the whole Trusted RAM. This is determined 29*81528dbcSRoberto Vargas * statically since we cannot rely on BL1 passing this information 30*81528dbcSRoberto Vargas * in the BL2_AT_EL3 case. 31*81528dbcSRoberto Vargas */ 32*81528dbcSRoberto Vargas bl2_el3_tzram_layout.total_base = ARM_BL_RAM_BASE; 33*81528dbcSRoberto Vargas bl2_el3_tzram_layout.total_size = ARM_BL_RAM_SIZE; 34*81528dbcSRoberto Vargas 35*81528dbcSRoberto Vargas /* Initialise the IO layer and register platform IO devices */ 36*81528dbcSRoberto Vargas plat_arm_io_setup(); 37*81528dbcSRoberto Vargas } 38*81528dbcSRoberto Vargas 39*81528dbcSRoberto Vargas void bl2_el3_early_platform_setup(u_register_t arg0 __unused, 40*81528dbcSRoberto Vargas u_register_t arg1 __unused, 41*81528dbcSRoberto Vargas u_register_t arg2 __unused, 42*81528dbcSRoberto Vargas u_register_t arg3 __unused) 43*81528dbcSRoberto Vargas { 44*81528dbcSRoberto Vargas arm_bl2_el3_early_platform_setup(); 45*81528dbcSRoberto Vargas 46*81528dbcSRoberto Vargas /* 47*81528dbcSRoberto Vargas * Initialize Interconnect for this cluster during cold boot. 48*81528dbcSRoberto Vargas * No need for locks as no other CPU is active. 49*81528dbcSRoberto Vargas */ 50*81528dbcSRoberto Vargas plat_arm_interconnect_init(); 51*81528dbcSRoberto Vargas /* 52*81528dbcSRoberto Vargas * Enable Interconnect coherency for the primary CPU's cluster. 53*81528dbcSRoberto Vargas */ 54*81528dbcSRoberto Vargas plat_arm_interconnect_enter_coherency(); 55*81528dbcSRoberto Vargas 56*81528dbcSRoberto Vargas generic_delay_timer_init(); 57*81528dbcSRoberto Vargas } 58*81528dbcSRoberto Vargas 59*81528dbcSRoberto Vargas /******************************************************************************* 60*81528dbcSRoberto Vargas * Perform the very early platform specific architectural setup here. At the 61*81528dbcSRoberto Vargas * moment this is only initializes the mmu in a quick and dirty way. 62*81528dbcSRoberto Vargas ******************************************************************************/ 63*81528dbcSRoberto Vargas void arm_bl2_el3_plat_arch_setup(void) 64*81528dbcSRoberto Vargas { 65*81528dbcSRoberto Vargas arm_setup_page_tables(bl2_el3_tzram_layout.total_base, 66*81528dbcSRoberto Vargas bl2_el3_tzram_layout.total_size, 67*81528dbcSRoberto Vargas BL_CODE_BASE, 68*81528dbcSRoberto Vargas BL_CODE_END, 69*81528dbcSRoberto Vargas BL_RO_DATA_BASE, 70*81528dbcSRoberto Vargas BL_RO_DATA_END 71*81528dbcSRoberto Vargas #if USE_COHERENT_MEM 72*81528dbcSRoberto Vargas , BL_COHERENT_RAM_BASE, 73*81528dbcSRoberto Vargas BL_COHERENT_RAM_END 74*81528dbcSRoberto Vargas #endif 75*81528dbcSRoberto Vargas ); 76*81528dbcSRoberto Vargas 77*81528dbcSRoberto Vargas #ifdef AARCH32 78*81528dbcSRoberto Vargas enable_mmu_secure(0); 79*81528dbcSRoberto Vargas #else 80*81528dbcSRoberto Vargas enable_mmu_el3(0); 81*81528dbcSRoberto Vargas #endif 82*81528dbcSRoberto Vargas } 83*81528dbcSRoberto Vargas 84*81528dbcSRoberto Vargas void bl2_el3_plat_arch_setup(void) 85*81528dbcSRoberto Vargas { 86*81528dbcSRoberto Vargas arm_bl2_el3_plat_arch_setup(); 87*81528dbcSRoberto Vargas } 88*81528dbcSRoberto Vargas 89*81528dbcSRoberto Vargas void bl2_el3_plat_prepare_exit(void) 90*81528dbcSRoberto Vargas { 91*81528dbcSRoberto Vargas } 92