diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c index 41c605b0058f..bf1db5f2f428 100644 --- a/drivers/iommu/iova.c +++ b/drivers/iommu/iova.c @@ -177,6 +177,24 @@ iova_insert_rbtree(struct rb_root *root, struct iova *iova, rb_insert_color(&iova->node, root); } +#ifdef CONFIG_ARM64_DMA_IOMMU_ALIGNMENT +static unsigned long limit_align(struct iova_domain *iovad, + unsigned long shift) +{ + unsigned long max; + + max = CONFIG_ARM64_DMA_IOMMU_ALIGNMENT + PAGE_SHIFT + - iova_shift(iovad); + return min(shift, max); +} +#else +static unsigned long limit_align(struct iova_domain *iovad, + unsigned long shift) +{ + return shift; +} +#endif + static int __alloc_and_insert_iova_range(struct iova_domain *iovad, unsigned long size, unsigned long limit_pfn, struct iova *new, bool size_aligned) @@ -188,7 +206,7 @@ static int __alloc_and_insert_iova_range(struct iova_domain *iovad, unsigned long align_mask = ~0UL; if (size_aligned) - align_mask <<= fls_long(size - 1); + align_mask <<= limit_align(iovad, fls_long(size - 1)); /* Walk the tree backwards */ spin_lock_irqsave(&iovad->iova_rbtree_lock, flags);