From: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Currently we initialise the rings, add the first context switch to the ring and execute our golden state then enable (aliasing or full) ppgtt. However, as we enable ppgtt using direct MMIO but load the PD using MI_LRI, we end up executing the context switch and golden render state with an invalid PD generating page faults. To solve this issue, first do the ppgtt PD setup, then set the default context and write the commands to run the render state into the ring, before we activate the ring. This allows us to be sure that the register state is valid before we begin execution. This was spotted when writing the seqno/request conversion, but only with the ERROR capture did I realise that it was a necessity now. RFC: cleanup the error handling in i915_gem_init_hw. v2: added intel_ring_reset v3: adapt to ring->start_ring Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> (v1) Signed-off-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_gem.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 8147e2e..5636351 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -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; -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx