summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2026-05-13 19:13:31 +0300
committerJani Nikula <jani.nikula@intel.com>2026-05-16 12:19:23 +0300
commitbbba23373bcca2133d945fbb8893c8cb1d377365 (patch)
treea29c9552f65dd57e14c61d73c828e8712a15dfbb
parent13dccf09e8cfaa731606532ad6246aea8e547cb7 (diff)
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>
-rw-r--r--drivers/gpu/drm/i915/display/intel_display_irq.c40
-rw-r--r--drivers/gpu/drm/i915/display/intel_display_irq.h8
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c16
-rw-r--r--drivers/gpu/drm/xe/display/xe_display.c2
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 9bd871a8d545..75324aa82631 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -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)