diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 42 |
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 | ||
6186 | static 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 | ||
6323 | static void ibx_init_clock_gating(struct drm_device *dev) | 6325 | static void ibx_init_clock_gating(struct drm_device *dev) |