xref: /arm-trusted-firmware/plat/arm/common/arm_bl2_el3_setup.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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