aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1295-drm-amd-display-make-seamless-boot-work-generically.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1295-drm-amd-display-make-seamless-boot-work-generically.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1295-drm-amd-display-make-seamless-boot-work-generically.patch126
1 files changed, 126 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1295-drm-amd-display-make-seamless-boot-work-generically.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1295-drm-amd-display-make-seamless-boot-work-generically.patch
new file mode 100644
index 00000000..7d86303c
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1295-drm-amd-display-make-seamless-boot-work-generically.patch
@@ -0,0 +1,126 @@
+From 5a3115d618814d90b3c6e092c9140ffb70984985 Mon Sep 17 00:00:00 2001
+From: Anthony Koo <Anthony.Koo@amd.com>
+Date: Wed, 30 Jan 2019 16:14:38 -0500
+Subject: [PATCH 1295/2940] drm/amd/display: make seamless boot work
+ generically
+
+[Why]
+Seamless boot code not working on all ASICs because of
+some underflow issues caused by some uninitialized HW
+state.
+
+[How]
+Keep some logical and power gating init code in hw_init.
+Move some per pipe init code to enable accelerated mode
+
+Signed-off-by: Anthony Koo <Anthony.Koo@amd.com>
+Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
+Acked-by: Leo Li <sunpeng.li@amd.com>
+---
+ .../display/dc/dce110/dce110_hw_sequencer.c | 3 ++
+ .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 35 +++++++++++++------
+ 2 files changed, 27 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
+index 5a44ff6df0fb..508754af50fb 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
+@@ -1551,6 +1551,9 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
+ }
+ }
+
++ if (dc->hwss.init_pipes)
++ dc->hwss.init_pipes(dc, context);
++
+ if (edp_link) {
+ /* this seems to cause blank screens on DCE8 */
+ if ((dc->ctx->dce_version == DCE_VERSION_8_0) ||
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+index 8eddc7c9317a..2a3bd75344fd 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+@@ -889,22 +889,23 @@ void hwss1_plane_atomic_disconnect(struct dc *dc, struct pipe_ctx *pipe_ctx)
+ dcn10_verify_allow_pstate_change_high(dc);
+ }
+
+-static void plane_atomic_power_down(struct dc *dc, struct pipe_ctx *pipe_ctx)
++static void plane_atomic_power_down(struct dc *dc,
++ struct dpp *dpp,
++ struct hubp *hubp)
+ {
+ struct dce_hwseq *hws = dc->hwseq;
+- struct dpp *dpp = pipe_ctx->plane_res.dpp;
+ DC_LOGGER_INIT(dc->ctx->logger);
+
+ if (REG(DC_IP_REQUEST_CNTL)) {
+ REG_SET(DC_IP_REQUEST_CNTL, 0,
+ IP_REQUEST_EN, 1);
+ dpp_pg_control(hws, dpp->inst, false);
+- hubp_pg_control(hws, pipe_ctx->plane_res.hubp->inst, false);
++ hubp_pg_control(hws, hubp->inst, false);
+ dpp->funcs->dpp_reset(dpp);
+ REG_SET(DC_IP_REQUEST_CNTL, 0,
+ IP_REQUEST_EN, 0);
+ DC_LOG_DEBUG(
+- "Power gated front end %d\n", pipe_ctx->pipe_idx);
++ "Power gated front end %d\n", hubp->inst);
+ }
+ }
+
+@@ -931,7 +932,9 @@ static void plane_atomic_disable(struct dc *dc, struct pipe_ctx *pipe_ctx)
+ hubp->power_gated = true;
+ dc->optimized_required = false; /* We're powering off, no need to optimize */
+
+- plane_atomic_power_down(dc, pipe_ctx);
++ plane_atomic_power_down(dc,
++ pipe_ctx->plane_res.dpp,
++ pipe_ctx->plane_res.hubp);
+
+ pipe_ctx->stream = NULL;
+ memset(&pipe_ctx->stream_res, 0, sizeof(pipe_ctx->stream_res));
+@@ -1001,9 +1004,6 @@ static void dcn10_init_pipes(struct dc *dc, struct dc_state *context)
+ struct dpp *dpp = dc->res_pool->dpps[i];
+ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
+
+- // W/A for issue with dc_post_update_surfaces_to_stream
+- hubp->power_gated = true;
+-
+ /* There is assumption that pipe_ctx is not mapping irregularly
+ * to non-preferred front end. If pipe_ctx->stream is not NULL,
+ * we will use the pipe, so don't disable
+@@ -1108,6 +1108,22 @@ static void dcn10_init_hw(struct dc *dc)
+ link->link_status.link_active = true;
+ }
+
++ /* If taking control over from VBIOS, we may want to optimize our first
++ * mode set, so we need to skip powering down pipes until we know which
++ * pipes we want to use.
++ * Otherwise, if taking control is not possible, we need to power
++ * everything down.
++ */
++ if (dcb->funcs->is_accelerated_mode(dcb)) {
++ for (i = 0; i < dc->res_pool->pipe_count; i++) {
++ struct hubp *hubp = dc->res_pool->hubps[i];
++ struct dpp *dpp = dc->res_pool->dpps[i];
++
++ dc->res_pool->opps[i]->mpc_tree_params.opp_id = dc->res_pool->opps[i]->inst;
++ plane_atomic_power_down(dc, dpp, hubp);
++ }
++ }
++
+ for (i = 0; i < dc->res_pool->audio_count; i++) {
+ struct audio *audio = dc->res_pool->audios[i];
+
+@@ -1137,9 +1153,6 @@ static void dcn10_init_hw(struct dc *dc)
+ enable_power_gating_plane(dc->hwseq, true);
+
+ memset(&dc->res_pool->clk_mgr->clks, 0, sizeof(dc->res_pool->clk_mgr->clks));
+-
+- if (dc->hwss.init_pipes)
+- dc->hwss.init_pipes(dc, dc->current_state);
+ }
+
+ static void reset_hw_ctx_wrap(
+--
+2.17.1
+