diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_fbdev.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_fbdev.c | 24 | 
1 files changed, 18 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index f76b06293eb9..38825b30db16 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -210,6 +210,7 @@ static int intelfb_create(struct drm_fb_helper *helper,  	bool prealloc = false;  	void __iomem *vaddr;  	struct drm_i915_gem_object *obj; +	struct i915_gem_ww_ctx ww;  	int ret;  	mutex_lock(&ifbdev->hpd_lock); @@ -283,13 +284,24 @@ static int intelfb_create(struct drm_fb_helper *helper,  		info->fix.smem_len = vma->size;  	} -	vaddr = i915_vma_pin_iomap(vma); -	if (IS_ERR(vaddr)) { -		drm_err(&dev_priv->drm, -			"Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); -		ret = PTR_ERR(vaddr); -		goto out_unpin; +	for_i915_gem_ww(&ww, ret, false) { +		ret = i915_gem_object_lock(vma->obj, &ww); + +		if (ret) +			continue; + +		vaddr = i915_vma_pin_iomap(vma); +		if (IS_ERR(vaddr)) { +			drm_err(&dev_priv->drm, +				"Failed to remap framebuffer into virtual memory (%pe)\n", vaddr); +			ret = PTR_ERR(vaddr); +			continue; +		}  	} + +	if (ret) +		goto out_unpin; +  	info->screen_base = vaddr;  	info->screen_size = vma->size; |