diff options
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0600-drm-amdgpu-dce11-Clean-up-reference-counting-and-pin.patch')
-rw-r--r-- | meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0600-drm-amdgpu-dce11-Clean-up-reference-counting-and-pin.patch | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0600-drm-amdgpu-dce11-Clean-up-reference-counting-and-pin.patch b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0600-drm-amdgpu-dce11-Clean-up-reference-counting-and-pin.patch new file mode 100644 index 00000000..9fd2e019 --- /dev/null +++ b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0600-drm-amdgpu-dce11-Clean-up-reference-counting-and-pin.patch @@ -0,0 +1,148 @@ +From f1b34e303a487ce41dcdf62396e49015e800bc7c Mon Sep 17 00:00:00 2001 +From: Alex Deucher <alexander.deucher@amd.com> +Date: Thu, 8 Oct 2015 11:28:49 -0400 +Subject: [PATCH 0600/1050] drm/amdgpu/dce11: Clean up reference counting and + pinning of the cursor BOs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Take a GEM reference for and pin the new cursor BO, unpin and drop the +GEM reference for the old cursor BO in dce11 crtc_cursor_set2, and use +amdgpu_crtc->cursor_addr in dce11 set_cursor. + +This fixes dce11 cursor_reset accidentally incrementing the cursor BO +pin count, and cleans up the code a little. + +Port of radeon commit: +cd404af0c930104462aa91344f07d002cf8248ed + +Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 61 +++++++++++++--------------------- + 1 file changed, 24 insertions(+), 37 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +index 94ccff0..b99c211 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +@@ -2532,34 +2532,15 @@ static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc, + return 0; + } + +-static int dce_v11_0_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj) ++static void dce_v11_0_set_cursor(struct drm_crtc *crtc) + { + struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); + struct amdgpu_device *adev = crtc->dev->dev_private; +- struct amdgpu_bo *aobj = gem_to_amdgpu_bo(obj); +- uint64_t gpu_addr; +- int ret; +- +- ret = amdgpu_bo_reserve(aobj, false); +- if (unlikely(ret != 0)) +- goto fail; +- +- ret = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM, &gpu_addr); +- amdgpu_bo_unreserve(aobj); +- if (ret) +- goto fail; + + WREG32(mmCUR_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset, +- upper_32_bits(gpu_addr)); ++ upper_32_bits(amdgpu_crtc->cursor_addr)); + WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset, +- lower_32_bits(gpu_addr)); +- +- return 0; +- +-fail: +- drm_gem_object_unreference_unlocked(obj); +- +- return ret; ++ lower_32_bits(amdgpu_crtc->cursor_addr)); + } + + static int dce_v11_0_crtc_cursor_move(struct drm_crtc *crtc, +@@ -2584,6 +2565,7 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc, + { + struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); + struct drm_gem_object *obj; ++ struct amdgpu_bo *aobj; + int ret; + + if (!handle) { +@@ -2605,6 +2587,21 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc, + return -ENOENT; + } + ++ aobj = gem_to_amdgpu_bo(obj); ++ ret = amdgpu_bo_reserve(aobj, false); ++ if (ret != 0) { ++ drm_gem_object_unreference_unlocked(obj); ++ return ret; ++ } ++ ++ ret = amdgpu_bo_pin(aobj, AMDGPU_GEM_DOMAIN_VRAM, &amdgpu_crtc->cursor_addr); ++ amdgpu_bo_unreserve(aobj); ++ if (ret) { ++ DRM_ERROR("Failed to pin new cursor BO (%d)\n", ret); ++ drm_gem_object_unreference_unlocked(obj); ++ return ret; ++ } ++ + amdgpu_crtc->cursor_width = width; + amdgpu_crtc->cursor_height = height; + +@@ -2623,12 +2620,8 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc, + amdgpu_crtc->cursor_hot_y = hot_y; + } + +- ret = dce_v11_0_set_cursor(crtc, obj); +- if (ret) +- DRM_ERROR("dce_v11_0_set_cursor returned %d, not changing cursor\n", +- ret); +- else +- dce_v11_0_show_cursor(crtc); ++ dce_v11_0_set_cursor(crtc); ++ dce_v11_0_show_cursor(crtc); + dce_v11_0_lock_cursor(crtc, false); + + unpin: +@@ -2639,8 +2632,7 @@ unpin: + amdgpu_bo_unpin(aobj); + amdgpu_bo_unreserve(aobj); + } +- if (amdgpu_crtc->cursor_bo != obj) +- drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo); ++ drm_gem_object_unreference_unlocked(amdgpu_crtc->cursor_bo); + } + + amdgpu_crtc->cursor_bo = obj; +@@ -2650,7 +2642,6 @@ unpin: + static void dce_v11_0_cursor_reset(struct drm_crtc *crtc) + { + struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); +- int ret; + + if (amdgpu_crtc->cursor_bo) { + dce_v11_0_lock_cursor(crtc, true); +@@ -2658,12 +2649,8 @@ static void dce_v11_0_cursor_reset(struct drm_crtc *crtc) + dce_v11_0_cursor_move_locked(crtc, amdgpu_crtc->cursor_x, + amdgpu_crtc->cursor_y); + +- ret = dce_v11_0_set_cursor(crtc, amdgpu_crtc->cursor_bo); +- if (ret) +- DRM_ERROR("dce_v11_0_set_cursor returned %d, not showing " +- "cursor\n", ret); +- else +- dce_v11_0_show_cursor(crtc); ++ dce_v11_0_set_cursor(crtc); ++ dce_v11_0_show_cursor(crtc); + + dce_v11_0_lock_cursor(crtc, false); + } +-- +1.9.1 + |