Do not fold PCD and PWT bits in _PAGE_PCD. Instead, introduce a new
_PAGE_UC which defines uncached mappings and use it in place of _PAGE_PCD.

Signed-off-by: Venkatesh Pallipadi <[EMAIL PROTECTED]>
Signed-off-by: Suresh Siddha <[EMAIL PROTECTED]>

Index: linux-2.6.git/arch/x86/mm/ioremap_32.c
===================================================================
--- linux-2.6.git.orig/arch/x86/mm/ioremap_32.c 2008-01-15 03:29:38.000000000 
-0800
+++ linux-2.6.git/arch/x86/mm/ioremap_32.c      2008-01-15 04:42:59.000000000 
-0800
@@ -173,7 +173,7 @@
 
 void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
 {
-       return __ioremap(phys_addr, size, _PAGE_PCD);
+       return __ioremap(phys_addr, size, _PAGE_UC);
 }
 EXPORT_SYMBOL(ioremap_nocache);
 
Index: linux-2.6.git/arch/x86/mm/ioremap_64.c
===================================================================
--- linux-2.6.git.orig/arch/x86/mm/ioremap_64.c 2008-01-15 03:29:38.000000000 
-0800
+++ linux-2.6.git/arch/x86/mm/ioremap_64.c      2008-01-15 04:43:07.000000000 
-0800
@@ -150,7 +150,7 @@
 
 void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
 {
-       return __ioremap(phys_addr, size, _PAGE_PCD);
+       return __ioremap(phys_addr, size, _PAGE_UC);
 }
 EXPORT_SYMBOL(ioremap_nocache);
 
Index: linux-2.6.git/arch/x86/mm/pat.c
===================================================================
--- linux-2.6.git.orig/arch/x86/mm/pat.c        2008-01-15 03:29:38.000000000 
-0800
+++ linux-2.6.git/arch/x86/mm/pat.c     2008-01-15 05:01:43.000000000 -0800
@@ -64,7 +64,7 @@
        if (smp_processor_id() && !pat_wc_enabled)
                return;
 
-       /* Set PWT+PCD to Write-Combining. All other bits stay the same */
+       /* Set PCD to Write-Combining. All other bits stay the same */
        /* PTE encoding used in Linux:
              PAT
              |PCD
@@ -72,7 +72,7 @@
              |||
              000 WB         default
              010 WC         _PAGE_WC
-             011 UC         _PAGE_PCD
+             011 UC         _PAGE_UC
                PAT bit unused */
        pat = PAT(0,WB) | PAT(1,WT) | PAT(2,WC) | PAT(3,UC) |
              PAT(4,WB) | PAT(5,WT) | PAT(6,WC) | PAT(7,UC);
@@ -97,7 +97,7 @@
 {
        switch (flags & _PAGE_CACHE_MASK) {
        case _PAGE_WC:  return "write combining";
-       case _PAGE_PCD: return "uncached";
+       case _PAGE_UC: return "uncached";
        case 0:         return "default";
        default:        return "broken";
        }
@@ -144,7 +144,7 @@
                        if (!fattr)
                                return -EINVAL;
                        else
-                               *fattr  = _PAGE_PCD;
+                               *fattr  = _PAGE_UC;
                }
 
                return 0;
@@ -227,13 +227,13 @@
        unsigned long flags;
        unsigned long want_flags = 0;
        if (file->f_flags & O_SYNC)
-               want_flags = _PAGE_PCD;
+               want_flags = _PAGE_UC;
 
 #ifdef CONFIG_X86_32
        /*
         * On the PPro and successors, the MTRRs are used to set
         * memory types for physical addresses outside main memory,
-        * so blindly setting PCD or PWT on those pages is wrong.
+        * so blindly setting UC or PWT on those pages is wrong.
         * For Pentiums and earlier, the surround logic should disable
         * caching for the high addresses through the KEN pin, but
         * we maintain the tradition of paranoia in this code.
@@ -244,7 +244,7 @@
                test_bit(X86_FEATURE_CYRIX_ARR, boot_cpu_data.x86_capability) ||
                test_bit(X86_FEATURE_CENTAUR_MCR, 
boot_cpu_data.x86_capability)) &&
           offset >= __pa(high_memory))
-               want_flags = _PAGE_PCD;
+               want_flags = _PAGE_UC;
 #endif
 
        /* ignore error because we can't handle it here */
Index: linux-2.6.git/arch/x86/pci/i386.c
===================================================================
--- linux-2.6.git.orig/arch/x86/pci/i386.c      2008-01-15 03:29:38.000000000 
-0800
+++ linux-2.6.git/arch/x86/pci/i386.c   2008-01-15 05:02:12.000000000 -0800
@@ -353,7 +353,7 @@
                 */
                prot = pgprot_val(vma->vm_page_prot);
                if (boot_cpu_data.x86 > 3) {
-                       prot |= _PAGE_PCD;
+                       prot |= _PAGE_UC;
                }
                vma->vm_page_prot = __pgprot(prot);
        }
