[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] Introduce xen_swiotlb variable that is set when Xen is running.
Having the 'xen_swiotlb' variable enabled causes all of the IOMMU's to be disabled (except the Xen-SWIOTLB). It is in essence a copy of what swiotlb variable does. However the swiotlb variable cannot be used because it would turn on the non-Xen SWIOTLB. --- arch/x86/include/asm/dma-mapping.h | 1 + arch/x86/include/asm/xen/swiotlb.h | 4 +++- arch/x86/kernel/amd_iommu_init.c | 2 +- arch/x86/kernel/aperture_64.c | 2 +- arch/x86/kernel/pci-calgary_64.c | 2 +- arch/x86/kernel/pci-dma.c | 4 ++-- arch/x86/kernel/pci-gart_64.c | 2 +- arch/x86/kernel/pci-swiotlb.c | 4 ++-- arch/x86/xen/pci-swiotlb.c | 3 +++ 9 files changed, 15 insertions(+), 9 deletions(-) diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index 1c3f943..01ef814 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h @@ -12,6 +12,7 @@ #include <linux/dma-attrs.h> #include <asm/io.h> #include <asm/swiotlb.h> +#include <asm/xen/swiotlb.h> #include <asm-generic/dma-coherent.h> extern dma_addr_t bad_dma_address; diff --git a/arch/x86/include/asm/xen/swiotlb.h b/arch/x86/include/asm/xen/swiotlb.h index d094f89..fd7e48a 100644 --- a/arch/x86/include/asm/xen/swiotlb.h +++ b/arch/x86/include/asm/xen/swiotlb.h @@ -2,9 +2,11 @@ #define _ASM_X86_XEN_SWIOTLB_H #ifdef CONFIG_PCI_XEN +extern int xen_swiotlb; extern void xen_swiotlb_init(void); #else -static void xen_swiotlb_init(void) { } +#define xen_swiotlb 0 +static inline void xen_swiotlb_init(void) { } #endif #endif diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index c1b17e9..78ec74b 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c @@ -1304,7 +1304,7 @@ static int __init early_amd_iommu_detect(struct acpi_table_header *table) void __init amd_iommu_detect(void) { - if (swiotlb || no_iommu || (iommu_detected && !gart_iommu_aperture)) + if (swiotlb || xen_swiotlb || no_iommu || (iommu_detected && !gart_iommu_aperture)) return; if (acpi_table_parse("IVRS", early_amd_iommu_detect) == 0) { diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index 676debf..6a50006 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c @@ -369,7 +369,7 @@ void __init gart_iommu_hole_init(void) int fix, slot, valid_agp = 0; int i, node; - if (gart_iommu_aperture_disabled || !fix_aperture || + if (gart_iommu_aperture_disabled || !fix_aperture || xen_swiotlb || !early_pci_allowed()) return; diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 971a3be..f7b8e1c 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c @@ -1357,7 +1357,7 @@ void __init detect_calgary(void) * if the user specified iommu=off or iommu=soft or we found * another HW IOMMU already, bail out. */ - if (swiotlb || no_iommu || iommu_detected) + if (swiotlb || xen_swiotlb || no_iommu || iommu_detected) return; if (!use_calgary) diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 6b76948..1101a9f 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c @@ -122,6 +122,8 @@ void __init pci_iommu_alloc(void) * The order of these functions is important for * fall-back/fail-over reasons */ + xen_swiotlb_init(); + gart_iommu_hole_init(); detect_calgary(); @@ -130,8 +132,6 @@ void __init pci_iommu_alloc(void) amd_iommu_detect(); - xen_swiotlb_init(); - pci_swiotlb_init(); } diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index d2e56b8..f2c9f19 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c @@ -730,7 +730,7 @@ void __init gart_iommu_init(void) (agp_copy_info(agp_bridge, &info) < 0); #endif - if (swiotlb) + if (swiotlb || xen_swiotlb) return; /* Did we detect a different HW IOMMU? */ diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c index e8a3501..54a0fa9 100644 --- a/arch/x86/kernel/pci-swiotlb.c +++ b/arch/x86/kernel/pci-swiotlb.c @@ -47,10 +47,10 @@ void __init pci_swiotlb_init(void) /* don't initialize swiotlb if iommu=off (no_iommu=1) */ #ifdef CONFIG_X86_64 if ((!iommu_detected && !no_iommu && max_pfn > MAX_DMA32_PFN) || - iommu_pass_through) + iommu_pass_through || !xen_swiotlb) swiotlb = 1; #endif - if (swiotlb_force) + if (swiotlb_force || !xen_swiotlb) swiotlb = 1; if (swiotlb) { printk(KERN_INFO "PCI-DMA: Using software bounce buffering for IO (SWIOTLB)\n"); diff --git a/arch/x86/xen/pci-swiotlb.c b/arch/x86/xen/pci-swiotlb.c index 5e2c856..de2dd39 100644 --- a/arch/x86/xen/pci-swiotlb.c +++ b/arch/x86/xen/pci-swiotlb.c @@ -978,6 +978,8 @@ static struct dma_map_ops xen_swiotlb_dma_ops = { .dma_supported = NULL, }; +int xen_swiotlb __read_mostly; + void __init xen_swiotlb_init(void) { if (xen_initial_domain()) { @@ -985,5 +987,6 @@ void __init xen_swiotlb_init(void) xen_swiotlb_init_with_default_size(64 * (1<<20)); /* default to 64MB */ dma_ops = &xen_swiotlb_dma_ops; iommu_detected = 1; + xen_swiotlb = 1; } } -- 1.6.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |