xref: /rk3399_ARM-atf/plat/xilinx/common/plat_fdt.c (revision 5dbb812ebd572e97bdd7eb230b28048c5fcbf2d4)
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/fdt_fixup.h>
8 #include <common/fdt_wrappers.h>
9 
10 #include <plat_fdt.h>
11 #include <platform_def.h>
12 
13 #if (defined(XILINX_OF_BOARD_DTB_ADDR) && !IS_TFA_IN_OCM(BL31_BASE))
14 void prepare_dtb(void)
15 {
16 	void *dtb = (void *)XILINX_OF_BOARD_DTB_ADDR;
17 	int ret;
18 
19 	/* Return if no device tree is detected */
20 	if (fdt_check_header(dtb) != 0) {
21 		NOTICE("Can't read DT at %p\n", dtb);
22 		return;
23 	}
24 
25 	ret = fdt_open_into(dtb, dtb, XILINX_OF_BOARD_DTB_MAX_SIZE);
26 	if (ret < 0) {
27 		ERROR("Invalid Device Tree at %p: error %d\n", dtb, ret);
28 		return;
29 	}
30 
31 	/* Reserve memory used by Trusted Firmware. */
32 	if (fdt_add_reserved_memory(dtb, "tf-a", BL31_BASE, BL31_LIMIT - BL31_BASE + 1)) {
33 		WARN("Failed to add reserved memory nodes for BL31 to DT.\n");
34 		return;
35 	}
36 
37 	ret = fdt_pack(dtb);
38 	if (ret < 0) {
39 		ERROR("Failed to pack Device Tree at %p: error %d\n", dtb, ret);
40 		return;
41 	}
42 
43 	clean_dcache_range((uintptr_t)dtb, fdt_blob_size(dtb));
44 	INFO("Changed device tree to advertise PSCI and reserved memories.\n");
45 }
46 #else
47 void prepare_dtb(void)
48 {
49 }
50 #endif
51