aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/x86_64/boot-options.txt4
-rw-r--r--arch/x86_64/kernel/pci-dma.c18
2 files changed, 22 insertions, 0 deletions
diff --git a/Documentation/x86_64/boot-options.txt b/Documentation/x86_64/boot-options.txt
index 4303e0c12476..e97a4c8fe6ea 100644
--- a/Documentation/x86_64/boot-options.txt
+++ b/Documentation/x86_64/boot-options.txt
@@ -199,6 +199,10 @@ IOMMU
199 allowed overwrite iommu off workarounds for specific chipsets. 199 allowed overwrite iommu off workarounds for specific chipsets.
200 soft Use software bounce buffering (default for Intel machines) 200 soft Use software bounce buffering (default for Intel machines)
201 noaperture Don't touch the aperture for AGP. 201 noaperture Don't touch the aperture for AGP.
202 allowdac Allow DMA >4GB
203 When off all DMA over >4GB is forced through an IOMMU or bounce
204 buffering.
205 nodac Forbid DMA >4GB
202 206
203 swiotlb=pages[,force] 207 swiotlb=pages[,force]
204 208
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))