aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhenyu Wang <zhenyuw@linux.intel.com>2010-05-26 22:26:42 -0400
committerEric Anholt <eric@anholt.net>2010-05-28 14:11:23 -0400
commitca76482e0f4b64942c704fa11c620ffd1bdd8475 (patch)
treeefc46cd10d124d04569be2e6e4411aa45a694d91
parentab34c226812588de8f341ce48eb32c3fef5155a9 (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.c16
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) \
214do { \ 214do { \
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 /*