diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index b3d8f766fa7f..ab875df41aba 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -460,7 +460,7 @@ static bool stop_ring(struct intel_engine_cs *ring) if (!IS_GEN2(ring->dev)) { I915_WRITE_MODE(ring, _MASKED_BIT_ENABLE(STOP_RING)); - if (wait_for_atomic((I915_READ_MODE(ring) & MODE_IDLE) != 0, 1000)) { + if (wait_for((I915_READ_MODE(ring) & MODE_IDLE) != 0, 1000)) { DRM_ERROR("%s :timed out trying to stop ring\n", ring->name); return false; } @@ -470,11 +470,19 @@ static bool stop_ring(struct intel_engine_cs *ring) I915_WRITE_HEAD(ring, 0); ring->write_tail(ring, 0); + if (wait_for((I915_READ_HEAD(ring) & HEAD_ADDR) == 0, 1000)) + DRM_ERROR("%s :timed out waiting for HEAD to clear\n", ring->name); + + printk("After stop HEAD=0x%08x\n", I915_READ_HEAD(ring)); + + if (!IS_GEN2(ring->dev)) { (void)I915_READ_CTL(ring); I915_WRITE_MODE(ring, _MASKED_BIT_DISABLE(STOP_RING)); } + printk("After restart HEAD=0x%08x\n", I915_READ_HEAD(ring)); + return (I915_READ_HEAD(ring) & HEAD_ADDR) == 0; } @@ -488,6 +496,8 @@ static int init_ring_common(struct intel_engine_cs *ring) gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL); + printk("Before init HEAD=0x%08x\n", I915_READ_HEAD(ring)); + if (!stop_ring(ring)) { /* G45 ring initialization often fails to reset head to zero */ DRM_DEBUG_KMS("%s head not reset to zero " @@ -516,6 +526,8 @@ static int init_ring_common(struct intel_engine_cs *ring) else ring_setup_phys_status_page(ring); + printk("After hws HEAD=0x%08x\n", I915_READ_HEAD(ring)); + /* Initialize the ring. This must happen _after_ we've cleared the ring * registers with the above sequence (the readback of the HEAD registers * also enforces ordering), otherwise the hw might lose the new ring @@ -525,6 +537,8 @@ static int init_ring_common(struct intel_engine_cs *ring) ((ringbuf->size - PAGE_SIZE) & RING_NR_PAGES) | RING_VALID); + printk("After init HEAD=0x%08x\n", I915_READ_HEAD(ring)); + /* If the head is still not zero, the ring is dead */ if (wait_for((I915_READ_CTL(ring) & RING_VALID) != 0 && I915_READ_START(ring) == i915_gem_obj_ggtt_offset(obj) && @@ -539,6 +553,8 @@ static int init_ring_common(struct intel_engine_cs *ring) goto out; } + printk("After wait HEAD=0x%08x\n", I915_READ_HEAD(ring)); + if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) i915_kernel_lost_context(ring->dev); else {