Merge tag 'efi-2020-07-rc6' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[oweals/u-boot.git] / cmd / bootefi.c
index 54b4b8f98455a8af7ccb60abcf1ae8074d45d032..826915397373f9349549188494d80ecbfa37d426 100644 (file)
@@ -13,6 +13,7 @@
 #include <efi_selftest.h>
 #include <env.h>
 #include <errno.h>
+#include <image.h>
 #include <malloc.h>
 #include <linux/libfdt.h>
 #include <linux/libfdt_env.h>
@@ -127,13 +128,13 @@ static efi_status_t copy_fdt(void **fdtp)
        new_fdt_addr = (uintptr_t)map_sysmem(fdt_ram_start + 0x7f00000 +
                                             fdt_size, 0);
        ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
-                                EFI_BOOT_SERVICES_DATA, fdt_pages,
+                                EFI_ACPI_RECLAIM_MEMORY, fdt_pages,
                                 &new_fdt_addr);
        if (ret != EFI_SUCCESS) {
                /* If we can't put it there, put it somewhere */
                new_fdt_addr = (ulong)memalign(EFI_PAGE_SIZE, fdt_size);
                ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
-                                        EFI_BOOT_SERVICES_DATA, fdt_pages,
+                                        EFI_ACPI_RECLAIM_MEMORY, fdt_pages,
                                         &new_fdt_addr);
                if (ret != EFI_SUCCESS) {
                        printf("ERROR: Failed to reserve space for FDT\n");
@@ -151,14 +152,10 @@ done:
 
 static void efi_reserve_memory(u64 addr, u64 size)
 {
-       u64 pages;
-
        /* Convert from sandbox address space. */
        addr = (uintptr_t)map_sysmem(addr, 0);
-       pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
-       addr &= ~EFI_PAGE_MASK;
-       if (efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
-                              false) != EFI_SUCCESS)
+       if (efi_add_memory_map(addr, size,
+                              EFI_RESERVED_MEMORY_TYPE) != EFI_SUCCESS)
                printf("Reserved memory mapping failed addr %llx size %llx\n",
                       addr, size);
 }
@@ -192,16 +189,20 @@ static void efi_carve_out_dt_rsv(void *fdt)
        if (nodeoffset >= 0) {
                subnode = fdt_first_subnode(fdt, nodeoffset);
                while (subnode >= 0) {
+                       fdt_addr_t fdt_addr;
+                       fdt_size_t fdt_size;
+
                        /* check if this subnode has a reg property */
-                       addr = fdtdec_get_addr_size(fdt, subnode, "reg",
-                                                   (fdt_size_t *)&size);
+                       fdt_addr = fdtdec_get_addr_size_auto_parent(
+                                               fdt, nodeoffset, subnode,
+                                               "reg", 0, &fdt_size, false);
                        /*
                         * The /reserved-memory node may have children with
                         * a size instead of a reg property.
                         */
                        if (addr != FDT_ADDR_T_NONE &&
                            fdtdec_get_is_enabled(fdt, subnode))
-                               efi_reserve_memory(addr, size);
+                               efi_reserve_memory(fdt_addr, fdt_size);
                        subnode = fdt_next_subnode(fdt, subnode);
                }
        }
@@ -598,7 +599,8 @@ static int do_efi_selftest(void)
  * @argv:      command line arguments
  * Return:     status code
  */
-static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc,
+                     char *const argv[])
 {
        efi_status_t ret;
        void *fdt;