diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 18 | 
1 files changed, 16 insertions, 2 deletions
| diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index ac7fe39d38a3..5b205863b659 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -4793,6 +4793,9 @@ i915_gem_init_hw(struct drm_device *dev)  	if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt())  		return -EIO; +	/* Double layer security blanket, see i915_gem_init() */ +	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); +  	if (dev_priv->ellc_size)  		I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf)); @@ -4825,7 +4828,7 @@ i915_gem_init_hw(struct drm_device *dev)  	for_each_ring(ring, dev_priv, i) {  		ret = ring->init_hw(ring);  		if (ret) -			return ret; +			goto out;  	}  	for (i = 0; i < NUM_L3_SLICES(dev); i++) @@ -4842,9 +4845,11 @@ i915_gem_init_hw(struct drm_device *dev)  		DRM_ERROR("Context enable failed %d\n", ret);  		i915_gem_cleanup_ringbuffer(dev); -		return ret; +		goto out;  	} +out: +	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);  	return ret;  } @@ -4878,6 +4883,14 @@ int i915_gem_init(struct drm_device *dev)  		dev_priv->gt.stop_ring = intel_logical_ring_stop;  	} +	/* 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. +	 */ +	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); +  	ret = i915_gem_init_userptr(dev);  	if (ret)  		goto out_unlock; @@ -4904,6 +4917,7 @@ int i915_gem_init(struct drm_device *dev)  	}  out_unlock: +	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);  	mutex_unlock(&dev->struct_mutex);  	return ret; | 
