aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0592-drm-amdgpu-dce10-Use-cursor_set2-hook-for-enabling-d.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0592-drm-amdgpu-dce10-Use-cursor_set2-hook-for-enabling-d.patch')
-rw-r--r--common/recipes-kernel/linux/files/0592-drm-amdgpu-dce10-Use-cursor_set2-hook-for-enabling-d.patch158
1 files changed, 158 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0592-drm-amdgpu-dce10-Use-cursor_set2-hook-for-enabling-d.patch b/common/recipes-kernel/linux/files/0592-drm-amdgpu-dce10-Use-cursor_set2-hook-for-enabling-d.patch
new file mode 100644
index 00000000..8a554ad1
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0592-drm-amdgpu-dce10-Use-cursor_set2-hook-for-enabling-d.patch
@@ -0,0 +1,158 @@
+From f0f0eb67c90413f9a6bdb0ac646e6788722e2250 Mon Sep 17 00:00:00 2001
+From: Alex Deucher <alexander.deucher@amd.com>
+Date: Thu, 24 Sep 2015 17:29:44 -0400
+Subject: [PATCH 0592/1050] drm/amdgpu/dce10: Use cursor_set2 hook for enabling
+ / disabling the HW cursor
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The cursor_set2 hook provides the cursor hotspot position within the
+cursor image. When the hotspot position changes, we can adjust the cursor
+position such that the hotspot doesn't move on the screen. This prevents
+the cursor from appearing to intermittently jump around on the screen
+when the position of the hotspot within the cursor image changes.
+
+Port of radeon commits:
+78b1a6010b46a69bcd47b723a80f92693f26d17b
+3feba08d79c32777a845c3c8a4ab93092bdf6f19
+
+Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 4 ++
+ drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 74 ++++++++++++++++++++++----------
+ 2 files changed, 55 insertions(+), 23 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+index 7bd470d..bd90169 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+@@ -373,6 +373,10 @@ struct amdgpu_crtc {
+ uint32_t crtc_offset;
+ struct drm_gem_object *cursor_bo;
+ uint64_t cursor_addr;
++ int cursor_x;
++ int cursor_y;
++ int cursor_hot_x;
++ int cursor_hot_y;
+ int cursor_width;
+ int cursor_height;
+ int max_cursor_width;
+diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+index d4c82b6..9fc1f3c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+@@ -2523,20 +2523,8 @@ static void dce_v10_0_show_cursor(struct drm_crtc *crtc)
+ WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);
+ }
+
+-static void dce_v10_0_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj,
+- uint64_t gpu_addr)
+-{
+- struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
+- struct amdgpu_device *adev = crtc->dev->dev_private;
+-
+- WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
+- upper_32_bits(gpu_addr));
+- WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
+- lower_32_bits(gpu_addr));
+-}
+-
+-static int dce_v10_0_crtc_cursor_move(struct drm_crtc *crtc,
+- int x, int y)
++static int dce_v10_0_cursor_move_locked(struct drm_crtc *crtc,
++ int x, int y)
+ {
+ struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
+ struct amdgpu_device *adev = crtc->dev->dev_private;
+@@ -2556,21 +2544,61 @@ static int dce_v10_0_crtc_cursor_move(struct drm_crtc *crtc,
+ y = 0;
+ }
+
+- dce_v10_0_lock_cursor(crtc, true);
+ WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y);
+ WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin);
+ WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset,
+ ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1));
+- dce_v10_0_lock_cursor(crtc, false);
++
++ amdgpu_crtc->cursor_x = x;
++ amdgpu_crtc->cursor_y = y;
+
+ return 0;
+ }
+
+-static int dce_v10_0_crtc_cursor_set(struct drm_crtc *crtc,
+- struct drm_file *file_priv,
+- uint32_t handle,
+- uint32_t width,
+- uint32_t height)
++static void dce_v10_0_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj,
++ uint64_t gpu_addr, int hot_x, int hot_y)
++{
++ struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
++ struct amdgpu_device *adev = crtc->dev->dev_private;
++
++ WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
++ upper_32_bits(gpu_addr));
++ WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
++ lower_32_bits(gpu_addr));
++
++ if (hot_x != amdgpu_crtc->cursor_hot_x ||
++ hot_y != amdgpu_crtc->cursor_hot_y) {
++ int x, y;
++
++ x = amdgpu_crtc->cursor_x + amdgpu_crtc->cursor_hot_x - hot_x;
++ y = amdgpu_crtc->cursor_y + amdgpu_crtc->cursor_hot_y - hot_y;
++
++ dce_v10_0_cursor_move_locked(crtc, x, y);
++
++ amdgpu_crtc->cursor_hot_x = hot_x;
++ amdgpu_crtc->cursor_hot_y = hot_y;
++ }
++}
++
++static int dce_v10_0_crtc_cursor_move(struct drm_crtc *crtc,
++ int x, int y)
++{
++ int ret;
++
++ dce_v10_0_lock_cursor(crtc, true);
++ ret = dce_v10_0_cursor_move_locked(crtc, x, y);
++ dce_v10_0_lock_cursor(crtc, false);
++
++ return ret;
++}
++
++static int dce_v10_0_crtc_cursor_set2(struct drm_crtc *crtc,
++ struct drm_file *file_priv,
++ uint32_t handle,
++ uint32_t width,
++ uint32_t height,
++ int32_t hot_x,
++ int32_t hot_y)
+ {
+ struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
+ struct drm_gem_object *obj;
+@@ -2611,7 +2639,7 @@ static int dce_v10_0_crtc_cursor_set(struct drm_crtc *crtc,
+ amdgpu_crtc->cursor_height = height;
+
+ dce_v10_0_lock_cursor(crtc, true);
+- dce_v10_0_set_cursor(crtc, obj, gpu_addr);
++ dce_v10_0_set_cursor(crtc, obj, gpu_addr, hot_x, hot_y);
+ dce_v10_0_show_cursor(crtc);
+ dce_v10_0_lock_cursor(crtc, false);
+
+@@ -2659,7 +2687,7 @@ static void dce_v10_0_crtc_destroy(struct drm_crtc *crtc)
+ }
+
+ static const struct drm_crtc_funcs dce_v10_0_crtc_funcs = {
+- .cursor_set = dce_v10_0_crtc_cursor_set,
++ .cursor_set2 = dce_v10_0_crtc_cursor_set2,
+ .cursor_move = dce_v10_0_crtc_cursor_move,
+ .gamma_set = dce_v10_0_crtc_gamma_set,
+ .set_config = amdgpu_crtc_set_config,
+--
+1.9.1
+