diff options
| -rw-r--r-- | arch/x86/Kconfig | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/swiotlb.h | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_gart_64.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-swiotlb.c | 9 | ||||
| -rw-r--r-- | arch/x86/pci/sta2x11-fixup.c | 6 | ||||
| -rw-r--r-- | include/linux/swiotlb.h | 2 | ||||
| -rw-r--r-- | lib/swiotlb.c | 2 |
7 files changed, 20 insertions, 10 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 896a411a4584..4a0137f6f032 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -41,7 +41,7 @@ config X86 | |||
| 41 | select ARCH_WANT_OPTIONAL_GPIOLIB | 41 | select ARCH_WANT_OPTIONAL_GPIOLIB |
| 42 | select ARCH_WANT_FRAME_POINTERS | 42 | select ARCH_WANT_FRAME_POINTERS |
| 43 | select HAVE_DMA_ATTRS | 43 | select HAVE_DMA_ATTRS |
| 44 | select HAVE_DMA_CONTIGUOUS if !SWIOTLB | 44 | select HAVE_DMA_CONTIGUOUS |
| 45 | select HAVE_KRETPROBES | 45 | select HAVE_KRETPROBES |
| 46 | select GENERIC_EARLY_IOREMAP | 46 | select GENERIC_EARLY_IOREMAP |
| 47 | select HAVE_OPTPROBES | 47 | select HAVE_OPTPROBES |
diff --git a/arch/x86/include/asm/swiotlb.h b/arch/x86/include/asm/swiotlb.h index 977f1761a25d..ab05d73e2bb7 100644 --- a/arch/x86/include/asm/swiotlb.h +++ b/arch/x86/include/asm/swiotlb.h | |||
| @@ -29,4 +29,11 @@ static inline void pci_swiotlb_late_init(void) | |||
| 29 | 29 | ||
| 30 | static inline void dma_mark_clean(void *addr, size_t size) {} | 30 | static inline void dma_mark_clean(void *addr, size_t size) {} |
| 31 | 31 | ||
| 32 | extern void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size, | ||
| 33 | dma_addr_t *dma_handle, gfp_t flags, | ||
| 34 | struct dma_attrs *attrs); | ||
| 35 | extern void x86_swiotlb_free_coherent(struct device *dev, size_t size, | ||
| 36 | void *vaddr, dma_addr_t dma_addr, | ||
| 37 | struct dma_attrs *attrs); | ||
| 38 | |||
| 32 | #endif /* _ASM_X86_SWIOTLB_H */ | 39 | #endif /* _ASM_X86_SWIOTLB_H */ |
diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index b574b295a2f9..8e3842fc8bea 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c | |||
| @@ -512,7 +512,7 @@ gart_free_coherent(struct device *dev, size_t size, void *vaddr, | |||
| 512 | dma_addr_t dma_addr, struct dma_attrs *attrs) | 512 | dma_addr_t dma_addr, struct dma_attrs *attrs) |
| 513 | { | 513 | { |
| 514 | gart_unmap_page(dev, dma_addr, size, DMA_BIDIRECTIONAL, NULL); | 514 | gart_unmap_page(dev, dma_addr, size, DMA_BIDIRECTIONAL, NULL); |
| 515 | free_pages((unsigned long)vaddr, get_order(size)); | 515 | dma_generic_free_coherent(dev, size, vaddr, dma_addr, attrs); |
| 516 | } | 516 | } |
| 517 | 517 | ||
| 518 | static int gart_mapping_error(struct device *dev, dma_addr_t dma_addr) | 518 | static int gart_mapping_error(struct device *dev, dma_addr_t dma_addr) |
diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c index 6c483ba98b9c..77dd0ad58be4 100644 --- a/arch/x86/kernel/pci-swiotlb.c +++ b/arch/x86/kernel/pci-swiotlb.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #include <asm/iommu_table.h> | 14 | #include <asm/iommu_table.h> |
| 15 | int swiotlb __read_mostly; | 15 | int swiotlb __read_mostly; |
| 16 | 16 | ||
| 17 | static void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size, | 17 | void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size, |
| 18 | dma_addr_t *dma_handle, gfp_t flags, | 18 | dma_addr_t *dma_handle, gfp_t flags, |
| 19 | struct dma_attrs *attrs) | 19 | struct dma_attrs *attrs) |
| 20 | { | 20 | { |
| @@ -28,11 +28,14 @@ static void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size, | |||
| 28 | return swiotlb_alloc_coherent(hwdev, size, dma_handle, flags); | 28 | return swiotlb_alloc_coherent(hwdev, size, dma_handle, flags); |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | static void x86_swiotlb_free_coherent(struct device *dev, size_t size, | 31 | void x86_swiotlb_free_coherent(struct device *dev, size_t size, |
| 32 | void *vaddr, dma_addr_t dma_addr, | 32 | void *vaddr, dma_addr_t dma_addr, |
| 33 | struct dma_attrs *attrs) | 33 | struct dma_attrs *attrs) |
| 34 | { | 34 | { |
| 35 | swiotlb_free_coherent(dev, size, vaddr, dma_addr); | 35 | if (is_swiotlb_buffer(dma_to_phys(dev, dma_addr))) |
| 36 | swiotlb_free_coherent(dev, size, vaddr, dma_addr); | ||
| 37 | else | ||
| 38 | dma_generic_free_coherent(dev, size, vaddr, dma_addr, attrs); | ||
| 36 | } | 39 | } |
| 37 | 40 | ||
| 38 | static struct dma_map_ops swiotlb_dma_ops = { | 41 | static struct dma_map_ops swiotlb_dma_ops = { |
diff --git a/arch/x86/pci/sta2x11-fixup.c b/arch/x86/pci/sta2x11-fixup.c index 9d8a509c9730..5ceda85b8687 100644 --- a/arch/x86/pci/sta2x11-fixup.c +++ b/arch/x86/pci/sta2x11-fixup.c | |||
| @@ -173,9 +173,7 @@ static void *sta2x11_swiotlb_alloc_coherent(struct device *dev, | |||
| 173 | { | 173 | { |
| 174 | void *vaddr; | 174 | void *vaddr; |
| 175 | 175 | ||
| 176 | vaddr = dma_generic_alloc_coherent(dev, size, dma_handle, flags, attrs); | 176 | vaddr = x86_swiotlb_alloc_coherent(dev, size, dma_handle, flags, attrs); |
| 177 | if (!vaddr) | ||
| 178 | vaddr = swiotlb_alloc_coherent(dev, size, dma_handle, flags); | ||
| 179 | *dma_handle = p2a(*dma_handle, to_pci_dev(dev)); | 177 | *dma_handle = p2a(*dma_handle, to_pci_dev(dev)); |
| 180 | return vaddr; | 178 | return vaddr; |
| 181 | } | 179 | } |
| @@ -183,7 +181,7 @@ static void *sta2x11_swiotlb_alloc_coherent(struct device *dev, | |||
| 183 | /* We have our own dma_ops: the same as swiotlb but from alloc (above) */ | 181 | /* We have our own dma_ops: the same as swiotlb but from alloc (above) */ |
| 184 | static struct dma_map_ops sta2x11_dma_ops = { | 182 | static struct dma_map_ops sta2x11_dma_ops = { |
| 185 | .alloc = sta2x11_swiotlb_alloc_coherent, | 183 | .alloc = sta2x11_swiotlb_alloc_coherent, |
| 186 | .free = swiotlb_free_coherent, | 184 | .free = x86_swiotlb_free_coherent, |
| 187 | .map_page = swiotlb_map_page, | 185 | .map_page = swiotlb_map_page, |
| 188 | .unmap_page = swiotlb_unmap_page, | 186 | .unmap_page = swiotlb_unmap_page, |
| 189 | .map_sg = swiotlb_map_sg_attrs, | 187 | .map_sg = swiotlb_map_sg_attrs, |
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index a5ffd32642fd..e7a018eaf3a2 100644 --- a/include/linux/swiotlb.h +++ b/include/linux/swiotlb.h | |||
| @@ -116,4 +116,6 @@ static inline void swiotlb_free(void) { } | |||
| 116 | #endif | 116 | #endif |
| 117 | 117 | ||
| 118 | extern void swiotlb_print_info(void); | 118 | extern void swiotlb_print_info(void); |
| 119 | extern int is_swiotlb_buffer(phys_addr_t paddr); | ||
| 120 | |||
| 119 | #endif /* __LINUX_SWIOTLB_H */ | 121 | #endif /* __LINUX_SWIOTLB_H */ |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index b604b831f4d1..649d097853a1 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
| @@ -374,7 +374,7 @@ void __init swiotlb_free(void) | |||
| 374 | io_tlb_nslabs = 0; | 374 | io_tlb_nslabs = 0; |
| 375 | } | 375 | } |
| 376 | 376 | ||
| 377 | static int is_swiotlb_buffer(phys_addr_t paddr) | 377 | int is_swiotlb_buffer(phys_addr_t paddr) |
| 378 | { | 378 | { |
| 379 | return paddr >= io_tlb_start && paddr < io_tlb_end; | 379 | return paddr >= io_tlb_start && paddr < io_tlb_end; |
| 380 | } | 380 | } |
