|
@@ -2936,9 +2936,9 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
|
|
req = obj->last_read_req;
|
|
|
|
|
|
/* Do this after OLR check to make sure we make forward progress polling
|
|
|
- * on this IOCTL with a timeout <=0 (like busy ioctl)
|
|
|
+ * on this IOCTL with a timeout == 0 (like busy ioctl)
|
|
|
*/
|
|
|
- if (args->timeout_ns <= 0) {
|
|
|
+ if (args->timeout_ns == 0) {
|
|
|
ret = -ETIME;
|
|
|
goto out;
|
|
|
}
|
|
@@ -2948,7 +2948,8 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
|
|
i915_gem_request_reference(req);
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
|
|
|
- ret = __i915_wait_request(req, reset_counter, true, &args->timeout_ns,
|
|
|
+ ret = __i915_wait_request(req, reset_counter, true,
|
|
|
+ args->timeout_ns > 0 ? &args->timeout_ns : NULL,
|
|
|
file->driver_priv);
|
|
|
mutex_lock(&dev->struct_mutex);
|
|
|
i915_gem_request_unreference(req);
|
|
@@ -4792,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));
|
|
|
|
|
@@ -4824,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++)
|
|
@@ -4841,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;
|
|
|
}
|
|
|
|
|
@@ -4877,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;
|
|
@@ -4903,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;
|