aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2014-07-01 05:36:17 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-07 05:33:36 -0400
commit5209b1f4c4f8036f52f5ac2df2afc806254f247f (patch)
tree6935ff6a0c599d8b145ab99cae02b3db1b0ad97e
parentd2011dc8d41b20dc0ec0bf741c61fe500dc8d0bc (diff)
drm/i915: gmch: factor out intel_set_memory_cxsr
This functionality will be also needed by an upcoming patch, so factor it out. As a bonus this also makes things a bit more uniform across platforms. Note that this also changes the register read-modify-write to a simple write during disabling. This is what we do during enabling anyway and according to the spec all the relevant bits are reserved-MBZ or reserved with a 0 default value. v2: - unchanged v3: - fix missing cxsr disabling on pineview (Deepak) Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Deepak S <deepak.s@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c76
2 files changed, 40 insertions, 38 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index a503a5301dea..38362863b1dc 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2649,6 +2649,8 @@ extern void gen6_set_rps(struct drm_device *dev, u8 val);
2649extern void valleyview_set_rps(struct drm_device *dev, u8 val); 2649extern void valleyview_set_rps(struct drm_device *dev, u8 val);
2650extern int valleyview_rps_max_freq(struct drm_i915_private *dev_priv); 2650extern int valleyview_rps_max_freq(struct drm_i915_private *dev_priv);
2651extern int valleyview_rps_min_freq(struct drm_i915_private *dev_priv); 2651extern int valleyview_rps_min_freq(struct drm_i915_private *dev_priv);
2652extern void intel_set_memory_cxsr(struct drm_i915_private *dev_priv,
2653 bool enable);
2652extern void intel_detect_pch(struct drm_device *dev); 2654extern void intel_detect_pch(struct drm_device *dev);
2653extern int intel_trans_dp_port_sel(struct drm_crtc *crtc); 2655extern int intel_trans_dp_port_sel(struct drm_crtc *crtc);
2654extern int intel_enable_rc6(const struct drm_device *dev); 2656extern int intel_enable_rc6(const struct drm_device *dev);
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 01498fabd0fd..ded429459342 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -816,12 +816,33 @@ static const struct cxsr_latency *intel_get_cxsr_latency(int is_desktop,
816 return NULL; 816 return NULL;
817} 817}
818 818
819static void pineview_disable_cxsr(struct drm_device *dev) 819void intel_set_memory_cxsr(struct drm_i915_private *dev_priv, bool enable)
820{ 820{
821 struct drm_i915_private *dev_priv = dev->dev_private; 821 struct drm_device *dev = dev_priv->dev;
822 u32 val;
822 823
823 /* deactivate cxsr */ 824 if (IS_VALLEYVIEW(dev)) {
824 I915_WRITE(DSPFW3, I915_READ(DSPFW3) & ~PINEVIEW_SELF_REFRESH_EN); 825 I915_WRITE(FW_BLC_SELF_VLV, enable ? FW_CSPWRDWNEN : 0);
826 } else if (IS_G4X(dev) || IS_CRESTLINE(dev)) {
827 I915_WRITE(FW_BLC_SELF, enable ? FW_BLC_SELF_EN : 0);
828 } else if (IS_PINEVIEW(dev)) {
829 val = I915_READ(DSPFW3) & ~PINEVIEW_SELF_REFRESH_EN;
830 val |= enable ? PINEVIEW_SELF_REFRESH_EN : 0;
831 I915_WRITE(DSPFW3, val);
832 } else if (IS_I945G(dev) || IS_I945GM(dev)) {
833 val = enable ? _MASKED_BIT_ENABLE(FW_BLC_SELF_EN) :
834 _MASKED_BIT_DISABLE(FW_BLC_SELF_EN);
835 I915_WRITE(FW_BLC_SELF, val);
836 } else if (IS_I915GM(dev)) {
837 val = enable ? _MASKED_BIT_ENABLE(INSTPM_SELF_EN) :
838 _MASKED_BIT_DISABLE(INSTPM_SELF_EN);
839 I915_WRITE(INSTPM, val);
840 } else {
841 return;
842 }
843
844 DRM_DEBUG_KMS("memory self-refresh is %s\n",
845 enable ? "enabled" : "disabled");
825} 846}
826 847
827/* 848/*
@@ -1060,7 +1081,7 @@ static void pineview_update_wm(struct drm_crtc *unused_crtc)
1060 dev_priv->fsb_freq, dev_priv->mem_freq); 1081 dev_priv->fsb_freq, dev_priv->mem_freq);
1061 if (!latency) { 1082 if (!latency) {
1062 DRM_DEBUG_KMS("Unknown FSB/MEM found, disable CxSR\n"); 1083 DRM_DEBUG_KMS("Unknown FSB/MEM found, disable CxSR\n");
1063 pineview_disable_cxsr(dev); 1084 intel_set_memory_cxsr(dev_priv, false);
1064 return; 1085 return;
1065 } 1086 }
1066 1087
@@ -1111,13 +1132,9 @@ static void pineview_update_wm(struct drm_crtc *unused_crtc)
1111 I915_WRITE(DSPFW3, reg); 1132 I915_WRITE(DSPFW3, reg);
1112 DRM_DEBUG_KMS("DSPFW3 register is %x\n", reg); 1133 DRM_DEBUG_KMS("DSPFW3 register is %x\n", reg);
1113 1134
1114 /* activate cxsr */ 1135 intel_set_memory_cxsr(dev_priv, true);
1115 I915_WRITE(DSPFW3,
1116 I915_READ(DSPFW3) | PINEVIEW_SELF_REFRESH_EN);
1117 DRM_DEBUG_KMS("Self-refresh is enabled\n");
1118 } else { 1136 } else {
1119 pineview_disable_cxsr(dev); 1137 intel_set_memory_cxsr(dev_priv, false);
1120 DRM_DEBUG_KMS("Self-refresh is disabled\n");
1121 } 1138 }
1122} 1139}
1123 1140
@@ -1369,10 +1386,9 @@ static void valleyview_update_wm(struct drm_crtc *crtc)
1369 &valleyview_wm_info, 1386 &valleyview_wm_info,
1370 &valleyview_cursor_wm_info, 1387 &valleyview_cursor_wm_info,
1371 &ignore_plane_sr, &cursor_sr)) { 1388 &ignore_plane_sr, &cursor_sr)) {
1372 I915_WRITE(FW_BLC_SELF_VLV, FW_CSPWRDWNEN); 1389 intel_set_memory_cxsr(dev_priv, true);
1373 } else { 1390 } else {
1374 I915_WRITE(FW_BLC_SELF_VLV, 1391 intel_set_memory_cxsr(dev_priv, false);
1375 I915_READ(FW_BLC_SELF_VLV) & ~FW_CSPWRDWNEN);
1376 plane_sr = cursor_sr = 0; 1392 plane_sr = cursor_sr = 0;
1377 } 1393 }
1378 1394
@@ -1421,10 +1437,9 @@ static void g4x_update_wm(struct drm_crtc *crtc)
1421 &g4x_wm_info, 1437 &g4x_wm_info,
1422 &g4x_cursor_wm_info, 1438 &g4x_cursor_wm_info,
1423 &plane_sr, &cursor_sr)) { 1439 &plane_sr, &cursor_sr)) {
1424 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); 1440 intel_set_memory_cxsr(dev_priv, true);
1425 } else { 1441 } else {
1426 I915_WRITE(FW_BLC_SELF, 1442 intel_set_memory_cxsr(dev_priv, false);
1427 I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN);
1428 plane_sr = cursor_sr = 0; 1443 plane_sr = cursor_sr = 0;
1429 } 1444 }
1430 1445
@@ -1495,13 +1510,10 @@ static void i965_update_wm(struct drm_crtc *unused_crtc)
1495 DRM_DEBUG_KMS("self-refresh watermark: display plane %d " 1510 DRM_DEBUG_KMS("self-refresh watermark: display plane %d "
1496 "cursor %d\n", srwm, cursor_sr); 1511 "cursor %d\n", srwm, cursor_sr);
1497 1512
1498 if (IS_CRESTLINE(dev)) 1513 intel_set_memory_cxsr(dev_priv, true);
1499 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
1500 } else { 1514 } else {
1501 /* Turn off self refresh if both pipes are enabled */ 1515 /* Turn off self refresh if both pipes are enabled */
1502 if (IS_CRESTLINE(dev)) 1516 intel_set_memory_cxsr(dev_priv, false);
1503 I915_WRITE(FW_BLC_SELF, I915_READ(FW_BLC_SELF)
1504 & ~FW_BLC_SELF_EN);
1505 } 1517 }
1506 1518
1507 DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", 1519 DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n",
@@ -1587,10 +1599,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
1587 cwm = 2; 1599 cwm = 2;
1588 1600
1589 /* Play safe and disable self-refresh before adjusting watermarks. */ 1601 /* Play safe and disable self-refresh before adjusting watermarks. */
1590 if (IS_I945G(dev) || IS_I945GM(dev)) 1602 intel_set_memory_cxsr(dev_priv, false);
1591 I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN_MASK | 0);
1592 else if (IS_I915GM(dev))
1593 I915_WRITE(INSTPM, _MASKED_BIT_DISABLE(INSTPM_SELF_EN));
1594 1603
1595 /* Calc sr entries for one plane configs */ 1604 /* Calc sr entries for one plane configs */
1596 if (HAS_FW_BLC(dev) && enabled) { 1605 if (HAS_FW_BLC(dev) && enabled) {
@@ -1636,17 +1645,8 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
1636 I915_WRITE(FW_BLC, fwater_lo); 1645 I915_WRITE(FW_BLC, fwater_lo);
1637 I915_WRITE(FW_BLC2, fwater_hi); 1646 I915_WRITE(FW_BLC2, fwater_hi);
1638 1647
1639 if (HAS_FW_BLC(dev)) { 1648 if (enabled)
1640 if (enabled) { 1649 intel_set_memory_cxsr(dev_priv, true);
1641 if (IS_I945G(dev) || IS_I945GM(dev))
1642 I915_WRITE(FW_BLC_SELF,
1643 FW_BLC_SELF_EN_MASK | FW_BLC_SELF_EN);
1644 else if (IS_I915GM(dev))
1645 I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_SELF_EN));
1646 DRM_DEBUG_KMS("memory self refresh enabled\n");
1647 } else
1648 DRM_DEBUG_KMS("memory self refresh disabled\n");
1649 }
1650} 1650}
1651 1651
1652static void i845_update_wm(struct drm_crtc *unused_crtc) 1652static void i845_update_wm(struct drm_crtc *unused_crtc)
@@ -6782,7 +6782,7 @@ void intel_init_pm(struct drm_device *dev)
6782 (dev_priv->is_ddr3 == 1) ? "3" : "2", 6782 (dev_priv->is_ddr3 == 1) ? "3" : "2",
6783 dev_priv->fsb_freq, dev_priv->mem_freq); 6783 dev_priv->fsb_freq, dev_priv->mem_freq);
6784 /* Disable CxSR and never update its watermark again */ 6784 /* Disable CxSR and never update its watermark again */
6785 pineview_disable_cxsr(dev); 6785 intel_set_memory_cxsr(dev_priv, false);
6786 dev_priv->display.update_wm = NULL; 6786 dev_priv->display.update_wm = NULL;
6787 } else 6787 } else
6788 dev_priv->display.update_wm = pineview_update_wm; 6788 dev_priv->display.update_wm = pineview_update_wm;