|
@@ -254,10 +254,15 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev)
|
|
|
{
|
|
|
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
|
|
int ret = IRQ_NONE;
|
|
|
- u32 de_iir, gt_iir;
|
|
|
+ u32 de_iir, gt_iir, de_ier;
|
|
|
u32 new_de_iir, new_gt_iir;
|
|
|
struct drm_i915_master_private *master_priv;
|
|
|
|
|
|
+ /* disable master interrupt before clearing iir */
|
|
|
+ de_ier = I915_READ(DEIER);
|
|
|
+ I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
|
|
|
+ (void)I915_READ(DEIER);
|
|
|
+
|
|
|
de_iir = I915_READ(DEIIR);
|
|
|
gt_iir = I915_READ(GTIIR);
|
|
|
|
|
@@ -290,6 +295,9 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev)
|
|
|
gt_iir = new_gt_iir;
|
|
|
}
|
|
|
|
|
|
+ I915_WRITE(DEIER, de_ier);
|
|
|
+ (void)I915_READ(DEIER);
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|