]> Gentwo Git Trees - linux/.git/commitdiff
drm/amd/display: Add cursor offload abort to the new HWSS path
authorNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Tue, 11 Nov 2025 18:39:52 +0000 (13:39 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 26 Nov 2025 16:34:26 +0000 (11:34 -0500)
[HOW]
If cursor attributes or position are passed into DC via a stream update
and we take the newer HWSS paths then it's possible that the update
races with cursor offloading if it's enabled.

This can cause the cursor to remain on the screen if no further updates
come in if it results in HW cursor support being disabled.

[HOW]
Add the abort into the HWSS path so that cursor offloading doesn't
attempt to reprogram the cursor with outdated params.

Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Dillon Varone <dillon.varone@amd.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h

index a01cb2897aabb44eef6fb0ddecb7a50fe4e1cdf1..e2763b60482a09d07592f427ebb75e715dbea649 100644 (file)
@@ -1293,6 +1293,9 @@ void hwss_execute_sequence(struct dc *dc,
                case HUBP_MEM_PROGRAM_VIEWPORT:
                        hwss_hubp_mem_program_viewport(params);
                        break;
+               case ABORT_CURSOR_OFFLOAD_UPDATE:
+                       hwss_abort_cursor_offload_update(params);
+                       break;
                case SET_CURSOR_ATTRIBUTE:
                        hwss_set_cursor_attribute(params);
                        break;
@@ -3076,6 +3079,15 @@ void hwss_hubp_mem_program_viewport(union block_sequence_params *params)
                hubp->funcs->mem_program_viewport(hubp, viewport, viewport_c);
 }
 
+void hwss_abort_cursor_offload_update(union block_sequence_params *params)
+{
+       struct dc *dc = params->abort_cursor_offload_update_params.dc;
+       struct pipe_ctx *pipe_ctx = params->abort_cursor_offload_update_params.pipe_ctx;
+
+       if (dc && dc->hwss.abort_cursor_offload_update)
+               dc->hwss.abort_cursor_offload_update(dc, pipe_ctx);
+}
+
 void hwss_set_cursor_attribute(union block_sequence_params *params)
 {
        struct dc *dc = params->set_cursor_attribute_params.dc;
@@ -3934,6 +3946,18 @@ void hwss_add_hubp_mem_program_viewport(struct block_sequence_state *seq_state,
        }
 }
 
+void hwss_add_abort_cursor_offload_update(struct block_sequence_state *seq_state,
+               struct dc *dc,
+               struct pipe_ctx *pipe_ctx)
+{
+       if (*seq_state->num_steps < MAX_HWSS_BLOCK_SEQUENCE_SIZE) {
+               seq_state->steps[*seq_state->num_steps].func = ABORT_CURSOR_OFFLOAD_UPDATE;
+               seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.dc = dc;
+               seq_state->steps[*seq_state->num_steps].params.abort_cursor_offload_update_params.pipe_ctx = pipe_ctx;
+               (*seq_state->num_steps)++;
+       }
+}
+
 void hwss_add_set_cursor_attribute(struct block_sequence_state *seq_state,
                struct dc *dc,
                struct pipe_ctx *pipe_ctx)
index e75bf409a3d864426afeac9d0022fa8b88bfe6d7..2fbc22afb89c5a76094117ec2d9c49b4b95276ad 100644 (file)
@@ -3673,6 +3673,8 @@ void dcn401_update_dchubp_dpp_sequence(struct dc *dc,
             pipe_ctx->update_flags.bits.scaler || viewport_changed == true) &&
            pipe_ctx->stream->cursor_attributes.address.quad_part != 0) {
 
+               hwss_add_abort_cursor_offload_update(seq_state, dc, pipe_ctx);
+
                hwss_add_set_cursor_attribute(seq_state, dc, pipe_ctx);
 
                /* Step 15: Cursor position setup */
index 3772b4aa11cc16f34289ca2e708717651cb24da3..8ed9eea40c56462fdae83a2d4f516f681d724e45 100644 (file)
@@ -696,6 +696,11 @@ struct hubp_program_mcache_id_and_split_coordinate_params {
        struct mcache_regs_struct *mcache_regs;
 };
 
+struct abort_cursor_offload_update_params {
+       struct dc *dc;
+       struct pipe_ctx *pipe_ctx;
+};
+
 struct set_cursor_attribute_params {
        struct dc *dc;
        struct pipe_ctx *pipe_ctx;
@@ -842,6 +847,7 @@ union block_sequence_params {
        struct mpc_insert_plane_params mpc_insert_plane_params;
        struct dpp_set_scaler_params dpp_set_scaler_params;
        struct hubp_mem_program_viewport_params hubp_mem_program_viewport_params;
+       struct abort_cursor_offload_update_params abort_cursor_offload_update_params;
        struct set_cursor_attribute_params set_cursor_attribute_params;
        struct set_cursor_position_params set_cursor_position_params;
        struct set_cursor_sdr_white_level_params set_cursor_sdr_white_level_params;
@@ -960,6 +966,7 @@ enum block_sequence_func {
        MPC_INSERT_PLANE,
        DPP_SET_SCALER,
        HUBP_MEM_PROGRAM_VIEWPORT,
+       ABORT_CURSOR_OFFLOAD_UPDATE,
        SET_CURSOR_ATTRIBUTE,
        SET_CURSOR_POSITION,
        SET_CURSOR_SDR_WHITE_LEVEL,
@@ -1565,6 +1572,8 @@ void hwss_dpp_set_scaler(union block_sequence_params *params);
 
 void hwss_hubp_mem_program_viewport(union block_sequence_params *params);
 
+void hwss_abort_cursor_offload_update(union block_sequence_params *params);
+
 void hwss_set_cursor_attribute(union block_sequence_params *params);
 
 void hwss_set_cursor_position(union block_sequence_params *params);
@@ -1961,6 +1970,10 @@ void hwss_add_hubp_mem_program_viewport(struct block_sequence_state *seq_state,
                const struct rect *viewport,
                const struct rect *viewport_c);
 
+void hwss_add_abort_cursor_offload_update(struct block_sequence_state *seq_state,
+               struct dc *dc,
+               struct pipe_ctx *pipe_ctx);
+
 void hwss_add_set_cursor_attribute(struct block_sequence_state *seq_state,
                struct dc *dc,
                struct pipe_ctx *pipe_ctx);