[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