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, ",");

-- 

_______________________________________________
stable mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to