@@ -4856,11 +4856,25 @@ cleanup_render_ring:
return ret;
}
+static int i915_gem_init_ring_hw(struct drm_device *dev)
+{
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ struct intel_engine_cs *ring;
+ int i, ret;
+
+ for_each_ring(ring, dev_priv, i) {
+ ret = ring->init_hw(ring);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
int
i915_gem_init_hw(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- struct intel_engine_cs *ring;
int ret, i;
if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt())
@@ -4898,13 +4912,7 @@ i915_gem_init_hw(struct drm_device *dev)
*/
init_unused_rings(dev);
- for_each_ring(ring, dev_priv, i) {
- ret = ring->init_hw(ring);
- if (ret)
- goto out;
- }
-
- i915_gem_start_ringbuffers(dev);
+ i915_gem_init_ring_hw(dev);
for (i = 0; i < NUM_L3_SLICES(dev); i++)
i915_gem_l3_remap(&dev_priv->ring[RCS], i);
@@ -4915,6 +4923,9 @@ i915_gem_init_hw(struct drm_device *dev)
i915_gem_cleanup_ringbuffer(dev);
}
+ for (i = 0; i < NUM_L3_SLICES(dev); i++)
+ i915_gem_l3_remap(&dev_priv->ring[RCS], i);
+
ret = i915_gem_context_enable(dev_priv);
if (ret && ret != -EIO) {
DRM_ERROR("Context enable failed %d\n", ret);
@@ -4923,6 +4934,8 @@ i915_gem_init_hw(struct drm_device *dev)
goto out;
}
+ i915_gem_start_ringbuffers(dev);
+
out:
intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
return ret;