]> Git Repo - J-u-boot.git/commitdiff
fdt: Swap the signature for board_fdt_blob_setup()
authorSimon Glass <[email protected]>
Sat, 2 Nov 2024 17:49:42 +0000 (11:49 -0600)
committerTom Rini <[email protected]>
Wed, 18 Dec 2024 21:18:59 +0000 (15:18 -0600)
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 <[email protected]>
Reviewed-by: Matthias Brugger <[email protected]>
Reviewed-by: Patrice Chotard <[email protected]>
[trini: Update total_compute]
Signed-off-by: Tom Rini <[email protected]>
23 files changed:
arch/arm/mach-apple/board.c
arch/arm/mach-snapdragon/board.c
arch/arm/mach-stm32mp/boot_params.c
arch/sandbox/cpu/cpu.c
board/Marvell/octeontx/board-fdt.c
board/Marvell/octeontx2/board-fdt.c
board/Marvell/octeontx2/board.c
board/andestech/ae350/ae350.c
board/armltd/total_compute/total_compute.c
board/armltd/vexpress64/vexpress64.c
board/broadcom/bcmstb/bcmstb.c
board/emulation/qemu-arm/qemu-arm.c
board/emulation/qemu-ppce500/qemu-ppce500.c
board/emulation/qemu-riscv/qemu-riscv.c
board/highbank/highbank.c
board/raspberrypi/rpi/rpi.c
board/sifive/unleashed/unleashed.c
board/sifive/unmatched/unmatched.c
board/starfive/visionfive2/starfive_visionfive2.c
board/xen/xenguest_arm64/xenguest_arm64.c
board/xilinx/common/board.c
include/fdtdec.h
lib/fdtdec.c

index 0b6d290b8ac41eea14455b920475e2086f77ccc1..2644a04a622875a885ab4dd5f038b4cbd0978646 100644 (file)
@@ -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)
index 75a880f093cabc73c3cd56fb61ca103f6b9f3730..f1319df4314783622bb5f4f2410d1d4fd28a1c83 100644 (file)
@@ -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)
index ebddf6a7dbcc5f5c48a018127ae0e29b8d7f12e3..2d058edc41960974cf42416732800289a118f82b 100644 (file)
@@ -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>
  * 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__);
+       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 -EEXIST;
        }
-       log_debug("%s: fall back to builtin DTB, %p\n", __func__, _end);
 
-       return (void *)_end;
+       *fdtp = (void *)nt_fw_dtb;
+
+       return 0;
 }
index d1c4dcf0764fb37ec99585a3db16fa34c3a54dac..6407193c5f144384f140dc22df54a733e99e1f65 100644 (file)
@@ -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)
index 6642b167e19f3eb362fb205034460816c7cca079..9d913b959e0836056d14eb322ffd760256aa09bf 100644 (file)
@@ -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;
 }
index 04be9fb0a9aafdbfde9c7efa949c548a3d3a6098..e5a4db00bb7f894fb4a63ef4a53a34fd6c6ca0f1 100644 (file)
@@ -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;
 }
index 974e9eb82001c24eb1d1ba70c4ac16e3224f8f39..01ba53cf68d1bb4b49d069f8af85aa4c8f09a4e6 100644 (file)
@@ -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();
index 5ae5baed6ba2e57a470448f40e75f0210aa14a37..1d9d4a929c226573e479bc95783e0418169c08da 100644 (file)
@@ -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;
+
+               return 0;
+       }
 
-       *err = -EINVAL;
-       return NULL;
+       return -EINVAL;
 }
 
 #ifdef CONFIG_SPL_BOARD_INIT
index 1336d2eb163287e1293f2b374b93b57f9e36362c..75ba3c33d56dad8d43da0131e54d30982ab0269a 100644 (file)
@@ -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)
index 0119f54f0df8ceb4785d8517780977c7fc532820..b5ede58757d71748e07d857f6d5b47de3a03350a 100644 (file)
@@ -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
 
index bc05aecc446dd83f4c54de89f933c5763c4a17e5..e655f610c843d2d57114b840410d52295f4e3a8c 100644 (file)
@@ -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;
 }
index e0e18b4dfea97cc43536f11878d5ede59820e49d..31f5a775137033f1d639463d818f9ffffa6955ef 100644 (file)
@@ -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)
index 58e5d5eb942708152fa7d124dad1648e29ce50c5..40d295dbf060dc6be509796e09afd70b563c9e82 100644 (file)
@@ -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 */
index e5193e31e37e485041865ec7bf5fb9ffc58197ea..a90222ea6a4933a00143371d24f1e14de9497c7c 100644 (file)
@@ -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;
 }
index f3df83ed6c9bb14b205f738a48d55d66029e269a..0ec88447384a7814a081f9978d3603050eb02803 100644 (file)
@@ -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)
index 9122f33d88d04591c9a3356272735ca8900b868a..c46fe4b2350d2f1a9c6e5b290108ea8d2688b035 100644 (file)
@@ -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)
index 3c5dd50c369b5738f3a21895ddba09e188c31f39..c1c374610c3b7d73c6fed11a05e55f91dfccfd99 100644 (file)
@@ -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)
index c8696270ba27a4c9b449af0598a1bc458d36e17f..23e03e145ee0381110a0dedabc13b798dd5347d5 100644 (file)
 #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)
index f6114602f88008ba9519d9413ee7f04a831df88f..3940d45b13fd1d64c34fd4e87915bb5784a6129e 100644 (file)
@@ -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)
index 4c3b9c9e278006cafd14b98b536e35bc24ea810a..216a022aa156f3b56662216135fc52d5ad3bd859 100644 (file)
@@ -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;
 }
 
 /*
index a12dccd4c518a443ecc4495f6ba2ca72a6660ea1..deea6c7110312ae5f6652a0fb5af63d8f0122367 100644 (file)
@@ -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
 
index 555c952037964e6b1d9419156171f7ef4b35f448..58bbd8f392e462e8fd384a83708c08317a8d157e 100644 (file)
@@ -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
index 60e28173c03486d44c9fe3865dbb602c1d50af0b..c5d29d4385adb2120a4f110dd815a7de93f5c60d 100644 (file)
@@ -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 */
This page took 0.080901 seconds and 4 git commands to generate.