1 /* 2 * Copyright (c) 2014-2025, 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 ******************************************************************************/ 20 void tsp_early_platform_setup(u_register_t arg0, u_register_t arg1, 21 u_register_t arg2, u_register_t arg3) 22 { 23 /* 24 * Register a different console than already in use to display 25 * messages from TSP 26 */ 27 static console_t tsp_boot_console; 28 int32_t rc; 29 30 #if defined(PLAT_zynqmp) 31 rc = console_cdns_register((uintptr_t)UART_BASE, 32 (uint32_t)get_uart_clk(), 33 (uint32_t)UART_BAUDRATE, 34 &tsp_boot_console); 35 #else 36 rc = console_pl011_register((uintptr_t)UART_BASE, 37 (uint32_t)get_uart_clk(), 38 (uint32_t)UART_BAUDRATE, 39 &tsp_boot_console); 40 #endif 41 42 if (rc == 0) { 43 panic(); 44 } 45 46 console_set_scope(&tsp_boot_console, 47 CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_BOOT); 48 } 49 50 /******************************************************************************* 51 * Perform platform specific setup placeholder 52 ******************************************************************************/ 53 void tsp_platform_setup(void) 54 { 55 /* 56 * For ZynqMP, the GICv2 driver needs to be initialized in S-EL1, 57 * and for other platforms, the GICv3 driver is initialized in EL3. 58 * This is because S-EL1 can use GIC system registers to manage 59 * interrupts and does not need to be initialized again in SEL1. 60 */ 61 #if defined(PLAT_zynqmp) 62 plat_arm_gic_driver_init(); 63 plat_arm_gic_init(); 64 #endif 65 } 66 67 /******************************************************************************* 68 * Perform the very early platform specific architectural setup here. At the 69 * moment this is only initializes the MMU 70 ******************************************************************************/ 71 void tsp_plat_arch_setup(void) 72 { 73 const mmap_region_t bl_regions[] = { 74 MAP_REGION_FLAT(BL32_BASE, BL32_END - BL32_BASE, 75 MT_MEMORY | MT_RW | MT_SECURE), 76 MAP_REGION_FLAT(BL_CODE_BASE, BL_CODE_END - BL_CODE_BASE, 77 MT_CODE | MT_SECURE), 78 MAP_REGION_FLAT(BL_RO_DATA_BASE, BL_RO_DATA_END - BL_RO_DATA_BASE, 79 MT_RO_DATA | MT_SECURE), 80 #if defined(PLAT_zynqmp) || defined(PLAT_versal) 81 MAP_REGION_FLAT(BL_COHERENT_RAM_BASE, 82 BL_COHERENT_RAM_END - BL_COHERENT_RAM_BASE, 83 MT_DEVICE | MT_RW | MT_SECURE), 84 #endif 85 {0} 86 }; 87 88 setup_page_tables(bl_regions, plat_get_mmap()); 89 enable_mmu_el1(0); 90 } 91