FAILED: Patch "drm/amd/display: Update phantom pipe enable / disable sequence" failed to apply to 6.8-stable tree
Sasha Levin
maintainerThe patch below does not apply to the 6.8-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Thanks,
Sasha
------------------ original commit in Linus's tree ------------------
From 6a068e64fb25dbc81256fc03db0d4579d222bccd Mon Sep 17 00:00:00 2001
From: Alvin Lee <[email protected]>
Date: Fri, 26 Jan 2024 16:47:20 -0500
Subject: [PATCH] drm/amd/display: Update phantom pipe enable / disable
sequence
Previously we would call apply_ctx_to_hw to enable and disable phantom pipes. However, apply_ctx_to_hw can potentially update non-phantom pipes as well which is undesired. Instead of calling apply_ctx_to_hw as a whole, call the relevant helpers for each phantom pipe when enabling / disabling which will avoid us modifying hardware state for non-phantom pipes unknowingly.
The use case is for an FRL display where FRL_Update is requested by the display. In this case link_state_valid flag is cleared in a passive callback thread and should be handled in the next stream / link update. However, due to the call to apply_ctx_to_hw for the phantom pipes during a flip, the main pipes were modified outside of the desired sequence (driver does not handle link_state_valid = 0 on flips).
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 4 +- .../amd/display/dc/hwss/dce110/dce110_hwseq.c | 4 +- .../amd/display/dc/hwss/dce110/dce110_hwseq.h | 4 + .../amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 2 +- .../amd/display/dc/hwss/dcn20/dcn20_hwseq.h | 4 + .../amd/display/dc/hwss/dcn32/dcn32_hwseq.c | 76 ++++++++++++++++--- .../amd/display/dc/hwss/dcn32/dcn32_hwseq.h | 2 + .../amd/display/dc/hwss/dcn32/dcn32_init.c | 3 + .../drm/amd/display/dc/hwss/hw_sequencer.h | 1 + .../display/dc/hwss/hw_sequencer_private.h | 7 ++ 10 files changed, 94 insertions(+), 13 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +3 -1
@@ -3851,7 +3851,9 @@ static void commit_planes_for_stream(struct dc *dc,* programming has completed (we turn on phantom OTG in order * to complete the plane disable for phantom pipes). */ - dc->hwss.apply_ctx_to_hw (dc, context); + +if (dc->hwss.disable_phantom_streams) + dc->hwss.disable_phantom_streams (dc, context); }if (update_type !=UPDATE_TYPE_FAST )
drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c +2 -2
@@ -1529,7 +1529,7 @@ static enum dc_status dce110_enable_stream_timing(return DC_OK ; } -static enum dc_status apply_single_controller_ctx_to_hw ( +enum dc_status dce110_apply_single_controller_ctx_to_hw (struct pipe_ctx *pipe_ctx,struct dc_state *context,struct dc *dc)
@@ -2356,7 +2356,7 @@ enum dc_status dce110_apply_ctx_to_hw(if (pipe_ctx->top_pipe || pipe_ctx->prev_odm_pipe)continue ; - status =apply_single_controller_ctx_to_hw ( + status =dce110_apply_single_controller_ctx_to_hw ( pipe_ctx, context, dc);
drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.h +4 -0
@@ -39,6 +39,10 @@ enum dc_status dce110_apply_ctx_to_hw(struct dc *dc, struct dc_state *context); +enum dc_status dce110_apply_single_controller_ctx_to_hw ( +struct pipe_ctx *pipe_ctx, +struct dc_state *context, +struct dc *dc);void dce110_enable_stream (struct pipe_ctx *pipe_ctx);
drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c +1 -1
@@ -2671,7 +2671,7 @@ void dcn20_setup_vupdate_interrupt(struct dc *dc, struct pipe_ctx *pipe_ctx) tg->funcs->setup_vertical_interrupt2 (tg, start_line); } -static void dcn20_reset_back_end_for_pipe ( +void dcn20_reset_back_end_for_pipe (struct dc *dc,struct pipe_ctx *pipe_ctx,struct dc_state *context)
drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.h +4 -0
@@ -86,6 +86,10 @@ enum dc_status dcn20_enable_stream_timing(void dcn20_disable_stream_gating (struct dc *dc,struct pipe_ctx *pipe_ctx);void dcn20_enable_stream_gating (struct dc *dc,struct pipe_ctx *pipe_ctx);void dcn20_setup_vupdate_interrupt (struct dc *dc,struct pipe_ctx *pipe_ctx); +void dcn20_reset_back_end_for_pipe ( +struct dc *dc, +struct pipe_ctx *pipe_ctx, +struct dc_state *context);void dcn20_init_blank (struct dc *dc,struct timing_generator *tg);
drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c +67 -9
92 lines not on this page · raw message
drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.h +2 -0
@@ -111,6 +111,8 @@ void dcn32_update_dsc_pg(struct dc *dc,void dcn32_enable_phantom_streams (struct dc *dc,struct dc_state *context); +void dcn32_disable_phantom_streams (struct dc *dc,struct dc_state *context); +void dcn32_init_blank (struct dc *dc,struct timing_generator *tg);
drivers/gpu/drm/amd/display/dc/hwss/dcn32/dcn32_init.c +3 -0
@@ -109,6 +109,7 @@ static const struct hw_sequencer_funcs dcn32_funcs = { .get_dcc_en_bits = dcn10_get_dcc_en_bits, .commit_subvp_config = dcn32_commit_subvp_config, .enable_phantom_streams = dcn32_enable_phantom_streams, + .disable_phantom_streams = dcn32_disable_phantom_streams, .subvp_pipe_control_lock = dcn32_subvp_pipe_control_lock, .update_visual_confirm_color = dcn10_update_visual_confirm_color, .subvp_pipe_control_lock_fast = dcn32_subvp_pipe_control_lock_fast,
@@ -159,6 +160,8 @@ static const struct hwseq_private_funcs dcn32_private_funcs = { .set_pixels_per_cycle = dcn32_set_pixels_per_cycle, .resync_fifo_dccg_dio = dcn32_resync_fifo_dccg_dio, .is_dp_dig_pixel_rate_div_policy = dcn32_is_dp_dig_pixel_rate_div_policy, + .apply_single_controller_ctx_to_hw = dce110_apply_single_controller_ctx_to_hw, + .reset_back_end_for_pipe = dcn20_reset_back_end_for_pipe, };void dcn32_hw_sequencer_init_functions (struct dc *dc)
drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h +1 -0
@@ -381,6 +381,7 @@ struct hw_sequencer_funcs { struct dc_cursor_attributes *cursor_attr);void (*commit_subvp_config)(struct dc *dc,struct dc_state *context);void (*enable_phantom_streams)(struct dc *dc,struct dc_state *context); +void (*disable_phantom_streams)(struct dc *dc,struct dc_state *context); void (*subvp_pipe_control_lock)(struct dc *dc, struct dc_state *context, bool lock,
drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer_private.h +7 -0
@@ -165,8 +165,15 @@ struct hwseq_private_funcs {void (*set_pixels_per_cycle)(struct pipe_ctx *pipe_ctx);void (*resync_fifo_dccg_dio)(struct dce_hwseq *hws,struct dc *dc,struct dc_state *context); +enum dc_status (*apply_single_controller_ctx_to_hw)( +struct pipe_ctx *pipe_ctx, +struct dc_state *context, +struct dc *dc);bool (*is_dp_dig_pixel_rate_div_policy)(struct pipe_ctx *pipe_ctx);#endif +void (*reset_back_end_for_pipe)(struct dc *dc, +struct pipe_ctx *pipe_ctx, +struct dc_state *context); };struct dce_hwseq {
Signature · 1 line
2.43.0