]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
iommu: Streamline registration interface
authorRobin Murphy <robin.murphy@arm.com>
Thu, 1 Apr 2021 13:56:26 +0000 (14:56 +0100)
committerJoerg Roedel <jroedel@suse.de>
Fri, 16 Apr 2021 15:20:45 +0000 (17:20 +0200)
Rather than have separate opaque setter functions that are easy to
overlook and lead to repetitive boilerplate in drivers, let's pass the
relevant initialisation parameters directly to iommu_device_register().

Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/ab001b87c533b6f4db71eb90db6f888953986c36.1617285386.git.robin.murphy@arm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
22 files changed:
drivers/iommu/amd/init.c
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
drivers/iommu/arm/arm-smmu/arm-smmu.c
drivers/iommu/arm/arm-smmu/qcom_iommu.c
drivers/iommu/exynos-iommu.c
drivers/iommu/fsl_pamu_domain.c
drivers/iommu/intel/dmar.c
drivers/iommu/intel/iommu.c
drivers/iommu/iommu.c
drivers/iommu/ipmmu-vmsa.c
drivers/iommu/msm_iommu.c
drivers/iommu/mtk_iommu.c
drivers/iommu/mtk_iommu_v1.c
drivers/iommu/omap-iommu.c
drivers/iommu/rockchip-iommu.c
drivers/iommu/s390-iommu.c
drivers/iommu/sprd-iommu.c
drivers/iommu/sun50i-iommu.c
drivers/iommu/tegra-gart.c
drivers/iommu/tegra-smmu.c
drivers/iommu/virtio-iommu.c
include/linux/iommu.h

index 54f6e99528f3692ccd76082f5495cb0c256ece8f..d006724f4dc212267ff1bc3eec381e94fa806891 100644 (file)
@@ -1888,8 +1888,7 @@ static int __init iommu_init_pci(struct amd_iommu *iommu)
 
        iommu_device_sysfs_add(&iommu->iommu, &iommu->dev->dev,
                               amd_iommu_groups, "ivhd%d", iommu->index);
-       iommu_device_set_ops(&iommu->iommu, &amd_iommu_ops);
-       iommu_device_register(&iommu->iommu);
+       iommu_device_register(&iommu->iommu, &amd_iommu_ops, NULL);
 
        return pci_enable_device(iommu->dev);
 }
index bee7ce246dd2200165ddc9ccdf26ad0c17428da9..54b2f27b81d43963cfd61efa50bfde17add278a3 100644 (file)
@@ -3666,10 +3666,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       iommu_device_set_ops(&smmu->iommu, &arm_smmu_ops);
-       iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
-
-       ret = iommu_device_register(&smmu->iommu);
+       ret = iommu_device_register(&smmu->iommu, &arm_smmu_ops, dev);
        if (ret) {
                dev_err(dev, "Failed to register iommu\n");
                return ret;
index 837a2f1816b7ba749aede04c5811b5ffae9159dd..6f72c4d208cad84c9389498af3312314b53f7c5c 100644 (file)
@@ -2161,10 +2161,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
                return err;
        }
 
-       iommu_device_set_ops(&smmu->iommu, &arm_smmu_ops);
-       iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
-
-       err = iommu_device_register(&smmu->iommu);
+       err = iommu_device_register(&smmu->iommu, &arm_smmu_ops, dev);
        if (err) {
                dev_err(dev, "Failed to register iommu\n");
                return err;
index 7f280c8d5c53d91eada408e45a4e969ed5ea755e..4294abe389b22fccdecdfdc92095158748421aff 100644 (file)
@@ -847,10 +847,7 @@ static int qcom_iommu_device_probe(struct platform_device *pdev)
                return ret;
        }
 
