[PATCH 37/38] bsw-irq3

Chris Wilson chris at chris-wilson.co.uk
Wed Sep 13 13:02:40 UTC 2017


---
 drivers/gpu/drm/i915/i915_irq.c | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 67e7d78eb659..4e58737827f0 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1906,6 +1906,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 	struct drm_device *dev = arg;
 	struct drm_i915_private *dev_priv = to_i915(dev);
 	irqreturn_t ret = IRQ_NONE;
+	u32 master_ctl;
 
 	if (!intel_irqs_enabled(dev_priv))
 		return IRQ_NONE;
@@ -1913,9 +1914,9 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 	/* IRQs are synced during runtime_suspend, we don't require a wakeref */
 	disable_rpm_wakeref_asserts(dev_priv);
 
+	master_ctl = I915_READ_FW(GEN8_MASTER_IRQ);
 	do {
-		u32 master_ctl, iir;
-		u32 gt_iir[4];
+		u32 gt_iir[4], iir;
 		u32 pipe_stats[I915_MAX_PIPES];
 		u32 hotplug_status = 0;
 		bool has_pipe_stats = false;
@@ -1933,22 +1934,21 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 		 * don't end up clearing all the VLV_IIR and GEN8_MASTER_IRQ_CONTROL
 		 * bits this time around.
 		 */
-		master_ctl = I915_READ(GEN8_MASTER_IRQ);
 		if (master_ctl & ~GEN8_MASTER_IRQ_CONTROL) {
-			I915_WRITE(GEN8_MASTER_IRQ, 0);
+			I915_WRITE_FW(GEN8_MASTER_IRQ, 0);
 
 			gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
 
-			I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
+			I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
 			ret = IRQ_HANDLED;
 		}
 
-		iir = I915_READ(VLV_IIR);
+		iir = I915_READ_FW(VLV_IIR);
 		if (iir) {
 			u32 ier;
 
-			ier = I915_READ(VLV_IER);
-			I915_WRITE(VLV_IER, 0);
+			ier = I915_READ_FW(VLV_IER);
+			I915_WRITE_FW(VLV_IER, 0);
 
 			if (iir & I915_DISPLAY_PORT_INTERRUPT)
 				hotplug_status = i9xx_hpd_irq_ack(dev_priv);
@@ -1967,8 +1967,8 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 			 * VLV_IIR is single buffered, and reflects the level
 			 * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
 			 */
-			I915_WRITE(VLV_IIR, iir);
-			I915_WRITE(VLV_IER, ier);
+			I915_WRITE_FW(VLV_IIR, iir);
+			I915_WRITE_FW(VLV_IER, ier);
 			ret = IRQ_HANDLED;
 		}
 
@@ -1979,7 +1979,9 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 
 		if (has_pipe_stats)
 			valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
-	} while (0);
+
+		master_ctl = I915_READ_FW(GEN8_MASTER_IRQ);
+	} while (master_ctl & ~GEN8_MASTER_IRQ_CONTROL);
 
 	enable_rpm_wakeref_asserts(dev_priv);
 
-- 
2.14.1



More information about the Intel-gfx-trybot mailing list