diff options
Diffstat (limited to 'arch/x86_64/kernel/pci-dma.c')
-rw-r--r-- | arch/x86_64/kernel/pci-dma.c | 18 |
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 | } |
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)) |