-       iommu_device_set_ops(&qcom_iommu->iommu, &qcom_iommu_ops);
-       iommu_device_set_fwnode(&qcom_iommu->iommu, dev->fwnode);
-
-       ret = iommu_device_register(&qcom_iommu->iommu);
+       ret = iommu_device_register(&qcom_iommu->iommu, &qcom_iommu_ops, dev);
        if (ret) {
                dev_err(dev, "Failed to register iommu\n");
                return ret;
index 8fa9a591fb967a197ca0924c200ea5bb2abae8bd..7623d8c371f5c7138f74c11057750393620731f8 100644 (file)
@@ -630,10 +630,7 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       iommu_device_set_ops(&data->iommu, &exynos_iommu_ops);
-       iommu_device_set_fwnode(&data->iommu, &dev->of_node->fwnode);
-
-       ret = iommu_device_register(&data->iommu);
+       ret = iommu_device_register(&data->iommu, &exynos_iommu_ops, dev);
        if (ret)
                return ret;
 
index 0ac781186dbd4d15926f5588d8ddc7ed0f8388e9..a47f47307109ff94a4e65544488a559c3dad1654 100644 (file)
@@ -474,9 +474,7 @@ int __init pamu_domain_init(void)
        if (ret)
                return ret;
 
-       iommu_device_set_ops(&pamu_iommu, &fsl_pamu_ops);
-
-       ret = iommu_device_register(&pamu_iommu);
+       ret = iommu_device_register(&pamu_iommu, &fsl_pamu_ops, NULL);
        if (ret) {
                iommu_device_sysfs_remove(&pamu_iommu);
                pr_err("Can't register iommu device\n");
index 6971397805f3c848ee8b9e4e146321768817150a..1757ac1e1623e9aef3583d7a8ae819fd2baa968c 100644 (file)
@@ -1140,9 +1140,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
                if (err)
                        goto err_unmap;
 
-               iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops);
-
-               err = iommu_device_register(&iommu->iommu);
+               err = iommu_device_register(&iommu->iommu, &intel_iommu_ops, NULL);
                if (err)
                        goto err_unmap;
        }
index 0e04d450c38abc87fd901ffef558f1af06cda6a2..708f430af1c4403662245c08530dbab79c83f078 100644 (file)
@@ -4396,8 +4396,7 @@ int __init intel_iommu_init(void)
                iommu_device_sysfs_add(&iommu->iommu, NULL,
                                       intel_iommu_groups,
                                       "%s", iommu->name);
-               iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops);
-               iommu_device_register(&iommu->iommu);
+               iommu_device_register(&iommu->iommu, &intel_iommu_ops, NULL);
        }
        up_read(&dmar_global_lock);
 
index c4ad9c6448024e5d34f24d55c1bee8040618f98b..808ab70d5df50f7839dafc489cfcc4519d05ec06 100644 (file)
@@ -142,8 +142,25 @@ static int __init iommu_subsys_init(void)
 }
 subsys_initcall(iommu_subsys_init);
 
-int iommu_device_register(struct iommu_device *iommu)
+/**
+ * iommu_device_register() - Register an IOMMU hardware instance
+ * @iommu: IOMMU handle for the instance
+ * @ops:   IOMMU ops to associate with the instance
+ * @hwdev: (optional) actual instance device, used for fwnode lookup
+ *
+ * Return: 0 on success, or an error.
+ */
+int iommu_device_register(struct iommu_device *iommu,
+                         const struct iommu_ops *ops, struct device *hwdev)
 {
+       /* We need to be able to take module references appropriately */
+       if (WARN_ON(is_module_address((unsigned long)ops) && !ops->owner))
+               return -EINVAL;
+
+       iommu->ops = ops;
+       if (hwdev)
+               iommu->fwnode = hwdev->fwnode;
+
        spin_lock(&iommu_device_lock);
        list_add_tail(&iommu->list, &iommu_device_list);
        spin_unlock(&iommu_device_lock);
index eaaec0a55cc6e0534071190ccc7438b947144520..aaa6a4d59057a7ac9f0999719d37a3777610236e 100644 (file)
@@ -1076,11 +1076,7 @@ static int ipmmu_probe(struct platform_device *pdev)
                if (ret)
                        return ret;
 
-               iommu_device_set_ops(&mmu->iommu, &ipmmu_ops);
-               iommu_device_set_fwnode(&mmu->iommu,
-                                       &pdev->dev.of_node->fwnode);
-
-               ret = iommu_device_register(&mmu->iommu);
+               ret = iommu_device_register(&mmu->iommu, &ipmmu_ops, &pdev->dev);
                if (ret)
                        return ret;
 
index f0ba6a09b434bde2c71b73bc8b53759914b72685..7880f307cb2da8bfee65173ff7d62cc1b8c26fe5 100644 (file)
@@ -792,10 +792,7 @@ static int msm_iommu_probe(struct platform_device *pdev)
                goto fail;
        }
 
