]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/kernel/pci-gart_64.c
x86: entry_32.S - use flags from processor-flags.h
[linux-2.6-omap-h63xx.git] / arch / x86 / kernel / pci-gart_64.c
index 65f6acb025c8833dc8183991bb313e52e3cff9ec..700e4647dd30214ba33b90845f4121421515948d 100644 (file)
@@ -615,8 +615,8 @@ static __init int init_k8_gatt(struct agp_kern_info *info)
 
  nommu:
        /* Should not happen anymore */
-       printk(KERN_ERR "PCI-DMA: More than 4GB of RAM and no IOMMU\n"
-              KERN_ERR "PCI-DMA: 32bit PCI IO may malfunction.\n");
+       printk(KERN_WARNING "PCI-DMA: More than 4GB of RAM and no IOMMU\n"
+              KERN_WARNING "falling back to iommu=soft.\n");
        return -1;
 }
 
@@ -692,9 +692,9 @@ void __init gart_iommu_init(void)
            !gart_iommu_aperture ||
            (no_agp && init_k8_gatt(&info) < 0)) {
                if (end_pfn > MAX_DMA32_PFN) {
-                       printk(KERN_ERR "WARNING more than 4GB of memory "
-                                       "but GART IOMMU not available.\n"
-                              KERN_ERR "WARNING 32bit PCI may malfunction.\n");
+                       printk(KERN_WARNING "More than 4GB of memory "
+                                         "but GART IOMMU not available.\n"
+                              KERN_WARNING "falling back to iommu=soft.\n");
                }
                return;
        }
@@ -749,6 +749,15 @@ void __init gart_iommu_init(void)
         */
        set_memory_np((unsigned long)__va(iommu_bus_base),
                                iommu_size >> PAGE_SHIFT);
+       /*
+        * Tricky. The GART table remaps the physical memory range,
+        * so the CPU wont notice potential aliases and if the memory
+        * is remapped to UC later on, we might surprise the PCI devices
+        * with a stray writeout of a cacheline. So play it sure and
+        * do an explicit, full-scale wbinvd() _after_ having marked all
+        * the pages as Not-Present:
+        */
+       wbinvd();
 
        /*
         * Try to workaround a bug (thanks to BenH)