diff options
-rw-r--r-- | Documentation/x86_64/boot-options.txt | 4 | ||||
-rw-r--r-- | arch/x86_64/kernel/pci-dma.c | 18 |
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 | } |
171 | EXPORT_SYMBOL(dma_free_coherent); | 171 | EXPORT_SYMBOL(dma_free_coherent); |
172 | 172 | ||
173 | static int forbid_dac __read_mostly; | ||
174 | |||
173 | int dma_supported(struct device *dev, u64 mask) | 175 | int 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)) |