drm/amd/display: Fix incorrect cursor position for dcn401
authorSridevi <sarvinde@amd.com>
Fri, 26 Apr 2024 22:06:26 +0000 (18:06 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 29 May 2024 18:38:41 +0000 (14:38 -0400)
[Why]
Incorrect cursor position calculation in some scenarios.  Also for
mirror and rotation cases.

[How]
Fix for incorrect cursor position.  Added new test scenarios for diags
cursor test.  Updated CRC for few of the diags cursor test scenarios.

Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Sridevi <sarvinde@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_cm.c
drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c

index a54b9089f15d24f736159f87f5c5252012cab00d..aef73bd1221a112e968e84288a2c9c8c9127f4c3 100644 (file)
@@ -185,15 +185,23 @@ void dpp401_set_cursor_position(
                rec_y_offset = y_pos - (cursor_height - y_hotspot);
        }
 
-       if (rec_x_offset >= (int)param->recout.width)
-               cur_en = 0;  /* not visible beyond right edge*/
+       if (param->rotation == ROTATION_ANGLE_0 && !param->mirror) {
+               if (rec_x_offset >= (int)param->recout.width)
+                       cur_en = 0;  /* not visible beyond right edge*/
+
+               if (rec_y_offset >= (int)param->recout.height)
+                       cur_en = 0;  /* not visible beyond bottom edge*/
+       } else {
+               if (rec_x_offset > (int)param->recout.width)
+                       cur_en = 0;  /* not visible beyond right edge*/
+
+               if (rec_y_offset > (int)param->recout.height)
+                       cur_en = 0;  /* not visible beyond bottom edge*/
+       }
 
        if (rec_x_offset + cursor_width <= 0)
                cur_en = 0;  /* not visible beyond left edge*/
 
-       if (rec_y_offset >= (int)param->recout.height)
-               cur_en = 0;  /* not visible beyond bottom edge*/
-
        if (rec_y_offset + cursor_height <= 0)
                cur_en = 0;  /* not visible beyond top edge*/
 
index f5333a095adbec646169e02ac4b5d263e1fd5b1a..407a45a3ae2c63003d2f6a5f9b232143d5107624 100644 (file)
@@ -1126,14 +1126,14 @@ void dcn401_set_cursor_position(struct pipe_ctx *pipe_ctx)
         */
 
        if (param.rotation == ROTATION_ANGLE_90 || param.rotation == ROTATION_ANGLE_270) {
-               x_pos = x_pos * pipe_ctx->stream->dst.width /
+               x_pos = pipe_ctx->stream->dst.x + x_pos * pipe_ctx->stream->dst.width /
                        pipe_ctx->stream->src.height;
-               y_pos = y_pos * pipe_ctx->stream->dst.height /
+               y_pos = pipe_ctx->stream->dst.y + y_pos * pipe_ctx->stream->dst.height /
                        pipe_ctx->stream->src.width;
        } else {
-               x_pos = x_pos * pipe_ctx->stream->dst.width /
+               x_pos = pipe_ctx->stream->dst.x + x_pos * pipe_ctx->stream->dst.width /
                        pipe_ctx->stream->src.width;
-               y_pos = y_pos * pipe_ctx->stream->dst.height /
+               y_pos = pipe_ctx->stream->dst.y + y_pos * pipe_ctx->stream->dst.height /
                        pipe_ctx->stream->src.height;
        }
 
@@ -1225,10 +1225,15 @@ void dcn401_set_cursor_position(struct pipe_ctx *pipe_ctx)
                        }
                }
        } else if (param.rotation == ROTATION_ANGLE_90) {
-               uint32_t temp_y = pos_cpy.y;
+               if (!param.mirror) {
+                       uint32_t temp_y = pos_cpy.y;
+
+                       pos_cpy.y = pipe_ctx->plane_res.scl_data.recout.height - pos_cpy.x;
+                       pos_cpy.x = temp_y - prev_odm_width;
+               } else {
+                       swap(pos_cpy.x, pos_cpy.y);
+               }
 
-               pos_cpy.y = pipe_ctx->plane_res.scl_data.recout.height - pos_cpy.x;
-               pos_cpy.x = temp_y - prev_odm_width;
        } else if (param.rotation == ROTATION_ANGLE_270) {
                // Swap axis and mirror vertically
                uint32_t temp_x = pos_cpy.x;
@@ -1279,8 +1284,15 @@ void dcn401_set_cursor_position(struct pipe_ctx *pipe_ctx)
                                pos_cpy.y = temp_x;
                        }
                } else {
-                       pos_cpy.x = pipe_ctx->plane_res.scl_data.recout.width - pos_cpy.y;
-                       pos_cpy.y = temp_x;
+                       if (param.mirror) {
+                               swap(pos_cpy.x, pos_cpy.y);
+
+                               pos_cpy.x = pipe_ctx->plane_res.scl_data.recout.width - pos_cpy.x + 2 * pipe_ctx->plane_res.scl_data.recout.x;
+                               pos_cpy.y = (2 * pipe_ctx->plane_res.scl_data.recout.y) + pipe_ctx->plane_res.scl_data.recout.height - pos_cpy.y;
+                       } else {
+                               pos_cpy.x = pipe_ctx->plane_res.scl_data.recout.width - pos_cpy.y;
+                               pos_cpy.y = temp_x;
+                       }
                }
        } else if (param.rotation == ROTATION_ANGLE_180) {
                // Mirror horizontally and vertically