Commit beb16b6a authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher
Browse files

drm/amd/display: improve cursor programming reliability



This change will cache cursor attributes and reprogram them
when enabling cursor after power gating if the attributes were not
yet reprogrammed

Signed-off-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 03f5c686
Loading
Loading
Loading
Loading
+26 −29
Original line number Diff line number Diff line
@@ -182,7 +182,6 @@ bool dc_stream_set_cursor_attributes(
	struct core_stream *stream;
	struct core_dc *core_dc;
	struct resource_context *res_ctx;
	bool ret = false;

	if (NULL == dc_stream) {
		dm_error("DC: dc_stream is NULL!\n");
@@ -200,28 +199,26 @@ bool dc_stream_set_cursor_attributes(
	for (i = 0; i < MAX_PIPES; i++) {
		struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];

		if ((pipe_ctx->stream == stream) &&
			(pipe_ctx->ipp != NULL)) {
			struct input_pixel_processor *ipp = pipe_ctx->ipp;
		if (pipe_ctx->stream != stream || !pipe_ctx->ipp)
			continue;
		if (pipe_ctx->top_pipe && pipe_ctx->surface != pipe_ctx->top_pipe->surface)
			continue;

			if (ipp->funcs->ipp_cursor_set_attributes(
				ipp, attributes))
				ret = true;
		}
		pipe_ctx->ipp->funcs->ipp_cursor_set_attributes(
				pipe_ctx->ipp, attributes);
	}

	return ret;
	return true;
}

bool dc_stream_set_cursor_position(
	const struct dc_stream *dc_stream,
	struct dc_cursor_position *position)
	const struct dc_cursor_position *position)
{
	int i;
	struct core_stream *stream;
	struct core_dc *core_dc;
	struct resource_context *res_ctx;
	bool ret = false;

	if (NULL == dc_stream) {
		dm_error("DC: dc_stream is NULL!\n");
@@ -239,27 +236,27 @@ bool dc_stream_set_cursor_position(

	for (i = 0; i < MAX_PIPES; i++) {
		struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];

		if (pipe_ctx->stream == stream &&
				pipe_ctx->ipp && pipe_ctx->surface) {
		struct input_pixel_processor *ipp = pipe_ctx->ipp;
		struct dc_cursor_position pos_cpy = *position;
		struct dc_cursor_mi_param param = {
			.pixel_clk_khz = dc_stream->timing.pix_clk_khz,
			.ref_clk_khz = res_ctx->pool->ref_clock_inKhz,
			.viewport_x_start = pipe_ctx->scl_data.viewport.x,
			.viewport_width = pipe_ctx->scl_data.viewport.width,
				.h_scale_ratio = pipe_ctx->scl_data.ratios.horz,
			.h_scale_ratio = pipe_ctx->scl_data.ratios.horz
		};

		if (pipe_ctx->stream != stream ||
				!pipe_ctx->ipp || !pipe_ctx->surface)
			continue;

		if (pipe_ctx->top_pipe && pipe_ctx->surface != pipe_ctx->top_pipe->surface)
				position->enable = false;
			pos_cpy.enable = false;

			ipp->funcs->ipp_cursor_set_position(ipp, position, &param);
			ret = true;
		}
		ipp->funcs->ipp_cursor_set_position(ipp, &pos_cpy, &param);
	}

	return ret;
	return true;
}

uint32_t dc_stream_get_vblank_counter(const struct dc_stream *dc_stream)
+1 −1
Original line number Diff line number Diff line
@@ -764,7 +764,7 @@ bool dc_stream_set_cursor_attributes(

bool dc_stream_set_cursor_position(
	const struct dc_stream *stream,
	struct dc_cursor_position *position);
	const struct dc_cursor_position *position);

/* Newer interfaces  */
struct dc_cursor {
+1 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ void dce110_ipp_cursor_set_position(
	const struct dc_cursor_position *position,
	const struct dc_cursor_mi_param *param);

bool dce110_ipp_cursor_set_attributes(
void dce110_ipp_cursor_set_attributes(
	struct input_pixel_processor *ipp,
	const struct dc_cursor_attributes *attributes);

+1 −3
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ void dce110_ipp_cursor_set_position(
	lock(ipp110, false);
}

bool dce110_ipp_cursor_set_attributes(
void dce110_ipp_cursor_set_attributes(
	struct input_pixel_processor *ipp,
	const struct dc_cursor_attributes *attributes)
{
@@ -122,8 +122,6 @@ bool dce110_ipp_cursor_set_attributes(

	/* Unlock Cursor registers. */
	lock(ipp110, false);

	return true;
}

static void enable(
+1 −1
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ void dce120_ipp_cursor_set_position(
	const struct dc_cursor_position *position,
	const struct dc_cursor_mi_param *param);

bool dce120_ipp_cursor_set_attributes(
void dce120_ipp_cursor_set_attributes(
	struct input_pixel_processor *ipp,
	const struct dc_cursor_attributes *attributes);

Loading