]> git.sur5r.net Git - u-boot/blobdiff - cmd/bootefi.c
efi_loader: Respect DT reserved regions
[u-boot] / cmd / bootefi.c
index 2a31a914cdb3be29e4d5b411cc5d178958c093f9..5a2a81005fcf734fbb873537f7b9f216f7d75e38 100644 (file)
@@ -178,6 +178,27 @@ static efi_status_t efi_run_in_el2(EFIAPI efi_status_t (*entry)(
 }
 #endif
 
+/* Carve out DT reserved memory ranges */
+static efi_status_t efi_carve_out_dt_rsv(void *fdt)
+{
+       int nr_rsv, i;
+       uint64_t addr, size, pages;
+
+       nr_rsv = fdt_num_mem_rsv(fdt);
+
+       /* Look for an existing entry and add it to the efi mem map. */
+       for (i = 0; i < nr_rsv; i++) {
+               if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
+                       continue;
+
+               pages = ALIGN(size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT;
+               efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
+                                  false);
+       }
+
+       return EFI_SUCCESS;
+}
+
 static efi_status_t efi_install_fdt(void *fdt)
 {
        bootm_headers_t img = { 0 };
@@ -199,6 +220,11 @@ static efi_status_t efi_install_fdt(void *fdt)
                return EFI_LOAD_ERROR;
        }
 
+       if (efi_carve_out_dt_rsv(fdt) != EFI_SUCCESS) {
+               printf("ERROR: failed to carve out memory\n");
+               return EFI_LOAD_ERROR;
+       }
+
        /* Link to it in the efi tables */
        ret = efi_install_configuration_table(&efi_guid_fdt, fdt);
        if (ret != EFI_SUCCESS)