|
@@ -292,6 +292,23 @@ void gen6_enable_rps_interrupts(struct drm_device *dev)
|
|
|
spin_unlock_irq(&dev_priv->irq_lock);
|
|
|
}
|
|
|
|
|
|
+u32 gen6_sanitize_rps_pm_mask(struct drm_i915_private *dev_priv, u32 mask)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * SNB,IVB can while VLV,CHV may hard hang on looping batchbuffer
|
|
|
+ * if GEN6_PM_UP_EI_EXPIRED is masked.
|
|
|
+ *
|
|
|
+ * TODO: verify if this can be reproduced on VLV,CHV.
|
|
|
+ */
|
|
|
+ if (INTEL_INFO(dev_priv)->gen <= 7 && !IS_HASWELL(dev_priv))
|
|
|
+ mask &= ~GEN6_PM_RP_UP_EI_EXPIRED;
|
|
|
+
|
|
|
+ if (INTEL_INFO(dev_priv)->gen >= 8)
|
|
|
+ mask &= ~GEN8_PMINTR_REDIRECT_TO_NON_DISP;
|
|
|
+
|
|
|
+ return mask;
|
|
|
+}
|
|
|
+
|
|
|
void gen6_disable_rps_interrupts(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
@@ -304,8 +321,7 @@ void gen6_disable_rps_interrupts(struct drm_device *dev)
|
|
|
|
|
|
spin_lock_irq(&dev_priv->irq_lock);
|
|
|
|
|
|
- I915_WRITE(GEN6_PMINTRMSK, INTEL_INFO(dev_priv)->gen >= 8 ?
|
|
|
- ~GEN8_PMINTR_REDIRECT_TO_NON_DISP : ~0);
|
|
|
+ I915_WRITE(GEN6_PMINTRMSK, gen6_sanitize_rps_pm_mask(dev_priv, ~0));
|
|
|
|
|
|
__gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events);
|
|
|
I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) &
|