diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 98d1fcaba2..2b104d4908 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -92,6 +92,7 @@ static unsigned long do_bootefi_exec(void *efi) { ulong (*entry)(void *image_handle, struct efi_system_table *st); ulong fdt_pages, fdt_size, fdt_start, fdt_end; + bootm_headers_t img = { 0 }; /* * gd lives in a fixed register which may get clobbered while we execute @@ -102,6 +103,13 @@ static unsigned long do_bootefi_exec(void *efi) /* Update system table to point to our currently loaded FDT */ if (working_fdt) { + /* Prepare fdt for payload */ + if (image_setup_libfdt(&img, working_fdt, 0, NULL)) { + printf("ERROR: Failed to process device tree\n"); + return -EINVAL; + } + + /* Link to it in the efi tables */ systab.tables[0].guid = EFI_FDT_GUID; systab.tables[0].table = working_fdt; systab.nr_tables = 1; diff --git a/common/image-fdt.c b/common/image-fdt.c index 8c3f3e6374..6cac7dbb7f 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -502,8 +502,9 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob, fdt_fixup_ethernet(blob); /* Delete the old LMB reservation */ - lmb_free(lmb, (phys_addr_t)(u32)(uintptr_t)blob, - (phys_size_t)fdt_totalsize(blob)); + if (lmb) + lmb_free(lmb, (phys_addr_t)(u32)(uintptr_t)blob, + (phys_size_t)fdt_totalsize(blob)); ret = fdt_shrink_to_minimum(blob); if (ret < 0) @@ -515,7 +516,8 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob, fdt_set_totalsize(blob, of_size); } /* Create a new LMB reservation */ - lmb_reserve(lmb, (ulong)blob, of_size); + if (lmb) + lmb_reserve(lmb, (ulong)blob, of_size); fdt_initrd(blob, *initrd_start, *initrd_end); if (!ft_verify_fdt(blob))