diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index db086f4bf712..08744aaf44a9 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -360,6 +360,47 @@ gen7_render_ring_flush(struct intel_ring_buffer *ring, | |||
360 | return 0; | 360 | return 0; |
361 | } | 361 | } |
362 | 362 | ||
363 | static int | ||
364 | gen8_render_ring_flush(struct intel_ring_buffer *ring, | ||
365 | u32 invalidate_domains, u32 flush_domains) | ||
366 | { | ||
367 | u32 flags = 0; | ||
368 | u32 scratch_addr = ring->scratch.gtt_offset + 128; | ||
369 | int ret; | ||
370 | |||
371 | flags |= PIPE_CONTROL_CS_STALL; | ||
372 | |||
373 | if (flush_domains) { | ||
374 | flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH; | ||
375 | flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH; | ||
376 | } | ||
377 | if (invalidate_domains) { | ||
378 | flags |= PIPE_CONTROL_TLB_INVALIDATE; | ||
379 | flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE; | ||
380 | flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE; | ||
381 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; | ||
382 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; | ||
383 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; | ||
384 | flags |= PIPE_CONTROL_QW_WRITE; | ||
385 | flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; | ||
386 | } | ||
387 | |||
388 | ret = intel_ring_begin(ring, 6); | ||
389 | if (ret) | ||
390 | return ret; | ||
391 | |||
392 | intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(6)); | ||
393 | intel_ring_emit(ring, flags); | ||
394 | intel_ring_emit(ring, scratch_addr); | ||
395 | intel_ring_emit(ring, 0); | ||
396 | intel_ring_emit(ring, 0); | ||
397 | intel_ring_emit(ring, 0); | ||
398 | intel_ring_advance(ring); | ||
399 | |||
400 | return 0; | ||
401 | |||
402 | } | ||
403 | |||
363 | static void ring_write_tail(struct intel_ring_buffer *ring, | 404 | static void ring_write_tail(struct intel_ring_buffer *ring, |
364 | u32 value) | 405 | u32 value) |
365 | { | 406 | { |
@@ -1817,6 +1858,7 @@ int intel_init_render_ring_buffer(struct drm_device *dev) | |||
1817 | if (INTEL_INFO(dev)->gen == 6) | 1858 | if (INTEL_INFO(dev)->gen == 6) |
1818 | ring->flush = gen6_render_ring_flush; | 1859 | ring->flush = gen6_render_ring_flush; |
1819 | if (INTEL_INFO(dev)->gen >= 8) { | 1860 | if (INTEL_INFO(dev)->gen >= 8) { |
1861 | ring->flush = gen8_render_ring_flush; | ||
1820 | ring->irq_get = gen8_ring_get_irq; | 1862 | ring->irq_get = gen8_ring_get_irq; |
1821 | ring->irq_put = gen8_ring_put_irq; | 1863 | ring->irq_put = gen8_ring_put_irq; |
1822 | } else { | 1864 | } else { |