diff options
author | Zhenyu Wang <zhenyuw@linux.intel.com> | 2010-05-26 22:26:42 -0400 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-05-28 14:11:23 -0400 |
commit | ca76482e0f4b64942c704fa11c620ffd1bdd8475 (patch) | |
tree | efc46cd10d124d04569be2e6e4411aa45a694d91 | |
parent | ab34c226812588de8f341ce48eb32c3fef5155a9 (diff) |
drm/i915: Fix PIPE_CONTROL command on Sandybridge
Sandybridge(Gen6) has new format for PIPE_CONTROL command,
the flush and post-op control are in dword 1 now. This
changes command length field for difference between Ironlake
and Sandybridge.
I tried to test this with noop request and issue PIPE_CONTROL
command for each sequence and track notify interrupts, which
seems work fine. Hopefully we don't need workaround like on
Ironlake for Sandybridge.
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index f6b84fe8099..cea4f1a8709 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -213,7 +213,7 @@ static int init_render_ring(struct drm_device *dev, | |||
213 | #define PIPE_CONTROL_FLUSH(addr) \ | 213 | #define PIPE_CONTROL_FLUSH(addr) \ |
214 | do { \ | 214 | do { \ |
215 | OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | \ | 215 | OUT_RING(GFX_OP_PIPE_CONTROL | PIPE_CONTROL_QW_WRITE | \ |
216 | PIPE_CONTROL_DEPTH_STALL); \ | 216 | PIPE_CONTROL_DEPTH_STALL | 2); \ |
217 | OUT_RING(addr | PIPE_CONTROL_GLOBAL_GTT); \ | 217 | OUT_RING(addr | PIPE_CONTROL_GLOBAL_GTT); \ |
218 | OUT_RING(0); \ | 218 | OUT_RING(0); \ |
219 | OUT_RING(0); \ | 219 | OUT_RING(0); \ |
@@ -236,7 +236,19 @@ render_ring_add_request(struct drm_device *dev, | |||
236 | u32 seqno; | 236 | u32 seqno; |
237 | drm_i915_private_t *dev_priv = dev->dev_private; | 237 | drm_i915_private_t *dev_priv = dev->dev_private; |
238 | seqno = intel_ring_get_seqno(dev, ring); | 238 | seqno = intel_ring_get_seqno(dev, ring); |
239 | if (HAS_PIPE_CONTROL(dev)) { | 239 | |
240 | if (IS_GEN6(dev)) { | ||
241 | BEGIN_LP_RING(6); | ||
242 | OUT_RING(GFX_OP_PIPE_CONTROL | 3); | ||
243 | OUT_RING(PIPE_CONTROL_QW_WRITE | | ||
244 | PIPE_CONTROL_WC_FLUSH | PIPE_CONTROL_IS_FLUSH | | ||
245 | PIPE_CONTROL_NOTIFY); | ||
246 | OUT_RING(dev_priv->seqno_gfx_addr | PIPE_CONTROL_GLOBAL_GTT); | ||
247 | OUT_RING(seqno); | ||
248 | OUT_RING(0); | ||
249 | OUT_RING(0); | ||
250 | ADVANCE_LP_RING(); | ||
251 | } else if (HAS_PIPE_CONTROL(dev)) { | ||
240 | u32 scratch_addr = dev_priv->seqno_gfx_addr + 128; | 252 | u32 scratch_addr = dev_priv->seqno_gfx_addr + 128; |
241 | 253 | ||
242 | /* | 254 | /* |