aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_lrc.c
diff options
context:
space:
mode:
authorOscar Mateo <oscar.mateo@intel.com>2014-07-24 12:04:28 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-08-11 16:44:37 -0400
commit4712274c362b7730a1c6e01c9a51a6d46f5b7f43 (patch)
tree8af0b8f48fce7c1b848b13c4d84ee35df0517524 /drivers/gpu/drm/i915/intel_lrc.c
parent4da46e1e5bb7e7396fad172cdaffbe496562f3d8 (diff)
drm/i915/bdw: GEN-specific logical ring emit flush
Same as the legacy-style ring->flush. v2: The BSD invalidate bit still exists in GEN8! Add it for the VCS rings (but still consolidate the blt and bsd ring flushes into one). This was noticed by Brad Volkin. v3: The command for BSD and for other rings is slightly different: get it exactly the same as in gen6_ring_flush + gen6_bsd_ring_flush Signed-off-by: Oscar Mateo <oscar.mateo@intel.com> Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> [danvet: Checkpatch.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_lrc.c')
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 94f8b4087642..a88fa6e9360b 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -340,6 +340,86 @@ static int gen8_init_render_ring(struct intel_engine_cs *ring)
340 return ret; 340 return ret;
341} 341}
342 342
343static int gen8_emit_flush(struct intel_ringbuffer *ringbuf,
344 u32 invalidate_domains,
345 u32 unused)
346{
347 struct intel_engine_cs *ring = ringbuf->ring;
348 struct drm_device *dev = ring->dev;
349 struct drm_i915_private *dev_priv = dev->dev_private;
350 uint32_t cmd;
351 int ret;
352
353 ret = intel_logical_ring_begin(ringbuf, 4);
354 if (ret)
355 return ret;
356
357 cmd = MI_FLUSH_DW + 1;
358
359 if (ring == &dev_priv->ring[VCS]) {
360 if (invalidate_domains & I915_GEM_GPU_DOMAINS)
361 cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD |
362 MI_FLUSH_DW_STORE_INDEX |
363 MI_FLUSH_DW_OP_STOREDW;
364 } else {
365 if (invalidate_domains & I915_GEM_DOMAIN_RENDER)
366 cmd |= MI_INVALIDATE_TLB | MI_FLUSH_DW_STORE_INDEX |
367 MI_FLUSH_DW_OP_STOREDW;
368 }
369
370 intel_logical_ring_emit(ringbuf, cmd);
371 intel_logical_ring_emit(ringbuf,
372 I915_GEM_HWS_SCRATCH_ADDR |
373 MI_FLUSH_DW_USE_GTT);
374 intel_logical_ring_emit(ringbuf, 0); /* upper addr */
375 intel_logical_ring_emit(ringbuf, 0); /* value */
376 intel_logical_ring_advance(ringbuf);
377
378 return 0;
379}
380
381static int gen8_emit_flush_render(struct intel_ringbuffer *ringbuf,
382 u32 invalidate_domains,
383 u32 flush_domains)
384{
385 struct intel_engine_cs *ring = ringbuf->ring;
386 u32 scratch_addr = ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
387 u32 flags = 0;
388 int ret;
389
390 flags |= PIPE_CONTROL_CS_STALL;
391
392 if (flush_domains) {
393 flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
394 flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
395 }
396
397 if (invalidate_domains) {
398 flags |= PIPE_CONTROL_TLB_INVALIDATE;
399 flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE;
400 flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
401 flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
402 flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
403 flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
404 flags |= PIPE_CONTROL_QW_WRITE;
405 flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
406 }
407
408 ret = intel_logical_ring_begin(ringbuf, 6);
409 if (ret)
410 return ret;
411
412 intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6));
413 intel_logical_ring_emit(ringbuf, flags);
414 intel_logical_ring_emit(ringbuf, scratch_addr);
415 intel_logical_ring_emit(ringbuf, 0);
416 intel_logical_ring_emit(ringbuf, 0);
417 intel_logical_ring_emit(ringbuf, 0);
418 intel_logical_ring_advance(ringbuf);
419
420 return 0;
421}
422
343static u32 gen8_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency) 423static u32 gen8_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency)
344{ 424{
345 return intel_read_status_page(ring, I915_GEM_HWS_INDEX); 425 return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
@@ -451,6 +531,7 @@ static int logical_render_ring_init(struct drm_device *dev)
451 ring->get_seqno = gen8_get_seqno; 531 ring->get_seqno = gen8_get_seqno;
452 ring->set_seqno = gen8_set_seqno; 532 ring->set_seqno = gen8_set_seqno;
453 ring->emit_request = gen8_emit_request; 533 ring->emit_request = gen8_emit_request;
534 ring->emit_flush = gen8_emit_flush_render;
454 535
455 return logical_ring_init(dev, ring); 536 return logical_ring_init(dev, ring);
456} 537}
@@ -470,6 +551,7 @@ static int logical_bsd_ring_init(struct drm_device *dev)
470 ring->get_seqno = gen8_get_seqno; 551 ring->get_seqno = gen8_get_seqno;
471 ring->set_seqno = gen8_set_seqno; 552 ring->set_seqno = gen8_set_seqno;
472 ring->emit_request = gen8_emit_request; 553 ring->emit_request = gen8_emit_request;
554 ring->emit_flush = gen8_emit_flush;
473 555
474 return logical_ring_init(dev, ring); 556 return logical_ring_init(dev, ring);
475} 557}
@@ -489,6 +571,7 @@ static int logical_bsd2_ring_init(struct drm_device *dev)
489 ring->get_seqno = gen8_get_seqno; 571 ring->get_seqno = gen8_get_seqno;
490 ring->set_seqno = gen8_set_seqno; 572 ring->set_seqno = gen8_set_seqno;
491 ring->emit_request = gen8_emit_request; 573 ring->emit_request = gen8_emit_request;
574 ring->emit_flush = gen8_emit_flush;
492 575
493 return logical_ring_init(dev, ring); 576 return logical_ring_init(dev, ring);
494} 577}
@@ -508,6 +591,7 @@ static int logical_blt_ring_init(struct drm_device *dev)
508 ring->get_seqno = gen8_get_seqno; 591 ring->get_seqno = gen8_get_seqno;
509 ring->set_seqno = gen8_set_seqno; 592 ring->set_seqno = gen8_set_seqno;
510 ring->emit_request = gen8_emit_request; 593 ring->emit_request = gen8_emit_request;
594 ring->emit_flush = gen8_emit_flush;
511 595
512 return logical_ring_init(dev, ring); 596 return logical_ring_init(dev, ring);
513} 597}
@@ -527,6 +611,7 @@ static int logical_vebox_ring_init(struct drm_device *dev)
527 ring->get_seqno = gen8_get_seqno; 611 ring->get_seqno = gen8_get_seqno;
528 ring->set_seqno = gen8_set_seqno; 612 ring->set_seqno = gen8_set_seqno;
529 ring->emit_request = gen8_emit_request; 613 ring->emit_request = gen8_emit_request;
614 ring->emit_flush = gen8_emit_flush;
530 615
531 return logical_ring_init(dev, ring); 616 return logical_ring_init(dev, ring);
532} 617}