1 /*
2  * Copyright (c) 2014-2019, Arm Limited and Contributors. All rights reserved.
3  * Copyright (c) 2023, Advanced Micro Devices. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <common/bl_common.h>
9 #include <common/debug.h>
10 #include <drivers/arm/pl011.h>
11 #include <drivers/console.h>
12 #include <plat/arm/common/plat_arm.h>
13 #include <platform_tsp.h>
14 
15 #include <plat_private.h>
16 
17 /*******************************************************************************
18  * Initialize the UART
19  ******************************************************************************/
tsp_early_platform_setup(void)20 void tsp_early_platform_setup(void)
21 {
22 	/*
23 	 * Register a different console than already in use to display
24 	 * messages from TSP
25 	 */
26 	static console_t tsp_boot_console;
27 	int32_t rc;
28 
29 #if defined(PLAT_zynqmp)
30 	rc = console_cdns_register((uintptr_t)UART_BASE,
31 				   (uint32_t)get_uart_clk(),
32 				   (uint32_t)UART_BAUDRATE,
33 				   &tsp_boot_console);
34 #else
35 	rc = console_pl011_register((uintptr_t)UART_BASE,
36 				    (uint32_t)get_uart_clk(),
37 				    (uint32_t)UART_BAUDRATE,
38 				    &tsp_boot_console);
39 #endif
40 
41 	if (rc == 0) {
42 		panic();
43 	}
44 
45 	console_set_scope(&tsp_boot_console,
46 			  CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_BOOT);
47 }
48 
49 /*******************************************************************************
50  * Perform platform specific setup placeholder
51  ******************************************************************************/
tsp_platform_setup(void)52 void tsp_platform_setup(void)
53 {
54 /*
55  * For ZynqMP, the GICv2 driver needs to be initialized in S-EL1,
56  * and for other platforms, the GICv3 driver is initialized in EL3.
57  * This is because S-EL1 can use GIC system registers to manage
58  * interrupts and does not need to be initialized again in SEL1.
59  */
60 #if defined(PLAT_zynqmp)
61 	plat_arm_gic_driver_init();
62 	plat_arm_gic_init();
63 #endif
64 }
65 
66 /*******************************************************************************
67  * Perform the very early platform specific architectural setup here. At the
68  * moment this is only initializes the MMU
69  ******************************************************************************/
tsp_plat_arch_setup(void)70 void tsp_plat_arch_setup(void)
71 {
72 	const mmap_region_t bl_regions[] = {
73 		MAP_REGION_FLAT(BL32_BASE, BL32_END - BL32_BASE,
74 			MT_MEMORY | MT_RW | MT_SECURE),
75 		MAP_REGION_FLAT(BL_CODE_BASE, BL_CODE_END - BL_CODE_BASE,
76 			MT_CODE | MT_SECURE),
77 		MAP_REGION_FLAT(BL_RO_DATA_BASE, BL_RO_DATA_END - BL_RO_DATA_BASE,
78 			MT_RO_DATA | MT_SECURE),
79 #if defined(PLAT_zynqmp) || defined(PLAT_versal)
80 		MAP_REGION_FLAT(BL_COHERENT_RAM_BASE,
81 			BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE,
82 			MT_DEVICE | MT_RW | MT_SECURE),
83 #endif
84 		{0}
85 	};
86 
87 	setup_page_tables(bl_regions, plat_get_mmap());
88 	enable_mmu_el1(0);
89 }
90