x86: efi_loader: Use efi_add_conventional_memory_map()
authorPark, Aiden <aiden.park@intel.com>
Tue, 3 Sep 2019 17:43:46 +0000 (17:43 +0000)
committerBin Meng <bmeng.cn@gmail.com>
Tue, 10 Sep 2019 06:31:42 +0000 (14:31 +0800)
Use efi_add_conventional_memory_map() to configure EFI conventional memory
properly with ram_top value. This will give 32-bit mode U-Boot proper
conventional memory regions even if e820 has an entry which is greater than
32-bit address space.

Signed-off-by: Aiden Park <aiden.park@intel.com>
Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
[bmeng: fixed some typos in the commit message]
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/lib/e820.c

index d6ae2c4e9d77870df9d945f2fc5a1b29771cfd11..26da4d2f278d264712f7c9bb39002259acb7fa42 100644 (file)
@@ -41,14 +41,17 @@ void efi_add_known_memory(void)
 {
        struct e820_entry e820[E820MAX];
        unsigned int i, num;
-       u64 start, pages;
+       u64 start, pages, ram_top;
        int type;
 
        num = install_e820_map(ARRAY_SIZE(e820), e820);
 
+       ram_top = (u64)gd->ram_top & ~EFI_PAGE_MASK;
+       if (!ram_top)
+               ram_top = 0x100000000ULL;
+
        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:
@@ -69,7 +72,15 @@ void efi_add_known_memory(void)
                        break;
                }
 
-               efi_add_memory_map(start, pages, type, false);
+               if (type == EFI_CONVENTIONAL_MEMORY) {
+                       efi_add_conventional_memory_map(start,
+                                                       start + e820[i].size,
+                                                       ram_top);
+               } else {
+                       pages = ALIGN(e820[i].size, EFI_PAGE_SIZE)
+                               >> EFI_PAGE_SHIFT;
+                       efi_add_memory_map(start, pages, type, false);
+               }
        }
 }
 #endif /* CONFIG_IS_ENABLED(EFI_LOADER) */