xref: /rk3399_ARM-atf/plat/arm/common/arm_bl2_el3_setup.c (revision 88a0523e914cb28fded2ce398a184e0c0e8843c8)
181528dbcSRoberto Vargas /*
2*88a0523eSAntonio Nino Diaz  * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
381528dbcSRoberto Vargas  *
481528dbcSRoberto Vargas  * SPDX-License-Identifier: BSD-3-Clause
581528dbcSRoberto Vargas  */
681528dbcSRoberto Vargas #include <generic_delay_timer.h>
781528dbcSRoberto Vargas #include <plat_arm.h>
881528dbcSRoberto Vargas #include <platform.h>
981528dbcSRoberto Vargas 
1081528dbcSRoberto Vargas #pragma weak bl2_el3_early_platform_setup
1181528dbcSRoberto Vargas #pragma weak bl2_el3_plat_arch_setup
1281528dbcSRoberto Vargas #pragma weak bl2_el3_plat_prepare_exit
1381528dbcSRoberto Vargas 
1481528dbcSRoberto Vargas static meminfo_t bl2_el3_tzram_layout;
1581528dbcSRoberto Vargas 
1681528dbcSRoberto Vargas /*
1781528dbcSRoberto Vargas  * Perform arm specific early platform setup. At this moment we only initialize
1881528dbcSRoberto Vargas  * the console and the memory layout.
1981528dbcSRoberto Vargas  */
2081528dbcSRoberto Vargas void arm_bl2_el3_early_platform_setup(void)
2181528dbcSRoberto Vargas {
2281528dbcSRoberto Vargas 	/* Initialize the console to provide early debug support */
23*88a0523eSAntonio Nino Diaz 	arm_console_boot_init();
2481528dbcSRoberto Vargas 
2581528dbcSRoberto Vargas 	/*
2681528dbcSRoberto Vargas 	 * Allow BL2 to see the whole Trusted RAM. This is determined
2781528dbcSRoberto Vargas 	 * statically since we cannot rely on BL1 passing this information
2881528dbcSRoberto Vargas 	 * in the BL2_AT_EL3 case.
2981528dbcSRoberto Vargas 	 */
3081528dbcSRoberto Vargas 	bl2_el3_tzram_layout.total_base = ARM_BL_RAM_BASE;
3181528dbcSRoberto Vargas 	bl2_el3_tzram_layout.total_size = ARM_BL_RAM_SIZE;
3281528dbcSRoberto Vargas 
3381528dbcSRoberto Vargas 	/* Initialise the IO layer and register platform IO devices */
3481528dbcSRoberto Vargas 	plat_arm_io_setup();
3581528dbcSRoberto Vargas }
3681528dbcSRoberto Vargas 
3781528dbcSRoberto Vargas void bl2_el3_early_platform_setup(u_register_t arg0 __unused,
3881528dbcSRoberto Vargas 				  u_register_t arg1 __unused,
3981528dbcSRoberto Vargas 				  u_register_t arg2 __unused,
4081528dbcSRoberto Vargas 				  u_register_t arg3 __unused)
4181528dbcSRoberto Vargas {
4281528dbcSRoberto Vargas 	arm_bl2_el3_early_platform_setup();
4381528dbcSRoberto Vargas 
4481528dbcSRoberto Vargas 	/*
4581528dbcSRoberto Vargas 	 * Initialize Interconnect for this cluster during cold boot.
4681528dbcSRoberto Vargas 	 * No need for locks as no other CPU is active.
4781528dbcSRoberto Vargas 	 */
4881528dbcSRoberto Vargas 	plat_arm_interconnect_init();
4981528dbcSRoberto Vargas 	/*
5081528dbcSRoberto Vargas 	 * Enable Interconnect coherency for the primary CPU's cluster.
5181528dbcSRoberto Vargas 	 */
5281528dbcSRoberto Vargas 	plat_arm_interconnect_enter_coherency();
5381528dbcSRoberto Vargas 
5481528dbcSRoberto Vargas 	generic_delay_timer_init();
5581528dbcSRoberto Vargas }
5681528dbcSRoberto Vargas 
5781528dbcSRoberto Vargas /*******************************************************************************
5881528dbcSRoberto Vargas  * Perform the very early platform specific architectural setup here. At the
5981528dbcSRoberto Vargas  * moment this is only initializes the mmu in a quick and dirty way.
6081528dbcSRoberto Vargas  ******************************************************************************/
6181528dbcSRoberto Vargas void arm_bl2_el3_plat_arch_setup(void)
6281528dbcSRoberto Vargas {
6381528dbcSRoberto Vargas 	arm_setup_page_tables(bl2_el3_tzram_layout.total_base,
6481528dbcSRoberto Vargas 			      bl2_el3_tzram_layout.total_size,
6581528dbcSRoberto Vargas 			      BL_CODE_BASE,
6681528dbcSRoberto Vargas 			      BL_CODE_END,
6781528dbcSRoberto Vargas 			      BL_RO_DATA_BASE,
6881528dbcSRoberto Vargas 			      BL_RO_DATA_END
6981528dbcSRoberto Vargas #if USE_COHERENT_MEM
7081528dbcSRoberto Vargas 			      , BL_COHERENT_RAM_BASE,
7181528dbcSRoberto Vargas 			      BL_COHERENT_RAM_END
7281528dbcSRoberto Vargas #endif
7381528dbcSRoberto Vargas 			      );
7481528dbcSRoberto Vargas 
7581528dbcSRoberto Vargas #ifdef AARCH32
7681528dbcSRoberto Vargas 	enable_mmu_secure(0);
7781528dbcSRoberto Vargas #else
7881528dbcSRoberto Vargas 	enable_mmu_el3(0);
7981528dbcSRoberto Vargas #endif
8081528dbcSRoberto Vargas }
8181528dbcSRoberto Vargas 
8281528dbcSRoberto Vargas void bl2_el3_plat_arch_setup(void)
8381528dbcSRoberto Vargas {
8481528dbcSRoberto Vargas 	arm_bl2_el3_plat_arch_setup();
8581528dbcSRoberto Vargas }
8681528dbcSRoberto Vargas 
8781528dbcSRoberto Vargas void bl2_el3_plat_prepare_exit(void)
8881528dbcSRoberto Vargas {
8981528dbcSRoberto Vargas }
90