mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-11 07:24:46 +00:00
fdt: Swap the signature for board_fdt_blob_setup()
This returns a devicetree and updates a parameter with an error code. Swap it, since this fits better with the way U-Boot normally works. It also (more easily) allows leaving the existing pointer unchanged. No yaks were harmed in this change, but there is a very small code-size reduction. For sifive, the OF_BOARD option must be set for the function to be called, so there is no point in checking it again. Also OF_SEPARATE is defined always. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Matthias Brugger <mbrugger@suse.com> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com> [trini: Update total_compute] Signed-off-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
parent
447f18d00d
commit
fc37a73e66
23 changed files with 158 additions and 158 deletions
|
@ -691,11 +691,12 @@ int dram_init_banksize(void)
|
|||
|
||||
extern long fw_dtb_pointer;
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
/* Return DTB pointer passed by m1n1 */
|
||||
*err = 0;
|
||||
return (void *)fw_dtb_pointer;
|
||||
*fdtp = (void *)fw_dtb_pointer;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void build_mem_map(void)
|
||||
|
|
|
@ -150,12 +150,12 @@ static void show_psci_version(void)
|
|||
* or for supporting quirky devices where it's easier to leave the downstream DT in place
|
||||
* to improve ABL compatibility. Otherwise, we use the DT provided by ABL.
|
||||
*/
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
struct fdt_header *fdt;
|
||||
bool internal_valid, external_valid;
|
||||
int ret = 0;
|
||||
|
||||
*err = 0;
|
||||
fdt = (struct fdt_header *)get_prev_bl_fdt_addr();
|
||||
external_valid = fdt && !fdt_check_header(fdt);
|
||||
internal_valid = !fdt_check_header(gd->fdt_blob);
|
||||
|
@ -170,10 +170,11 @@ void *board_fdt_blob_setup(int *err)
|
|||
|
||||
if (internal_valid) {
|
||||
debug("Using built in FDT\n");
|
||||
ret = -EEXIST;
|
||||
} else {
|
||||
debug("Using external FDT\n");
|
||||
/* So we can use it before returning */
|
||||
gd->fdt_blob = fdt;
|
||||
*fdtp = fdt;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -182,7 +183,7 @@ void *board_fdt_blob_setup(int *err)
|
|||
*/
|
||||
qcom_parse_memory();
|
||||
|
||||
return (void *)gd->fdt_blob;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void reset_cpu(void)
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#define LOG_CATEGORY LOGC_ARCH
|
||||
|
||||
#include <config.h>
|
||||
#include <errno.h>
|
||||
#include <log.h>
|
||||
#include <linux/libfdt.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
|
@ -16,20 +17,22 @@
|
|||
* Use the saved FDT address provided by TF-A at boot time (NT_FW_CONFIG =
|
||||
* Non Trusted Firmware configuration file) when the pointer is valid
|
||||
*/
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
unsigned long nt_fw_dtb = get_stm32mp_bl2_dtb();
|
||||
|
||||
log_debug("%s: nt_fw_dtb=%lx\n", __func__, nt_fw_dtb);
|
||||
|
||||
*err = 0;
|
||||
/* use external device tree only if address is valid */
|
||||
if (nt_fw_dtb >= STM32_DDR_BASE) {
|
||||
if (fdt_magic(nt_fw_dtb) == FDT_MAGIC)
|
||||
return (void *)nt_fw_dtb;
|
||||
log_debug("%s: DTB not found.\n", __func__);
|
||||
}
|
||||
log_debug("%s: fall back to builtin DTB, %p\n", __func__, _end);
|
||||
if (nt_fw_dtb < STM32_DDR_BASE ||
|
||||
fdt_magic(nt_fw_dtb) != FDT_MAGIC) {
|
||||
log_debug("DTB not found.\n");
|
||||
log_debug("fall back to builtin DTB, %p\n", _end);
|
||||
|
||||
return (void *)_end;
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
*fdtp = (void *)nt_fw_dtb;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -368,7 +368,7 @@ static int setup_auto_tree(void *blob)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void *board_fdt_blob_setup(int *ret)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
struct sandbox_state *state = state_get_current();
|
||||
const char *fname = state->fdt_fname;
|
||||
|
@ -378,43 +378,41 @@ void *board_fdt_blob_setup(int *ret)
|
|||
int fd;
|
||||
|
||||
if (gd->fdt_blob)
|
||||
return (void *)gd->fdt_blob;
|
||||
return -EEXIST;
|
||||
blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
|
||||
*ret = 0;
|
||||
if (!state->fdt_fname) {
|
||||
err = setup_auto_tree(blob);
|
||||
if (!err)
|
||||
goto done;
|
||||
os_printf("Unable to create empty FDT: %s\n", fdt_strerror(err));
|
||||
*ret = -EINVAL;
|
||||
goto fail;
|
||||
if (err) {
|
||||
os_printf("Unable to create empty FDT: %s\n",
|
||||
fdt_strerror(err));
|
||||
return -EINVAL;
|
||||
}
|
||||
*fdtp = blob;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = os_get_filesize(fname, &size);
|
||||
if (err < 0) {
|
||||
os_printf("Failed to find FDT file '%s'\n", fname);
|
||||
*ret = err;
|
||||
goto fail;
|
||||
return err;
|
||||
}
|
||||
fd = os_open(fname, OS_O_RDONLY);
|
||||
if (fd < 0) {
|
||||
os_printf("Failed to open FDT file '%s'\n", fname);
|
||||
*ret = -EACCES;
|
||||
goto fail;
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
if (os_read(fd, blob, size) != size) {
|
||||
os_close(fd);
|
||||
os_printf("Failed to read FDT file '%s'\n", fname);
|
||||
*ret = -EIO;
|
||||
goto fail;
|
||||
return -EIO;
|
||||
}
|
||||
os_close(fd);
|
||||
|
||||
done:
|
||||
return blob;
|
||||
fail:
|
||||
return NULL;
|
||||
*fdtp = blob;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ulong timer_get_boot_us(void)
|
||||
|
|
|
@ -296,13 +296,9 @@ int ft_board_setup(void *blob, struct bd_info *bd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the FDT base address that was passed by ATF
|
||||
*
|
||||
* Return: FDT base address received from ATF in x1 register
|
||||
*/
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
return (void *)fdt_base_addr;
|
||||
*fdtp = (void *)fdt_base_addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -210,13 +210,9 @@ int ft_board_setup(void *blob, struct bd_info *bd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the FDT base address that was passed by ATF
|
||||
*
|
||||
* Return: FDT base address received from ATF in x1 register
|
||||
*/
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
return (void *)fdt_base_addr;
|
||||
*fdtp = (void *)fdt_base_addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -234,7 +234,8 @@ static int do_go_uboot(struct cmd_tbl *cmdtp, int flag, int argc,
|
|||
return CMD_RET_USAGE;
|
||||
|
||||
addr = hextoul(argv[1], NULL);
|
||||
fdt = board_fdt_blob_setup(&err);
|
||||
fdt = (void *)gd->fdt_blob;
|
||||
err = board_fdt_blob_setup(&fdt);
|
||||
entry = (uboot_entry_t)addr;
|
||||
flush_cache((ulong)addr, 1 << 20); /* 1MiB should be enough */
|
||||
dcache_disable();
|
||||
|
|
|
@ -79,21 +79,24 @@ ulong board_flash_get_legacy(ulong base, int banknum, flash_info_t *info)
|
|||
}
|
||||
|
||||
#define ANDES_HW_DTB_ADDRESS 0xF2000000
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
|
||||
if (IS_ENABLED(CONFIG_OF_SEPARATE) || IS_ENABLED(CONFIG_OF_BOARD)) {
|
||||
if (fdt_magic((uintptr_t)gd->arch.firmware_fdt_addr) == FDT_MAGIC)
|
||||
return (void *)(ulong)gd->arch.firmware_fdt_addr;
|
||||
if (fdt_magic((uintptr_t)gd->arch.firmware_fdt_addr) ==
|
||||
FDT_MAGIC) {
|
||||
*fdtp = (void *)(ulong)gd->arch.firmware_fdt_addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (fdt_magic(CONFIG_SYS_FDT_BASE) == FDT_MAGIC)
|
||||
return (void *)CONFIG_SYS_FDT_BASE;
|
||||
return (void *)ANDES_HW_DTB_ADDRESS;
|
||||
if (fdt_magic(CONFIG_SYS_FDT_BASE) == FDT_MAGIC) {
|
||||
*fdtp = (void *)CONFIG_SYS_FDT_BASE;
|
||||
|
||||
*err = -EINVAL;
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPL_BOARD_INIT
|
||||
|
|
|
@ -37,15 +37,13 @@ struct mm_region *mem_map = total_compute_mem_map;
|
|||
*/
|
||||
unsigned long __section(".data") fw_dtb_pointer;
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
if (fdt_magic(fw_dtb_pointer) != FDT_MAGIC) {
|
||||
*err = -ENXIO;
|
||||
return NULL;
|
||||
}
|
||||
if (fdt_magic(fw_dtb_pointer) != FDT_MAGIC)
|
||||
return -ENXIO;
|
||||
|
||||
return (void *)fw_dtb_pointer;
|
||||
*fdtp = (void *)fw_dtb_pointer;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int misc_init_r(void)
|
||||
|
|
|
@ -168,42 +168,37 @@ static bool is_valid_dtb(uintptr_t dtb_ptr)
|
|||
return fdt_subnode_offset((void *)dtb_ptr, 0, "memory") >= 0;
|
||||
}
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
#ifdef CONFIG_TARGET_VEXPRESS64_JUNO
|
||||
phys_addr_t fdt_rom_addr = find_dtb_in_nor_flash(CONFIG_JUNO_DTB_PART);
|
||||
|
||||
*err = 0;
|
||||
if (fdt_rom_addr == ~0UL) {
|
||||
*err = -ENXIO;
|
||||
return NULL;
|
||||
}
|
||||
if (fdt_rom_addr == ~0UL)
|
||||
return -ENXIO;
|
||||
|
||||
return (void *)fdt_rom_addr;
|
||||
*fdtp = (void *)fdt_rom_addr;
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
#ifdef VEXPRESS_FDT_ADDR
|
||||
if (fdt_magic(VEXPRESS_FDT_ADDR) == FDT_MAGIC) {
|
||||
*err = 0;
|
||||
return (void *)VEXPRESS_FDT_ADDR;
|
||||
*fdtp = (void *)VEXPRESS_FDT_ADDR;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (is_valid_dtb(prior_stage_fdt_address[1])) {
|
||||
*err = 0;
|
||||
return (void *)prior_stage_fdt_address[1];
|
||||
*fdtp = (void *)prior_stage_fdt_address[1];
|
||||
return 0;
|
||||
} else if (is_valid_dtb(prior_stage_fdt_address[0])) {
|
||||
*err = 0;
|
||||
return (void *)prior_stage_fdt_address[0];
|
||||
*fdtp = (void *)prior_stage_fdt_address[0];
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fdt_magic(gd->fdt_blob) == FDT_MAGIC) {
|
||||
*err = 0;
|
||||
return (void *)gd->fdt_blob;
|
||||
}
|
||||
if (fdt_magic(*fdtp) == FDT_MAGIC)
|
||||
return 0;
|
||||
|
||||
*err = -ENXIO;
|
||||
return NULL;
|
||||
return -ENXIO;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -130,9 +130,10 @@ int board_late_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
/* Stored the DTB address there during our init */
|
||||
return (void *)prior_stage_fdt_address;
|
||||
*fdtp = (void *)prior_stage_fdt_address;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -149,11 +149,12 @@ int dram_init_banksize(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
/* QEMU loads a generated DTB for us at the start of RAM. */
|
||||
return (void *)CFG_SYS_SDRAM_BASE;
|
||||
*fdtp = (void *)CFG_SYS_SDRAM_BASE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void enable_caches(void)
|
||||
|
|
|
@ -334,15 +334,11 @@ u32 cpu_mask(void)
|
|||
return (1 << cpu_numcores()) - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the virtual address of FDT that was passed by QEMU
|
||||
*
|
||||
* Return: virtual address of FDT received from QEMU in r3 register
|
||||
*/
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
return get_fdt_virt();
|
||||
*fdtp = get_fdt_virt();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* See CFG_SYS_NS16550_CLK in arch/powerpc/include/asm/config.h */
|
||||
|
|
|
@ -64,9 +64,10 @@ int board_fit_config_name_match(const char *name)
|
|||
}
|
||||
#endif
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
/* Stored the DTB address there during our init */
|
||||
return (void *)(ulong)gd->arch.firmware_fdt_addr;
|
||||
*fdtp = (void *)(ulong)gd->arch.firmware_fdt_addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -97,15 +97,16 @@ int ft_board_setup(void *fdt, struct bd_info *bd)
|
|||
}
|
||||
#endif
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
/*
|
||||
* The ECME management processor loads the DTB from NOR flash
|
||||
* into DRAM (at 4KB), where it gets patched to contain the
|
||||
* detected memory size.
|
||||
*/
|
||||
return (void *)0x1000;
|
||||
*fdtp = (void *)0x1000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int is_highbank(void)
|
||||
|
|
|
@ -508,15 +508,14 @@ int board_init(void)
|
|||
/*
|
||||
* If the firmware passed a device tree use it for U-Boot.
|
||||
*/
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
if (fdt_magic(fw_dtb_pointer) != FDT_MAGIC) {
|
||||
*err = -ENXIO;
|
||||
return NULL;
|
||||
}
|
||||
if (fdt_magic(fw_dtb_pointer) != FDT_MAGIC)
|
||||
return -ENXIO;
|
||||
|
||||
return (void *)fw_dtb_pointer;
|
||||
*fdtp = (void *)fw_dtb_pointer;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int copy_property(void *dst, void *src, char *path, char *property)
|
||||
|
|
|
@ -114,15 +114,15 @@ int misc_init_r(void)
|
|||
|
||||
#endif
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
if (IS_ENABLED(CONFIG_OF_SEPARATE) || IS_ENABLED(CONFIG_OF_BOARD)) {
|
||||
if (gd->arch.firmware_fdt_addr)
|
||||
return (ulong *)(uintptr_t)gd->arch.firmware_fdt_addr;
|
||||
if (gd->arch.firmware_fdt_addr) {
|
||||
*fdtp = (ulong *)(uintptr_t)gd->arch.firmware_fdt_addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (ulong *)_end;
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
int board_init(void)
|
||||
|
|
|
@ -10,15 +10,14 @@
|
|||
#include <dm.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
if (IS_ENABLED(CONFIG_OF_SEPARATE) || IS_ENABLED(CONFIG_OF_BOARD)) {
|
||||
if (gd->arch.firmware_fdt_addr)
|
||||
return (ulong *)(uintptr_t)gd->arch.firmware_fdt_addr;
|
||||
if (gd->arch.firmware_fdt_addr) {
|
||||
*fdtp = (ulong *)(uintptr_t)gd->arch.firmware_fdt_addr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (ulong *)_end;
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
int board_init(void)
|
||||
|
|
|
@ -115,15 +115,14 @@ int board_late_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
if (IS_ENABLED(CONFIG_OF_SEPARATE) || IS_ENABLED(CONFIG_OF_BOARD)) {
|
||||
if (gd->arch.firmware_fdt_addr)
|
||||
return (ulong *)(uintptr_t)gd->arch.firmware_fdt_addr;
|
||||
if (gd->arch.firmware_fdt_addr) {
|
||||
*fdtp = (ulong *)(uintptr_t)gd->arch.firmware_fdt_addr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (ulong *)_end;
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
int ft_board_setup(void *blob, struct bd_info *bd)
|
||||
|
|
|
@ -44,14 +44,14 @@ int board_init(void)
|
|||
* x0 is the physical address of the device tree blob (dtb) in system RAM.
|
||||
* This is stored in rom_pointer during low level init.
|
||||
*/
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
*err = 0;
|
||||
if (fdt_magic(rom_pointer[0]) != FDT_MAGIC) {
|
||||
*err = -ENXIO;
|
||||
return NULL;
|
||||
}
|
||||
return (void *)rom_pointer[0];
|
||||
if (fdt_magic(rom_pointer[0]) != FDT_MAGIC)
|
||||
return -ENXIO;
|
||||
|
||||
*fdtp = (void *)rom_pointer[0];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -358,17 +358,17 @@ __maybe_unused int xilinx_read_eeprom(void)
|
|||
}
|
||||
|
||||
#if defined(CONFIG_OF_BOARD)
|
||||
void *board_fdt_blob_setup(int *err)
|
||||
int board_fdt_blob_setup(void **fdtp)
|
||||
{
|
||||
void *fdt_blob;
|
||||
|
||||
*err = 0;
|
||||
|
||||
if (IS_ENABLED(CONFIG_TARGET_XILINX_MBV)) {
|
||||
fdt_blob = (void *)CONFIG_XILINX_OF_BOARD_DTB_ADDR;
|
||||
|
||||
if (fdt_magic(fdt_blob) == FDT_MAGIC)
|
||||
return fdt_blob;
|
||||
if (fdt_magic(fdt_blob) == FDT_MAGIC) {
|
||||
*fdtp = fdt_blob;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!IS_ENABLED(CONFIG_XPL_BUILD) &&
|
||||
|
@ -376,8 +376,10 @@ void *board_fdt_blob_setup(int *err)
|
|||
!IS_ENABLED(CONFIG_ZYNQMP_NO_DDR)) {
|
||||
fdt_blob = (void *)CONFIG_XILINX_OF_BOARD_DTB_ADDR;
|
||||
|
||||
if (fdt_magic(fdt_blob) == FDT_MAGIC)
|
||||
return fdt_blob;
|
||||
if (fdt_magic(fdt_blob) == FDT_MAGIC) {
|
||||
*fdtp = fdt_blob;
|
||||
return 0;
|
||||
}
|
||||
|
||||
debug("DTB is not passed via %p\n", fdt_blob);
|
||||
}
|
||||
|
@ -396,13 +398,15 @@ void *board_fdt_blob_setup(int *err)
|
|||
fdt_blob = (ulong *)_end;
|
||||
}
|
||||
|
||||
if (fdt_magic(fdt_blob) == FDT_MAGIC)
|
||||
return fdt_blob;
|
||||
if (fdt_magic(fdt_blob) == FDT_MAGIC) {
|
||||
*fdtp = fdt_blob;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
debug("DTB is also not passed via %p\n", fdt_blob);
|
||||
|
||||
*err = -EINVAL;
|
||||
return NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1191,11 +1191,12 @@ int fdtdec_resetup(int *rescan);
|
|||
*
|
||||
* The existing devicetree is available at gd->fdt_blob
|
||||
*
|
||||
* @err: 0 on success, -EEXIST if the devicetree is already correct, or other
|
||||
* internal error code if we fail to setup a DTB
|
||||
* @returns new devicetree blob pointer
|
||||
* @fdtp: Existing devicetree blob pointer; update this and return 0 if a
|
||||
* different devicetree should be used
|
||||
* Return: 0 on success, -EEXIST if the existing FDT is OK, -ve error code if we
|
||||
* fail to setup a DTB
|
||||
*/
|
||||
void *board_fdt_blob_setup(int *err);
|
||||
int board_fdt_blob_setup(void **fdtp);
|
||||
|
||||
/*
|
||||
* Decode the size of memory
|
||||
|
|
14
lib/fdtdec.c
14
lib/fdtdec.c
|
@ -1706,11 +1706,17 @@ int fdtdec_setup(void)
|
|||
|
||||
/* Allow the board to override the fdt address. */
|
||||
if (IS_ENABLED(CONFIG_OF_BOARD)) {
|
||||
gd->fdt_blob = board_fdt_blob_setup(&ret);
|
||||
if (!ret)
|
||||
void *blob;
|
||||
|
||||
blob = (void *)gd->fdt_blob;
|
||||
ret = board_fdt_blob_setup(&blob);
|
||||
if (ret) {
|
||||
if (ret != -EEXIST)
|
||||
return ret;
|
||||
} else {
|
||||
gd->fdt_src = FDTSRC_BOARD;
|
||||
else if (ret != -EEXIST)
|
||||
return ret;
|
||||
gd->fdt_blob = blob;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allow the early environment to override the fdt address */
|
||||
|
|
Loading…
Add table
Reference in a new issue