[PATCH] Calgary: allow compiling Calgary in but not using it by default
authorMuli Ben-Yehuda <muli@il.ibm.com>
Thu, 7 Dec 2006 01:14:07 +0000 (02:14 +0100)
committerAndi Kleen <andi@basil.nowhere.org>
Thu, 7 Dec 2006 01:14:07 +0000 (02:14 +0100)
This patch makes it possible to compile Calgary in but not use it by
default. In this mode, use 'iommu=calgary' to activate it.

Signed-off-by: Muli Ben-Yehuda <muli@il.ibm.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
Signed-off-by: Andi Kleen <ak@suse.de>
Documentation/x86_64/boot-options.txt
arch/x86_64/Kconfig
arch/x86_64/kernel/pci-calgary.c
arch/x86_64/kernel/pci-dma.c
include/asm-x86_64/calgary.h

index ab9b1c046c00996cac816aa559e0f4564ece580a..dbdcaf68e3ea382304784bf66fce502216f1d1f1 100644 (file)
@@ -179,7 +179,7 @@ PCI
 IOMMU
 
  iommu=[size][,noagp][,off][,force][,noforce][,leak][,memaper[=order]][,merge]
-         [,forcesac][,fullflush][,nomerge][,noaperture]
+         [,forcesac][,fullflush][,nomerge][,noaperture][,calgary]
    size  set size of iommu (in bytes)
    noagp don't initialize the AGP driver and use full aperture.
    off   don't use the IOMMU
@@ -200,6 +200,7 @@ IOMMU
            buffering.
    nodac    Forbid DMA >4GB
    panic    Always panic when IOMMU overflows
+   calgary  Use the Calgary IOMMU if it is available
 
   swiotlb=pages[,force]
 
index 010d2265f1cfb05086017020c3533cb737cca614..5cb509dbffe4c44c06a2bdacba0a9142bcf6a4e1 100644 (file)
@@ -455,6 +455,17 @@ config CALGARY_IOMMU
          Normally the kernel will make the right choice by itself.
          If unsure, say Y.
 
+config CALGARY_IOMMU_ENABLED_BY_DEFAULT
+       bool "Should Calgary be enabled by default?"
+       default y
+       depends on CALGARY_IOMMU
+       help
+         Should Calgary be enabled by default? if you choose 'y', Calgary
+         will be used (if it exists). If you choose 'n', Calgary will not be
+         used even if it exists. If you choose 'n' and would like to use
+         Calgary anyway, pass 'iommu=calgary' on the kernel command line.
+         If unsure, say Y.
+
 # need this always selected by IOMMU for the VIA workaround
 config SWIOTLB
        bool
index 8a1e4f35bc3c566c8c31c86ecac07454a9116300..0ddf29dae7e0507f9672e245ffe129fccf856e92 100644 (file)
 #include <asm/dma.h>
 #include <asm/rio.h>
 
+#ifdef CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT
+int use_calgary __read_mostly = 1;
+#else
+int use_calgary __read_mostly = 0;
+#endif /* CONFIG_CALGARY_DEFAULT_ENABLED */
+
 #define PCI_DEVICE_ID_IBM_CALGARY 0x02a1
 #define PCI_VENDOR_DEVICE_ID_CALGARY \
        (PCI_VENDOR_ID_IBM | PCI_DEVICE_ID_IBM_CALGARY << 16)
@@ -1061,6 +1067,9 @@ void __init detect_calgary(void)
        if (swiotlb || no_iommu || iommu_detected)
                return;
 
+       if (!use_calgary)
+               return;
+
        if (!early_pci_allowed())
                return;
 
index f8d857453f8afaf5fc839060cf1ad07dc69d13dc..683b7a5c1ab30170d716a99fe90c633187f4a827 100644 (file)
@@ -296,6 +296,11 @@ __init int iommu_setup(char *p)
                gart_parse_options(p);
 #endif
 
+#ifdef CONFIG_CALGARY_IOMMU
+               if (!strncmp(p, "calgary", 7))
+                       use_calgary = 1;
+#endif /* CONFIG_CALGARY_IOMMU */
+
                p += strcspn(p, ",");
                if (*p == ',')
                        ++p;
index 6b93f5a3a5c8ee81eff80cf96ed40653338f58ed..7ee90064571955ca938b43b6b1c77364037c0978 100644 (file)
@@ -51,6 +51,8 @@ struct iommu_table {
 #define TCE_TABLE_SIZE_4M              6
 #define TCE_TABLE_SIZE_8M              7
 
+extern int use_calgary;
+
 #ifdef CONFIG_CALGARY_IOMMU
 extern int calgary_iommu_init(void);
 extern void detect_calgary(void);