-       iommu_device_set_ops(&iommu->iommu, &msm_iommu_ops);
-       iommu_device_set_fwnode(&iommu->iommu, &pdev->dev.of_node->fwnode);
-
-       ret = iommu_device_register(&iommu->iommu);
+       ret = iommu_device_register(&iommu->iommu, &msm_iommu_ops, &pdev->dev);
        if (ret) {
                pr_err("Could not register msm-smmu at %pa\n", &ioaddr);
                goto fail;
index cdda3a85fc0827828f64331c0a7d1816017dbf77..e06b8a0e2b56bddd73a5e70d0f53f2c17e9fd483 100644 (file)
@@ -892,10 +892,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
        if (ret)
                goto out_link_remove;
 
-       iommu_device_set_ops(&data->iommu, &mtk_iommu_ops);
-       iommu_device_set_fwnode(&data->iommu, &pdev->dev.of_node->fwnode);
-
-       ret = iommu_device_register(&data->iommu);
+       ret = iommu_device_register(&data->iommu, &mtk_iommu_ops, dev);
        if (ret)
                goto out_sysfs_remove;
 
index 8ba9a2ec5509a4f7080329dc579e43af6ec8eb85..5915d7b3821110c6896668461450b5ca459c15cc 100644 (file)
@@ -616,9 +616,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       iommu_device_set_ops(&data->iommu, &mtk_iommu_ops);
-
-       ret = iommu_device_register(&data->iommu);
+       ret = iommu_device_register(&data->iommu, &mtk_iommu_ops, dev);
        if (ret)
                goto out_sysfs_remove;
 
index 71f29c0927fc710aa5ff65318fbc3b2702d2700e..26e517eb0dd3a8073e2c9bd1f4c74623f09360cf 100644 (file)
@@ -1235,10 +1235,7 @@ static int omap_iommu_probe(struct platform_device *pdev)
                if (err)
                        goto out_group;
 
-               iommu_device_set_ops(&obj->iommu, &omap_iommu_ops);
-               iommu_device_set_fwnode(&obj->iommu, &of->fwnode);
-
-               err = iommu_device_register(&obj->iommu);
+               err = iommu_device_register(&obj->iommu, &omap_iommu_ops, &pdev->dev);
                if (err)
                        goto out_sysfs;
        }
index e5d86b7177dec8aa42833fb9cdb587623886b76f..7a2932772fdf5e09436efca861f54aee236d132f 100644 (file)
@@ -1196,10 +1196,7 @@ static int rk_iommu_probe(struct platform_device *pdev)
        if (err)
                goto err_put_group;
 
-       iommu_device_set_ops(&iommu->iommu, &rk_iommu_ops);
-       iommu_device_set_fwnode(&iommu->iommu, &dev->of_node->fwnode);
-
-       err = iommu_device_register(&iommu->iommu);
+       err = iommu_device_register(&iommu->iommu, &rk_iommu_ops, dev);
        if (err)
                goto err_remove_sysfs;
 
index 8895dbb705eb7223ec4890f376da3c2dae2d79ff..6019e58ce4fbe846428e331ae853dfc6541c8b24 100644 (file)
@@ -333,9 +333,7 @@ int zpci_init_iommu(struct zpci_dev *zdev)
        if (rc)
                goto out_err;
 
-       iommu_device_set_ops(&zdev->iommu_dev, &s390_iommu_ops);
-
-       rc = iommu_device_register(&zdev->iommu_dev);
+       rc = iommu_device_register(&zdev->iommu_dev, &s390_iommu_ops, NULL);
        if (rc)
                goto out_sysfs;
 
index 89272f9fd8f3eb67b8613ca04bccd5ecc8e7a8f7..73dfd994631252b7a546cd04357fc426112c75a2 100644 (file)
@@ -508,10 +508,7 @@ static int sprd_iommu_probe(struct platform_device *pdev)
        if (ret)
                goto put_group;
 
-       iommu_device_set_ops(&sdev->iommu, &sprd_iommu_ops);
-       iommu_device_set_fwnode(&sdev->iommu, &dev->of_node->fwnode);
-
-       ret = iommu_device_register(&sdev->iommu);
+       ret = iommu_device_register(&sdev->iommu, &sprd_iommu_ops, dev);
        if (ret)
                goto remove_sysfs;
 
index ea6db134191652472d58fcfab92b3e40c1c7c717..181bb1c3437c0e4a09584da493dc084ed87e1335 100644 (file)
@@ -968,10 +968,7 @@ static int sun50i_iommu_probe(struct platform_device *pdev)
        if (ret)
                goto err_free_group;
 
