|
@@ -810,6 +810,16 @@ void __iomem *efi_lookup_mapped_addr(u64 phys_addr)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+void efi_memory_uc(u64 addr, unsigned long size)
|
|
|
+{
|
|
|
+ unsigned long page_shift = 1UL << EFI_PAGE_SHIFT;
|
|
|
+ u64 npages;
|
|
|
+
|
|
|
+ npages = round_up(size, page_shift) / page_shift;
|
|
|
+ memrange_efi_to_native(&addr, &npages);
|
|
|
+ set_memory_uc(addr, npages);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* This function will switch the EFI runtime services to virtual mode.
|
|
|
* Essentially, look through the EFI memmap and map every region that
|
|
@@ -823,7 +833,7 @@ void __init efi_enter_virtual_mode(void)
|
|
|
efi_memory_desc_t *md, *prev_md = NULL;
|
|
|
efi_status_t status;
|
|
|
unsigned long size;
|
|
|
- u64 end, systab, addr, npages, end_pfn;
|
|
|
+ u64 end, systab, end_pfn;
|
|
|
void *p, *va, *new_memmap = NULL;
|
|
|
int count = 0;
|
|
|
|
|
@@ -879,10 +889,14 @@ 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))
|
|
|
+ efi_memory_uc((u64)(unsigned long)va, size);
|
|
|
+ } else
|
|
|
+ va = efi_ioremap(md->phys_addr, size,
|
|
|
+ md->type, md->attribute);
|
|
|
|
|
|
md->virt_addr = (u64) (unsigned long) va;
|
|
|
|
|
@@ -892,13 +906,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;
|