On 06/23/2018 12:03 PM, Bin Meng wrote: > On x86 traditional E820 table is used to pass the memory information > to kernel. With EFI loader we can build the EFI memory map from it. > > Signed-off-by: Bin Meng <bmeng...@gmail.com> > --- > > arch/x86/lib/e820.c | 39 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 39 insertions(+) > > diff --git a/arch/x86/lib/e820.c b/arch/x86/lib/e820.c > index 9a9ec99..8b34f67 100644 > --- a/arch/x86/lib/e820.c > +++ b/arch/x86/lib/e820.c > @@ -4,6 +4,7 @@ > */ > > #include <common.h> > +#include <efi_loader.h> > #include <asm/e820.h> > > DECLARE_GLOBAL_DATA_PTR; > @@ -34,3 +35,41 @@ __weak unsigned int install_e820_map(unsigned int > max_entries, > > return 4; > } > + > +#if defined(CONFIG_EFI_LOADER) && !defined(CONFIG_SPL_BUILD) > +void efi_add_known_memory(void) > +{ > + struct e820_entry e820[E820MAX]; > + unsigned int i, num; > + u64 start, pages; > + int type; > + > + num = install_e820_map(ARRAY_SIZE(e820), e820);
Thanks for the patch. Not handling the E820 table is a known deficiency of our EFI implementation. I am a bit worried about error handling here. What guarantees that lib_sysinfo.n_memranges <= E820MAX? install_e820_map() prints a message if max_entries is too small but it does not return an error code. So only if num < E820MAX we can be sure that the call returned all information of interest. My idea is that the interface of efi_add_known_memory() should be changed to allow returning an error code if it fails. And efi_memory_init() should return an eventual error to board_init_r(). Best regards Heinrich > + > + for (i = 0; i < num; ++i) { > + start = e820[i].addr; > + pages = ALIGN(e820[i].size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT; > + > + switch (e820[i].type) { > + case E820_RAM: > + type = EFI_CONVENTIONAL_MEMORY; > + break; > + case E820_RESERVED: > + type = EFI_RESERVED_MEMORY_TYPE; > + break; > + case E820_ACPI: > + type = EFI_ACPI_RECLAIM_MEMORY; > + break; > + case E820_NVS: > + type = EFI_ACPI_MEMORY_NVS; > + break; > + case E820_UNUSABLE: > + default: > + type = EFI_UNUSABLE_MEMORY; > + break; > + } > + > + efi_add_memory_map(start, pages, type, false); > + } > +} > +#endif /* defined(EFI_LOADER) && !defined(CONFIG_SPL_BUILD) */ > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot