Move sanity and compatibility tests from the attach_dev callback to the
new test_dev callback function. The IOMMU core makes sure an attach_dev
call must be invoked after a successful test_dev call.

Signed-off-by: Nicolin Chen <[email protected]>
---
 drivers/iommu/tegra-smmu.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c
index 336e0a3ff41fb..cfbe67678a426 100644
--- a/drivers/iommu/tegra-smmu.c
+++ b/drivers/iommu/tegra-smmu.c
@@ -489,6 +489,18 @@ static void tegra_smmu_as_unprepare(struct tegra_smmu 
*smmu,
        mutex_unlock(&smmu->lock);
 }
 
+static int tegra_smmu_domain_test_dev(struct iommu_domain *domain,
+                                     struct device *dev, ioasid_t pasid,
+                                     struct iommu_domain *old)
+{
+       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
+
+       if (!fwspec || !fwspec->num_ids)
+               return -ENOENT;
+
+       return 0;
+}
+
 static int tegra_smmu_attach_dev(struct iommu_domain *domain,
                                 struct device *dev, struct iommu_domain *old)
 {
@@ -498,9 +510,6 @@ static int tegra_smmu_attach_dev(struct iommu_domain 
*domain,
        unsigned int index;
        int err;
 
-       if (!fwspec)
-               return -ENOENT;
-
        for (index = 0; index < fwspec->num_ids; index++) {
                err = tegra_smmu_as_prepare(smmu, as);
                if (err)
@@ -509,9 +518,6 @@ static int tegra_smmu_attach_dev(struct iommu_domain 
*domain,
                tegra_smmu_enable(smmu, fwspec->ids[index], as->id);
        }
 
-       if (index == 0)
-               return -ENODEV;
-
        return 0;
 
 disable:
@@ -532,9 +538,6 @@ static int tegra_smmu_identity_attach(struct iommu_domain 
*identity_domain,
        struct tegra_smmu *smmu;
        unsigned int index;
 
-       if (!fwspec)
-               return -ENODEV;
-
        if (old == identity_domain || !old)
                return 0;
 
@@ -548,6 +551,7 @@ static int tegra_smmu_identity_attach(struct iommu_domain 
*identity_domain,
 }
 
 static struct iommu_domain_ops tegra_smmu_identity_ops = {
+       .test_dev = tegra_smmu_domain_test_dev,
        .attach_dev = tegra_smmu_identity_attach,
 };
 
@@ -1005,6 +1009,7 @@ static const struct iommu_ops tegra_smmu_ops = {
        .device_group = tegra_smmu_device_group,
        .of_xlate = tegra_smmu_of_xlate,
        .default_domain_ops = &(const struct iommu_domain_ops) {
+               .test_dev       = tegra_smmu_domain_test_dev,
                .attach_dev     = tegra_smmu_attach_dev,
                .map_pages      = tegra_smmu_map,
                .unmap_pages    = tegra_smmu_unmap,
-- 
2.43.0


Reply via email to