Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 380d6878 authored by Becky Bruce's avatar Becky Bruce Committed by Ingo Molnar
Browse files

swiotlb: use swiotlb_sync_single instead of duplicating code



Right now both swiotlb_sync_single_range and swiotlb_sync_sg
were duplicating the code in swiotlb_sync_single.  Just call it
instead.  Also rearrange the sync_single code for readability.

Note that the swiotlb_sync_sg code was previously doing
a complicated comparison to determine if an addresses needed
to be unmapped where a simple is_swiotlb_buffer() call
would have sufficed.

Signed-off-by: default avatarBecky Bruce <beckyb@kernel.crashing.org>
Acked-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
Cc: jeremy@goop.org
Cc: ian.campbell@citrix.com
LKML-Reference: <1239199761-22886-7-git-send-email-galak@kernel.crashing.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 7fcebbd2
Loading
Loading
Loading
Loading
+12 −18
Original line number Diff line number Diff line
@@ -731,9 +731,15 @@ swiotlb_sync_single(struct device *hwdev, dma_addr_t dev_addr,
	char *dma_addr = swiotlb_bus_to_virt(dev_addr);

	BUG_ON(dir == DMA_NONE);
	if (is_swiotlb_buffer(dma_addr))

	if (is_swiotlb_buffer(dma_addr)) {
		sync_single(hwdev, dma_addr, size, dir, target);
	else if (dir == DMA_FROM_DEVICE)
		return;
	}

	if (dir != DMA_FROM_DEVICE)
		return;

	dma_mark_clean(dma_addr, size);
}

@@ -761,13 +767,7 @@ swiotlb_sync_single_range(struct device *hwdev, dma_addr_t dev_addr,
			  unsigned long offset, size_t size,
			  int dir, int target)
{
	char *dma_addr = swiotlb_bus_to_virt(dev_addr) + offset;

	BUG_ON(dir == DMA_NONE);
	if (is_swiotlb_buffer(dma_addr))
		sync_single(hwdev, dma_addr, size, dir, target);
	else if (dir == DMA_FROM_DEVICE)
		dma_mark_clean(dma_addr, size);
	swiotlb_sync_single(hwdev, dev_addr + offset, size, dir, target);
}

void
@@ -890,15 +890,9 @@ swiotlb_sync_sg(struct device *hwdev, struct scatterlist *sgl,
	struct scatterlist *sg;
	int i;

	BUG_ON(dir == DMA_NONE);

	for_each_sg(sgl, sg, nelems, i) {
		if (sg->dma_address != swiotlb_phys_to_bus(hwdev, sg_phys(sg)))
			sync_single(hwdev, swiotlb_bus_to_virt(sg->dma_address),
	for_each_sg(sgl, sg, nelems, i)
		swiotlb_sync_single(hwdev, sg->dma_address,
				    sg->dma_length, dir, target);
		else if (dir == DMA_FROM_DEVICE)
			dma_mark_clean(swiotlb_bus_to_virt(sg->dma_address), sg->dma_length);
	}
}

void