[PATCH 38/38] bsw-irq4

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


---
 drivers/gpu/drm/i915/i915_irq.c | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 4e58737827f0..496c9c186857 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1830,6 +1830,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
 		u32 iir, gt_iir, pm_iir;
 		u32 pipe_stats[I915_MAX_PIPES];
 		u32 hotplug_status = 0;
+		bool has_pipe_stats;
 		u32 ier = 0;
 
 		gt_iir = I915_READ(GTIIR);
@@ -1868,7 +1869,8 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
 
 		/* Call regardless, as some status bits might not be
 		 * signalled in iir */
-		valleyview_pipestat_irq_ack(dev_priv, iir, pipe_stats);
+		has_pipe_stats = 
+			valleyview_pipestat_irq_ack(dev_priv, iir, pipe_stats);
 
 		if (iir & (I915_LPE_PIPE_A_INTERRUPT |
 			   I915_LPE_PIPE_B_INTERRUPT))
@@ -1893,7 +1895,8 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
 		if (hotplug_status)
 			i9xx_hpd_irq_handler(dev_priv, hotplug_status);
 
-		valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
+		if (has_pipe_stats)
+			valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
 	} while (0);
 
 	enable_rpm_wakeref_asserts(dev_priv);
@@ -1916,10 +1919,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 
 	master_ctl = I915_READ_FW(GEN8_MASTER_IRQ);
 	do {
-		u32 gt_iir[4], iir;
-		u32 pipe_stats[I915_MAX_PIPES];
-		u32 hotplug_status = 0;
-		bool has_pipe_stats = false;
+		u32 iir;
 
 		/*
 		 * Theory on interrupt generation, based on empirical evidence:
@@ -1935,16 +1935,24 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 		 * bits this time around.
 		 */
 		if (master_ctl & ~GEN8_MASTER_IRQ_CONTROL) {
+			u32 gt_iir[4];
+
 			I915_WRITE_FW(GEN8_MASTER_IRQ, 0);
 
 			gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
 
 			I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
 			ret = IRQ_HANDLED;
+
+			gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir);
+			master_ctl = 0;
 		}
 
 		iir = I915_READ_FW(VLV_IIR);
 		if (iir) {
+			u32 pipe_stats[I915_MAX_PIPES];
+			u32 hotplug_status = 0;
+			bool has_pipe_stats = false;
 			u32 ier;
 
 			ier = I915_READ_FW(VLV_IER);
@@ -1970,17 +1978,15 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 			I915_WRITE_FW(VLV_IIR, iir);
 			I915_WRITE_FW(VLV_IER, ier);
 			ret = IRQ_HANDLED;
-		}
-
-		gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir);
 
-		if (hotplug_status)
-			i9xx_hpd_irq_handler(dev_priv, hotplug_status);
+			if (hotplug_status)
+				i9xx_hpd_irq_handler(dev_priv, hotplug_status);
 
-		if (has_pipe_stats)
-			valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
+			if (has_pipe_stats)
+				valleyview_pipestat_irq_handler(dev_priv, pipe_stats);
 
-		master_ctl = I915_READ_FW(GEN8_MASTER_IRQ);
+			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