-       iommu_device_set_ops(&iommu->iommu, &sun50i_iommu_ops);
-       iommu_device_set_fwnode(&iommu->iommu, &pdev->dev.of_node->fwnode);
-
-       ret = iommu_device_register(&iommu->iommu);
+       ret = iommu_device_register(&iommu->iommu, &sun50i_iommu_ops, &pdev->dev);
        if (ret)
                goto err_remove_sysfs;
 
index 6f130e51f0729c887e9430296ad7be2e242c6607..6a358f92c7e5ddf9f18e52117afe43e5a2733e87 100644 (file)
@@ -353,10 +353,7 @@ struct gart_device *tegra_gart_probe(struct device *dev, struct tegra_mc *mc)
        if (err)
                goto free_gart;
 
-       iommu_device_set_ops(&gart->iommu, &gart_iommu_ops);
-       iommu_device_set_fwnode(&gart->iommu, dev->fwnode);
-
-       err = iommu_device_register(&gart->iommu);
+       err = iommu_device_register(&gart->iommu, &gart_iommu_ops, dev);
        if (err)
                goto remove_sysfs;
 
index 602aab98c0794812f94c30c6b7b54f29cddf9ec0..1e98dc63ad13930fbde9ff35196984badcae96d4 100644 (file)
@@ -1145,10 +1145,7 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
        if (err)
                return ERR_PTR(err);
 
-       iommu_device_set_ops(&smmu->iommu, &tegra_smmu_ops);
-       iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
-
-       err = iommu_device_register(&smmu->iommu);
+       err = iommu_device_register(&smmu->iommu, &tegra_smmu_ops, dev);
        if (err)
                goto remove_sysfs;
 
index 594ed827e9442be7ccceedfad1e487f5dc7060c5..7c02481a81b4e9ebd6ed3cd1c3e271b22e0d35d2 100644 (file)
@@ -1066,10 +1066,7 @@ static int viommu_probe(struct virtio_device *vdev)
        if (ret)
                goto err_free_vqs;
 
-       iommu_device_set_ops(&viommu->iommu, &viommu_ops);
-       iommu_device_set_fwnode(&viommu->iommu, parent_dev->fwnode);
-
-       iommu_device_register(&viommu->iommu);
+       iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev);
 
 #ifdef CONFIG_PCI
        if (pci_bus_type.iommu_ops != &viommu_ops) {
index ce904cf4e774daddfbd3da25c4f4720e339e5631..32d448050bf76eaf072cf705b9413a8db9cf344b 100644 (file)
@@ -350,7 +350,9 @@ struct dev_iommu {
        void                            *priv;
 };
 
-int  iommu_device_register(struct iommu_device *iommu);
+int iommu_device_register(struct iommu_device *iommu,
+                         const struct iommu_ops *ops,
+                         struct device *hwdev);
 void iommu_device_unregister(struct iommu_device *iommu);
 int  iommu_device_sysfs_add(struct iommu_device *iommu,
                            struct device *parent,
@@ -361,18 +363,6 @@ int  iommu_device_link(struct iommu_device   *iommu, struct device *link);
 void iommu_device_unlink(struct iommu_device *iommu, struct device *link);
 int iommu_deferred_attach(struct device *dev, struct iommu_domain *domain);
 
-static inline void iommu_device_set_ops(struct iommu_device *iommu,
-                                         const struct iommu_ops *ops)
-{
-       iommu->ops = ops;
-}
-
-static inline void iommu_device_set_fwnode(struct iommu_device *iommu,
-                                          struct fwnode_handle *fwnode)
-{
-       iommu->fwnode = fwnode;
-}
-
 static inline struct iommu_device *dev_to_iommu_device(struct device *dev)
 {
        return (struct iommu_device *)dev_get_drvdata(dev);
@@ -858,21 +848,13 @@ static inline int iommu_set_pgtable_quirks(struct iommu_domain *domain,
        return 0;
 }
 
-static inline int  iommu_device_register(struct iommu_device *iommu)
+static inline int iommu_device_register(struct iommu_device *iommu,
+                                       const struct iommu_ops *ops,
+                                       struct device *hwdev)
 {
        return -ENODEV;
 }
 
-static inline void iommu_device_set_ops(struct iommu_device *iommu,
-                                       const struct iommu_ops *ops)
-{
-}
-
-static inline void iommu_device_set_fwnode(struct iommu_device *iommu,
-                                          struct fwnode_handle *fwnode)
-{
-}
-
 static inline struct iommu_device *dev_to_iommu_device(struct device *dev)
 {
        return NULL;