diff options
author | Imre Deak <imre.deak@intel.com> | 2014-07-01 05:36:17 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-07-07 05:33:36 -0400 |
commit | 5209b1f4c4f8036f52f5ac2df2afc806254f247f (patch) | |
tree | 6935ff6a0c599d8b145ab99cae02b3db1b0ad97e /drivers/gpu/drm/i915/intel_pm.c | |
parent | d2011dc8d41b20dc0ec0bf741c61fe500dc8d0bc (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>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 76 |
1 files changed, 38 insertions, 38 deletions
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 | ||
819 | static void pineview_disable_cxsr(struct drm_device *dev) | 819 | void 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 | ||
1652 | static void i845_update_wm(struct drm_crtc *unused_crtc) | 1652 | static 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; |