From: Piotr Maziarz <[email protected]>

[WHY]
The operation wrote no hardware register. Its executor only set
opp->mpcc_disconnect_pending, a driver side flag, which breaks the rule
that a block sequence step programs a hardware block rather than mutating
logical objects. It was also split across phases: written while the
pre-unlock sequence executed, then read and cleared while the post-unlock
sequence was still being built.

[HOW]
Deleted the enum value, the params struct, the add helper, the executor and
the dispatch case. dcn401_plane_atomic_disconnect_sequence now sets the
flag during the build phase, matching what dcn10, dcn20, dcn201, dcn35,
dcn3ag and dcn42b already do. Updated the operation specs and the
core_gtest dumper.

Signed-off-by: Piotr Maziarz <[email protected]>
Signed-off-by: Fangzhi Zuo <[email protected]>
Reviewed-by: Alvin Lee <[email protected]>
---
 .../drm/amd/display/dc/core/dc_hw_sequencer.c | 24 -------------------
 .../amd/display/dc/hwss/dcn401/dcn401_hwseq.c |  6 +++--
 .../drm/amd/display/dc/hwss/hw_sequencer.h    | 13 ----------
 3 files changed, 4 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
index e1d6e31af657..5e41792c622a 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
@@ -1888,9 +1888,6 @@ void hwss_execute_sequence(struct dc *dc,
                case MPC_REMOVE_MPCC:
                        hwss_mpc_remove_mpcc(params);
                        break;
-               case OPP_SET_MPCC_DISCONNECT_PENDING:
-                       hwss_opp_set_mpcc_disconnect_pending(params);
-                       break;
                case DC_SET_OPTIMIZED_REQUIRED:
                        hwss_dc_set_optimized_required(params);
                        break;
@@ -3581,15 +3578,6 @@ void hwss_mpc_remove_mpcc(union block_sequence_params 
*params)
        mpc->funcs->remove_mpcc(mpc, mpc_tree_params, mpcc_to_remove);
 }
 
-void hwss_opp_set_mpcc_disconnect_pending(union block_sequence_params *params)
-{
-       struct output_pixel_processor *opp = 
params->opp_set_mpcc_disconnect_pending_params.opp;
-       int mpcc_inst = 
params->opp_set_mpcc_disconnect_pending_params.mpcc_inst;
-       bool pending = params->opp_set_mpcc_disconnect_pending_params.pending;
-
-       opp->mpcc_disconnect_pending[mpcc_inst] = pending;
-}
-
 void hwss_dc_set_optimized_required(union block_sequence_params *params)
 {
        struct dc *dc = params->dc_set_optimized_required_params.dc;
@@ -4773,18 +4761,6 @@ void hwss_add_mpc_remove_mpcc(struct 
block_sequence_state *seq_state,
        }
 }
 
-void hwss_add_opp_set_mpcc_disconnect_pending(struct block_sequence_state 
*seq_state,
-               struct output_pixel_processor *opp, int mpcc_inst, bool pending)
-{
-       if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
-               seq_state->steps[*seq_state->num_steps].func = 
OPP_SET_MPCC_DISCONNECT_PENDING;
-               
seq_state->steps[*seq_state->num_steps].params.opp_set_mpcc_disconnect_pending_params.opp
 = opp;
-               
seq_state->steps[*seq_state->num_steps].params.opp_set_mpcc_disconnect_pending_params.mpcc_inst
 = mpcc_inst;
-               
seq_state->steps[*seq_state->num_steps].params.opp_set_mpcc_disconnect_pending_params.pending
 = pending;
-               (*seq_state->num_steps)++;
-       }
-}
-
 void hwss_add_hubp_disconnect(struct block_sequence_state *seq_state,
                struct hubp *hubp)
 {
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
index c82f941f42ec..b7680326f495 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
@@ -3301,8 +3301,10 @@ void dcn401_plane_atomic_disconnect_sequence(struct dc 
*dc,
        // Phantom pipes have OTG disabled by default, so MPCC_STATUS will 
never assert idle,
        // so don't wait for MPCC_IDLE in the programming sequence
        if (dc_state_get_pipe_subvp_type(state, pipe_ctx) != SUBVP_PHANTOM) {
-               /* Step 2: Set MPCC disconnect pending flag */
-               hwss_add_opp_set_mpcc_disconnect_pending(seq_state, opp, 
pipe_ctx->plane_res.mpcc_inst, true);
+               /* Step 2: Set MPCC disconnect pending flag. Set here rather 
than as a sequence step
+                * because the post-unlock build phase reads it to decide what 
to emit.
+                */
+               opp->mpcc_disconnect_pending[pipe_ctx->plane_res.mpcc_inst] = 
true;
        }
 
        /* Step 3: Set optimized required flag */
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h 
b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
index d7ab21c5a1e4..9ad18c9dcff9 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
+++ b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h
@@ -486,12 +486,6 @@ struct mpc_remove_mpcc_params {
        struct mpcc *mpcc_to_remove;
 };
 
-struct opp_set_mpcc_disconnect_pending_params {
-       struct output_pixel_processor *opp;
-       int mpcc_inst;
-       bool pending;
-};
-
 struct dc_set_optimized_required_params {
        struct dc *dc;
        bool optimized_required;
@@ -1128,7 +1122,6 @@ union block_sequence_params {
        struct set_abm_immediate_disable_params 
set_abm_immediate_disable_params;
        struct set_disp_pattern_generator_params 
set_disp_pattern_generator_params;
        struct mpc_remove_mpcc_params mpc_remove_mpcc_params;
-       struct opp_set_mpcc_disconnect_pending_params 
opp_set_mpcc_disconnect_pending_params;
        struct dc_set_optimized_required_params 
dc_set_optimized_required_params;
        struct hubp_disconnect_params hubp_disconnect_params;
        struct hubbub_force_pstate_change_control_params 
hubbub_force_pstate_change_control_params;
@@ -1299,7 +1292,6 @@ enum block_sequence_func {
        ABM_SET_LEVEL,
        ABM_SET_IMMEDIATE_DISABLE,
        MPC_REMOVE_MPCC,
-       OPP_SET_MPCC_DISCONNECT_PENDING,
        DC_SET_OPTIMIZED_REQUIRED,
        HUBP_DISCONNECT,
        HUBBUB_FORCE_PSTATE_CHANGE_CONTROL,
@@ -2007,8 +1999,6 @@ void hwss_set_abm_immediate_disable(union 
block_sequence_params *params);
 
 void hwss_mpc_remove_mpcc(union block_sequence_params *params);
 
-void hwss_opp_set_mpcc_disconnect_pending(union block_sequence_params *params);
-
 void hwss_dc_set_optimized_required(union block_sequence_params *params);
 
 void hwss_hubp_disconnect(union block_sequence_params *params);
@@ -2323,9 +2313,6 @@ void hwss_add_dsc_calculate_and_set_config(struct 
block_sequence_state *seq_stat
 void hwss_add_mpc_remove_mpcc(struct block_sequence_state *seq_state,
                struct mpc *mpc, struct mpc_tree *mpc_tree_params, struct mpcc 
*mpcc_to_remove);
 
-void hwss_add_opp_set_mpcc_disconnect_pending(struct block_sequence_state 
*seq_state,
-               struct output_pixel_processor *opp, int mpcc_inst, bool 
pending);
-
 void hwss_add_hubp_disconnect(struct block_sequence_state *seq_state,
                struct hubp *hubp);
 
-- 
2.53.0

Reply via email to