Commit c2edec16 authored by Sridevi's avatar Sridevi Committed by Alex Deucher
Browse files

drm/amd/display: Fix incorrect cursor position for dcn401



[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: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarSridevi <sarvinde@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 3c603b1f
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -185,14 +185,22 @@ void dpp401_set_cursor_position(
		rec_y_offset = y_pos - (cursor_height - y_hotspot);
	}

	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_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*/
	} 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 + cursor_height <= 0)
		cur_en = 0;  /* not visible beyond top edge*/
+21 −9
Original line number Diff line number Diff line
@@ -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) {
		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);
		}

	} else if (param.rotation == ROTATION_ANGLE_270) {
		// Swap axis and mirror vertically
		uint32_t temp_x = pos_cpy.x;
@@ -1278,10 +1283,17 @@ void dcn401_set_cursor_position(struct pipe_ctx *pipe_ctx)
				pos_cpy.x = pipe_ctx->plane_res.scl_data.recout.width + next_odm_width + next_odm_offset - pos_cpy.y;
				pos_cpy.y = temp_x;
			}
		} else {
			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
		int recout_width =