|
@@ -17,6 +17,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <asm/iomap.h>
|
|
|
+#include <asm/pat.h>
|
|
|
#include <linux/module.h>
|
|
|
|
|
|
/* Map 'pfn' using fixed map 'type' and protections 'prot'
|
|
@@ -29,6 +30,15 @@ iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot)
|
|
|
|
|
|
pagefault_disable();
|
|
|
|
|
|
+ /*
|
|
|
+ * For non-PAT systems, promote PAGE_KERNEL_WC to PAGE_KERNEL_UC_MINUS.
|
|
|
+ * PAGE_KERNEL_WC maps to PWT, which translates to uncached if the
|
|
|
+ * MTRR is UC or WC. UC_MINUS gets the real intention, of the
|
|
|
+ * user, which is "WC if the MTRR is WC, UC if you can't do that."
|
|
|
+ */
|
|
|
+ if (!pat_enabled && pgprot_val(prot) == pgprot_val(PAGE_KERNEL_WC))
|
|
|
+ prot = PAGE_KERNEL_UC_MINUS;
|
|
|
+
|
|
|
idx = type + KM_TYPE_NR*smp_processor_id();
|
|
|
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
|
|
|
set_pte(kmap_pte-idx, pfn_pte(pfn, prot));
|