diff options
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.patch | 72 |
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 + |