From dea2174d9d941db2ec64997779771a4b4c3527c2 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Fri, 4 Mar 2016 01:10:13 +0100 Subject: efi_loader: Call fdt preparation functions We have a nice framework around image fils to prepare a device tree for OS execution. That one patches in missing device tree nodes and fixes up the memory range bits. We need to call that one from the EFI boot path too to get all those nice fixups. This patch adds the call. Signed-off-by: Alexander Graf --- cmd/bootefi.c | 8 ++++++++ common/image-fdt.c | 8 +++++--- 2 files changed, 13 insertions(+), 3 deletions(-) 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)) -- cgit v1.2.1