diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_cursor.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_cursor.c | 20 | 
1 files changed, 17 insertions, 3 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c index fde25c0d65a..42acc6449dd 100644 --- a/drivers/gpu/drm/radeon/radeon_cursor.c +++ b/drivers/gpu/drm/radeon/radeon_cursor.c @@ -151,7 +151,9 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc,  			   uint32_t height)  {  	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); +	struct radeon_device *rdev = crtc->dev->dev_private;  	struct drm_gem_object *obj; +	struct radeon_bo *robj;  	uint64_t gpu_addr;  	int ret; @@ -173,7 +175,15 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc,  		return -ENOENT;  	} -	ret = radeon_gem_object_pin(obj, RADEON_GEM_DOMAIN_VRAM, &gpu_addr); +	robj = gem_to_radeon_bo(obj); +	ret = radeon_bo_reserve(robj, false); +	if (unlikely(ret != 0)) +		goto fail; +	/* Only 27 bit offset for legacy cursor */ +	ret = radeon_bo_pin_restricted(robj, RADEON_GEM_DOMAIN_VRAM, +				       ASIC_IS_AVIVO(rdev) ? 0 : 1 << 27, +				       &gpu_addr); +	radeon_bo_unreserve(robj);  	if (ret)  		goto fail; @@ -181,14 +191,18 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc,  	radeon_crtc->cursor_height = height;  	radeon_lock_cursor(crtc, true); -	/* XXX only 27 bit offset for legacy cursor */  	radeon_set_cursor(crtc, obj, gpu_addr);  	radeon_show_cursor(crtc);  	radeon_lock_cursor(crtc, false);  unpin:  	if (radeon_crtc->cursor_bo) { -		radeon_gem_object_unpin(radeon_crtc->cursor_bo); +		robj = gem_to_radeon_bo(radeon_crtc->cursor_bo); +		ret = radeon_bo_reserve(robj, false); +		if (likely(ret == 0)) { +			radeon_bo_unpin(robj); +			radeon_bo_unreserve(robj); +		}  		drm_gem_object_unreference_unlocked(radeon_crtc->cursor_bo);  	}  |