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 | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index b540b586fe37..eee9f5f87935 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -335,6 +335,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 = 0;
 
        if (!cookie || cookie->type != IOMMU_DMA_IOVA_COOKIE)
                return -EINVAL;
@@ -368,7 +370,16 @@ static int iommu_dma_init_domain(struct iommu_domain 
*domain, dma_addr_t base,
                return 0;
        }
 
-       init_iova_domain(iovad, 1UL << order, base_pfn, 0);
+
+       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);
+       }
+
+       init_iova_domain(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