]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu: Refactor __iommu_domain_alloc()
authorJason Gunthorpe <jgg@ziepe.ca>
Mon, 28 Oct 2024 09:37:59 +0000 (09:37 +0000)
committerJoerg Roedel <jroedel@suse.de>
Tue, 29 Oct 2024 09:06:17 +0000 (10:06 +0100)
Following patch will introduce iommu_paging_domain_alloc_flags() API.
Hence move domain init code to separate function so that it can be
reused.

Also move iommu_get_dma_cookie() setup iommu_setup_default_domain() as
it is required in DMA API mode only.

Signed-off-by: Jason Gunthorpe <jgg@ziepe.ca>
[Split the patch and added description - Vasant]
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Yi Liu <yi.l.liu@intel.com>
Link: https://lore.kernel.org/r/20241028093810.5901-2-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c

index fe967b5fd09483c43d9d9a677009c00d232d42a4..cd91c0eabb344355eb9a422b9a74ac2dd70a2cc7 100644 (file)
@@ -1905,6 +1905,22 @@ void iommu_set_fault_handler(struct iommu_domain *domain,
 }
 EXPORT_SYMBOL_GPL(iommu_set_fault_handler);
 
+static void iommu_domain_init(struct iommu_domain *domain, unsigned int type,
+                             const struct iommu_ops *ops)
+{
+       domain->type = type;
+       domain->owner = ops;
+       if (!domain->ops)
+               domain->ops = ops->default_domain_ops;
+
+       /*
+        * If not already set, assume all sizes by default; the driver
+        * may override this later
+        */
+       if (!domain->pgsize_bitmap)
+               domain->pgsize_bitmap = ops->pgsize_bitmap;
+}
+
 static struct iommu_domain *__iommu_domain_alloc(const struct iommu_ops *ops,
                                                 struct device *dev,
                                                 unsigned int type)
@@ -1933,27 +1949,7 @@ static struct iommu_domain *__iommu_domain_alloc(const struct iommu_ops *ops,
        if (!domain)
                return ERR_PTR(-ENOMEM);
 
-       domain->type = type;
-       domain->owner = ops;
-       /*
-        * If not already set, assume all sizes by default; the driver
-        * may override this later
-        */
-       if (!domain->pgsize_bitmap)
-               domain->pgsize_bitmap = ops->pgsize_bitmap;
-
-       if (!domain->ops)
-               domain->ops = ops->default_domain_ops;
-
-       if (iommu_is_dma_domain(domain)) {
-               int rc;
-
-               rc = iommu_get_dma_cookie(domain);
-               if (rc) {
-                       iommu_domain_free(domain);
-                       return ERR_PTR(rc);
-               }
-       }
+       iommu_domain_init(domain, type, ops);
        return domain;
 }
 
@@ -2900,6 +2896,14 @@ static int iommu_setup_default_domain(struct iommu_group *group,
        if (group->default_domain == dom)
                return 0;
 
+       if (iommu_is_dma_domain(dom)) {
+               ret = iommu_get_dma_cookie(dom);
+               if (ret) {
+                       iommu_domain_free(dom);
+                       return ret;
+               }
+       }
+
        /*
         * IOMMU_RESV_DIRECT and IOMMU_RESV_DIRECT_RELAXABLE regions must be
         * mapped before their device is attached, in order to guarantee