diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 74a4d587c312..02f6a9b81083 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -69,19 +69,28 @@ unsigned int intel_ring_update_space(struct intel_ring *ring) | |||
69 | static int | 69 | static int |
70 | gen2_render_ring_flush(struct i915_request *rq, u32 mode) | 70 | gen2_render_ring_flush(struct i915_request *rq, u32 mode) |
71 | { | 71 | { |
72 | unsigned int num_store_dw; | ||
72 | u32 cmd, *cs; | 73 | u32 cmd, *cs; |
73 | 74 | ||
74 | cmd = MI_FLUSH; | 75 | cmd = MI_FLUSH; |
75 | 76 | num_store_dw = 0; | |
76 | if (mode & EMIT_INVALIDATE) | 77 | if (mode & EMIT_INVALIDATE) |
77 | cmd |= MI_READ_FLUSH; | 78 | cmd |= MI_READ_FLUSH; |
79 | if (mode & EMIT_FLUSH) | ||
80 | num_store_dw = 4; | ||
78 | 81 | ||
79 | cs = intel_ring_begin(rq, 2); | 82 | cs = intel_ring_begin(rq, 2 + 3 * num_store_dw); |
80 | if (IS_ERR(cs)) | 83 | if (IS_ERR(cs)) |
81 | return PTR_ERR(cs); | 84 | return PTR_ERR(cs); |
82 | 85 | ||
83 | *cs++ = cmd; | 86 | *cs++ = cmd; |
84 | *cs++ = MI_NOOP; | 87 | while (num_store_dw--) { |
88 | *cs++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL; | ||
89 | *cs++ = i915_scratch_offset(rq->i915); | ||
90 | *cs++ = 0; | ||
91 | } | ||
92 | *cs++ = MI_FLUSH | MI_NO_WRITE_FLUSH; | ||
93 | |||
85 | intel_ring_advance(rq, cs); | 94 | intel_ring_advance(rq, cs); |
86 | 95 | ||
87 | return 0; | 96 | return 0; |