|
@@ -364,19 +364,7 @@ void gen6_enable_rps_interrupts(struct drm_i915_private *dev_priv)
|
|
|
|
|
|
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;
|
|
|
+ return (mask & ~dev_priv->rps.pm_intr_keep);
|
|
|
}
|
|
|
|
|
|
void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv)
|
|
@@ -4578,6 +4566,20 @@ void intel_irq_init(struct drm_i915_private *dev_priv)
|
|
|
else
|
|
|
dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;
|
|
|
|
|
|
+ dev_priv->rps.pm_intr_keep = 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 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))
|
|
|
+ dev_priv->rps.pm_intr_keep |= GEN6_PM_RP_UP_EI_EXPIRED;
|
|
|
+
|
|
|
+ if (INTEL_INFO(dev_priv)->gen >= 8)
|
|
|
+ dev_priv->rps.pm_intr_keep |= GEN8_PMINTR_REDIRECT_TO_NON_DISP;
|
|
|
+
|
|
|
INIT_DELAYED_WORK(&dev_priv->gpu_error.hangcheck_work,
|
|
|
i915_hangcheck_elapsed);
|
|
|
|