}
 }
 
+static pgprot_t __acpi_get_writethrough_mem_attribute(void)
+{
+       /*
+        * Although UEFI specifies the use of Normal Write-through for
+        * EFI_MEMORY_WT, it is seldom used in practice and not implemented
+        * by most (all?) CPUs. Rather than allocate a MAIR just for this
+        * purpose, emit a warning and use Normal Non-cacheable instead.
+        */
+       pr_warn_once("No MAIR allocation for EFI_MEMORY_WT; treating as Normal Non-cacheable\n");
+       return __pgprot(PROT_NORMAL_NC);
+}
+
 pgprot_t __acpi_get_mem_attribute(phys_addr_t addr)
 {
        /*
         * types" of UEFI 2.5 section 2.3.6.1, each EFI memory type is
         * mapped to a corresponding MAIR attribute encoding.
         * The EFI memory attribute advises all possible capabilities
-        * of a memory region. We use the most efficient capability.
+        * of a memory region.
         */
 
        u64 attr;
        attr = efi_mem_attributes(addr);
        if (attr & EFI_MEMORY_WB)
                return PAGE_KERNEL;
-       if (attr & EFI_MEMORY_WT)
-               return __pgprot(PROT_NORMAL_WT);
        if (attr & EFI_MEMORY_WC)
                return __pgprot(PROT_NORMAL_NC);
+       if (attr & EFI_MEMORY_WT)
+               return __acpi_get_writethrough_mem_attribute();
        return __pgprot(PROT_DEVICE_nGnRnE);
 }
 
                default:
                        if (region->attribute & EFI_MEMORY_WB)
                                prot = PAGE_KERNEL;
-                       else if (region->attribute & EFI_MEMORY_WT)
-                               prot = __pgprot(PROT_NORMAL_WT);
                        else if (region->attribute & EFI_MEMORY_WC)
                                prot = __pgprot(PROT_NORMAL_NC);
+                       else if (region->attribute & EFI_MEMORY_WT)
+                               prot = __acpi_get_writethrough_mem_attribute();
                }
        }
        return __ioremap(phys, size, prot);