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