aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ringbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c557
1 files changed, 372 insertions, 185 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 279488addf3f..2d068edd1adc 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -48,9 +48,8 @@ static inline int __ring_space(int head, int tail, int size)
48 return space; 48 return space;
49} 49}
50 50
51static inline int ring_space(struct intel_engine_cs *ring) 51static inline int ring_space(struct intel_ringbuffer *ringbuf)
52{ 52{
53 struct intel_ringbuffer *ringbuf = ring->buffer;
54 return __ring_space(ringbuf->head & HEAD_ADDR, ringbuf->tail, ringbuf->size); 53 return __ring_space(ringbuf->head & HEAD_ADDR, ringbuf->tail, ringbuf->size);
55} 54}
56 55
@@ -381,6 +380,27 @@ gen7_render_ring_flush(struct intel_engine_cs *ring,
381} 380}
382 381
383static int 382static int
383gen8_emit_pipe_control(struct intel_engine_cs *ring,
384 u32 flags, u32 scratch_addr)
385{
386 int ret;
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
403static int
384gen8_render_ring_flush(struct intel_engine_cs *ring, 404gen8_render_ring_flush(struct intel_engine_cs *ring,
385 u32 invalidate_domains, u32 flush_domains) 405 u32 invalidate_domains, u32 flush_domains)
386{ 406{
@@ -403,22 +423,17 @@ gen8_render_ring_flush(struct intel_engine_cs *ring,
403 flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; 423 flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
404 flags |= PIPE_CONTROL_QW_WRITE; 424 flags |= PIPE_CONTROL_QW_WRITE;
405 flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; 425 flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
406 }
407
408 ret = intel_ring_begin(ring, 6);
409 if (ret)
410 return ret;
411
412 intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(6));
413 intel_ring_emit(ring, flags);
414 intel_ring_emit(ring, scratch_addr);
415 intel_ring_emit(ring, 0);
416 intel_ring_emit(ring, 0);
417 intel_ring_emit(ring, 0);
418 intel_ring_advance(ring);
419 426
420 return 0; 427 /* WaCsStallBeforeStateCacheInvalidate:bdw,chv */
428 ret = gen8_emit_pipe_control(ring,
429 PIPE_CONTROL_CS_STALL |
430 PIPE_CONTROL_STALL_AT_SCOREBOARD,
431 0);
432 if (ret)
433 return ret;
434 }
421 435
436 return gen8_emit_pipe_control(ring, flags, scratch_addr);
422} 437}
423 438
424static void ring_write_tail(struct intel_engine_cs *ring, 439static void ring_write_tail(struct intel_engine_cs *ring,
@@ -517,6 +532,9 @@ static int init_ring_common(struct intel_engine_cs *ring)
517 else 532 else
518 ring_setup_phys_status_page(ring); 533 ring_setup_phys_status_page(ring);
519 534
535 /* Enforce ordering by reading HEAD register back */
536 I915_READ_HEAD(ring);
537
520 /* Initialize the ring. This must happen _after_ we've cleared the ring 538 /* Initialize the ring. This must happen _after_ we've cleared the ring
521 * registers with the above sequence (the readback of the HEAD registers 539 * registers with the above sequence (the readback of the HEAD registers
522 * also enforces ordering), otherwise the hw might lose the new ring 540 * also enforces ordering), otherwise the hw might lose the new ring
@@ -545,7 +563,7 @@ static int init_ring_common(struct intel_engine_cs *ring)
545 else { 563 else {
546 ringbuf->head = I915_READ_HEAD(ring); 564 ringbuf->head = I915_READ_HEAD(ring);
547 ringbuf->tail = I915_READ_TAIL(ring) & TAIL_ADDR; 565 ringbuf->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
548 ringbuf->space = ring_space(ring); 566 ringbuf->space = ring_space(ringbuf);
549 ringbuf->last_retired_head = -1; 567 ringbuf->last_retired_head = -1;
550 } 568 }
551 569
@@ -604,6 +622,8 @@ static int init_render_ring(struct intel_engine_cs *ring)
604 struct drm_device *dev = ring->dev; 622 struct drm_device *dev = ring->dev;
605 struct drm_i915_private *dev_priv = dev->dev_private; 623 struct drm_i915_private *dev_priv = dev->dev_private;
606 int ret = init_ring_common(ring); 624 int ret = init_ring_common(ring);
625 if (ret)
626 return ret;
607 627
608 /* WaTimedSingleVertexDispatch:cl,bw,ctg,elk,ilk,snb */ 628 /* WaTimedSingleVertexDispatch:cl,bw,ctg,elk,ilk,snb */
609 if (INTEL_INFO(dev)->gen >= 4 && INTEL_INFO(dev)->gen < 7) 629 if (INTEL_INFO(dev)->gen >= 4 && INTEL_INFO(dev)->gen < 7)
@@ -658,6 +678,13 @@ static int init_render_ring(struct intel_engine_cs *ring)
658static void render_ring_cleanup(struct intel_engine_cs *ring) 678static void render_ring_cleanup(struct intel_engine_cs *ring)
659{ 679{
660 struct drm_device *dev = ring->dev; 680 struct drm_device *dev = ring->dev;
681 struct drm_i915_private *dev_priv = dev->dev_private;
682
683 if (dev_priv->semaphore_obj) {
684 i915_gem_object_ggtt_unpin(dev_priv->semaphore_obj);
685 drm_gem_object_unreference(&dev_priv->semaphore_obj->base);
686 dev_priv->semaphore_obj = NULL;
687 }
661 688
662 if (ring->scratch.obj == NULL) 689 if (ring->scratch.obj == NULL)
663 return; 690 return;
@@ -671,29 +698,96 @@ static void render_ring_cleanup(struct intel_engine_cs *ring)
671 ring->scratch.obj = NULL; 698 ring->scratch.obj = NULL;
672} 699}
673 700
701static int gen8_rcs_signal(struct intel_engine_cs *signaller,
702 unsigned int num_dwords)
703{
704#define MBOX_UPDATE_DWORDS 8
705 struct drm_device *dev = signaller->dev;
706 struct drm_i915_private *dev_priv = dev->dev_private;
707 struct intel_engine_cs *waiter;
708 int i, ret, num_rings;
709
710 num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
711 num_dwords += (num_rings-1) * MBOX_UPDATE_DWORDS;
712#undef MBOX_UPDATE_DWORDS
713
714 ret = intel_ring_begin(signaller, num_dwords);
715 if (ret)
716 return ret;
717
718 for_each_ring(waiter, dev_priv, i) {
719 u64 gtt_offset = signaller->semaphore.signal_ggtt[i];
720 if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
721 continue;
722
723 intel_ring_emit(signaller, GFX_OP_PIPE_CONTROL(6));
724 intel_ring_emit(signaller, PIPE_CONTROL_GLOBAL_GTT_IVB |
725 PIPE_CONTROL_QW_WRITE |
726 PIPE_CONTROL_FLUSH_ENABLE);
727 intel_ring_emit(signaller, lower_32_bits(gtt_offset));
728 intel_ring_emit(signaller, upper_32_bits(gtt_offset));
729 intel_ring_emit(signaller, signaller->outstanding_lazy_seqno);
730 intel_ring_emit(signaller, 0);
731 intel_ring_emit(signaller, MI_SEMAPHORE_SIGNAL |
732 MI_SEMAPHORE_TARGET(waiter->id));
733 intel_ring_emit(signaller, 0);
734 }
735
736 return 0;
737}
738
739static int gen8_xcs_signal(struct intel_engine_cs *signaller,
740 unsigned int num_dwords)
741{
742#define MBOX_UPDATE_DWORDS 6
743 struct drm_device *dev = signaller->dev;
744 struct drm_i915_private *dev_priv = dev->dev_private;
745 struct intel_engine_cs *waiter;
746 int i, ret, num_rings;
747
748 num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
749 num_dwords += (num_rings-1) * MBOX_UPDATE_DWORDS;
750#undef MBOX_UPDATE_DWORDS
751
752 ret = intel_ring_begin(signaller, num_dwords);
753 if (ret)
754 return ret;
755
756 for_each_ring(waiter, dev_priv, i) {
757 u64 gtt_offset = signaller->semaphore.signal_ggtt[i];
758 if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
759 continue;
760
761 intel_ring_emit(signaller, (MI_FLUSH_DW + 1) |
762 MI_FLUSH_DW_OP_STOREDW);
763 intel_ring_emit(signaller, lower_32_bits(gtt_offset) |
764 MI_FLUSH_DW_USE_GTT);
765 intel_ring_emit(signaller, upper_32_bits(gtt_offset));
766 intel_ring_emit(signaller, signaller->outstanding_lazy_seqno);
767 intel_ring_emit(signaller, MI_SEMAPHORE_SIGNAL |
768 MI_SEMAPHORE_TARGET(waiter->id));
769 intel_ring_emit(signaller, 0);
770 }
771
772 return 0;
773}
774
674static int gen6_signal(struct intel_engine_cs *signaller, 775static int gen6_signal(struct intel_engine_cs *signaller,
675 unsigned int num_dwords) 776 unsigned int num_dwords)
676{ 777{
677 struct drm_device *dev = signaller->dev; 778 struct drm_device *dev = signaller->dev;
678 struct drm_i915_private *dev_priv = dev->dev_private; 779 struct drm_i915_private *dev_priv = dev->dev_private;
679 struct intel_engine_cs *useless; 780 struct intel_engine_cs *useless;
680 int i, ret; 781 int i, ret, num_rings;
681 782
682 /* NB: In order to be able to do semaphore MBOX updates for varying 783#define MBOX_UPDATE_DWORDS 3
683 * number of rings, it's easiest if we round up each individual update 784 num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
684 * to a multiple of 2 (since ring updates must always be a multiple of 785 num_dwords += round_up((num_rings-1) * MBOX_UPDATE_DWORDS, 2);
685 * 2) even though the actual update only requires 3 dwords. 786#undef MBOX_UPDATE_DWORDS
686 */
687#define MBOX_UPDATE_DWORDS 4
688 if (i915_semaphore_is_enabled(dev))
689 num_dwords += ((I915_NUM_RINGS-1) * MBOX_UPDATE_DWORDS);
690 else
691 return intel_ring_begin(signaller, num_dwords);
692 787
693 ret = intel_ring_begin(signaller, num_dwords); 788 ret = intel_ring_begin(signaller, num_dwords);
694 if (ret) 789 if (ret)
695 return ret; 790 return ret;
696#undef MBOX_UPDATE_DWORDS
697 791
698 for_each_ring(useless, dev_priv, i) { 792 for_each_ring(useless, dev_priv, i) {
699 u32 mbox_reg = signaller->semaphore.mbox.signal[i]; 793 u32 mbox_reg = signaller->semaphore.mbox.signal[i];
@@ -701,15 +795,13 @@ static int gen6_signal(struct intel_engine_cs *signaller,
701 intel_ring_emit(signaller, MI_LOAD_REGISTER_IMM(1)); 795 intel_ring_emit(signaller, MI_LOAD_REGISTER_IMM(1));
702 intel_ring_emit(signaller, mbox_reg); 796 intel_ring_emit(signaller, mbox_reg);
703 intel_ring_emit(signaller, signaller->outstanding_lazy_seqno); 797 intel_ring_emit(signaller, signaller->outstanding_lazy_seqno);
704 intel_ring_emit(signaller, MI_NOOP);
705 } else {
706 intel_ring_emit(signaller, MI_NOOP);
707 intel_ring_emit(signaller, MI_NOOP);
708 intel_ring_emit(signaller, MI_NOOP);
709 intel_ring_emit(signaller, MI_NOOP);
710 } 798 }
711 } 799 }
712 800
801 /* If num_dwords was rounded, make sure the tail pointer is correct */
802 if (num_rings % 2 == 0)
803 intel_ring_emit(signaller, MI_NOOP);
804
713 return 0; 805 return 0;
714} 806}
715 807
@@ -727,7 +819,11 @@ gen6_add_request(struct intel_engine_cs *ring)
727{ 819{
728 int ret; 820 int ret;
729 821
730 ret = ring->semaphore.signal(ring, 4); 822 if (ring->semaphore.signal)
823 ret = ring->semaphore.signal(ring, 4);
824 else
825 ret = intel_ring_begin(ring, 4);
826
731 if (ret) 827 if (ret)
732 return ret; 828 return ret;
733 829
@@ -754,6 +850,32 @@ static inline bool i915_gem_has_seqno_wrapped(struct drm_device *dev,
754 * @signaller - ring which has, or will signal 850 * @signaller - ring which has, or will signal
755 * @seqno - seqno which the waiter will block on 851 * @seqno - seqno which the waiter will block on
756 */ 852 */
853
854static int
855gen8_ring_sync(struct intel_engine_cs *waiter,
856 struct intel_engine_cs *signaller,
857 u32 seqno)
858{
859 struct drm_i915_private *dev_priv = waiter->dev->dev_private;
860 int ret;
861
862 ret = intel_ring_begin(waiter, 4);
863 if (ret)
864 return ret;
865
866 intel_ring_emit(waiter, MI_SEMAPHORE_WAIT |
867 MI_SEMAPHORE_GLOBAL_GTT |
868 MI_SEMAPHORE_POLL |
869 MI_SEMAPHORE_SAD_GTE_SDD);
870 intel_ring_emit(waiter, seqno);
871 intel_ring_emit(waiter,
872 lower_32_bits(GEN8_WAIT_OFFSET(waiter, signaller->id)));
873 intel_ring_emit(waiter,
874 upper_32_bits(GEN8_WAIT_OFFSET(waiter, signaller->id)));
875 intel_ring_advance(waiter);
876 return 0;
877}
878
757static int 879static int
758gen6_ring_sync(struct intel_engine_cs *waiter, 880gen6_ring_sync(struct intel_engine_cs *waiter,
759 struct intel_engine_cs *signaller, 881 struct intel_engine_cs *signaller,
@@ -901,7 +1023,7 @@ gen5_ring_get_irq(struct intel_engine_cs *ring)
901 1023
902 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1024 spin_lock_irqsave(&dev_priv->irq_lock, flags);
903 if (ring->irq_refcount++ == 0) 1025 if (ring->irq_refcount++ == 0)
904 ilk_enable_gt_irq(dev_priv, ring->irq_enable_mask); 1026 gen5_enable_gt_irq(dev_priv, ring->irq_enable_mask);
905 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1027 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
906 1028
907 return true; 1029 return true;
@@ -916,7 +1038,7 @@ gen5_ring_put_irq(struct intel_engine_cs *ring)
916 1038
917 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1039 spin_lock_irqsave(&dev_priv->irq_lock, flags);
918 if (--ring->irq_refcount == 0) 1040 if (--ring->irq_refcount == 0)
919 ilk_disable_gt_irq(dev_priv, ring->irq_enable_mask); 1041 gen5_disable_gt_irq(dev_priv, ring->irq_enable_mask);
920 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1042 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
921} 1043}
922 1044
@@ -1109,7 +1231,7 @@ gen6_ring_get_irq(struct intel_engine_cs *ring)
1109 GT_PARITY_ERROR(dev))); 1231 GT_PARITY_ERROR(dev)));
1110 else 1232 else
1111 I915_WRITE_IMR(ring, ~ring->irq_enable_mask); 1233 I915_WRITE_IMR(ring, ~ring->irq_enable_mask);
1112 ilk_enable_gt_irq(dev_priv, ring->irq_enable_mask); 1234 gen5_enable_gt_irq(dev_priv, ring->irq_enable_mask);
1113 } 1235 }
1114 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1236 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
1115 1237
@@ -1129,7 +1251,7 @@ gen6_ring_put_irq(struct intel_engine_cs *ring)
1129 I915_WRITE_IMR(ring, ~GT_PARITY_ERROR(dev)); 1251 I915_WRITE_IMR(ring, ~GT_PARITY_ERROR(dev));
1130 else 1252 else
1131 I915_WRITE_IMR(ring, ~0); 1253 I915_WRITE_IMR(ring, ~0);
1132 ilk_disable_gt_irq(dev_priv, ring->irq_enable_mask); 1254 gen5_disable_gt_irq(dev_priv, ring->irq_enable_mask);
1133 } 1255 }
1134 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1256 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
1135} 1257}
@@ -1147,7 +1269,7 @@ hsw_vebox_get_irq(struct intel_engine_cs *ring)
1147 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1269 spin_lock_irqsave(&dev_priv->irq_lock, flags);
1148 if (ring->irq_refcount++ == 0) { 1270 if (ring->irq_refcount++ == 0) {
1149 I915_WRITE_IMR(ring, ~ring->irq_enable_mask); 1271 I915_WRITE_IMR(ring, ~ring->irq_enable_mask);
1150 snb_enable_pm_irq(dev_priv, ring->irq_enable_mask); 1272 gen6_enable_pm_irq(dev_priv, ring->irq_enable_mask);
1151 } 1273 }
1152 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1274 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
1153 1275
@@ -1167,7 +1289,7 @@ hsw_vebox_put_irq(struct intel_engine_cs *ring)
1167 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1289 spin_lock_irqsave(&dev_priv->irq_lock, flags);
1168 if (--ring->irq_refcount == 0) { 1290 if (--ring->irq_refcount == 0) {
1169 I915_WRITE_IMR(ring, ~0); 1291 I915_WRITE_IMR(ring, ~0);
1170 snb_disable_pm_irq(dev_priv, ring->irq_enable_mask); 1292 gen6_disable_pm_irq(dev_priv, ring->irq_enable_mask);
1171 } 1293 }
1172 spin_unlock_irqrestore(&dev_priv->irq_lock, flags); 1294 spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
1173} 1295}
@@ -1241,54 +1363,66 @@ i965_dispatch_execbuffer(struct intel_engine_cs *ring,
1241 1363
1242/* Just userspace ABI convention to limit the wa batch bo to a resonable size */ 1364/* Just userspace ABI convention to limit the wa batch bo to a resonable size */
1243#define I830_BATCH_LIMIT (256*1024) 1365#define I830_BATCH_LIMIT (256*1024)
1366#define I830_TLB_ENTRIES (2)
1367#define I830_WA_SIZE max(I830_TLB_ENTRIES*4096, I830_BATCH_LIMIT)
1244static int 1368static int
1245i830_dispatch_execbuffer(struct intel_engine_cs *ring, 1369i830_dispatch_execbuffer(struct intel_engine_cs *ring,
1246 u64 offset, u32 len, 1370 u64 offset, u32 len,
1247 unsigned flags) 1371 unsigned flags)
1248{ 1372{
1373 u32 cs_offset = ring->scratch.gtt_offset;
1249 int ret; 1374 int ret;
1250 1375
1251 if (flags & I915_DISPATCH_PINNED) { 1376 ret = intel_ring_begin(ring, 6);
1252 ret = intel_ring_begin(ring, 4); 1377 if (ret)
1253 if (ret) 1378 return ret;
1254 return ret;
1255 1379
1256 intel_ring_emit(ring, MI_BATCH_BUFFER); 1380 /* Evict the invalid PTE TLBs */
1257 intel_ring_emit(ring, offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE)); 1381 intel_ring_emit(ring, COLOR_BLT_CMD | BLT_WRITE_RGBA);
1258 intel_ring_emit(ring, offset + len - 8); 1382 intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_COLOR_COPY | 4096);
1259 intel_ring_emit(ring, MI_NOOP); 1383 intel_ring_emit(ring, I830_TLB_ENTRIES << 16 | 4); /* load each page */
1260 intel_ring_advance(ring); 1384 intel_ring_emit(ring, cs_offset);
1261 } else { 1385 intel_ring_emit(ring, 0xdeadbeef);
1262 u32 cs_offset = ring->scratch.gtt_offset; 1386 intel_ring_emit(ring, MI_NOOP);
1387 intel_ring_advance(ring);
1263 1388
1389 if ((flags & I915_DISPATCH_PINNED) == 0) {
1264 if (len > I830_BATCH_LIMIT) 1390 if (len > I830_BATCH_LIMIT)
1265 return -ENOSPC; 1391 return -ENOSPC;
1266 1392
1267 ret = intel_ring_begin(ring, 9+3); 1393 ret = intel_ring_begin(ring, 6 + 2);
1268 if (ret) 1394 if (ret)
1269 return ret; 1395 return ret;
1270 /* Blit the batch (which has now all relocs applied) to the stable batch 1396
1271 * scratch bo area (so that the CS never stumbles over its tlb 1397 /* Blit the batch (which has now all relocs applied) to the
1272 * invalidation bug) ... */ 1398 * stable batch scratch bo area (so that the CS never
1273 intel_ring_emit(ring, XY_SRC_COPY_BLT_CMD | 1399 * stumbles over its tlb invalidation bug) ...
1274 XY_SRC_COPY_BLT_WRITE_ALPHA | 1400 */
1275 XY_SRC_COPY_BLT_WRITE_RGB); 1401 intel_ring_emit(ring, SRC_COPY_BLT_CMD | BLT_WRITE_RGBA);
1276 intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_GXCOPY | 4096); 1402 intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_SRC_COPY | 4096);
1277 intel_ring_emit(ring, 0); 1403 intel_ring_emit(ring, DIV_ROUND_UP(len, 4096) << 16 | 1024);
1278 intel_ring_emit(ring, (DIV_ROUND_UP(len, 4096) << 16) | 1024);
1279 intel_ring_emit(ring, cs_offset); 1404 intel_ring_emit(ring, cs_offset);
1280 intel_ring_emit(ring, 0);
1281 intel_ring_emit(ring, 4096); 1405 intel_ring_emit(ring, 4096);
1282 intel_ring_emit(ring, offset); 1406 intel_ring_emit(ring, offset);
1407
1283 intel_ring_emit(ring, MI_FLUSH); 1408 intel_ring_emit(ring, MI_FLUSH);
1409 intel_ring_emit(ring, MI_NOOP);
1410 intel_ring_advance(ring);
1284 1411
1285 /* ... and execute it. */ 1412 /* ... and execute it. */
1286 intel_ring_emit(ring, MI_BATCH_BUFFER); 1413 offset = cs_offset;
1287 intel_ring_emit(ring, cs_offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE));
1288 intel_ring_emit(ring, cs_offset + len - 8);
1289 intel_ring_advance(ring);
1290 } 1414 }
1291 1415
1416 ret = intel_ring_begin(ring, 4);
1417 if (ret)
1418 return ret;
1419
1420 intel_ring_emit(ring, MI_BATCH_BUFFER);
1421 intel_ring_emit(ring, offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE));
1422 intel_ring_emit(ring, offset + len - 8);
1423 intel_ring_emit(ring, MI_NOOP);
1424 intel_ring_advance(ring);
1425
1292 return 0; 1426 return 0;
1293} 1427}
1294 1428
@@ -1329,6 +1463,7 @@ static int init_status_page(struct intel_engine_cs *ring)
1329 struct drm_i915_gem_object *obj; 1463 struct drm_i915_gem_object *obj;
1330 1464
1331 if ((obj = ring->status_page.obj) == NULL) { 1465 if ((obj = ring->status_page.obj) == NULL) {
1466 unsigned flags;
1332 int ret; 1467 int ret;
1333 1468
1334 obj = i915_gem_alloc_object(ring->dev, 4096); 1469 obj = i915_gem_alloc_object(ring->dev, 4096);
@@ -1341,7 +1476,20 @@ static int init_status_page(struct intel_engine_cs *ring)
1341 if (ret) 1476 if (ret)
1342 goto err_unref; 1477 goto err_unref;
1343 1478
1344 ret = i915_gem_obj_ggtt_pin(obj, 4096, 0); 1479 flags = 0;
1480 if (!HAS_LLC(ring->dev))
1481 /* On g33, we cannot place HWS above 256MiB, so
1482 * restrict its pinning to the low mappable arena.
1483 * Though this restriction is not documented for
1484 * gen4, gen5, or byt, they also behave similarly
1485 * and hang if the HWS is placed at the top of the
1486 * GTT. To generalise, it appears that all !llc
1487 * platforms have issues with us placing the HWS
1488 * above the mappable region (even though we never
1489 * actualy map it).
1490 */
1491 flags |= PIN_MAPPABLE;
1492 ret = i915_gem_obj_ggtt_pin(obj, 4096, flags);
1345 if (ret) { 1493 if (ret) {
1346err_unref: 1494err_unref:
1347 drm_gem_object_unreference(&obj->base); 1495 drm_gem_object_unreference(&obj->base);
@@ -1378,15 +1526,25 @@ static int init_phys_status_page(struct intel_engine_cs *ring)
1378 return 0; 1526 return 0;
1379} 1527}
1380 1528
1381static int allocate_ring_buffer(struct intel_engine_cs *ring) 1529static void intel_destroy_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
1530{
1531 if (!ringbuf->obj)
1532 return;
1533
1534 iounmap(ringbuf->virtual_start);
1535 i915_gem_object_ggtt_unpin(ringbuf->obj);
1536 drm_gem_object_unreference(&ringbuf->obj->base);
1537 ringbuf->obj = NULL;
1538}
1539
1540static int intel_alloc_ringbuffer_obj(struct drm_device *dev,
1541 struct intel_ringbuffer *ringbuf)
1382{ 1542{
1383 struct drm_device *dev = ring->dev;
1384 struct drm_i915_private *dev_priv = to_i915(dev); 1543 struct drm_i915_private *dev_priv = to_i915(dev);
1385 struct intel_ringbuffer *ringbuf = ring->buffer;
1386 struct drm_i915_gem_object *obj; 1544 struct drm_i915_gem_object *obj;
1387 int ret; 1545 int ret;
1388 1546
1389 if (intel_ring_initialized(ring)) 1547 if (ringbuf->obj)
1390 return 0; 1548 return 0;
1391 1549
1392 obj = NULL; 1550 obj = NULL;
@@ -1397,6 +1555,9 @@ static int allocate_ring_buffer(struct intel_engine_cs *ring)
1397 if (obj == NULL) 1555 if (obj == NULL)
1398 return -ENOMEM; 1556 return -ENOMEM;
1399 1557
1558 /* mark ring buffers as read-only from GPU side by default */
1559 obj->gt_ro = 1;
1560
1400 ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, PIN_MAPPABLE); 1561 ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, PIN_MAPPABLE);
1401 if (ret) 1562 if (ret)
1402 goto err_unref; 1563 goto err_unref;
@@ -1455,7 +1616,7 @@ static int intel_init_ring_buffer(struct drm_device *dev,
1455 goto error; 1616 goto error;
1456 } 1617 }
1457 1618
1458 ret = allocate_ring_buffer(ring); 1619 ret = intel_alloc_ringbuffer_obj(dev, ringbuf);
1459 if (ret) { 1620 if (ret) {
1460 DRM_ERROR("Failed to allocate ringbuffer %s: %d\n", ring->name, ret); 1621 DRM_ERROR("Failed to allocate ringbuffer %s: %d\n", ring->name, ret);
1461 goto error; 1622 goto error;
@@ -1496,11 +1657,7 @@ void intel_cleanup_ring_buffer(struct intel_engine_cs *ring)
1496 intel_stop_ring_buffer(ring); 1657 intel_stop_ring_buffer(ring);
1497 WARN_ON(!IS_GEN2(ring->dev) && (I915_READ_MODE(ring) & MODE_IDLE) == 0); 1658 WARN_ON(!IS_GEN2(ring->dev) && (I915_READ_MODE(ring) & MODE_IDLE) == 0);
1498 1659
1499 iounmap(ringbuf->virtual_start); 1660 intel_destroy_ringbuffer_obj(ringbuf);
1500
1501 i915_gem_object_ggtt_unpin(ringbuf->obj);
1502 drm_gem_object_unreference(&ringbuf->obj->base);
1503 ringbuf->obj = NULL;
1504 ring->preallocated_lazy_request = NULL; 1661 ring->preallocated_lazy_request = NULL;
1505 ring->outstanding_lazy_seqno = 0; 1662 ring->outstanding_lazy_seqno = 0;
1506 1663
@@ -1526,7 +1683,7 @@ static int intel_ring_wait_request(struct intel_engine_cs *ring, int n)
1526 ringbuf->head = ringbuf->last_retired_head; 1683 ringbuf->head = ringbuf->last_retired_head;
1527 ringbuf->last_retired_head = -1; 1684 ringbuf->last_retired_head = -1;
1528 1685
1529 ringbuf->space = ring_space(ring); 1686 ringbuf->space = ring_space(ringbuf);
1530 if (ringbuf->space >= n) 1687 if (ringbuf->space >= n)
1531 return 0; 1688 return 0;
1532 } 1689 }
@@ -1549,7 +1706,7 @@ static int intel_ring_wait_request(struct intel_engine_cs *ring, int n)
1549 ringbuf->head = ringbuf->last_retired_head; 1706 ringbuf->head = ringbuf->last_retired_head;
1550 ringbuf->last_retired_head = -1; 1707 ringbuf->last_retired_head = -1;
1551 1708
1552 ringbuf->space = ring_space(ring); 1709 ringbuf->space = ring_space(ringbuf);
1553 return 0; 1710 return 0;
1554} 1711}
1555 1712
@@ -1578,7 +1735,7 @@ static int ring_wait_for_space(struct intel_engine_cs *ring, int n)
1578 trace_i915_ring_wait_begin(ring); 1735 trace_i915_ring_wait_begin(ring);
1579 do { 1736 do {
1580 ringbuf->head = I915_READ_HEAD(ring); 1737 ringbuf->head = I915_READ_HEAD(ring);
1581 ringbuf->space = ring_space(ring); 1738 ringbuf->space = ring_space(ringbuf);
1582 if (ringbuf->space >= n) { 1739 if (ringbuf->space >= n) {
1583 ret = 0; 1740 ret = 0;
1584 break; 1741 break;
@@ -1630,7 +1787,7 @@ static int intel_wrap_ring_buffer(struct intel_engine_cs *ring)
1630 iowrite32(MI_NOOP, virt++); 1787 iowrite32(MI_NOOP, virt++);
1631 1788
1632 ringbuf->tail = 0; 1789 ringbuf->tail = 0;
1633 ringbuf->space = ring_space(ring); 1790 ringbuf->space = ring_space(ringbuf);
1634 1791
1635 return 0; 1792 return 0;
1636} 1793}
@@ -1746,14 +1903,15 @@ int intel_ring_cacheline_align(struct intel_engine_cs *ring)
1746 1903
1747void intel_ring_init_seqno(struct intel_engine_cs *ring, u32 seqno) 1904void intel_ring_init_seqno(struct intel_engine_cs *ring, u32 seqno)
1748{ 1905{
1749 struct drm_i915_private *dev_priv = ring->dev->dev_private; 1906 struct drm_device *dev = ring->dev;
1907 struct drm_i915_private *dev_priv = dev->dev_private;
1750 1908
1751 BUG_ON(ring->outstanding_lazy_seqno); 1909 BUG_ON(ring->outstanding_lazy_seqno);
1752 1910
1753 if (INTEL_INFO(ring->dev)->gen >= 6) { 1911 if (INTEL_INFO(dev)->gen == 6 || INTEL_INFO(dev)->gen == 7) {
1754 I915_WRITE(RING_SYNC_0(ring->mmio_base), 0); 1912 I915_WRITE(RING_SYNC_0(ring->mmio_base), 0);
1755 I915_WRITE(RING_SYNC_1(ring->mmio_base), 0); 1913 I915_WRITE(RING_SYNC_1(ring->mmio_base), 0);
1756 if (HAS_VEBOX(ring->dev)) 1914 if (HAS_VEBOX(dev))
1757 I915_WRITE(RING_SYNC_2(ring->mmio_base), 0); 1915 I915_WRITE(RING_SYNC_2(ring->mmio_base), 0);
1758 } 1916 }
1759 1917
@@ -1941,45 +2099,74 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
1941{ 2099{
1942 struct drm_i915_private *dev_priv = dev->dev_private; 2100 struct drm_i915_private *dev_priv = dev->dev_private;
1943 struct intel_engine_cs *ring = &dev_priv->ring[RCS]; 2101 struct intel_engine_cs *ring = &dev_priv->ring[RCS];
2102 struct drm_i915_gem_object *obj;
2103 int ret;
1944 2104
1945 ring->name = "render ring"; 2105 ring->name = "render ring";
1946 ring->id = RCS; 2106 ring->id = RCS;
1947 ring->mmio_base = RENDER_RING_BASE; 2107 ring->mmio_base = RENDER_RING_BASE;
1948 2108
1949 if (INTEL_INFO(dev)->gen >= 6) { 2109 if (INTEL_INFO(dev)->gen >= 8) {
2110 if (i915_semaphore_is_enabled(dev)) {
2111 obj = i915_gem_alloc_object(dev, 4096);
2112 if (obj == NULL) {
2113 DRM_ERROR("Failed to allocate semaphore bo. Disabling semaphores\n");
2114 i915.semaphores = 0;
2115 } else {
2116 i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
2117 ret = i915_gem_obj_ggtt_pin(obj, 0, PIN_NONBLOCK);
2118 if (ret != 0) {
2119 drm_gem_object_unreference(&obj->base);
2120 DRM_ERROR("Failed to pin semaphore bo. Disabling semaphores\n");
2121 i915.semaphores = 0;
2122 } else
2123 dev_priv->semaphore_obj = obj;
2124 }
2125 }
2126 ring->add_request = gen6_add_request;
2127 ring->flush = gen8_render_ring_flush;
2128 ring->irq_get = gen8_ring_get_irq;
2129 ring->irq_put = gen8_ring_put_irq;
2130 ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT;
2131 ring->get_seqno = gen6_ring_get_seqno;
2132 ring->set_seqno = ring_set_seqno;
2133 if (i915_semaphore_is_enabled(dev)) {
2134 WARN_ON(!dev_priv->semaphore_obj);
2135 ring->semaphore.sync_to = gen8_ring_sync;
2136 ring->semaphore.signal = gen8_rcs_signal;
2137 GEN8_RING_SEMAPHORE_INIT;
2138 }
2139 } else if (INTEL_INFO(dev)->gen >= 6) {
1950 ring->add_request = gen6_add_request; 2140 ring->add_request = gen6_add_request;
1951 ring->flush = gen7_render_ring_flush; 2141 ring->flush = gen7_render_ring_flush;
1952 if (INTEL_INFO(dev)->gen == 6) 2142 if (INTEL_INFO(dev)->gen == 6)
1953 ring->flush = gen6_render_ring_flush; 2143 ring->flush = gen6_render_ring_flush;
1954 if (INTEL_INFO(dev)->gen >= 8) { 2144 ring->irq_get = gen6_ring_get_irq;
1955 ring->flush = gen8_render_ring_flush; 2145 ring->irq_put = gen6_ring_put_irq;
1956 ring->irq_get = gen8_ring_get_irq;
1957 ring->irq_put = gen8_ring_put_irq;
1958 } else {
1959 ring->irq_get = gen6_ring_get_irq;
1960 ring->irq_put = gen6_ring_put_irq;
1961 }
1962 ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT; 2146 ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT;
1963 ring->get_seqno = gen6_ring_get_seqno; 2147 ring->get_seqno = gen6_ring_get_seqno;
1964 ring->set_seqno = ring_set_seqno; 2148 ring->set_seqno = ring_set_seqno;
1965 ring->semaphore.sync_to = gen6_ring_sync; 2149 if (i915_semaphore_is_enabled(dev)) {
1966 ring->semaphore.signal = gen6_signal; 2150 ring->semaphore.sync_to = gen6_ring_sync;
1967 /* 2151 ring->semaphore.signal = gen6_signal;
1968 * The current semaphore is only applied on pre-gen8 platform. 2152 /*
1969 * And there is no VCS2 ring on the pre-gen8 platform. So the 2153 * The current semaphore is only applied on pre-gen8
1970 * semaphore between RCS and VCS2 is initialized as INVALID. 2154 * platform. And there is no VCS2 ring on the pre-gen8
1971 * Gen8 will initialize the sema between VCS2 and RCS later. 2155 * platform. So the semaphore between RCS and VCS2 is
1972 */ 2156 * initialized as INVALID. Gen8 will initialize the
1973 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_INVALID; 2157 * sema between VCS2 and RCS later.
1974 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_RV; 2158 */
1975 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_RB; 2159 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_INVALID;
1976 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_RVE; 2160 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_RV;
1977 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID; 2161 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_RB;
1978 ring->semaphore.mbox.signal[RCS] = GEN6_NOSYNC; 2162 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_RVE;
1979 ring->semaphore.mbox.signal[VCS] = GEN6_VRSYNC; 2163 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
1980 ring->semaphore.mbox.signal[BCS] = GEN6_BRSYNC; 2164 ring->semaphore.mbox.signal[RCS] = GEN6_NOSYNC;
1981 ring->semaphore.mbox.signal[VECS] = GEN6_VERSYNC; 2165 ring->semaphore.mbox.signal[VCS] = GEN6_VRSYNC;
1982 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC; 2166 ring->semaphore.mbox.signal[BCS] = GEN6_BRSYNC;
2167 ring->semaphore.mbox.signal[VECS] = GEN6_VERSYNC;
2168 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
2169 }
1983 } else if (IS_GEN5(dev)) { 2170 } else if (IS_GEN5(dev)) {
1984 ring->add_request = pc_render_add_request; 2171 ring->add_request = pc_render_add_request;
1985 ring->flush = gen4_render_ring_flush; 2172 ring->flush = gen4_render_ring_flush;
@@ -2007,6 +2194,7 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
2007 ring->irq_enable_mask = I915_USER_INTERRUPT; 2194 ring->irq_enable_mask = I915_USER_INTERRUPT;
2008 } 2195 }
2009 ring->write_tail = ring_write_tail; 2196 ring->write_tail = ring_write_tail;
2197
2010 if (IS_HASWELL(dev)) 2198 if (IS_HASWELL(dev))
2011 ring->dispatch_execbuffer = hsw_ring_dispatch_execbuffer; 2199 ring->dispatch_execbuffer = hsw_ring_dispatch_execbuffer;
2012 else if (IS_GEN8(dev)) 2200 else if (IS_GEN8(dev))
@@ -2024,10 +2212,7 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
2024 2212
2025 /* Workaround batchbuffer to combat CS tlb bug. */ 2213 /* Workaround batchbuffer to combat CS tlb bug. */
2026 if (HAS_BROKEN_CS_TLB(dev)) { 2214 if (HAS_BROKEN_CS_TLB(dev)) {
2027 struct drm_i915_gem_object *obj; 2215 obj = i915_gem_alloc_object(dev, I830_WA_SIZE);
2028 int ret;
2029
2030 obj = i915_gem_alloc_object(dev, I830_BATCH_LIMIT);
2031 if (obj == NULL) { 2216 if (obj == NULL) {
2032 DRM_ERROR("Failed to allocate batch bo\n"); 2217 DRM_ERROR("Failed to allocate batch bo\n");
2033 return -ENOMEM; 2218 return -ENOMEM;
@@ -2157,31 +2342,32 @@ int intel_init_bsd_ring_buffer(struct drm_device *dev)
2157 ring->irq_put = gen8_ring_put_irq; 2342 ring->irq_put = gen8_ring_put_irq;
2158 ring->dispatch_execbuffer = 2343 ring->dispatch_execbuffer =
2159 gen8_ring_dispatch_execbuffer; 2344 gen8_ring_dispatch_execbuffer;
2345 if (i915_semaphore_is_enabled(dev)) {
2346 ring->semaphore.sync_to = gen8_ring_sync;
2347 ring->semaphore.signal = gen8_xcs_signal;
2348 GEN8_RING_SEMAPHORE_INIT;
2349 }
2160 } else { 2350 } else {
2161 ring->irq_enable_mask = GT_BSD_USER_INTERRUPT; 2351 ring->irq_enable_mask = GT_BSD_USER_INTERRUPT;
2162 ring->irq_get = gen6_ring_get_irq; 2352 ring->irq_get = gen6_ring_get_irq;
2163 ring->irq_put = gen6_ring_put_irq; 2353 ring->irq_put = gen6_ring_put_irq;
2164 ring->dispatch_execbuffer = 2354 ring->dispatch_execbuffer =
2165 gen6_ring_dispatch_execbuffer; 2355 gen6_ring_dispatch_execbuffer;
2356 if (i915_semaphore_is_enabled(dev)) {
2357 ring->semaphore.sync_to = gen6_ring_sync;
2358 ring->semaphore.signal = gen6_signal;
2359 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VR;
2360 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_INVALID;
2361 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VB;
2362 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_VVE;
2363 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
2364 ring->semaphore.mbox.signal[RCS] = GEN6_RVSYNC;
2365 ring->semaphore.mbox.signal[VCS] = GEN6_NOSYNC;
2366 ring->semaphore.mbox.signal[BCS] = GEN6_BVSYNC;
2367 ring->semaphore.mbox.signal[VECS] = GEN6_VEVSYNC;
2368 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
2369 }
2166 } 2370 }
2167 ring->semaphore.sync_to = gen6_ring_sync;
2168 ring->semaphore.signal = gen6_signal;
2169 /*
2170 * The current semaphore is only applied on pre-gen8 platform.
2171 * And there is no VCS2 ring on the pre-gen8 platform. So the
2172 * semaphore between VCS and VCS2 is initialized as INVALID.
2173 * Gen8 will initialize the sema between VCS2 and VCS later.
2174 */
2175 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VR;
2176 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_INVALID;
2177 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VB;
2178 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_VVE;
2179 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
2180 ring->semaphore.mbox.signal[RCS] = GEN6_RVSYNC;
2181 ring->semaphore.mbox.signal[VCS] = GEN6_NOSYNC;
2182 ring->semaphore.mbox.signal[BCS] = GEN6_BVSYNC;
2183 ring->semaphore.mbox.signal[VECS] = GEN6_VEVSYNC;
2184 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
2185 } else { 2371 } else {
2186 ring->mmio_base = BSD_RING_BASE; 2372 ring->mmio_base = BSD_RING_BASE;
2187 ring->flush = bsd_ring_flush; 2373 ring->flush = bsd_ring_flush;
@@ -2218,7 +2404,7 @@ int intel_init_bsd2_ring_buffer(struct drm_device *dev)
2218 return -EINVAL; 2404 return -EINVAL;
2219 } 2405 }
2220 2406
2221 ring->name = "bds2_ring"; 2407 ring->name = "bsd2 ring";
2222 ring->id = VCS2; 2408 ring->id = VCS2;
2223 2409
2224 ring->write_tail = ring_write_tail; 2410 ring->write_tail = ring_write_tail;
@@ -2233,25 +2419,11 @@ int intel_init_bsd2_ring_buffer(struct drm_device *dev)
2233 ring->irq_put = gen8_ring_put_irq; 2419 ring->irq_put = gen8_ring_put_irq;
2234 ring->dispatch_execbuffer = 2420 ring->dispatch_execbuffer =
2235 gen8_ring_dispatch_execbuffer; 2421 gen8_ring_dispatch_execbuffer;
2236 ring->semaphore.sync_to = gen6_ring_sync; 2422 if (i915_semaphore_is_enabled(dev)) {
2237 ring->semaphore.signal = gen6_signal; 2423 ring->semaphore.sync_to = gen8_ring_sync;
2238 /* 2424 ring->semaphore.signal = gen8_xcs_signal;
2239 * The current semaphore is only applied on the pre-gen8. And there 2425 GEN8_RING_SEMAPHORE_INIT;
2240 * is no bsd2 ring on the pre-gen8. So now the semaphore_register 2426 }
2241 * between VCS2 and other ring is initialized as invalid.
2242 * Gen8 will initialize the sema between VCS2 and other ring later.
2243 */
2244 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_INVALID;
2245 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_INVALID;
2246 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_INVALID;
2247 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_INVALID;
2248 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
2249 ring->semaphore.mbox.signal[RCS] = GEN6_NOSYNC;
2250 ring->semaphore.mbox.signal[VCS] = GEN6_NOSYNC;
2251 ring->semaphore.mbox.signal[BCS] = GEN6_NOSYNC;
2252 ring->semaphore.mbox.signal[VECS] = GEN6_NOSYNC;
2253 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
2254
2255 ring->init = init_ring_common; 2427 ring->init = init_ring_common;
2256 2428
2257 return intel_init_ring_buffer(dev, ring); 2429 return intel_init_ring_buffer(dev, ring);
@@ -2277,30 +2449,38 @@ int intel_init_blt_ring_buffer(struct drm_device *dev)
2277 ring->irq_get = gen8_ring_get_irq; 2449 ring->irq_get = gen8_ring_get_irq;
2278 ring->irq_put = gen8_ring_put_irq; 2450 ring->irq_put = gen8_ring_put_irq;
2279 ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer; 2451 ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
2452 if (i915_semaphore_is_enabled(dev)) {
2453 ring->semaphore.sync_to = gen8_ring_sync;
2454 ring->semaphore.signal = gen8_xcs_signal;
2455 GEN8_RING_SEMAPHORE_INIT;
2456 }
2280 } else { 2457 } else {
2281 ring->irq_enable_mask = GT_BLT_USER_INTERRUPT; 2458 ring->irq_enable_mask = GT_BLT_USER_INTERRUPT;
2282 ring->irq_get = gen6_ring_get_irq; 2459 ring->irq_get = gen6_ring_get_irq;
2283 ring->irq_put = gen6_ring_put_irq; 2460 ring->irq_put = gen6_ring_put_irq;
2284 ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 2461 ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
2462 if (i915_semaphore_is_enabled(dev)) {
2463 ring->semaphore.signal = gen6_signal;
2464 ring->semaphore.sync_to = gen6_ring_sync;
2465 /*
2466 * The current semaphore is only applied on pre-gen8
2467 * platform. And there is no VCS2 ring on the pre-gen8
2468 * platform. So the semaphore between BCS and VCS2 is
2469 * initialized as INVALID. Gen8 will initialize the
2470 * sema between BCS and VCS2 later.
2471 */
2472 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_BR;
2473 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_BV;
2474 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_INVALID;
2475 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_BVE;
2476 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
2477 ring->semaphore.mbox.signal[RCS] = GEN6_RBSYNC;
2478 ring->semaphore.mbox.signal[VCS] = GEN6_VBSYNC;
2479 ring->semaphore.mbox.signal[BCS] = GEN6_NOSYNC;
2480 ring->semaphore.mbox.signal[VECS] = GEN6_VEBSYNC;
2481 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
2482 }
2285 } 2483 }
2286 ring->semaphore.sync_to = gen6_ring_sync;
2287 ring->semaphore.signal = gen6_signal;
2288 /*
2289 * The current semaphore is only applied on pre-gen8 platform. And
2290 * there is no VCS2 ring on the pre-gen8 platform. So the semaphore
2291 * between BCS and VCS2 is initialized as INVALID.
2292 * Gen8 will initialize the sema between BCS and VCS2 later.
2293 */
2294 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_BR;
2295 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_BV;
2296 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_INVALID;
2297 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_BVE;
2298 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
2299 ring->semaphore.mbox.signal[RCS] = GEN6_RBSYNC;
2300 ring->semaphore.mbox.signal[VCS] = GEN6_VBSYNC;
2301 ring->semaphore.mbox.signal[BCS] = GEN6_NOSYNC;
2302 ring->semaphore.mbox.signal[VECS] = GEN6_VEBSYNC;
2303 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
2304 ring->init = init_ring_common; 2484 ring->init = init_ring_common;
2305 2485
2306 return intel_init_ring_buffer(dev, ring); 2486 return intel_init_ring_buffer(dev, ring);
@@ -2327,24 +2507,31 @@ int intel_init_vebox_ring_buffer(struct drm_device *dev)
2327 ring->irq_get = gen8_ring_get_irq; 2507 ring->irq_get = gen8_ring_get_irq;
2328 ring->irq_put = gen8_ring_put_irq; 2508 ring->irq_put = gen8_ring_put_irq;
2329 ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer; 2509 ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
2510 if (i915_semaphore_is_enabled(dev)) {
2511 ring->semaphore.sync_to = gen8_ring_sync;
2512 ring->semaphore.signal = gen8_xcs_signal;
2513 GEN8_RING_SEMAPHORE_INIT;
2514 }
2330 } else { 2515 } else {
2331 ring->irq_enable_mask = PM_VEBOX_USER_INTERRUPT; 2516 ring->irq_enable_mask = PM_VEBOX_USER_INTERRUPT;
2332 ring->irq_get = hsw_vebox_get_irq; 2517 ring->irq_get = hsw_vebox_get_irq;
2333 ring->irq_put = hsw_vebox_put_irq; 2518 ring->irq_put = hsw_vebox_put_irq;
2334 ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer; 2519 ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
2520 if (i915_semaphore_is_enabled(dev)) {
2521 ring->semaphore.sync_to = gen6_ring_sync;
2522 ring->semaphore.signal = gen6_signal;
2523 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VER;
2524 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_VEV;
2525 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VEB;
2526 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_INVALID;
2527 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
2528 ring->semaphore.mbox.signal[RCS] = GEN6_RVESYNC;
2529 ring->semaphore.mbox.signal[VCS] = GEN6_VVESYNC;
2530 ring->semaphore.mbox.signal[BCS] = GEN6_BVESYNC;
2531 ring->semaphore.mbox.signal[VECS] = GEN6_NOSYNC;
2532 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
2533 }
2335 } 2534 }
2336 ring->semaphore.sync_to = gen6_ring_sync;
2337 ring->semaphore.signal = gen6_signal;
2338 ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VER;
2339 ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_VEV;
2340 ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VEB;
2341 ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_INVALID;
2342 ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
2343 ring->semaphore.mbox.signal[RCS] = GEN6_RVESYNC;
2344 ring->semaphore.mbox.signal[VCS] = GEN6_VVESYNC;
2345 ring->semaphore.mbox.signal[BCS] = GEN6_BVESYNC;
2346 ring->semaphore.mbox.signal[VECS] = GEN6_NOSYNC;
2347 ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
2348 ring->init = init_ring_common; 2535 ring->init = init_ring_common;
2349 2536
2350 return intel_init_ring_buffer(dev, ring); 2537 return intel_init_ring_buffer(dev, ring);