aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/swiotlb.h5
-rw-r--r--arch/x86/kernel/pci-dma.c5
-rw-r--r--arch/x86/kernel/pci-swiotlb.c13
-rw-r--r--lib/swiotlb.c5
4 files changed, 18 insertions, 10 deletions
diff --git a/arch/x86/include/asm/swiotlb.h b/arch/x86/include/asm/swiotlb.h
index b9e4e20174fb..940f13a213f8 100644
--- a/arch/x86/include/asm/swiotlb.h
+++ b/arch/x86/include/asm/swiotlb.h
@@ -9,11 +9,12 @@ extern int swiotlb_force;
9 9
10#ifdef CONFIG_SWIOTLB 10#ifdef CONFIG_SWIOTLB
11extern int swiotlb; 11extern int swiotlb;
12extern void pci_swiotlb_init(void); 12extern int pci_swiotlb_init(void);
13#else 13#else
14#define swiotlb 0 14#define swiotlb 0
15static inline void pci_swiotlb_init(void) 15static inline int pci_swiotlb_init(void)
16{ 16{
17 return 0;
17} 18}
18#endif 19#endif
19 20
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
index f79870e89266..0b11bf18f540 100644
--- a/arch/x86/kernel/pci-dma.c
+++ b/arch/x86/kernel/pci-dma.c
@@ -125,16 +125,13 @@ static void __init dma32_free_bootmem(void)
125 125
126void __init pci_iommu_alloc(void) 126void __init pci_iommu_alloc(void)
127{ 127{
128 /* swiotlb is forced by the boot option */
129 int use_swiotlb = swiotlb;
130#ifdef CONFIG_X86_64 128#ifdef CONFIG_X86_64
131 /* free the range so iommu could get some range less than 4G */ 129 /* free the range so iommu could get some range less than 4G */
132 dma32_free_bootmem(); 130 dma32_free_bootmem();
133#else 131#else
134 dma_ops = &nommu_dma_ops; 132 dma_ops = &nommu_dma_ops;
135#endif 133#endif
136 pci_swiotlb_init(); 134 if (pci_swiotlb_init())
137 if (use_swiotlb)
138 return; 135 return;
139 136
140 gart_iommu_hole_init(); 137 gart_iommu_hole_init();
diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c
index 17ce4221bd03..a6e5d0ffa3a7 100644
--- a/arch/x86/kernel/pci-swiotlb.c
+++ b/arch/x86/kernel/pci-swiotlb.c
@@ -42,16 +42,27 @@ static struct dma_map_ops swiotlb_dma_ops = {
42 .dma_supported = NULL, 42 .dma_supported = NULL,
43}; 43};
44 44
45void __init pci_swiotlb_init(void) 45/*
46 * pci_swiotlb_init - initialize swiotlb if necessary
47 *
48 * This returns non-zero if we are forced to use swiotlb (by the boot
49 * option).
50 */
51int __init pci_swiotlb_init(void)
46{ 52{
47 /* don't initialize swiotlb if iommu=off (no_iommu=1) */ 53 /* don't initialize swiotlb if iommu=off (no_iommu=1) */
48#ifdef CONFIG_X86_64 54#ifdef CONFIG_X86_64
49 if (!no_iommu && max_pfn > MAX_DMA32_PFN) 55 if (!no_iommu && max_pfn > MAX_DMA32_PFN)
50 swiotlb = 1; 56 swiotlb = 1;
51#endif 57#endif
58 if (swiotlb_force)
59 swiotlb = 1;
60
52 if (swiotlb) { 61 if (swiotlb) {
53 swiotlb_init(0); 62 swiotlb_init(0);
54 dma_ops = &swiotlb_dma_ops; 63 dma_ops = &swiotlb_dma_ops;
55 } else 64 } else
56 dma_ops = &nommu_dma_ops; 65 dma_ops = &nommu_dma_ops;
66
67 return swiotlb_force;
57} 68}
diff --git a/lib/swiotlb.c b/lib/swiotlb.c
index e6755a0574fb..795472d8ae24 100644
--- a/lib/swiotlb.c
+++ b/lib/swiotlb.c
@@ -109,10 +109,9 @@ setup_io_tlb_npages(char *str)
109 } 109 }
110 if (*str == ',') 110 if (*str == ',')
111 ++str; 111 ++str;
112 if (!strcmp(str, "force")) { 112 if (!strcmp(str, "force"))
113 swiotlb_force = 1; 113 swiotlb_force = 1;
114 swiotlb = 1; 114
115 }
116 return 1; 115 return 1;
117} 116}
118__setup("swiotlb=", setup_io_tlb_npages); 117__setup("swiotlb=", setup_io_tlb_npages);