diff options
| -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 | } |
