Jelajahi Sumber

[PATCH] Calgary: allow compiling Calgary in but not using it by default

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>
Muli Ben-Yehuda 18 tahun lalu
induk
melakukan
bff6547bb6

+ 2 - 1
Documentation/x86_64/boot-options.txt

@@ -179,7 +179,7 @@ PCI
 IOMMU
 IOMMU
 
 
  iommu=[size][,noagp][,off][,force][,noforce][,leak][,memaper[=order]][,merge]
  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)
    size  set size of iommu (in bytes)
    noagp don't initialize the AGP driver and use full aperture.
    noagp don't initialize the AGP driver and use full aperture.
    off   don't use the IOMMU
    off   don't use the IOMMU
@@ -200,6 +200,7 @@ IOMMU
 	    buffering.
 	    buffering.
    nodac    Forbid DMA >4GB
    nodac    Forbid DMA >4GB
    panic    Always panic when IOMMU overflows
    panic    Always panic when IOMMU overflows
+   calgary  Use the Calgary IOMMU if it is available
 
 
   swiotlb=pages[,force]
   swiotlb=pages[,force]
 
 

+ 11 - 0
arch/x86_64/Kconfig

@@ -455,6 +455,17 @@ config CALGARY_IOMMU
 	  Normally the kernel will make the right choice by itself.
 	  Normally the kernel will make the right choice by itself.
 	  If unsure, say Y.
 	  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
 # need this always selected by IOMMU for the VIA workaround
 config SWIOTLB
 config SWIOTLB
 	bool
 	bool

+ 9 - 0
arch/x86_64/kernel/pci-calgary.c

@@ -43,6 +43,12 @@
 #include <asm/dma.h>
 #include <asm/dma.h>
 #include <asm/rio.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_DEVICE_ID_IBM_CALGARY 0x02a1
 #define PCI_VENDOR_DEVICE_ID_CALGARY \
 #define PCI_VENDOR_DEVICE_ID_CALGARY \
 	(PCI_VENDOR_ID_IBM | PCI_DEVICE_ID_IBM_CALGARY << 16)
 	(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)
 	if (swiotlb || no_iommu || iommu_detected)
 		return;
 		return;
 
 
+	if (!use_calgary)
+		return;
+
 	if (!early_pci_allowed())
 	if (!early_pci_allowed())
 		return;
 		return;
 
 

+ 5 - 0
arch/x86_64/kernel/pci-dma.c

@@ -296,6 +296,11 @@ __init int iommu_setup(char *p)
 		gart_parse_options(p);
 		gart_parse_options(p);
 #endif
 #endif
 
 
+#ifdef CONFIG_CALGARY_IOMMU
+		if (!strncmp(p, "calgary", 7))
+			use_calgary = 1;
+#endif /* CONFIG_CALGARY_IOMMU */
+
 		p += strcspn(p, ",");
 		p += strcspn(p, ",");
 		if (*p == ',')
 		if (*p == ',')
 			++p;
 			++p;

+ 2 - 0
include/asm-x86_64/calgary.h

@@ -51,6 +51,8 @@ struct iommu_table {
 #define TCE_TABLE_SIZE_4M		6
 #define TCE_TABLE_SIZE_4M		6
 #define TCE_TABLE_SIZE_8M		7
 #define TCE_TABLE_SIZE_8M		7
 
 
+extern int use_calgary;
+
 #ifdef CONFIG_CALGARY_IOMMU
 #ifdef CONFIG_CALGARY_IOMMU
 extern int calgary_iommu_init(void);
 extern int calgary_iommu_init(void);
 extern void detect_calgary(void);
 extern void detect_calgary(void);