1 /* 2 * Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 * 6 */ 7 #include <common/debug.h> 8 #include <common/fdt_fixup.h> 9 #include <common/fdt_wrappers.h> 10 #include <libfdt.h> 11 #include <lib/xlat_tables/xlat_tables_v2.h> 12 13 #include <plat_fdt.h> 14 #include <platform_def.h> 15 16 void prepare_dtb(void) 17 { 18 void *dtb; 19 int ret; 20 #if !defined(XILINX_OF_BOARD_DTB_ADDR) 21 return; 22 #else 23 dtb = (void *)XILINX_OF_BOARD_DTB_ADDR; 24 #endif 25 if (IS_TFA_IN_OCM(BL31_BASE)) 26 return; 27 28 #if defined(PLAT_XLAT_TABLES_DYNAMIC) 29 ret = mmap_add_dynamic_region((unsigned long long)dtb, 30 (uintptr_t)dtb, 31 XILINX_OF_BOARD_DTB_MAX_SIZE, 32 MT_MEMORY | MT_RW | MT_NS); 33 if (ret != 0) { 34 WARN("Failed to add dynamic region for dtb: error %d\n", ret); 35 return; 36 } 37 #endif 38 39 /* Return if no device tree is detected */ 40 if (fdt_check_header(dtb) != 0) { 41 NOTICE("Can't read DT at %p\n", dtb); 42 return; 43 } 44 45 ret = fdt_open_into(dtb, dtb, XILINX_OF_BOARD_DTB_MAX_SIZE); 46 if (ret < 0) { 47 ERROR("Invalid Device Tree at %p: error %d\n", dtb, ret); 48 return; 49 } 50 51 /* Reserve memory used by Trusted Firmware. */ 52 if (fdt_add_reserved_memory(dtb, "tf-a", BL31_BASE, BL31_LIMIT - BL31_BASE)) { 53 WARN("Failed to add reserved memory nodes for BL31 to DT.\n"); 54 return; 55 } 56 57 ret = fdt_pack(dtb); 58 if (ret < 0) { 59 ERROR("Failed to pack Device Tree at %p: error %d\n", dtb, ret); 60 return; 61 } 62 63 flush_dcache_range((uintptr_t)dtb, fdt_blob_size(dtb)); 64 65 #if defined(PLAT_XLAT_TABLES_DYNAMIC) 66 ret = mmap_remove_dynamic_region((uintptr_t)dtb, 67 XILINX_OF_BOARD_DTB_MAX_SIZE); 68 if (ret != 0) { 69 WARN("Failed to remove dynamic region for dtb: error %d\n", ret); 70 return; 71 } 72 #endif 73 74 INFO("Changed device tree to advertise PSCI and reserved memories.\n"); 75 } 76