diff options
Diffstat (limited to 'arch/x86/kernel/pci-dma.c')
-rw-r--r-- | arch/x86/kernel/pci-dma.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 91443361cb67..48cccbe51aa5 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -1,12 +1,16 @@ | |||
1 | #include <linux/dma-mapping.h> | 1 | #include <linux/dma-mapping.h> |
2 | #include <linux/dmar.h> | 2 | #include <linux/dmar.h> |
3 | #include <linux/bootmem.h> | 3 | #include <linux/bootmem.h> |
4 | #include <linux/pci.h> | ||
4 | 5 | ||
5 | #include <asm/proto.h> | 6 | #include <asm/proto.h> |
6 | #include <asm/dma.h> | 7 | #include <asm/dma.h> |
7 | #include <asm/gart.h> | 8 | #include <asm/gart.h> |
8 | #include <asm/calgary.h> | 9 | #include <asm/calgary.h> |
9 | 10 | ||
11 | int forbid_dac __read_mostly; | ||
12 | EXPORT_SYMBOL(forbid_dac); | ||
13 | |||
10 | const struct dma_mapping_ops *dma_ops; | 14 | const struct dma_mapping_ops *dma_ops; |
11 | EXPORT_SYMBOL(dma_ops); | 15 | EXPORT_SYMBOL(dma_ops); |
12 | 16 | ||
@@ -121,3 +125,17 @@ void pci_iommu_shutdown(void) | |||
121 | } | 125 | } |
122 | /* Must execute after PCI subsystem */ | 126 | /* Must execute after PCI subsystem */ |
123 | fs_initcall(pci_iommu_init); | 127 | fs_initcall(pci_iommu_init); |
128 | |||
129 | #ifdef CONFIG_PCI | ||
130 | /* Many VIA bridges seem to corrupt data for DAC. Disable it here */ | ||
131 | |||
132 | static __devinit void via_no_dac(struct pci_dev *dev) | ||
133 | { | ||
134 | if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && forbid_dac == 0) { | ||
135 | printk(KERN_INFO "PCI: VIA PCI bridge detected." | ||
136 | "Disabling DAC.\n"); | ||
137 | forbid_dac = 1; | ||
138 | } | ||
139 | } | ||
140 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac); | ||
141 | #endif | ||