|
@@ -213,6 +213,31 @@ unsigned long efi_get_time(void)
|
|
eft.minute, eft.second);
|
|
eft.minute, eft.second);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Tell the kernel about the EFI memory map. This might include
|
|
|
|
+ * more than the max 128 entries that can fit in the e820 legacy
|
|
|
|
+ * (zeropage) memory map.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+static void __init add_efi_memmap(void)
|
|
|
|
+{
|
|
|
|
+ void *p;
|
|
|
|
+
|
|
|
|
+ for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
|
|
|
+ efi_memory_desc_t *md = p;
|
|
|
|
+ unsigned long long start = md->phys_addr;
|
|
|
|
+ unsigned long long size = md->num_pages << EFI_PAGE_SHIFT;
|
|
|
|
+ int e820_type;
|
|
|
|
+
|
|
|
|
+ if (md->attribute & EFI_MEMORY_WB)
|
|
|
|
+ e820_type = E820_RAM;
|
|
|
|
+ else
|
|
|
|
+ e820_type = E820_RESERVED;
|
|
|
|
+ add_memory_region(start, size, e820_type);
|
|
|
|
+ }
|
|
|
|
+ sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
|
|
|
|
+}
|
|
|
|
+
|
|
#if EFI_DEBUG
|
|
#if EFI_DEBUG
|
|
static void __init print_efi_memmap(void)
|
|
static void __init print_efi_memmap(void)
|
|
{
|
|
{
|
|
@@ -370,6 +395,7 @@ void __init efi_init(void)
|
|
if (memmap.desc_size != sizeof(efi_memory_desc_t))
|
|
if (memmap.desc_size != sizeof(efi_memory_desc_t))
|
|
printk(KERN_WARNING "Kernel-defined memdesc"
|
|
printk(KERN_WARNING "Kernel-defined memdesc"
|
|
"doesn't match the one from EFI!\n");
|
|
"doesn't match the one from EFI!\n");
|
|
|
|
+ add_efi_memmap();
|
|
|
|
|
|
/* Setup for EFI runtime service */
|
|
/* Setup for EFI runtime service */
|
|
reboot_type = BOOT_EFI;
|
|
reboot_type = BOOT_EFI;
|