Commit f528ee14 authored by Hamza Mahfooz's avatar Hamza Mahfooz Committed by Alex Deucher
Browse files

drm/amd/display: fix hw rotated modes when PSR-SU is enabled



We currently don't support dirty rectangles on hardware rotated modes.
So, if a user is using hardware rotated modes with PSR-SU enabled,
use PSR-SU FFU for all rotated planes (including cursor planes).

Cc: stable@vger.kernel.org
Fixes: 30ebe415 ("drm/amd/display: add FB_DAMAGE_CLIPS support")
Reported-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/2952


Tested-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Tested-by: default avatarBin Li <binli@gnome.org>
Reviewed-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Signed-off-by: default avatarHamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent dbfbf474
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -5182,6 +5182,9 @@ static void fill_dc_dirty_rects(struct drm_plane *plane,
	if (plane->type == DRM_PLANE_TYPE_CURSOR)
		return;

	if (new_plane_state->rotation != DRM_MODE_ROTATE_0)
		goto ffu;

	num_clips = drm_plane_get_damage_clips_count(new_plane_state);
	clips = drm_plane_get_damage_clips(new_plane_state);

+1 −0
Original line number Diff line number Diff line
@@ -465,6 +465,7 @@ struct dc_cursor_mi_param {
	struct fixed31_32 v_scale_ratio;
	enum dc_rotation_angle rotation;
	bool mirror;
	struct dc_stream_state *stream;
};

/* IPP related types */
+10 −2
Original line number Diff line number Diff line
@@ -1077,9 +1077,17 @@ void hubp2_cursor_set_position(
	if (src_y_offset < 0)
		src_y_offset = 0;
	/* Save necessary cursor info x, y position. w, h is saved in attribute func. */
	if (param->stream->link->psr_settings.psr_version >= DC_PSR_VERSION_SU_1 &&
	    param->rotation != ROTATION_ANGLE_0) {
		hubp->cur_rect.x = 0;
		hubp->cur_rect.y = 0;
		hubp->cur_rect.w = param->stream->timing.h_addressable;
		hubp->cur_rect.h = param->stream->timing.v_addressable;
	} else {
		hubp->cur_rect.x = src_x_offset + param->viewport.x;
		hubp->cur_rect.y = src_y_offset + param->viewport.y;
	}
}

void hubp2_clk_cntl(struct hubp *hubp, bool enable)
{
+2 −1
Original line number Diff line number Diff line
@@ -3417,7 +3417,8 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
		.h_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.horz,
		.v_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.vert,
		.rotation = pipe_ctx->plane_state->rotation,
		.mirror = pipe_ctx->plane_state->horizontal_mirror
		.mirror = pipe_ctx->plane_state->horizontal_mirror,
		.stream = pipe_ctx->stream,
	};
	bool pipe_split_on = false;
	bool odm_combine_on = (pipe_ctx->next_odm_pipe != NULL) ||