summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmytro Laktyushkin2017-04-21 15:34:09 +0200
committerAlex Deucher2017-09-27 00:06:35 +0200
commitbeb16b6a0f921f66472e4946a4955f07942fa9d8 (patch)
treed1d1a6c02a70b3351f447b8e189674bb55af7482
parentdrm/amd/display: USB-c DP-HDMI dongle shows garbage on Sony TV (diff)
downloadkernel-qcow2-linux-beb16b6a0f921f66472e4946a4955f07942fa9d8.tar.gz
kernel-qcow2-linux-beb16b6a0f921f66472e4946a4955f07942fa9d8.tar.xz
kernel-qcow2-linux-beb16b6a0f921f66472e4946a4955f07942fa9d8.zip
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: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com> Acked-by: Harry Wentland <Harry.Wentland@amd.com> Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_stream.c55
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c4
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp_cursor.c4
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h4
7 files changed, 32 insertions, 41 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index 3dbd6c0885d8..23627b14c16c 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -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];
+ 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 &&
- pipe_ctx->ipp && pipe_ctx->surface) {
- struct input_pixel_processor *ipp = pipe_ctx->ipp;
- 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->top_pipe && pipe_ctx->surface != pipe_ctx->top_pipe->surface)
- position->enable = false;
-
- ipp->funcs->ipp_cursor_set_position(ipp, position, &param);
- ret = true;
- }
+ if (pipe_ctx->top_pipe && pipe_ctx->surface != pipe_ctx->top_pipe->surface)
+ pos_cpy.enable = false;
+
+ 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)
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
index d35fa01024f8..5629e3ca6336 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -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 {
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h
index a374ef2c9d0b..434fe2f5a9d7 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h
@@ -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);
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c
index 5b230b17fc5c..f712916563b9 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c
@@ -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(
diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp.h b/drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp.h
index 4b326bcb4600..7f645fde7064 100644
--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp.h
+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp.h
@@ -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);
diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp_cursor.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp_cursor.c
index 15671fd2cb9c..dc81d320f6e5 100644
--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp_cursor.c
+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_ipp_cursor.c
@@ -160,7 +160,7 @@ void dce120_ipp_cursor_set_position(
lock(ipp110, false);
}
-bool dce120_ipp_cursor_set_attributes(
+void dce120_ipp_cursor_set_attributes(
struct input_pixel_processor *ipp,
const struct dc_cursor_attributes *attributes)
{
@@ -189,7 +189,5 @@ bool dce120_ipp_cursor_set_attributes(
/* Unlock Cursor registers. */
lock(ipp110, false);
-
- return true;
}
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h
index 0457bc7a44d4..7928e230eefb 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h
@@ -37,8 +37,6 @@ struct input_pixel_processor {
struct dc_context *ctx;
unsigned int inst;
const struct ipp_funcs *funcs;
-
- unsigned int cusor_width;
};
enum ipp_prescale_mode {
@@ -88,7 +86,7 @@ struct ipp_funcs {
const struct dc_cursor_position *position,
const struct dc_cursor_mi_param *param);
- bool (*ipp_cursor_set_attributes)(
+ void (*ipp_cursor_set_attributes)(
struct input_pixel_processor *ipp,
const struct dc_cursor_attributes *attributes);