diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_display.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 25 | 
1 files changed, 21 insertions, 4 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 17c9bbe0cbc5..4dfd6724b3ca 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -1528,6 +1528,21 @@ bool amdgpu_crtc_get_scanout_position(struct drm_crtc *crtc,  						  stime, etime, mode);  } +static bool +amdgpu_display_robj_is_fb(struct amdgpu_device *adev, struct amdgpu_bo *robj) +{ +	struct drm_device *dev = adev_to_drm(adev); +	struct drm_fb_helper *fb_helper = dev->fb_helper; + +	if (!fb_helper || !fb_helper->buffer) +		return false; + +	if (gem_to_amdgpu_bo(fb_helper->buffer->gem) != robj) +		return false; + +	return true; +} +  int amdgpu_display_suspend_helper(struct amdgpu_device *adev)  {  	struct drm_device *dev = adev_to_drm(adev); @@ -1563,10 +1578,12 @@ int amdgpu_display_suspend_helper(struct amdgpu_device *adev)  			continue;  		}  		robj = gem_to_amdgpu_bo(fb->obj[0]); -		r = amdgpu_bo_reserve(robj, true); -		if (r == 0) { -			amdgpu_bo_unpin(robj); -			amdgpu_bo_unreserve(robj); +		if (!amdgpu_display_robj_is_fb(adev, robj)) { +			r = amdgpu_bo_reserve(robj, true); +			if (r == 0) { +				amdgpu_bo_unpin(robj); +				amdgpu_bo_unreserve(robj); +			}  		}  	}  	return 0; |