Hello,

On 2015-07-02 14:49, Joonyoung Shim wrote:
> Already drm_iommu_attach_device checks whether support iommu internally.
> It should clear channels always regardless iommu support. We didn't know
> because we can detect the problem when iommu is enabled, so we don't
> have to use drm_iommu_attach_device_if_possible and then we can remove
> drm_iommu_attach_device_if_possible and clear_channels function pointer.
>
> Signed-off-by: Joonyoung Shim <jy0922.shim at samsung.com>

Tested-by: Marek Szyprowski <m.szyprowski at samsung.com>

> ---
>   drivers/gpu/drm/exynos/exynos5433_drm_decon.c |  5 +++--
>   drivers/gpu/drm/exynos/exynos7_drm_decon.c    |  5 +++--
>   drivers/gpu/drm/exynos/exynos_drm_drv.h       |  1 -
>   drivers/gpu/drm/exynos/exynos_drm_fimd.c      |  5 +++--
>   drivers/gpu/drm/exynos/exynos_drm_iommu.c     | 11 -----------
>   drivers/gpu/drm/exynos/exynos_drm_iommu.h     | 11 -----------
>   drivers/gpu/drm/exynos/exynos_mixer.c         |  3 +--
>   7 files changed, 10 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c 
> b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
> index ba43437..b2794f8 100644
> --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
> +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
> @@ -463,7 +463,6 @@ static struct exynos_drm_crtc_ops decon_crtc_ops = {
>       .win_commit             = decon_win_commit,
>       .win_disable            = decon_win_disable,
>       .te_handler             = decon_te_irq_handler,
> -     .clear_channels         = decon_clear_channels,
>   };
>   
>   static int decon_bind(struct device *dev, struct device *master, void *data)
> @@ -497,7 +496,9 @@ static int decon_bind(struct device *dev, struct device 
> *master, void *data)
>               goto err;
>       }
>   
> -     ret = drm_iommu_attach_device_if_possible(ctx->crtc, drm_dev, dev);
> +     decon_clear_channels(ctx->crtc);
> +
> +     ret = drm_iommu_attach_device(drm_dev, dev);
>       if (ret)
>               goto err;
>   
> diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c 
> b/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> index 2c29635..a80b918 100644
> --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> @@ -126,7 +126,9 @@ static int decon_ctx_initialize(struct decon_context *ctx,
>       ctx->drm_dev = drm_dev;
>       ctx->pipe = priv->pipe++;
>   
> -     ret = drm_iommu_attach_device_if_possible(ctx->crtc, drm_dev, ctx->dev);
> +     decon_clear_channels(ctx->crtc);
> +
> +     ret = drm_iommu_attach_device(drm_dev, ctx->dev);
>       if (ret)
>               priv->pipe--;
>   
> @@ -622,7 +624,6 @@ static const struct exynos_drm_crtc_ops decon_crtc_ops = {
>       .wait_for_vblank = decon_wait_for_vblank,
>       .win_commit = decon_win_commit,
>       .win_disable = decon_win_disable,
> -     .clear_channels = decon_clear_channels,
>   };
>   
>   
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h 
> b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> index dd00f16..7da593f 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> @@ -177,7 +177,6 @@ struct exynos_drm_crtc_ops {
>       void (*win_disable)(struct exynos_drm_crtc *crtc, unsigned int zpos);
>       void (*te_handler)(struct exynos_drm_crtc *crtc);
>       void (*clock_enable)(struct exynos_drm_crtc *crtc, bool enable);
> -     void (*clear_channels)(struct exynos_drm_crtc *crtc);
>   };
>   
>   /*
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
> b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index 300730c..8d362b9 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> @@ -887,7 +887,6 @@ static const struct exynos_drm_crtc_ops fimd_crtc_ops = {
>       .win_disable = fimd_win_disable,
>       .te_handler = fimd_te_handler,
>       .clock_enable = fimd_dp_clock_enable,
> -     .clear_channels = fimd_clear_channels,
>   };
>   
>   static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
> @@ -957,7 +956,9 @@ static int fimd_bind(struct device *dev, struct device 
> *master, void *data)
>       if (ctx->display)
>               exynos_drm_create_enc_conn(drm_dev, ctx->display);
>   
> -     ret = drm_iommu_attach_device_if_possible(ctx->crtc, drm_dev, dev);
> +     fimd_clear_channels(ctx->crtc);
> +
> +     ret = drm_iommu_attach_device(drm_dev, dev);
>       if (ret)
>               priv->pipe--;
>   
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.c 
> b/drivers/gpu/drm/exynos/exynos_drm_iommu.c
> index 4c2ec1b..055e8ec 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.c
> @@ -142,14 +142,3 @@ void drm_iommu_detach_device(struct drm_device *drm_dev,
>       iommu_detach_device(mapping->domain, subdrv_dev);
>       drm_release_iommu_mapping(drm_dev);
>   }
> -
> -int drm_iommu_attach_device_if_possible(struct exynos_drm_crtc *exynos_crtc,
> -                     struct drm_device *drm_dev, struct device *subdrv_dev)
> -{
> -     if (is_drm_iommu_supported(drm_dev)) {
> -             if (exynos_crtc->ops->clear_channels)
> -                     exynos_crtc->ops->clear_channels(exynos_crtc);
> -     }
> -
> -     return drm_iommu_attach_device(drm_dev, subdrv_dev);
> -}
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_iommu.h 
> b/drivers/gpu/drm/exynos/exynos_drm_iommu.h
> index a90357f..dc1b544 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_iommu.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_iommu.h
> @@ -34,10 +34,6 @@ static inline bool is_drm_iommu_supported(struct 
> drm_device *drm_dev)
>       return dev->archdata.mapping ? true : false;
>   }
>   
> -int drm_iommu_attach_device_if_possible(
> -             struct exynos_drm_crtc *exynos_crtc, struct drm_device *drm_dev,
> -             struct device *subdrv_dev);
> -
>   #else
>   
>   static inline int drm_create_iommu_mapping(struct drm_device *drm_dev)
> @@ -65,12 +61,5 @@ static inline bool is_drm_iommu_supported(struct 
> drm_device *drm_dev)
>       return false;
>   }
>   
> -static inline int drm_iommu_attach_device_if_possible(
> -             struct exynos_drm_crtc *exynos_crtc, struct drm_device *drm_dev,
> -             struct device *subdrv_dev)
> -{
> -     return 0;
> -}
> -
>   #endif
>   #endif
> diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c 
> b/drivers/gpu/drm/exynos/exynos_mixer.c
> index 1a01c48..8c461b1 100644
> --- a/drivers/gpu/drm/exynos/exynos_mixer.c
> +++ b/drivers/gpu/drm/exynos/exynos_mixer.c
> @@ -881,8 +881,7 @@ static int mixer_initialize(struct mixer_context 
> *mixer_ctx,
>               }
>       }
>   
> -     ret = drm_iommu_attach_device_if_possible(mixer_ctx->crtc, drm_dev,
> -                                                             mixer_ctx->dev);
> +     ret = drm_iommu_attach_device(drm_dev, mixer_ctx->dev);
>       if (ret)
>               priv->pipe--;
>   

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland

Reply via email to