Re: [PATCH v2] iommu/exynos: Fix set_platform_dma_ops() callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>



[Index of Archives]     [Linux SoC Development]     [Linux Rockchip Development]     [Linux for Synopsys ARC Processors]    
  • [Linux on Unisoc (RDA Micro) SoCs]     [Linux Actions SoC]     [Linux USB Development]     [Video for Linux]     [Linux Audio Users]     [Linux SCSI]     [Yosemite News]

  •   Powered by Linux