diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 11 |
3 files changed, 18 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index d0d3dfbe6d2a..ba86dc330547 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -292,6 +292,21 @@ void gen6_enable_rps_interrupts(struct drm_device *dev) | |||
| 292 | spin_unlock_irq(&dev_priv->irq_lock); | 292 | spin_unlock_irq(&dev_priv->irq_lock); |
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | u32 gen6_sanitize_rps_pm_mask(struct drm_i915_private *dev_priv, u32 mask) | ||
| 296 | { | ||
| 297 | /* | ||
| 298 | * IVB and SNB hard hangs on looping batchbuffer | ||
| 299 | * if GEN6_PM_UP_EI_EXPIRED is masked. | ||
| 300 | */ | ||
| 301 | if (INTEL_INFO(dev_priv)->gen <= 7 && !IS_HASWELL(dev_priv)) | ||
| 302 | mask &= ~GEN6_PM_RP_UP_EI_EXPIRED; | ||
| 303 | |||
| 304 | if (INTEL_INFO(dev_priv)->gen >= 8) | ||
| 305 | mask &= ~GEN8_PMINTR_REDIRECT_TO_NON_DISP; | ||
| 306 | |||
| 307 | return mask; | ||
| 308 | } | ||
| 309 | |||
| 295 | void gen6_disable_rps_interrupts(struct drm_device *dev) | 310 | void gen6_disable_rps_interrupts(struct drm_device *dev) |
| 296 | { | 311 | { |
| 297 | struct drm_i915_private *dev_priv = dev->dev_private; | 312 | struct drm_i915_private *dev_priv = dev->dev_private; |
| @@ -304,8 +319,7 @@ void gen6_disable_rps_interrupts(struct drm_device *dev) | |||
| 304 | 319 | ||
| 305 | spin_lock_irq(&dev_priv->irq_lock); | 320 | spin_lock_irq(&dev_priv->irq_lock); |
| 306 | 321 | ||
| 307 | I915_WRITE(GEN6_PMINTRMSK, INTEL_INFO(dev_priv)->gen >= 8 ? | 322 | I915_WRITE(GEN6_PMINTRMSK, gen6_sanitize_rps_pm_mask(dev_priv, ~0)); |
| 308 | ~GEN8_PMINTR_REDIRECT_TO_NON_DISP : ~0); | ||
| 309 | 323 | ||
| 310 | __gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events); | 324 | __gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events); |
| 311 | I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) & | 325 | I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) & |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 25fdbb16d4e0..3b40a17b8852 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -794,6 +794,7 @@ void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask); | |||
| 794 | void gen6_reset_rps_interrupts(struct drm_device *dev); | 794 | void gen6_reset_rps_interrupts(struct drm_device *dev); |
| 795 | void gen6_enable_rps_interrupts(struct drm_device *dev); | 795 | void gen6_enable_rps_interrupts(struct drm_device *dev); |
| 796 | void gen6_disable_rps_interrupts(struct drm_device *dev); | 796 | void gen6_disable_rps_interrupts(struct drm_device *dev); |
| 797 | u32 gen6_sanitize_rps_pm_mask(struct drm_i915_private *dev_priv, u32 mask); | ||
| 797 | void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv); | 798 | void intel_runtime_pm_disable_interrupts(struct drm_i915_private *dev_priv); |
| 798 | void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv); | 799 | void intel_runtime_pm_enable_interrupts(struct drm_i915_private *dev_priv); |
| 799 | static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv) | 800 | static inline bool intel_irqs_enabled(struct drm_i915_private *dev_priv) |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 78e308bebac9..3801ff59595f 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 (INTEL_INFO(dev_priv)->gen >= 8) | ||
| 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 |
