|
@@ -323,10 +323,13 @@ static void __init do_add_efi_memmap(void)
|
|
|
case EFI_UNUSABLE_MEMORY:
|
|
|
e820_type = E820_UNUSABLE;
|
|
|
break;
|
|
|
+ case EFI_RUNTIME_SERVICES_DATA:
|
|
|
+ e820_type = E820_RESERVED_EFI;
|
|
|
+ break;
|
|
|
default:
|
|
|
/*
|
|
|
* EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE
|
|
|
- * EFI_RUNTIME_SERVICES_DATA EFI_MEMORY_MAPPED_IO
|
|
|
+ * EFI_MEMORY_MAPPED_IO
|
|
|
* EFI_MEMORY_MAPPED_IO_PORT_SPACE EFI_PAL_CODE
|
|
|
*/
|
|
|
e820_type = E820_RESERVED;
|
|
@@ -671,10 +674,21 @@ void __init efi_enter_virtual_mode(void)
|
|
|
end_pfn = PFN_UP(end);
|
|
|
if (end_pfn <= max_low_pfn_mapped
|
|
|
|| (end_pfn > (1UL << (32 - PAGE_SHIFT))
|
|
|
- && end_pfn <= max_pfn_mapped))
|
|
|
+ && end_pfn <= max_pfn_mapped)) {
|
|
|
va = __va(md->phys_addr);
|
|
|
- else
|
|
|
- va = efi_ioremap(md->phys_addr, size, md->type);
|
|
|
+
|
|
|
+ if (!(md->attribute & EFI_MEMORY_WB)) {
|
|
|
+ addr = (u64) (unsigned long)va;
|
|
|
+ npages = md->num_pages;
|
|
|
+ memrange_efi_to_native(&addr, &npages);
|
|
|
+ set_memory_uc(addr, npages);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (!(md->attribute & EFI_MEMORY_WB))
|
|
|
+ va = ioremap_nocache(md->phys_addr, size);
|
|
|
+ else
|
|
|
+ va = ioremap_cache(md->phys_addr, size);
|
|
|
+ }
|
|
|
|
|
|
md->virt_addr = (u64) (unsigned long) va;
|
|
|
|
|
@@ -684,13 +698,6 @@ void __init efi_enter_virtual_mode(void)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (!(md->attribute & EFI_MEMORY_WB)) {
|
|
|
- addr = md->virt_addr;
|
|
|
- npages = md->num_pages;
|
|
|
- memrange_efi_to_native(&addr, &npages);
|
|
|
- set_memory_uc(addr, npages);
|
|
|
- }
|
|
|
-
|
|
|
systab = (u64) (unsigned long) efi_phys.systab;
|
|
|
if (md->phys_addr <= systab && systab < end) {
|
|
|
systab += md->virt_addr - md->phys_addr;
|