aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/pci-dma.c
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-09-29 19:47:55 -0400
committerAndi Kleen <andi@basil.nowhere.org>2006-09-29 19:47:55 -0400
commitece668401250c1d0419ed078c1d26ccdd30d3289 (patch)
tree6a8fc43edbee644cc6af3cf8252795c858a99b6a /arch/x86_64/kernel/pci-dma.c
parentb885808e185a4ec2dfe16c84434f79e95f0245b0 (diff)
[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/x86_64/kernel/pci-dma.c')
-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,
170} 170}
171EXPORT_SYMBOL(dma_free_coherent); 171EXPORT_SYMBOL(dma_free_coherent);
172 172
173static int forbid_dac __read_mostly;
174
173int dma_supported(struct device *dev, u64 mask) 175int dma_supported(struct device *dev, u64 mask)
174{ 176{
177#ifdef CONFIG_PCI
178 if (mask > 0xffffffff && forbid_dac > 0) {
179
180
181
182 printk(KERN_INFO "PCI: Disallowing DAC for device %s\n", dev->bus_id);
183 return 0;
184 }
185#endif
186
175 if (dma_ops->dma_supported) 187 if (dma_ops->dma_supported)
176 return dma_ops->dma_supported(dev, mask); 188 return dma_ops->dma_supported(dev, mask);
177 189
@@ -231,6 +243,8 @@ EXPORT_SYMBOL(dma_set_mask);
231 allowed overwrite iommu off workarounds for specific chipsets. 243 allowed overwrite iommu off workarounds for specific chipsets.
232 soft Use software bounce buffering (default for Intel machines) 244 soft Use software bounce buffering (default for Intel machines)
233 noaperture Don't touch the aperture for AGP. 245 noaperture Don't touch the aperture for AGP.
246 allowdac Allow DMA >4GB
247 nodac Forbid DMA >4GB
234*/ 248*/
235__init int iommu_setup(char *p) 249__init int iommu_setup(char *p)
236{ 250{
@@ -267,6 +281,10 @@ __init int iommu_setup(char *p)
267 iommu_merge = 0; 281 iommu_merge = 0;
268 if (!strncmp(p, "forcesac",8)) 282 if (!strncmp(p, "forcesac",8))
269 iommu_sac_force = 1; 283 iommu_sac_force = 1;
284 if (!strncmp(p, "allowdac", 8))
285 forbid_dac = 0;
286 if (!strncmp(p, "nodac", 5))
287 forbid_dac = -1;
270 288
271#ifdef CONFIG_SWIOTLB 289#ifdef CONFIG_SWIOTLB
272 if (!strncmp(p, "soft",4)) 290 if (!strncmp(p, "soft",4))