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