|
@@ -437,6 +437,38 @@ static void bdw_update_port_irq(struct drm_i915_private *dev_priv,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * bdw_update_pipe_irq - update DE pipe interrupt
|
|
|
+ * @dev_priv: driver private
|
|
|
+ * @pipe: pipe whose interrupt to update
|
|
|
+ * @interrupt_mask: mask of interrupt bits to update
|
|
|
+ * @enabled_irq_mask: mask of interrupt bits to enable
|
|
|
+ */
|
|
|
+void bdw_update_pipe_irq(struct drm_i915_private *dev_priv,
|
|
|
+ enum pipe pipe,
|
|
|
+ uint32_t interrupt_mask,
|
|
|
+ uint32_t enabled_irq_mask)
|
|
|
+{
|
|
|
+ uint32_t new_val;
|
|
|
+
|
|
|
+ assert_spin_locked(&dev_priv->irq_lock);
|
|
|
+
|
|
|
+ WARN_ON(enabled_irq_mask & ~interrupt_mask);
|
|
|
+
|
|
|
+ if (WARN_ON(!intel_irqs_enabled(dev_priv)))
|
|
|
+ return;
|
|
|
+
|
|
|
+ new_val = dev_priv->de_irq_mask[pipe];
|
|
|
+ new_val &= ~interrupt_mask;
|
|
|
+ new_val |= (~enabled_irq_mask & interrupt_mask);
|
|
|
+
|
|
|
+ if (new_val != dev_priv->de_irq_mask[pipe]) {
|
|
|
+ dev_priv->de_irq_mask[pipe] = new_val;
|
|
|
+ I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
|
|
|
+ POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ibx_display_interrupt_update - update SDEIMR
|
|
|
* @dev_priv: driver private
|
|
@@ -2668,10 +2700,9 @@ static int gen8_enable_vblank(struct drm_device *dev, unsigned int pipe)
|
|
|
unsigned long irqflags;
|
|
|
|
|
|
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
|
|
- dev_priv->de_irq_mask[pipe] &= ~GEN8_PIPE_VBLANK;
|
|
|
- I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
|
|
|
- POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
|
|
|
+ bdw_enable_pipe_irq(dev_priv, pipe, GEN8_PIPE_VBLANK);
|
|
|
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -2719,9 +2750,7 @@ static void gen8_disable_vblank(struct drm_device *dev, unsigned int pipe)
|
|
|
unsigned long irqflags;
|
|
|
|
|
|
spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
|
|
|
- dev_priv->de_irq_mask[pipe] |= GEN8_PIPE_VBLANK;
|
|
|
- I915_WRITE(GEN8_DE_PIPE_IMR(pipe), dev_priv->de_irq_mask[pipe]);
|
|
|
- POSTING_READ(GEN8_DE_PIPE_IMR(pipe));
|
|
|
+ bdw_disable_pipe_irq(dev_priv, pipe, GEN8_PIPE_VBLANK);
|
|
|
spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
|
|
|
}
|
|
|
|