diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0130-drm-amd-display-fix-cursor-disappearing-after-resume.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0130-drm-amd-display-fix-cursor-disappearing-after-resume.patch | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0130-drm-amd-display-fix-cursor-disappearing-after-resume.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0130-drm-amd-display-fix-cursor-disappearing-after-resume.patch new file mode 100644 index 00000000..ffbd5f17 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0130-drm-amd-display-fix-cursor-disappearing-after-resume.patch @@ -0,0 +1,97 @@ +From 4ec02986640094ec1646eacabe22dad99394c112 Mon Sep 17 00:00:00 2001 +From: Arindam Nath <arindam.nath@amd.com> +Date: Mon, 9 Jan 2017 11:50:27 +0530 +Subject: [PATCH 0130/4131] 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> +--- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_types.c | 38 ++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +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 fc5b0f0..27783cf 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 +@@ -79,6 +79,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; + +@@ -92,11 +97,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( +@@ -275,6 +310,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; +-- +2.7.4 + |