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

Commit 4803b44e authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

swiotlb: use swiotlb_map_page in swiotlb_map_sg_attrs



No need to duplicate the code - map_sg is equivalent to map_page
for each page in the scatterlist.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarRobin Murphy <robin.murphy@arm.com>
Reviewed-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 27744e00
Loading
Loading
Loading
Loading
+12 −22
Original line number Original line Diff line number Diff line
@@ -845,37 +845,27 @@ swiotlb_sync_single_for_device(struct device *hwdev, dma_addr_t dev_addr,
 * same here.
 * same here.
 */
 */
int
int
swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, int nelems,
swiotlb_map_sg_attrs(struct device *dev, struct scatterlist *sgl, int nelems,
		     enum dma_data_direction dir, unsigned long attrs)
		     enum dma_data_direction dir, unsigned long attrs)
{
{
	struct scatterlist *sg;
	struct scatterlist *sg;
	int i;
	int i;


	BUG_ON(dir == DMA_NONE);

	for_each_sg(sgl, sg, nelems, i) {
	for_each_sg(sgl, sg, nelems, i) {
		phys_addr_t paddr = sg_phys(sg);
		sg->dma_address = swiotlb_map_page(dev, sg_page(sg), sg->offset,
		dma_addr_t dev_addr = phys_to_dma(hwdev, paddr);

		if (swiotlb_force == SWIOTLB_FORCE ||
		    !dma_capable(hwdev, dev_addr, sg->length)) {
			phys_addr_t map = map_single(hwdev, sg_phys(sg),
				sg->length, dir, attrs);
				sg->length, dir, attrs);
			if (map == SWIOTLB_MAP_ERROR) {
		if (sg->dma_address == DIRECT_MAPPING_ERROR)
				/* Don't panic here, we expect map_sg users
			goto out_error;
				   to do proper error handling. */
				attrs |= DMA_ATTR_SKIP_CPU_SYNC;
				swiotlb_unmap_sg_attrs(hwdev, sgl, i, dir,
						       attrs);
				sg_dma_len(sgl) = 0;
				return 0;
			}
			sg->dma_address = __phys_to_dma(hwdev, map);
		} else
			sg->dma_address = dev_addr;
		sg_dma_len(sg) = sg->length;
		sg_dma_len(sg) = sg->length;
	}
	}

	return nelems;
	return nelems;

out_error:
	swiotlb_unmap_sg_attrs(dev, sgl, i, dir,
			attrs | DMA_ATTR_SKIP_CPU_SYNC);
	sg_dma_len(sgl) = 0;
	return 0;
}
}


/*
/*