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.c419
1 files changed, 188 insertions, 231 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 0a80e419b589..9f445e9a75d1 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -589,14 +589,10 @@ static int init_ring_common(struct intel_engine_cs *ring)
589 goto out; 589 goto out;
590 } 590 }
591 591
592 if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) 592 ringbuf->head = I915_READ_HEAD(ring);
593 i915_kernel_lost_context(ring->dev); 593 ringbuf->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
594 else { 594 ringbuf->space = intel_ring_space(ringbuf);
595 ringbuf->head = I915_READ_HEAD(ring); 595 ringbuf->last_retired_head = -1;
596 ringbuf->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
597 ringbuf->space = intel_ring_space(ringbuf);
598 ringbuf->last_retired_head = -1;
599 }
600 596
601 memset(&ring->hangcheck, 0, sizeof(ring->hangcheck)); 597 memset(&ring->hangcheck, 0, sizeof(ring->hangcheck));
602 598
@@ -665,76 +661,112 @@ err:
665 return ret; 661 return ret;
666} 662}
667 663
668static inline void intel_ring_emit_wa(struct intel_engine_cs *ring, 664static int intel_ring_workarounds_emit(struct intel_engine_cs *ring,
669 u32 addr, u32 value) 665 struct intel_context *ctx)
670{ 666{
667 int ret, i;
671 struct drm_device *dev = ring->dev; 668 struct drm_device *dev = ring->dev;
672 struct drm_i915_private *dev_priv = dev->dev_private; 669 struct drm_i915_private *dev_priv = dev->dev_private;
670 struct i915_workarounds *w = &dev_priv->workarounds;
673 671
674 if (WARN_ON(dev_priv->num_wa_regs >= I915_MAX_WA_REGS)) 672 if (WARN_ON(w->count == 0))
675 return; 673 return 0;
676 674
677 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); 675 ring->gpu_caches_dirty = true;
678 intel_ring_emit(ring, addr); 676 ret = intel_ring_flush_all_caches(ring);
679 intel_ring_emit(ring, value); 677 if (ret)
678 return ret;
680 679
681 dev_priv->intel_wa_regs[dev_priv->num_wa_regs].addr = addr; 680 ret = intel_ring_begin(ring, (w->count * 2 + 2));
682 dev_priv->intel_wa_regs[dev_priv->num_wa_regs].mask = value & 0xFFFF; 681 if (ret)
683 /* value is updated with the status of remaining bits of this 682 return ret;
684 * register when it is read from debugfs file 683
685 */ 684 intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(w->count));
686 dev_priv->intel_wa_regs[dev_priv->num_wa_regs].value = value; 685 for (i = 0; i < w->count; i++) {
687 dev_priv->num_wa_regs++; 686 intel_ring_emit(ring, w->reg[i].addr);
687 intel_ring_emit(ring, w->reg[i].value);
688 }
689 intel_ring_emit(ring, MI_NOOP);
690
691 intel_ring_advance(ring);
688 692
689 return; 693 ring->gpu_caches_dirty = true;
694 ret = intel_ring_flush_all_caches(ring);
695 if (ret)
696 return ret;
697
698 DRM_DEBUG_DRIVER("Number of Workarounds emitted: %d\n", w->count);
699
700 return 0;
690} 701}
691 702
703static int wa_add(struct drm_i915_private *dev_priv,
704 const u32 addr, const u32 mask, const u32 val)
705{
706 const u32 idx = dev_priv->workarounds.count;
707
708 if (WARN_ON(idx >= I915_MAX_WA_REGS))
709 return -ENOSPC;
710
711 dev_priv->workarounds.reg[idx].addr = addr;
712 dev_priv->workarounds.reg[idx].value = val;
713 dev_priv->workarounds.reg[idx].mask = mask;
714
715 dev_priv->workarounds.count++;
716
717 return 0;
718}
719
720#define WA_REG(addr, mask, val) { \
721 const int r = wa_add(dev_priv, (addr), (mask), (val)); \
722 if (r) \
723 return r; \
724 }
725
726#define WA_SET_BIT_MASKED(addr, mask) \
727 WA_REG(addr, (mask), _MASKED_BIT_ENABLE(mask))
728
729#define WA_CLR_BIT_MASKED(addr, mask) \
730 WA_REG(addr, (mask), _MASKED_BIT_DISABLE(mask))
731
732#define WA_SET_FIELD_MASKED(addr, mask, value) \
733 WA_REG(addr, mask, _MASKED_FIELD(mask, value))
734
735#define WA_SET_BIT(addr, mask) WA_REG(addr, mask, I915_READ(addr) | (mask))
736#define WA_CLR_BIT(addr, mask) WA_REG(addr, mask, I915_READ(addr) & ~(mask))
737
738#define WA_WRITE(addr, val) WA_REG(addr, 0xffffffff, val)
739
692static int bdw_init_workarounds(struct intel_engine_cs *ring) 740static int bdw_init_workarounds(struct intel_engine_cs *ring)
693{ 741{
694 int ret;
695 struct drm_device *dev = ring->dev; 742 struct drm_device *dev = ring->dev;
696 struct drm_i915_private *dev_priv = dev->dev_private; 743 struct drm_i915_private *dev_priv = dev->dev_private;
697 744
698 /*
699 * workarounds applied in this fn are part of register state context,
700 * they need to be re-initialized followed by gpu reset, suspend/resume,
701 * module reload.
702 */
703 dev_priv->num_wa_regs = 0;
704 memset(dev_priv->intel_wa_regs, 0, sizeof(dev_priv->intel_wa_regs));
705
706 /*
707 * update the number of dwords required based on the
708 * actual number of workarounds applied
709 */
710 ret = intel_ring_begin(ring, 18);
711 if (ret)
712 return ret;
713
714 /* WaDisablePartialInstShootdown:bdw */ 745 /* WaDisablePartialInstShootdown:bdw */
715 /* WaDisableThreadStallDopClockGating:bdw */ 746 /* WaDisableThreadStallDopClockGating:bdw (pre-production) */
716 /* FIXME: Unclear whether we really need this on production bdw. */ 747 WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN,
717 intel_ring_emit_wa(ring, GEN8_ROW_CHICKEN, 748 PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE |
718 _MASKED_BIT_ENABLE(PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE 749 STALL_DOP_GATING_DISABLE);
719 | STALL_DOP_GATING_DISABLE));
720 750
721 /* WaDisableDopClockGating:bdw May not be needed for production */ 751 /* WaDisableDopClockGating:bdw */
722 intel_ring_emit_wa(ring, GEN7_ROW_CHICKEN2, 752 WA_SET_BIT_MASKED(GEN7_ROW_CHICKEN2,
723 _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE)); 753 DOP_CLOCK_GATING_DISABLE);
724 754
725 intel_ring_emit_wa(ring, HALF_SLICE_CHICKEN3, 755 WA_SET_BIT_MASKED(HALF_SLICE_CHICKEN3,
726 _MASKED_BIT_ENABLE(GEN8_SAMPLER_POWER_BYPASS_DIS)); 756 GEN8_SAMPLER_POWER_BYPASS_DIS);
727 757
728 /* Use Force Non-Coherent whenever executing a 3D context. This is a 758 /* Use Force Non-Coherent whenever executing a 3D context. This is a
729 * workaround for for a possible hang in the unlikely event a TLB 759 * workaround for for a possible hang in the unlikely event a TLB
730 * invalidation occurs during a PSD flush. 760 * invalidation occurs during a PSD flush.
731 */ 761 */
732 intel_ring_emit_wa(ring, HDC_CHICKEN0, 762 /* WaDisableFenceDestinationToSLM:bdw (GT3 pre-production) */
733 _MASKED_BIT_ENABLE(HDC_FORCE_NON_COHERENT)); 763 WA_SET_BIT_MASKED(HDC_CHICKEN0,
764 HDC_FORCE_NON_COHERENT |
765 (IS_BDW_GT3(dev) ? HDC_FENCE_DEST_SLM_DISABLE : 0));
734 766
735 /* Wa4x4STCOptimizationDisable:bdw */ 767 /* Wa4x4STCOptimizationDisable:bdw */
736 intel_ring_emit_wa(ring, CACHE_MODE_1, 768 WA_SET_BIT_MASKED(CACHE_MODE_1,
737 _MASKED_BIT_ENABLE(GEN8_4x4_STC_OPTIMIZATION_DISABLE)); 769 GEN8_4x4_STC_OPTIMIZATION_DISABLE);
738 770
739 /* 771 /*
740 * BSpec recommends 8x4 when MSAA is used, 772 * BSpec recommends 8x4 when MSAA is used,
@@ -744,52 +776,51 @@ static int bdw_init_workarounds(struct intel_engine_cs *ring)
744 * disable bit, which we don't touch here, but it's good 776 * disable bit, which we don't touch here, but it's good
745 * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM). 777 * to keep in mind (see 3DSTATE_PS and 3DSTATE_WM).
746 */ 778 */
747 intel_ring_emit_wa(ring, GEN7_GT_MODE, 779 WA_SET_FIELD_MASKED(GEN7_GT_MODE,
748 GEN6_WIZ_HASHING_MASK | GEN6_WIZ_HASHING_16x4); 780 GEN6_WIZ_HASHING_MASK,
749 781 GEN6_WIZ_HASHING_16x4);
750 intel_ring_advance(ring);
751
752 DRM_DEBUG_DRIVER("Number of Workarounds applied: %d\n",
753 dev_priv->num_wa_regs);
754 782
755 return 0; 783 return 0;
756} 784}
757 785
758static int chv_init_workarounds(struct intel_engine_cs *ring) 786static int chv_init_workarounds(struct intel_engine_cs *ring)
759{ 787{
760 int ret;
761 struct drm_device *dev = ring->dev; 788 struct drm_device *dev = ring->dev;
762 struct drm_i915_private *dev_priv = dev->dev_private; 789 struct drm_i915_private *dev_priv = dev->dev_private;
763 790
764 /* 791 /* WaDisablePartialInstShootdown:chv */
765 * workarounds applied in this fn are part of register state context, 792 /* WaDisableThreadStallDopClockGating:chv */
766 * they need to be re-initialized followed by gpu reset, suspend/resume, 793 WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN,
767 * module reload. 794 PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE |
795 STALL_DOP_GATING_DISABLE);
796
797 /* Use Force Non-Coherent whenever executing a 3D context. This is a
798 * workaround for a possible hang in the unlikely event a TLB
799 * invalidation occurs during a PSD flush.
768 */ 800 */
769 dev_priv->num_wa_regs = 0; 801 /* WaForceEnableNonCoherent:chv */
770 memset(dev_priv->intel_wa_regs, 0, sizeof(dev_priv->intel_wa_regs)); 802 /* WaHdcDisableFetchWhenMasked:chv */
803 WA_SET_BIT_MASKED(HDC_CHICKEN0,
804 HDC_FORCE_NON_COHERENT |
805 HDC_DONOT_FETCH_MEM_WHEN_MASKED);
771 806
772 ret = intel_ring_begin(ring, 12); 807 return 0;
773 if (ret) 808}
774 return ret;
775 809
776 /* WaDisablePartialInstShootdown:chv */ 810int init_workarounds_ring(struct intel_engine_cs *ring)
777 intel_ring_emit_wa(ring, GEN8_ROW_CHICKEN, 811{
778 _MASKED_BIT_ENABLE(PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE)); 812 struct drm_device *dev = ring->dev;
813 struct drm_i915_private *dev_priv = dev->dev_private;
779 814
780 /* WaDisableThreadStallDopClockGating:chv */ 815 WARN_ON(ring->id != RCS);
781 intel_ring_emit_wa(ring, GEN8_ROW_CHICKEN,
782 _MASKED_BIT_ENABLE(STALL_DOP_GATING_DISABLE));
783 816
784 /* WaDisableDopClockGating:chv (pre-production hw) */ 817 dev_priv->workarounds.count = 0;
785 intel_ring_emit_wa(ring, GEN7_ROW_CHICKEN2,
786 _MASKED_BIT_ENABLE(DOP_CLOCK_GATING_DISABLE));
787 818
788 /* WaDisableSamplerPowerBypass:chv (pre-production hw) */ 819 if (IS_BROADWELL(dev))
789 intel_ring_emit_wa(ring, HALF_SLICE_CHICKEN3, 820 return bdw_init_workarounds(ring);
790 _MASKED_BIT_ENABLE(GEN8_SAMPLER_POWER_BYPASS_DIS));
791 821
792 intel_ring_advance(ring); 822 if (IS_CHERRYVIEW(dev))
823 return chv_init_workarounds(ring);
793 824
794 return 0; 825 return 0;
795} 826}
@@ -812,7 +843,7 @@ static int init_render_ring(struct intel_engine_cs *ring)
812 * 843 *
813 * WaDisableAsyncFlipPerfMode:snb,ivb,hsw,vlv,bdw,chv 844 * WaDisableAsyncFlipPerfMode:snb,ivb,hsw,vlv,bdw,chv
814 */ 845 */
815 if (INTEL_INFO(dev)->gen >= 6) 846 if (INTEL_INFO(dev)->gen >= 6 && INTEL_INFO(dev)->gen < 9)
816 I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(ASYNC_FLIP_PERF_DISABLE)); 847 I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(ASYNC_FLIP_PERF_DISABLE));
817 848
818 /* Required for the hardware to program scanline values for waiting */ 849 /* Required for the hardware to program scanline values for waiting */
@@ -849,7 +880,7 @@ static int init_render_ring(struct intel_engine_cs *ring)
849 if (HAS_L3_DPF(dev)) 880 if (HAS_L3_DPF(dev))
850 I915_WRITE_IMR(ring, ~GT_PARITY_ERROR(dev)); 881 I915_WRITE_IMR(ring, ~GT_PARITY_ERROR(dev));
851 882
852 return ret; 883 return init_workarounds_ring(ring);
853} 884}
854 885
855static void render_ring_cleanup(struct intel_engine_cs *ring) 886static void render_ring_cleanup(struct intel_engine_cs *ring)
@@ -1186,7 +1217,7 @@ gen5_ring_get_irq(struct intel_engine_cs *ring)
1186 struct drm_i915_private *dev_priv = dev->dev_private; 1217 struct drm_i915_private *dev_priv = dev->dev_private;
1187 unsigned long flags; 1218 unsigned long flags;
1188 1219
1189 if (!dev->irq_enabled) 1220 if (WARN_ON(!intel_irqs_enabled(dev_priv)))
1190 return false; 1221 return false;
1191 1222
1192 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1223 spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@ -1217,7 +1248,7 @@ i9xx_ring_get_irq(struct intel_engine_cs *ring)
1217 struct drm_i915_private *dev_priv = dev->dev_private; 1248 struct drm_i915_private *dev_priv = dev->dev_private;
1218 unsigned long flags; 1249 unsigned long flags;
1219 1250
1220 if (!dev->irq_enabled) 1251 if (!intel_irqs_enabled(dev_priv))
1221 return false; 1252 return false;
1222 1253
1223 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1254 spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@ -1254,7 +1285,7 @@ i8xx_ring_get_irq(struct intel_engine_cs *ring)
1254 struct drm_i915_private *dev_priv = dev->dev_private; 1285 struct drm_i915_private *dev_priv = dev->dev_private;
1255 unsigned long flags; 1286 unsigned long flags;
1256 1287
1257 if (!dev->irq_enabled) 1288 if (!intel_irqs_enabled(dev_priv))
1258 return false; 1289 return false;
1259 1290
1260 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1291 spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@ -1388,8 +1419,8 @@ gen6_ring_get_irq(struct intel_engine_cs *ring)
1388 struct drm_i915_private *dev_priv = dev->dev_private; 1419 struct drm_i915_private *dev_priv = dev->dev_private;
1389 unsigned long flags; 1420 unsigned long flags;
1390 1421
1391 if (!dev->irq_enabled) 1422 if (WARN_ON(!intel_irqs_enabled(dev_priv)))
1392 return false; 1423 return false;
1393 1424
1394 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1425 spin_lock_irqsave(&dev_priv->irq_lock, flags);
1395 if (ring->irq_refcount++ == 0) { 1426 if (ring->irq_refcount++ == 0) {
@@ -1431,7 +1462,7 @@ hsw_vebox_get_irq(struct intel_engine_cs *ring)
1431 struct drm_i915_private *dev_priv = dev->dev_private; 1462 struct drm_i915_private *dev_priv = dev->dev_private;
1432 unsigned long flags; 1463 unsigned long flags;
1433 1464
1434 if (!dev->irq_enabled) 1465 if (WARN_ON(!intel_irqs_enabled(dev_priv)))
1435 return false; 1466 return false;
1436 1467
1437 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1468 spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@ -1451,9 +1482,6 @@ hsw_vebox_put_irq(struct intel_engine_cs *ring)
1451 struct drm_i915_private *dev_priv = dev->dev_private; 1482 struct drm_i915_private *dev_priv = dev->dev_private;
1452 unsigned long flags; 1483 unsigned long flags;
1453 1484
1454 if (!dev->irq_enabled)
1455 return;
1456
1457 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1485 spin_lock_irqsave(&dev_priv->irq_lock, flags);
1458 if (--ring->irq_refcount == 0) { 1486 if (--ring->irq_refcount == 0) {
1459 I915_WRITE_IMR(ring, ~0); 1487 I915_WRITE_IMR(ring, ~0);
@@ -1469,7 +1497,7 @@ gen8_ring_get_irq(struct intel_engine_cs *ring)
1469 struct drm_i915_private *dev_priv = dev->dev_private; 1497 struct drm_i915_private *dev_priv = dev->dev_private;
1470 unsigned long flags; 1498 unsigned long flags;
1471 1499
1472 if (!dev->irq_enabled) 1500 if (WARN_ON(!intel_irqs_enabled(dev_priv)))
1473 return false; 1501 return false;
1474 1502
1475 spin_lock_irqsave(&dev_priv->irq_lock, flags); 1503 spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@ -1694,13 +1722,42 @@ static int init_phys_status_page(struct intel_engine_cs *ring)
1694 return 0; 1722 return 0;
1695} 1723}
1696 1724
1697void intel_destroy_ringbuffer_obj(struct intel_ringbuffer *ringbuf) 1725void intel_unpin_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
1698{ 1726{
1699 if (!ringbuf->obj)
1700 return;
1701
1702 iounmap(ringbuf->virtual_start); 1727 iounmap(ringbuf->virtual_start);
1728 ringbuf->virtual_start = NULL;
1703 i915_gem_object_ggtt_unpin(ringbuf->obj); 1729 i915_gem_object_ggtt_unpin(ringbuf->obj);
1730}
1731
1732int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev,
1733 struct intel_ringbuffer *ringbuf)
1734{
1735 struct drm_i915_private *dev_priv = to_i915(dev);
1736 struct drm_i915_gem_object *obj = ringbuf->obj;
1737 int ret;
1738
1739 ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, PIN_MAPPABLE);
1740 if (ret)
1741 return ret;
1742
1743 ret = i915_gem_object_set_to_gtt_domain(obj, true);
1744 if (ret) {
1745 i915_gem_object_ggtt_unpin(obj);
1746 return ret;
1747 }
1748
1749 ringbuf->virtual_start = ioremap_wc(dev_priv->gtt.mappable_base +
1750 i915_gem_obj_ggtt_offset(obj), ringbuf->size);
1751 if (ringbuf->virtual_start == NULL) {
1752 i915_gem_object_ggtt_unpin(obj);
1753 return -EINVAL;
1754 }
1755
1756 return 0;
1757}
1758
1759void intel_destroy_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
1760{
1704 drm_gem_object_unreference(&ringbuf->obj->base); 1761 drm_gem_object_unreference(&ringbuf->obj->base);
1705 ringbuf->obj = NULL; 1762 ringbuf->obj = NULL;
1706} 1763}
@@ -1708,12 +1765,7 @@ void intel_destroy_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
1708int intel_alloc_ringbuffer_obj(struct drm_device *dev, 1765int intel_alloc_ringbuffer_obj(struct drm_device *dev,
1709 struct intel_ringbuffer *ringbuf) 1766 struct intel_ringbuffer *ringbuf)
1710{ 1767{
1711 struct drm_i915_private *dev_priv = to_i915(dev);
1712 struct drm_i915_gem_object *obj; 1768 struct drm_i915_gem_object *obj;
1713 int ret;
1714
1715 if (ringbuf->obj)
1716 return 0;
1717 1769
1718 obj = NULL; 1770 obj = NULL;
1719 if (!HAS_LLC(dev)) 1771 if (!HAS_LLC(dev))
@@ -1726,30 +1778,9 @@ int intel_alloc_ringbuffer_obj(struct drm_device *dev,
1726 /* mark ring buffers as read-only from GPU side by default */ 1778 /* mark ring buffers as read-only from GPU side by default */
1727 obj->gt_ro = 1; 1779 obj->gt_ro = 1;
1728 1780
1729 ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, PIN_MAPPABLE);
1730 if (ret)
1731 goto err_unref;
1732
1733 ret = i915_gem_object_set_to_gtt_domain(obj, true);
1734 if (ret)
1735 goto err_unpin;
1736
1737 ringbuf->virtual_start =
1738 ioremap_wc(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj),
1739 ringbuf->size);
1740 if (ringbuf->virtual_start == NULL) {
1741 ret = -EINVAL;
1742 goto err_unpin;
1743 }
1744
1745 ringbuf->obj = obj; 1781 ringbuf->obj = obj;
1746 return 0;
1747 1782
1748err_unpin: 1783 return 0;
1749 i915_gem_object_ggtt_unpin(obj);
1750err_unref:
1751 drm_gem_object_unreference(&obj->base);
1752 return ret;
1753} 1784}
1754 1785
1755static int intel_init_ring_buffer(struct drm_device *dev, 1786static int intel_init_ring_buffer(struct drm_device *dev,
@@ -1786,10 +1817,21 @@ static int intel_init_ring_buffer(struct drm_device *dev,
1786 goto error; 1817 goto error;
1787 } 1818 }
1788 1819
1789 ret = intel_alloc_ringbuffer_obj(dev, ringbuf); 1820 if (ringbuf->obj == NULL) {
1790 if (ret) { 1821 ret = intel_alloc_ringbuffer_obj(dev, ringbuf);
1791 DRM_ERROR("Failed to allocate ringbuffer %s: %d\n", ring->name, ret); 1822 if (ret) {
1792 goto error; 1823 DRM_ERROR("Failed to allocate ringbuffer %s: %d\n",
1824 ring->name, ret);
1825 goto error;
1826 }
1827
1828 ret = intel_pin_and_map_ringbuffer_obj(dev, ringbuf);
1829 if (ret) {
1830 DRM_ERROR("Failed to pin and map ringbuffer %s: %d\n",
1831 ring->name, ret);
1832 intel_destroy_ringbuffer_obj(ringbuf);
1833 goto error;
1834 }
1793 } 1835 }
1794 1836
1795 /* Workaround an erratum on the i830 which causes a hang if 1837 /* Workaround an erratum on the i830 which causes a hang if
@@ -1818,15 +1860,19 @@ error:
1818 1860
1819void intel_cleanup_ring_buffer(struct intel_engine_cs *ring) 1861void intel_cleanup_ring_buffer(struct intel_engine_cs *ring)
1820{ 1862{
1821 struct drm_i915_private *dev_priv = to_i915(ring->dev); 1863 struct drm_i915_private *dev_priv;
1822 struct intel_ringbuffer *ringbuf = ring->buffer; 1864 struct intel_ringbuffer *ringbuf;
1823 1865
1824 if (!intel_ring_initialized(ring)) 1866 if (!intel_ring_initialized(ring))
1825 return; 1867 return;
1826 1868
1869 dev_priv = to_i915(ring->dev);
1870 ringbuf = ring->buffer;
1871
1827 intel_stop_ring_buffer(ring); 1872 intel_stop_ring_buffer(ring);
1828 WARN_ON(!IS_GEN2(ring->dev) && (I915_READ_MODE(ring) & MODE_IDLE) == 0); 1873 WARN_ON(!IS_GEN2(ring->dev) && (I915_READ_MODE(ring) & MODE_IDLE) == 0);
1829 1874
1875 intel_unpin_ringbuffer_obj(ringbuf);
1830 intel_destroy_ringbuffer_obj(ringbuf); 1876 intel_destroy_ringbuffer_obj(ringbuf);
1831 ring->preallocated_lazy_request = NULL; 1877 ring->preallocated_lazy_request = NULL;
1832 ring->outstanding_lazy_seqno = 0; 1878 ring->outstanding_lazy_seqno = 0;
@@ -1912,13 +1958,6 @@ static int ring_wait_for_space(struct intel_engine_cs *ring, int n)
1912 break; 1958 break;
1913 } 1959 }
1914 1960
1915 if (!drm_core_check_feature(dev, DRIVER_MODESET) &&
1916 dev->primary->master) {
1917 struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv;
1918 if (master_priv->sarea_priv)
1919 master_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;
1920 }
1921
1922 msleep(1); 1961 msleep(1);
1923 1962
1924 if (dev_priv->mm.interruptible && signal_pending(current)) { 1963 if (dev_priv->mm.interruptible && signal_pending(current)) {
@@ -2229,6 +2268,7 @@ static int gen6_ring_flush(struct intel_engine_cs *ring,
2229 u32 invalidate, u32 flush) 2268 u32 invalidate, u32 flush)
2230{ 2269{
2231 struct drm_device *dev = ring->dev; 2270 struct drm_device *dev = ring->dev;
2271 struct drm_i915_private *dev_priv = dev->dev_private;
2232 uint32_t cmd; 2272 uint32_t cmd;
2233 int ret; 2273 int ret;
2234 2274
@@ -2259,8 +2299,12 @@ static int gen6_ring_flush(struct intel_engine_cs *ring,
2259 } 2299 }
2260 intel_ring_advance(ring); 2300 intel_ring_advance(ring);
2261 2301
2262 if (IS_GEN7(dev) && !invalidate && flush) 2302 if (!invalidate && flush) {
2263 return gen7_ring_fbc_flush(ring, FBC_REND_CACHE_CLEAN); 2303 if (IS_GEN7(dev))
2304 return gen7_ring_fbc_flush(ring, FBC_REND_CACHE_CLEAN);
2305 else if (IS_BROADWELL(dev))
2306 dev_priv->fbc.need_sw_cache_clean = true;
2307 }
2264 2308
2265 return 0; 2309 return 0;
2266} 2310}
@@ -2293,10 +2337,8 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
2293 dev_priv->semaphore_obj = obj; 2337 dev_priv->semaphore_obj = obj;
2294 } 2338 }
2295 } 2339 }
2296 if (IS_CHERRYVIEW(dev)) 2340
2297 ring->init_context = chv_init_workarounds; 2341 ring->init_context = intel_ring_workarounds_emit;
2298 else
2299 ring->init_context = bdw_init_workarounds;
2300 ring->add_request = gen6_add_request; 2342 ring->add_request = gen6_add_request;
2301 ring->flush = gen8_render_ring_flush; 2343 ring->flush = gen8_render_ring_flush;
2302 ring->irq_get = gen8_ring_get_irq; 2344 ring->irq_get = gen8_ring_get_irq;
@@ -2406,91 +2448,6 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
2406 return intel_init_ring_buffer(dev, ring); 2448 return intel_init_ring_buffer(dev, ring);
2407} 2449}
2408 2450
2409int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size)
2410{
2411 struct drm_i915_private *dev_priv = dev->dev_private;
2412 struct intel_engine_cs *ring = &dev_priv->ring[RCS];
2413 struct intel_ringbuffer *ringbuf = ring->buffer;
2414 int ret;
2415
2416 if (ringbuf == NULL) {
2417 ringbuf = kzalloc(sizeof(*ringbuf), GFP_KERNEL);
2418 if (!ringbuf)
2419 return -ENOMEM;
2420 ring->buffer = ringbuf;
2421 }
2422
2423 ring->name = "render ring";
2424 ring->id = RCS;
2425 ring->mmio_base = RENDER_RING_BASE;
2426
2427 if (INTEL_INFO(dev)->gen >= 6) {
2428 /* non-kms not supported on gen6+ */
2429 ret = -ENODEV;
2430 goto err_ringbuf;
2431 }
2432
2433 /* Note: gem is not supported on gen5/ilk without kms (the corresponding
2434 * gem_init ioctl returns with -ENODEV). Hence we do not need to set up
2435 * the special gen5 functions. */
2436 ring->add_request = i9xx_add_request;
2437 if (INTEL_INFO(dev)->gen < 4)
2438 ring->flush = gen2_render_ring_flush;
2439 else
2440 ring->flush = gen4_render_ring_flush;
2441 ring->get_seqno = ring_get_seqno;
2442 ring->set_seqno = ring_set_seqno;
2443 if (IS_GEN2(dev)) {
2444 ring->irq_get = i8xx_ring_get_irq;
2445 ring->irq_put = i8xx_ring_put_irq;
2446 } else {
2447 ring->irq_get = i9xx_ring_get_irq;
2448 ring->irq_put = i9xx_ring_put_irq;
2449 }
2450 ring->irq_enable_mask = I915_USER_INTERRUPT;
2451 ring->write_tail = ring_write_tail;
2452 if (INTEL_INFO(dev)->gen >= 4)
2453 ring->dispatch_execbuffer = i965_dispatch_execbuffer;
2454 else if (IS_I830(dev) || IS_845G(dev))
2455 ring->dispatch_execbuffer = i830_dispatch_execbuffer;
2456 else
2457 ring->dispatch_execbuffer = i915_dispatch_execbuffer;
2458 ring->init = init_render_ring;
2459 ring->cleanup = render_ring_cleanup;
2460
2461 ring->dev = dev;
2462 INIT_LIST_HEAD(&ring->active_list);
2463 INIT_LIST_HEAD(&ring->request_list);
2464
2465 ringbuf->size = size;
2466 ringbuf->effective_size = ringbuf->size;
2467 if (IS_I830(ring->dev) || IS_845G(ring->dev))
2468 ringbuf->effective_size -= 2 * CACHELINE_BYTES;
2469
2470 ringbuf->virtual_start = ioremap_wc(start, size);
2471 if (ringbuf->virtual_start == NULL) {
2472 DRM_ERROR("can not ioremap virtual address for"
2473 " ring buffer\n");
2474 ret = -ENOMEM;
2475 goto err_ringbuf;
2476 }
2477
2478 if (!I915_NEED_GFX_HWS(dev)) {
2479 ret = init_phys_status_page(ring);
2480 if (ret)
2481 goto err_vstart;
2482 }
2483
2484 return 0;
2485
2486err_vstart:
2487 iounmap(ringbuf->virtual_start);
2488err_ringbuf:
2489 kfree(ringbuf);
2490 ring->buffer = NULL;
2491 return ret;
2492}
2493
2494int intel_init_bsd_ring_buffer(struct drm_device *dev) 2451int intel_init_bsd_ring_buffer(struct drm_device *dev)
2495{ 2452{
2496 struct drm_i915_private *dev_priv = dev->dev_private; 2453 struct drm_i915_private *dev_priv = dev->dev_private;