1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2017-2023, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <drivers/generic_delay_timer.h> 10*91f16700Schasinglulu #include <drivers/partition/partition.h> 11*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h> 12*91f16700Schasinglulu #include <plat/common/platform.h> 13*91f16700Schasinglulu #include <platform_def.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #pragma weak bl2_el3_early_platform_setup 16*91f16700Schasinglulu #pragma weak bl2_el3_plat_arch_setup 17*91f16700Schasinglulu #pragma weak bl2_el3_plat_prepare_exit 18*91f16700Schasinglulu 19*91f16700Schasinglulu #define MAP_BL2_EL3_TOTAL MAP_REGION_FLAT( \ 20*91f16700Schasinglulu bl2_el3_tzram_layout.total_base, \ 21*91f16700Schasinglulu bl2_el3_tzram_layout.total_size, \ 22*91f16700Schasinglulu MT_MEMORY | MT_RW | MT_SECURE) 23*91f16700Schasinglulu 24*91f16700Schasinglulu static meminfo_t bl2_el3_tzram_layout; 25*91f16700Schasinglulu 26*91f16700Schasinglulu /* 27*91f16700Schasinglulu * Perform arm specific early platform setup. At this moment we only initialize 28*91f16700Schasinglulu * the console and the memory layout. 29*91f16700Schasinglulu */ 30*91f16700Schasinglulu void arm_bl2_el3_early_platform_setup(void) 31*91f16700Schasinglulu { 32*91f16700Schasinglulu /* Initialize the console to provide early debug support */ 33*91f16700Schasinglulu arm_console_boot_init(); 34*91f16700Schasinglulu 35*91f16700Schasinglulu /* 36*91f16700Schasinglulu * Allow BL2 to see the whole Trusted RAM. This is determined 37*91f16700Schasinglulu * statically since we cannot rely on BL1 passing this information 38*91f16700Schasinglulu * in the RESET_TO_BL2 case. 39*91f16700Schasinglulu */ 40*91f16700Schasinglulu bl2_el3_tzram_layout.total_base = ARM_BL_RAM_BASE; 41*91f16700Schasinglulu bl2_el3_tzram_layout.total_size = ARM_BL_RAM_SIZE; 42*91f16700Schasinglulu 43*91f16700Schasinglulu /* Initialise the IO layer and register platform IO devices */ 44*91f16700Schasinglulu plat_arm_io_setup(); 45*91f16700Schasinglulu } 46*91f16700Schasinglulu 47*91f16700Schasinglulu void bl2_el3_early_platform_setup(u_register_t arg0 __unused, 48*91f16700Schasinglulu u_register_t arg1 __unused, 49*91f16700Schasinglulu u_register_t arg2 __unused, 50*91f16700Schasinglulu u_register_t arg3 __unused) 51*91f16700Schasinglulu { 52*91f16700Schasinglulu arm_bl2_el3_early_platform_setup(); 53*91f16700Schasinglulu 54*91f16700Schasinglulu /* 55*91f16700Schasinglulu * Initialize Interconnect for this cluster during cold boot. 56*91f16700Schasinglulu * No need for locks as no other CPU is active. 57*91f16700Schasinglulu */ 58*91f16700Schasinglulu plat_arm_interconnect_init(); 59*91f16700Schasinglulu /* 60*91f16700Schasinglulu * Enable Interconnect coherency for the primary CPU's cluster. 61*91f16700Schasinglulu */ 62*91f16700Schasinglulu plat_arm_interconnect_enter_coherency(); 63*91f16700Schasinglulu 64*91f16700Schasinglulu generic_delay_timer_init(); 65*91f16700Schasinglulu } 66*91f16700Schasinglulu 67*91f16700Schasinglulu /******************************************************************************* 68*91f16700Schasinglulu * Perform the very early platform specific architectural setup here. At the 69*91f16700Schasinglulu * moment this is only initializes the mmu in a quick and dirty way. 70*91f16700Schasinglulu ******************************************************************************/ 71*91f16700Schasinglulu void arm_bl2_el3_plat_arch_setup(void) 72*91f16700Schasinglulu { 73*91f16700Schasinglulu 74*91f16700Schasinglulu #if USE_COHERENT_MEM 75*91f16700Schasinglulu /* Ensure ARM platforms dont use coherent memory 76*91f16700Schasinglulu * in RESET_TO_BL2 77*91f16700Schasinglulu */ 78*91f16700Schasinglulu assert(BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE == 0U); 79*91f16700Schasinglulu #endif 80*91f16700Schasinglulu 81*91f16700Schasinglulu const mmap_region_t bl_regions[] = { 82*91f16700Schasinglulu MAP_BL2_EL3_TOTAL, 83*91f16700Schasinglulu ARM_MAP_BL_RO, 84*91f16700Schasinglulu {0} 85*91f16700Schasinglulu }; 86*91f16700Schasinglulu 87*91f16700Schasinglulu setup_page_tables(bl_regions, plat_arm_get_mmap()); 88*91f16700Schasinglulu 89*91f16700Schasinglulu #ifdef __aarch64__ 90*91f16700Schasinglulu enable_mmu_el3(0); 91*91f16700Schasinglulu #else 92*91f16700Schasinglulu enable_mmu_svc_mon(0); 93*91f16700Schasinglulu #endif 94*91f16700Schasinglulu } 95*91f16700Schasinglulu 96*91f16700Schasinglulu void bl2_el3_plat_arch_setup(void) 97*91f16700Schasinglulu { 98*91f16700Schasinglulu int __maybe_unused ret; 99*91f16700Schasinglulu arm_bl2_el3_plat_arch_setup(); 100*91f16700Schasinglulu #if ARM_GPT_SUPPORT 101*91f16700Schasinglulu ret = gpt_partition_init(); 102*91f16700Schasinglulu if (ret != 0) { 103*91f16700Schasinglulu ERROR("GPT partition initialisation failed!\n"); 104*91f16700Schasinglulu panic(); 105*91f16700Schasinglulu } 106*91f16700Schasinglulu #endif /* ARM_GPT_SUPPORT */ 107*91f16700Schasinglulu } 108*91f16700Schasinglulu 109*91f16700Schasinglulu void bl2_el3_plat_prepare_exit(void) 110*91f16700Schasinglulu { 111*91f16700Schasinglulu } 112