diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_display.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 80 | 
1 files changed, 39 insertions, 41 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index fae5c1debfad..4dfd6724b3ca 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -41,6 +41,11 @@  #include <drm/drm_fourcc.h>  #include <drm/drm_vblank.h> +static int amdgpu_display_framebuffer_init(struct drm_device *dev, +					   struct amdgpu_framebuffer *rfb, +					   const struct drm_mode_fb_cmd2 *mode_cmd, +					   struct drm_gem_object *obj); +  static void amdgpu_display_flip_callback(struct dma_fence *f,  					 struct dma_fence_cb *cb)  { @@ -113,8 +118,9 @@ static void amdgpu_display_flip_work_func(struct work_struct *__work)  	spin_unlock_irqrestore(&crtc->dev->event_lock, flags); -	DRM_DEBUG_DRIVER("crtc:%d[%p], pflip_stat:AMDGPU_FLIP_SUBMITTED, work: %p,\n", -					 amdgpu_crtc->crtc_id, amdgpu_crtc, work); +	drm_dbg_vbl(adev_to_drm(adev), +		    "crtc:%d[%p], pflip_stat:AMDGPU_FLIP_SUBMITTED, work: %p,\n", +		    amdgpu_crtc->crtc_id, amdgpu_crtc, work);  } @@ -200,8 +206,7 @@ int amdgpu_display_crtc_page_flip_target(struct drm_crtc *crtc,  		goto unpin;  	} -	/* TODO: Unify this with other drivers */ -	r = dma_resv_get_fences(new_abo->tbo.base.resv, true, +	r = dma_resv_get_fences(new_abo->tbo.base.resv, DMA_RESV_USAGE_WRITE,  				&work->shared_count,  				&work->shared);  	if (unlikely(r != 0)) { @@ -1039,35 +1044,11 @@ static int amdgpu_display_get_fb_info(const struct amdgpu_framebuffer *amdgpu_fb  	return r;  } -int amdgpu_display_gem_fb_init(struct drm_device *dev, -			       struct amdgpu_framebuffer *rfb, -			       const struct drm_mode_fb_cmd2 *mode_cmd, -			       struct drm_gem_object *obj) -{ -	int ret; - -	rfb->base.obj[0] = obj; -	drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd); - -	ret = amdgpu_display_framebuffer_init(dev, rfb, mode_cmd, obj); -	if (ret) -		goto err; - -	ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs); -	if (ret) -		goto err; - -	return 0; -err: -	drm_dbg_kms(dev, "Failed to init gem fb: %d\n", ret); -	rfb->base.obj[0] = NULL; -	return ret; -} - -int amdgpu_display_gem_fb_verify_and_init( -	struct drm_device *dev, struct amdgpu_framebuffer *rfb, -	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd, -	struct drm_gem_object *obj) +static int amdgpu_display_gem_fb_verify_and_init(struct drm_device *dev, +						 struct amdgpu_framebuffer *rfb, +						 struct drm_file *file_priv, +						 const struct drm_mode_fb_cmd2 *mode_cmd, +						 struct drm_gem_object *obj)  {  	int ret; @@ -1099,10 +1080,10 @@ err:  	return ret;  } -int amdgpu_display_framebuffer_init(struct drm_device *dev, -				    struct amdgpu_framebuffer *rfb, -				    const struct drm_mode_fb_cmd2 *mode_cmd, -				    struct drm_gem_object *obj) +static int amdgpu_display_framebuffer_init(struct drm_device *dev, +					   struct amdgpu_framebuffer *rfb, +					   const struct drm_mode_fb_cmd2 *mode_cmd, +					   struct drm_gem_object *obj)  {  	struct amdgpu_device *adev = drm_to_adev(dev);  	int ret, i; @@ -1547,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); @@ -1582,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; |