[PATCH v2] drm/exynos: implement atomic_{begin/flush} of DECON
Daniel Stone
daniel at fooishbar.org
Thu Aug 27 02:56:00 PDT 2015
On 27 August 2015 at 10:21, Hyungwon Hwang <human.hwang at samsung.com> wrote:
> Each CRTC's atomic_{begin/flush} must stop/start the update of shadow
> registers to active register in the functions. This patch achieves these
> purpose by moving the setting of protection bits to those functions from
> decon_update_plane.
>
> v2: rebased to the branch exynos-drm-next
>
> Signed-off-by: Hyungwon Hwang <human.hwang at samsung.com>
Reviewed-by: Daniel Stone <daniels at collabora.com>
Cheers,
Daniel
> drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 34 +++++++++++++++++++++------
> drivers/gpu/drm/exynos/exynos7_drm_decon.c | 30 ++++++++++++++++++-----
> 2 files changed, 51 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
> index 8d65e45..f24dc2d 100644
> --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
> +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
> @@ -219,6 +219,17 @@ static void decon_shadow_protect_win(struct decon_context *ctx, int win,
> writel(val, ctx->addr + DECON_SHADOWCON);
> }
>
> +static void decon_atomic_begin(struct exynos_drm_crtc *crtc,
> + struct exynos_drm_plane *plane)
> +{
> + struct decon_context *ctx = crtc->ctx;
> +
> + if (ctx->suspended)
> + return;
> +
> + decon_shadow_protect_win(ctx, plane->zpos, true);
> +}
> +
> static void decon_update_plane(struct exynos_drm_crtc *crtc,
> struct exynos_drm_plane *plane)
> {
> @@ -232,8 +243,6 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
> if (ctx->suspended)
> return;
>
> - decon_shadow_protect_win(ctx, win, true);
> -
> val = COORDINATE_X(plane->crtc_x) | COORDINATE_Y(plane->crtc_y);
> writel(val, ctx->addr + DECON_VIDOSDxA(win));
>
> @@ -265,15 +274,10 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
> val |= WINCONx_ENWIN_F;
> writel(val, ctx->addr + DECON_WINCONx(win));
>
> - decon_shadow_protect_win(ctx, win, false);
> -
> /* standalone update */
> val = readl(ctx->addr + DECON_UPDATE);
> val |= STANDALONE_UPDATE_F;
> writel(val, ctx->addr + DECON_UPDATE);
> -
> - if (ctx->i80_if)
> - atomic_set(&ctx->win_updated, 1);
> }
>
> static void decon_disable_plane(struct exynos_drm_crtc *crtc,
> @@ -301,6 +305,20 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
> writel(val, ctx->addr + DECON_UPDATE);
> }
>
> +static void decon_atomic_flush(struct exynos_drm_crtc *crtc,
> + struct exynos_drm_plane *plane)
> +{
> + struct decon_context *ctx = crtc->ctx;
> +
> + if (ctx->suspended)
> + return;
> +
> + decon_shadow_protect_win(ctx, plane->zpos, false);
> +
> + if (ctx->i80_if)
> + atomic_set(&ctx->win_updated, 1);
> +}
> +
> static void decon_swreset(struct decon_context *ctx)
> {
> unsigned int tries;
> @@ -455,8 +473,10 @@ static struct exynos_drm_crtc_ops decon_crtc_ops = {
> .enable_vblank = decon_enable_vblank,
> .disable_vblank = decon_disable_vblank,
> .commit = decon_commit,
> + .atomic_begin = decon_atomic_begin,
> .update_plane = decon_update_plane,
> .disable_plane = decon_disable_plane,
> + .atomic_flush = decon_atomic_flush,
> .te_handler = decon_te_irq_handler,
> };
>
> diff --git a/drivers/gpu/drm/exynos/exynos7_drm_decon.c b/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> index 7651499..c74e30e 100644
> --- a/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> +++ b/drivers/gpu/drm/exynos/exynos7_drm_decon.c
> @@ -383,6 +383,17 @@ static void decon_shadow_protect_win(struct decon_context *ctx,
> writel(val, ctx->regs + SHADOWCON);
> }
>
> +static void decon_atomic_begin(struct exynos_drm_crtc *crtc,
> + struct exynos_drm_plane *plane)
> +{
> + struct decon_context *ctx = crtc->ctx;
> +
> + if (ctx->suspended)
> + return;
> +
> + decon_shadow_protect_win(ctx, plane->zpos, true);
> +}
> +
> static void decon_update_plane(struct exynos_drm_crtc *crtc,
> struct exynos_drm_plane *plane)
> {
> @@ -410,9 +421,6 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
> * is set.
> */
>
> - /* protect windows */
> - decon_shadow_protect_win(ctx, win, true);
> -
> /* buffer start address */
> val = (unsigned long)plane->dma_addr[0];
> writel(val, ctx->regs + VIDW_BUF_START(win));
> @@ -510,14 +518,22 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
> val &= ~WINCONx_ENWIN;
> writel(val, ctx->regs + WINCON(win));
>
> - /* unprotect windows */
> - decon_shadow_protect_win(ctx, win, false);
> -
> val = readl(ctx->regs + DECON_UPDATE);
> val |= DECON_UPDATE_STANDALONE_F;
> writel(val, ctx->regs + DECON_UPDATE);
> }
>
> +static void decon_atomic_flush(struct exynos_drm_crtc *crtc,
> + struct exynos_drm_plane *plane)
> +{
> + struct decon_context *ctx = crtc->ctx;
> +
> + if (ctx->suspended)
> + return;
> +
> + decon_shadow_protect_win(ctx, plane->zpos, false);
> +}
> +
> static void decon_init(struct decon_context *ctx)
> {
> u32 val;
> @@ -614,8 +630,10 @@ static const struct exynos_drm_crtc_ops decon_crtc_ops = {
> .enable_vblank = decon_enable_vblank,
> .disable_vblank = decon_disable_vblank,
> .wait_for_vblank = decon_wait_for_vblank,
> + .atomic_begin = decon_atomic_begin,
> .update_plane = decon_update_plane,
> .disable_plane = decon_disable_plane,
> + .atomic_flush = decon_atomic_flush,
> };
>
>
> --
> 2.4.3
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list