On Wed, 15 Mar 2023 at 18:25, Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> 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() on purpose and they are needed for proper > Exynos IOMMU driver operation. 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> > --- Reviewed-by: Sam Protsenko <semen.protsenko@xxxxxxxxxx> > v2: > - keep set_platform_dma_ops only on ARM 32bit > > Some more background why set_platform_dma_ops is needed on ARM 32bit is > available here: > https://lore.kernel.org/all/9a12fcac-c347-5d81-acef-1124c50d0c37@xxxxxxx/ > --- > drivers/iommu/exynos-iommu.c | 17 ++++++++++------- > 1 file changed, 10 insertions(+), 7 deletions(-) > > diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c > index 483aaaeb6dae..1abd187c6075 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); > } > } > +} > + > +static void exynos_iommu_release_device(struct device *dev) > +{ > + struct exynos_iommu_owner *owner = dev_iommu_priv_get(dev); > + struct sysmmu_drvdata *data; > + > + exynos_iommu_set_platform_dma(dev); > > list_for_each_entry(data, &owner->controllers, owner_node) > device_link_del(data->link); > @@ -1479,7 +1482,7 @@ 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, > + .set_platform_dma_ops = exynos_iommu_set_platform_dma, > #endif > .probe_device = exynos_iommu_probe_device, > .release_device = exynos_iommu_release_device, > -- > 2.34.1 >