* [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks
@ 2026-04-29 10:24 Jani Nikula
2026-04-29 10:24 ` [PATCH 01/15] drm/i915/display: move audio funcs under audio sub-struct Jani Nikula
` (15 more replies)
0 siblings, 16 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
I was going to add display irq hooks first, but decided the organization
of the existing hooks under display->funcs is a bit weird. Spread them
out by function first. And then add hooks for display irq calls.
The end goal is to reduce the number of functions exposed from display
to i915 and xe core.
Jani Nikula (15):
drm/i915/display: move audio funcs under audio sub-struct
drm/i915/display: move color funcs under color sub-struct
drm/i915/display: move fdi funcs under fdi sub-struct
drm/i915/display: move watermark funcs under wm sub-struct
drm/i915/display: move hotplug irq funcs under hotplug sub-struct
drm/i915/display: move dpll funcs under dpll sub-struct
drm/i915/display: move cdclk funcs under cdclk sub-struct
drm/i915/display: move display funcs under modeset sub-struct
drm/i915/irq: deduplicate dg1_de_irq_postinstall() and
gen11_de_irq_postinstall()
drm/i915/irq: move VLV/CHV LPE irq handler call after irq acks
drm/i915/irq: constify pipe stats parameters
drm/i915/irq: add display irq funcs, start with
intel_display_irq_reset()
drm/i915/irq: add intel_display_irq_postinstall() to irq funcs
drm/i915/irq: add intel_display_irq_ack() to irq funcs
drm/i915/irq: add intel_display_irq_handler() to irq funcs
drivers/gpu/drm/i915/display/i9xx_wm.c | 22 +-
drivers/gpu/drm/i915/display/intel_audio.c | 22 +-
drivers/gpu/drm/i915/display/intel_cdclk.c | 84 +++----
drivers/gpu/drm/i915/display/intel_color.c | 58 ++---
drivers/gpu/drm/i915/display/intel_display.c | 30 +--
.../gpu/drm/i915/display/intel_display_core.h | 60 ++---
.../gpu/drm/i915/display/intel_display_irq.c | 218 +++++++++++++++---
.../gpu/drm/i915/display/intel_display_irq.h | 37 ++-
drivers/gpu/drm/i915/display/intel_dpll.c | 28 +--
drivers/gpu/drm/i915/display/intel_fdi.c | 8 +-
.../gpu/drm/i915/display/intel_hotplug_irq.c | 30 +--
.../drm/i915/display/intel_initial_plane.c | 4 +-
.../drm/i915/display/intel_modeset_setup.c | 2 +-
drivers/gpu/drm/i915/display/intel_wm.c | 32 +--
drivers/gpu/drm/i915/display/skl_watermark.c | 2 +-
drivers/gpu/drm/i915/i915_irq.c | 182 +++++----------
drivers/gpu/drm/xe/display/xe_display.c | 6 +-
17 files changed, 454 insertions(+), 371 deletions(-)
--
2.47.3
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH 01/15] drm/i915/display: move audio funcs under audio sub-struct
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 02/15] drm/i915/display: move color funcs under color sub-struct Jani Nikula
` (14 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Move audio related functions under audio sub-struct of struct
intel_display.
The funcs sub-struct of struct intel_display seems unnecessary. Instead
of display->funcs.FEATURE, prefer display->FEATURE.funcs.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_audio.c | 22 ++++++++-----------
.../gpu/drm/i915/display/intel_display_core.h | 6 ++---
.../gpu/drm/i915/display/intel_display_irq.c | 4 ++++
3 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_audio.c b/drivers/gpu/drm/i915/display/intel_audio.c
index 081627e0d917..2a6476ccc85b 100644
--- a/drivers/gpu/drm/i915/display/intel_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_audio.c
@@ -754,10 +754,8 @@ void intel_audio_codec_enable(struct intel_encoder *encoder,
crtc->base.base.id, crtc->base.name,
drm_eld_size(crtc_state->eld));
- if (display->funcs.audio)
- display->funcs.audio->audio_codec_enable(encoder,
- crtc_state,
- conn_state);
+ if (display->audio.funcs)
+ display->audio.funcs->audio_codec_enable(encoder, crtc_state, conn_state);
mutex_lock(&display->audio.mutex);
@@ -813,10 +811,8 @@ void intel_audio_codec_disable(struct intel_encoder *encoder,
encoder->base.base.id, encoder->base.name,
crtc->base.base.id, crtc->base.name);
- if (display->funcs.audio)
- display->funcs.audio->audio_codec_disable(encoder,
- old_crtc_state,
- old_conn_state);
+ if (display->audio.funcs)
+ display->audio.funcs->audio_codec_disable(encoder, old_crtc_state, old_conn_state);
mutex_lock(&display->audio.mutex);
@@ -864,8 +860,8 @@ void intel_audio_codec_get_config(struct intel_encoder *encoder,
if (!crtc_state->has_audio)
return;
- if (display->funcs.audio)
- display->funcs.audio->audio_codec_get_config(encoder, crtc_state);
+ if (display->audio.funcs)
+ display->audio.funcs->audio_codec_get_config(encoder, crtc_state);
}
static const struct intel_audio_funcs g4x_audio_funcs = {
@@ -893,12 +889,12 @@ static const struct intel_audio_funcs hsw_audio_funcs = {
void intel_audio_hooks_init(struct intel_display *display)
{
if (display->platform.g4x)
- display->funcs.audio = &g4x_audio_funcs;
+ display->audio.funcs = &g4x_audio_funcs;
else if (display->platform.valleyview || display->platform.cherryview ||
HAS_PCH_CPT(display) || HAS_PCH_IBX(display))
- display->funcs.audio = &ibx_audio_funcs;
+ display->audio.funcs = &ibx_audio_funcs;
else if (display->platform.haswell || DISPLAY_VER(display) >= 8)
- display->funcs.audio = &hsw_audio_funcs;
+ display->audio.funcs = &hsw_audio_funcs;
}
struct aud_ts_cdclk_m_n {
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index c5a07090cba6..c61990ca9e29 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -100,6 +100,9 @@ struct intel_audio_state {
};
struct intel_audio {
+ /* internal display audio functions */
+ const struct intel_audio_funcs *funcs;
+
/* hda/i915 audio component */
struct i915_audio_component *component;
bool component_registered;
@@ -319,9 +322,6 @@ struct intel_display {
/* Display internal color functions */
const struct intel_color_funcs *color;
-
- /* Display internal audio functions */
- const struct intel_audio_funcs *audio;
} funcs;
struct {
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
index 70c1bba7c0a8..b5bfdebc66ca 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -2458,6 +2458,10 @@ void dg1_de_irq_postinstall(struct intel_display *display)
intel_de_write(display, GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
}
+struct intel_display_irq_funcs {
+ void (*reset)(struct intel_display *display);
+};
+
void intel_display_irq_init(struct intel_display *display)
{
spin_lock_init(&display->irq.lock);
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 02/15] drm/i915/display: move color funcs under color sub-struct
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
2026-04-29 10:24 ` [PATCH 01/15] drm/i915/display: move audio funcs under audio sub-struct Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 03/15] drm/i915/display: move fdi funcs under fdi sub-struct Jani Nikula
` (13 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Move color related functions under color sub-struct of struct
intel_display.
The funcs sub-struct of struct intel_display seems unnecessary. Instead
of display->funcs.FEATURE, prefer display->FEATURE.funcs.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_color.c | 58 +++++++++----------
.../gpu/drm/i915/display/intel_display_core.h | 6 +-
2 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c
index e7950655434b..0531c60e5e5d 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -1933,7 +1933,7 @@ void intel_color_load_luts(const struct intel_crtc_state *crtc_state)
if (crtc_state->dsb_color)
return;
- display->funcs.color->load_luts(crtc_state);
+ display->color.funcs->load_luts(crtc_state);
}
void intel_color_commit_noarm(struct intel_dsb *dsb,
@@ -1941,8 +1941,8 @@ void intel_color_commit_noarm(struct intel_dsb *dsb,
{
struct intel_display *display = to_intel_display(crtc_state);
- if (display->funcs.color->color_commit_noarm)
- display->funcs.color->color_commit_noarm(dsb, crtc_state);
+ if (display->color.funcs->color_commit_noarm)
+ display->color.funcs->color_commit_noarm(dsb, crtc_state);
}
void intel_color_commit_arm(struct intel_dsb *dsb,
@@ -1950,15 +1950,15 @@ void intel_color_commit_arm(struct intel_dsb *dsb,
{
struct intel_display *display = to_intel_display(crtc_state);
- display->funcs.color->color_commit_arm(dsb, crtc_state);
+ display->color.funcs->color_commit_arm(dsb, crtc_state);
}
void intel_color_post_update(const struct intel_crtc_state *crtc_state)
{
struct intel_display *display = to_intel_display(crtc_state);
- if (display->funcs.color->color_post_update)
- display->funcs.color->color_post_update(crtc_state);
+ if (display->color.funcs->color_post_update)
+ display->color.funcs->color_post_update(crtc_state);
}
void intel_color_modeset(const struct intel_crtc_state *crtc_state)
@@ -2022,7 +2022,7 @@ void intel_color_prepare_commit(struct intel_atomic_state *state,
if (!intel_color_uses_dsb(crtc_state))
return;
- display->funcs.color->load_luts(crtc_state);
+ display->color.funcs->load_luts(crtc_state);
if (crtc_state->use_dsb && intel_color_uses_chained_dsb(crtc_state)) {
intel_vrr_send_push(crtc_state->dsb_color, crtc_state);
@@ -2113,19 +2113,19 @@ int intel_color_check(struct intel_atomic_state *state,
if (!intel_crtc_needs_color_update(new_crtc_state))
return 0;
- return display->funcs.color->color_check(state, crtc);
+ return display->color.funcs->color_check(state, crtc);
}
void intel_color_get_config(struct intel_crtc_state *crtc_state)
{
struct intel_display *display = to_intel_display(crtc_state);
- display->funcs.color->get_config(crtc_state);
+ display->color.funcs->get_config(crtc_state);
- display->funcs.color->read_luts(crtc_state);
+ display->color.funcs->read_luts(crtc_state);
- if (display->funcs.color->read_csc)
- display->funcs.color->read_csc(crtc_state);
+ if (display->color.funcs->read_csc)
+ display->color.funcs->read_csc(crtc_state);
}
bool intel_color_lut_equal(const struct intel_crtc_state *crtc_state,
@@ -2142,7 +2142,7 @@ bool intel_color_lut_equal(const struct intel_crtc_state *crtc_state,
if (!is_pre_csc_lut && crtc_state->c8_planes)
return true;
- return display->funcs.color->lut_equal(crtc_state, blob1, blob2,
+ return display->color.funcs->lut_equal(crtc_state, blob1, blob2,
is_pre_csc_lut);
}
@@ -4253,8 +4253,8 @@ intel_color_load_plane_csc_matrix(struct intel_dsb *dsb,
{
struct intel_display *display = to_intel_display(plane_state);
- if (display->funcs.color->load_plane_csc_matrix)
- display->funcs.color->load_plane_csc_matrix(dsb, plane_state);
+ if (display->color.funcs->load_plane_csc_matrix)
+ display->color.funcs->load_plane_csc_matrix(dsb, plane_state);
}
static void
@@ -4263,8 +4263,8 @@ intel_color_load_plane_luts(struct intel_dsb *dsb,
{
struct intel_display *display = to_intel_display(plane_state);
- if (display->funcs.color->load_plane_luts)
- display->funcs.color->load_plane_luts(dsb, plane_state);
+ if (display->color.funcs->load_plane_luts)
+ display->color.funcs->load_plane_luts(dsb, plane_state);
}
bool
@@ -4346,29 +4346,29 @@ void intel_color_init_hooks(struct intel_display *display)
{
if (HAS_GMCH(display)) {
if (display->platform.cherryview)
- display->funcs.color = &chv_color_funcs;
+ display->color.funcs = &chv_color_funcs;
else if (display->platform.valleyview)
- display->funcs.color = &vlv_color_funcs;
+ display->color.funcs = &vlv_color_funcs;
else if (DISPLAY_VER(display) >= 4)
- display->funcs.color = &i965_color_funcs;
+ display->color.funcs = &i965_color_funcs;
else
- display->funcs.color = &i9xx_color_funcs;
+ display->color.funcs = &i9xx_color_funcs;
} else {
if (DISPLAY_VER(display) >= 12)
- display->funcs.color = &tgl_color_funcs;
+ display->color.funcs = &tgl_color_funcs;
else if (DISPLAY_VER(display) == 11)
- display->funcs.color = &icl_color_funcs;
+ display->color.funcs = &icl_color_funcs;
else if (DISPLAY_VER(display) == 10)
- display->funcs.color = &glk_color_funcs;
+ display->color.funcs = &glk_color_funcs;
else if (DISPLAY_VER(display) == 9)
- display->funcs.color = &skl_color_funcs;
+ display->color.funcs = &skl_color_funcs;
else if (DISPLAY_VER(display) == 8)
- display->funcs.color = &bdw_color_funcs;
+ display->color.funcs = &bdw_color_funcs;
else if (display->platform.haswell)
- display->funcs.color = &hsw_color_funcs;
+ display->color.funcs = &hsw_color_funcs;
else if (DISPLAY_VER(display) == 7)
- display->funcs.color = &ivb_color_funcs;
+ display->color.funcs = &ivb_color_funcs;
else
- display->funcs.color = &ilk_color_funcs;
+ display->color.funcs = &ilk_color_funcs;
}
}
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index c61990ca9e29..db07e332af5a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -319,9 +319,6 @@ struct intel_display {
/* fdi display functions */
const struct intel_fdi_funcs *fdi;
-
- /* Display internal color functions */
- const struct intel_color_funcs *color;
} funcs;
struct {
@@ -365,6 +362,9 @@ struct intel_display {
} cdclk;
struct {
+ /* internal color functions */
+ const struct intel_color_funcs *funcs;
+
struct drm_property_blob *glk_linear_degamma_lut;
} color;
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 03/15] drm/i915/display: move fdi funcs under fdi sub-struct
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
2026-04-29 10:24 ` [PATCH 01/15] drm/i915/display: move audio funcs under audio sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 02/15] drm/i915/display: move color funcs under color sub-struct Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 04/15] drm/i915/display: move watermark funcs under wm sub-struct Jani Nikula
` (12 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Move fdi related functions under fdi sub-struct of struct intel_display.
The funcs sub-struct of struct intel_display seems unnecessary. Instead
of display->funcs.FEATURE, prefer display->FEATURE.funcs.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_core.h | 6 +++---
drivers/gpu/drm/i915/display/intel_fdi.c | 8 ++++----
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index db07e332af5a..0fdda5339e81 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -316,9 +316,6 @@ struct intel_display {
/* pm display functions */
const struct intel_wm_funcs *wm;
-
- /* fdi display functions */
- const struct intel_fdi_funcs *fdi;
} funcs;
struct {
@@ -418,6 +415,9 @@ struct intel_display {
} fbdev;
struct {
+ /* internal fdi functions */
+ const struct intel_fdi_funcs *funcs;
+
unsigned int pll_freq;
u32 rx_config;
} fdi;
diff --git a/drivers/gpu/drm/i915/display/intel_fdi.c b/drivers/gpu/drm/i915/display/intel_fdi.c
index 917f020650af..f5094655a63b 100644
--- a/drivers/gpu/drm/i915/display/intel_fdi.c
+++ b/drivers/gpu/drm/i915/display/intel_fdi.c
@@ -123,7 +123,7 @@ void intel_fdi_link_train(struct intel_crtc *crtc,
{
struct intel_display *display = to_intel_display(crtc);
- display->funcs.fdi->fdi_link_train(crtc, crtc_state);
+ display->fdi.funcs->fdi_link_train(crtc, crtc_state);
}
/**
@@ -1109,11 +1109,11 @@ void
intel_fdi_init_hook(struct intel_display *display)
{
if (display->platform.ironlake) {
- display->funcs.fdi = &ilk_funcs;
+ display->fdi.funcs = &ilk_funcs;
} else if (display->platform.sandybridge) {
- display->funcs.fdi = &gen6_funcs;
+ display->fdi.funcs = &gen6_funcs;
} else if (display->platform.ivybridge) {
/* FIXME: detect B0+ stepping and use auto training */
- display->funcs.fdi = &ivb_funcs;
+ display->fdi.funcs = &ivb_funcs;
}
}
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 04/15] drm/i915/display: move watermark funcs under wm sub-struct
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (2 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 03/15] drm/i915/display: move fdi funcs under fdi sub-struct Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 05/15] drm/i915/display: move hotplug irq funcs under hotplug sub-struct Jani Nikula
` (11 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Move watermark related functions under wm sub-struct of struct
intel_display.
The funcs sub-struct of struct intel_display seems unnecessary. Instead
of display->funcs.FEATURE, prefer display->FEATURE.funcs.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/i9xx_wm.c | 22 ++++++-------
drivers/gpu/drm/i915/display/intel_display.c | 2 +-
.../gpu/drm/i915/display/intel_display_core.h | 6 ++--
drivers/gpu/drm/i915/display/intel_wm.c | 32 +++++++++----------
drivers/gpu/drm/i915/display/skl_watermark.c | 2 +-
5 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/i9xx_wm.c b/drivers/gpu/drm/i915/display/i9xx_wm.c
index 02ac6f9a3d0e..ca4fff10ce8f 100644
--- a/drivers/gpu/drm/i915/display/i9xx_wm.c
+++ b/drivers/gpu/drm/i915/display/i9xx_wm.c
@@ -3584,7 +3584,7 @@ void ilk_wm_sanitize(struct intel_display *display)
int i;
/* Only supported on platforms that use atomic watermark design */
- if (!display->funcs.wm->optimize_watermarks)
+ if (!display->wm.funcs->optimize_watermarks)
return;
if (drm_WARN_ON(display->drm, DISPLAY_VER(display) >= 9))
@@ -4152,34 +4152,34 @@ void i9xx_wm_init(struct intel_display *display)
/* For FIFO watermark updates */
if (HAS_PCH_SPLIT(display)) {
ilk_setup_wm_latency(display);
- display->funcs.wm = &ilk_wm_funcs;
+ display->wm.funcs = &ilk_wm_funcs;
} else if (display->platform.valleyview || display->platform.cherryview) {
vlv_setup_wm_latency(display);
- display->funcs.wm = &vlv_wm_funcs;
+ display->wm.funcs = &vlv_wm_funcs;
} else if (display->platform.g4x) {
g4x_setup_wm_latency(display);
- display->funcs.wm = &g4x_wm_funcs;
+ display->wm.funcs = &g4x_wm_funcs;
} else if (display->platform.pineview) {
if (!pnv_get_cxsr_latency(display)) {
drm_info(display->drm, "Unknown FSB/MEM, disabling CxSR\n");
/* Disable CxSR and never update its watermark again */
intel_set_memory_cxsr(display, false);
- display->funcs.wm = &nop_funcs;
+ display->wm.funcs = &nop_funcs;
} else {
- display->funcs.wm = &pnv_wm_funcs;
+ display->wm.funcs = &pnv_wm_funcs;
}
} else if (DISPLAY_VER(display) == 4) {
- display->funcs.wm = &i965_wm_funcs;
+ display->wm.funcs = &i965_wm_funcs;
} else if (DISPLAY_VER(display) == 3) {
- display->funcs.wm = &i9xx_wm_funcs;
+ display->wm.funcs = &i9xx_wm_funcs;
} else if (DISPLAY_VER(display) == 2) {
if (INTEL_NUM_PIPES(display) == 1)
- display->funcs.wm = &i845_wm_funcs;
+ display->wm.funcs = &i845_wm_funcs;
else
- display->funcs.wm = &i9xx_wm_funcs;
+ display->wm.funcs = &i9xx_wm_funcs;
} else {
drm_err(display->drm,
"unexpected fall-through in %s\n", __func__);
- display->funcs.wm = &nop_funcs;
+ display->wm.funcs = &nop_funcs;
}
}
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 674a4ece6d0f..7839e663f7bc 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -2162,7 +2162,7 @@ static void i9xx_crtc_disable(struct intel_atomic_state *state,
if (DISPLAY_VER(display) != 2)
intel_set_cpu_fifo_underrun_reporting(display, pipe, false);
- if (!display->funcs.wm->initial_watermarks)
+ if (!display->wm.funcs->initial_watermarks)
intel_update_watermarks(display);
/* clock the pipe down to 640x480@60 to potentially save power */
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 0fdda5339e81..01394724abc9 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -247,6 +247,9 @@ struct intel_vbt_data {
};
struct intel_wm {
+ /* internal watermark functions */
+ const struct intel_wm_funcs *funcs;
+
/*
* Raw watermark latency values:
* in 0.1us units for WM0,
@@ -313,9 +316,6 @@ struct intel_display {
/* irq display functions */
const struct intel_hotplug_funcs *hotplug;
-
- /* pm display functions */
- const struct intel_wm_funcs *wm;
} funcs;
struct {
diff --git a/drivers/gpu/drm/i915/display/intel_wm.c b/drivers/gpu/drm/i915/display/intel_wm.c
index f887a664fe22..b4aded774ce6 100644
--- a/drivers/gpu/drm/i915/display/intel_wm.c
+++ b/drivers/gpu/drm/i915/display/intel_wm.c
@@ -48,8 +48,8 @@
*/
void intel_update_watermarks(struct intel_display *display)
{
- if (display->funcs.wm->update_wm)
- display->funcs.wm->update_wm(display);
+ if (display->wm.funcs->update_wm)
+ display->wm.funcs->update_wm(display);
}
int intel_wm_compute(struct intel_atomic_state *state,
@@ -57,10 +57,10 @@ int intel_wm_compute(struct intel_atomic_state *state,
{
struct intel_display *display = to_intel_display(state);
- if (!display->funcs.wm->compute_watermarks)
+ if (!display->wm.funcs->compute_watermarks)
return 0;
- return display->funcs.wm->compute_watermarks(state, crtc);
+ return display->wm.funcs->compute_watermarks(state, crtc);
}
bool intel_initial_watermarks(struct intel_atomic_state *state,
@@ -68,8 +68,8 @@ bool intel_initial_watermarks(struct intel_atomic_state *state,
{
struct intel_display *display = to_intel_display(state);
- if (display->funcs.wm->initial_watermarks) {
- display->funcs.wm->initial_watermarks(state, crtc);
+ if (display->wm.funcs->initial_watermarks) {
+ display->wm.funcs->initial_watermarks(state, crtc);
return true;
}
@@ -81,8 +81,8 @@ void intel_atomic_update_watermarks(struct intel_atomic_state *state,
{
struct intel_display *display = to_intel_display(state);
- if (display->funcs.wm->atomic_update_watermarks)
- display->funcs.wm->atomic_update_watermarks(state, crtc);
+ if (display->wm.funcs->atomic_update_watermarks)
+ display->wm.funcs->atomic_update_watermarks(state, crtc);
}
void intel_optimize_watermarks(struct intel_atomic_state *state,
@@ -90,30 +90,30 @@ void intel_optimize_watermarks(struct intel_atomic_state *state,
{
struct intel_display *display = to_intel_display(state);
- if (display->funcs.wm->optimize_watermarks)
- display->funcs.wm->optimize_watermarks(state, crtc);
+ if (display->wm.funcs->optimize_watermarks)
+ display->wm.funcs->optimize_watermarks(state, crtc);
}
int intel_compute_global_watermarks(struct intel_atomic_state *state)
{
struct intel_display *display = to_intel_display(state);
- if (display->funcs.wm->compute_global_watermarks)
- return display->funcs.wm->compute_global_watermarks(state);
+ if (display->wm.funcs->compute_global_watermarks)
+ return display->wm.funcs->compute_global_watermarks(state);
return 0;
}
void intel_wm_get_hw_state(struct intel_display *display)
{
- if (display->funcs.wm->get_hw_state)
- return display->funcs.wm->get_hw_state(display);
+ if (display->wm.funcs->get_hw_state)
+ return display->wm.funcs->get_hw_state(display);
}
void intel_wm_sanitize(struct intel_display *display)
{
- if (display->funcs.wm->sanitize)
- return display->funcs.wm->sanitize(display);
+ if (display->wm.funcs->sanitize)
+ return display->wm.funcs->sanitize(display);
}
bool intel_wm_plane_visible(const struct intel_crtc_state *crtc_state,
diff --git a/drivers/gpu/drm/i915/display/skl_watermark.c b/drivers/gpu/drm/i915/display/skl_watermark.c
index 4bffa27ce02c..96d2dcbe7bbc 100644
--- a/drivers/gpu/drm/i915/display/skl_watermark.c
+++ b/drivers/gpu/drm/i915/display/skl_watermark.c
@@ -3995,7 +3995,7 @@ void skl_wm_init(struct intel_display *display)
skl_setup_wm_latency(display);
- display->funcs.wm = &skl_wm_funcs;
+ display->wm.funcs = &skl_wm_funcs;
}
static int skl_watermark_ipc_status_show(struct seq_file *m, void *data)
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 05/15] drm/i915/display: move hotplug irq funcs under hotplug sub-struct
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (3 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 04/15] drm/i915/display: move watermark funcs under wm sub-struct Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 06/15] drm/i915/display: move dpll funcs under dpll sub-struct Jani Nikula
` (10 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Move hotplug irq related functions under hotplug sub-struct of struct
intel_display.
The funcs sub-struct of struct intel_display seems unnecessary. Instead
of display->funcs.FEATURE, prefer display->FEATURE.funcs.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
.../gpu/drm/i915/display/intel_display_core.h | 8 ++---
.../gpu/drm/i915/display/intel_hotplug_irq.c | 30 +++++++++----------
2 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 01394724abc9..0c2e17edbd5f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -47,7 +47,7 @@ struct intel_dpll_global_funcs;
struct intel_dpll_mgr;
struct intel_fbdev;
struct intel_fdi_funcs;
-struct intel_hotplug_funcs;
+struct intel_hotplug_irq_funcs;
struct intel_initial_plane_config;
struct intel_opregion;
struct intel_overlay;
@@ -155,6 +155,9 @@ struct intel_frontbuffer_tracking {
};
struct intel_hotplug {
+ /* internal hotplug irq functions */
+ const struct intel_hotplug_irq_funcs *funcs;
+
struct delayed_work hotplug_work;
const u32 *hpd, *pch_hpd;
@@ -313,9 +316,6 @@ struct intel_display {
/* Display pll funcs */
const struct intel_dpll_global_funcs *dpll;
-
- /* irq display functions */
- const struct intel_hotplug_funcs *hotplug;
} funcs;
struct {
diff --git a/drivers/gpu/drm/i915/display/intel_hotplug_irq.c b/drivers/gpu/drm/i915/display/intel_hotplug_irq.c
index 8865cb2ac569..539fd555edce 100644
--- a/drivers/gpu/drm/i915/display/intel_hotplug_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_hotplug_irq.c
@@ -1420,7 +1420,7 @@ static void i915_hpd_irq_setup(struct intel_display *display)
hotplug_en);
}
-struct intel_hotplug_funcs {
+struct intel_hotplug_irq_funcs {
/* Enable HPD sense and interrupts for all present encoders */
void (*hpd_irq_setup)(struct intel_display *display);
/* Enable HPD sense for a single encoder */
@@ -1428,7 +1428,7 @@ struct intel_hotplug_funcs {
};
#define HPD_FUNCS(platform) \
-static const struct intel_hotplug_funcs platform##_hpd_funcs = { \
+static const struct intel_hotplug_irq_funcs platform##_hpd_funcs = { \
.hpd_irq_setup = platform##_hpd_irq_setup, \
.hpd_enable_detection = platform##_hpd_enable_detection, \
}
@@ -1447,8 +1447,8 @@ void intel_hpd_enable_detection(struct intel_encoder *encoder)
{
struct intel_display *display = to_intel_display(encoder);
- if (display->funcs.hotplug)
- display->funcs.hotplug->hpd_enable_detection(encoder);
+ if (display->hotplug.funcs)
+ display->hotplug.funcs->hpd_enable_detection(encoder);
}
void intel_hpd_irq_setup(struct intel_display *display)
@@ -1457,8 +1457,8 @@ void intel_hpd_irq_setup(struct intel_display *display)
!display->irq.vlv_display_irqs_enabled)
return;
- if (display->funcs.hotplug)
- display->funcs.hotplug->hpd_irq_setup(display);
+ if (display->hotplug.funcs)
+ display->hotplug.funcs->hpd_irq_setup(display);
}
void intel_hotplug_irq_init(struct intel_display *display)
@@ -1469,23 +1469,23 @@ void intel_hotplug_irq_init(struct intel_display *display)
if (HAS_GMCH(display)) {
if (HAS_HOTPLUG(display))
- display->funcs.hotplug = &i915_hpd_funcs;
+ display->hotplug.funcs = &i915_hpd_funcs;
} else {
if (HAS_PCH_DG2(display))
- display->funcs.hotplug = &icp_hpd_funcs;
+ display->hotplug.funcs = &icp_hpd_funcs;
else if (HAS_PCH_DG1(display))
- display->funcs.hotplug = &dg1_hpd_funcs;
+ display->hotplug.funcs = &dg1_hpd_funcs;
else if (DISPLAY_VER(display) >= 14)
- display->funcs.hotplug = &xelpdp_hpd_funcs;
+ display->hotplug.funcs = &xelpdp_hpd_funcs;
else if (DISPLAY_VER(display) >= 11)
- display->funcs.hotplug = &gen11_hpd_funcs;
+ display->hotplug.funcs = &gen11_hpd_funcs;
else if (display->platform.geminilake || display->platform.broxton)
- display->funcs.hotplug = &bxt_hpd_funcs;
+ display->hotplug.funcs = &bxt_hpd_funcs;
else if (INTEL_PCH_TYPE(display) >= PCH_ICP)
- display->funcs.hotplug = &icp_hpd_funcs;
+ display->hotplug.funcs = &icp_hpd_funcs;
else if (INTEL_PCH_TYPE(display) >= PCH_SPT)
- display->funcs.hotplug = &spt_hpd_funcs;
+ display->hotplug.funcs = &spt_hpd_funcs;
else
- display->funcs.hotplug = &ilk_hpd_funcs;
+ display->hotplug.funcs = &ilk_hpd_funcs;
}
}
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 06/15] drm/i915/display: move dpll funcs under dpll sub-struct
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (4 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 05/15] drm/i915/display: move hotplug irq funcs under hotplug sub-struct Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 07/15] drm/i915/display: move cdclk funcs under cdclk sub-struct Jani Nikula
` (9 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Move dpll related functions under dpll sub-struct of struct
intel_display.
The funcs sub-struct of struct intel_display seems unnecessary. Instead
of display->funcs.FEATURE, prefer display->FEATURE.funcs.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
.../gpu/drm/i915/display/intel_display_core.h | 6 ++--
drivers/gpu/drm/i915/display/intel_dpll.c | 28 +++++++++----------
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 0c2e17edbd5f..5a1aee340728 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -127,6 +127,9 @@ struct intel_audio {
* dpll, because on some platforms plls share registers.
*/
struct intel_dpll_global {
+ /* internal dpll functions */
+ const struct intel_dpll_global_funcs *funcs;
+
struct mutex lock;
int num_dpll;
@@ -313,9 +316,6 @@ struct intel_display {
/* Display CDCLK functions */
const struct intel_cdclk_funcs *cdclk;
-
- /* Display pll funcs */
- const struct intel_dpll_global_funcs *dpll;
} funcs;
struct {
diff --git a/drivers/gpu/drm/i915/display/intel_dpll.c b/drivers/gpu/drm/i915/display/intel_dpll.c
index a1aa88598013..f40807a5566b 100644
--- a/drivers/gpu/drm/i915/display/intel_dpll.c
+++ b/drivers/gpu/drm/i915/display/intel_dpll.c
@@ -1735,7 +1735,7 @@ int intel_dpll_crtc_compute_clock(struct intel_atomic_state *state,
if (!crtc_state->hw.enable)
return 0;
- ret = display->funcs.dpll->crtc_compute_clock(state, crtc);
+ ret = display->dpll.funcs->crtc_compute_clock(state, crtc);
if (ret) {
drm_dbg_kms(display->drm, "[CRTC:%d:%s] Couldn't calculate DPLL settings\n",
crtc->base.base.id, crtc->base.name);
@@ -1759,10 +1759,10 @@ int intel_dpll_crtc_get_dpll(struct intel_atomic_state *state,
if (!crtc_state->hw.enable || crtc_state->intel_dpll)
return 0;
- if (!display->funcs.dpll->crtc_get_dpll)
+ if (!display->dpll.funcs->crtc_get_dpll)
return 0;
- ret = display->funcs.dpll->crtc_get_dpll(state, crtc);
+ ret = display->dpll.funcs->crtc_get_dpll(state, crtc);
if (ret) {
drm_dbg_kms(display->drm, "[CRTC:%d:%s] Couldn't get a shared DPLL\n",
crtc->base.base.id, crtc->base.name);
@@ -1776,27 +1776,27 @@ void
intel_dpll_init_clock_hook(struct intel_display *display)
{
if (HAS_LT_PHY(display))
- display->funcs.dpll = &xe3plpd_dpll_funcs;
+ display->dpll.funcs = &xe3plpd_dpll_funcs;
else if (DISPLAY_VER(display) >= 14)
- display->funcs.dpll = &mtl_dpll_funcs;
+ display->dpll.funcs = &mtl_dpll_funcs;
else if (display->platform.dg2)
- display->funcs.dpll = &dg2_dpll_funcs;
+ display->dpll.funcs = &dg2_dpll_funcs;
else if (DISPLAY_VER(display) >= 9 || HAS_DDI(display))
- display->funcs.dpll = &hsw_dpll_funcs;
+ display->dpll.funcs = &hsw_dpll_funcs;
else if (HAS_PCH_SPLIT(display))
- display->funcs.dpll = &ilk_dpll_funcs;
+ display->dpll.funcs = &ilk_dpll_funcs;
else if (display->platform.cherryview)
- display->funcs.dpll = &chv_dpll_funcs;
+ display->dpll.funcs = &chv_dpll_funcs;
else if (display->platform.valleyview)
- display->funcs.dpll = &vlv_dpll_funcs;
+ display->dpll.funcs = &vlv_dpll_funcs;
else if (display->platform.g4x)
- display->funcs.dpll = &g4x_dpll_funcs;
+ display->dpll.funcs = &g4x_dpll_funcs;
else if (display->platform.pineview)
- display->funcs.dpll = &pnv_dpll_funcs;
+ display->dpll.funcs = &pnv_dpll_funcs;
else if (DISPLAY_VER(display) != 2)
- display->funcs.dpll = &i9xx_dpll_funcs;
+ display->dpll.funcs = &i9xx_dpll_funcs;
else
- display->funcs.dpll = &i8xx_dpll_funcs;
+ display->dpll.funcs = &i8xx_dpll_funcs;
}
static bool i9xx_has_pps(struct intel_display *display)
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 07/15] drm/i915/display: move cdclk funcs under cdclk sub-struct
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (5 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 06/15] drm/i915/display: move dpll funcs under dpll sub-struct Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 08/15] drm/i915/display: move display funcs under modeset sub-struct Jani Nikula
` (8 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Move cdclk related functions under cdclk sub-struct of struct
intel_display.
The funcs sub-struct of struct intel_display seems unnecessary. Instead
of display->funcs.FEATURE, prefer display->FEATURE.funcs.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_cdclk.c | 84 +++++++++----------
.../gpu/drm/i915/display/intel_display_core.h | 6 +-
2 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c
index 57d714c81fc4..a1bf01021d65 100644
--- a/drivers/gpu/drm/i915/display/intel_cdclk.c
+++ b/drivers/gpu/drm/i915/display/intel_cdclk.c
@@ -170,27 +170,27 @@ struct intel_cdclk_funcs {
void intel_cdclk_get_cdclk(struct intel_display *display,
struct intel_cdclk_config *cdclk_config)
{
- display->funcs.cdclk->get_cdclk(display, cdclk_config);
+ display->cdclk.funcs->get_cdclk(display, cdclk_config);
}
static void intel_cdclk_set_cdclk(struct intel_display *display,
const struct intel_cdclk_config *cdclk_config,
enum pipe pipe)
{
- display->funcs.cdclk->set_cdclk(display, cdclk_config, pipe);
+ display->cdclk.funcs->set_cdclk(display, cdclk_config, pipe);
}
static int intel_cdclk_modeset_calc_cdclk(struct intel_atomic_state *state)
{
struct intel_display *display = to_intel_display(state);
- return display->funcs.cdclk->modeset_calc_cdclk(state);
+ return display->cdclk.funcs->modeset_calc_cdclk(state);
}
static u8 intel_cdclk_calc_voltage_level(struct intel_display *display,
int cdclk)
{
- return display->funcs.cdclk->calc_voltage_level(cdclk);
+ return display->cdclk.funcs->calc_voltage_level(cdclk);
}
static void fixed_133mhz_get_cdclk(struct intel_display *display,
@@ -2619,7 +2619,7 @@ static void intel_set_cdclk(struct intel_display *display,
if (!intel_cdclk_changed(&display->cdclk.hw, cdclk_config))
return;
- if (drm_WARN_ON_ONCE(display->drm, !display->funcs.cdclk->set_cdclk))
+ if (drm_WARN_ON_ONCE(display->drm, !display->cdclk.funcs->set_cdclk))
return;
intel_cdclk_dump_config(display, cdclk_config, context);
@@ -4042,100 +4042,100 @@ static const struct intel_cdclk_funcs i830_cdclk_funcs = {
void intel_init_cdclk_hooks(struct intel_display *display)
{
if (DISPLAY_VER(display) >= 35) {
- display->funcs.cdclk = &xe3lpd_cdclk_funcs;
+ display->cdclk.funcs = &xe3lpd_cdclk_funcs;
display->cdclk.table = xe3p_lpd_cdclk_table;
} else if (DISPLAY_VER(display) >= 30) {
- display->funcs.cdclk = &xe3lpd_cdclk_funcs;
+ display->cdclk.funcs = &xe3lpd_cdclk_funcs;
display->cdclk.table = xe3lpd_cdclk_table;
} else if (DISPLAY_VER(display) >= 20) {
- display->funcs.cdclk = &rplu_cdclk_funcs;
+ display->cdclk.funcs = &rplu_cdclk_funcs;
display->cdclk.table = xe2lpd_cdclk_table;
} else if (DISPLAY_VERx100(display) >= 1401) {
- display->funcs.cdclk = &rplu_cdclk_funcs;
+ display->cdclk.funcs = &rplu_cdclk_funcs;
display->cdclk.table = xe2hpd_cdclk_table;
} else if (DISPLAY_VER(display) >= 14) {
- display->funcs.cdclk = &rplu_cdclk_funcs;
+ display->cdclk.funcs = &rplu_cdclk_funcs;
display->cdclk.table = mtl_cdclk_table;
} else if (display->platform.dg2) {
- display->funcs.cdclk = &tgl_cdclk_funcs;
+ display->cdclk.funcs = &tgl_cdclk_funcs;
display->cdclk.table = dg2_cdclk_table;
} else if (display->platform.alderlake_p) {
/* Wa_22011320316:adl-p[a0] */
if (intel_display_wa(display, INTEL_DISPLAY_WA_22011320316)) {
display->cdclk.table = adlp_a_step_cdclk_table;
- display->funcs.cdclk = &tgl_cdclk_funcs;
+ display->cdclk.funcs = &tgl_cdclk_funcs;
} else if (display->platform.alderlake_p_raptorlake_u) {
display->cdclk.table = rplu_cdclk_table;
- display->funcs.cdclk = &rplu_cdclk_funcs;
+ display->cdclk.funcs = &rplu_cdclk_funcs;
} else {
display->cdclk.table = adlp_cdclk_table;
- display->funcs.cdclk = &tgl_cdclk_funcs;
+ display->cdclk.funcs = &tgl_cdclk_funcs;
}
} else if (display->platform.rocketlake) {
- display->funcs.cdclk = &tgl_cdclk_funcs;
+ display->cdclk.funcs = &tgl_cdclk_funcs;
display->cdclk.table = rkl_cdclk_table;
} else if (DISPLAY_VER(display) >= 12) {
- display->funcs.cdclk = &tgl_cdclk_funcs;
+ display->cdclk.funcs = &tgl_cdclk_funcs;
display->cdclk.table = icl_cdclk_table;
} else if (display->platform.jasperlake || display->platform.elkhartlake) {
- display->funcs.cdclk = &ehl_cdclk_funcs;
+ display->cdclk.funcs = &ehl_cdclk_funcs;
display->cdclk.table = icl_cdclk_table;
} else if (DISPLAY_VER(display) >= 11) {
- display->funcs.cdclk = &icl_cdclk_funcs;
+ display->cdclk.funcs = &icl_cdclk_funcs;
display->cdclk.table = icl_cdclk_table;
} else if (display->platform.geminilake || display->platform.broxton) {
- display->funcs.cdclk = &bxt_cdclk_funcs;
+ display->cdclk.funcs = &bxt_cdclk_funcs;
if (display->platform.geminilake)
display->cdclk.table = glk_cdclk_table;
else
display->cdclk.table = bxt_cdclk_table;
} else if (DISPLAY_VER(display) == 9) {
- display->funcs.cdclk = &skl_cdclk_funcs;
+ display->cdclk.funcs = &skl_cdclk_funcs;
} else if (display->platform.broadwell) {
- display->funcs.cdclk = &bdw_cdclk_funcs;
+ display->cdclk.funcs = &bdw_cdclk_funcs;
} else if (display->platform.haswell) {
- display->funcs.cdclk = &hsw_cdclk_funcs;
+ display->cdclk.funcs = &hsw_cdclk_funcs;
} else if (display->platform.cherryview) {
- display->funcs.cdclk = &chv_cdclk_funcs;
+ display->cdclk.funcs = &chv_cdclk_funcs;
} else if (display->platform.valleyview) {
- display->funcs.cdclk = &vlv_cdclk_funcs;
+ display->cdclk.funcs = &vlv_cdclk_funcs;
} else if (display->platform.sandybridge || display->platform.ivybridge) {
- display->funcs.cdclk = &fixed_400mhz_cdclk_funcs;
+ display->cdclk.funcs = &fixed_400mhz_cdclk_funcs;
} else if (display->platform.ironlake) {
- display->funcs.cdclk = &ilk_cdclk_funcs;
+ display->cdclk.funcs = &ilk_cdclk_funcs;
} else if (display->platform.gm45) {
- display->funcs.cdclk = &gm45_cdclk_funcs;
+ display->cdclk.funcs = &gm45_cdclk_funcs;
} else if (display->platform.g45) {
- display->funcs.cdclk = &g33_cdclk_funcs;
+ display->cdclk.funcs = &g33_cdclk_funcs;
} else if (display->platform.i965gm) {
- display->funcs.cdclk = &i965gm_cdclk_funcs;
+ display->cdclk.funcs = &i965gm_cdclk_funcs;
} else if (display->platform.i965g) {
- display->funcs.cdclk = &fixed_400mhz_cdclk_funcs;
+ display->cdclk.funcs = &fixed_400mhz_cdclk_funcs;
} else if (display->platform.pineview) {
- display->funcs.cdclk = &pnv_cdclk_funcs;
+ display->cdclk.funcs = &pnv_cdclk_funcs;
} else if (display->platform.g33) {
- display->funcs.cdclk = &g33_cdclk_funcs;
+ display->cdclk.funcs = &g33_cdclk_funcs;
} else if (display->platform.i945gm) {
- display->funcs.cdclk = &i945gm_cdclk_funcs;
+ display->cdclk.funcs = &i945gm_cdclk_funcs;
} else if (display->platform.i945g) {
- display->funcs.cdclk = &fixed_400mhz_cdclk_funcs;
+ display->cdclk.funcs = &fixed_400mhz_cdclk_funcs;
} else if (display->platform.i915gm) {
- display->funcs.cdclk = &i915gm_cdclk_funcs;
+ display->cdclk.funcs = &i915gm_cdclk_funcs;
} else if (display->platform.i915g) {
- display->funcs.cdclk = &i915g_cdclk_funcs;
+ display->cdclk.funcs = &i915g_cdclk_funcs;
} else if (display->platform.i865g) {
- display->funcs.cdclk = &i865g_cdclk_funcs;
+ display->cdclk.funcs = &i865g_cdclk_funcs;
} else if (display->platform.i85x) {
- display->funcs.cdclk = &i85x_cdclk_funcs;
+ display->cdclk.funcs = &i85x_cdclk_funcs;
} else if (display->platform.i845g) {
- display->funcs.cdclk = &i845g_cdclk_funcs;
+ display->cdclk.funcs = &i845g_cdclk_funcs;
} else if (display->platform.i830) {
- display->funcs.cdclk = &i830_cdclk_funcs;
+ display->cdclk.funcs = &i830_cdclk_funcs;
}
- if (drm_WARN(display->drm, !display->funcs.cdclk,
+ if (drm_WARN(display->drm, !display->cdclk.funcs,
"Unknown platform. Assuming i830\n"))
- display->funcs.cdclk = &i830_cdclk_funcs;
+ display->cdclk.funcs = &i830_cdclk_funcs;
}
int intel_cdclk_logical(const struct intel_cdclk_state *cdclk_state)
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 5a1aee340728..a319fb97dafa 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -313,9 +313,6 @@ struct intel_display {
struct {
/* Top level crtc-ish functions */
const struct intel_display_funcs *display;
-
- /* Display CDCLK functions */
- const struct intel_cdclk_funcs *cdclk;
} funcs;
struct {
@@ -345,6 +342,9 @@ struct intel_display {
} bw;
struct {
+ /* Internal CDCLK functions */
+ const struct intel_cdclk_funcs *funcs;
+
/* The current hardware cdclk configuration */
struct intel_cdclk_config hw;
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 08/15] drm/i915/display: move display funcs under modeset sub-struct
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (6 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 07/15] drm/i915/display: move cdclk funcs under cdclk sub-struct Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 09/15] drm/i915/irq: deduplicate dg1_de_irq_postinstall() and gen11_de_irq_postinstall() Jani Nikula
` (7 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Move generic crtc-ish modeset related functions under a new modeset
sub-struct of struct intel_display. Rename struct intel_display_funcs to
intel_modeset_funcs to make it a little bit more specific. Remove the
funcs sub-struct.
The funcs sub-struct of struct intel_display seems unnecessary. Instead
of display->funcs.FEATURE, prefer display->FEATURE.funcs.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 28 +++++++++----------
.../gpu/drm/i915/display/intel_display_core.h | 13 ++++-----
.../drm/i915/display/intel_initial_plane.c | 4 +--
.../drm/i915/display/intel_modeset_setup.c | 2 +-
4 files changed, 23 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 7839e663f7bc..b023cc46c863 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -4051,7 +4051,7 @@ bool intel_crtc_get_pipe_config(struct intel_crtc_state *crtc_state)
struct intel_display *display = to_intel_display(crtc_state);
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
- if (!display->funcs.display->get_pipe_config(crtc, crtc_state))
+ if (!display->modeset.funcs->get_pipe_config(crtc, crtc_state))
return false;
crtc_state->hw.active = true;
@@ -6739,7 +6739,7 @@ static void intel_enable_crtc(struct intel_atomic_state *state,
intel_psr_notify_pipe_change(state, crtc, true);
- display->funcs.display->crtc_enable(state, crtc);
+ display->modeset.funcs->crtc_enable(state, crtc);
/* vblanks work again, re-enable pipe CRC. */
intel_crtc_enable_pipe_crc(crtc);
@@ -6870,7 +6870,7 @@ static void intel_old_crtc_state_disables(struct intel_atomic_state *state,
intel_psr_notify_pipe_change(state, crtc, false);
- display->funcs.display->crtc_disable(state, crtc);
+ display->modeset.funcs->crtc_disable(state, crtc);
for_each_intel_crtc_in_pipe_mask(display->drm, pipe_crtc,
intel_crtc_joined_pipe_mask(old_crtc_state)) {
@@ -7522,7 +7522,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
}
/* Now enable the clocks, plane, pipe, and connectors that we set up. */
- display->funcs.display->commit_modeset_enables(state);
+ display->modeset.funcs->commit_modeset_enables(state);
/* FIXME probably need to sequence this properly */
intel_program_dpkgc_latency(state);
@@ -8195,7 +8195,7 @@ intel_mode_valid_max_plane_size(struct intel_display *display,
return MODE_OK;
}
-static const struct intel_display_funcs skl_display_funcs = {
+static const struct intel_modeset_funcs skl_display_funcs = {
.get_pipe_config = hsw_get_pipe_config,
.crtc_enable = hsw_crtc_enable,
.crtc_disable = hsw_crtc_disable,
@@ -8204,7 +8204,7 @@ static const struct intel_display_funcs skl_display_funcs = {
.fixup_initial_plane_config = skl_fixup_initial_plane_config,
};
-static const struct intel_display_funcs ddi_display_funcs = {
+static const struct intel_modeset_funcs ddi_display_funcs = {
.get_pipe_config = hsw_get_pipe_config,
.crtc_enable = hsw_crtc_enable,
.crtc_disable = hsw_crtc_disable,
@@ -8213,7 +8213,7 @@ static const struct intel_display_funcs ddi_display_funcs = {
.fixup_initial_plane_config = i9xx_fixup_initial_plane_config,
};
-static const struct intel_display_funcs pch_split_display_funcs = {
+static const struct intel_modeset_funcs pch_split_display_funcs = {
.get_pipe_config = ilk_get_pipe_config,
.crtc_enable = ilk_crtc_enable,
.crtc_disable = ilk_crtc_disable,
@@ -8222,7 +8222,7 @@ static const struct intel_display_funcs pch_split_display_funcs = {
.fixup_initial_plane_config = i9xx_fixup_initial_plane_config,
};
-static const struct intel_display_funcs vlv_display_funcs = {
+static const struct intel_modeset_funcs vlv_display_funcs = {
.get_pipe_config = i9xx_get_pipe_config,
.crtc_enable = valleyview_crtc_enable,
.crtc_disable = i9xx_crtc_disable,
@@ -8231,7 +8231,7 @@ static const struct intel_display_funcs vlv_display_funcs = {
.fixup_initial_plane_config = i9xx_fixup_initial_plane_config,
};
-static const struct intel_display_funcs i9xx_display_funcs = {
+static const struct intel_modeset_funcs i9xx_display_funcs = {
.get_pipe_config = i9xx_get_pipe_config,
.crtc_enable = i9xx_crtc_enable,
.crtc_disable = i9xx_crtc_disable,
@@ -8247,16 +8247,16 @@ static const struct intel_display_funcs i9xx_display_funcs = {
void intel_init_display_hooks(struct intel_display *display)
{
if (DISPLAY_VER(display) >= 9) {
- display->funcs.display = &skl_display_funcs;
+ display->modeset.funcs = &skl_display_funcs;
} else if (HAS_DDI(display)) {
- display->funcs.display = &ddi_display_funcs;
+ display->modeset.funcs = &ddi_display_funcs;
} else if (HAS_PCH_SPLIT(display)) {
- display->funcs.display = &pch_split_display_funcs;
+ display->modeset.funcs = &pch_split_display_funcs;
} else if (display->platform.cherryview ||
display->platform.valleyview) {
- display->funcs.display = &vlv_display_funcs;
+ display->modeset.funcs = &vlv_display_funcs;
} else {
- display->funcs.display = &i9xx_display_funcs;
+ display->modeset.funcs = &i9xx_display_funcs;
}
}
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index a319fb97dafa..796517e7bc6c 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -59,7 +59,7 @@ struct task_struct;
/* Amount of PSF GV points, BSpec precisely defines this */
#define I915_NUM_PSF_GV_POINTS 3
-struct intel_display_funcs {
+struct intel_modeset_funcs {
/*
* Returns the active state of the crtc, and if the crtc is active,
* fills out the pipe-config with the hw state.
@@ -309,12 +309,6 @@ struct intel_display {
/* list of all intel_crtcs sorted by pipe */
struct list_head pipe_list;
- /* Display functions */
- struct {
- /* Top level crtc-ish functions */
- const struct intel_display_funcs *display;
- } funcs;
-
struct {
bool any_task_allowed;
struct task_struct *allowed_task;
@@ -518,6 +512,11 @@ struct intel_display {
u32 pipestat_irq_mask[I915_MAX_PIPES];
} irq;
+ struct {
+ /* Top level crtc-ish functions */
+ const struct intel_modeset_funcs *funcs;
+ } modeset;
+
struct {
/* protected by wm.wm_mutex */
u16 linetime[I915_MAX_PIPES];
diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c b/drivers/gpu/drm/i915/display/intel_initial_plane.c
index 0e5cd45f01cc..034fe199c2a1 100644
--- a/drivers/gpu/drm/i915/display/intel_initial_plane.c
+++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c
@@ -224,7 +224,7 @@ void intel_initial_plane_config(struct intel_display *display)
* can even allow for smooth boot transitions if the BIOS
* fb is large enough for the active pipe configuration.
*/
- display->funcs.display->get_initial_plane_config(crtc, plane_config);
+ display->modeset.funcs->get_initial_plane_config(crtc, plane_config);
/*
* If the fb is shared between multiple heads, we'll
@@ -232,7 +232,7 @@ void intel_initial_plane_config(struct intel_display *display)
*/
intel_find_initial_plane_obj(crtc, &all_plane_configs);
- if (display->funcs.display->fixup_initial_plane_config(crtc, plane_config))
+ if (display->modeset.funcs->fixup_initial_plane_config(crtc, plane_config))
intel_initial_plane_vblank_wait(crtc);
plane_config_fini(display, plane_config);
diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
index 40a65a0d7ec7..4c646b1bd0ee 100644
--- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
+++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
@@ -83,7 +83,7 @@ static void intel_crtc_disable_noatomic_begin(struct intel_crtc *crtc,
drm_WARN_ON(display->drm, IS_ERR(temp_crtc_state) || ret);
}
- display->funcs.display->crtc_disable(to_intel_atomic_state(state), crtc);
+ display->modeset.funcs->crtc_disable(to_intel_atomic_state(state), crtc);
drm_atomic_state_put(state);
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 09/15] drm/i915/irq: deduplicate dg1_de_irq_postinstall() and gen11_de_irq_postinstall()
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (7 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 08/15] drm/i915/display: move display funcs under modeset sub-struct Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 10/15] drm/i915/irq: move VLV/CHV LPE irq handler call after irq acks Jani Nikula
` (6 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
dg1_de_irq_postinstall() and gen11_de_irq_postinstall() are exactly the
same. Remove dg1_de_irq_postinstall() and call
gen11_de_irq_postinstall() instead.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_irq.c | 9 ---------
drivers/gpu/drm/i915/display/intel_display_irq.h | 1 -
drivers/gpu/drm/i915/i915_irq.c | 2 +-
3 files changed, 1 insertion(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
index b5bfdebc66ca..bf4b5e7b6011 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -2449,15 +2449,6 @@ void gen11_de_irq_postinstall(struct intel_display *display)
intel_de_write(display, GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
}
-void dg1_de_irq_postinstall(struct intel_display *display)
-{
- if (!HAS_DISPLAY(display))
- return;
-
- gen8_de_irq_postinstall(display);
- intel_de_write(display, GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
-}
-
struct intel_display_irq_funcs {
void (*reset)(struct intel_display *display);
};
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.h b/drivers/gpu/drm/i915/display/intel_display_irq.h
index b25d180254d7..e2b1674fae06 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.h
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
@@ -71,7 +71,6 @@ void vlv_display_irq_postinstall(struct intel_display *display);
void ilk_de_irq_postinstall(struct intel_display *display);
void gen8_de_irq_postinstall(struct intel_display *display);
void gen11_de_irq_postinstall(struct intel_display *display);
-void dg1_de_irq_postinstall(struct intel_display *display);
u32 i915_pipestat_enable_mask(struct intel_display *display, enum pipe pipe);
void i915_enable_pipestat(struct intel_display *display, enum pipe pipe, u32 status_mask);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index d4d8dd0a4174..ef9eadf38a53 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -778,7 +778,7 @@ static void dg1_irq_postinstall(struct drm_i915_private *dev_priv)
gen2_irq_init(uncore, GEN11_GU_MISC_IRQ_REGS, ~gu_misc_masked, gu_misc_masked);
- dg1_de_irq_postinstall(display);
+ gen11_de_irq_postinstall(display);
dg1_master_intr_enable(intel_uncore_regs(uncore));
intel_uncore_posting_read(uncore, DG1_MSTR_TILE_INTR);
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 10/15] drm/i915/irq: move VLV/CHV LPE irq handler call after irq acks
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (8 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 09/15] drm/i915/irq: deduplicate dg1_de_irq_postinstall() and gen11_de_irq_postinstall() Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 11:12 ` Ville Syrjälä
2026-04-29 10:24 ` [PATCH 11/15] drm/i915/irq: constify pipe stats parameters Jani Nikula
` (5 subsequent siblings)
15 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
The location of the intel_lpe_audio_irq_handler() call seems too
early. Group the handler calls together slightly later.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/i915_irq.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index ef9eadf38a53..1c87f56d668d 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -282,10 +282,6 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
* signalled in IIR */
i9xx_pipestat_irq_ack(display, iir, pipe_stats);
- if (iir & (I915_LPE_PIPE_A_INTERRUPT |
- I915_LPE_PIPE_B_INTERRUPT))
- intel_lpe_audio_irq_handler(display);
-
/*
* VLV_IIR is single buffered, and reflects the level
* from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
@@ -301,6 +297,10 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
if (pm_iir)
gen6_rps_irq_handler(&to_gt(dev_priv)->rps, pm_iir);
+ if (iir & (I915_LPE_PIPE_A_INTERRUPT |
+ I915_LPE_PIPE_B_INTERRUPT))
+ intel_lpe_audio_irq_handler(display);
+
if (hotplug_status)
i9xx_hpd_irq_handler(display, hotplug_status);
@@ -372,11 +372,6 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
* signalled in IIR */
i9xx_pipestat_irq_ack(display, iir, pipe_stats);
- if (iir & (I915_LPE_PIPE_A_INTERRUPT |
- I915_LPE_PIPE_B_INTERRUPT |
- I915_LPE_PIPE_C_INTERRUPT))
- intel_lpe_audio_irq_handler(display);
-
/*
* VLV_IIR is single buffered, and reflects the level
* from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
@@ -387,6 +382,11 @@ 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);
+ if (iir & (I915_LPE_PIPE_A_INTERRUPT |
+ I915_LPE_PIPE_B_INTERRUPT |
+ I915_LPE_PIPE_C_INTERRUPT))
+ intel_lpe_audio_irq_handler(display);
+
if (hotplug_status)
i9xx_hpd_irq_handler(display, hotplug_status);
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 11/15] drm/i915/irq: constify pipe stats parameters
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (9 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 10/15] drm/i915/irq: move VLV/CHV LPE irq handler call after irq acks Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 12/15] drm/i915/irq: add display irq funcs, start with intel_display_irq_reset() Jani Nikula
` (4 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
The pipe stat irq handling doesn't need to modify the pipe stats
arrays. Make them const.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/display/intel_display_irq.c | 6 +++---
drivers/gpu/drm/i915/display/intel_display_irq.h | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
index bf4b5e7b6011..d30b063714b0 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -597,7 +597,7 @@ void i9xx_pipestat_irq_ack(struct intel_display *display,
}
void i915_pipestat_irq_handler(struct intel_display *display,
- u32 iir, u32 pipe_stats[I915_MAX_PIPES])
+ u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
{
bool blc_event = false;
enum pipe pipe;
@@ -621,7 +621,7 @@ void i915_pipestat_irq_handler(struct intel_display *display,
}
void i965_pipestat_irq_handler(struct intel_display *display,
- u32 iir, u32 pipe_stats[I915_MAX_PIPES])
+ u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
{
bool blc_event = false;
enum pipe pipe;
@@ -648,7 +648,7 @@ void i965_pipestat_irq_handler(struct intel_display *display,
}
void valleyview_pipestat_irq_handler(struct intel_display *display,
- u32 pipe_stats[I915_MAX_PIPES])
+ const u32 pipe_stats[I915_MAX_PIPES])
{
enum pipe pipe;
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.h b/drivers/gpu/drm/i915/display/intel_display_irq.h
index e2b1674fae06..d25b9ea4272b 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.h
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
@@ -78,9 +78,9 @@ void i915_disable_pipestat(struct intel_display *display, enum pipe pipe, u32 st
void i9xx_pipestat_irq_ack(struct intel_display *display, u32 iir, u32 pipe_stats[I915_MAX_PIPES]);
-void i915_pipestat_irq_handler(struct intel_display *display, u32 iir, u32 pipe_stats[I915_MAX_PIPES]);
-void i965_pipestat_irq_handler(struct intel_display *display, u32 iir, u32 pipe_stats[I915_MAX_PIPES]);
-void valleyview_pipestat_irq_handler(struct intel_display *display, u32 pipe_stats[I915_MAX_PIPES]);
+void i915_pipestat_irq_handler(struct intel_display *display, u32 iir, const u32 pipe_stats[I915_MAX_PIPES]);
+void i965_pipestat_irq_handler(struct intel_display *display, u32 iir, const u32 pipe_stats[I915_MAX_PIPES]);
+void valleyview_pipestat_irq_handler(struct intel_display *display, const u32 pipe_stats[I915_MAX_PIPES]);
void vlv_display_error_irq_ack(struct intel_display *display, u32 *eir, u32 *dpinvgtt);
void vlv_display_error_irq_handler(struct intel_display *display, u32 eir, u32 dpinvgtt);
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 12/15] drm/i915/irq: add display irq funcs, start with intel_display_irq_reset()
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (10 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 11/15] drm/i915/irq: constify pipe stats parameters Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 13/15] drm/i915/irq: add intel_display_irq_postinstall() to irq funcs Jani Nikula
` (3 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Introduce display irq hooks with struct intel_display_irq_funcs, and add
the ->reset hook as the first thing. Call the reset hooks from i915 and
xe core via intel_display_irq_reset().
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
.../gpu/drm/i915/display/intel_display_core.h | 3 ++
.../gpu/drm/i915/display/intel_display_irq.c | 52 +++++++++++++++++--
.../gpu/drm/i915/display/intel_display_irq.h | 6 +--
drivers/gpu/drm/i915/i915_irq.c | 16 +++---
drivers/gpu/drm/xe/display/xe_display.c | 2 +-
5 files changed, 60 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 796517e7bc6c..7bc2ff11b658 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -475,6 +475,9 @@ struct intel_display {
} ips;
struct {
+ /* internal display irq functions */
+ const struct intel_display_irq_funcs *funcs;
+
/* protects the irq masks */
spinlock_t lock;
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
index d30b063714b0..7505652257d8 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -1947,7 +1947,7 @@ static void _vlv_display_irq_reset(struct intel_display *display)
display->irq.vlv_imr_mask = ~0u;
}
-void vlv_display_irq_reset(struct intel_display *display)
+static void vlv_display_irq_reset(struct intel_display *display)
{
spin_lock_irq(&display->irq.lock);
if (display->irq.vlv_display_irqs_enabled)
@@ -1955,7 +1955,7 @@ void vlv_display_irq_reset(struct intel_display *display)
spin_unlock_irq(&display->irq.lock);
}
-void i9xx_display_irq_reset(struct intel_display *display)
+static void i9xx_display_irq_reset(struct intel_display *display)
{
if (HAS_HOTPLUG(display)) {
i915_hotplug_interrupt_update(display, 0xffffffff, 0);
@@ -2076,7 +2076,7 @@ static void ibx_display_irq_reset(struct intel_display *display)
intel_de_write(display, SERR_INT, 0xffffffff);
}
-void ilk_display_irq_reset(struct intel_display *display)
+static void ilk_display_irq_reset(struct intel_display *display)
{
irq_reset(display, DE_IRQ_REGS);
display->irq.ilk_de_imr_mask = ~0u;
@@ -2092,7 +2092,7 @@ void ilk_display_irq_reset(struct intel_display *display)
ibx_display_irq_reset(display);
}
-void gen8_display_irq_reset(struct intel_display *display)
+static void gen8_display_irq_reset(struct intel_display *display)
{
enum pipe pipe;
@@ -2114,7 +2114,7 @@ void gen8_display_irq_reset(struct intel_display *display)
ibx_display_irq_reset(display);
}
-void gen11_display_irq_reset(struct intel_display *display)
+static void gen11_display_irq_reset(struct intel_display *display)
{
enum pipe pipe;
u32 trans_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
@@ -2453,6 +2453,35 @@ struct intel_display_irq_funcs {
void (*reset)(struct intel_display *display);
};
+struct intel_display_irq_funcs gen11_display_irq_funcs = {
+ .reset = gen11_display_irq_reset,
+};
+
+struct intel_display_irq_funcs gen8_display_irq_funcs = {
+ .reset = gen8_display_irq_reset,
+};
+
+struct intel_display_irq_funcs vlv_display_irq_funcs = {
+ .reset = vlv_display_irq_reset,
+};
+
+struct intel_display_irq_funcs ilk_display_irq_funcs = {
+ .reset = ilk_display_irq_reset,
+};
+
+struct intel_display_irq_funcs i965_display_irq_funcs = {
+ .reset = i9xx_display_irq_reset,
+};
+
+struct intel_display_irq_funcs i915_display_irq_funcs = {
+ .reset = i9xx_display_irq_reset,
+};
+
+void intel_display_irq_reset(struct intel_display *display)
+{
+ display->irq.funcs->reset(display);
+}
+
void intel_display_irq_init(struct intel_display *display)
{
spin_lock_init(&display->irq.lock);
@@ -2463,6 +2492,19 @@ void intel_display_irq_init(struct intel_display *display)
INIT_WORK(&display->irq.vblank_notify_work,
intel_display_vblank_notify_work);
+
+ if (DISPLAY_VER(display) >= 11)
+ display->irq.funcs = &gen11_display_irq_funcs;
+ else if (display->platform.cherryview || display->platform.valleyview)
+ display->irq.funcs = &vlv_display_irq_funcs;
+ else if (DISPLAY_VER(display) >= 8)
+ display->irq.funcs = &gen8_display_irq_funcs;
+ else if (DISPLAY_VER(display) >= 5)
+ display->irq.funcs = &ilk_display_irq_funcs;
+ else if (DISPLAY_VER(display) == 4)
+ display->irq.funcs = &i965_display_irq_funcs;
+ else
+ display->irq.funcs = &i915_display_irq_funcs;
}
struct intel_display_irq_snapshot {
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.h b/drivers/gpu/drm/i915/display/intel_display_irq.h
index d25b9ea4272b..21b2145656cd 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.h
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
@@ -58,11 +58,7 @@ void gen11_display_irq_handler(struct intel_display *display);
u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl);
void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir);
-void i9xx_display_irq_reset(struct intel_display *display);
-void ilk_display_irq_reset(struct intel_display *display);
-void vlv_display_irq_reset(struct intel_display *display);
-void gen8_display_irq_reset(struct intel_display *display);
-void gen11_display_irq_reset(struct intel_display *display);
+void intel_display_irq_reset(struct intel_display *display);
u32 i9xx_display_irq_enable_mask(struct intel_display *display);
void i915_display_irq_postinstall(struct intel_display *display);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 1c87f56d668d..7e0ec9294d70 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -640,7 +640,7 @@ static void ilk_irq_reset(struct drm_i915_private *dev_priv)
struct intel_display *display = dev_priv->display;
/* The master interrupt enable is in DEIER, reset display irq first */
- ilk_display_irq_reset(display);
+ intel_display_irq_reset(display);
gen5_gt_irq_reset(to_gt(dev_priv));
}
@@ -653,7 +653,7 @@ static void valleyview_irq_reset(struct drm_i915_private *dev_priv)
gen5_gt_irq_reset(to_gt(dev_priv));
- vlv_display_irq_reset(display);
+ intel_display_irq_reset(display);
}
static void gen8_irq_reset(struct drm_i915_private *dev_priv)
@@ -664,7 +664,7 @@ static void gen8_irq_reset(struct drm_i915_private *dev_priv)
gen8_master_intr_disable(intel_uncore_regs(uncore));
gen8_gt_irq_reset(to_gt(dev_priv));
- gen8_display_irq_reset(display);
+ intel_display_irq_reset(display);
gen2_irq_reset(uncore, GEN8_PCU_IRQ_REGS);
}
@@ -677,7 +677,7 @@ static void gen11_irq_reset(struct drm_i915_private *dev_priv)
gen11_master_intr_disable(intel_uncore_regs(&dev_priv->uncore));
gen11_gt_irq_reset(gt);
- gen11_display_irq_reset(display);
+ intel_display_irq_reset(display);
gen2_irq_reset(uncore, GEN11_GU_MISC_IRQ_REGS);
gen2_irq_reset(uncore, GEN8_PCU_IRQ_REGS);
@@ -695,7 +695,7 @@ static void dg1_irq_reset(struct drm_i915_private *dev_priv)
for_each_gt(gt, dev_priv, i)
gen11_gt_irq_reset(gt);
- gen11_display_irq_reset(display);
+ intel_display_irq_reset(display);
gen2_irq_reset(uncore, GEN11_GU_MISC_IRQ_REGS);
gen2_irq_reset(uncore, GEN8_PCU_IRQ_REGS);
@@ -715,7 +715,7 @@ static void cherryview_irq_reset(struct drm_i915_private *dev_priv)
gen2_irq_reset(uncore, GEN8_PCU_IRQ_REGS);
- vlv_display_irq_reset(display);
+ intel_display_irq_reset(display);
}
static void ilk_irq_postinstall(struct drm_i915_private *dev_priv)
@@ -864,7 +864,7 @@ static void i915_irq_reset(struct drm_i915_private *dev_priv)
struct intel_display *display = dev_priv->display;
struct intel_uncore *uncore = &dev_priv->uncore;
- i9xx_display_irq_reset(display);
+ intel_display_irq_reset(display);
gen2_error_reset(uncore, GEN2_ERROR_REGS);
gen2_irq_reset(uncore, GEN2_IRQ_REGS);
@@ -951,7 +951,7 @@ static void i965_irq_reset(struct drm_i915_private *dev_priv)
struct intel_display *display = dev_priv->display;
struct intel_uncore *uncore = &dev_priv->uncore;
- i9xx_display_irq_reset(display);
+ intel_display_irq_reset(display);
gen2_error_reset(uncore, GEN2_ERROR_REGS);
gen2_irq_reset(uncore, GEN2_IRQ_REGS);
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 0747044f7c2a..d6a4546fbe94 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -235,7 +235,7 @@ void xe_display_irq_reset(struct xe_device *xe)
if (!xe->info.probe_display)
return;
- gen11_display_irq_reset(display);
+ intel_display_irq_reset(display);
}
void xe_display_irq_postinstall(struct xe_device *xe)
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 13/15] drm/i915/irq: add intel_display_irq_postinstall() to irq funcs
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (11 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 12/15] drm/i915/irq: add display irq funcs, start with intel_display_irq_reset() Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 14/15] drm/i915/irq: add intel_display_irq_ack() " Jani Nikula
` (2 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Call the platform specific display irq postinstall hooks via
intel_display_irq_postinstall().
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
.../gpu/drm/i915/display/intel_display_irq.c | 24 ++++++++++++++-----
.../gpu/drm/i915/display/intel_display_irq.h | 7 +-----
drivers/gpu/drm/i915/i915_irq.c | 16 ++++++-------
drivers/gpu/drm/xe/display/xe_display.c | 2 +-
4 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
index 7505652257d8..6ba094a0df66 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -1981,7 +1981,7 @@ u32 i9xx_display_irq_enable_mask(struct intel_display *display)
return enable_mask;
}
-void i915_display_irq_postinstall(struct intel_display *display)
+static void i915_display_irq_postinstall(struct intel_display *display)
{
/*
* Interrupt setup is already guaranteed to be single-threaded, this is
@@ -1995,7 +1995,7 @@ void i915_display_irq_postinstall(struct intel_display *display)
i915_enable_asle_pipestat(display);
}
-void i965_display_irq_postinstall(struct intel_display *display)
+static void i965_display_irq_postinstall(struct intel_display *display)
{
/*
* Interrupt setup is already guaranteed to be single-threaded, this is
@@ -2057,7 +2057,7 @@ static void _vlv_display_irq_postinstall(struct intel_display *display)
irq_init(display, VLV_IRQ_REGS, display->irq.vlv_imr_mask, enable_mask);
}
-void vlv_display_irq_postinstall(struct intel_display *display)
+static void vlv_display_irq_postinstall(struct intel_display *display)
{
spin_lock_irq(&display->irq.lock);
if (display->irq.vlv_display_irqs_enabled)
@@ -2268,7 +2268,7 @@ void valleyview_disable_display_irqs(struct intel_display *display)
spin_unlock_irq(&display->irq.lock);
}
-void ilk_de_irq_postinstall(struct intel_display *display)
+static void ilk_de_irq_postinstall(struct intel_display *display)
{
u32 display_mask, extra_mask;
@@ -2312,7 +2312,7 @@ void ilk_de_irq_postinstall(struct intel_display *display)
static void mtp_irq_postinstall(struct intel_display *display);
static void icp_irq_postinstall(struct intel_display *display);
-void gen8_de_irq_postinstall(struct intel_display *display)
+static void gen8_de_irq_postinstall(struct intel_display *display)
{
u32 de_pipe_masked = gen8_de_pipe_fault_mask(display) |
GEN8_PIPE_CDCLK_CRC_DONE;
@@ -2439,7 +2439,7 @@ static void icp_irq_postinstall(struct intel_display *display)
irq_init(display, SDE_IRQ_REGS, ~mask, 0xffffffff);
}
-void gen11_de_irq_postinstall(struct intel_display *display)
+static void gen11_de_irq_postinstall(struct intel_display *display)
{
if (!HAS_DISPLAY(display))
return;
@@ -2451,30 +2451,37 @@ 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);
};
struct intel_display_irq_funcs gen11_display_irq_funcs = {
.reset = gen11_display_irq_reset,
+ .postinstall = gen11_de_irq_postinstall,
};
struct intel_display_irq_funcs gen8_display_irq_funcs = {
.reset = gen8_display_irq_reset,
+ .postinstall = gen8_de_irq_postinstall,
};
struct intel_display_irq_funcs vlv_display_irq_funcs = {
.reset = vlv_display_irq_reset,
+ .postinstall = vlv_display_irq_postinstall,
};
struct intel_display_irq_funcs ilk_display_irq_funcs = {
.reset = ilk_display_irq_reset,
+ .postinstall = ilk_de_irq_postinstall,
};
struct intel_display_irq_funcs i965_display_irq_funcs = {
.reset = i9xx_display_irq_reset,
+ .postinstall = i965_display_irq_postinstall,
};
struct intel_display_irq_funcs i915_display_irq_funcs = {
.reset = i9xx_display_irq_reset,
+ .postinstall = i915_display_irq_postinstall,
};
void intel_display_irq_reset(struct intel_display *display)
@@ -2482,6 +2489,11 @@ void intel_display_irq_reset(struct intel_display *display)
display->irq.funcs->reset(display);
}
+void intel_display_irq_postinstall(struct intel_display *display)
+{
+ display->irq.funcs->postinstall(display);
+}
+
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 21b2145656cd..fd9873ce9755 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.h
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
@@ -59,14 +59,9 @@ u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl);
void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir);
void intel_display_irq_reset(struct intel_display *display);
+void intel_display_irq_postinstall(struct intel_display *display);
u32 i9xx_display_irq_enable_mask(struct intel_display *display);
-void i915_display_irq_postinstall(struct intel_display *display);
-void i965_display_irq_postinstall(struct intel_display *display);
-void vlv_display_irq_postinstall(struct intel_display *display);
-void ilk_de_irq_postinstall(struct intel_display *display);
-void gen8_de_irq_postinstall(struct intel_display *display);
-void gen11_de_irq_postinstall(struct intel_display *display);
u32 i915_pipestat_enable_mask(struct intel_display *display, enum pipe pipe);
void i915_enable_pipestat(struct intel_display *display, enum pipe pipe, u32 status_mask);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 7e0ec9294d70..7ffa0e8c5608 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -724,7 +724,7 @@ static void ilk_irq_postinstall(struct drm_i915_private *dev_priv)
gen5_gt_irq_postinstall(to_gt(dev_priv));
- ilk_de_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
}
static void valleyview_irq_postinstall(struct drm_i915_private *dev_priv)
@@ -733,7 +733,7 @@ static void valleyview_irq_postinstall(struct drm_i915_private *dev_priv)
gen5_gt_irq_postinstall(to_gt(dev_priv));
- vlv_display_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
intel_uncore_write(&dev_priv->uncore, VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
intel_uncore_posting_read(&dev_priv->uncore, VLV_MASTER_IER);
@@ -744,7 +744,7 @@ static void gen8_irq_postinstall(struct drm_i915_private *dev_priv)
struct intel_display *display = dev_priv->display;
gen8_gt_irq_postinstall(to_gt(dev_priv));
- gen8_de_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
gen8_master_intr_enable(intel_uncore_regs(&dev_priv->uncore));
}
@@ -757,7 +757,7 @@ static void gen11_irq_postinstall(struct drm_i915_private *dev_priv)
u32 gu_misc_masked = GEN11_GU_MISC_GSE;
gen11_gt_irq_postinstall(gt);
- gen11_de_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
gen2_irq_init(uncore, GEN11_GU_MISC_IRQ_REGS, ~gu_misc_masked, gu_misc_masked);
@@ -778,7 +778,7 @@ static void dg1_irq_postinstall(struct drm_i915_private *dev_priv)
gen2_irq_init(uncore, GEN11_GU_MISC_IRQ_REGS, ~gu_misc_masked, gu_misc_masked);
- gen11_de_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
dg1_master_intr_enable(intel_uncore_regs(uncore));
intel_uncore_posting_read(uncore, DG1_MSTR_TILE_INTR);
@@ -790,7 +790,7 @@ static void cherryview_irq_postinstall(struct drm_i915_private *dev_priv)
gen8_gt_irq_postinstall(to_gt(dev_priv));
- vlv_display_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
intel_uncore_write(&dev_priv->uncore, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
intel_uncore_posting_read(&dev_priv->uncore, GEN8_MASTER_IRQ);
@@ -888,7 +888,7 @@ static void i915_irq_postinstall(struct drm_i915_private *dev_priv)
gen2_irq_init(uncore, GEN2_IRQ_REGS, dev_priv->gen2_imr_mask, enable_mask);
- i915_display_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
}
static irqreturn_t i915_irq_handler(int irq, void *arg)
@@ -997,7 +997,7 @@ static void i965_irq_postinstall(struct drm_i915_private *dev_priv)
gen2_irq_init(uncore, GEN2_IRQ_REGS, dev_priv->gen2_imr_mask, enable_mask);
- i965_display_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
}
static irqreturn_t i965_irq_handler(int irq, void *arg)
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index d6a4546fbe94..736a5e6938d6 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -245,7 +245,7 @@ void xe_display_irq_postinstall(struct xe_device *xe)
if (!xe->info.probe_display)
return;
- gen11_de_irq_postinstall(display);
+ intel_display_irq_postinstall(display);
}
static bool suspend_to_idle(void)
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 14/15] drm/i915/irq: add intel_display_irq_ack() to irq funcs
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (12 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 13/15] drm/i915/irq: add intel_display_irq_postinstall() to irq funcs Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 15/15] drm/i915/irq: add intel_display_irq_handler() " Jani Nikula
2026-04-29 11:37 ` ✗ i915.CI.BAT: failure for drm/i915: refactor display funcs, add display irq hooks Patchwork
15 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Some platforms have a separate step for acking display irqs. Call the
platform specific display irq ack hooks, if any, via
intel_display_irq_ack().
Introduce struct intel_display_irq_state to group together all the data
the ack hooks need. In the follow-up, this state will be passed on to a
shared handler function.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
.../gpu/drm/i915/display/intel_display_irq.c | 42 ++++-
.../gpu/drm/i915/display/intel_display_irq.h | 12 +-
drivers/gpu/drm/i915/i915_irq.c | 144 +++++++-----------
3 files changed, 102 insertions(+), 96 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
index 6ba094a0df66..662081e274bf 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -529,8 +529,8 @@ static void i9xx_pipestat_irq_reset(struct intel_display *display)
}
}
-void i9xx_pipestat_irq_ack(struct intel_display *display,
- u32 iir, u32 pipe_stats[I915_MAX_PIPES])
+static void i9xx_pipestat_irq_ack(struct intel_display *display,
+ u32 iir, u32 pipe_stats[I915_MAX_PIPES])
{
enum pipe pipe;
@@ -1898,8 +1898,8 @@ static void vlv_page_table_error_irq_handler(struct intel_display *display, u32
}
}
-void vlv_display_error_irq_ack(struct intel_display *display,
- u32 *eir, u32 *dpinvgtt)
+static void vlv_display_error_irq_ack(struct intel_display *display,
+ u32 *eir, u32 *dpinvgtt)
{
u32 emr;
@@ -2010,6 +2010,16 @@ static void i965_display_irq_postinstall(struct intel_display *display)
i915_enable_asle_pipestat(display);
}
+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);
+
+ /* Call regardless, as some status bits might not be signalled in IIR */
+ i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats);
+}
+
static u32 vlv_error_mask(void)
{
/* TODO enable other errors too? */
@@ -2065,6 +2075,19 @@ static void vlv_display_irq_postinstall(struct intel_display *display)
spin_unlock_irq(&display->irq.lock);
}
+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);
+
+ if (state->iir & I915_MASTER_ERROR_INTERRUPT)
+ vlv_display_error_irq_ack(display, &state->eir, &state->dpinvgtt);
+
+ /* Call regardless, as some status bits might not be signalled in IIR */
+ i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats);
+}
+
static void ibx_display_irq_reset(struct intel_display *display)
{
if (HAS_PCH_NOP(display))
@@ -2452,6 +2475,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);
};
struct intel_display_irq_funcs gen11_display_irq_funcs = {
@@ -2467,6 +2491,7 @@ struct intel_display_irq_funcs gen8_display_irq_funcs = {
struct intel_display_irq_funcs vlv_display_irq_funcs = {
.reset = vlv_display_irq_reset,
.postinstall = vlv_display_irq_postinstall,
+ .ack = vlv_display_irq_ack,
};
struct intel_display_irq_funcs ilk_display_irq_funcs = {
@@ -2477,11 +2502,13 @@ struct intel_display_irq_funcs ilk_display_irq_funcs = {
struct intel_display_irq_funcs i965_display_irq_funcs = {
.reset = i9xx_display_irq_reset,
.postinstall = i965_display_irq_postinstall,
+ .ack = i9xx_display_irq_ack,
};
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)
@@ -2494,6 +2521,13 @@ 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 (display->irq.funcs->ack)
+ 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 fd9873ce9755..3773a31e48f2 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.h
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
@@ -58,8 +58,17 @@ void gen11_display_irq_handler(struct intel_display *display);
u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl);
void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir);
+struct intel_display_irq_state {
+ u32 iir;
+ u32 eir;
+ u32 hotplug_status;
+ u32 dpinvgtt;
+ u32 pipe_stats[I915_MAX_PIPES];
+};
+
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);
u32 i9xx_display_irq_enable_mask(struct intel_display *display);
@@ -67,13 +76,10 @@ u32 i915_pipestat_enable_mask(struct intel_display *display, enum pipe pipe);
void i915_enable_pipestat(struct intel_display *display, enum pipe pipe, u32 status_mask);
void i915_disable_pipestat(struct intel_display *display, enum pipe pipe, u32 status_mask);
-void i9xx_pipestat_irq_ack(struct intel_display *display, u32 iir, u32 pipe_stats[I915_MAX_PIPES]);
-
void i915_pipestat_irq_handler(struct intel_display *display, u32 iir, const u32 pipe_stats[I915_MAX_PIPES]);
void i965_pipestat_irq_handler(struct intel_display *display, u32 iir, const u32 pipe_stats[I915_MAX_PIPES]);
void valleyview_pipestat_irq_handler(struct intel_display *display, const u32 pipe_stats[I915_MAX_PIPES]);
-void vlv_display_error_irq_ack(struct intel_display *display, u32 *eir, u32 *dpinvgtt);
void vlv_display_error_irq_handler(struct intel_display *display, u32 eir, u32 dpinvgtt);
void intel_display_irq_init(struct intel_display *display);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 7ffa0e8c5608..bb65ce9d09b2 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -236,17 +236,15 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
do {
- u32 iir, gt_iir, pm_iir;
- u32 eir = 0, dpinvgtt = 0;
- u32 pipe_stats[I915_MAX_PIPES] = {};
- u32 hotplug_status = 0;
+ struct intel_display_irq_state state = {};
+ u32 gt_iir, pm_iir;
u32 ier = 0;
gt_iir = intel_uncore_read(&dev_priv->uncore, GTIIR);
pm_iir = intel_uncore_read(&dev_priv->uncore, GEN6_PMIIR);
- iir = intel_uncore_read(&dev_priv->uncore, VLV_IIR);
+ state.iir = intel_uncore_read(&dev_priv->uncore, VLV_IIR);
- if (gt_iir == 0 && pm_iir == 0 && iir == 0)
+ if (gt_iir == 0 && pm_iir == 0 && state.iir == 0)
break;
ret = IRQ_HANDLED;
@@ -272,22 +270,14 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
if (pm_iir)
intel_uncore_write(&dev_priv->uncore, GEN6_PMIIR, pm_iir);
- if (iir & I915_DISPLAY_PORT_INTERRUPT)
- hotplug_status = i9xx_hpd_irq_ack(display);
-
- if (iir & I915_MASTER_ERROR_INTERRUPT)
- vlv_display_error_irq_ack(display, &eir, &dpinvgtt);
-
- /* Call regardless, as some status bits might not be
- * signalled in IIR */
- i9xx_pipestat_irq_ack(display, iir, pipe_stats);
+ intel_display_irq_ack(display, &state);
/*
* VLV_IIR is single buffered, and reflects the level
* from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
*/
- if (iir)
- intel_uncore_write(&dev_priv->uncore, VLV_IIR, iir);
+ if (state.iir)
+ intel_uncore_write(&dev_priv->uncore, VLV_IIR, state.iir);
intel_uncore_write(&dev_priv->uncore, VLV_IER, ier);
intel_uncore_write(&dev_priv->uncore, VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
@@ -297,17 +287,17 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
if (pm_iir)
gen6_rps_irq_handler(&to_gt(dev_priv)->rps, pm_iir);
- if (iir & (I915_LPE_PIPE_A_INTERRUPT |
- I915_LPE_PIPE_B_INTERRUPT))
+ if (state.iir & (I915_LPE_PIPE_A_INTERRUPT |
+ I915_LPE_PIPE_B_INTERRUPT))
intel_lpe_audio_irq_handler(display);
- if (hotplug_status)
- i9xx_hpd_irq_handler(display, hotplug_status);
+ if (state.hotplug_status)
+ i9xx_hpd_irq_handler(display, state.hotplug_status);
- if (iir & I915_MASTER_ERROR_INTERRUPT)
- vlv_display_error_irq_handler(display, eir, dpinvgtt);
+ if (state.iir & I915_MASTER_ERROR_INTERRUPT)
+ vlv_display_error_irq_handler(display, state.eir, state.dpinvgtt);
- valleyview_pipestat_irq_handler(display, pipe_stats);
+ valleyview_pipestat_irq_handler(display, state.pipe_stats);
} while (0);
pmu_irq_stats(dev_priv, ret);
@@ -330,16 +320,14 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
do {
- u32 master_ctl, iir;
- u32 eir = 0, dpinvgtt = 0;
- u32 pipe_stats[I915_MAX_PIPES] = {};
- u32 hotplug_status = 0;
+ struct intel_display_irq_state state = {};
+ u32 master_ctl;
u32 ier = 0;
master_ctl = intel_uncore_read(&dev_priv->uncore, GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
- iir = intel_uncore_read(&dev_priv->uncore, VLV_IIR);
+ state.iir = intel_uncore_read(&dev_priv->uncore, VLV_IIR);
- if (master_ctl == 0 && iir == 0)
+ if (master_ctl == 0 && state.iir == 0)
break;
ret = IRQ_HANDLED;
@@ -362,38 +350,30 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
gen8_gt_irq_handler(to_gt(dev_priv), master_ctl);
- if (iir & I915_DISPLAY_PORT_INTERRUPT)
- hotplug_status = i9xx_hpd_irq_ack(display);
-
- if (iir & I915_MASTER_ERROR_INTERRUPT)
- vlv_display_error_irq_ack(display, &eir, &dpinvgtt);
-
- /* Call regardless, as some status bits might not be
- * signalled in IIR */
- i9xx_pipestat_irq_ack(display, iir, pipe_stats);
+ intel_display_irq_ack(display, &state);
/*
* VLV_IIR is single buffered, and reflects the level
* from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
*/
- if (iir)
- intel_uncore_write(&dev_priv->uncore, VLV_IIR, iir);
+ if (state.iir)
+ intel_uncore_write(&dev_priv->uncore, VLV_IIR, state.iir);
intel_uncore_write(&dev_priv->uncore, VLV_IER, ier);
intel_uncore_write(&dev_priv->uncore, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
- if (iir & (I915_LPE_PIPE_A_INTERRUPT |
- I915_LPE_PIPE_B_INTERRUPT |
- I915_LPE_PIPE_C_INTERRUPT))
+ if (state.iir & (I915_LPE_PIPE_A_INTERRUPT |
+ I915_LPE_PIPE_B_INTERRUPT |
+ I915_LPE_PIPE_C_INTERRUPT))
intel_lpe_audio_irq_handler(display);
- if (hotplug_status)
- i9xx_hpd_irq_handler(display, hotplug_status);
+ if (state.hotplug_status)
+ i9xx_hpd_irq_handler(display, state.hotplug_status);
- if (iir & I915_MASTER_ERROR_INTERRUPT)
- vlv_display_error_irq_handler(display, eir, dpinvgtt);
+ if (state.iir & I915_MASTER_ERROR_INTERRUPT)
+ vlv_display_error_irq_handler(display, state.eir, state.dpinvgtt);
- valleyview_pipestat_irq_handler(display, pipe_stats);
+ valleyview_pipestat_irq_handler(display, state.pipe_stats);
} while (0);
pmu_irq_stats(dev_priv, ret);
@@ -904,39 +884,32 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
do {
- u32 pipe_stats[I915_MAX_PIPES] = {};
+ struct intel_display_irq_state state = {};
u32 eir = 0, eir_stuck = 0;
- u32 hotplug_status = 0;
- u32 iir;
- iir = intel_uncore_read(&dev_priv->uncore, GEN2_IIR);
- if (iir == 0)
+ state.iir = intel_uncore_read(&dev_priv->uncore, GEN2_IIR);
+ if (state.iir == 0)
break;
ret = IRQ_HANDLED;
- if (iir & I915_DISPLAY_PORT_INTERRUPT)
- hotplug_status = i9xx_hpd_irq_ack(display);
-
- /* Call regardless, as some status bits might not be
- * signalled in IIR */
- i9xx_pipestat_irq_ack(display, iir, pipe_stats);
+ intel_display_irq_ack(display, &state);
- if (iir & I915_MASTER_ERROR_INTERRUPT)
+ if (state.iir & I915_MASTER_ERROR_INTERRUPT)
i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
- intel_uncore_write(&dev_priv->uncore, GEN2_IIR, iir);
+ intel_uncore_write(&dev_priv->uncore, GEN2_IIR, state.iir);
- if (iir & I915_USER_INTERRUPT)
- intel_engine_cs_irq(to_gt(dev_priv)->engine[RCS0], iir);
+ if (state.iir & I915_USER_INTERRUPT)
+ intel_engine_cs_irq(to_gt(dev_priv)->engine[RCS0], state.iir);
- if (iir & I915_MASTER_ERROR_INTERRUPT)
+ if (state.iir & I915_MASTER_ERROR_INTERRUPT)
i9xx_error_irq_handler(dev_priv, eir, eir_stuck);
- if (hotplug_status)
- i9xx_hpd_irq_handler(display, hotplug_status);
+ if (state.hotplug_status)
+ i9xx_hpd_irq_handler(display, state.hotplug_status);
- i915_pipestat_irq_handler(display, iir, pipe_stats);
+ i915_pipestat_irq_handler(display, state.iir, state.pipe_stats);
} while (0);
pmu_irq_stats(dev_priv, ret);
@@ -1013,44 +986,37 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
do {
- u32 pipe_stats[I915_MAX_PIPES] = {};
+ struct intel_display_irq_state state = {};
u32 eir = 0, eir_stuck = 0;
- u32 hotplug_status = 0;
- u32 iir;
- iir = intel_uncore_read(&dev_priv->uncore, GEN2_IIR);
- if (iir == 0)
+ state.iir = intel_uncore_read(&dev_priv->uncore, GEN2_IIR);
+ if (state.iir == 0)
break;
ret = IRQ_HANDLED;
- if (iir & I915_DISPLAY_PORT_INTERRUPT)
- hotplug_status = i9xx_hpd_irq_ack(display);
-
- /* Call regardless, as some status bits might not be
- * signalled in IIR */
- i9xx_pipestat_irq_ack(display, iir, pipe_stats);
+ intel_display_irq_ack(display, &state);
- if (iir & I915_MASTER_ERROR_INTERRUPT)
+ if (state.iir & I915_MASTER_ERROR_INTERRUPT)
i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
- intel_uncore_write(&dev_priv->uncore, GEN2_IIR, iir);
+ intel_uncore_write(&dev_priv->uncore, GEN2_IIR, state.iir);
- if (iir & I915_USER_INTERRUPT)
+ if (state.iir & I915_USER_INTERRUPT)
intel_engine_cs_irq(to_gt(dev_priv)->engine[RCS0],
- iir);
+ state.iir);
- if (iir & I915_BSD_USER_INTERRUPT)
+ if (state.iir & I915_BSD_USER_INTERRUPT)
intel_engine_cs_irq(to_gt(dev_priv)->engine[VCS0],
- iir >> 25);
+ state.iir >> 25);
- if (iir & I915_MASTER_ERROR_INTERRUPT)
+ if (state.iir & I915_MASTER_ERROR_INTERRUPT)
i9xx_error_irq_handler(dev_priv, eir, eir_stuck);
- if (hotplug_status)
- i9xx_hpd_irq_handler(display, hotplug_status);
+ if (state.hotplug_status)
+ i9xx_hpd_irq_handler(display, state.hotplug_status);
- i965_pipestat_irq_handler(display, iir, pipe_stats);
+ i965_pipestat_irq_handler(display, state.iir, state.pipe_stats);
} while (0);
pmu_irq_stats(dev_priv, IRQ_HANDLED);
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH 15/15] drm/i915/irq: add intel_display_irq_handler() to irq funcs
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (13 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 14/15] drm/i915/irq: add intel_display_irq_ack() " Jani Nikula
@ 2026-04-29 10:24 ` Jani Nikula
2026-04-29 11:56 ` Ville Syrjälä
2026-04-29 11:37 ` ✗ i915.CI.BAT: failure for drm/i915: refactor display funcs, add display irq hooks Patchwork
15 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2026-04-29 10:24 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: jani.nikula
Call the platform specific display irq handler hooks via
intel_display_irq_handler(). Add master_ctl to struct
intel_display_irq_state, and pass the state pointer to the handler where
necessary.
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
.../gpu/drm/i915/display/intel_display_irq.c | 95 ++++++++++++++++---
.../gpu/drm/i915/display/intel_display_irq.h | 11 +--
drivers/gpu/drm/i915/i915_irq.c | 48 +++-------
drivers/gpu/drm/xe/display/xe_display.c | 2 +-
4 files changed, 98 insertions(+), 58 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
index 662081e274bf..5aec1bedbd61 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -23,6 +23,7 @@
#include "intel_fifo_underrun.h"
#include "intel_gmbus.h"
#include "intel_hotplug_irq.h"
+#include "intel_lpe_audio.h"
#include "intel_parent.h"
#include "intel_pipe_crc_regs.h"
#include "intel_plane.h"
@@ -596,8 +597,8 @@ static void i9xx_pipestat_irq_ack(struct intel_display *display,
spin_unlock(&display->irq.lock);
}
-void i915_pipestat_irq_handler(struct intel_display *display,
- u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
+static void i915_pipestat_irq_handler(struct intel_display *display,
+ u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
{
bool blc_event = false;
enum pipe pipe;
@@ -620,8 +621,8 @@ void i915_pipestat_irq_handler(struct intel_display *display,
intel_opregion_asle_intr(display);
}
-void i965_pipestat_irq_handler(struct intel_display *display,
- u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
+static void i965_pipestat_irq_handler(struct intel_display *display,
+ u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
{
bool blc_event = false;
enum pipe pipe;
@@ -647,8 +648,8 @@ void i965_pipestat_irq_handler(struct intel_display *display,
intel_gmbus_irq_handler(display);
}
-void valleyview_pipestat_irq_handler(struct intel_display *display,
- const u32 pipe_stats[I915_MAX_PIPES])
+static void valleyview_pipestat_irq_handler(struct intel_display *display,
+ const u32 pipe_stats[I915_MAX_PIPES])
{
enum pipe pipe;
@@ -1020,7 +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)
+static bool ilk_display_irq_handler(struct intel_display *display,
+ const struct intel_display_irq_state *state)
{
u32 de_iir;
bool handled = false;
@@ -1404,7 +1406,7 @@ static void gen8_read_and_ack_pch_irqs(struct intel_display *display, u32 *pch_i
intel_de_write(display, PICAINTERRUPT_IER, pica_ier);
}
-void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl)
+static void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl)
{
u32 iir;
enum pipe pipe;
@@ -1565,6 +1567,14 @@ void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl)
}
}
+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);
+
+ return true;
+}
+
u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl)
{
u32 iir;
@@ -1589,7 +1599,8 @@ void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir)
intel_opregion_asle_intr(display);
}
-void gen11_display_irq_handler(struct intel_display *display)
+static bool gen11_display_irq_handler(struct intel_display *display,
+ const struct intel_display_irq_state *state)
{
u32 disp_ctl;
@@ -1605,6 +1616,8 @@ void gen11_display_irq_handler(struct intel_display *display)
intel_de_write(display, GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
intel_display_rpm_assert_unblock(display);
+
+ return true;
}
static void i915gm_irq_cstate_wa_enable(struct intel_display *display)
@@ -1920,8 +1933,8 @@ static void vlv_display_error_irq_ack(struct intel_display *display,
intel_de_write(display, VLV_EMR, emr);
}
-void vlv_display_error_irq_handler(struct intel_display *display,
- u32 eir, u32 dpinvgtt)
+static void vlv_display_error_irq_handler(struct intel_display *display,
+ u32 eir, u32 dpinvgtt)
{
drm_dbg(display->drm, "Master Error, EIR 0x%08x\n", eir);
@@ -2020,6 +2033,28 @@ static void i9xx_display_irq_ack(struct intel_display *display,
i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats);
}
+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);
+
+ i965_pipestat_irq_handler(display, state->iir, state->pipe_stats);
+
+ return true;
+}
+
+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);
+
+ i915_pipestat_irq_handler(display, state->iir, state->pipe_stats);
+
+ return true;
+}
+
static u32 vlv_error_mask(void)
{
/* TODO enable other errors too? */
@@ -2088,6 +2123,28 @@ static void vlv_display_irq_ack(struct intel_display *display,
i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats);
}
+static bool vlv_display_irq_handler(struct intel_display *display,
+ const struct intel_display_irq_state *state)
+{
+ u32 lpe_mask = I915_LPE_PIPE_A_INTERRUPT | I915_LPE_PIPE_B_INTERRUPT;
+
+ if (display->platform.cherryview)
+ lpe_mask |= I915_LPE_PIPE_C_INTERRUPT;
+
+ if (state->iir & lpe_mask)
+ intel_lpe_audio_irq_handler(display);
+
+ if (state->hotplug_status)
+ i9xx_hpd_irq_handler(display, state->hotplug_status);
+
+ if (state->iir & I915_MASTER_ERROR_INTERRUPT)
+ vlv_display_error_irq_handler(display, state->eir, state->dpinvgtt);
+
+ valleyview_pipestat_irq_handler(display, state->pipe_stats);
+
+ return true;
+}
+
static void ibx_display_irq_reset(struct intel_display *display)
{
if (HAS_PCH_NOP(display))
@@ -2476,39 +2533,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);
};
struct intel_display_irq_funcs gen11_display_irq_funcs = {
.reset = gen11_display_irq_reset,
.postinstall = gen11_de_irq_postinstall,
+ .handler = gen11_display_irq_handler,
};
struct intel_display_irq_funcs gen8_display_irq_funcs = {
.reset = gen8_display_irq_reset,
.postinstall = gen8_de_irq_postinstall,
+ .handler = gen8_display_irq_handler,
};
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,
};
struct intel_display_irq_funcs ilk_display_irq_funcs = {
.reset = ilk_display_irq_reset,
.postinstall = ilk_de_irq_postinstall,
+ .handler = ilk_display_irq_handler,
};
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,
};
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)
@@ -2528,6 +2592,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 (!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 3773a31e48f2..a1227cee885a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.h
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
@@ -51,14 +51,12 @@ void bdw_disable_vblank(struct drm_crtc *crtc);
void ilk_display_irq_master_disable(struct intel_display *display, u32 *de_ier, u32 *sde_ier);
void ilk_display_irq_master_enable(struct intel_display *display, u32 de_ier, u32 sde_ier);
-bool ilk_display_irq_handler(struct intel_display *display);
-void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl);
-void gen11_display_irq_handler(struct intel_display *display);
u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl);
void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir);
struct intel_display_irq_state {
+ u32 master_ctl;
u32 iir;
u32 eir;
u32 hotplug_status;
@@ -69,6 +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 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);
@@ -76,12 +75,6 @@ u32 i915_pipestat_enable_mask(struct intel_display *display, enum pipe pipe);
void i915_enable_pipestat(struct intel_display *display, enum pipe pipe, u32 status_mask);
void i915_disable_pipestat(struct intel_display *display, enum pipe pipe, u32 status_mask);
-void i915_pipestat_irq_handler(struct intel_display *display, u32 iir, const u32 pipe_stats[I915_MAX_PIPES]);
-void i965_pipestat_irq_handler(struct intel_display *display, u32 iir, const u32 pipe_stats[I915_MAX_PIPES]);
-void valleyview_pipestat_irq_handler(struct intel_display *display, const u32 pipe_stats[I915_MAX_PIPES]);
-
-void vlv_display_error_irq_handler(struct intel_display *display, u32 eir, u32 dpinvgtt);
-
void intel_display_irq_init(struct intel_display *display);
void i915gm_irq_cstate_wa(struct intel_display *display, bool enable);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index bb65ce9d09b2..30ce462e92ab 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -38,8 +38,6 @@
#include "display/intel_display_irq.h"
#include "display/intel_hotplug.h"
-#include "display/intel_hotplug_irq.h"
-#include "display/intel_lpe_audio.h"
#include "gt/intel_breadcrumbs.h"
#include "gt/intel_gt.h"
@@ -287,17 +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);
- if (state.iir & (I915_LPE_PIPE_A_INTERRUPT |
- I915_LPE_PIPE_B_INTERRUPT))
- intel_lpe_audio_irq_handler(display);
-
- if (state.hotplug_status)
- i9xx_hpd_irq_handler(display, state.hotplug_status);
-
- if (state.iir & I915_MASTER_ERROR_INTERRUPT)
- vlv_display_error_irq_handler(display, state.eir, state.dpinvgtt);
-
- valleyview_pipestat_irq_handler(display, state.pipe_stats);
+ intel_display_irq_handler(display, &state);
} while (0);
pmu_irq_stats(dev_priv, ret);
@@ -362,18 +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);
- if (state.iir & (I915_LPE_PIPE_A_INTERRUPT |
- I915_LPE_PIPE_B_INTERRUPT |
- I915_LPE_PIPE_C_INTERRUPT))
- intel_lpe_audio_irq_handler(display);
-
- if (state.hotplug_status)
- i9xx_hpd_irq_handler(display, state.hotplug_status);
-
- if (state.iir & I915_MASTER_ERROR_INTERRUPT)
- vlv_display_error_irq_handler(display, state.eir, state.dpinvgtt);
-
- valleyview_pipestat_irq_handler(display, state.pipe_stats);
+ intel_display_irq_handler(display, &state);
} while (0);
pmu_irq_stats(dev_priv, ret);
@@ -420,7 +397,7 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
ret = IRQ_HANDLED;
}
- if (ilk_display_irq_handler(display))
+ if (intel_display_irq_handler(display, NULL))
ret = IRQ_HANDLED;
if (GRAPHICS_VER(i915) >= 6) {
@@ -482,8 +459,11 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
/* IRQs are synced during runtime_suspend, we don't require a wakeref */
if (master_ctl & ~GEN8_GT_IRQS) {
+ const struct intel_display_irq_state state = {
+ .master_ctl = master_ctl,
+ };
disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
- gen8_de_irq_handler(display, master_ctl);
+ intel_display_irq_handler(display, &state);
enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
}
@@ -535,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);
+ intel_display_irq_handler(display, NULL);
gu_misc_iir = gen11_gu_misc_irq_ack(display, master_ctl);
@@ -602,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);
+ intel_display_irq_handler(display, NULL);
gu_misc_iir = gen11_gu_misc_irq_ack(display, master_ctl);
@@ -906,10 +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);
- if (state.hotplug_status)
- i9xx_hpd_irq_handler(display, state.hotplug_status);
-
- i915_pipestat_irq_handler(display, state.iir, state.pipe_stats);
+ intel_display_irq_handler(display, &state);
} while (0);
pmu_irq_stats(dev_priv, ret);
@@ -1013,10 +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);
- if (state.hotplug_status)
- i9xx_hpd_irq_handler(display, state.hotplug_status);
-
- i965_pipestat_irq_handler(display, state.iir, state.pipe_stats);
+ 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 736a5e6938d6..4f283fb79554 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -214,7 +214,7 @@ void xe_display_irq_handler(struct xe_device *xe, u32 master_ctl)
return;
if (master_ctl & DISPLAY_IRQ)
- gen11_display_irq_handler(display);
+ intel_display_irq_handler(display, NULL);
}
void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir)
--
2.47.3
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH 10/15] drm/i915/irq: move VLV/CHV LPE irq handler call after irq acks
2026-04-29 10:24 ` [PATCH 10/15] drm/i915/irq: move VLV/CHV LPE irq handler call after irq acks Jani Nikula
@ 2026-04-29 11:12 ` Ville Syrjälä
2026-04-30 7:49 ` Jani Nikula
0 siblings, 1 reply; 22+ messages in thread
From: Ville Syrjälä @ 2026-04-29 11:12 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx, intel-xe
On Wed, Apr 29, 2026 at 01:24:50PM +0300, Jani Nikula wrote:
> The location of the intel_lpe_audio_irq_handler() call seems too
> early. Group the handler calls together slightly later.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/i915_irq.c | 18 +++++++++---------
> 1 file changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index ef9eadf38a53..1c87f56d668d 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -282,10 +282,6 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
> * signalled in IIR */
> i9xx_pipestat_irq_ack(display, iir, pipe_stats);
>
> - if (iir & (I915_LPE_PIPE_A_INTERRUPT |
> - I915_LPE_PIPE_B_INTERRUPT))
> - intel_lpe_audio_irq_handler(display);
This thing acks the irq too, so I believe it needs to stay here.
> -
> /*
> * VLV_IIR is single buffered, and reflects the level
> * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
> @@ -301,6 +297,10 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
> if (pm_iir)
> gen6_rps_irq_handler(&to_gt(dev_priv)->rps, pm_iir);
>
> + if (iir & (I915_LPE_PIPE_A_INTERRUPT |
> + I915_LPE_PIPE_B_INTERRUPT))
> + intel_lpe_audio_irq_handler(display);
> +
> if (hotplug_status)
> i9xx_hpd_irq_handler(display, hotplug_status);
>
> @@ -372,11 +372,6 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
> * signalled in IIR */
> i9xx_pipestat_irq_ack(display, iir, pipe_stats);
>
> - if (iir & (I915_LPE_PIPE_A_INTERRUPT |
> - I915_LPE_PIPE_B_INTERRUPT |
> - I915_LPE_PIPE_C_INTERRUPT))
> - intel_lpe_audio_irq_handler(display);
> -
> /*
> * VLV_IIR is single buffered, and reflects the level
> * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
> @@ -387,6 +382,11 @@ 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);
>
> + if (iir & (I915_LPE_PIPE_A_INTERRUPT |
> + I915_LPE_PIPE_B_INTERRUPT |
> + I915_LPE_PIPE_C_INTERRUPT))
> + intel_lpe_audio_irq_handler(display);
> +
> if (hotplug_status)
> i9xx_hpd_irq_handler(display, hotplug_status);
>
> --
> 2.47.3
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
* ✗ i915.CI.BAT: failure for drm/i915: refactor display funcs, add display irq hooks
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
` (14 preceding siblings ...)
2026-04-29 10:24 ` [PATCH 15/15] drm/i915/irq: add intel_display_irq_handler() " Jani Nikula
@ 2026-04-29 11:37 ` Patchwork
15 siblings, 0 replies; 22+ messages in thread
From: Patchwork @ 2026-04-29 11:37 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx
[-- Attachment #1: Type: text/plain, Size: 7587 bytes --]
== Series Details ==
Series: drm/i915: refactor display funcs, add display irq hooks
URL : https://patchwork.freedesktop.org/series/165709/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_18378 -> Patchwork_165709v1
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with Patchwork_165709v1 absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in Patchwork_165709v1, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/index.html
Participating hosts (41 -> 40)
------------------------------
Additional (1): fi-rkl-11600
Missing (2): bat-dg2-13 fi-snb-2520m
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in Patchwork_165709v1:
### IGT changes ###
#### Possible regressions ####
* igt@i915_module_load@load:
- bat-atsm-1: [PASS][1] -> [ABORT][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_18378/bat-atsm-1/igt@i915_module_load@load.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/bat-atsm-1/igt@i915_module_load@load.html
Known issues
------------
Here are the changes found in Patchwork_165709v1 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@dmabuf@all-tests:
- fi-rkl-11600: NOTRUN -> [SKIP][3] ([i915#15931])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@dmabuf@all-tests.html
* igt@fbdev@eof:
- fi-rkl-11600: NOTRUN -> [SKIP][4] ([i915#2582]) +3 other tests skip
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@fbdev@eof.html
* igt@fbdev@info:
- fi-rkl-11600: NOTRUN -> [SKIP][5] ([i915#1849] / [i915#2582])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@fbdev@info.html
* igt@gem_huc_copy@huc-copy:
- fi-rkl-11600: NOTRUN -> [SKIP][6] ([i915#2190])
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@gem_huc_copy@huc-copy.html
* igt@gem_lmem_swapping@basic:
- fi-rkl-11600: NOTRUN -> [SKIP][7] ([i915#4613]) +3 other tests skip
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@gem_lmem_swapping@basic.html
* igt@gem_tiled_pread_basic@basic:
- fi-rkl-11600: NOTRUN -> [SKIP][8] ([i915#15656])
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@gem_tiled_pread_basic@basic.html
* igt@i915_selftest@live:
- bat-mtlp-8: [PASS][9] -> [DMESG-FAIL][10] ([i915#12061]) +1 other test dmesg-fail
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_18378/bat-mtlp-8/igt@i915_selftest@live.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/bat-mtlp-8/igt@i915_selftest@live.html
- bat-dg2-8: [PASS][11] -> [DMESG-FAIL][12] ([i915#12061]) +1 other test dmesg-fail
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_18378/bat-dg2-8/igt@i915_selftest@live.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/bat-dg2-8/igt@i915_selftest@live.html
* igt@intel_hwmon@hwmon-read:
- fi-rkl-11600: NOTRUN -> [SKIP][13] ([i915#7707]) +1 other test skip
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@intel_hwmon@hwmon-read.html
* igt@kms_flip@basic-flip-vs-wf_vblank:
- fi-rkl-11600: NOTRUN -> [SKIP][14] ([i915#3637]) +3 other tests skip
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@kms_flip@basic-flip-vs-wf_vblank.html
* igt@kms_force_connector_basic@force-load-detect:
- fi-rkl-11600: NOTRUN -> [SKIP][15]
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@kms_force_connector_basic@force-load-detect.html
* igt@kms_frontbuffer_tracking@basic:
- fi-rkl-11600: NOTRUN -> [SKIP][16] ([i915#1849] / [i915#5354])
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@kms_frontbuffer_tracking@basic.html
* igt@kms_pipe_crc_basic@compare-crc-sanitycheck-xr24:
- fi-rkl-11600: NOTRUN -> [SKIP][17] ([i915#11190]) +16 other tests skip
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@kms_pipe_crc_basic@compare-crc-sanitycheck-xr24.html
* igt@kms_pm_backlight@basic-brightness:
- fi-rkl-11600: NOTRUN -> [SKIP][18] ([i915#5354])
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@kms_pm_backlight@basic-brightness.html
* igt@kms_psr@psr-primary-page-flip:
- fi-rkl-11600: NOTRUN -> [SKIP][19] ([i915#1072] / [i915#9732]) +3 other tests skip
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@kms_psr@psr-primary-page-flip.html
* igt@kms_setmode@basic-clone-single-crtc:
- fi-rkl-11600: NOTRUN -> [SKIP][20] ([i915#3555])
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@kms_setmode@basic-clone-single-crtc.html
* igt@prime_vgem@basic-fence-flip:
- fi-rkl-11600: NOTRUN -> [SKIP][21] ([i915#3708])
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@prime_vgem@basic-fence-flip.html
* igt@prime_vgem@basic-read:
- fi-rkl-11600: NOTRUN -> [SKIP][22] ([i915#3291] / [i915#3708]) +2 other tests skip
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/fi-rkl-11600/igt@prime_vgem@basic-read.html
[i915#1072]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1072
[i915#11190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/11190
[i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061
[i915#15656]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15656
[i915#15931]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15931
[i915#1849]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/1849
[i915#2190]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2190
[i915#2582]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2582
[i915#3291]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3291
[i915#3555]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3555
[i915#3637]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3637
[i915#3708]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/3708
[i915#4613]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/4613
[i915#5354]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/5354
[i915#7707]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/7707
[i915#9732]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9732
Build changes
-------------
* Linux: CI_DRM_18378 -> Patchwork_165709v1
CI-20190529: 20190529
CI_DRM_18378: 1db870ffb55b6414a78d7609ba7e08adf880dfc5 @ git://anongit.freedesktop.org/gfx-ci/linux
IGT_8879: 02b0e01dd9a5a3ab1efe976bb8c4f13cfcdbab1a @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Patchwork_165709v1: 1db870ffb55b6414a78d7609ba7e08adf880dfc5 @ git://anongit.freedesktop.org/gfx-ci/linux
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_165709v1/index.html
[-- Attachment #2: Type: text/html, Size: 9024 bytes --]
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 15/15] drm/i915/irq: add intel_display_irq_handler() to irq funcs
2026-04-29 10:24 ` [PATCH 15/15] drm/i915/irq: add intel_display_irq_handler() " Jani Nikula
@ 2026-04-29 11:56 ` Ville Syrjälä
2026-04-30 7:59 ` Jani Nikula
0 siblings, 1 reply; 22+ messages in thread
From: Ville Syrjälä @ 2026-04-29 11:56 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx, intel-xe
On Wed, Apr 29, 2026 at 01:24:55PM +0300, Jani Nikula wrote:
> Call the platform specific display irq handler hooks via
> intel_display_irq_handler(). Add master_ctl to struct
> intel_display_irq_state, and pass the state pointer to the handler where
> necessary.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
> .../gpu/drm/i915/display/intel_display_irq.c | 95 ++++++++++++++++---
> .../gpu/drm/i915/display/intel_display_irq.h | 11 +--
> drivers/gpu/drm/i915/i915_irq.c | 48 +++-------
> drivers/gpu/drm/xe/display/xe_display.c | 2 +-
> 4 files changed, 98 insertions(+), 58 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
> index 662081e274bf..5aec1bedbd61 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_irq.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
> @@ -23,6 +23,7 @@
> #include "intel_fifo_underrun.h"
> #include "intel_gmbus.h"
> #include "intel_hotplug_irq.h"
> +#include "intel_lpe_audio.h"
> #include "intel_parent.h"
> #include "intel_pipe_crc_regs.h"
> #include "intel_plane.h"
> @@ -596,8 +597,8 @@ static void i9xx_pipestat_irq_ack(struct intel_display *display,
> spin_unlock(&display->irq.lock);
> }
>
> -void i915_pipestat_irq_handler(struct intel_display *display,
> - u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
> +static void i915_pipestat_irq_handler(struct intel_display *display,
> + u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
> {
> bool blc_event = false;
> enum pipe pipe;
> @@ -620,8 +621,8 @@ void i915_pipestat_irq_handler(struct intel_display *display,
> intel_opregion_asle_intr(display);
> }
>
> -void i965_pipestat_irq_handler(struct intel_display *display,
> - u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
> +static void i965_pipestat_irq_handler(struct intel_display *display,
> + u32 iir, const u32 pipe_stats[I915_MAX_PIPES])
> {
> bool blc_event = false;
> enum pipe pipe;
> @@ -647,8 +648,8 @@ void i965_pipestat_irq_handler(struct intel_display *display,
> intel_gmbus_irq_handler(display);
> }
>
> -void valleyview_pipestat_irq_handler(struct intel_display *display,
> - const u32 pipe_stats[I915_MAX_PIPES])
> +static void valleyview_pipestat_irq_handler(struct intel_display *display,
> + const u32 pipe_stats[I915_MAX_PIPES])
> {
> enum pipe pipe;
>
> @@ -1020,7 +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)
> +static bool ilk_display_irq_handler(struct intel_display *display,
> + const struct intel_display_irq_state *state)
> {
> u32 de_iir;
> bool handled = false;
> @@ -1404,7 +1406,7 @@ static void gen8_read_and_ack_pch_irqs(struct intel_display *display, u32 *pch_i
> intel_de_write(display, PICAINTERRUPT_IER, pica_ier);
> }
>
> -void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl)
> +static void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl)
> {
> u32 iir;
> enum pipe pipe;
> @@ -1565,6 +1567,14 @@ void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl)
> }
> }
>
> +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);
> +
> + return true;
> +}
> +
> u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl)
> {
> u32 iir;
> @@ -1589,7 +1599,8 @@ void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir)
> intel_opregion_asle_intr(display);
> }
>
> -void gen11_display_irq_handler(struct intel_display *display)
> +static bool gen11_display_irq_handler(struct intel_display *display,
> + const struct intel_display_irq_state *state)
> {
> u32 disp_ctl;
>
> @@ -1605,6 +1616,8 @@ void gen11_display_irq_handler(struct intel_display *display)
> intel_de_write(display, GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
>
> intel_display_rpm_assert_unblock(display);
> +
> + return true;
> }
>
> static void i915gm_irq_cstate_wa_enable(struct intel_display *display)
> @@ -1920,8 +1933,8 @@ static void vlv_display_error_irq_ack(struct intel_display *display,
> intel_de_write(display, VLV_EMR, emr);
> }
>
> -void vlv_display_error_irq_handler(struct intel_display *display,
> - u32 eir, u32 dpinvgtt)
> +static void vlv_display_error_irq_handler(struct intel_display *display,
> + u32 eir, u32 dpinvgtt)
> {
> drm_dbg(display->drm, "Master Error, EIR 0x%08x\n", eir);
>
> @@ -2020,6 +2033,28 @@ static void i9xx_display_irq_ack(struct intel_display *display,
> i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats);
> }
>
> +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);
> +
> + i965_pipestat_irq_handler(display, state->iir, state->pipe_stats);
> +
> + return true;
> +}
> +
> +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);
> +
> + i915_pipestat_irq_handler(display, state->iir, state->pipe_stats);
> +
> + return true;
> +}
> +
> static u32 vlv_error_mask(void)
> {
> /* TODO enable other errors too? */
> @@ -2088,6 +2123,28 @@ static void vlv_display_irq_ack(struct intel_display *display,
> i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats);
> }
>
> +static bool vlv_display_irq_handler(struct intel_display *display,
> + const struct intel_display_irq_state *state)
> +{
> + u32 lpe_mask = I915_LPE_PIPE_A_INTERRUPT | I915_LPE_PIPE_B_INTERRUPT;
> +
> + if (display->platform.cherryview)
> + lpe_mask |= I915_LPE_PIPE_C_INTERRUPT;
I would prefer a function rather than the extra variable. The other
option is to just use the CHV mask always. There is nothing on the
extra bit on VLV so we never unmask it.
> +
> + if (state->iir & lpe_mask)
> + intel_lpe_audio_irq_handler(display);
> +
> + if (state->hotplug_status)
> + i9xx_hpd_irq_handler(display, state->hotplug_status);
> +
> + if (state->iir & I915_MASTER_ERROR_INTERRUPT)
> + vlv_display_error_irq_handler(display, state->eir, state->dpinvgtt);
> +
> + valleyview_pipestat_irq_handler(display, state->pipe_stats);
> +
> + return true;
> +}
> +
> static void ibx_display_irq_reset(struct intel_display *display)
> {
> if (HAS_PCH_NOP(display))
> @@ -2476,39 +2533,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);
> };
>
> struct intel_display_irq_funcs gen11_display_irq_funcs = {
> .reset = gen11_display_irq_reset,
> .postinstall = gen11_de_irq_postinstall,
> + .handler = gen11_display_irq_handler,
> };
>
> struct intel_display_irq_funcs gen8_display_irq_funcs = {
> .reset = gen8_display_irq_reset,
> .postinstall = gen8_de_irq_postinstall,
> + .handler = gen8_display_irq_handler,
> };
>
> 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,
> };
>
> struct intel_display_irq_funcs ilk_display_irq_funcs = {
> .reset = ilk_display_irq_reset,
> .postinstall = ilk_de_irq_postinstall,
> + .handler = ilk_display_irq_handler,
> };
>
> 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,
> };
>
> 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)
> @@ -2528,6 +2592,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 (!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 3773a31e48f2..a1227cee885a 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_irq.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
> @@ -51,14 +51,12 @@ void bdw_disable_vblank(struct drm_crtc *crtc);
>
> void ilk_display_irq_master_disable(struct intel_display *display, u32 *de_ier, u32 *sde_ier);
> void ilk_display_irq_master_enable(struct intel_display *display, u32 de_ier, u32 sde_ier);
> -bool ilk_display_irq_handler(struct intel_display *display);
> -void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl);
> -void gen11_display_irq_handler(struct intel_display *display);
>
> u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl);
> void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir);
>
> struct intel_display_irq_state {
> + u32 master_ctl;
Ideally I'd like a separate structs for different platforms,
but until I resurrect my old ack vs. handle split for all
platforms I guess we don't need anything else here for
ilk+. So good enough for now I suppose.
> u32 iir;
> u32 eir;
> u32 hotplug_status;
> @@ -69,6 +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 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);
>
> @@ -76,12 +75,6 @@ u32 i915_pipestat_enable_mask(struct intel_display *display, enum pipe pipe);
> void i915_enable_pipestat(struct intel_display *display, enum pipe pipe, u32 status_mask);
> void i915_disable_pipestat(struct intel_display *display, enum pipe pipe, u32 status_mask);
>
> -void i915_pipestat_irq_handler(struct intel_display *display, u32 iir, const u32 pipe_stats[I915_MAX_PIPES]);
> -void i965_pipestat_irq_handler(struct intel_display *display, u32 iir, const u32 pipe_stats[I915_MAX_PIPES]);
> -void valleyview_pipestat_irq_handler(struct intel_display *display, const u32 pipe_stats[I915_MAX_PIPES]);
> -
> -void vlv_display_error_irq_handler(struct intel_display *display, u32 eir, u32 dpinvgtt);
> -
> void intel_display_irq_init(struct intel_display *display);
>
> void i915gm_irq_cstate_wa(struct intel_display *display, bool enable);
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index bb65ce9d09b2..30ce462e92ab 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -38,8 +38,6 @@
>
> #include "display/intel_display_irq.h"
> #include "display/intel_hotplug.h"
> -#include "display/intel_hotplug_irq.h"
> -#include "display/intel_lpe_audio.h"
>
> #include "gt/intel_breadcrumbs.h"
> #include "gt/intel_gt.h"
> @@ -287,17 +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);
>
> - if (state.iir & (I915_LPE_PIPE_A_INTERRUPT |
> - I915_LPE_PIPE_B_INTERRUPT))
> - intel_lpe_audio_irq_handler(display);
> -
> - if (state.hotplug_status)
> - i9xx_hpd_irq_handler(display, state.hotplug_status);
> -
> - if (state.iir & I915_MASTER_ERROR_INTERRUPT)
> - vlv_display_error_irq_handler(display, state.eir, state.dpinvgtt);
> -
> - valleyview_pipestat_irq_handler(display, state.pipe_stats);
> + intel_display_irq_handler(display, &state);
> } while (0);
>
> pmu_irq_stats(dev_priv, ret);
> @@ -362,18 +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);
>
> - if (state.iir & (I915_LPE_PIPE_A_INTERRUPT |
> - I915_LPE_PIPE_B_INTERRUPT |
> - I915_LPE_PIPE_C_INTERRUPT))
> - intel_lpe_audio_irq_handler(display);
> -
> - if (state.hotplug_status)
> - i9xx_hpd_irq_handler(display, state.hotplug_status);
> -
> - if (state.iir & I915_MASTER_ERROR_INTERRUPT)
> - vlv_display_error_irq_handler(display, state.eir, state.dpinvgtt);
> -
> - valleyview_pipestat_irq_handler(display, state.pipe_stats);
> + intel_display_irq_handler(display, &state);
> } while (0);
>
> pmu_irq_stats(dev_priv, ret);
> @@ -420,7 +397,7 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
> ret = IRQ_HANDLED;
> }
>
> - if (ilk_display_irq_handler(display))
> + if (intel_display_irq_handler(display, NULL))
> ret = IRQ_HANDLED;
>
> if (GRAPHICS_VER(i915) >= 6) {
> @@ -482,8 +459,11 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
>
> /* IRQs are synced during runtime_suspend, we don't require a wakeref */
> if (master_ctl & ~GEN8_GT_IRQS) {
> + const struct intel_display_irq_state state = {
> + .master_ctl = master_ctl,
> + };
> disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
> - gen8_de_irq_handler(display, master_ctl);
> + intel_display_irq_handler(display, &state);
> enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
> }
>
> @@ -535,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);
> + intel_display_irq_handler(display, NULL);
>
> gu_misc_iir = gen11_gu_misc_irq_ack(display, master_ctl);
>
> @@ -602,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);
> + intel_display_irq_handler(display, NULL);
>
> gu_misc_iir = gen11_gu_misc_irq_ack(display, master_ctl);
>
> @@ -906,10 +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);
>
> - if (state.hotplug_status)
> - i9xx_hpd_irq_handler(display, state.hotplug_status);
> -
> - i915_pipestat_irq_handler(display, state.iir, state.pipe_stats);
> + intel_display_irq_handler(display, &state);
> } while (0);
>
> pmu_irq_stats(dev_priv, ret);
> @@ -1013,10 +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);
>
> - if (state.hotplug_status)
> - i9xx_hpd_irq_handler(display, state.hotplug_status);
> -
> - i965_pipestat_irq_handler(display, state.iir, state.pipe_stats);
> + 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 736a5e6938d6..4f283fb79554 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -214,7 +214,7 @@ void xe_display_irq_handler(struct xe_device *xe, u32 master_ctl)
> return;
>
> if (master_ctl & DISPLAY_IRQ)
> - gen11_display_irq_handler(display);
> + intel_display_irq_handler(display, NULL);
> }
>
> void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir)
> --
> 2.47.3
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 10/15] drm/i915/irq: move VLV/CHV LPE irq handler call after irq acks
2026-04-29 11:12 ` Ville Syrjälä
@ 2026-04-30 7:49 ` Jani Nikula
0 siblings, 0 replies; 22+ messages in thread
From: Jani Nikula @ 2026-04-30 7:49 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: intel-gfx, intel-xe
On Wed, 29 Apr 2026, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> On Wed, Apr 29, 2026 at 01:24:50PM +0300, Jani Nikula wrote:
>> The location of the intel_lpe_audio_irq_handler() call seems too
>> early. Group the handler calls together slightly later.
>>
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> ---
>> drivers/gpu/drm/i915/i915_irq.c | 18 +++++++++---------
>> 1 file changed, 9 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
>> index ef9eadf38a53..1c87f56d668d 100644
>> --- a/drivers/gpu/drm/i915/i915_irq.c
>> +++ b/drivers/gpu/drm/i915/i915_irq.c
>> @@ -282,10 +282,6 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
>> * signalled in IIR */
>> i9xx_pipestat_irq_ack(display, iir, pipe_stats);
>>
>> - if (iir & (I915_LPE_PIPE_A_INTERRUPT |
>> - I915_LPE_PIPE_B_INTERRUPT))
>> - intel_lpe_audio_irq_handler(display);
>
> This thing acks the irq too, so I believe it needs to stay here.
That was lost on me with the rabbit hole the lpe irq handler is.
I think I can put this in the intel_display_irq_ack() part, although the
name becomes misleading as it also handles some parts. Oh well.
BR,
Jani.
>
>> -
>> /*
>> * VLV_IIR is single buffered, and reflects the level
>> * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
>> @@ -301,6 +297,10 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
>> if (pm_iir)
>> gen6_rps_irq_handler(&to_gt(dev_priv)->rps, pm_iir);
>>
>> + if (iir & (I915_LPE_PIPE_A_INTERRUPT |
>> + I915_LPE_PIPE_B_INTERRUPT))
>> + intel_lpe_audio_irq_handler(display);
>> +
>> if (hotplug_status)
>> i9xx_hpd_irq_handler(display, hotplug_status);
>>
>> @@ -372,11 +372,6 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
>> * signalled in IIR */
>> i9xx_pipestat_irq_ack(display, iir, pipe_stats);
>>
>> - if (iir & (I915_LPE_PIPE_A_INTERRUPT |
>> - I915_LPE_PIPE_B_INTERRUPT |
>> - I915_LPE_PIPE_C_INTERRUPT))
>> - intel_lpe_audio_irq_handler(display);
>> -
>> /*
>> * VLV_IIR is single buffered, and reflects the level
>> * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
>> @@ -387,6 +382,11 @@ 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);
>>
>> + if (iir & (I915_LPE_PIPE_A_INTERRUPT |
>> + I915_LPE_PIPE_B_INTERRUPT |
>> + I915_LPE_PIPE_C_INTERRUPT))
>> + intel_lpe_audio_irq_handler(display);
>> +
>> if (hotplug_status)
>> i9xx_hpd_irq_handler(display, hotplug_status);
>>
>> --
>> 2.47.3
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 15/15] drm/i915/irq: add intel_display_irq_handler() to irq funcs
2026-04-29 11:56 ` Ville Syrjälä
@ 2026-04-30 7:59 ` Jani Nikula
2026-04-30 10:28 ` Ville Syrjälä
0 siblings, 1 reply; 22+ messages in thread
From: Jani Nikula @ 2026-04-30 7:59 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: intel-gfx, intel-xe
On Wed, 29 Apr 2026, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> On Wed, Apr 29, 2026 at 01:24:55PM +0300, Jani Nikula wrote:
>> @@ -2088,6 +2123,28 @@ static void vlv_display_irq_ack(struct intel_display *display,
>> i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats);
>> }
>>
>> +static bool vlv_display_irq_handler(struct intel_display *display,
>> + const struct intel_display_irq_state *state)
>> +{
>> + u32 lpe_mask = I915_LPE_PIPE_A_INTERRUPT | I915_LPE_PIPE_B_INTERRUPT;
>> +
>> + if (display->platform.cherryview)
>> + lpe_mask |= I915_LPE_PIPE_C_INTERRUPT;
>
> I would prefer a function rather than the extra variable. The other
> option is to just use the CHV mask always. There is nothing on the
> extra bit on VLV so we never unmask it.
Hmm. reset and postinstall also have slight variations for VLV vs. CHV,
but only very slight. I think they're overall close enough that
splitting out a funcs struct and separate funcs for CHV is more
distracting and duplication than helpful.
Or would something like this be satisfactory? Just a couple of small
wrapper functions around intel_lpe_audio_irq_handler() here that the
compiler would just inline:
if (display->platform.cherryview)
chv_lpe_audio_irq_handler(display, state->iir);
else
vlv_lpe_audio_irq_handler(display, state->iir);
Of course this would need to move to the ack part per your other review
comment.
>> @@ -51,14 +51,12 @@ void bdw_disable_vblank(struct drm_crtc *crtc);
>>
>> void ilk_display_irq_master_disable(struct intel_display *display, u32 *de_ier, u32 *sde_ier);
>> void ilk_display_irq_master_enable(struct intel_display *display, u32 de_ier, u32 sde_ier);
>> -bool ilk_display_irq_handler(struct intel_display *display);
>> -void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl);
>> -void gen11_display_irq_handler(struct intel_display *display);
>>
>> u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl);
>> void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir);
>>
>> struct intel_display_irq_state {
>> + u32 master_ctl;
>
> Ideally I'd like a separate structs for different platforms,
> but until I resurrect my old ack vs. handle split for all
> platforms I guess we don't need anything else here for
> ilk+. So good enough for now I suppose.
You mean per-platform substructs/unions within struct
intel_display_irq_state? I can do that.
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH 15/15] drm/i915/irq: add intel_display_irq_handler() to irq funcs
2026-04-30 7:59 ` Jani Nikula
@ 2026-04-30 10:28 ` Ville Syrjälä
0 siblings, 0 replies; 22+ messages in thread
From: Ville Syrjälä @ 2026-04-30 10:28 UTC (permalink / raw)
To: Jani Nikula; +Cc: intel-gfx, intel-xe
On Thu, Apr 30, 2026 at 10:59:11AM +0300, Jani Nikula wrote:
> On Wed, 29 Apr 2026, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> > On Wed, Apr 29, 2026 at 01:24:55PM +0300, Jani Nikula wrote:
> >> @@ -2088,6 +2123,28 @@ static void vlv_display_irq_ack(struct intel_display *display,
> >> i9xx_pipestat_irq_ack(display, state->iir, state->pipe_stats);
> >> }
> >>
> >> +static bool vlv_display_irq_handler(struct intel_display *display,
> >> + const struct intel_display_irq_state *state)
> >> +{
> >> + u32 lpe_mask = I915_LPE_PIPE_A_INTERRUPT | I915_LPE_PIPE_B_INTERRUPT;
> >> +
> >> + if (display->platform.cherryview)
> >> + lpe_mask |= I915_LPE_PIPE_C_INTERRUPT;
> >
> > I would prefer a function rather than the extra variable. The other
> > option is to just use the CHV mask always. There is nothing on the
> > extra bit on VLV so we never unmask it.
>
> Hmm. reset and postinstall also have slight variations for VLV vs. CHV,
> but only very slight. I think they're overall close enough that
> splitting out a funcs struct and separate funcs for CHV is more
> distracting and duplication than helpful.
I think with DPINVGTT we could just switch to using full 16bit masks
and get rid of the vlv/chv difference. I should check if the unused
bits are all tied to 0...
>
> Or would something like this be satisfactory? Just a couple of small
> wrapper functions around intel_lpe_audio_irq_handler() here that the
> compiler would just inline:
>
> if (display->platform.cherryview)
> chv_lpe_audio_irq_handler(display, state->iir);
> else
> vlv_lpe_audio_irq_handler(display, state->iir);
>
> Of course this would need to move to the ack part per your other review
> comment.
I was just thinking of having something like
vlv_lpe_irq_mask()
{
if (chv)
return ...;
else
return ...;
}
>
>
> >> @@ -51,14 +51,12 @@ void bdw_disable_vblank(struct drm_crtc *crtc);
> >>
> >> void ilk_display_irq_master_disable(struct intel_display *display, u32 *de_ier, u32 *sde_ier);
> >> void ilk_display_irq_master_enable(struct intel_display *display, u32 de_ier, u32 sde_ier);
> >> -bool ilk_display_irq_handler(struct intel_display *display);
> >> -void gen8_de_irq_handler(struct intel_display *display, u32 master_ctl);
> >> -void gen11_display_irq_handler(struct intel_display *display);
> >>
> >> u32 gen11_gu_misc_irq_ack(struct intel_display *display, const u32 master_ctl);
> >> void gen11_gu_misc_irq_handler(struct intel_display *display, const u32 iir);
> >>
> >> struct intel_display_irq_state {
> >> + u32 master_ctl;
> >
> > Ideally I'd like a separate structs for different platforms,
> > but until I resurrect my old ack vs. handle split for all
> > platforms I guess we don't need anything else here for
> > ilk+. So good enough for now I suppose.
>
> You mean per-platform substructs/unions within struct
> intel_display_irq_state? I can do that.
Yeah something like that. Not super important right since
we just have the master_ctl for non-gmch platforms.
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2026-04-30 10:28 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-29 10:24 [PATCH 00/15] drm/i915: refactor display funcs, add display irq hooks Jani Nikula
2026-04-29 10:24 ` [PATCH 01/15] drm/i915/display: move audio funcs under audio sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 02/15] drm/i915/display: move color funcs under color sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 03/15] drm/i915/display: move fdi funcs under fdi sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 04/15] drm/i915/display: move watermark funcs under wm sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 05/15] drm/i915/display: move hotplug irq funcs under hotplug sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 06/15] drm/i915/display: move dpll funcs under dpll sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 07/15] drm/i915/display: move cdclk funcs under cdclk sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 08/15] drm/i915/display: move display funcs under modeset sub-struct Jani Nikula
2026-04-29 10:24 ` [PATCH 09/15] drm/i915/irq: deduplicate dg1_de_irq_postinstall() and gen11_de_irq_postinstall() Jani Nikula
2026-04-29 10:24 ` [PATCH 10/15] drm/i915/irq: move VLV/CHV LPE irq handler call after irq acks Jani Nikula
2026-04-29 11:12 ` Ville Syrjälä
2026-04-30 7:49 ` Jani Nikula
2026-04-29 10:24 ` [PATCH 11/15] drm/i915/irq: constify pipe stats parameters Jani Nikula
2026-04-29 10:24 ` [PATCH 12/15] drm/i915/irq: add display irq funcs, start with intel_display_irq_reset() Jani Nikula
2026-04-29 10:24 ` [PATCH 13/15] drm/i915/irq: add intel_display_irq_postinstall() to irq funcs Jani Nikula
2026-04-29 10:24 ` [PATCH 14/15] drm/i915/irq: add intel_display_irq_ack() " Jani Nikula
2026-04-29 10:24 ` [PATCH 15/15] drm/i915/irq: add intel_display_irq_handler() " Jani Nikula
2026-04-29 11:56 ` Ville Syrjälä
2026-04-30 7:59 ` Jani Nikula
2026-04-30 10:28 ` Ville Syrjälä
2026-04-29 11:37 ` ✗ i915.CI.BAT: failure for drm/i915: refactor display funcs, add display irq hooks Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox