[PATCH] ilk-irq

Chris Wilson chris at chris-wilson.co.uk
Sun Jul 26 21:35:04 UTC 2020


---
 drivers/gpu/drm/i915/i915_irq.c | 52 ++++++++++++++++-----------------
 1 file changed, 25 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 1fa67700d8f4..5793e2a1f014 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -2105,23 +2105,10 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
 	if (unlikely(!intel_irqs_enabled(i915)))
 		return IRQ_NONE;
 
-	/* IRQs are synced during runtime_suspend, we don't require a wakeref */
-	disable_rpm_wakeref_asserts(&i915->runtime_pm);
-
 	/* disable master interrupt before clearing iir  */
 	de_ier = raw_reg_read(regs, DEIER);
 	raw_reg_write(regs, DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
 
-	/* Disable south interrupts. We'll only write to SDEIIR once, so further
-	 * interrupts will will be stored on its back queue, and then we'll be
-	 * able to process them after we restore SDEIER (as soon as we restore
-	 * it, we'll get an interrupt if SDEIIR still has something to process
-	 * due to its back queue). */
-	if (!HAS_PCH_NOP(i915)) {
-		sde_ier = raw_reg_read(regs, SDEIER);
-		raw_reg_write(regs, SDEIER, 0);
-	}
-
 	/* Find, clear, then process each source of interrupt */
 
 	gt_iir = raw_reg_read(regs, GTIIR);
@@ -2134,32 +2121,43 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
 		ret = IRQ_HANDLED;
 	}
 
+	if (INTEL_GEN(i915) >= 6) {
+		u32 pm_iir = raw_reg_read(regs, GEN6_PMIIR);
+		if (pm_iir) {
+			raw_reg_write(regs, GEN6_PMIIR, pm_iir);
+			gen6_rps_irq_handler(&i915->gt.rps, pm_iir);
+			ret = IRQ_HANDLED;
+		}
+	}
+
 	de_iir = raw_reg_read(regs, DEIIR);
 	if (de_iir) {
+		/* Disable south interrupts. We'll only write to SDEIIR once, so further
+		 * interrupts will will be stored on its back queue, and then we'll be
+		 * able to process them after we restore SDEIER (as soon as we restore
+		 * it, we'll get an interrupt if SDEIIR still has something to process
+		 * due to its back queue). */
+		if (!HAS_PCH_NOP(i915)) {
+			sde_ier = raw_reg_read(regs, SDEIER);
+			raw_reg_write(regs, SDEIER, 0);
+		}
+
+		disable_rpm_wakeref_asserts(&i915->runtime_pm);
+
 		raw_reg_write(regs, DEIIR, de_iir);
 		if (INTEL_GEN(i915) >= 7)
 			ivb_display_irq_handler(i915, de_iir);
 		else
 			ilk_display_irq_handler(i915, de_iir);
+
+		enable_rpm_wakeref_asserts(&i915->runtime_pm);
 		ret = IRQ_HANDLED;
-	}
 
-	if (INTEL_GEN(i915) >= 6) {
-		u32 pm_iir = raw_reg_read(regs, GEN6_PMIIR);
-		if (pm_iir) {
-			raw_reg_write(regs, GEN6_PMIIR, pm_iir);
-			gen6_rps_irq_handler(&i915->gt.rps, pm_iir);
-			ret = IRQ_HANDLED;
-		}
+		if (sde_ier)
+			raw_reg_write(regs, SDEIER, sde_ier);
 	}
 
 	raw_reg_write(regs, DEIER, de_ier);
-	if (sde_ier)
-		raw_reg_write(regs, SDEIER, sde_ier);
-
-	/* IRQs are synced during runtime_suspend, we don't require a wakeref */
-	enable_rpm_wakeref_asserts(&i915->runtime_pm);
-
 	return ret;
 }
 
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list