| From 90615fd793ea6a07f241058a268ea4ff35bcb9c7 Mon Sep 17 00:00:00 2001 |
| From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| Date: Wed, 6 Feb 2019 10:18:17 -0500 |
| Subject: drm/amd/display: Reset planes that were disabled in init_pipes |
| |
| [ Upstream commit 4bc46da4a3aeeb4d55e83dd276cf72756e908286 ] |
| |
| [Why] |
| Seamless boot tries to reuse planes that were enabled for the first |
| commit applied. |
| |
| In the case where Raven is booting with two monitors connected and the |
| first commit contains two streams the screen corruption would occur |
| because the second stream was trying to re-use a tg and plane that |
| weren't previously enabled. |
| |
| The state on the first commit looks something like the following: |
| |
| TG0: enabled=1 |
| TG1: enabled=0 |
| TG2: enabled=0 |
| TG3: enabled=0 |
| |
| New state: pipe=0, stream=0, plane=0, new_tg=0 |
| New state: pipe=1, stream=1, plane=1, new_tg=1 |
| New state: pipe=2, stream=NULL, plane=NULL, new_tg=NULL |
| New state: pipe=3, stream=NULL, plane=NULL, new_tg=NULL |
| |
| Only one plane/tg is setup before we enter accelerated mode so |
| we really want to disabling everything but that first plane. |
| |
| [How] |
| |
| Check if the stream is not NULL and if the tg is enabled before |
| deciding whether to skip the plane disable. |
| |
| Also ensure we're also disabling on the current state's pipe_ctx so |
| we don't overwrite the fields in the new pending state. |
| |
| Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> |
| Reviewed-by: Anthony Koo <Anthony.Koo@amd.com> |
| Acked-by: Harry Wentland <Harry.Wentland@amd.com> |
| Acked-by: Leo Li <sunpeng.li@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| 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 401ea9561618e..5b551a544e82d 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 |
| @@ -1008,9 +1008,14 @@ static void dcn10_init_pipes(struct dc *dc, struct dc_state *context) |
| * to non-preferred front end. If pipe_ctx->stream is not NULL, |
| * we will use the pipe, so don't disable |
| */ |
| - if (pipe_ctx->stream != NULL) |
| + if (pipe_ctx->stream != NULL && |
| + pipe_ctx->stream_res.tg->funcs->is_tg_enabled( |
| + pipe_ctx->stream_res.tg)) |
| continue; |
| |
| + /* Disable on the current state so the new one isn't cleared. */ |
| + pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; |
| + |
| dpp->funcs->dpp_reset(dpp); |
| |
| pipe_ctx->stream_res.tg = tg; |
| -- |
| 2.20.1 |
| |