[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>
This commit is contained in:
Andi Kleen 2006-09-30 01:47:55 +02:00 committed by Andi Kleen
parent b885808e18
commit ece6684012
2 changed files with 22 additions and 0 deletions

View File

@ -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]

View File

@ -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);
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)
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))