diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_fbdev.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_fbdev.c | 32 | 
1 files changed, 22 insertions, 10 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index f76b06293eb9..673bcdfb7ff6 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; @@ -561,9 +573,9 @@ static void intel_fbdev_initial_config(void *data, async_cookie_t cookie)  		intel_fbdev_unregister(to_i915(ifbdev->helper.dev));  } -void intel_fbdev_initial_config_async(struct drm_device *dev) +void intel_fbdev_initial_config_async(struct drm_i915_private *dev_priv)  { -	struct intel_fbdev *ifbdev = to_i915(dev)->display.fbdev.fbdev; +	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;  	if (!ifbdev)  		return; @@ -706,9 +718,9 @@ void intel_fbdev_output_poll_changed(struct drm_device *dev)  		drm_fb_helper_hotplug_event(&ifbdev->helper);  } -void intel_fbdev_restore_mode(struct drm_device *dev) +void intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)  { -	struct intel_fbdev *ifbdev = to_i915(dev)->display.fbdev.fbdev; +	struct intel_fbdev *ifbdev = dev_priv->display.fbdev.fbdev;  	if (!ifbdev)  		return;  |