xref: /rk3399_ARM-atf/plat/amd/common/plat_fdt.c (revision ea453871ef70c116d40c950926c3c1a2c4036896)
1*ea453871SMaheedhar Bollapalli /*
2*ea453871SMaheedhar Bollapalli  * Copyright (c) 2025, Advanced Micro Devices, Inc. All rights reserved.
3*ea453871SMaheedhar Bollapalli  *
4*ea453871SMaheedhar Bollapalli  * SPDX-License-Identifier: BSD-3-Clause
5*ea453871SMaheedhar Bollapalli  */
6*ea453871SMaheedhar Bollapalli #include <common/debug.h>
7*ea453871SMaheedhar Bollapalli #include <common/fdt_fixup.h>
8*ea453871SMaheedhar Bollapalli #include <common/fdt_wrappers.h>
9*ea453871SMaheedhar Bollapalli #include <libfdt.h>
10*ea453871SMaheedhar Bollapalli #include <platform_def.h>
11*ea453871SMaheedhar Bollapalli 
12*ea453871SMaheedhar Bollapalli #include <plat_fdt.h>
13*ea453871SMaheedhar Bollapalli #include <plat_xfer_list.h>
14*ea453871SMaheedhar Bollapalli 
15*ea453871SMaheedhar Bollapalli #define FIT_CONFS_PATH	"/configurations"
16*ea453871SMaheedhar Bollapalli 
17*ea453871SMaheedhar Bollapalli static bool is_fit_image(void *dtb)
18*ea453871SMaheedhar Bollapalli {
19*ea453871SMaheedhar Bollapalli 	int64_t confs_noffset = 0;
20*ea453871SMaheedhar Bollapalli 	bool status = true;
21*ea453871SMaheedhar Bollapalli 
22*ea453871SMaheedhar Bollapalli 	confs_noffset = fdt_path_offset(dtb, FIT_CONFS_PATH);
23*ea453871SMaheedhar Bollapalli 
24*ea453871SMaheedhar Bollapalli 	/* confs_noffset is only present on FIT image */
25*ea453871SMaheedhar Bollapalli 	if (confs_noffset < 0) {
26*ea453871SMaheedhar Bollapalli 		status = false;
27*ea453871SMaheedhar Bollapalli 	}
28*ea453871SMaheedhar Bollapalli 
29*ea453871SMaheedhar Bollapalli 	return status;
30*ea453871SMaheedhar Bollapalli }
31*ea453871SMaheedhar Bollapalli 
32*ea453871SMaheedhar Bollapalli int32_t is_valid_dtb(void *fdt)
33*ea453871SMaheedhar Bollapalli {
34*ea453871SMaheedhar Bollapalli 	int32_t ret = 0;
35*ea453871SMaheedhar Bollapalli 
36*ea453871SMaheedhar Bollapalli 	ret = fdt_check_header(fdt);
37*ea453871SMaheedhar Bollapalli 	if (ret != 0) {
38*ea453871SMaheedhar Bollapalli 		ERROR("Can't read DT at %p\n", fdt);
39*ea453871SMaheedhar Bollapalli 		goto error;
40*ea453871SMaheedhar Bollapalli 	}
41*ea453871SMaheedhar Bollapalli 
42*ea453871SMaheedhar Bollapalli 	ret = fdt_open_into(fdt, fdt, XILINX_OF_BOARD_DTB_MAX_SIZE);
43*ea453871SMaheedhar Bollapalli 	if (ret < 0) {
44*ea453871SMaheedhar Bollapalli 		ERROR("Invalid Device Tree at %p: error %d\n", fdt, ret);
45*ea453871SMaheedhar Bollapalli 		goto error;
46*ea453871SMaheedhar Bollapalli 	}
47*ea453871SMaheedhar Bollapalli 
48*ea453871SMaheedhar Bollapalli 	if (is_fit_image(fdt)) {
49*ea453871SMaheedhar Bollapalli 		WARN("FIT image detected, TF-A will not update DTB for DDR address space\n");
50*ea453871SMaheedhar Bollapalli 		ret = -FDT_ERR_NOTFOUND;
51*ea453871SMaheedhar Bollapalli 	}
52*ea453871SMaheedhar Bollapalli error:
53*ea453871SMaheedhar Bollapalli 	return ret;
54*ea453871SMaheedhar Bollapalli }
55*ea453871SMaheedhar Bollapalli 
56*ea453871SMaheedhar Bollapalli /* TODO: Reserve TFA memory in DT through custom TL entry */
57*ea453871SMaheedhar Bollapalli void prepare_dtb(void)
58*ea453871SMaheedhar Bollapalli {
59*ea453871SMaheedhar Bollapalli 
60*ea453871SMaheedhar Bollapalli }
61*ea453871SMaheedhar Bollapalli 
62*ea453871SMaheedhar Bollapalli uintptr_t plat_retrieve_dt_addr(void)
63*ea453871SMaheedhar Bollapalli {
64*ea453871SMaheedhar Bollapalli 	void *dtb = NULL;
65*ea453871SMaheedhar Bollapalli 
66*ea453871SMaheedhar Bollapalli 	dtb = transfer_list_retrieve_dt_address();
67*ea453871SMaheedhar Bollapalli 	if (dtb == NULL) {
68*ea453871SMaheedhar Bollapalli 		WARN("TL header or DT entry is invalid\n");
69*ea453871SMaheedhar Bollapalli 	}
70*ea453871SMaheedhar Bollapalli 
71*ea453871SMaheedhar Bollapalli 	return (uintptr_t)dtb;
72*ea453871SMaheedhar Bollapalli }
73