Index: linux-2.6.git/include/asm-x86/pgtable.h
===================================================================
--- linux-2.6.git.orig/include/asm-x86/pgtable.h        2008-01-15 
03:29:38.000000000 -0800
+++ linux-2.6.git/include/asm-x86/pgtable.h     2008-01-15 05:11:12.000000000 
-0800
@@ -28,14 +28,16 @@
 #define _PAGE_RW       (_AC(1, L)<<_PAGE_BIT_RW)
 #define _PAGE_USER     (_AC(1, L)<<_PAGE_BIT_USER)
 #define _PAGE_PWT      (_AC(1, L)<<_PAGE_BIT_PWT)
-#define _PAGE_PCD      ((_AC(1, L)<<_PAGE_BIT_PCD) | _PAGE_PWT)
+#define _PAGE_PCD      (_AC(1, L)<<_PAGE_BIT_PCD) /* Do not use PCD directly */
 #define _PAGE_ACCESSED (_AC(1, L)<<_PAGE_BIT_ACCESSED)
 #define _PAGE_DIRTY    (_AC(1, L)<<_PAGE_BIT_DIRTY)
 #define _PAGE_PSE      (_AC(1, L)<<_PAGE_BIT_PSE)      /* 2MB page */
 #define _PAGE_GLOBAL   (_AC(1, L)<<_PAGE_BIT_GLOBAL)   /* Global TLB entry */
-/* We redefine PCD to be write combining. PAT bit is not used */
-#define _PAGE_WC       ((_AC(1, L)<<_PAGE_BIT_PCD))
-#define _PAGE_CACHE_MASK (_PAGE_PCD)
+/* We redefine PCD to be WC, PCD|PWT to be UC. PAT bit is not used */
+#define _PAGE_WC       (_PAGE_PCD)
+#define _PAGE_UC       (_PAGE_PCD | _PAGE_PWT)
+#define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT)
+
 #define _PAGE_UNUSED1  (_AC(1, L)<<_PAGE_BIT_UNUSED1)
 #define _PAGE_UNUSED2  (_AC(1, L)<<_PAGE_BIT_UNUSED2)
 #define _PAGE_UNUSED3  (_AC(1, L)<<_PAGE_BIT_UNUSED3)
@@ -82,9 +84,9 @@
 
 #define __PAGE_KERNEL_RO               (__PAGE_KERNEL & ~_PAGE_RW)
 #define __PAGE_KERNEL_RX               (__PAGE_KERNEL_EXEC & ~_PAGE_RW)
-#define __PAGE_KERNEL_NOCACHE          (__PAGE_KERNEL | _PAGE_PCD)
+#define __PAGE_KERNEL_NOCACHE          (__PAGE_KERNEL | _PAGE_UC)
 #define __PAGE_KERNEL_VSYSCALL         (__PAGE_KERNEL_RX | _PAGE_USER)
-#define __PAGE_KERNEL_VSYSCALL_NOCACHE (__PAGE_KERNEL_VSYSCALL | _PAGE_PCD)
+#define __PAGE_KERNEL_VSYSCALL_NOCACHE (__PAGE_KERNEL_VSYSCALL | _PAGE_UC)
 #define __PAGE_KERNEL_LARGE            (__PAGE_KERNEL | _PAGE_PSE)
 #define __PAGE_KERNEL_LARGE_EXEC       (__PAGE_KERNEL_EXEC | _PAGE_PSE)
 
Index: linux-2.6.git/include/asm-x86/pgtable_32.h
===================================================================
--- linux-2.6.git.orig/include/asm-x86/pgtable_32.h     2008-01-15 
03:29:38.000000000 -0800
+++ linux-2.6.git/include/asm-x86/pgtable_32.h  2008-01-15 04:42:16.000000000 
-0800
@@ -121,7 +121,7 @@
  * it, this is a no-op.
  */
 #define pgprot_noncached(prot) ((boot_cpu_data.x86 > 3)                        
                  \
-                                ? (__pgprot(pgprot_val(prot) | _PAGE_PCD)) : 
(prot))
+                                ? (__pgprot(pgprot_val(prot) | _PAGE_UC)) : 
(prot))
 
 /*
  * Macro to make mark a page protection value as "write-combining".
Index: linux-2.6.git/include/asm-x86/pgtable_64.h
===================================================================
--- linux-2.6.git.orig/include/asm-x86/pgtable_64.h     2008-01-15 
03:29:38.000000000 -0800
+++ linux-2.6.git/include/asm-x86/pgtable_64.h  2008-01-15 04:41:37.000000000 
-0800
@@ -170,7 +170,7 @@
  * and do not allow for consecutive writes to be combined.
  */
 #define pgprot_noncached(prot) \
-       __pgprot((pgprot_val(prot) & ~_PAGE_CACHE_MASK) | _PAGE_PCD)
+       __pgprot((pgprot_val(prot) & ~_PAGE_CACHE_MASK) | _PAGE_UC)
 
 /*
  * Macro to make mark a page protection value as "write-combining".

-- 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to