diff options
Diffstat (limited to 'lib/swiotlb.c')
-rw-r--r-- | lib/swiotlb.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 875b0c16250c..9719a14649e7 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
@@ -594,9 +594,9 @@ swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr, size_t size, | |||
594 | * address back to the card, you must first perform a | 594 | * address back to the card, you must first perform a |
595 | * swiotlb_dma_sync_for_device, and then the device again owns the buffer | 595 | * swiotlb_dma_sync_for_device, and then the device again owns the buffer |
596 | */ | 596 | */ |
597 | void | 597 | static inline void |
598 | swiotlb_sync_single_for_cpu(struct device *hwdev, dma_addr_t dev_addr, | 598 | swiotlb_sync_single(struct device *hwdev, dma_addr_t dev_addr, |
599 | size_t size, int dir) | 599 | size_t size, int dir) |
600 | { | 600 | { |
601 | char *dma_addr = phys_to_virt(dev_addr); | 601 | char *dma_addr = phys_to_virt(dev_addr); |
602 | 602 | ||
@@ -609,17 +609,17 @@ swiotlb_sync_single_for_cpu(struct device *hwdev, dma_addr_t dev_addr, | |||
609 | } | 609 | } |
610 | 610 | ||
611 | void | 611 | void |
612 | swiotlb_sync_single_for_cpu(struct device *hwdev, dma_addr_t dev_addr, | ||
613 | size_t size, int dir) | ||
614 | { | ||
615 | swiotlb_sync_single(hwdev, dev_addr, size, dir); | ||
616 | } | ||
617 | |||
618 | void | ||
612 | swiotlb_sync_single_for_device(struct device *hwdev, dma_addr_t dev_addr, | 619 | swiotlb_sync_single_for_device(struct device *hwdev, dma_addr_t dev_addr, |
613 | size_t size, int dir) | 620 | size_t size, int dir) |
614 | { | 621 | { |
615 | char *dma_addr = phys_to_virt(dev_addr); | 622 | swiotlb_sync_single(hwdev, dev_addr, size, dir); |
616 | |||
617 | if (dir == DMA_NONE) | ||
618 | BUG(); | ||
619 | if (dma_addr >= io_tlb_start && dma_addr < io_tlb_end) | ||
620 | sync_single(hwdev, dma_addr, size, dir); | ||
621 | else if (dir == DMA_FROM_DEVICE) | ||
622 | mark_clean(dma_addr, size); | ||
623 | } | 623 | } |
624 | 624 | ||
625 | /* | 625 | /* |
@@ -696,9 +696,9 @@ swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nelems, | |||
696 | * The same as swiotlb_sync_single_* but for a scatter-gather list, same rules | 696 | * The same as swiotlb_sync_single_* but for a scatter-gather list, same rules |
697 | * and usage. | 697 | * and usage. |
698 | */ | 698 | */ |
699 | void | 699 | static inline void |
700 | swiotlb_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, | 700 | swiotlb_sync_sg(struct device *hwdev, struct scatterlist *sg, |
701 | int nelems, int dir) | 701 | int nelems, int dir) |
702 | { | 702 | { |
703 | int i; | 703 | int i; |
704 | 704 | ||
@@ -712,18 +712,17 @@ swiotlb_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, | |||
712 | } | 712 | } |
713 | 713 | ||
714 | void | 714 | void |
715 | swiotlb_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, | ||
716 | int nelems, int dir) | ||
717 | { | ||
718 | swiotlb_sync_sg(hwdev, sg, nelems, dir); | ||
719 | } | ||
720 | |||
721 | void | ||
715 | swiotlb_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, | 722 | swiotlb_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, |
716 | int nelems, int dir) | 723 | int nelems, int dir) |
717 | { | 724 | { |
718 | int i; | 725 | swiotlb_sync_sg(hwdev, sg, nelems, dir); |
719 | |||
720 | if (dir == DMA_NONE) | ||
721 | BUG(); | ||
722 | |||
723 | for (i = 0; i < nelems; i++, sg++) | ||
724 | if (sg->dma_address != SG_ENT_PHYS_ADDRESS(sg)) | ||
725 | sync_single(hwdev, (void *) sg->dma_address, | ||
726 | sg->dma_length, dir); | ||
727 | } | 726 | } |
728 | 727 | ||
729 | int | 728 | int |