aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/swiotlb.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/lib/swiotlb.c b/lib/swiotlb.c
index d7701dcf407f..16a548dc91ac 100644
--- a/lib/swiotlb.c
+++ b/lib/swiotlb.c
@@ -557,26 +557,27 @@ void swiotlb_tbl_unmap_single(struct device *hwdev, phys_addr_t tlb_addr,
557} 557}
558EXPORT_SYMBOL_GPL(swiotlb_tbl_unmap_single); 558EXPORT_SYMBOL_GPL(swiotlb_tbl_unmap_single);
559 559
560void 560void swiotlb_tbl_sync_single(struct device *hwdev, phys_addr_t tlb_addr,
561swiotlb_tbl_sync_single(struct device *hwdev, char *dma_addr, size_t size, 561 size_t size, enum dma_data_direction dir,
562 enum dma_data_direction dir, 562 enum dma_sync_target target)
563 enum dma_sync_target target)
564{ 563{
565 int index = (dma_addr - (char *)phys_to_virt(io_tlb_start)) >> IO_TLB_SHIFT; 564 int index = (tlb_addr - io_tlb_start) >> IO_TLB_SHIFT;
566 phys_addr_t phys = io_tlb_orig_addr[index]; 565 phys_addr_t orig_addr = io_tlb_orig_addr[index];
567 566
568 phys += ((unsigned long)dma_addr & ((1 << IO_TLB_SHIFT) - 1)); 567 orig_addr += (unsigned long)tlb_addr & ((1 << IO_TLB_SHIFT) - 1);
569 568
570 switch (target) { 569 switch (target) {
571 case SYNC_FOR_CPU: 570 case SYNC_FOR_CPU:
572 if (likely(dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL)) 571 if (likely(dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL))
573 swiotlb_bounce(phys, dma_addr, size, DMA_FROM_DEVICE); 572 swiotlb_bounce(orig_addr, phys_to_virt(tlb_addr),
573 size, DMA_FROM_DEVICE);
574 else 574 else
575 BUG_ON(dir != DMA_TO_DEVICE); 575 BUG_ON(dir != DMA_TO_DEVICE);
576 break; 576 break;
577 case SYNC_FOR_DEVICE: 577 case SYNC_FOR_DEVICE:
578 if (likely(dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL)) 578 if (likely(dir == DMA_TO_DEVICE || dir == DMA_BIDIRECTIONAL))
579 swiotlb_bounce(phys, dma_addr, size, DMA_TO_DEVICE); 579 swiotlb_bounce(orig_addr, phys_to_virt(tlb_addr),
580 size, DMA_TO_DEVICE);
580 else 581 else
581 BUG_ON(dir != DMA_FROM_DEVICE); 582 BUG_ON(dir != DMA_FROM_DEVICE);
582 break; 583 break;
@@ -785,8 +786,7 @@ swiotlb_sync_single(struct device *hwdev, dma_addr_t dev_addr,
785 BUG_ON(dir == DMA_NONE); 786 BUG_ON(dir == DMA_NONE);
786 787
787 if (is_swiotlb_buffer(paddr)) { 788 if (is_swiotlb_buffer(paddr)) {
788 swiotlb_tbl_sync_single(hwdev, phys_to_virt(paddr), size, dir, 789 swiotlb_tbl_sync_single(hwdev, paddr, size, dir, target);
789 target);
790 return; 790 return;
791 } 791 }
792 792