xref: /rk3399_ARM-atf/plat/xilinx/common/plat_fdt.c (revision 7ca7fb1bf0873824531a6eee2da1214b61496b02)
156d1857eSAmit Nagal /*
256d1857eSAmit Nagal  * Copyright (c) 2023, Advanced Micro Devices, Inc. All rights reserved.
356d1857eSAmit Nagal  *
456d1857eSAmit Nagal  * SPDX-License-Identifier: BSD-3-Clause
556d1857eSAmit Nagal  *
656d1857eSAmit Nagal  */
7744d60aaSAkshay Belsare #include <common/debug.h>
856d1857eSAmit Nagal #include <common/fdt_fixup.h>
956d1857eSAmit Nagal #include <common/fdt_wrappers.h>
10744d60aaSAkshay Belsare #include <libfdt.h>
11*7ca7fb1bSAmit Nagal #include <lib/xlat_tables/xlat_tables_v2.h>
1256d1857eSAmit Nagal 
1356d1857eSAmit Nagal #include <plat_fdt.h>
1456d1857eSAmit Nagal #include <platform_def.h>
1556d1857eSAmit Nagal 
1656d1857eSAmit Nagal void prepare_dtb(void)
1756d1857eSAmit Nagal {
18fdf8f929SAmit Nagal 	void *dtb;
1956d1857eSAmit Nagal 	int ret;
20fdf8f929SAmit Nagal #if !defined(XILINX_OF_BOARD_DTB_ADDR)
21fdf8f929SAmit Nagal 	return;
22fdf8f929SAmit Nagal #else
23fdf8f929SAmit Nagal 	dtb = (void *)XILINX_OF_BOARD_DTB_ADDR;
24fdf8f929SAmit Nagal #endif
25fdf8f929SAmit Nagal 	if (IS_TFA_IN_OCM(BL31_BASE))
26fdf8f929SAmit Nagal 		return;
2756d1857eSAmit Nagal 
28*7ca7fb1bSAmit Nagal #if defined(PLAT_XLAT_TABLES_DYNAMIC)
29*7ca7fb1bSAmit Nagal 	ret = mmap_add_dynamic_region((unsigned long long)dtb,
30*7ca7fb1bSAmit Nagal 				      (uintptr_t)dtb,
31*7ca7fb1bSAmit Nagal 				      XILINX_OF_BOARD_DTB_MAX_SIZE,
32*7ca7fb1bSAmit Nagal 				      MT_MEMORY | MT_RW | MT_NS);
33*7ca7fb1bSAmit Nagal 	if (ret != 0) {
34*7ca7fb1bSAmit Nagal 		WARN("Failed to add dynamic region for dtb: error %d\n", ret);
35*7ca7fb1bSAmit Nagal 		return;
36*7ca7fb1bSAmit Nagal 	}
37*7ca7fb1bSAmit Nagal #endif
38*7ca7fb1bSAmit Nagal 
3956d1857eSAmit Nagal 	/* Return if no device tree is detected */
4056d1857eSAmit Nagal 	if (fdt_check_header(dtb) != 0) {
4156d1857eSAmit Nagal 		NOTICE("Can't read DT at %p\n", dtb);
4256d1857eSAmit Nagal 		return;
4356d1857eSAmit Nagal 	}
4456d1857eSAmit Nagal 
4556d1857eSAmit Nagal 	ret = fdt_open_into(dtb, dtb, XILINX_OF_BOARD_DTB_MAX_SIZE);
4656d1857eSAmit Nagal 	if (ret < 0) {
4756d1857eSAmit Nagal 		ERROR("Invalid Device Tree at %p: error %d\n", dtb, ret);
4856d1857eSAmit Nagal 		return;
4956d1857eSAmit Nagal 	}
5056d1857eSAmit Nagal 
5156d1857eSAmit Nagal 	/* Reserve memory used by Trusted Firmware. */
52c3b69bf1SMichal Simek 	if (fdt_add_reserved_memory(dtb, "tf-a", BL31_BASE, BL31_LIMIT - BL31_BASE)) {
5356d1857eSAmit Nagal 		WARN("Failed to add reserved memory nodes for BL31 to DT.\n");
5456d1857eSAmit Nagal 		return;
5556d1857eSAmit Nagal 	}
5656d1857eSAmit Nagal 
5756d1857eSAmit Nagal 	ret = fdt_pack(dtb);
5856d1857eSAmit Nagal 	if (ret < 0) {
5956d1857eSAmit Nagal 		ERROR("Failed to pack Device Tree at %p: error %d\n", dtb, ret);
6056d1857eSAmit Nagal 		return;
6156d1857eSAmit Nagal 	}
6256d1857eSAmit Nagal 
6356d1857eSAmit Nagal 	clean_dcache_range((uintptr_t)dtb, fdt_blob_size(dtb));
64*7ca7fb1bSAmit Nagal 
65*7ca7fb1bSAmit Nagal #if defined(PLAT_XLAT_TABLES_DYNAMIC)
66*7ca7fb1bSAmit Nagal 	ret = mmap_remove_dynamic_region((uintptr_t)dtb,
67*7ca7fb1bSAmit Nagal 					 XILINX_OF_BOARD_DTB_MAX_SIZE);
68*7ca7fb1bSAmit Nagal 	if (ret != 0) {
69*7ca7fb1bSAmit Nagal 		WARN("Failed to remove dynamic region for dtb: error %d\n", ret);
70*7ca7fb1bSAmit Nagal 		return;
71*7ca7fb1bSAmit Nagal 	}
72*7ca7fb1bSAmit Nagal #endif
73*7ca7fb1bSAmit Nagal 
7456d1857eSAmit Nagal 	INFO("Changed device tree to advertise PSCI and reserved memories.\n");
7556d1857eSAmit Nagal }
76