+++ /dev/null
-From 1482650bc7ef01ebb24ec2c3a2e4d50e45da4d8c Mon Sep 17 00:00:00 2001
-From: Wenjing Liu <wenjing.liu@amd.com>
-Date: Mon, 14 Aug 2023 17:11:16 -0400
-Subject: drm/amd/display: update blank state on ODM changes
-
-From: Wenjing Liu <wenjing.liu@amd.com>
-
-commit 1482650bc7ef01ebb24ec2c3a2e4d50e45da4d8c upstream.
-
-When we are dynamically adding new ODM slices, we didn't update
-blank state, if the pipe used by new ODM slice is previously blanked,
-we will continue outputting blank pixel data on that slice causing
-right half of the screen showing blank image.
-
-The previous fix was a temporary hack to directly update current state
-when committing new state. This could potentially cause hw and sw
-state synchronization issues and it is not permitted by dc commit
-design.
-
-Cc: stable@vger.kernel.org
-Fixes: 7fbf451e7639 ("drm/amd/display: Reinit DPG when exiting dynamic ODM")
-Reviewed-by: Dillon Varone <dillon.varone@amd.com>
-Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
-Signed-off-by: Wenjing Liu <wenjing.liu@amd.com>
-Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 36 +++++----------------
- 1 file changed, 9 insertions(+), 27 deletions(-)
-
---- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
-+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
-@@ -1103,29 +1103,6 @@ void dcn20_blank_pixel_data(
- 0);
- }
-
-- if (!blank && dc->debug.enable_single_display_2to1_odm_policy) {
-- /* when exiting dynamic ODM need to reinit DPG state for unused pipes */
-- struct pipe_ctx *old_odm_pipe = dc->current_state->res_ctx.pipe_ctx[pipe_ctx->pipe_idx].next_odm_pipe;
--
-- odm_pipe = pipe_ctx->next_odm_pipe;
--
-- while (old_odm_pipe) {
-- if (!odm_pipe || old_odm_pipe->pipe_idx != odm_pipe->pipe_idx)
-- dc->hwss.set_disp_pattern_generator(dc,
-- old_odm_pipe,
-- CONTROLLER_DP_TEST_PATTERN_VIDEOMODE,
-- CONTROLLER_DP_COLOR_SPACE_UDEFINED,
-- COLOR_DEPTH_888,
-- NULL,
-- 0,
-- 0,
-- 0);
-- old_odm_pipe = old_odm_pipe->next_odm_pipe;
-- if (odm_pipe)
-- odm_pipe = odm_pipe->next_odm_pipe;
-- }
-- }
--
- if (!blank)
- if (stream_res->abm) {
- dc->hwss.set_pipe(pipe_ctx);
-@@ -1706,11 +1683,16 @@ static void dcn20_program_pipe(
- struct dc_state *context)
- {
- struct dce_hwseq *hws = dc->hwseq;
-- /* Only need to unblank on top pipe */
-
-- if ((pipe_ctx->update_flags.bits.enable || pipe_ctx->stream->update_flags.bits.abm_level)
-- && !pipe_ctx->top_pipe && !pipe_ctx->prev_odm_pipe)
-- hws->funcs.blank_pixel_data(dc, pipe_ctx, !pipe_ctx->plane_state->visible);
-+ /* Only need to unblank on top pipe */
-+ if (resource_is_pipe_type(pipe_ctx, OTG_MASTER)) {
-+ if (pipe_ctx->update_flags.bits.enable ||
-+ pipe_ctx->update_flags.bits.odm ||
-+ pipe_ctx->stream->update_flags.bits.abm_level)
-+ hws->funcs.blank_pixel_data(dc, pipe_ctx,
-+ !pipe_ctx->plane_state ||
-+ !pipe_ctx->plane_state->visible);
-+ }
-
- /* Only update TG on top pipe */
- if (pipe_ctx->update_flags.bits.global_sync && !pipe_ctx->top_pipe