aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64')
-rw-r--r--arch/x86_64/Kconfig11
-rw-r--r--arch/x86_64/kernel/pci-calgary.c9
-rw-r--r--arch/x86_64/kernel/pci-dma.c5
3 files changed, 25 insertions, 0 deletions
diff --git a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig
index 010d2265f1cf..5cb509dbffe4 100644
--- a/arch/x86_64/Kconfig
+++ b/arch/x86_64/Kconfig
@@ -455,6 +455,17 @@ config CALGARY_IOMMU
455 Normally the kernel will make the right choice by itself. 455 Normally the kernel will make the right choice by itself.
456 If unsure, say Y. 456 If unsure, say Y.
457 457
458config CALGARY_IOMMU_ENABLED_BY_DEFAULT
459 bool "Should Calgary be enabled by default?"
460 default y
461 depends on CALGARY_IOMMU
462 help
463 Should Calgary be enabled by default? if you choose 'y', Calgary
464 will be used (if it exists). If you choose 'n', Calgary will not be
465 used even if it exists. If you choose 'n' and would like to use
466 Calgary anyway, pass 'iommu=calgary' on the kernel command line.
467 If unsure, say Y.
468
458# need this always selected by IOMMU for the VIA workaround 469# need this always selected by IOMMU for the VIA workaround
459config SWIOTLB 470config SWIOTLB
460 bool 471 bool
diff --git a/arch/x86_64/kernel/pci-calgary.c b/arch/x86_64/kernel/pci-calgary.c
index 8a1e4f35bc3c..0ddf29dae7e0 100644
--- a/arch/x86_64/kernel/pci-calgary.c
+++ b/arch/x86_64/kernel/pci-calgary.c
@@ -43,6 +43,12 @@
43#include <asm/dma.h> 43#include <asm/dma.h>
44#include <asm/rio.h> 44#include <asm/rio.h>
45 45
46#ifdef CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT
47int use_calgary __read_mostly = 1;
48#else
49int use_calgary __read_mostly = 0;
50#endif /* CONFIG_CALGARY_DEFAULT_ENABLED */
51
46#define PCI_DEVICE_ID_IBM_CALGARY 0x02a1 52#define PCI_DEVICE_ID_IBM_CALGARY 0x02a1
47#define PCI_VENDOR_DEVICE_ID_CALGARY \ 53#define PCI_VENDOR_DEVICE_ID_CALGARY \
48 (PCI_VENDOR_ID_IBM | PCI_DEVICE_ID_IBM_CALGARY << 16) 54 (PCI_VENDOR_ID_IBM | PCI_DEVICE_ID_IBM_CALGARY << 16)
@@ -1061,6 +1067,9 @@ void __init detect_calgary(void)
1061 if (swiotlb || no_iommu || iommu_detected) 1067 if (swiotlb || no_iommu || iommu_detected)
1062 return; 1068 return;
1063 1069
1070 if (!use_calgary)
1071 return;
1072
1064 if (!early_pci_allowed()) 1073 if (!early_pci_allowed())
1065 return; 1074 return;
1066 1075
diff --git a/arch/x86_64/kernel/pci-dma.c b/arch/x86_64/kernel/pci-dma.c
index f8d857453f8a..683b7a5c1ab3 100644
--- a/arch/x86_64/kernel/pci-dma.c
+++ b/arch/x86_64/kernel/pci-dma.c
@@ -296,6 +296,11 @@ __init int iommu_setup(char *p)
296 gart_parse_options(p); 296 gart_parse_options(p);
297#endif 297#endif
298 298
299#ifdef CONFIG_CALGARY_IOMMU
300 if (!strncmp(p, "calgary", 7))
301 use_calgary = 1;
302#endif /* CONFIG_CALGARY_IOMMU */
303
299 p += strcspn(p, ","); 304 p += strcspn(p, ",");
300 if (*p == ',') 305 if (*p == ',')
301 ++p; 306 ++p;