diff options
-rw-r--r-- | arch/x86/include/asm/swiotlb.h | 5 | ||||
-rw-r--r-- | arch/x86/kernel/pci-dma.c | 5 | ||||
-rw-r--r-- | arch/x86/kernel/pci-swiotlb.c | 13 | ||||
-rw-r--r-- | lib/swiotlb.c | 5 |
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 |
11 | extern int swiotlb; | 11 | extern int swiotlb; |
12 | extern void pci_swiotlb_init(void); | 12 | extern int pci_swiotlb_init(void); |
13 | #else | 13 | #else |
14 | #define swiotlb 0 | 14 | #define swiotlb 0 |
15 | static inline void pci_swiotlb_init(void) | 15 | static 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 | ||
126 | void __init pci_iommu_alloc(void) | 126 | void __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 | ||
45 | void __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 | */ | ||
51 | int __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); |