> From: Alexander Graf <ag...@suse.de> > Date: Fri, 6 Apr 2018 09:42:47 +0200 > > With legacy boot (booti, bootz), people can declare memory regions as > reserved using device tree memory reservations. This feature is some > times used to indicate memory regions that should not be touched. > > Since in a UEFI world, the DT memory reservations do not get honored, > let's copy them into the UEFI memory map so everyone has a coherent > view of the world and we give people the chance to add reservations > on demand.
This won't fix the issue raised here: https://lists.denx.de/pipermail/u-boot/2018-March/324336.html but would open up yet another way to solve that issue. But with my analysis of that issue still in the back of my mind I have a question. What happens with regions added by U-Boot itself through fdt_add_mem_rsv() calls? Also note that the is code in arch/arm/mach-meson/board.c that explicitly calls efi_add_memory_map() to reserve memory it adds using fdt_add_mem_rsv(). > --- > cmd/bootefi.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/cmd/bootefi.c b/cmd/bootefi.c > index 2a31a914cd..5a2a81005f 100644 > --- a/cmd/bootefi.c > +++ b/cmd/bootefi.c > @@ -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) > -- > 2.12.3 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > https://lists.denx.de/listinfo/u-boot > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot