aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-08-07 03:54:14 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-08-26 18:12:11 -0400
commit413b13d9dd468992591bafb55e849c87fb68341c (patch)
treefc574815824ed2efaf99c580d56316643041b9de
parent318095d39c962873a6aa0f31683745cb0420753e (diff)
drm/i915: correctly order the ring init sequence
commit 0d8957c8a90bbb5d34fab9a304459448a5131e06 upstream. 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. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-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 2d6039b4571..3bd85f7e390 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -150,8 +150,6 @@ static int init_ring_common(struct intel_ring_buffer *ring)
150 I915_WRITE_HEAD(ring, 0); 150 I915_WRITE_HEAD(ring, 0);
151 ring->write_tail(ring, 0); 151 ring->write_tail(ring, 0);
152 152
153 /* Initialize the ring. */
154 I915_WRITE_START(ring, obj->gtt_offset);
155 head = I915_READ_HEAD(ring) & HEAD_ADDR; 153 head = I915_READ_HEAD(ring) & HEAD_ADDR;
156 154
157 /* G45 ring initialization fails to reset head to zero */ 155 /* G45 ring initialization fails to reset head to zero */
@@ -177,6 +175,11 @@ static int init_ring_common(struct intel_ring_buffer *ring)
177 } 175 }
178 } 176 }
179 177
178 /* Initialize the ring. This must happen _after_ we've cleared the ring
179 * registers with the above sequence (the readback of the HEAD registers
180 * also enforces ordering), otherwise the hw might lose the new ring
181 * register values. */
182 I915_WRITE_START(ring, obj->gtt_offset);
180 I915_WRITE_CTL(ring, 183 I915_WRITE_CTL(ring,
181 ((ring->size - PAGE_SIZE) & RING_NR_PAGES) 184 ((ring->size - PAGE_SIZE) & RING_NR_PAGES)
182 | RING_REPORT_64K | RING_VALID); 185 | RING_REPORT_64K | RING_VALID);