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 #if defined(XILINX_OF_BOARD_DTB_ADDR) 19 void *dtb; 20 int map_ret = 0; 21 int ret = 0; 22 23 dtb = (void *)XILINX_OF_BOARD_DTB_ADDR; 24 25 if (!IS_TFA_IN_OCM(BL31_BASE)) { 26 27 #if defined(PLAT_XLAT_TABLES_DYNAMIC) 28 map_ret = mmap_add_dynamic_region((unsigned long long)dtb, 29 (uintptr_t)dtb, 30 XILINX_OF_BOARD_DTB_MAX_SIZE, 31 MT_MEMORY | MT_RW | MT_NS); 32 if (map_ret != 0) { 33 WARN("Failed to add dynamic region for dtb: error %d\n", 34 map_ret); 35 } 36 #endif 37 38 if (!map_ret) { 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 } else { 43 ret = fdt_open_into(dtb, dtb, XILINX_OF_BOARD_DTB_MAX_SIZE); 44 45 if (ret < 0) { 46 ERROR("Invalid Device Tree at %p: error %d\n", 47 dtb, ret); 48 } else { 49 50 if (dt_add_psci_node(dtb)) { 51 WARN("Failed to add PSCI Device Tree node\n"); 52 } 53 54 if (dt_add_psci_cpu_enable_methods(dtb)) { 55 WARN("Failed to add PSCI cpu enable methods in DT\n"); 56 } 57 58 /* Reserve memory used by Trusted Firmware. */ 59 ret = fdt_add_reserved_memory(dtb, 60 "tf-a", 61 BL31_BASE, 62 BL31_LIMIT 63 - 64 BL31_BASE); 65 if (ret < 0) { 66 WARN("Failed to add reserved memory nodes for BL31 to DT.\n"); 67 } 68 69 ret = fdt_pack(dtb); 70 if (ret < 0) { 71 WARN("Failed to pack dtb at %p: error %d\n", 72 dtb, ret); 73 } 74 flush_dcache_range((uintptr_t)dtb, 75 fdt_blob_size(dtb)); 76 77 INFO("Changed device tree to advertise PSCI and reserved memories.\n"); 78 79 } 80 } 81 82 } 83 84 85 #if defined(PLAT_XLAT_TABLES_DYNAMIC) 86 if (!map_ret) { 87 ret = mmap_remove_dynamic_region((uintptr_t)dtb, 88 XILINX_OF_BOARD_DTB_MAX_SIZE); 89 if (ret != 0) { 90 WARN("Failed to remove dynamic region for dtb:error %d\n", 91 ret); 92 } 93 } 94 #endif 95 } 96 97 #endif 98 } 99