瀏覽代碼

drm/i915: Fix IRQ stall issue on Ironlake

The master irq control in DE must be disabled before irq handling,
and enable after the process. This fixes the irq stall issue on
Ironlake.

Cc: Stable Team <stable@kernel.org>
Signed-off-by: Zou, Nanhai <nanhai.zou@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
Zou, Nanhai 15 年之前
父節點
當前提交
2d109a845d
共有 1 個文件被更改,包括 9 次插入1 次删除
  1. 9 1
      drivers/gpu/drm/i915/i915_irq.c

+ 9 - 1
drivers/gpu/drm/i915/i915_irq.c

@@ -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;
 	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
 	int ret = IRQ_NONE;
 	int ret = IRQ_NONE;
-	u32 de_iir, gt_iir;
+	u32 de_iir, gt_iir, de_ier;
 	u32 new_de_iir, new_gt_iir;
 	u32 new_de_iir, new_gt_iir;
 	struct drm_i915_master_private *master_priv;
 	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);
 	de_iir = I915_READ(DEIIR);
 	gt_iir = I915_READ(GTIIR);
 	gt_iir = I915_READ(GTIIR);
 
 
@@ -290,6 +295,9 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev)
 		gt_iir = new_gt_iir;
 		gt_iir = new_gt_iir;
 	}
 	}
 
 
+	I915_WRITE(DEIER, de_ier);
+	(void)I915_READ(DEIER);
+
 	return ret;
 	return ret;
 }
 }