aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-02-14 14:53:51 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-02-19 18:21:47 -0500
commitb9e1faa7634e68bfcdff00a8e9378fcb662a7f30 (patch)
tree09f6b05252a5b336ed6f55fd0ec2c76b98aed910
parent4f7dfb6788dd022446847fbbfbe45e13bedb5be2 (diff)
drm/i915: Fix PIPE_CONTROL DW/QW write through global GTT on IVB+
The bit controlling whether PIPE_CONTROL DW/QW write targets the global GTT or PPGTT moved moved from DW 2 bit 2 to DW 1 bit 24 on IVB. I verified on IVB that the fix is in fact effective. Without the fix none of the scratch writes actually landed in the pipe control page. With the fix the writes show up correctly. v2: move PIPE_CONTROL_GLOBAL_GTT_IVB setup to where other flags are set Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c3
2 files changed, 3 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 2593fefd81f3..7e77396a154e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -308,6 +308,7 @@
308#define DISPLAY_PLANE_A (0<<20) 308#define DISPLAY_PLANE_A (0<<20)
309#define DISPLAY_PLANE_B (1<<20) 309#define DISPLAY_PLANE_B (1<<20)
310#define GFX_OP_PIPE_CONTROL(len) ((0x3<<29)|(0x3<<27)|(0x2<<24)|(len-2)) 310#define GFX_OP_PIPE_CONTROL(len) ((0x3<<29)|(0x3<<27)|(0x2<<24)|(len-2))
311#define PIPE_CONTROL_GLOBAL_GTT_IVB (1<<24) /* gen7+ */
311#define PIPE_CONTROL_CS_STALL (1<<20) 312#define PIPE_CONTROL_CS_STALL (1<<20)
312#define PIPE_CONTROL_TLB_INVALIDATE (1<<18) 313#define PIPE_CONTROL_TLB_INVALIDATE (1<<18)
313#define PIPE_CONTROL_QW_WRITE (1<<14) 314#define PIPE_CONTROL_QW_WRITE (1<<14)
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 9b8b0588c836..1d5d613eb6be 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -318,6 +318,7 @@ gen7_render_ring_flush(struct intel_ring_buffer *ring,
318 * TLB invalidate requires a post-sync write. 318 * TLB invalidate requires a post-sync write.
319 */ 319 */
320 flags |= PIPE_CONTROL_QW_WRITE; 320 flags |= PIPE_CONTROL_QW_WRITE;
321 flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
321 322
322 /* Workaround: we must issue a pipe_control with CS-stall bit 323 /* Workaround: we must issue a pipe_control with CS-stall bit
323 * set before a pipe_control command that has the state cache 324 * set before a pipe_control command that has the state cache
@@ -331,7 +332,7 @@ gen7_render_ring_flush(struct intel_ring_buffer *ring,
331 332
332 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4)); 333 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4));
333 intel_ring_emit(ring, flags); 334 intel_ring_emit(ring, flags);
334 intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); 335 intel_ring_emit(ring, scratch_addr);
335 intel_ring_emit(ring, 0); 336 intel_ring_emit(ring, 0);
336 intel_ring_advance(ring); 337 intel_ring_advance(ring);
337 338