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ä <ville.syrjala@linux.intel.com>
Link: https://patch.msgid.link/a72974d66f7696ca35380b44f13f938b2d4d690d.1778688699.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
Jani Nikula 2026-05-13 19:13:30 +03:00
parent c7ae1bdfce
commit 13dccf09e8
3 changed files with 22 additions and 11 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);