]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: correct clip x assignment in cursor programming
authorAusef Yousof <auyousof@amd.com>
Mon, 1 Dec 2025 20:03:10 +0000 (15:03 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Sat, 10 Jan 2026 19:21:53 +0000 (14:21 -0500)
[why&how]
primary planes for external displays getting incorrect clip
values, detect such a scenario and pass correct parameters

Reviewed-by: Ovidiu (Ovi) Bunea <ovidiu.bunea@amd.com>
Signed-off-by: Ausef Yousof <auyousof@amd.com>
Signed-off-by: Matthew Stewart <matthew.stewart2@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/dc_hw_types.h
drivers/gpu/drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c

index 6678525172461f80d6bd57b31cee36ad44fa0886..cfa569a7bff1bb109c1a9501061efcdb241767df 100644 (file)
@@ -491,6 +491,12 @@ struct dc_cursor_position {
         * for each plane.
         */
        bool translate_by_source;
+
+       /**
+        * @use_viewport_for_clip: Use viewport position for clip_x calculation
+        * instead of clip_rect. Required to protect against clip being overwritten
+        */
+       bool use_viewport_for_clip;
 };
 
 struct dc_cursor_mi_param {
index fa62e40a9858684e93ffb6e65cd5862bf77697af..8a23763ca98ec9074d514c725125ed20f034e88d 100644 (file)
@@ -3666,7 +3666,11 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
        int y_plane = pipe_ctx->plane_state->dst_rect.y;
        int x_pos = pos_cpy.x;
        int y_pos = pos_cpy.y;
-       int clip_x = pipe_ctx->plane_state->clip_rect.x;
+       bool is_primary_plane = (pipe_ctx->plane_state->layer_index == 0);
+
+       int clip_x = (pos_cpy.use_viewport_for_clip && is_primary_plane &&
+               !odm_combine_on && !pipe_split_on && param.viewport.x != 0)
+               ? param.viewport.x : pipe_ctx->plane_state->clip_rect.x;
        int clip_width = pipe_ctx->plane_state->clip_rect.width;
 
        if ((pipe_ctx->top_pipe != NULL) || (pipe_ctx->bottom_pipe != NULL)) {