]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu: Create __iommu_alloc_identity_domain()
authorJason Gunthorpe <jgg@nvidia.com>
Mon, 28 Oct 2024 09:38:10 +0000 (09:38 +0000)
committerJoerg Roedel <jroedel@suse.de>
Tue, 29 Oct 2024 09:37:03 +0000 (10:37 +0100)
Consolidate all the code to create an IDENTITY domain into one
function. This removes the legacy __iommu_domain_alloc() path from all
paths, and preps it for final removal.

BLOCKED/IDENTITY/PAGING are now always allocated via a type specific
function.

[Joerg: Actually remove __iommu_domain_alloc()]

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20241028093810.5901-13-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c

index fc6aaded94bf5c18182246d7dc17a017e05c8779..0d08a32560857edfd1803eb439a2813214c3aa5d 100644 (file)
@@ -94,8 +94,6 @@ static const char * const iommu_group_resv_type_string[] = {
 static int iommu_bus_notifier(struct notifier_block *nb,
                              unsigned long action, void *data);
 static void iommu_release_device(struct device *dev);
-static struct iommu_domain *
-__iommu_group_domain_alloc(struct iommu_group *group, unsigned int type);
 static int __iommu_attach_device(struct iommu_domain *domain,
                                 struct device *dev);
 static int __iommu_attach_group(struct iommu_domain *domain,
@@ -137,6 +135,8 @@ static struct group_device *iommu_group_alloc_device(struct iommu_group *group,
                                                     struct device *dev);
 static void __iommu_group_free_device(struct iommu_group *group,
                                      struct group_device *grp_dev);
+static void iommu_domain_init(struct iommu_domain *domain, unsigned int type,
+                             const struct iommu_ops *ops);
 
 #define IOMMU_GROUP_ATTR(_name, _mode, _show, _store)          \
 struct iommu_group_attribute iommu_group_attr_##_name =                \
@@ -1586,6 +1586,28 @@ struct iommu_group *fsl_mc_device_group(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(fsl_mc_device_group);
 
+static struct iommu_domain *__iommu_alloc_identity_domain(struct device *dev)
+{
+       const struct iommu_ops *ops = dev_iommu_ops(dev);
+       struct iommu_domain *domain;
+
+       if (ops->identity_domain)
+               return ops->identity_domain;
+
+       /* Older drivers create the identity domain via ops->domain_alloc() */
+       if (!ops->domain_alloc)
+               return ERR_PTR(-EOPNOTSUPP);
+
+       domain = ops->domain_alloc(IOMMU_DOMAIN_IDENTITY);
+       if (IS_ERR(domain))
+               return domain;
+       if (!domain)
+               return ERR_PTR(-ENOMEM);
+
+       iommu_domain_init(domain, IOMMU_DOMAIN_IDENTITY, ops);
+       return domain;
+}
+
 static struct iommu_domain *
 __iommu_group_alloc_default_domain(struct iommu_group *group, int req_type)
 {
@@ -1613,7 +1635,10 @@ __iommu_group_alloc_default_domain(struct iommu_group *group, int req_type)
                return dom;
        }
 
-       return __iommu_group_domain_alloc(group, req_type);
+       if (req_type == IOMMU_DOMAIN_IDENTITY)
+               return __iommu_alloc_identity_domain(dev);
+
+       return ERR_PTR(-EINVAL);
 }
 
 /*
@@ -1947,44 +1972,6 @@ static void iommu_domain_init(struct iommu_domain *domain, unsigned int type,
                domain->pgsize_bitmap = ops->pgsize_bitmap;
 }
 
-static struct iommu_domain *__iommu_domain_alloc(const struct iommu_ops *ops,
-                                                struct device *dev,
-                                                unsigned int type)
-{
-       struct iommu_domain *domain;
-       unsigned int alloc_type = type & IOMMU_DOMAIN_ALLOC_FLAGS;
-
-       if (alloc_type == IOMMU_DOMAIN_IDENTITY && ops->identity_domain)
-               return ops->identity_domain;
-       else if (type & __IOMMU_DOMAIN_PAGING && ops->domain_alloc_paging)
-               domain = ops->domain_alloc_paging(dev);
-       else if (ops->domain_alloc)
-               domain = ops->domain_alloc(alloc_type);
-       else
-               return ERR_PTR(-EOPNOTSUPP);
-
-       /*
-        * Many domain_alloc ops now return ERR_PTR, make things easier for the
-        * driver by accepting ERR_PTR from all domain_alloc ops instead of
-        * having two rules.
-        */
-       if (IS_ERR(domain))
-               return domain;
-       if (!domain)
-               return ERR_PTR(-ENOMEM);
-
-       iommu_domain_init(domain, type, ops);
-       return domain;
-}
-
-static struct iommu_domain *
-__iommu_group_domain_alloc(struct iommu_group *group, unsigned int type)
-{
-       struct device *dev = iommu_group_first_dev(group);
-
-       return __iommu_domain_alloc(dev_iommu_ops(dev), dev, type);
-}
-
 static struct iommu_domain *
 __iommu_paging_domain_alloc_flags(struct device *dev, unsigned int type,
                                  unsigned int flags)