diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 40 | 
1 files changed, 17 insertions, 23 deletions
| diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 3a140eedfc83..18de6569d04a 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -330,17 +330,10 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj)  	 * must wait for all rendering to complete to the object (as unbinding  	 * must anyway), and retire the requests.  	 */ -	ret = i915_gem_object_wait(obj, -				   I915_WAIT_INTERRUPTIBLE | -				   I915_WAIT_LOCKED | -				   I915_WAIT_ALL, -				   MAX_SCHEDULE_TIMEOUT, -				   NULL); +	ret = i915_gem_object_set_to_cpu_domain(obj, false);  	if (ret)  		return ret; -	i915_gem_retire_requests(to_i915(obj->base.dev)); -  	while ((vma = list_first_entry_or_null(&obj->vma_list,  					       struct i915_vma,  					       obj_link))) { @@ -4712,17 +4705,19 @@ int i915_gem_suspend(struct drm_i915_private *dev_priv)  	 * state. Fortunately, the kernel_context is disposable and we do  	 * not rely on its state.  	 */ -	ret = i915_gem_switch_to_kernel_context(dev_priv); -	if (ret) -		goto err_unlock; +	if (!i915_terminally_wedged(&dev_priv->gpu_error)) { +		ret = i915_gem_switch_to_kernel_context(dev_priv); +		if (ret) +			goto err_unlock; -	ret = i915_gem_wait_for_idle(dev_priv, -				     I915_WAIT_INTERRUPTIBLE | -				     I915_WAIT_LOCKED); -	if (ret && ret != -EIO) -		goto err_unlock; +		ret = i915_gem_wait_for_idle(dev_priv, +					     I915_WAIT_INTERRUPTIBLE | +					     I915_WAIT_LOCKED); +		if (ret && ret != -EIO) +			goto err_unlock; -	assert_kernel_context_is_current(dev_priv); +		assert_kernel_context_is_current(dev_priv); +	}  	i915_gem_contexts_lost(dev_priv);  	mutex_unlock(&dev->struct_mutex); @@ -4946,8 +4941,6 @@ int i915_gem_init(struct drm_i915_private *dev_priv)  {  	int ret; -	mutex_lock(&dev_priv->drm.struct_mutex); -  	/*  	 * We need to fallback to 4K pages since gvt gtt handling doesn't  	 * support huge page entries - we will need to check either hypervisor @@ -4967,18 +4960,19 @@ int i915_gem_init(struct drm_i915_private *dev_priv)  		dev_priv->gt.cleanup_engine = intel_logical_ring_cleanup;  	} +	ret = i915_gem_init_userptr(dev_priv); +	if (ret) +		return ret; +  	/* This is just a security blanket to placate dragons.  	 * On some systems, we very sporadically observe that the first TLBs  	 * used by the CS may be stale, despite us poking the TLB reset. If  	 * we hold the forcewake during initialisation these problems  	 * just magically go away.  	 */ +	mutex_lock(&dev_priv->drm.struct_mutex);  	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); -	ret = i915_gem_init_userptr(dev_priv); -	if (ret) -		goto out_unlock; -  	ret = i915_gem_init_ggtt(dev_priv);  	if (ret)  		goto out_unlock; |