| From foo@baz Wed Dec 6 17:39:55 CET 2017 |
| From: Andrzej Hajda <a.hajda@samsung.com> |
| Date: Mon, 9 Jan 2017 15:33:02 +0100 |
| Subject: drm/exynos/decon5433: update shadow registers iff there are active windows |
| |
| From: Andrzej Hajda <a.hajda@samsung.com> |
| |
| |
| [ Upstream commit f65a7c9cb3770ed4d3e7c57c66d7032689081b5e ] |
| |
| Improper usage of DECON_UPDATE register leads to subtle errors. |
| If it set in decon_commit when there are no active windows it results |
| in slow registry updates - all subsequent shadow registry updates takes more |
| than full vblank. On the other side if it is not set when there are |
| active windows it results in garbage on the screen after suspend/resume of |
| FB console. |
| |
| The patch hopefully fixes it. |
| |
| Signed-off-by: Andrzej Hajda <a.hajda@samsung.com> |
| Signed-off-by: Inki Dae <inki.dae@samsung.com> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/exynos/exynos5433_drm_decon.c | 7 +++---- |
| 1 file changed, 3 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c |
| +++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c |
| @@ -188,8 +188,6 @@ static void decon_commit(struct exynos_d |
| |
| /* enable output and display signal */ |
| decon_set_bits(ctx, DECON_VIDCON0, VIDCON0_ENVID | VIDCON0_ENVID_F, ~0); |
| - |
| - decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0); |
| } |
| |
| static void decon_win_set_pixfmt(struct decon_context *ctx, unsigned int win, |
| @@ -340,8 +338,9 @@ static void decon_atomic_flush(struct ex |
| for (i = ctx->first_win; i < WINDOWS_NR; i++) |
| decon_shadow_protect_win(ctx, i, false); |
| |
| - /* standalone update */ |
| - decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0); |
| + /* update iff there are active windows */ |
| + if (crtc->base.state->plane_mask) |
| + decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0); |
| |
| if (ctx->out_type & IFTYPE_I80) |
| set_bit(BIT_WIN_UPDATED, &ctx->flags); |