xref: /rk3399_ARM-atf/plat/xilinx/common/plat_fdt.c (revision 1a5b58e7baf98e04dad7615287b683869d8b4770)
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>
117ca7fb1bSAmit 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 {
18*1a5b58e7SAmit Nagal #if defined(XILINX_OF_BOARD_DTB_ADDR)
19fdf8f929SAmit Nagal 	void *dtb;
20*1a5b58e7SAmit Nagal 	int map_ret = 0;
21*1a5b58e7SAmit Nagal 	int ret = 0;
22*1a5b58e7SAmit Nagal 
23fdf8f929SAmit Nagal 	dtb = (void *)XILINX_OF_BOARD_DTB_ADDR;
24*1a5b58e7SAmit Nagal 
25*1a5b58e7SAmit Nagal 	if (!IS_TFA_IN_OCM(BL31_BASE)) {
2656d1857eSAmit Nagal 
277ca7fb1bSAmit Nagal #if defined(PLAT_XLAT_TABLES_DYNAMIC)
28*1a5b58e7SAmit Nagal 		map_ret = mmap_add_dynamic_region((unsigned long long)dtb,
297ca7fb1bSAmit Nagal 						 (uintptr_t)dtb,
307ca7fb1bSAmit Nagal 						 XILINX_OF_BOARD_DTB_MAX_SIZE,
317ca7fb1bSAmit Nagal 						 MT_MEMORY | MT_RW | MT_NS);
32*1a5b58e7SAmit Nagal 		if (map_ret != 0) {
33*1a5b58e7SAmit Nagal 			WARN("Failed to add dynamic region for dtb: error %d\n",
34*1a5b58e7SAmit Nagal 			     map_ret);
357ca7fb1bSAmit Nagal 		}
367ca7fb1bSAmit Nagal #endif
377ca7fb1bSAmit Nagal 
38*1a5b58e7SAmit Nagal 		if (!map_ret) {
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);
42*1a5b58e7SAmit Nagal 			} else {
43*1a5b58e7SAmit Nagal 				ret = fdt_open_into(dtb, dtb, XILINX_OF_BOARD_DTB_MAX_SIZE);
44*1a5b58e7SAmit Nagal 
45*1a5b58e7SAmit Nagal 				if (ret < 0) {
46*1a5b58e7SAmit Nagal 					ERROR("Invalid Device Tree at %p: error %d\n",
47*1a5b58e7SAmit Nagal 					      dtb, ret);
48*1a5b58e7SAmit Nagal 				} else {
49*1a5b58e7SAmit Nagal 
50*1a5b58e7SAmit Nagal 					if (dt_add_psci_node(dtb)) {
51*1a5b58e7SAmit Nagal 						WARN("Failed to add PSCI Device Tree node\n");
5256d1857eSAmit Nagal 					}
5356d1857eSAmit Nagal 
54*1a5b58e7SAmit Nagal 					if (dt_add_psci_cpu_enable_methods(dtb)) {
55*1a5b58e7SAmit Nagal 						WARN("Failed to add PSCI cpu enable methods in DT\n");
5656d1857eSAmit Nagal 					}
5756d1857eSAmit Nagal 
5856d1857eSAmit Nagal 					/* Reserve memory used by Trusted Firmware. */
59*1a5b58e7SAmit Nagal 					ret = fdt_add_reserved_memory(dtb,
60*1a5b58e7SAmit Nagal 								     "tf-a",
61*1a5b58e7SAmit Nagal 								     BL31_BASE,
62*1a5b58e7SAmit Nagal 								     BL31_LIMIT
63*1a5b58e7SAmit Nagal 								     -
64*1a5b58e7SAmit Nagal 								     BL31_BASE);
65*1a5b58e7SAmit Nagal 					if (ret < 0) {
6656d1857eSAmit Nagal 						WARN("Failed to add reserved memory nodes for BL31 to DT.\n");
6756d1857eSAmit Nagal 					}
6856d1857eSAmit Nagal 
6956d1857eSAmit Nagal 					ret = fdt_pack(dtb);
7056d1857eSAmit Nagal 					if (ret < 0) {
71*1a5b58e7SAmit Nagal 						WARN("Failed to pack dtb at %p: error %d\n",
72*1a5b58e7SAmit Nagal 						     dtb, ret);
73*1a5b58e7SAmit Nagal 					}
74*1a5b58e7SAmit Nagal 					flush_dcache_range((uintptr_t)dtb,
75*1a5b58e7SAmit Nagal 							   fdt_blob_size(dtb));
76*1a5b58e7SAmit Nagal 
77*1a5b58e7SAmit Nagal 					INFO("Changed device tree to advertise PSCI and reserved memories.\n");
78*1a5b58e7SAmit Nagal 
79*1a5b58e7SAmit Nagal 				}
8056d1857eSAmit Nagal 			}
8156d1857eSAmit Nagal 
82*1a5b58e7SAmit Nagal 		}
83*1a5b58e7SAmit Nagal 
847ca7fb1bSAmit Nagal 
857ca7fb1bSAmit Nagal #if defined(PLAT_XLAT_TABLES_DYNAMIC)
86*1a5b58e7SAmit Nagal 		if (!map_ret) {
877ca7fb1bSAmit Nagal 			ret = mmap_remove_dynamic_region((uintptr_t)dtb,
887ca7fb1bSAmit Nagal 					 XILINX_OF_BOARD_DTB_MAX_SIZE);
897ca7fb1bSAmit Nagal 			if (ret != 0) {
90*1a5b58e7SAmit Nagal 				WARN("Failed to remove dynamic region for dtb:error %d\n",
91*1a5b58e7SAmit Nagal 					ret);
92*1a5b58e7SAmit Nagal 			}
937ca7fb1bSAmit Nagal 		}
947ca7fb1bSAmit Nagal #endif
95*1a5b58e7SAmit Nagal 	}
967ca7fb1bSAmit Nagal 
97*1a5b58e7SAmit Nagal #endif
9856d1857eSAmit Nagal }
99