diff options
Diffstat (limited to 'arch/x86/kernel/pci-dma.c')
-rw-r--r-- | arch/x86/kernel/pci-dma.c | 39 |
1 files changed, 13 insertions, 26 deletions
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index a6e804d16c35..afcc58b69c7c 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -11,10 +11,11 @@ | |||
11 | #include <asm/gart.h> | 11 | #include <asm/gart.h> |
12 | #include <asm/calgary.h> | 12 | #include <asm/calgary.h> |
13 | #include <asm/amd_iommu.h> | 13 | #include <asm/amd_iommu.h> |
14 | #include <asm/x86_init.h> | ||
14 | 15 | ||
15 | static int forbid_dac __read_mostly; | 16 | static int forbid_dac __read_mostly; |
16 | 17 | ||
17 | struct dma_map_ops *dma_ops; | 18 | struct dma_map_ops *dma_ops = &nommu_dma_ops; |
18 | EXPORT_SYMBOL(dma_ops); | 19 | EXPORT_SYMBOL(dma_ops); |
19 | 20 | ||
20 | static int iommu_sac_force __read_mostly; | 21 | static int iommu_sac_force __read_mostly; |
@@ -42,9 +43,6 @@ int iommu_detected __read_mostly = 0; | |||
42 | */ | 43 | */ |
43 | int iommu_pass_through __read_mostly; | 44 | int iommu_pass_through __read_mostly; |
44 | 45 | ||
45 | dma_addr_t bad_dma_address __read_mostly = 0; | ||
46 | EXPORT_SYMBOL(bad_dma_address); | ||
47 | |||
48 | /* Dummy device used for NULL arguments (normally ISA). */ | 46 | /* Dummy device used for NULL arguments (normally ISA). */ |
49 | struct device x86_dma_fallback_dev = { | 47 | struct device x86_dma_fallback_dev = { |
50 | .init_name = "fallback device", | 48 | .init_name = "fallback device", |
@@ -126,20 +124,17 @@ void __init pci_iommu_alloc(void) | |||
126 | /* free the range so iommu could get some range less than 4G */ | 124 | /* free the range so iommu could get some range less than 4G */ |
127 | dma32_free_bootmem(); | 125 | dma32_free_bootmem(); |
128 | #endif | 126 | #endif |
127 | if (pci_swiotlb_init()) | ||
128 | return; | ||
129 | 129 | ||
130 | /* | ||
131 | * The order of these functions is important for | ||
132 | * fall-back/fail-over reasons | ||
133 | */ | ||
134 | gart_iommu_hole_init(); | 130 | gart_iommu_hole_init(); |
135 | 131 | ||
136 | detect_calgary(); | 132 | detect_calgary(); |
137 | 133 | ||
138 | detect_intel_iommu(); | 134 | detect_intel_iommu(); |
139 | 135 | ||
136 | /* needs to be called after gart_iommu_hole_init */ | ||
140 | amd_iommu_detect(); | 137 | amd_iommu_detect(); |
141 | |||
142 | pci_swiotlb_init(); | ||
143 | } | 138 | } |
144 | 139 | ||
145 | void *dma_generic_alloc_coherent(struct device *dev, size_t size, | 140 | void *dma_generic_alloc_coherent(struct device *dev, size_t size, |
@@ -214,7 +209,7 @@ static __init int iommu_setup(char *p) | |||
214 | if (!strncmp(p, "allowdac", 8)) | 209 | if (!strncmp(p, "allowdac", 8)) |
215 | forbid_dac = 0; | 210 | forbid_dac = 0; |
216 | if (!strncmp(p, "nodac", 5)) | 211 | if (!strncmp(p, "nodac", 5)) |
217 | forbid_dac = -1; | 212 | forbid_dac = 1; |
218 | if (!strncmp(p, "usedac", 6)) { | 213 | if (!strncmp(p, "usedac", 6)) { |
219 | forbid_dac = -1; | 214 | forbid_dac = -1; |
220 | return 1; | 215 | return 1; |
@@ -289,25 +284,17 @@ static int __init pci_iommu_init(void) | |||
289 | #ifdef CONFIG_PCI | 284 | #ifdef CONFIG_PCI |
290 | dma_debug_add_bus(&pci_bus_type); | 285 | dma_debug_add_bus(&pci_bus_type); |
291 | #endif | 286 | #endif |
287 | x86_init.iommu.iommu_init(); | ||
292 | 288 | ||
293 | calgary_iommu_init(); | 289 | if (swiotlb) { |
294 | 290 | printk(KERN_INFO "PCI-DMA: " | |
295 | intel_iommu_init(); | 291 | "Using software bounce buffering for IO (SWIOTLB)\n"); |
292 | swiotlb_print_info(); | ||
293 | } else | ||
294 | swiotlb_free(); | ||
296 | 295 | ||
297 | amd_iommu_init(); | ||
298 | |||
299 | gart_iommu_init(); | ||
300 | |||
301 | no_iommu_init(); | ||
302 | return 0; | 296 | return 0; |
303 | } | 297 | } |
304 | |||
305 | void pci_iommu_shutdown(void) | ||
306 | { | ||
307 | gart_iommu_shutdown(); | ||
308 | |||
309 | amd_iommu_shutdown(); | ||
310 | } | ||
311 | /* Must execute after PCI subsystem */ | 298 | /* Must execute after PCI subsystem */ |
312 | rootfs_initcall(pci_iommu_init); | 299 | rootfs_initcall(pci_iommu_init); |
313 | 300 | ||