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

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
...@@ -182,7 +182,6 @@ bool dc_stream_set_cursor_attributes( ...@@ -182,7 +182,6 @@ bool dc_stream_set_cursor_attributes(
struct core_stream *stream; struct core_stream *stream;
struct core_dc *core_dc; struct core_dc *core_dc;
struct resource_context *res_ctx; struct resource_context *res_ctx;
bool ret = false;
if (NULL == dc_stream) { if (NULL == dc_stream) {
dm_error("DC: dc_stream is NULL!\n"); dm_error("DC: dc_stream is NULL!\n");
...@@ -200,28 +199,26 @@ bool dc_stream_set_cursor_attributes( ...@@ -200,28 +199,26 @@ bool dc_stream_set_cursor_attributes(
for (i = 0; i < MAX_PIPES; i++) { for (i = 0; i < MAX_PIPES; i++) {
struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
if ((pipe_ctx->stream == stream) && if (pipe_ctx->stream != stream || !pipe_ctx->ipp)
(pipe_ctx->ipp != NULL)) { continue;
struct input_pixel_processor *ipp = pipe_ctx->ipp; if (pipe_ctx->top_pipe && pipe_ctx->surface != pipe_ctx->top_pipe->surface)
continue;
if (ipp->funcs->ipp_cursor_set_attributes( pipe_ctx->ipp->funcs->ipp_cursor_set_attributes(
ipp, attributes)) pipe_ctx->ipp, attributes);
ret = true;
}
} }
return ret; return true;
} }
bool dc_stream_set_cursor_position( bool dc_stream_set_cursor_position(
const struct dc_stream *dc_stream, const struct dc_stream *dc_stream,
struct dc_cursor_position *position) const struct dc_cursor_position *position)
{ {
int i; int i;
struct core_stream *stream; struct core_stream *stream;
struct core_dc *core_dc; struct core_dc *core_dc;
struct resource_context *res_ctx; struct resource_context *res_ctx;
bool ret = false;
if (NULL == dc_stream) { if (NULL == dc_stream) {
dm_error("DC: dc_stream is NULL!\n"); dm_error("DC: dc_stream is NULL!\n");
...@@ -239,27 +236,27 @@ bool dc_stream_set_cursor_position( ...@@ -239,27 +236,27 @@ bool dc_stream_set_cursor_position(
for (i = 0; i < MAX_PIPES; i++) { for (i = 0; i < MAX_PIPES; i++) {
struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
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
};
if (pipe_ctx->stream != stream ||
!pipe_ctx->ipp || !pipe_ctx->surface)
continue;
if (pipe_ctx->stream == stream && if (pipe_ctx->top_pipe && pipe_ctx->surface != pipe_ctx->top_pipe->surface)
pipe_ctx->ipp && pipe_ctx->surface) { pos_cpy.enable = false;
struct input_pixel_processor *ipp = pipe_ctx->ipp;
struct dc_cursor_mi_param param = { ipp->funcs->ipp_cursor_set_position(ipp, &pos_cpy, &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,
};
if (pipe_ctx->top_pipe && pipe_ctx->surface != pipe_ctx->top_pipe->surface)
position->enable = false;
ipp->funcs->ipp_cursor_set_position(ipp, position, &param);
ret = true;
}
} }
return ret; return true;
} }
uint32_t dc_stream_get_vblank_counter(const struct dc_stream *dc_stream) uint32_t dc_stream_get_vblank_counter(const struct dc_stream *dc_stream)
......
...@@ -764,7 +764,7 @@ bool dc_stream_set_cursor_attributes( ...@@ -764,7 +764,7 @@ bool dc_stream_set_cursor_attributes(
bool dc_stream_set_cursor_position( bool dc_stream_set_cursor_position(
const struct dc_stream *stream, const struct dc_stream *stream,
struct dc_cursor_position *position); const struct dc_cursor_position *position);
/* Newer interfaces */ /* Newer interfaces */
struct dc_cursor { struct dc_cursor {
......
...@@ -54,7 +54,7 @@ void dce110_ipp_cursor_set_position( ...@@ -54,7 +54,7 @@ void dce110_ipp_cursor_set_position(
const struct dc_cursor_position *position, const struct dc_cursor_position *position,
const struct dc_cursor_mi_param *param); const struct dc_cursor_mi_param *param);
bool dce110_ipp_cursor_set_attributes( void dce110_ipp_cursor_set_attributes(
struct input_pixel_processor *ipp, struct input_pixel_processor *ipp,
const struct dc_cursor_attributes *attributes); const struct dc_cursor_attributes *attributes);
......
...@@ -95,7 +95,7 @@ void dce110_ipp_cursor_set_position( ...@@ -95,7 +95,7 @@ void dce110_ipp_cursor_set_position(
lock(ipp110, false); lock(ipp110, false);
} }
bool dce110_ipp_cursor_set_attributes( void dce110_ipp_cursor_set_attributes(
struct input_pixel_processor *ipp, struct input_pixel_processor *ipp,
const struct dc_cursor_attributes *attributes) const struct dc_cursor_attributes *attributes)
{ {
...@@ -122,8 +122,6 @@ bool dce110_ipp_cursor_set_attributes( ...@@ -122,8 +122,6 @@ bool dce110_ipp_cursor_set_attributes(
/* Unlock Cursor registers. */ /* Unlock Cursor registers. */
lock(ipp110, false); lock(ipp110, false);
return true;
} }
static void enable( static void enable(
......
...@@ -42,7 +42,7 @@ void dce120_ipp_cursor_set_position( ...@@ -42,7 +42,7 @@ void dce120_ipp_cursor_set_position(
const struct dc_cursor_position *position, const struct dc_cursor_position *position,
const struct dc_cursor_mi_param *param); const struct dc_cursor_mi_param *param);
bool dce120_ipp_cursor_set_attributes( void dce120_ipp_cursor_set_attributes(
struct input_pixel_processor *ipp, struct input_pixel_processor *ipp,
const struct dc_cursor_attributes *attributes); const struct dc_cursor_attributes *attributes);
......
...@@ -160,7 +160,7 @@ void dce120_ipp_cursor_set_position( ...@@ -160,7 +160,7 @@ void dce120_ipp_cursor_set_position(
lock(ipp110, false); lock(ipp110, false);
} }
bool dce120_ipp_cursor_set_attributes( void dce120_ipp_cursor_set_attributes(
struct input_pixel_processor *ipp, struct input_pixel_processor *ipp,
const struct dc_cursor_attributes *attributes) const struct dc_cursor_attributes *attributes)
{ {
...@@ -189,7 +189,5 @@ bool dce120_ipp_cursor_set_attributes( ...@@ -189,7 +189,5 @@ bool dce120_ipp_cursor_set_attributes(
/* Unlock Cursor registers. */ /* Unlock Cursor registers. */
lock(ipp110, false); lock(ipp110, false);
return true;
} }
...@@ -37,8 +37,6 @@ struct input_pixel_processor { ...@@ -37,8 +37,6 @@ struct input_pixel_processor {
struct dc_context *ctx; struct dc_context *ctx;
unsigned int inst; unsigned int inst;
const struct ipp_funcs *funcs; const struct ipp_funcs *funcs;
unsigned int cusor_width;
}; };
enum ipp_prescale_mode { enum ipp_prescale_mode {
...@@ -88,7 +86,7 @@ struct ipp_funcs { ...@@ -88,7 +86,7 @@ struct ipp_funcs {
const struct dc_cursor_position *position, const struct dc_cursor_position *position,
const struct dc_cursor_mi_param *param); const struct dc_cursor_mi_param *param);
bool (*ipp_cursor_set_attributes)( void (*ipp_cursor_set_attributes)(
struct input_pixel_processor *ipp, struct input_pixel_processor *ipp,
const struct dc_cursor_attributes *attributes); const struct dc_cursor_attributes *attributes);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment