]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu: Clean up open-coded ownership checks
authorRobin Murphy <robin.murphy@arm.com>
Tue, 21 Nov 2023 18:04:03 +0000 (18:04 +0000)
committerJoerg Roedel <jroedel@suse.de>
Mon, 27 Nov 2023 10:03:16 +0000 (11:03 +0100)
Some drivers already implement their own defence against the possibility
of being given someone else's device. Since this is now taken care of by
the core code (and via a slightly different path from the original
fwspec-based idea), let's clean them up.

Acked-by: Will Deacon <will@kernel.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/58a9879ce3f03562bb061e6714fe6efb554c3907.1700589539.git.robin.murphy@arm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
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/mtk_iommu.c
drivers/iommu/mtk_iommu_v1.c
drivers/iommu/sprd-iommu.c
drivers/iommu/virtio-iommu.c

index 7445454c2af244f03b9274db12e3e4dd325e31ab..fc4317c25b6d535155a81a990b608bbfd5dbe57a 100644 (file)
@@ -2649,9 +2649,6 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)
        struct arm_smmu_master *master;
        struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
 
-       if (!fwspec || fwspec->ops != &arm_smmu_ops)
-               return ERR_PTR(-ENODEV);
-
        if (WARN_ON_ONCE(dev_iommu_priv_get(dev)))
                return ERR_PTR(-EBUSY);
 
index 4b83a3adacd6e957e1f224af95d6e42446503ff5..4d09c00478927465cac6e748b74d3243add1f8f8 100644 (file)
@@ -1116,11 +1116,6 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
        struct arm_smmu_device *smmu;
        int ret;
 
-       if (!fwspec || fwspec->ops != &arm_smmu_ops) {
-               dev_err(dev, "cannot attach to SMMU, is it on the same bus?\n");
-               return -ENXIO;
-       }
-
        /*
         * FIXME: The arch/arm DMA API code tries to attach devices to its own
         * domains between of_xlate() and probe_device() - we have no way to cope
@@ -1357,10 +1352,8 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev)
                fwspec = dev_iommu_fwspec_get(dev);
                if (ret)
                        goto out_free;
-       } else if (fwspec && fwspec->ops == &arm_smmu_ops) {
-               smmu = arm_smmu_get_by_fwnode(fwspec->iommu_fwnode);
        } else {
-               return ERR_PTR(-ENODEV);
+               smmu = arm_smmu_get_by_fwnode(fwspec->iommu_fwnode);
        }
 
        ret = -EINVAL;
index 97b2122032b2371915047aa03d3118005fc49496..33f3c870086cea64b3fbcf270d66a02336136917 100644 (file)
@@ -79,16 +79,6 @@ static struct qcom_iommu_domain *to_qcom_iommu_domain(struct iommu_domain *dom)
 
 static const struct iommu_ops qcom_iommu_ops;
 
-static struct qcom_iommu_dev * to_iommu(struct device *dev)
-{
-       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-
-       if (!fwspec || fwspec->ops != &qcom_iommu_ops)
-               return NULL;
-
-       return dev_iommu_priv_get(dev);
-}
-
 static struct qcom_iommu_ctx * to_ctx(struct qcom_iommu_domain *d, unsigned asid)
 {
        struct qcom_iommu_dev *qcom_iommu = d->iommu;
@@ -372,7 +362,7 @@ static void qcom_iommu_domain_free(struct iommu_domain *domain)
 
 static int qcom_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
 {
-       struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
+       struct qcom_iommu_dev *qcom_iommu = dev_iommu_priv_get(dev);
        struct qcom_iommu_domain *qcom_domain = to_qcom_iommu_domain(domain);
        int ret;
 
@@ -404,7 +394,7 @@ static int qcom_iommu_identity_attach(struct iommu_domain *identity_domain,
        struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
        struct qcom_iommu_domain *qcom_domain;
        struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-       struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
+       struct qcom_iommu_dev *qcom_iommu = dev_iommu_priv_get(dev);
        unsigned int i;
 
        if (domain == identity_domain || !domain)
@@ -535,7 +525,7 @@ static bool qcom_iommu_capable(struct device *dev, enum iommu_cap cap)
 
 static struct iommu_device *qcom_iommu_probe_device(struct device *dev)
 {
-       struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
+       struct qcom_iommu_dev *qcom_iommu = dev_iommu_priv_get(dev);
        struct device_link *link;
 
        if (!qcom_iommu)
index 75279500a4a824f4246bd3fec4fdfb22b1c2cccc..7abe9e85a570632a74080ba275b44e14882d6cec 100644 (file)
@@ -863,16 +863,11 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain,
 static struct iommu_device *mtk_iommu_probe_device(struct device *dev)
 {
        struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-       struct mtk_iommu_data *data;
+       struct mtk_iommu_data *data = dev_iommu_priv_get(dev);
        struct device_link *link;
        struct device *larbdev;
        unsigned int larbid, larbidx, i;
 
-       if (!fwspec || fwspec->ops != &mtk_iommu_ops)
-               return ERR_PTR(-ENODEV); /* Not a iommu client device */
-
-       data = dev_iommu_priv_get(dev);
-
        if (!MTK_IOMMU_IS_TYPE(data->plat_data, MTK_IOMMU_TYPE_MM))
                return &data->iommu;
 
index 67e044c1a7d93bc7e8c398445fd867008d349154..25b41222abaec109b4c87a8feba380401ad61a69 100644 (file)
@@ -481,9 +481,6 @@ static struct iommu_device *mtk_iommu_v1_probe_device(struct device *dev)
                idx++;
        }
 
-       if (!fwspec || fwspec->ops != &mtk_iommu_v1_ops)
-               return ERR_PTR(-ENODEV); /* Not a iommu client device */
-
        data = dev_iommu_priv_get(dev);
 
        /* Link the consumer device with the smi-larb device(supplier) */
index 2eb9fb46703b3ae3d836b6c757a511f37d5998e5..537359f109979b703707ff52d398c61866adb73c 100644 (file)
@@ -385,13 +385,7 @@ static phys_addr_t sprd_iommu_iova_to_phys(struct iommu_domain *domain,
 
 static struct iommu_device *sprd_iommu_probe_device(struct device *dev)
 {
-       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-       struct sprd_iommu_device *sdev;
-
-       if (!fwspec || fwspec->ops != &sprd_iommu_ops)
-               return ERR_PTR(-ENODEV);
-
-       sdev = dev_iommu_priv_get(dev);
+       struct sprd_iommu_device *sdev = dev_iommu_priv_get(dev);
 
        return &sdev->iommu;
 }
index 379ebe03efb6d45b42afd8a63b4fcb830bb37903..9bcffdde6175d3fd2117cea334eb14abe3a8fa8e 100644 (file)
@@ -969,9 +969,6 @@ static struct iommu_device *viommu_probe_device(struct device *dev)
        struct viommu_dev *viommu = NULL;
        struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
 
-       if (!fwspec || fwspec->ops != &viommu_ops)
-               return ERR_PTR(-ENODEV);
-
        viommu = viommu_get_by_fwnode(fwspec->iommu_fwnode);
        if (!viommu)
                return ERR_PTR(-ENODEV);