diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1779-drm-amd-display-If-one-stream-full-updates-full-upda.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1779-drm-amd-display-If-one-stream-full-updates-full-upda.patch | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1779-drm-amd-display-If-one-stream-full-updates-full-upda.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1779-drm-amd-display-If-one-stream-full-updates-full-upda.patch new file mode 100644 index 00000000..b0d47ec2 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1779-drm-amd-display-If-one-stream-full-updates-full-upda.patch @@ -0,0 +1,118 @@ +From 37cc5a25323feb05aa6e8fe5a382b399ce95c3e7 Mon Sep 17 00:00:00 2001 +From: David Francis <David.Francis@amd.com> +Date: Fri, 29 Mar 2019 13:23:15 -0400 +Subject: [PATCH 1779/2940] drm/amd/display: If one stream full updates, full + update all planes + +[Why] +On some compositors, with two monitors attached, VT terminal +switch can cause a graphical issue by the following means: + +There are two streams, one for each monitor. Each stream has one +plane + +current state: + M1:S1->P1 + M2:S2->P2 + +The user calls for a terminal switch and a commit is made to +change both planes to linear swizzle mode. In atomic check, +a new dc_state is constructed with new planes on each stream + +new state: + M1:S1->P3 + M2:S2->P4 + +In commit tail, each stream is committed, one at a time. The first +stream (S1) updates properly, triggerring a full update and replacing +the state + +current state: + M1:S1->P3 + M2:S2->P4 + +The update for S2 comes in, but dc detects that there is no difference +between the stream and plane in the new and current states, and so +triggers a fast update. The fast update does not program swizzle, +so the second monitor is corrupted + +[How] +Add a flag to dc_plane_state that forces full updates + +When a stream undergoes a full update, set this flag on all changed +planes, then clear it on the current stream + +Subsequent streams will get full updates as a result + +Change-Id: I211b58776bfc3b84ed1cfa3ea11b9975101a44a8 +Signed-off-by: David Francis <David.Francis@amd.com> +Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Reviewed-by: Roman Li <Roman.Li@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet Lakha@amd.com> +Acked-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc.c | 19 +++++++++++++++++++ + drivers/gpu/drm/amd/display/dc/dc.h | 3 +++ + 2 files changed, 22 insertions(+) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 843b32d29998..dc660a022336 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -1473,6 +1473,11 @@ static enum surface_update_type det_surface_update(const struct dc *dc, + return UPDATE_TYPE_FULL; + } + ++ if (u->surface->force_full_update) { ++ update_flags->bits.full_update = 1; ++ return UPDATE_TYPE_FULL; ++ } ++ + type = get_plane_info_update_type(u); + elevate_update_type(&overall_type, type); + +@@ -1908,6 +1913,14 @@ void dc_commit_updates_for_stream(struct dc *dc, + } + + dc_resource_state_copy_construct(state, context); ++ ++ for (i = 0; i < dc->res_pool->pipe_count; i++) { ++ struct pipe_ctx *new_pipe = &context->res_ctx.pipe_ctx[i]; ++ struct pipe_ctx *old_pipe = &dc->current_state->res_ctx.pipe_ctx[i]; ++ ++ if (new_pipe->plane_state && new_pipe->plane_state != old_pipe->plane_state) ++ new_pipe->plane_state->force_full_update = true; ++ } + } + + +@@ -1944,6 +1957,12 @@ void dc_commit_updates_for_stream(struct dc *dc, + dc->current_state = context; + dc_release_state(old); + ++ for (i = 0; i < dc->res_pool->pipe_count; i++) { ++ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; ++ ++ if (pipe_ctx->plane_state && pipe_ctx->stream == stream) ++ pipe_ctx->plane_state->force_full_update = false; ++ } + } + /*let's use current_state to update watermark etc*/ + if (update_type >= UPDATE_TYPE_FULL) +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index f5470cef6ebd..3c69b8cbb554 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -573,6 +573,9 @@ struct dc_plane_state { + struct dc_plane_status status; + struct dc_context *ctx; + ++ /* HACK: Workaround for forcing full reprogramming under some conditions */ ++ bool force_full_update; ++ + /* private to dc_surface.c */ + enum dc_irq_source irq_source; + struct kref refcount; +-- +2.17.1 + |