On Fri, Feb 17, 2023 at 12:21:29PM +0100, Marek Szyprowski wrote: > There are some subtle differences between release_device() and > set_platform_dma_ops() callbacks, so separate those two callbacks. Device > links should be removed only in release_device(), because they were > created in probe_device(). While fixing this, remove the conditional code > as it is not really needed. > > Reported-by: Jason Gunthorpe <jgg@xxxxxxxx> > Fixes: 189d496b48b1 ("iommu/exynos: Add missing set_platform_dma_ops callback") > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > --- > drivers/iommu/exynos-iommu.c | 19 ++++++++++--------- > 1 file changed, 10 insertions(+), 9 deletions(-) > > diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c > index 483aaaeb6dae..4141625542ef 100644 > --- a/drivers/iommu/exynos-iommu.c > +++ b/drivers/iommu/exynos-iommu.c > @@ -1415,23 +1415,26 @@ static struct iommu_device *exynos_iommu_probe_device(struct device *dev) > return &data->iommu; > } > > -static void exynos_iommu_release_device(struct device *dev) > +static void exynos_iommu_set_platform_dma(struct device *dev) > { > struct exynos_iommu_owner *owner = dev_iommu_priv_get(dev); > - struct sysmmu_drvdata *data; > > if (owner->domain) { > struct iommu_group *group = iommu_group_get(dev); > > if (group) { > -#ifndef CONFIG_ARM > - WARN_ON(owner->domain != > - iommu_group_default_domain(group)); > -#endif > exynos_iommu_detach_device(owner->domain, dev); > iommu_group_put(group); > } > } See, this is my confusion from the other email, all this does is "detach_device" but it really should restore the arm_iommu's mapping->domain. > @@ -1478,11 +1481,9 @@ static int exynos_iommu_of_xlate(struct device *dev, > static const struct iommu_ops exynos_iommu_ops = { > .domain_alloc = exynos_iommu_domain_alloc, > .device_group = generic_device_group, > -#ifdef CONFIG_ARM > - .set_platform_dma_ops = exynos_iommu_release_device, > -#endif > .probe_device = exynos_iommu_probe_device, > .release_device = exynos_iommu_release_device, > + .set_platform_dma_ops = exynos_iommu_set_platform_dma, The ifdef is still needed, when using default domains this op should not be set at all. Jason