|
|
@@ -2492,6 +2492,9 @@ static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
|
|
|
uint32_t method1, method2;
|
|
|
int cpp;
|
|
|
|
|
|
+ if (mem_value == 0)
|
|
|
+ return U32_MAX;
|
|
|
+
|
|
|
if (!intel_wm_plane_visible(cstate, pstate))
|
|
|
return 0;
|
|
|
|
|
|
@@ -2521,6 +2524,9 @@ static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
|
|
|
uint32_t method1, method2;
|
|
|
int cpp;
|
|
|
|
|
|
+ if (mem_value == 0)
|
|
|
+ return U32_MAX;
|
|
|
+
|
|
|
if (!intel_wm_plane_visible(cstate, pstate))
|
|
|
return 0;
|
|
|
|
|
|
@@ -2544,6 +2550,9 @@ static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
|
|
|
{
|
|
|
int cpp;
|
|
|
|
|
|
+ if (mem_value == 0)
|
|
|
+ return U32_MAX;
|
|
|
+
|
|
|
if (!intel_wm_plane_visible(cstate, pstate))
|
|
|
return 0;
|
|
|
|
|
|
@@ -2998,6 +3007,34 @@ static void snb_wm_latency_quirk(struct drm_i915_private *dev_priv)
|
|
|
intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
|
|
|
}
|
|
|
|
|
|
+static void snb_wm_lp3_irq_quirk(struct drm_i915_private *dev_priv)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * On some SNB machines (Thinkpad X220 Tablet at least)
|
|
|
+ * LP3 usage can cause vblank interrupts to be lost.
|
|
|
+ * The DEIIR bit will go high but it looks like the CPU
|
|
|
+ * never gets interrupted.
|
|
|
+ *
|
|
|
+ * It's not clear whether other interrupt source could
|
|
|
+ * be affected or if this is somehow limited to vblank
|
|
|
+ * interrupts only. To play it safe we disable LP3
|
|
|
+ * watermarks entirely.
|
|
|
+ */
|
|
|
+ if (dev_priv->wm.pri_latency[3] == 0 &&
|
|
|
+ dev_priv->wm.spr_latency[3] == 0 &&
|
|
|
+ dev_priv->wm.cur_latency[3] == 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+ dev_priv->wm.pri_latency[3] = 0;
|
|
|
+ dev_priv->wm.spr_latency[3] = 0;
|
|
|
+ dev_priv->wm.cur_latency[3] = 0;
|
|
|
+
|
|
|
+ DRM_DEBUG_KMS("LP3 watermarks disabled due to potential for lost interrupts\n");
|
|
|
+ intel_print_wm_latency(dev_priv, "Primary", dev_priv->wm.pri_latency);
|
|
|
+ intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency);
|
|
|
+ intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
|
|
|
+}
|
|
|
+
|
|
|
static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency);
|
|
|
@@ -3014,8 +3051,10 @@ static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
|
|
|
intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency);
|
|
|
intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
|
|
|
|
|
|
- if (IS_GEN6(dev_priv))
|
|
|
+ if (IS_GEN6(dev_priv)) {
|
|
|
snb_wm_latency_quirk(dev_priv);
|
|
|
+ snb_wm_lp3_irq_quirk(dev_priv);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void skl_setup_wm_latency(struct drm_i915_private *dev_priv)
|