]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.0.42/drm-i915-correctly-order-the-ring-init-sequence.patch
drop queue-4.14/mips-make-sure-dt-memory-regions-are-valid.patch
[thirdparty/kernel/stable-queue.git] / releases / 3.0.42 / drm-i915-correctly-order-the-ring-init-sequence.patch
CommitLineData
86069fea
GKH
1From 0d8957c8a90bbb5d34fab9a304459448a5131e06 Mon Sep 17 00:00:00 2001
2From: Daniel Vetter <daniel.vetter@ffwll.ch>
3Date: Tue, 7 Aug 2012 09:54:14 +0200
4Subject: drm/i915: correctly order the ring init sequence
5
6From: Daniel Vetter <daniel.vetter@ffwll.ch>
7
8commit 0d8957c8a90bbb5d34fab9a304459448a5131e06 upstream.
9
10We may only start to set up the new register values after having
11confirmed that the ring is truely off. Otherwise the hw might lose the
12newly written register values. This is caught later on in the init
13sequence, when we check whether the register writes have stuck.
14
15Reviewed-by: Jani Nikula <jani.nikula@intel.com>
16Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50522
17Tested-by: Yang Guang <guang.a.yang@intel.com>
18Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
19Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
20
21---
22 drivers/gpu/drm/i915/intel_ringbuffer.c | 7 +++++--
23 1 file changed, 5 insertions(+), 2 deletions(-)
24
25--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
26+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
27@@ -150,8 +150,6 @@ static int init_ring_common(struct intel
28 I915_WRITE_HEAD(ring, 0);
29 ring->write_tail(ring, 0);
30
31- /* Initialize the ring. */
32- I915_WRITE_START(ring, obj->gtt_offset);
33 head = I915_READ_HEAD(ring) & HEAD_ADDR;
34
35 /* G45 ring initialization fails to reset head to zero */
36@@ -177,6 +175,11 @@ static int init_ring_common(struct intel
37 }
38 }
39
40+ /* Initialize the ring. This must happen _after_ we've cleared the ring
41+ * registers with the above sequence (the readback of the HEAD registers
42+ * also enforces ordering), otherwise the hw might lose the new ring
43+ * register values. */
44+ I915_WRITE_START(ring, obj->gtt_offset);
45 I915_WRITE_CTL(ring,
46 ((ring->size - PAGE_SIZE) & RING_NR_PAGES)
47 | RING_REPORT_64K | RING_VALID);