aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 1f4b56e273c8..bf814a64582a 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4363,16 +4363,7 @@ static u32 gen6_rps_pm_mask(struct drm_i915_private *dev_priv, u8 val)
4363 mask |= dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED); 4363 mask |= dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED | GEN6_PM_RP_UP_EI_EXPIRED);
4364 mask &= dev_priv->pm_rps_events; 4364 mask &= dev_priv->pm_rps_events;
4365 4365
4366 /* IVB and SNB hard hangs on looping batchbuffer 4366 return gen6_sanitize_rps_pm_mask(dev_priv, ~mask);
4367 * if GEN6_PM_UP_EI_EXPIRED is masked.
4368 */
4369 if (INTEL_INFO(dev_priv->dev)->gen <= 7 && !IS_HASWELL(dev_priv->dev))
4370 mask |= GEN6_PM_RP_UP_EI_EXPIRED;
4371
4372 if (IS_GEN8(dev_priv->dev))
4373 mask |= GEN8_PMINTR_REDIRECT_TO_NON_DISP;
4374
4375 return ~mask;
4376} 4367}
4377 4368
4378/* gen6_set_rps is called to update the frequency request, but should also be 4369/* gen6_set_rps is called to update the frequency request, but should also be
@@ -4441,7 +4432,8 @@ static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
4441 return; 4432 return;
4442 4433
4443 /* Mask turbo interrupt so that they will not come in between */ 4434 /* Mask turbo interrupt so that they will not come in between */
4444 I915_WRITE(GEN6_PMINTRMSK, 0xffffffff); 4435 I915_WRITE(GEN6_PMINTRMSK,
4436 gen6_sanitize_rps_pm_mask(dev_priv, ~0));
4445 4437
4446 vlv_force_gfx_clock(dev_priv, true); 4438 vlv_force_gfx_clock(dev_priv, true);
4447 4439
@@ -6191,6 +6183,20 @@ void intel_cleanup_gt_powersave(struct drm_device *dev)
6191 valleyview_cleanup_gt_powersave(dev); 6183 valleyview_cleanup_gt_powersave(dev);
6192} 6184}
6193 6185
6186static void gen6_suspend_rps(struct drm_device *dev)
6187{
6188 struct drm_i915_private *dev_priv = dev->dev_private;
6189
6190 flush_delayed_work(&dev_priv->rps.delayed_resume_work);
6191
6192 /*
6193 * TODO: disable RPS interrupts on GEN9+ too once RPS support
6194 * is added for it.
6195 */
6196 if (INTEL_INFO(dev)->gen < 9)
6197 gen6_disable_rps_interrupts(dev);
6198}
6199
6194/** 6200/**
6195 * intel_suspend_gt_powersave - suspend PM work and helper threads 6201 * intel_suspend_gt_powersave - suspend PM work and helper threads
6196 * @dev: drm device 6202 * @dev: drm device
@@ -6206,14 +6212,7 @@ void intel_suspend_gt_powersave(struct drm_device *dev)
6206 if (INTEL_INFO(dev)->gen < 6) 6212 if (INTEL_INFO(dev)->gen < 6)
6207 return; 6213 return;
6208 6214
6209 flush_delayed_work(&dev_priv->rps.delayed_resume_work); 6215 gen6_suspend_rps(dev);
6210
6211 /*
6212 * TODO: disable RPS interrupts on GEN9+ too once RPS support
6213 * is added for it.
6214 */
6215 if (INTEL_INFO(dev)->gen < 9)
6216 gen6_disable_rps_interrupts(dev);
6217 6216
6218 /* Force GPU to min freq during suspend */ 6217 /* Force GPU to min freq during suspend */
6219 gen6_rps_idle(dev_priv); 6218 gen6_rps_idle(dev_priv);
@@ -6316,8 +6315,11 @@ void intel_reset_gt_powersave(struct drm_device *dev)
6316{ 6315{
6317 struct drm_i915_private *dev_priv = dev->dev_private; 6316 struct drm_i915_private *dev_priv = dev->dev_private;
6318 6317
6318 if (INTEL_INFO(dev)->gen < 6)
6319 return;
6320
6321 gen6_suspend_rps(dev);
6319 dev_priv->rps.enabled = false; 6322 dev_priv->rps.enabled = false;
6320 intel_enable_gt_powersave(dev);
6321} 6323}
6322 6324
6323static void ibx_init_clock_gating(struct drm_device *dev) 6325static void ibx_init_clock_gating(struct drm_device *dev)