aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-08-07 03:54:14 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-08-08 04:23:35 -0400
commit0d8957c8a90bbb5d34fab9a304459448a5131e06 (patch)
tree3bf5709eb9e232b16fc4686b5c1e7d6599c3abee
parentda612d880fbc598ac0efcef579355fb90d4bca4e (diff)
drm/i915: correctly order the ring init sequence
We may only start to set up the new register values after having confirmed that the ring is truely off. Otherwise the hw might lose the newly written register values. This is caught later on in the init sequence, when we check whether the register writes have stuck. Cc: stable@vger.kernel.org Reviewed-by: Jani Nikula <jani.nikula@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50522 Tested-by: Yang Guang <guang.a.yang@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index bf0195a96d53..414af1e2973b 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -289,8 +289,6 @@ static int init_ring_common(struct intel_ring_buffer *ring)
289 I915_WRITE_HEAD(ring, 0); 289 I915_WRITE_HEAD(ring, 0);
290 ring->write_tail(ring, 0); 290 ring->write_tail(ring, 0);
291 291
292 /* Initialize the ring. */
293 I915_WRITE_START(ring, obj->gtt_offset);
294 head = I915_READ_HEAD(ring) & HEAD_ADDR; 292 head = I915_READ_HEAD(ring) & HEAD_ADDR;
295 293
296 /* G45 ring initialization fails to reset head to zero */ 294 /* G45 ring initialization fails to reset head to zero */
@@ -316,6 +314,11 @@ static int init_ring_common(struct intel_ring_buffer *ring)
316 } 314 }
317 } 315 }
318 316
317 /* Initialize the ring. This must happen _after_ we've cleared the ring
318 * registers with the above sequence (the readback of the HEAD registers
319 * also enforces ordering), otherwise the hw might lose the new ring
320 * register values. */
321 I915_WRITE_START(ring, obj->gtt_offset);
319 I915_WRITE_CTL(ring, 322 I915_WRITE_CTL(ring,
320 ((ring->size - PAGE_SIZE) & RING_NR_PAGES) 323 ((ring->size - PAGE_SIZE) & RING_NR_PAGES)
321 | RING_VALID); 324 | RING_VALID);