diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/include/asm/swiotlb.h | 8 | ||||
-rw-r--r-- | arch/x86/kernel/pci-dma.c | 9 | ||||
-rw-r--r-- | arch/x86/kernel/pci-swiotlb.c | 11 |
3 files changed, 17 insertions, 11 deletions
diff --git a/arch/x86/include/asm/swiotlb.h b/arch/x86/include/asm/swiotlb.h index 87ffcb12a1b8..8085277e1b8b 100644 --- a/arch/x86/include/asm/swiotlb.h +++ b/arch/x86/include/asm/swiotlb.h | |||
@@ -5,13 +5,17 @@ | |||
5 | 5 | ||
6 | #ifdef CONFIG_SWIOTLB | 6 | #ifdef CONFIG_SWIOTLB |
7 | extern int swiotlb; | 7 | extern int swiotlb; |
8 | extern int pci_swiotlb_init(void); | 8 | extern int __init pci_swiotlb_detect(void); |
9 | extern void __init pci_swiotlb_init(void); | ||
9 | #else | 10 | #else |
10 | #define swiotlb 0 | 11 | #define swiotlb 0 |
11 | static inline int pci_swiotlb_init(void) | 12 | static inline int pci_swiotlb_detect(void) |
12 | { | 13 | { |
13 | return 0; | 14 | return 0; |
14 | } | 15 | } |
16 | static inline void pci_swiotlb_init(void) | ||
17 | { | ||
18 | } | ||
15 | #endif | 19 | #endif |
16 | 20 | ||
17 | static inline void dma_mark_clean(void *addr, size_t size) {} | 21 | static inline void dma_mark_clean(void *addr, size_t size) {} |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index fcc2f2bfa39c..75e14e21f61a 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -120,15 +120,12 @@ static void __init dma32_free_bootmem(void) | |||
120 | 120 | ||
121 | void __init pci_iommu_alloc(void) | 121 | void __init pci_iommu_alloc(void) |
122 | { | 122 | { |
123 | int use_swiotlb; | ||
124 | |||
125 | use_swiotlb = pci_swiotlb_init(); | ||
126 | #ifdef CONFIG_X86_64 | 123 | #ifdef CONFIG_X86_64 |
127 | /* 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 */ |
128 | dma32_free_bootmem(); | 125 | dma32_free_bootmem(); |
129 | #endif | 126 | #endif |
130 | if (use_swiotlb) | 127 | if (pci_swiotlb_detect()) |
131 | return; | 128 | goto out; |
132 | 129 | ||
133 | gart_iommu_hole_init(); | 130 | gart_iommu_hole_init(); |
134 | 131 | ||
@@ -138,6 +135,8 @@ void __init pci_iommu_alloc(void) | |||
138 | 135 | ||
139 | /* needs to be called after gart_iommu_hole_init */ | 136 | /* needs to be called after gart_iommu_hole_init */ |
140 | amd_iommu_detect(); | 137 | amd_iommu_detect(); |
138 | out: | ||
139 | pci_swiotlb_init(); | ||
141 | } | 140 | } |
142 | 141 | ||
143 | void *dma_generic_alloc_coherent(struct device *dev, size_t size, | 142 | void *dma_generic_alloc_coherent(struct device *dev, size_t size, |
diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c index e3c0a66b9e77..7d2829dde20e 100644 --- a/arch/x86/kernel/pci-swiotlb.c +++ b/arch/x86/kernel/pci-swiotlb.c | |||
@@ -43,12 +43,12 @@ static struct dma_map_ops swiotlb_dma_ops = { | |||
43 | }; | 43 | }; |
44 | 44 | ||
45 | /* | 45 | /* |
46 | * pci_swiotlb_init - initialize swiotlb if necessary | 46 | * pci_swiotlb_detect - set swiotlb to 1 if necessary |
47 | * | 47 | * |
48 | * This returns non-zero if we are forced to use swiotlb (by the boot | 48 | * This returns non-zero if we are forced to use swiotlb (by the boot |
49 | * option). | 49 | * option). |
50 | */ | 50 | */ |
51 | int __init pci_swiotlb_init(void) | 51 | int __init pci_swiotlb_detect(void) |
52 | { | 52 | { |
53 | int use_swiotlb = swiotlb | swiotlb_force; | 53 | int use_swiotlb = swiotlb | swiotlb_force; |
54 | 54 | ||
@@ -60,10 +60,13 @@ int __init pci_swiotlb_init(void) | |||
60 | if (swiotlb_force) | 60 | if (swiotlb_force) |
61 | swiotlb = 1; | 61 | swiotlb = 1; |
62 | 62 | ||
63 | return use_swiotlb; | ||
64 | } | ||
65 | |||
66 | void __init pci_swiotlb_init(void) | ||
67 | { | ||
63 | if (swiotlb) { | 68 | if (swiotlb) { |
64 | swiotlb_init(0); | 69 | swiotlb_init(0); |
65 | dma_ops = &swiotlb_dma_ops; | 70 | dma_ops = &swiotlb_dma_ops; |
66 | } | 71 | } |
67 | |||
68 | return use_swiotlb; | ||
69 | } | 72 | } |