Call the platform specific display irq handler hooks via intel_display_irq_handler().
v3: Pure vfunc change (Ville) v2: Rebase, handle LPE audio in ack (Ville) Signed-off-by: Jani Nikula <[email protected]> --- .../gpu/drm/i915/display/intel_display_irq.c | 40 +++++++++++++------ .../gpu/drm/i915/display/intel_display_irq.h | 8 +--- drivers/gpu/drm/i915/i915_irq.c | 16 ++++---- drivers/gpu/drm/xe/display/xe_display.c | 2 +- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c index c777b7f249c8..899a38c0a7b7 100644 --- a/drivers/gpu/drm/i915/display/intel_display_irq.c +++ b/drivers/gpu/drm/i915/display/intel_display_irq.c @@ -1021,8 +1021,8 @@ void ilk_display_irq_master_enable(struct intel_display *display, u32 de_ier, u3 intel_de_write_fw(display, SDEIER, sde_ier); } -bool ilk_display_irq_handler(struct intel_display *display, - const struct intel_display_irq_state *state) +static bool ilk_display_irq_handler(struct intel_display *display, + const struct intel_display_irq_state *state) { u32 de_iir; bool handled = false; @@ -1567,8 +1567,8 @@ static void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl) } } -bool gen8_display_irq_handler(struct intel_display *display, - const struct intel_display_irq_state *state) +static bool gen8_display_irq_handler(struct intel_display *display, + const struct intel_display_irq_state *state) { gen8_de_irq_handler(display, state->master_ctl); @@ -1599,8 +1599,8 @@ void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir) intel_opregion_asle_intr(display); } -bool gen11_display_irq_handler(struct intel_display *display, - const struct intel_display_irq_state *state) +static bool gen11_display_irq_handler(struct intel_display *display, + const struct intel_display_irq_state *state) { u32 disp_ctl; @@ -2033,8 +2033,8 @@ static void i9xx_display_irq_ack(struct intel_display *display, i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats); } -bool i965_display_irq_handler(struct intel_display *display, - const struct intel_display_irq_state *state) +static bool i965_display_irq_handler(struct intel_display *display, + const struct intel_display_irq_state *state) { if (state->hotplug_status) i9xx_hpd_irq_handler(display, state->hotplug_status); @@ -2044,8 +2044,8 @@ bool i965_display_irq_handler(struct intel_display *display, return true; } -bool i915_display_irq_handler(struct intel_display *display, - const struct intel_display_irq_state *state) +static bool i915_display_irq_handler(struct intel_display *display, + const struct intel_display_irq_state *state) { if (state->hotplug_status) i9xx_hpd_irq_handler(display, state->hotplug_status); @@ -2136,8 +2136,8 @@ static void vlv_display_irq_ack(struct intel_display *display, intel_lpe_audio_irq_handler(display); } -bool vlv_display_irq_handler(struct intel_display *display, - const struct intel_display_irq_state *state) +static bool vlv_display_irq_handler(struct intel_display *display, + const struct intel_display_irq_state *state) { if (state->hotplug_status) i9xx_hpd_irq_handler(display, state->hotplug_status); @@ -2529,39 +2529,46 @@ struct intel_display_irq_funcs { void (*reset)(struct intel_display *display); void (*postinstall)(struct intel_display *display); void (*ack)(struct intel_display *display, struct intel_display_irq_state *state); + bool (*handler)(struct intel_display *display, const struct intel_display_irq_state *state); }; static const struct intel_display_irq_funcs gen11_display_irq_funcs = { .reset = gen11_display_irq_reset, .postinstall = gen11_de_irq_postinstall, + .handler = gen11_display_irq_handler, }; static const struct intel_display_irq_funcs gen8_display_irq_funcs = { .reset = gen8_display_irq_reset, .postinstall = gen8_de_irq_postinstall, + .handler = gen8_display_irq_handler, }; static const struct intel_display_irq_funcs vlv_display_irq_funcs = { .reset = vlv_display_irq_reset, .postinstall = vlv_display_irq_postinstall, .ack = vlv_display_irq_ack, + .handler = vlv_display_irq_handler, }; static const struct intel_display_irq_funcs ilk_display_irq_funcs = { .reset = ilk_display_irq_reset, .postinstall = ilk_de_irq_postinstall, + .handler = ilk_display_irq_handler, }; static const struct intel_display_irq_funcs i965_display_irq_funcs = { .reset = i9xx_display_irq_reset, .postinstall = i965_display_irq_postinstall, .ack = i9xx_display_irq_ack, + .handler = i965_display_irq_handler, }; static const struct intel_display_irq_funcs i915_display_irq_funcs = { .reset = i9xx_display_irq_reset, .postinstall = i915_display_irq_postinstall, .ack = i9xx_display_irq_ack, + .handler = i915_display_irq_handler, }; void intel_display_irq_reset(struct intel_display *display) @@ -2589,6 +2596,15 @@ void intel_display_irq_ack(struct intel_display *display, display->irq.funcs->ack(display, state); } +bool intel_display_irq_handler(struct intel_display *display, + const struct intel_display_irq_state *state) +{ + if (!HAS_DISPLAY(display) || !display->irq.funcs->handler) + return true; + + return display->irq.funcs->handler(display, state); +} + void intel_display_irq_init(struct intel_display *display) { spin_lock_init(&display->irq.lock); diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.h b/drivers/gpu/drm/i915/display/intel_display_irq.h index 876ee171d74a..a1227cee885a 100644 --- a/drivers/gpu/drm/i915/display/intel_display_irq.h +++ b/drivers/gpu/drm/i915/display/intel_display_irq.h @@ -67,13 +67,7 @@ struct intel_display_irq_state { void intel_display_irq_reset(struct intel_display *display); void intel_display_irq_postinstall(struct intel_display *display); void intel_display_irq_ack(struct intel_display *display, struct intel_display_irq_state *state); - -bool ilk_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state); -bool gen8_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state); -bool gen11_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state); -bool i965_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state); -bool i915_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state); -bool vlv_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state); +bool intel_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state); u32 i9xx_display_irq_enable_mask(struct intel_display *display); diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 321dc1e573cc..30ce462e92ab 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -285,7 +285,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg) if (pm_iir) gen6_rps_irq_handler(&to_gt(dev_priv)->rps, pm_iir); - vlv_display_irq_handler(display, &state); + intel_display_irq_handler(display, &state); } while (0); pmu_irq_stats(dev_priv, ret); @@ -350,7 +350,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) intel_uncore_write(&dev_priv->uncore, VLV_IER, ier); intel_uncore_write(&dev_priv->uncore, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); - vlv_display_irq_handler(display, &state); + intel_display_irq_handler(display, &state); } while (0); pmu_irq_stats(dev_priv, ret); @@ -397,7 +397,7 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg) ret = IRQ_HANDLED; } - if (ilk_display_irq_handler(display, NULL)) + if (intel_display_irq_handler(display, NULL)) ret = IRQ_HANDLED; if (GRAPHICS_VER(i915) >= 6) { @@ -463,7 +463,7 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg) .master_ctl = master_ctl, }; disable_rpm_wakeref_asserts(&dev_priv->runtime_pm); - gen8_display_irq_handler(display, &state); + intel_display_irq_handler(display, &state); enable_rpm_wakeref_asserts(&dev_priv->runtime_pm); } @@ -515,7 +515,7 @@ static irqreturn_t gen11_irq_handler(int irq, void *arg) /* IRQs are synced during runtime_suspend, we don't require a wakeref */ if (master_ctl & GEN11_DISPLAY_IRQ) - gen11_display_irq_handler(display, NULL); + intel_display_irq_handler(display, NULL); gu_misc_iir = gen11_gu_misc_irq_ack(display, master_ctl); @@ -582,7 +582,7 @@ static irqreturn_t dg1_irq_handler(int irq, void *arg) gen11_gt_irq_handler(gt, master_ctl); if (master_ctl & GEN11_DISPLAY_IRQ) - gen11_display_irq_handler(display, NULL); + intel_display_irq_handler(display, NULL); gu_misc_iir = gen11_gu_misc_irq_ack(display, master_ctl); @@ -886,7 +886,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg) if (state.iir & I915_MASTER_ERROR_INTERRUPT) i9xx_error_irq_handler(dev_priv, eir, eir_stuck); - i915_display_irq_handler(display, &state); + intel_display_irq_handler(display, &state); } while (0); pmu_irq_stats(dev_priv, ret); @@ -990,7 +990,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg) if (state.iir & I915_MASTER_ERROR_INTERRUPT) i9xx_error_irq_handler(dev_priv, eir, eir_stuck); - i965_display_irq_handler(display, &state); + intel_display_irq_handler(display, &state); } while (0); pmu_irq_stats(dev_priv, IRQ_HANDLED); diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c index c26e2f62542b..796164e9bc20 100644 --- a/drivers/gpu/drm/xe/display/xe_display.c +++ b/drivers/gpu/drm/xe/display/xe_display.c @@ -215,7 +215,7 @@ void xe_display_irq_handler(struct xe_device *xe, u32 master_ctl) return; if (master_ctl & DISPLAY_IRQ) - gen11_display_irq_handler(display, NULL); + intel_display_irq_handler(display, NULL); } void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir) -- 2.47.3
