summary refs log tree commit diff
path: root/arch
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-09-30 01:47:55 +0200
committerAndi Kleen <andi@basil.nowhere.org>2006-09-30 01:47:55 +0200
commitece668401250c1d0419ed078c1d26ccdd30d3289 (patch)
tree6a8fc43edbee644cc6af3cf8252795c858a99b6a /arch
parentb885808e185a4ec2dfe16c84434f79e95f0245b0 (diff)
downloadlinux-ece668401250c1d0419ed078c1d26ccdd30d3289.tar.gz
[PATCH] Allow disabling DAC using command line options
Might or might not work around some reported bugs on VIA systems.

Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/kernel/pci-dma.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/x86_64/kernel/pci-dma.c b/arch/x86_64/kernel/pci-dma.c
index 4dcb671bd19f..225e19941b67 100644
--- a/arch/x86_64/kernel/pci-dma.c
+++ b/arch/x86_64/kernel/pci-dma.c
@@ -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))