aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3094-drm-amd-display-Copy-GSL-groups-when-committing-a-ne.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3094-drm-amd-display-Copy-GSL-groups-when-committing-a-ne.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3094-drm-amd-display-Copy-GSL-groups-when-committing-a-ne.patch72
1 files changed, 72 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3094-drm-amd-display-Copy-GSL-groups-when-committing-a-ne.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3094-drm-amd-display-Copy-GSL-groups-when-committing-a-ne.patch
new file mode 100644
index 00000000..f94dae6c
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3094-drm-amd-display-Copy-GSL-groups-when-committing-a-ne.patch
@@ -0,0 +1,72 @@
+From 51f35bffb53f14e148cde05c10091fa45eaad8eb Mon Sep 17 00:00:00 2001
+From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Date: Thu, 11 Jul 2019 12:32:43 -0400
+Subject: [PATCH 3094/4256] drm/amd/display: Copy GSL groups when committing a
+ new context
+
+[Why]
+DC configures the GSL group for the pipe when pipe_split is enabled
+and we're switching flip types (buffered <-> immediate flip) on DCN2.
+
+In order to record what GSL group the pipe is using DC stores it in
+the pipe's stream_res. DM is not aware of this internal grouping, nor
+is DC resource.
+
+So when DM creates a dc_state context and passes it to DC the current
+GSL group is lost - DM never knew about it in the first place.
+
+After 3 immediate flips we run out of GSL groups and we're no longer
+able to correctly perform *any* flip for multi-pipe scenarios.
+
+[How]
+The gsl_group needs to be copied to the new context.
+
+DM has no insight into GSL grouping and could even potentially create
+a brand new context without referencing current hardware state. So this
+makes the most sense to have happen in DC.
+
+There are two places where DC can apply a new context:
+- dc_commit_state
+- dc_commit_updates_for_stream
+
+But what's shared between both of these is apply_ctx_for_surface.
+
+This logic only matters for DCN2, so it can be placed in
+dcn20_apply_ctx_for_surface. Before doing any locking (where the GSL
+group is setup) we can copy over the GSL groups before committing the
+new context.
+
+Change-Id: Id73647f50058dbe130e15fee23fa91ec37c67682
+Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Reviewed-by: Hersen Wu <hersen.wu@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+index 6f990f772a8b..38b3c89b2a59 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+@@ -1366,6 +1366,18 @@ static void dcn20_apply_ctx_for_surface(
+ if (!top_pipe_to_program)
+ return;
+
++ /* Carry over GSL groups in case the context is changing. */
++ for (i = 0; i < dc->res_pool->pipe_count; i++) {
++ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
++ struct pipe_ctx *old_pipe_ctx =
++ &dc->current_state->res_ctx.pipe_ctx[i];
++
++ if (pipe_ctx->stream == stream &&
++ pipe_ctx->stream == old_pipe_ctx->stream)
++ pipe_ctx->stream_res.gsl_group =
++ old_pipe_ctx->stream_res.gsl_group;
++ }
++
+ tg = top_pipe_to_program->stream_res.tg;
+
+ interdependent_update = top_pipe_to_program->plane_state &&
+--
+2.17.1
+