diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2015-10-08 11:25:38 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-10-14 16:16:27 -0400 |
commit | f9242d1baff77aa148a6220f906870611dbc4746 (patch) | |
tree | 432c2f45bc651945ce83b98b972d3fc39e552e78 | |
parent | ef67e38cfe63c70b7901bd5fdb8a170a94b2ef69 (diff) | |
download | linux-f9242d1baff77aa148a6220f906870611dbc4746.tar.gz |
drm/amdgpu/dce10: Clean up reference counting and pinning of the cursor BOs
Take a GEM reference for and pin the new cursor BO, unpin and drop the GEM reference for the old cursor BO in dce10 crtc_cursor_set2, and use amdgpu_crtc->cursor_addr in dce10 set_cursor. This fixes dce10 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>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 61 |
1 files changed, 24 insertions, 37 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index f2f93b3c5938..17692f3bc961 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c @@ -2537,34 +2537,15 @@ static int dce_v10_0_cursor_move_locked(struct drm_crtc *crtc, return 0; } -static int dce_v10_0_set_cursor(struct drm_crtc *crtc, struct drm_gem_object *obj) +static void dce_v10_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_v10_0_crtc_cursor_move(struct drm_crtc *crtc, @@ -2589,6 +2570,7 @@ static int dce_v10_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) { @@ -2610,6 +2592,21 @@ static int dce_v10_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; @@ -2628,12 +2625,8 @@ static int dce_v10_0_crtc_cursor_set2(struct drm_crtc *crtc, amdgpu_crtc->cursor_hot_y = hot_y; } - ret = dce_v10_0_set_cursor(crtc, obj); - if (ret) - DRM_ERROR("dce_v10_0_set_cursor returned %d, not changing cursor\n", - ret); - else - dce_v10_0_show_cursor(crtc); + dce_v10_0_set_cursor(crtc); + dce_v10_0_show_cursor(crtc); dce_v10_0_lock_cursor(crtc, false); unpin: @@ -2644,8 +2637,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; @@ -2655,7 +2647,6 @@ unpin: static void dce_v10_0_cursor_reset(struct drm_crtc *crtc) { struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); - int ret; if (amdgpu_crtc->cursor_bo) { dce_v10_0_lock_cursor(crtc, true); @@ -2663,12 +2654,8 @@ static void dce_v10_0_cursor_reset(struct drm_crtc *crtc) dce_v10_0_cursor_move_locked(crtc, amdgpu_crtc->cursor_x, amdgpu_crtc->cursor_y); - ret = dce_v10_0_set_cursor(crtc, amdgpu_crtc->cursor_bo); - if (ret) - DRM_ERROR("dce_v10_0_set_cursor returned %d, not showing " - "cursor\n", ret); - else - dce_v10_0_show_cursor(crtc); + dce_v10_0_set_cursor(crtc); + dce_v10_0_show_cursor(crtc); dce_v10_0_lock_cursor(crtc, false); } |