[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>
This commit is contained in:
committed by
Andi Kleen
parent
eae9375554
commit
bff6547bb6
@@ -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]
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user