[PATCH] Allow disabling DAC using command line options
authorAndi Kleen <ak@suse.de>
Fri, 29 Sep 2006 23:47:55 +0000 (01:47 +0200)
committerAndi Kleen <andi@basil.nowhere.org>
Fri, 29 Sep 2006 23:47:55 +0000 (01:47 +0200)
Might or might not work around some reported bugs on VIA systems.

Signed-off-by: Andi Kleen <ak@suse.de>
Documentation/x86_64/boot-options.txt
arch/x86_64/kernel/pci-dma.c

index 4303e0c12476d1afb4af9c7998e46cb2ed4b7494..e97a4c8fe6ead5ff4220c7e9f7972d833a852581 100644 (file)
@@ -199,6 +199,10 @@ IOMMU
    allowed  overwrite iommu off workarounds for specific chipsets.
    soft         Use software bounce buffering (default for Intel machines)
    noaperture Don't touch the aperture for AGP.
+   allowdac Allow DMA >4GB
+           When off all DMA over >4GB is forced through an IOMMU or bounce
+           buffering.
+   nodac    Forbid DMA >4GB
 
   swiotlb=pages[,force]
 
index 4dcb671bd19fa760f81dc7d22f05a3eecf7c36a4..225e19941b67b853a23499e2609069b0964edba5 100644 (file)
@@ -170,8 +170,20 @@ void dma_free_coherent(struct device *dev, size_t size,
 }
 EXPORT_SYMBOL(dma_free_coherent);
 
+static int forbid_dac __read_mostly;
+
 int dma_supported(struct device *dev, u64 mask)
 {
+#ifdef CONFIG_PCI
+       if (mask > 0xffffffff && forbid_dac > 0) {
+
+
+
+               printk(KERN_INFO "PCI: Disallowing DAC for device %s\n", dev->bus_id);
+               return 0;
+       }
+#endif
+
        if (dma_ops->dma_supported)
                return dma_ops->dma_supported(dev, mask);
 
@@ -231,6 +243,8 @@ EXPORT_SYMBOL(dma_set_mask);
    allowed  overwrite iommu off workarounds for specific chipsets.
    soft         Use software bounce buffering (default for Intel machines)
    noaperture Don't touch the aperture for AGP.
+   allowdac Allow DMA >4GB
+   nodac    Forbid DMA >4GB
 */
 __init int iommu_setup(char *p)
 {
@@ -267,6 +281,10 @@ __init int iommu_setup(char *p)
                    iommu_merge = 0;
            if (!strncmp(p, "forcesac",8))
                    iommu_sac_force = 1;
+           if (!strncmp(p, "allowdac", 8))
+                   forbid_dac = 0;
+           if (!strncmp(p, "nodac", 5))
+                   forbid_dac = -1;
 
 #ifdef CONFIG_SWIOTLB
            if (!strncmp(p, "soft",4))