aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ringbuffer.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-10-13 09:12:17 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2017-10-13 15:57:29 -0400
commit7836cd02f27c03af2fca04b450177c51fc7caf1e (patch)
treeb66fc4309c1fe8701161df78d182bdc38c24e470 /drivers/gpu/drm/i915/intel_ringbuffer.c
parent5d031f4e1618b64344713b8e4f864a6ccc1f31cf (diff)
drm/i915: Keep the rings stopped until they have been re-initialized
Before modifying the ring register (RING_START, HEAD, TAIL, CTL) we first make sure it is stopped (or else the hw may not resample the registers). However, we do not need to let the hw restart until after we have reprogrammed all the rings. This should help prevent situations where pending operations on the ring may resume (because we are trying to re-initialize following an unsuccessful GPU hang, i.e. from i915_gem_unset_wedged). Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103260 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Mika Kuoppala <mika.kuoppala@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171013131218.18013-1-chris@chris-wilson.co.uk Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 4285f09ff8b8..b2a6cb09c6e7 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -484,11 +484,6 @@ static bool stop_ring(struct intel_engine_cs *engine)
484 I915_WRITE_HEAD(engine, 0); 484 I915_WRITE_HEAD(engine, 0);
485 I915_WRITE_TAIL(engine, 0); 485 I915_WRITE_TAIL(engine, 0);
486 486
487 if (INTEL_GEN(dev_priv) > 2) {
488 (void)I915_READ_CTL(engine);
489 I915_WRITE_MODE(engine, _MASKED_BIT_DISABLE(STOP_RING));
490 }
491
492 return (I915_READ_HEAD(engine) & HEAD_ADDR) == 0; 487 return (I915_READ_HEAD(engine) & HEAD_ADDR) == 0;
493} 488}
494 489
@@ -570,6 +565,9 @@ static int init_ring_common(struct intel_engine_cs *engine)
570 565
571 intel_engine_init_hangcheck(engine); 566 intel_engine_init_hangcheck(engine);
572 567
568 if (INTEL_GEN(dev_priv) > 2)
569 I915_WRITE_MODE(engine, _MASKED_BIT_DISABLE(STOP_RING));
570
573out: 571out:
574 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); 572 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
575 573