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/rockchip-iommu.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index 85f3667e797c3..89cb65f76fe52 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -959,20 +959,25 @@ static int rk_iommu_enable(struct rk_iommu *iommu) return ret; } +static int rk_iommu_identity_test_dev(struct iommu_domain *domain, + struct device *dev, ioasid_t pasid, + struct iommu_domain *old) +{ + /* Allow 'virtual devices' (eg drm) to detach from domain */ + if (!rk_iommu_from_dev(dev)) + return -ENODEV; + return 0; +} + static int rk_iommu_identity_attach(struct iommu_domain *identity_domain, struct device *dev, struct iommu_domain *old) { - struct rk_iommu *iommu; + struct rk_iommu *iommu = rk_iommu_from_dev(dev); struct rk_iommu_domain *rk_domain; unsigned long flags; int ret; - /* Allow 'virtual devices' (eg drm) to detach from domain */ - iommu = rk_iommu_from_dev(dev); - if (!iommu) - return -ENODEV; - rk_domain = to_rk_domain(iommu->domain); dev_dbg(dev, "Detaching from iommu domain\n"); @@ -997,6 +1002,7 @@ static int rk_iommu_identity_attach(struct iommu_domain *identity_domain, } static struct iommu_domain_ops rk_identity_ops = { + .test_dev = rk_iommu_identity_test_dev, .attach_dev = rk_iommu_identity_attach, }; -- 2.43.0

