2011-05-28 18:16:28

by Mike Travis

[permalink] [raw]
Subject: [PATCH 7/7] Intel pci: Provide option to enable 64-bit IOMMU pass through mode

v2: Use kernel option to implement pass through mode based on this
feedback from David Woodhouse <[email protected]>:

Alternatively, let your version check just be '>=2.6.40', and
your backports to the archaeological trees can include a *new*
kernel command line parameter like 'iommu=pt64' which unfixed
kernels won't understand and will ignore. So your SCU will provide
'iommu=pt' for 2.6.40 or newer, and 'iommu=pt64' for older
kernels. Then at least your hack doesn't affect the *current*
kernels, and will eventually be lost in the mists of time.

Prior to these IOMMU patches, the pass through option could not
be used because it would cause the kernel to panic in certain
circumstances (primarily having devices with more than 32 bits of
DMA addressing, but not enough to handle the system's address range).
In addition, the "force double address cycle" was required to work
around similar issues which causes a significant reduction in DMA
performance.

This patch provides an option to enable the 64bit pass through mode if
the kernel has the capability of enabling that mode without panicing.
It also disables "forcedac" unless that option follows the "pt64" option.

Signed-off-by: Mike Travis <[email protected]>
Acked-by: Dimitri Sivanich <[email protected]>
Cc: [email protected]
---
Documentation/kernel-parameters.txt | 8 +++++++-
drivers/pci/intel-iommu.c | 5 +++++
2 files changed, 12 insertions(+), 1 deletion(-)

--- linux.orig/Documentation/kernel-parameters.txt
+++ linux/Documentation/kernel-parameters.txt
@@ -988,13 +988,19 @@ bytes respectively. Such letter suffixes
bypassed by not enabling DMAR with this option. In
this case, gfx device will use physical address for
DMA.
+ pt64 [Default Off]
+ Enable 64 bit pass through mode if the kernel has the
+ capability. Also disables forcedac, unless that option
+ follows this option.
forcedac [x86_64]
With this option iommu will not optimize to look
for io virtual address below 32 bit forcing dual
address cycle on pci bus for cards supporting greater
than 32 bit addressing. The default is to look
for translation below 32 bit and if not available
- then look in the higher range.
+ then look in the higher range. Note that pt64 disables
+ this option, so this must follow that option to be
+ effective.
strict [Default Off]
With this option on every unmap_single operation will
result in a hardware IOTLB flush operation as opposed
--- linux.orig/drivers/pci/intel-iommu.c
+++ linux/drivers/pci/intel-iommu.c
@@ -419,6 +419,11 @@ static int __init intel_iommu_setup(char
printk(KERN_INFO
"Intel-IOMMU: disable batched IOTLB flush\n");
intel_iommu_strict = 1;
+ } else if (!strncmp(str, "pt64", 6)) {
+ pr_info("Intel-IOMMU: enable 64bit passthrough mode, "
+ "disable Forcing DAC for PCI devices\n");
+ iommu_pass_through = 1;
+ dmar_forcedac = 0;
}

str += strcspn(str, ",");

--