From: Jani Nikula Date: Wed, 13 May 2026 16:13:30 +0000 (+0300) Subject: drm/i915/irq: add intel_display_irq_ack() to irq funcs X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13dccf09e8cfaa731606532ad6246aea8e547cb7;p=thirdparty%2Fkernel%2Flinux.git drm/i915/irq: add intel_display_irq_ack() to irq funcs Call the platform specific display irq ack hooks, if any, via intel_display_irq_ack(). Check for HAS_DISPLAY() in intel_display_irq_ack() for completeness even though fusing is not possible on the platforms in question. v3: - Pure vfunc change (Ville) v2: - Include LPE audio in the ack part - Check for HAS_DISPLAY() Reviewed-by: Ville Syrjälä Link: https://patch.msgid.link/a72974d66f7696ca35380b44f13f938b2d4d690d.1778688699.git.jani.nikula@intel.com Signed-off-by: Jani Nikula --- diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c index 672fd4f245ffa..c777b7f249c82 100644 --- a/drivers/gpu/drm/i915/display/intel_display_irq.c +++ b/drivers/gpu/drm/i915/display/intel_display_irq.c @@ -2023,8 +2023,8 @@ static void i965_display_irq_postinstall(struct intel_display *display) i915_enable_asle_pipestat(display); } -void i9xx_display_irq_ack(struct intel_display *display, - struct intel_display_irq_state *state) +static void i9xx_display_irq_ack(struct intel_display *display, + struct intel_display_irq_state *state) { if (state->iir & I915_DISPLAY_PORT_INTERRUPT) state->hotplug_status = i9xx_hpd_irq_ack(display); @@ -2119,8 +2119,8 @@ static u32 vlv_lpe_irq_mask(struct intel_display *display) return I915_LPE_PIPE_A_INTERRUPT | I915_LPE_PIPE_B_INTERRUPT; } -void vlv_display_irq_ack(struct intel_display *display, - struct intel_display_irq_state *state) +static void vlv_display_irq_ack(struct intel_display *display, + struct intel_display_irq_state *state) { if (state->iir & I915_DISPLAY_PORT_INTERRUPT) state->hotplug_status = i9xx_hpd_irq_ack(display); @@ -2528,6 +2528,7 @@ static void gen11_de_irq_postinstall(struct intel_display *display) 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); }; static const struct intel_display_irq_funcs gen11_display_irq_funcs = { @@ -2543,6 +2544,7 @@ static const struct intel_display_irq_funcs gen8_display_irq_funcs = { 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, }; static const struct intel_display_irq_funcs ilk_display_irq_funcs = { @@ -2553,11 +2555,13 @@ static const struct intel_display_irq_funcs ilk_display_irq_funcs = { 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, }; 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, }; void intel_display_irq_reset(struct intel_display *display) @@ -2576,6 +2580,15 @@ void intel_display_irq_postinstall(struct intel_display *display) display->irq.funcs->postinstall(display); } +void intel_display_irq_ack(struct intel_display *display, + struct intel_display_irq_state *state) +{ + if (!HAS_DISPLAY(display) || !display->irq.funcs->ack) + return; + + display->irq.funcs->ack(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 59ec673ffc9b1..876ee171d74aa 100644 --- a/drivers/gpu/drm/i915/display/intel_display_irq.h +++ b/drivers/gpu/drm/i915/display/intel_display_irq.h @@ -66,9 +66,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 vlv_display_irq_ack(struct intel_display *display, struct intel_display_irq_state *state); -void i9xx_display_irq_ack(struct intel_display *display, struct intel_display_irq_state *state); +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); diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 0d0ee2c43f008..321dc1e573ccc 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -268,7 +268,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg) if (pm_iir) intel_uncore_write(&dev_priv->uncore, GEN6_PMIIR, pm_iir); - vlv_display_irq_ack(display, &state); + intel_display_irq_ack(display, &state); /* * VLV_IIR is single buffered, and reflects the level @@ -338,7 +338,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg) gen8_gt_irq_handler(to_gt(dev_priv), master_ctl); - vlv_display_irq_ack(display, &state); + intel_display_irq_ack(display, &state); /* * VLV_IIR is single buffered, and reflects the level @@ -873,7 +873,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg) ret = IRQ_HANDLED; - i9xx_display_irq_ack(display, &state); + intel_display_irq_ack(display, &state); if (state.iir & I915_MASTER_ERROR_INTERRUPT) i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck); @@ -972,7 +972,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg) ret = IRQ_HANDLED; - i9xx_display_irq_ack(display, &state); + intel_display_irq_ack(display, &state); if (state.iir & I915_MASTER_ERROR_INTERRUPT) i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);