aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-03-27 04:24:19 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-03-31 04:46:34 -0400
commit037bde19a43e299d30f0490bba9be32ab355975c (patch)
tree41733f741e38af8af92705e11f758be785ffc944 /drivers/gpu
parent1caea6e945e0867d391369097937620c945dcec1 (diff)
Revert "drm/i915: Disable/Enable PM Intrrupts based on the current freq."
This reverts commit 2754436913b94626a5414d82f0996489628c513d. Conflicts: drivers/gpu/drm/i915/i915_irq.c The partial application of interrupt masking without regard to other pathways for adjusting the RPS frequency results in completely disabling the PM interrupts. This leads to excessive power consumption as the GPU is kept at max clocks (until the failsafe mechanism fires of explicitly downclocking the GPU when all requests are idle). Or equally as bad for the UX, the GPU is kept at minimum clocks and prevented from upclocking in response to a requirement for more power. Testcase: pm_rps/blocking Cc: Deepak S <deepak.s@intel.com> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by:Deepak S <deepak.s@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h3
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c38
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c8
3 files changed, 0 insertions, 49 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 537404b9f760..8d10f220e044 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1001,9 +1001,6 @@ struct intel_gen6_power_mgmt {
1001 u8 rp1_freq; /* "less than" RP0 power/freqency */ 1001 u8 rp1_freq; /* "less than" RP0 power/freqency */
1002 u8 rp0_freq; /* Non-overclocked max frequency. */ 1002 u8 rp0_freq; /* Non-overclocked max frequency. */
1003 1003
1004 bool rp_up_masked;
1005 bool rp_down_masked;
1006
1007 int last_adj; 1004 int last_adj;
1008 enum { LOW_POWER, BETWEEN, HIGH_POWER } power; 1005 enum { LOW_POWER, BETWEEN, HIGH_POWER } power;
1009 1006
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index f5a74b70f5e5..72e26e2be301 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1084,43 +1084,6 @@ static void notify_ring(struct drm_device *dev,
1084 i915_queue_hangcheck(dev); 1084 i915_queue_hangcheck(dev);
1085} 1085}
1086 1086
1087void gen6_set_pm_mask(struct drm_i915_private *dev_priv,
1088 u32 pm_iir, int new_delay)
1089{
1090 if (pm_iir & GEN6_PM_RP_UP_THRESHOLD) {
1091 if (new_delay >= dev_priv->rps.max_freq_softlimit) {
1092 /* Mask UP THRESHOLD Interrupts */
1093 I915_WRITE(GEN6_PMINTRMSK,
1094 I915_READ(GEN6_PMINTRMSK) |
1095 GEN6_PM_RP_UP_THRESHOLD);
1096 dev_priv->rps.rp_up_masked = true;
1097 }
1098 if (dev_priv->rps.rp_down_masked) {
1099 /* UnMask DOWN THRESHOLD Interrupts */
1100 I915_WRITE(GEN6_PMINTRMSK,
1101 I915_READ(GEN6_PMINTRMSK) &
1102 ~GEN6_PM_RP_DOWN_THRESHOLD);
1103 dev_priv->rps.rp_down_masked = false;
1104 }
1105 } else if (pm_iir & GEN6_PM_RP_DOWN_THRESHOLD) {
1106 if (new_delay <= dev_priv->rps.min_freq_softlimit) {
1107 /* Mask DOWN THRESHOLD Interrupts */
1108 I915_WRITE(GEN6_PMINTRMSK,
1109 I915_READ(GEN6_PMINTRMSK) |
1110 GEN6_PM_RP_DOWN_THRESHOLD);
1111 dev_priv->rps.rp_down_masked = true;
1112 }
1113
1114 if (dev_priv->rps.rp_up_masked) {
1115 /* UnMask UP THRESHOLD Interrupts */
1116 I915_WRITE(GEN6_PMINTRMSK,
1117 I915_READ(GEN6_PMINTRMSK) &
1118 ~GEN6_PM_RP_UP_THRESHOLD);
1119 dev_priv->rps.rp_up_masked = false;
1120 }
1121 }
1122}
1123
1124static void gen6_pm_rps_work(struct work_struct *work) 1087static void gen6_pm_rps_work(struct work_struct *work)
1125{ 1088{
1126 drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t, 1089 drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t,
@@ -1180,7 +1143,6 @@ static void gen6_pm_rps_work(struct work_struct *work)
1180 dev_priv->rps.min_freq_softlimit, 1143 dev_priv->rps.min_freq_softlimit,
1181 dev_priv->rps.max_freq_softlimit); 1144 dev_priv->rps.max_freq_softlimit);
1182 1145
1183 gen6_set_pm_mask(dev_priv, pm_iir, new_delay);
1184 dev_priv->rps.last_adj = new_delay - dev_priv->rps.cur_freq; 1146 dev_priv->rps.last_adj = new_delay - dev_priv->rps.cur_freq;
1185 1147
1186 if (IS_VALLEYVIEW(dev_priv->dev)) 1148 if (IS_VALLEYVIEW(dev_priv->dev))
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index b66a43b90d1b..f702ac8a2f50 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3095,11 +3095,6 @@ static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
3095 I915_WRITE(VLV_GTLC_SURVIVABILITY_REG, 3095 I915_WRITE(VLV_GTLC_SURVIVABILITY_REG,
3096 I915_READ(VLV_GTLC_SURVIVABILITY_REG) & 3096 I915_READ(VLV_GTLC_SURVIVABILITY_REG) &
3097 ~VLV_GFX_CLK_FORCE_ON_BIT); 3097 ~VLV_GFX_CLK_FORCE_ON_BIT);
3098
3099 /* Unmask Up interrupts */
3100 dev_priv->rps.rp_up_masked = true;
3101 gen6_set_pm_mask(dev_priv, GEN6_PM_RP_DOWN_THRESHOLD,
3102 dev_priv->rps.min_freq_softlimit);
3103} 3098}
3104 3099
3105void gen6_rps_idle(struct drm_i915_private *dev_priv) 3100void gen6_rps_idle(struct drm_i915_private *dev_priv)
@@ -3688,9 +3683,6 @@ static void valleyview_enable_rps(struct drm_device *dev)
3688 3683
3689 valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq); 3684 valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
3690 3685
3691 dev_priv->rps.rp_up_masked = false;
3692 dev_priv->rps.rp_down_masked = false;
3693
3694 gen6_enable_rps_interrupts(dev); 3686 gen6_enable_rps_interrupts(dev);
3695 3687
3696 gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL); 3688 gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);