diff options
author | Eric Anholt <eric@anholt.net> | 2011-12-15 17:20:01 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2011-12-16 12:08:19 -0800 |
commit | 8149956a448cb4147cb009cda9a3a550e9fe8b81 (patch) | |
tree | cfa3a08f9f7a39554bb3aa152aa902e11389eebb | |
parent | 12418dad15349dd1844245da47f0a35ee2a1cfd5 (diff) |
drm/i915: Always flush all caches at the end of gen4/5 render ring batches.
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 82 |
1 files changed, 13 insertions, 69 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index ba7f0d66ad2..04b23ecb467 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c @@ -66,73 +66,6 @@ static u32 i915_gem_get_seqno(struct drm_device *dev) return seqno; } -static int -render_ring_flush(struct intel_ring_buffer *ring, - u32 invalidate_domains, - u32 flush_domains) -{ - struct drm_device *dev = ring->dev; - u32 cmd; - int ret; - - /* - * read/write caches: - * - * I915_GEM_DOMAIN_RENDER is always invalidated, but is - * only flushed if MI_NO_WRITE_FLUSH is unset. On 965, it is - * also flushed at 2d versus 3d pipeline switches. - * - * read-only caches: - * - * I915_GEM_DOMAIN_SAMPLER is flushed on pre-965 if - * MI_READ_FLUSH is set, and is always flushed on 965. - * - * I915_GEM_DOMAIN_COMMAND may not exist? - * - * I915_GEM_DOMAIN_INSTRUCTION, which exists on 965, is - * invalidated when MI_EXE_FLUSH is set. - * - * I915_GEM_DOMAIN_VERTEX, which exists on 965, is - * invalidated with every MI_FLUSH. - * - * TLBs: - * - * On 965, TLBs associated with I915_GEM_DOMAIN_COMMAND - * and I915_GEM_DOMAIN_CPU in are invalidated at PTE write and - * I915_GEM_DOMAIN_RENDER and I915_GEM_DOMAIN_SAMPLER - * are flushed at any MI_FLUSH. - */ - - cmd = MI_FLUSH | MI_NO_WRITE_FLUSH; - if ((invalidate_domains|flush_domains) & - I915_GEM_DOMAIN_RENDER) - cmd &= ~MI_NO_WRITE_FLUSH; - if (INTEL_INFO(dev)->gen < 4) { - /* - * On the 965, the sampler cache always gets flushed - * and this bit is reserved. - */ - if (invalidate_domains & I915_GEM_DOMAIN_SAMPLER) - cmd |= MI_READ_FLUSH; - } - if (invalidate_domains & I915_GEM_DOMAIN_INSTRUCTION) - cmd |= MI_EXE_FLUSH; - - if (invalidate_domains & I915_GEM_DOMAIN_COMMAND && - (IS_G4X(dev) || IS_GEN5(dev))) - cmd |= MI_INVALIDATE_ISP; - - ret = intel_ring_begin(ring, 2); - if (ret) - return ret; - - intel_ring_emit(ring, cmd); - intel_ring_emit(ring, MI_NOOP); - intel_ring_advance(ring); - - return 0; -} - /** * Emits a PIPE_CONTROL with a non-zero post-sync operation, for * implementing two workarounds on gen6. From section 1.4.7.1 @@ -872,9 +805,14 @@ static int gen4_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, u32 offset, u32 len) { + struct drm_device *dev = ring->dev; int ret; + u32 flags = 0; + + if (IS_G4X(dev) || IS_GEN5(dev)) + flags |= MI_INVALIDATE_ISP; - ret = intel_ring_begin(ring, 2); + ret = intel_ring_begin(ring, 4); if (ret) return ret; @@ -883,6 +821,12 @@ gen4_ring_dispatch_execbuffer(struct intel_ring_buffer *ring, MI_BATCH_NON_SECURE_I965); intel_ring_emit(ring, offset); + intel_ring_emit(ring, + MI_FLUSH | + MI_EXE_FLUSH | + flags); + intel_ring_emit(ring, MI_NOOP); + intel_ring_advance(ring); return 0; @@ -1202,7 +1146,7 @@ static const struct intel_ring_buffer render_ring = { .size = 32 * PAGE_SIZE, .init = init_render_ring, .write_tail = ring_write_tail, - .flush = render_ring_flush, + .flush = stub_flush, .add_request = render_ring_add_request, .get_seqno = ring_get_seqno, .irq_get = render_ring_get_irq, |