Pass the max opt iova len to init the IOVA domain, if set.

Signed-off-by: John Garry <john.ga...@huawei.com>
---
 drivers/iommu/dma-iommu.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index 4fb82c554ede..574d7a901fd2 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -358,6 +358,8 @@ static int iommu_dma_init_domain(struct iommu_domain 
*domain, dma_addr_t base,
        struct iommu_dma_cookie *cookie = domain->iova_cookie;
        unsigned long order, base_pfn;
        struct iova_domain *iovad;
+       size_t max_opt_dma_size;
+       unsigned long iova_len;
 
        if (!cookie || cookie->type != IOMMU_DMA_IOVA_COOKIE)
                return -EINVAL;
@@ -391,7 +393,18 @@ static int iommu_dma_init_domain(struct iommu_domain 
*domain, dma_addr_t base,
                return 0;
        }
 
-       init_iova_domain(iovad, 1UL << order, base_pfn);
+       max_opt_dma_size = iommu_group_get_max_opt_dma_size(dev->iommu_group);
+
+       if (max_opt_dma_size) {
+               unsigned long shift = __ffs(1UL << order);
+
+               iova_len = max_opt_dma_size >> shift;
+               iova_len = roundup_pow_of_two(iova_len);
+       } else {
+               iova_len = 0;
+       }
+
+       init_iova_domain_ext(iovad, 1UL << order, base_pfn, iova_len);
 
        if (!cookie->fq_domain && (!dev || !dev_is_untrusted(dev)) &&
            domain->ops->flush_iotlb_all && !iommu_get_dma_strict(domain)) {
-- 
2.26.2

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to