diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 557 |
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 | ||
51 | static inline int ring_space(struct intel_engine_cs *ring) | 51 | static 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 | ||
383 | static int | 382 | static int |
383 | gen8_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 | |||
403 | static int | ||
384 | gen8_render_ring_flush(struct intel_engine_cs *ring, | 404 | gen8_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 | ||
424 | static void ring_write_tail(struct intel_engine_cs *ring, | 439 | static 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) | |||
658 | static void render_ring_cleanup(struct intel_engine_cs *ring) | 678 | static 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 | ||
701 | static 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 | |||
739 | static 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 | |||
674 | static int gen6_signal(struct intel_engine_cs *signaller, | 775 | static 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 | |||
854 | static int | ||
855 | gen8_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 | |||
757 | static int | 879 | static int |
758 | gen6_ring_sync(struct intel_engine_cs *waiter, | 880 | gen6_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) | ||
1244 | static int | 1368 | static int |
1245 | i830_dispatch_execbuffer(struct intel_engine_cs *ring, | 1369 | i830_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) { |
1346 | err_unref: | 1494 | err_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 | ||
1381 | static int allocate_ring_buffer(struct intel_engine_cs *ring) | 1529 | static 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 | |||
1540 | static 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 | ||
1747 | void intel_ring_init_seqno(struct intel_engine_cs *ring, u32 seqno) | 1904 | void 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); |