drm/i915/irq: add intel_display_irq_handler() to irq funcs

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)

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patch.msgid.link/d728f04a47532898c278ef208692ea173b446106.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:31 +03:00
parent 13dccf09e8
commit bbba23373b
4 changed files with 38 additions and 28 deletions

View File

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

View File

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

View File

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

View File

@ -222,7 +222,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)