Commit ece66840 authored by Andi Kleen's avatar Andi Kleen Committed by Andi Kleen

[PATCH] Allow disabling DAC using command line options

Might or might not work around some reported bugs on VIA systems.
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
parent b885808e
...@@ -199,6 +199,10 @@ IOMMU ...@@ -199,6 +199,10 @@ IOMMU
allowed overwrite iommu off workarounds for specific chipsets. allowed overwrite iommu off workarounds for specific chipsets.
soft Use software bounce buffering (default for Intel machines) soft Use software bounce buffering (default for Intel machines)
noaperture Don't touch the aperture for AGP. noaperture Don't touch the aperture for AGP.
allowdac Allow DMA >4GB
When off all DMA over >4GB is forced through an IOMMU or bounce
buffering.
nodac Forbid DMA >4GB
swiotlb=pages[,force] swiotlb=pages[,force]
......
...@@ -170,8 +170,20 @@ void dma_free_coherent(struct device *dev, size_t size, ...@@ -170,8 +170,20 @@ void dma_free_coherent(struct device *dev, size_t size,
} }
EXPORT_SYMBOL(dma_free_coherent); EXPORT_SYMBOL(dma_free_coherent);
static int forbid_dac __read_mostly;
int dma_supported(struct device *dev, u64 mask) int dma_supported(struct device *dev, u64 mask)
{ {
#ifdef CONFIG_PCI
if (mask > 0xffffffff && forbid_dac > 0) {
printk(KERN_INFO "PCI: Disallowing DAC for device %s\n", dev->bus_id);
return 0;
}
#endif
if (dma_ops->dma_supported) if (dma_ops->dma_supported)
return dma_ops->dma_supported(dev, mask); return dma_ops->dma_supported(dev, mask);
...@@ -231,6 +243,8 @@ EXPORT_SYMBOL(dma_set_mask); ...@@ -231,6 +243,8 @@ EXPORT_SYMBOL(dma_set_mask);
allowed overwrite iommu off workarounds for specific chipsets. allowed overwrite iommu off workarounds for specific chipsets.
soft Use software bounce buffering (default for Intel machines) soft Use software bounce buffering (default for Intel machines)
noaperture Don't touch the aperture for AGP. noaperture Don't touch the aperture for AGP.
allowdac Allow DMA >4GB
nodac Forbid DMA >4GB
*/ */
__init int iommu_setup(char *p) __init int iommu_setup(char *p)
{ {
...@@ -267,6 +281,10 @@ __init int iommu_setup(char *p) ...@@ -267,6 +281,10 @@ __init int iommu_setup(char *p)
iommu_merge = 0; iommu_merge = 0;
if (!strncmp(p, "forcesac",8)) if (!strncmp(p, "forcesac",8))
iommu_sac_force = 1; iommu_sac_force = 1;
if (!strncmp(p, "allowdac", 8))
forbid_dac = 0;
if (!strncmp(p, "nodac", 5))
forbid_dac = -1;
#ifdef CONFIG_SWIOTLB #ifdef CONFIG_SWIOTLB
if (!strncmp(p, "soft",4)) if (!strncmp(p, "soft",4))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment