x86: efi_loader: Build EFI memory map per E820 table
authorBin Meng <bmeng.cn@gmail.com>
Thu, 28 Jun 2018 03:38:01 +0000 (20:38 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 2 Jul 2018 01:23:28 +0000 (09:23 +0800)
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.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/x86/lib/e820.c

index 9a9ec991ca9dd7120498e81d0b4b8ffd6368e684..8b34f677d96d0a4bafa91dfc92502c1acb40f99d 100644 (file)
@@ -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);
+
+       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) */