Skip to content
Permalink
Browse files
iommu/dma: iommu_dma_map_sg: support granule > PAGE_SIZE
Co-developed-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Sven Peter <sven@svenpeter.dev>
  • Loading branch information
svenpeter42 committed Aug 13, 2021
1 parent 336670c commit 38661a4229b4dc63dc0cae6e1401c3465538f1a1
Showing 1 changed file with 10 additions and 8 deletions.
@@ -915,8 +915,8 @@ static int __finalise_sg(struct device *dev, struct scatterlist *sg, int nents,
unsigned int s_length = sg_dma_len(s);
unsigned int s_iova_len = s->length;

s->offset += s_iova_off;
s->length = s_length;
sg_set_page(s, phys_to_page(sg_phys(s) + s_iova_off), s_length,
s_iova_off & ~PAGE_MASK);
sg_dma_address(s) = DMA_MAPPING_ERROR;
sg_dma_len(s) = 0;

@@ -960,10 +960,11 @@ static void __invalidate_sg(struct scatterlist *sg, int nents)
int i;

for_each_sg(sg, s, nents, i) {
if (sg_dma_address(s) != DMA_MAPPING_ERROR)
s->offset += sg_dma_address(s);
if (sg_dma_len(s))
s->length = sg_dma_len(s);
sg_set_page(s,
phys_to_page(sg_phys(s) + sg_dma_address(s)),
sg_dma_len(s),
sg_dma_address(s) & ~PAGE_MASK);
sg_dma_address(s) = DMA_MAPPING_ERROR;
sg_dma_len(s) = 0;
}
@@ -1039,15 +1040,16 @@ static int iommu_dma_map_sg(struct device *dev, struct scatterlist *sg,
* stashing the unaligned parts in the as-yet-unused DMA fields.
*/
for_each_sg(sg, s, nents, i) {
size_t s_iova_off = iova_offset(iovad, s->offset);
phys_addr_t s_phys = sg_phys(s);
size_t s_iova_off = iova_offset(iovad, s_phys);
size_t s_length = s->length;
size_t pad_len = (mask - iova_len + 1) & mask;

sg_dma_address(s) = s_iova_off;
sg_dma_len(s) = s_length;
s->offset -= s_iova_off;
s_length = iova_align(iovad, s_length + s_iova_off);
s->length = s_length;
sg_set_page(s, phys_to_page(s_phys - s_iova_off),
s_length, s->offset & ~s_iova_off);

/*
* Due to the alignment of our single IOVA allocation, we can

0 comments on commit 38661a4

Please sign in to comment.