aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ringbuffer.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2017-11-20 15:55:01 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2017-11-20 16:54:58 -0500
commit79e6770cb1f5e32eb49590edbb794a97d0113aed (patch)
treec62d7a3feac949fcc25906753ca3917eed38091b /drivers/gpu/drm/i915/intel_ringbuffer.c
parentfb5c551ad510e4a408c105670f89c725ebbfe6c8 (diff)
drm/i915: Remove obsolete ringbuffer emission for gen8+
Since removing the module parameter to force selection of ringbuffer emission for gen8, the code is defunct. Remove it. To put the difference into perspective, a couple of microbenchmarks (bdw i7-5557u, 20170324): ring execlists exec continuous nops on all rings: 1.491us 2.223us exec sequential nops on each ring: 12.508us 53.682us single nop + sync: 9.272us 30.291us vblank_mode=0 glxgears: ~11000fps ~9000fps Since the earlier submission, gen8 ringbuffer submission has fallen further and further behind in features. So while ringbuffer may hold the throughput crown, in terms of interactive latency, execlists is much better. Alas, we have no convenient metrics for such, other than demonstrating things we can do with execlists but can not using legacy ringbuffer submission. We have made a few improvements to lowlevel execlists throughput, and ringbuffer currently panics on boot! (bdw i7-5557u, 20171026): ring execlists exec continuous nops on all rings: n/a 1.921us exec sequential nops on each ring: n/a 44.621us single nop + sync: n/a 21.953us vblank_mode=0 glxgears: n/a ~18500fps References: https://bugs.freedesktop.org/show_bug.cgi?id=87725 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Once-upon-a-time-Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171120205504.21892-2-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c431
1 files changed, 63 insertions, 368 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index be98868115bf..5465e708545f 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -340,50 +340,6 @@ gen7_render_ring_flush(struct drm_i915_gem_request *req, u32 mode)
340 return 0; 340 return 0;
341} 341}
342 342
343static int
344gen8_render_ring_flush(struct drm_i915_gem_request *req, u32 mode)
345{
346 u32 flags;
347 u32 *cs;
348
349 cs = intel_ring_begin(req, mode & EMIT_INVALIDATE ? 12 : 6);
350 if (IS_ERR(cs))
351 return PTR_ERR(cs);
352
353 flags = PIPE_CONTROL_CS_STALL;
354
355 if (mode & EMIT_FLUSH) {
356 flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
357 flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
358 flags |= PIPE_CONTROL_DC_FLUSH_ENABLE;
359 flags |= PIPE_CONTROL_FLUSH_ENABLE;
360 }
361 if (mode & EMIT_INVALIDATE) {
362 flags |= PIPE_CONTROL_TLB_INVALIDATE;
363 flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE;
364 flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
365 flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
366 flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
367 flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
368 flags |= PIPE_CONTROL_QW_WRITE;
369 flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
370
371 /* WaCsStallBeforeStateCacheInvalidate:bdw,chv */
372 cs = gen8_emit_pipe_control(cs,
373 PIPE_CONTROL_CS_STALL |
374 PIPE_CONTROL_STALL_AT_SCOREBOARD,
375 0);
376 }
377
378 cs = gen8_emit_pipe_control(cs, flags,
379 i915_ggtt_offset(req->engine->scratch) +
380 2 * CACHELINE_BYTES);
381
382 intel_ring_advance(req, cs);
383
384 return 0;
385}
386
387static void ring_setup_phys_status_page(struct intel_engine_cs *engine) 343static void ring_setup_phys_status_page(struct intel_engine_cs *engine)
388{ 344{
389 struct drm_i915_private *dev_priv = engine->i915; 345 struct drm_i915_private *dev_priv = engine->i915;
@@ -427,7 +383,6 @@ static void intel_ring_setup_status_page(struct intel_engine_cs *engine)
427 } else if (IS_GEN6(dev_priv)) { 383 } else if (IS_GEN6(dev_priv)) {
428 mmio = RING_HWS_PGA_GEN6(engine->mmio_base); 384 mmio = RING_HWS_PGA_GEN6(engine->mmio_base);
429 } else { 385 } else {
430 /* XXX: gen8 returns to sanity */
431 mmio = RING_HWS_PGA(engine->mmio_base); 386 mmio = RING_HWS_PGA(engine->mmio_base);
432 } 387 }
433 388
@@ -437,13 +392,7 @@ static void intel_ring_setup_status_page(struct intel_engine_cs *engine)
437 I915_WRITE(mmio, engine->status_page.ggtt_offset); 392 I915_WRITE(mmio, engine->status_page.ggtt_offset);
438 POSTING_READ(mmio); 393 POSTING_READ(mmio);
439 394
440 /* 395 /* Flush the TLB for this page */
441 * Flush the TLB for this page
442 *
443 * FIXME: These two bits have disappeared on gen8, so a question
444 * arises: do we still need this and if so how should we go about
445 * invalidating the TLB?
446 */
447 if (IS_GEN(dev_priv, 6, 7)) { 396 if (IS_GEN(dev_priv, 6, 7)) {
448 i915_reg_t reg = RING_INSTPM(engine->mmio_base); 397 i915_reg_t reg = RING_INSTPM(engine->mmio_base);
449 398
@@ -611,8 +560,6 @@ static void reset_ring_common(struct intel_engine_cs *engine,
611 struct intel_context *ce = &request->ctx->engine[engine->id]; 560 struct intel_context *ce = &request->ctx->engine[engine->id];
612 struct i915_hw_ppgtt *ppgtt; 561 struct i915_hw_ppgtt *ppgtt;
613 562
614 /* FIXME consider gen8 reset */
615
616 if (ce->state) { 563 if (ce->state) {
617 I915_WRITE(CCID, 564 I915_WRITE(CCID,
618 i915_ggtt_offset(ce->state) | 565 i915_ggtt_offset(ce->state) |
@@ -713,62 +660,6 @@ static int init_render_ring(struct intel_engine_cs *engine)
713 return init_workarounds_ring(engine); 660 return init_workarounds_ring(engine);
714} 661}
715 662
716static void render_ring_cleanup(struct intel_engine_cs *engine)
717{
718 struct drm_i915_private *dev_priv = engine->i915;
719
720 i915_vma_unpin_and_release(&dev_priv->semaphore);
721}
722
723static u32 *gen8_rcs_signal(struct drm_i915_gem_request *req, u32 *cs)
724{
725 struct drm_i915_private *dev_priv = req->i915;
726 struct intel_engine_cs *waiter;
727 enum intel_engine_id id;
728
729 for_each_engine(waiter, dev_priv, id) {
730 u64 gtt_offset = req->engine->semaphore.signal_ggtt[id];
731 if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
732 continue;
733
734 *cs++ = GFX_OP_PIPE_CONTROL(6);
735 *cs++ = PIPE_CONTROL_GLOBAL_GTT_IVB | PIPE_CONTROL_QW_WRITE |
736 PIPE_CONTROL_CS_STALL;
737 *cs++ = lower_32_bits(gtt_offset);
738 *cs++ = upper_32_bits(gtt_offset);
739 *cs++ = req->global_seqno;
740 *cs++ = 0;
741 *cs++ = MI_SEMAPHORE_SIGNAL |
742 MI_SEMAPHORE_TARGET(waiter->hw_id);
743 *cs++ = 0;
744 }
745
746 return cs;
747}
748
749static u32 *gen8_xcs_signal(struct drm_i915_gem_request *req, u32 *cs)
750{
751 struct drm_i915_private *dev_priv = req->i915;
752 struct intel_engine_cs *waiter;
753 enum intel_engine_id id;
754
755 for_each_engine(waiter, dev_priv, id) {
756 u64 gtt_offset = req->engine->semaphore.signal_ggtt[id];
757 if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
758 continue;
759
760 *cs++ = (MI_FLUSH_DW + 1) | MI_FLUSH_DW_OP_STOREDW;
761 *cs++ = lower_32_bits(gtt_offset) | MI_FLUSH_DW_USE_GTT;
762 *cs++ = upper_32_bits(gtt_offset);
763 *cs++ = req->global_seqno;
764 *cs++ = MI_SEMAPHORE_SIGNAL |
765 MI_SEMAPHORE_TARGET(waiter->hw_id);
766 *cs++ = 0;
767 }
768
769 return cs;
770}
771
772static u32 *gen6_signal(struct drm_i915_gem_request *req, u32 *cs) 663static u32 *gen6_signal(struct drm_i915_gem_request *req, u32 *cs)
773{ 664{
774 struct drm_i915_private *dev_priv = req->i915; 665 struct drm_i915_private *dev_priv = req->i915;
@@ -851,70 +742,6 @@ static void gen6_sema_emit_breadcrumb(struct drm_i915_gem_request *req, u32 *cs)
851 req->engine->semaphore.signal(req, cs)); 742 req->engine->semaphore.signal(req, cs));
852} 743}
853 744
854static void gen8_render_emit_breadcrumb(struct drm_i915_gem_request *req,
855 u32 *cs)
856{
857 struct intel_engine_cs *engine = req->engine;
858
859 if (engine->semaphore.signal)
860 cs = engine->semaphore.signal(req, cs);
861
862 *cs++ = GFX_OP_PIPE_CONTROL(6);
863 *cs++ = PIPE_CONTROL_GLOBAL_GTT_IVB | PIPE_CONTROL_CS_STALL |
864 PIPE_CONTROL_QW_WRITE;
865 *cs++ = intel_hws_seqno_address(engine);
866 *cs++ = 0;
867 *cs++ = req->global_seqno;
868 /* We're thrashing one dword of HWS. */
869 *cs++ = 0;
870 *cs++ = MI_USER_INTERRUPT;
871 *cs++ = MI_NOOP;
872
873 req->tail = intel_ring_offset(req, cs);
874 assert_ring_tail_valid(req->ring, req->tail);
875}
876
877static const int gen8_render_emit_breadcrumb_sz = 8;
878
879/**
880 * intel_ring_sync - sync the waiter to the signaller on seqno
881 *
882 * @waiter - ring that is waiting
883 * @signaller - ring which has, or will signal
884 * @seqno - seqno which the waiter will block on
885 */
886
887static int
888gen8_ring_sync_to(struct drm_i915_gem_request *req,
889 struct drm_i915_gem_request *signal)
890{
891 struct drm_i915_private *dev_priv = req->i915;
892 u64 offset = GEN8_WAIT_OFFSET(req->engine, signal->engine->id);
893 struct i915_hw_ppgtt *ppgtt;
894 u32 *cs;
895
896 cs = intel_ring_begin(req, 4);
897 if (IS_ERR(cs))
898 return PTR_ERR(cs);
899
900 *cs++ = MI_SEMAPHORE_WAIT | MI_SEMAPHORE_GLOBAL_GTT |
901 MI_SEMAPHORE_SAD_GTE_SDD;
902 *cs++ = signal->global_seqno;
903 *cs++ = lower_32_bits(offset);
904 *cs++ = upper_32_bits(offset);
905 intel_ring_advance(req, cs);
906
907 /* When the !RCS engines idle waiting upon a semaphore, they lose their
908 * pagetables and we must reload them before executing the batch.
909 * We do this on the i915_switch_context() following the wait and
910 * before the dispatch.
911 */
912 ppgtt = req->ctx->ppgtt;
913 if (ppgtt && req->engine->id != RCS)
914 ppgtt->pd_dirty_rings |= intel_engine_flag(req->engine);
915 return 0;
916}
917
918static int 745static int
919gen6_ring_sync_to(struct drm_i915_gem_request *req, 746gen6_ring_sync_to(struct drm_i915_gem_request *req,
920 struct drm_i915_gem_request *signal) 747 struct drm_i915_gem_request *signal)
@@ -1090,25 +917,6 @@ hsw_vebox_irq_disable(struct intel_engine_cs *engine)
1090 gen6_mask_pm_irq(dev_priv, engine->irq_enable_mask); 917 gen6_mask_pm_irq(dev_priv, engine->irq_enable_mask);
1091} 918}
1092 919
1093static void
1094gen8_irq_enable(struct intel_engine_cs *engine)
1095{
1096 struct drm_i915_private *dev_priv = engine->i915;
1097
1098 I915_WRITE_IMR(engine,
1099 ~(engine->irq_enable_mask |
1100 engine->irq_keep_mask));
1101 POSTING_READ_FW(RING_IMR(engine->mmio_base));
1102}
1103
1104static void
1105gen8_irq_disable(struct intel_engine_cs *engine)
1106{
1107 struct drm_i915_private *dev_priv = engine->i915;
1108
1109 I915_WRITE_IMR(engine, ~engine->irq_keep_mask);
1110}
1111
1112static int 920static int
1113i965_emit_bb_start(struct drm_i915_gem_request *req, 921i965_emit_bb_start(struct drm_i915_gem_request *req,
1114 u64 offset, u32 length, 922 u64 offset, u32 length,
@@ -1796,8 +1604,6 @@ static int gen6_bsd_ring_flush(struct drm_i915_gem_request *req, u32 mode)
1796 return PTR_ERR(cs); 1604 return PTR_ERR(cs);
1797 1605
1798 cmd = MI_FLUSH_DW; 1606 cmd = MI_FLUSH_DW;
1799 if (INTEL_GEN(req->i915) >= 8)
1800 cmd += 1;
1801 1607
1802 /* We always require a command barrier so that subsequent 1608 /* We always require a command barrier so that subsequent
1803 * commands, such as breadcrumb interrupts, are strictly ordered 1609 * commands, such as breadcrumb interrupts, are strictly ordered
@@ -1817,38 +1623,9 @@ static int gen6_bsd_ring_flush(struct drm_i915_gem_request *req, u32 mode)
1817 1623
1818 *cs++ = cmd; 1624 *cs++ = cmd;
1819 *cs++ = I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT; 1625 *cs++ = I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT;
1820 if (INTEL_GEN(req->i915) >= 8) { 1626 *cs++ = 0;
1821 *cs++ = 0; /* upper addr */
1822 *cs++ = 0; /* value */
1823 } else {
1824 *cs++ = 0;
1825 *cs++ = MI_NOOP;
1826 }
1827 intel_ring_advance(req, cs);
1828 return 0;
1829}
1830
1831static int
1832gen8_emit_bb_start(struct drm_i915_gem_request *req,
1833 u64 offset, u32 len,
1834 unsigned int dispatch_flags)
1835{
1836 bool ppgtt = USES_PPGTT(req->i915) &&
1837 !(dispatch_flags & I915_DISPATCH_SECURE);
1838 u32 *cs;
1839
1840 cs = intel_ring_begin(req, 4);
1841 if (IS_ERR(cs))
1842 return PTR_ERR(cs);
1843
1844 /* FIXME(BDW): Address space and security selectors. */
1845 *cs++ = MI_BATCH_BUFFER_START_GEN8 | (ppgtt << 8) | (dispatch_flags &
1846 I915_DISPATCH_RS ? MI_BATCH_RESOURCE_STREAMER : 0);
1847 *cs++ = lower_32_bits(offset);
1848 *cs++ = upper_32_bits(offset);
1849 *cs++ = MI_NOOP; 1627 *cs++ = MI_NOOP;
1850 intel_ring_advance(req, cs); 1628 intel_ring_advance(req, cs);
1851
1852 return 0; 1629 return 0;
1853} 1630}
1854 1631
@@ -1905,8 +1682,6 @@ static int gen6_ring_flush(struct drm_i915_gem_request *req, u32 mode)
1905 return PTR_ERR(cs); 1682 return PTR_ERR(cs);
1906 1683
1907 cmd = MI_FLUSH_DW; 1684 cmd = MI_FLUSH_DW;
1908 if (INTEL_GEN(req->i915) >= 8)
1909 cmd += 1;
1910 1685
1911 /* We always require a command barrier so that subsequent 1686 /* We always require a command barrier so that subsequent
1912 * commands, such as breadcrumb interrupts, are strictly ordered 1687 * commands, such as breadcrumb interrupts, are strictly ordered
@@ -1925,13 +1700,8 @@ static int gen6_ring_flush(struct drm_i915_gem_request *req, u32 mode)
1925 cmd |= MI_INVALIDATE_TLB; 1700 cmd |= MI_INVALIDATE_TLB;
1926 *cs++ = cmd; 1701 *cs++ = cmd;
1927 *cs++ = I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT; 1702 *cs++ = I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT;
1928 if (INTEL_GEN(req->i915) >= 8) { 1703 *cs++ = 0;
1929 *cs++ = 0; /* upper addr */ 1704 *cs++ = MI_NOOP;
1930 *cs++ = 0; /* value */
1931 } else {
1932 *cs++ = 0;
1933 *cs++ = MI_NOOP;
1934 }
1935 intel_ring_advance(req, cs); 1705 intel_ring_advance(req, cs);
1936 1706
1937 return 0; 1707 return 0;
@@ -1940,110 +1710,61 @@ static int gen6_ring_flush(struct drm_i915_gem_request *req, u32 mode)
1940static void intel_ring_init_semaphores(struct drm_i915_private *dev_priv, 1710static void intel_ring_init_semaphores(struct drm_i915_private *dev_priv,
1941 struct intel_engine_cs *engine) 1711 struct intel_engine_cs *engine)
1942{ 1712{
1943 struct drm_i915_gem_object *obj; 1713 int i;
1944 int ret, i;
1945 1714
1946 if (!i915_modparams.semaphores) 1715 if (!i915_modparams.semaphores)
1947 return; 1716 return;
1948 1717
1949 if (INTEL_GEN(dev_priv) >= 8 && !dev_priv->semaphore) { 1718 GEM_BUG_ON(INTEL_GEN(dev_priv) < 6);
1950 struct i915_vma *vma; 1719 engine->semaphore.sync_to = gen6_ring_sync_to;
1951 1720 engine->semaphore.signal = gen6_signal;
1952 obj = i915_gem_object_create(dev_priv, PAGE_SIZE);
1953 if (IS_ERR(obj))
1954 goto err;
1955
1956 vma = i915_vma_instance(obj, &dev_priv->ggtt.base, NULL);
1957 if (IS_ERR(vma))
1958 goto err_obj;
1959
1960 ret = i915_gem_object_set_to_gtt_domain(obj, false);
1961 if (ret)
1962 goto err_obj;
1963
1964 ret = i915_vma_pin(vma, 0, 0, PIN_GLOBAL | PIN_HIGH);
1965 if (ret)
1966 goto err_obj;
1967 1721
1968 dev_priv->semaphore = vma; 1722 /*
1969 } 1723 * The current semaphore is only applied on pre-gen8
1970 1724 * platform. And there is no VCS2 ring on the pre-gen8
1971 if (INTEL_GEN(dev_priv) >= 8) { 1725 * platform. So the semaphore between RCS and VCS2 is
1972 u32 offset = i915_ggtt_offset(dev_priv->semaphore); 1726 * initialized as INVALID.
1973 1727 */
1974 engine->semaphore.sync_to = gen8_ring_sync_to; 1728 for (i = 0; i < GEN6_NUM_SEMAPHORES; i++) {
1975 engine->semaphore.signal = gen8_xcs_signal; 1729 static const struct {
1976
1977 for (i = 0; i < I915_NUM_ENGINES; i++) {
1978 u32 ring_offset;
1979
1980 if (i != engine->id)
1981 ring_offset = offset + GEN8_SEMAPHORE_OFFSET(engine->id, i);
1982 else
1983 ring_offset = MI_SEMAPHORE_SYNC_INVALID;
1984
1985 engine->semaphore.signal_ggtt[i] = ring_offset;
1986 }
1987 } else if (INTEL_GEN(dev_priv) >= 6) {
1988 engine->semaphore.sync_to = gen6_ring_sync_to;
1989 engine->semaphore.signal = gen6_signal;
1990
1991 /*
1992 * The current semaphore is only applied on pre-gen8
1993 * platform. And there is no VCS2 ring on the pre-gen8
1994 * platform. So the semaphore between RCS and VCS2 is
1995 * initialized as INVALID. Gen8 will initialize the
1996 * sema between VCS2 and RCS later.
1997 */
1998 for (i = 0; i < GEN6_NUM_SEMAPHORES; i++) {
1999 static const struct {
2000 u32 wait_mbox;
2001 i915_reg_t mbox_reg;
2002 } sem_data[GEN6_NUM_SEMAPHORES][GEN6_NUM_SEMAPHORES] = {
2003 [RCS_HW] = {
2004 [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RV, .mbox_reg = GEN6_VRSYNC },
2005 [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RB, .mbox_reg = GEN6_BRSYNC },
2006 [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RVE, .mbox_reg = GEN6_VERSYNC },
2007 },
2008 [VCS_HW] = {
2009 [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VR, .mbox_reg = GEN6_RVSYNC },
2010 [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VB, .mbox_reg = GEN6_BVSYNC },
2011 [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VVE, .mbox_reg = GEN6_VEVSYNC },
2012 },
2013 [BCS_HW] = {
2014 [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BR, .mbox_reg = GEN6_RBSYNC },
2015 [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BV, .mbox_reg = GEN6_VBSYNC },
2016 [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BVE, .mbox_reg = GEN6_VEBSYNC },
2017 },
2018 [VECS_HW] = {
2019 [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VER, .mbox_reg = GEN6_RVESYNC },
2020 [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VEV, .mbox_reg = GEN6_VVESYNC },
2021 [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VEB, .mbox_reg = GEN6_BVESYNC },
2022 },
2023 };
2024 u32 wait_mbox; 1730 u32 wait_mbox;
2025 i915_reg_t mbox_reg; 1731 i915_reg_t mbox_reg;
1732 } sem_data[GEN6_NUM_SEMAPHORES][GEN6_NUM_SEMAPHORES] = {
1733 [RCS_HW] = {
1734 [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RV, .mbox_reg = GEN6_VRSYNC },
1735 [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RB, .mbox_reg = GEN6_BRSYNC },
1736 [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_RVE, .mbox_reg = GEN6_VERSYNC },
1737 },
1738 [VCS_HW] = {
1739 [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VR, .mbox_reg = GEN6_RVSYNC },
1740 [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VB, .mbox_reg = GEN6_BVSYNC },
1741 [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VVE, .mbox_reg = GEN6_VEVSYNC },
1742 },
1743 [BCS_HW] = {
1744 [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BR, .mbox_reg = GEN6_RBSYNC },
1745 [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BV, .mbox_reg = GEN6_VBSYNC },
1746 [VECS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_BVE, .mbox_reg = GEN6_VEBSYNC },
1747 },
1748 [VECS_HW] = {
1749 [RCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VER, .mbox_reg = GEN6_RVESYNC },
1750 [VCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VEV, .mbox_reg = GEN6_VVESYNC },
1751 [BCS_HW] = { .wait_mbox = MI_SEMAPHORE_SYNC_VEB, .mbox_reg = GEN6_BVESYNC },
1752 },
1753 };
1754 u32 wait_mbox;
1755 i915_reg_t mbox_reg;
2026 1756
2027 if (i == engine->hw_id) { 1757 if (i == engine->hw_id) {
2028 wait_mbox = MI_SEMAPHORE_SYNC_INVALID; 1758 wait_mbox = MI_SEMAPHORE_SYNC_INVALID;
2029 mbox_reg = GEN6_NOSYNC; 1759 mbox_reg = GEN6_NOSYNC;
2030 } else { 1760 } else {
2031 wait_mbox = sem_data[engine->hw_id][i].wait_mbox; 1761 wait_mbox = sem_data[engine->hw_id][i].wait_mbox;
2032 mbox_reg = sem_data[engine->hw_id][i].mbox_reg; 1762 mbox_reg = sem_data[engine->hw_id][i].mbox_reg;
2033 }
2034
2035 engine->semaphore.mbox.wait[i] = wait_mbox;
2036 engine->semaphore.mbox.signal[i] = mbox_reg;
2037 } 1763 }
2038 }
2039
2040 return;
2041 1764
2042err_obj: 1765 engine->semaphore.mbox.wait[i] = wait_mbox;
2043 i915_gem_object_put(obj); 1766 engine->semaphore.mbox.signal[i] = mbox_reg;
2044err: 1767 }
2045 DRM_DEBUG_DRIVER("Failed to allocate space for semaphores, disabling\n");
2046 i915_modparams.semaphores = 0;
2047} 1768}
2048 1769
2049static void intel_ring_init_irq(struct drm_i915_private *dev_priv, 1770static void intel_ring_init_irq(struct drm_i915_private *dev_priv,
@@ -2051,11 +1772,7 @@ static void intel_ring_init_irq(struct drm_i915_private *dev_priv,
2051{ 1772{
2052 engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT << engine->irq_shift; 1773 engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT << engine->irq_shift;
2053 1774
2054 if (INTEL_GEN(dev_priv) >= 8) { 1775 if (INTEL_GEN(dev_priv) >= 6) {
2055 engine->irq_enable = gen8_irq_enable;
2056 engine->irq_disable = gen8_irq_disable;
2057 engine->irq_seqno_barrier = gen6_seqno_barrier;
2058 } else if (INTEL_GEN(dev_priv) >= 6) {
2059 engine->irq_enable = gen6_irq_enable; 1776 engine->irq_enable = gen6_irq_enable;
2060 engine->irq_disable = gen6_irq_disable; 1777 engine->irq_disable = gen6_irq_disable;
2061 engine->irq_seqno_barrier = gen6_seqno_barrier; 1778 engine->irq_seqno_barrier = gen6_seqno_barrier;
@@ -2090,6 +1807,9 @@ static void gen6_bsd_set_default_submission(struct intel_engine_cs *engine)
2090static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv, 1807static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv,
2091 struct intel_engine_cs *engine) 1808 struct intel_engine_cs *engine)
2092{ 1809{
1810 /* gen8+ are only supported with execlists */
1811 GEM_BUG_ON(INTEL_GEN(dev_priv) >= 8);
1812
2093 intel_ring_init_irq(dev_priv, engine); 1813 intel_ring_init_irq(dev_priv, engine);
2094 intel_ring_init_semaphores(dev_priv, engine); 1814 intel_ring_init_semaphores(dev_priv, engine);
2095 1815
@@ -2109,20 +1829,14 @@ static void intel_ring_default_vfuncs(struct drm_i915_private *dev_priv,
2109 engine->emit_breadcrumb = gen6_sema_emit_breadcrumb; 1829 engine->emit_breadcrumb = gen6_sema_emit_breadcrumb;
2110 1830
2111 num_rings = INTEL_INFO(dev_priv)->num_rings - 1; 1831 num_rings = INTEL_INFO(dev_priv)->num_rings - 1;
2112 if (INTEL_GEN(dev_priv) >= 8) { 1832 engine->emit_breadcrumb_sz += num_rings * 3;
2113 engine->emit_breadcrumb_sz += num_rings * 6; 1833 if (num_rings & 1)
2114 } else { 1834 engine->emit_breadcrumb_sz++;
2115 engine->emit_breadcrumb_sz += num_rings * 3;
2116 if (num_rings & 1)
2117 engine->emit_breadcrumb_sz++;
2118 }
2119 } 1835 }
2120 1836
2121 engine->set_default_submission = i9xx_set_default_submission; 1837 engine->set_default_submission = i9xx_set_default_submission;
2122 1838
2123 if (INTEL_GEN(dev_priv) >= 8) 1839 if (INTEL_GEN(dev_priv) >= 6)
2124 engine->emit_bb_start = gen8_emit_bb_start;
2125 else if (INTEL_GEN(dev_priv) >= 6)
2126 engine->emit_bb_start = gen6_emit_bb_start; 1840 engine->emit_bb_start = gen6_emit_bb_start;
2127 else if (INTEL_GEN(dev_priv) >= 4) 1841 else if (INTEL_GEN(dev_priv) >= 4)
2128 engine->emit_bb_start = i965_emit_bb_start; 1842 engine->emit_bb_start = i965_emit_bb_start;
@@ -2142,20 +1856,7 @@ int intel_init_render_ring_buffer(struct intel_engine_cs *engine)
2142 if (HAS_L3_DPF(dev_priv)) 1856 if (HAS_L3_DPF(dev_priv))
2143 engine->irq_keep_mask = GT_RENDER_L3_PARITY_ERROR_INTERRUPT; 1857 engine->irq_keep_mask = GT_RENDER_L3_PARITY_ERROR_INTERRUPT;
2144 1858
2145 if (INTEL_GEN(dev_priv) >= 8) { 1859 if (INTEL_GEN(dev_priv) >= 6) {
2146 engine->init_context = intel_rcs_ctx_init;
2147 engine->emit_breadcrumb = gen8_render_emit_breadcrumb;
2148 engine->emit_breadcrumb_sz = gen8_render_emit_breadcrumb_sz;
2149 engine->emit_flush = gen8_render_ring_flush;
2150 if (i915_modparams.semaphores) {
2151 int num_rings;
2152
2153 engine->semaphore.signal = gen8_rcs_signal;
2154
2155 num_rings = INTEL_INFO(dev_priv)->num_rings - 1;
2156 engine->emit_breadcrumb_sz += num_rings * 8;
2157 }
2158 } else if (INTEL_GEN(dev_priv) >= 6) {
2159 engine->init_context = intel_rcs_ctx_init; 1860 engine->init_context = intel_rcs_ctx_init;
2160 engine->emit_flush = gen7_render_ring_flush; 1861 engine->emit_flush = gen7_render_ring_flush;
2161 if (IS_GEN6(dev_priv)) 1862 if (IS_GEN6(dev_priv))
@@ -2174,7 +1875,6 @@ int intel_init_render_ring_buffer(struct intel_engine_cs *engine)
2174 engine->emit_bb_start = hsw_emit_bb_start; 1875 engine->emit_bb_start = hsw_emit_bb_start;
2175 1876
2176 engine->init_hw = init_render_ring; 1877 engine->init_hw = init_render_ring;
2177 engine->cleanup = render_ring_cleanup;
2178 1878
2179 ret = intel_init_ring_buffer(engine); 1879 ret = intel_init_ring_buffer(engine);
2180 if (ret) 1880 if (ret)
@@ -2204,8 +1904,7 @@ int intel_init_bsd_ring_buffer(struct intel_engine_cs *engine)
2204 if (IS_GEN6(dev_priv)) 1904 if (IS_GEN6(dev_priv))
2205 engine->set_default_submission = gen6_bsd_set_default_submission; 1905 engine->set_default_submission = gen6_bsd_set_default_submission;
2206 engine->emit_flush = gen6_bsd_ring_flush; 1906 engine->emit_flush = gen6_bsd_ring_flush;
2207 if (INTEL_GEN(dev_priv) < 8) 1907 engine->irq_enable_mask = GT_BSD_USER_INTERRUPT;
2208 engine->irq_enable_mask = GT_BSD_USER_INTERRUPT;
2209 } else { 1908 } else {
2210 engine->mmio_base = BSD_RING_BASE; 1909 engine->mmio_base = BSD_RING_BASE;
2211 engine->emit_flush = bsd_ring_flush; 1910 engine->emit_flush = bsd_ring_flush;
@@ -2225,8 +1924,7 @@ int intel_init_blt_ring_buffer(struct intel_engine_cs *engine)
2225 intel_ring_default_vfuncs(dev_priv, engine); 1924 intel_ring_default_vfuncs(dev_priv, engine);
2226 1925
2227 engine->emit_flush = gen6_ring_flush; 1926 engine->emit_flush = gen6_ring_flush;
2228 if (INTEL_GEN(dev_priv) < 8) 1927 engine->irq_enable_mask = GT_BLT_USER_INTERRUPT;
2229 engine->irq_enable_mask = GT_BLT_USER_INTERRUPT;
2230 1928
2231 return intel_init_ring_buffer(engine); 1929 return intel_init_ring_buffer(engine);
2232} 1930}
@@ -2238,12 +1936,9 @@ int intel_init_vebox_ring_buffer(struct intel_engine_cs *engine)
2238 intel_ring_default_vfuncs(dev_priv, engine); 1936 intel_ring_default_vfuncs(dev_priv, engine);
2239 1937
2240 engine->emit_flush = gen6_ring_flush; 1938 engine->emit_flush = gen6_ring_flush;
2241 1939 engine->irq_enable_mask = PM_VEBOX_USER_INTERRUPT;
2242 if (INTEL_GEN(dev_priv) < 8) { 1940 engine->irq_enable = hsw_vebox_irq_enable;
2243 engine->irq_enable_mask = PM_VEBOX_USER_INTERRUPT; 1941 engine->irq_disable = hsw_vebox_irq_disable;
2244 engine->irq_enable = hsw_vebox_irq_enable;
2245 engine->irq_disable = hsw_vebox_irq_disable;
2246 }
2247 1942
2248 return intel_init_ring_buffer(engine); 1943 return intel_init_ring_buffer(engine);
2249} 1944}