summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArindam Nath <arindam.nath@amd.com>2017-01-09 11:50:27 +0530
committerAlex Deucher <alexander.deucher@amd.com>2017-09-26 17:09:06 -0400
commitcf388c0da8e978ed766b975ceccbf699e98bd476 (patch)
treec83799326c0260ea87c0d21b2fb28a648c1b83bb
parent2555039d129e4e637cbc6a1048d1005dd9c78b7a (diff)
downloadlinux-stable-cf388c0da8e978ed766b975ceccbf699e98bd476.tar.gz
linux-stable-cf388c0da8e978ed766b975ceccbf699e98bd476.tar.bz2
linux-stable-cf388c0da8e978ed766b975ceccbf699e98bd476.zip
drm/amd/display: fix cursor disappearing after resume
Since during suspend, the cursor registers are cleared, once the system resumes back, the cursor remains disabled. cursor_set_attributes() only sets the cursor attributes along with cursor size and surface address, but does not enable the cursor back on. We need to save the current cursor location so that we can resume back to the same location. This is done in dm_crtc_cursor_move(), where we save the current cursor location into cursor_x and cursor_y. Later during resume we use these same values to set the cursor position along with cursor attributes. Signed-off-by: Arindam Nath <arindam.nath@amd.com> Reviewed-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c
index 8807b48bc110..e1b5f7d7b6da 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_types.c
@@ -78,6 +78,11 @@ static void dm_set_cursor(
uint32_t height)
{
struct dc_cursor_attributes attributes;
+ struct dc_cursor_position position;
+ struct drm_crtc *crtc = &amdgpu_crtc->base;
+ int x, y;
+ int xorigin = 0, yorigin = 0;
+
amdgpu_crtc->cursor_width = width;
amdgpu_crtc->cursor_height = height;
@@ -91,11 +96,41 @@ static void dm_set_cursor(
attributes.rotation_angle = 0;
attributes.attribute_flags.value = 0;
+ x = amdgpu_crtc->cursor_x;
+ y = amdgpu_crtc->cursor_y;
+
+ /* avivo cursor are offset into the total surface */
+ x += crtc->primary->state->src_x >> 16;
+ y += crtc->primary->state->src_y >> 16;
+
+ if (x < 0) {
+ xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1);
+ x = 0;
+ }
+ if (y < 0) {
+ yorigin = min(-y, amdgpu_crtc->max_cursor_height - 1);
+ y = 0;
+ }
+
+ position.enable = true;
+ position.x = x;
+ position.y = y;
+
+ position.hot_spot_enable = true;
+ position.x_hotspot = xorigin;
+ position.y_hotspot = yorigin;
+
if (!dc_target_set_cursor_attributes(
amdgpu_crtc->target,
&attributes)) {
DRM_ERROR("DC failed to set cursor attributes\n");
}
+
+ if (!dc_target_set_cursor_position(
+ amdgpu_crtc->target,
+ &position)) {
+ DRM_ERROR("DC failed to set cursor position\n");
+ }
}
static int dm_crtc_unpin_cursor_bo_old(
@@ -274,6 +309,9 @@ static int dm_crtc_cursor_move(struct drm_crtc *crtc,
int xorigin = 0, yorigin = 0;
struct dc_cursor_position position;
+ amdgpu_crtc->cursor_x = x;
+ amdgpu_crtc->cursor_y = y;
+
/* avivo cursor are offset into the total surface */
x += crtc->primary->state->src_x >> 16;
y += crtc->primary->state->src_y >> 16;