aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorJeff McGee <jeff.mcgee@intel.com>2015-02-13 11:27:56 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-02-23 17:57:13 -0500
commit0cea6502bf9c40c9da43439786788c997be43df3 (patch)
treec5b4330d9050c0385e4fdfa7704e45a1a4520eec /drivers/gpu
parent7f992aba1eb5a8b57d6e9c9b22cd90ba7aec0e26 (diff)
drm/i915: Request full SSEU enablement on Gen9
On Gen9 the render power gating can leave slice/subslice/EU in a partially enabled state. We must make an explicit request for full SSEU enablement through the Render Power Clock State register when resuming render work. This register is save/ restored in the logical ring context image for execlist submission mode. Initialize its value in each LRC image to request full enablement according to the device SSEU config. Thanks to Sharma Ankitprasad and Akash Goel for highlighting the issue and proposing the initial fix on which this patch is based. v2: Adjusted the names of the power gating support flags to fit update of an earlier patch. Signed-off-by: Jeff McGee <jeff.mcgee@intel.com> Reviewed-by: "Akash Goel <akash.goel@intel.com>" Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h13
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c47
2 files changed, 58 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 4da883b2c3c8..5fab90c84c5d 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -139,6 +139,19 @@
139#define GEN8_RING_PDP_UDW(ring, n) ((ring)->mmio_base+0x270 + ((n) * 8 + 4)) 139#define GEN8_RING_PDP_UDW(ring, n) ((ring)->mmio_base+0x270 + ((n) * 8 + 4))
140#define GEN8_RING_PDP_LDW(ring, n) ((ring)->mmio_base+0x270 + (n) * 8) 140#define GEN8_RING_PDP_LDW(ring, n) ((ring)->mmio_base+0x270 + (n) * 8)
141 141
142#define GEN8_R_PWR_CLK_STATE 0x20C8
143#define GEN8_RPCS_ENABLE (1 << 31)
144#define GEN8_RPCS_S_CNT_ENABLE (1 << 18)
145#define GEN8_RPCS_S_CNT_SHIFT 15
146#define GEN8_RPCS_S_CNT_MASK (0x7 << GEN8_RPCS_S_CNT_SHIFT)
147#define GEN8_RPCS_SS_CNT_ENABLE (1 << 11)
148#define GEN8_RPCS_SS_CNT_SHIFT 8
149#define GEN8_RPCS_SS_CNT_MASK (0x7 << GEN8_RPCS_SS_CNT_SHIFT)
150#define GEN8_RPCS_EU_MAX_SHIFT 4
151#define GEN8_RPCS_EU_MAX_MASK (0xf << GEN8_RPCS_EU_MAX_SHIFT)
152#define GEN8_RPCS_EU_MIN_SHIFT 0
153#define GEN8_RPCS_EU_MIN_MASK (0xf << GEN8_RPCS_EU_MIN_SHIFT)
154
142#define GAM_ECOCHK 0x4090 155#define GAM_ECOCHK 0x4090
143#define BDW_DISABLE_HDC_INVALIDATION (1<<25) 156#define BDW_DISABLE_HDC_INVALIDATION (1<<25)
144#define ECOCHK_SNB_BIT (1<<10) 157#define ECOCHK_SNB_BIT (1<<10)
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index b355da4cae88..98c87f617bf2 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1636,6 +1636,49 @@ cleanup_render_ring:
1636 return ret; 1636 return ret;
1637} 1637}
1638 1638
1639static u32
1640make_rpcs(struct drm_device *dev)
1641{
1642 u32 rpcs = 0;
1643
1644 /*
1645 * No explicit RPCS request is needed to ensure full
1646 * slice/subslice/EU enablement prior to Gen9.
1647 */
1648 if (INTEL_INFO(dev)->gen < 9)
1649 return 0;
1650
1651 /*
1652 * Starting in Gen9, render power gating can leave
1653 * slice/subslice/EU in a partially enabled state. We
1654 * must make an explicit request through RPCS for full
1655 * enablement.
1656 */
1657 if (INTEL_INFO(dev)->has_slice_pg) {
1658 rpcs |= GEN8_RPCS_S_CNT_ENABLE;
1659 rpcs |= INTEL_INFO(dev)->slice_total <<
1660 GEN8_RPCS_S_CNT_SHIFT;
1661 rpcs |= GEN8_RPCS_ENABLE;
1662 }
1663
1664 if (INTEL_INFO(dev)->has_subslice_pg) {
1665 rpcs |= GEN8_RPCS_SS_CNT_ENABLE;
1666 rpcs |= INTEL_INFO(dev)->subslice_per_slice <<
1667 GEN8_RPCS_SS_CNT_SHIFT;
1668 rpcs |= GEN8_RPCS_ENABLE;
1669 }
1670
1671 if (INTEL_INFO(dev)->has_eu_pg) {
1672 rpcs |= INTEL_INFO(dev)->eu_per_subslice <<
1673 GEN8_RPCS_EU_MIN_SHIFT;
1674 rpcs |= INTEL_INFO(dev)->eu_per_subslice <<
1675 GEN8_RPCS_EU_MAX_SHIFT;
1676 rpcs |= GEN8_RPCS_ENABLE;
1677 }
1678
1679 return rpcs;
1680}
1681
1639static int 1682static int
1640populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_obj, 1683populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_obj,
1641 struct intel_engine_cs *ring, struct intel_ringbuffer *ringbuf) 1684 struct intel_engine_cs *ring, struct intel_ringbuffer *ringbuf)
@@ -1739,8 +1782,8 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
1739 reg_state[CTX_PDP0_LDW+1] = lower_32_bits(ppgtt->pd_dma_addr[0]); 1782 reg_state[CTX_PDP0_LDW+1] = lower_32_bits(ppgtt->pd_dma_addr[0]);
1740 if (ring->id == RCS) { 1783 if (ring->id == RCS) {
1741 reg_state[CTX_LRI_HEADER_2] = MI_LOAD_REGISTER_IMM(1); 1784 reg_state[CTX_LRI_HEADER_2] = MI_LOAD_REGISTER_IMM(1);
1742 reg_state[CTX_R_PWR_CLK_STATE] = 0x20c8; 1785 reg_state[CTX_R_PWR_CLK_STATE] = GEN8_R_PWR_CLK_STATE;
1743 reg_state[CTX_R_PWR_CLK_STATE+1] = 0; 1786 reg_state[CTX_R_PWR_CLK_STATE+1] = make_rpcs(dev);
1744 } 1787 }
1745 1788
1746 kunmap_atomic(reg_state); 1789 kunmap_atomic(reg_state);