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) | |||
4793 | if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt()) | 4793 | if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt()) |
4794 | return -EIO; | 4794 | return -EIO; |
4795 | 4795 | ||
4796 | /* Double layer security blanket, see i915_gem_init() */ | ||
4797 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); | ||
4798 | |||
4796 | if (dev_priv->ellc_size) | 4799 | if (dev_priv->ellc_size) |
4797 | I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf)); | 4800 | I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf)); |
4798 | 4801 | ||
@@ -4825,7 +4828,7 @@ i915_gem_init_hw(struct drm_device *dev) | |||
4825 | for_each_ring(ring, dev_priv, i) { | 4828 | for_each_ring(ring, dev_priv, i) { |
4826 | ret = ring->init_hw(ring); | 4829 | ret = ring->init_hw(ring); |
4827 | if (ret) | 4830 | if (ret) |
4828 | return ret; | 4831 | goto out; |
4829 | } | 4832 | } |
4830 | 4833 | ||
4831 | for (i = 0; i < NUM_L3_SLICES(dev); i++) | 4834 | for (i = 0; i < NUM_L3_SLICES(dev); i++) |
@@ -4842,9 +4845,11 @@ i915_gem_init_hw(struct drm_device *dev) | |||
4842 | DRM_ERROR("Context enable failed %d\n", ret); | 4845 | DRM_ERROR("Context enable failed %d\n", ret); |
4843 | i915_gem_cleanup_ringbuffer(dev); | 4846 | i915_gem_cleanup_ringbuffer(dev); |
4844 | 4847 | ||
4845 | return ret; | 4848 | goto out; |
4846 | } | 4849 | } |
4847 | 4850 | ||
4851 | out: | ||
4852 | intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); | ||
4848 | return ret; | 4853 | return ret; |
4849 | } | 4854 | } |
4850 | 4855 | ||
@@ -4878,6 +4883,14 @@ int i915_gem_init(struct drm_device *dev) | |||
4878 | dev_priv->gt.stop_ring = intel_logical_ring_stop; | 4883 | dev_priv->gt.stop_ring = intel_logical_ring_stop; |
4879 | } | 4884 | } |
4880 | 4885 | ||
4886 | /* This is just a security blanket to placate dragons. | ||
4887 | * On some systems, we very sporadically observe that the first TLBs | ||
4888 | * used by the CS may be stale, despite us poking the TLB reset. If | ||
4889 | * we hold the forcewake during initialisation these problems | ||
4890 | * just magically go away. | ||
4891 | */ | ||
4892 | intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); | ||
4893 | |||
4881 | ret = i915_gem_init_userptr(dev); | 4894 | ret = i915_gem_init_userptr(dev); |
4882 | if (ret) | 4895 | if (ret) |
4883 | goto out_unlock; | 4896 | goto out_unlock; |
@@ -4904,6 +4917,7 @@ int i915_gem_init(struct drm_device *dev) | |||
4904 | } | 4917 | } |
4905 | 4918 | ||
4906 | out_unlock: | 4919 | out_unlock: |
4920 | intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); | ||
4907 | mutex_unlock(&dev->struct_mutex); | 4921 | mutex_unlock(&dev->struct_mutex); |
4908 | 4922 | ||
4909 | return ret; | 4923 | return ret; |