From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Jani Nikula <jani.nikula@intel.com>
Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org
Subject: Re: [PATCH v2 5/5] drm/i915/irq: split ILK display irq handling
Date: Tue, 23 Sep 2025 17:45:17 +0300 [thread overview]
Message-ID: <aNKyfVyQPpMsCpQy@intel.com> (raw)
In-Reply-To: <e8ea7c985c3f3a80870f3333bde2e1bf30d653b0.1758637773.git.jani.nikula@intel.com>
On Tue, Sep 23, 2025 at 05:31:08PM +0300, Jani Nikula wrote:
> Split out display irq handling on ilk. Since the master IRQ enable is in
> DEIIR, we'll need to do this in two parts. First, add
> ilk_display_irq_master_disable() to disable master and south interrupts,
> and second, add (repurposed) ilk_display_irq_handler() to finish display
> irq handling.
>
> It's not the prettiest thing you ever saw, but improves separation of
> display irq handling. And removes HAS_PCH_NOP() and DISPLAY_VER() checks
> from core irq code.
>
> v2:
> - Separate ilk_display_irq_master_enable() (Ville)
> - Use _fw mmio accessors (Ville)
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> .../gpu/drm/i915/display/intel_display_irq.c | 51 ++++++++++++++++++-
> .../gpu/drm/i915/display/intel_display_irq.h | 5 +-
> drivers/gpu/drm/i915/i915_irq.c | 31 +++--------
> 3 files changed, 58 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.c b/drivers/gpu/drm/i915/display/intel_display_irq.c
> index 4d51900123ea..e1a812f6159b 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_irq.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
> @@ -872,7 +872,7 @@ static void ilk_gtt_fault_irq_handler(struct intel_display *display)
> }
> }
>
> -void ilk_display_irq_handler(struct intel_display *display, u32 de_iir)
> +static void _ilk_display_irq_handler(struct intel_display *display, u32 de_iir)
> {
> enum pipe pipe;
> u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG;
> @@ -923,7 +923,7 @@ void ilk_display_irq_handler(struct intel_display *display, u32 de_iir)
> ilk_display_rps_irq_handler(display);
> }
>
> -void ivb_display_irq_handler(struct intel_display *display, u32 de_iir)
> +static void _ivb_display_irq_handler(struct intel_display *display, u32 de_iir)
> {
> enum pipe pipe;
> u32 hotplug_trigger = de_iir & DE_DP_A_HOTPLUG_IVB;
> @@ -972,6 +972,53 @@ void ivb_display_irq_handler(struct intel_display *display, u32 de_iir)
> }
> }
>
> +void ilk_display_irq_master_disable(struct intel_display *display, u32 *de_ier, u32 *sde_ier)
> +{
> + /* disable master interrupt before clearing iir */
> + *de_ier = intel_de_read_fw(display, DEIER);
> + intel_de_write_fw(display, DEIER, *de_ier & ~DE_MASTER_IRQ_CONTROL);
> +
> + /*
> + * Disable south interrupts. We'll only write to SDEIIR once, so further
> + * interrupts will be stored on its back queue, and then we'll be able
> + * to process them after we restore SDEIER (as soon as we restore it,
> + * we'll get an interrupt if SDEIIR still has something to process due
> + * to its back queue).
> + */
> + if (!HAS_PCH_NOP(display)) {
> + *sde_ier = intel_de_read_fw(display, SDEIER);
> + intel_de_write_fw(display, SDEIER, 0);
> + } else {
> + *sde_ier = 0;
> + }
> +}
> +
> +void ilk_display_irq_master_enable(struct intel_display *display, u32 de_ier, u32 sde_ier)
> +{
> + intel_de_write_fw(display, DEIER, de_ier);
> +
> + if (sde_ier)
> + intel_de_write_fw(display, SDEIER, sde_ier);
> +}
> +
> +bool ilk_display_irq_handler(struct intel_display *display)
> +{
> + u32 de_iir;
> + bool handled = false;
> +
> + de_iir = intel_de_read_fw(display, DEIIR);
> + if (de_iir) {
> + intel_de_write_fw(display, DEIIR, de_iir);
> + if (DISPLAY_VER(display) >= 7)
> + _ivb_display_irq_handler(display, de_iir);
> + else
> + _ilk_display_irq_handler(display, de_iir);
> + handled = true;
> + }
> +
> + return handled;
> +}
> +
> static u32 gen8_de_port_aux_mask(struct intel_display *display)
> {
> u32 mask;
> diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.h b/drivers/gpu/drm/i915/display/intel_display_irq.h
> index e44d88e0d7e7..84acd31948cf 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_irq.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
> @@ -47,8 +47,9 @@ void i965_disable_vblank(struct drm_crtc *crtc);
> void ilk_disable_vblank(struct drm_crtc *crtc);
> void bdw_disable_vblank(struct drm_crtc *crtc);
>
> -void ivb_display_irq_handler(struct intel_display *display, u32 de_iir);
> -void ilk_display_irq_handler(struct intel_display *display, u32 de_iir);
> +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);
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 90174ce9195c..11a727b74849 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -414,7 +414,7 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
> struct drm_i915_private *i915 = arg;
> struct intel_display *display = i915->display;
> void __iomem * const regs = intel_uncore_regs(&i915->uncore);
> - u32 de_iir, gt_iir, de_ier, sde_ier = 0;
> + u32 gt_iir, de_ier = 0, sde_ier = 0;
> irqreturn_t ret = IRQ_NONE;
>
> if (unlikely(!intel_irqs_enabled(i915)))
> @@ -423,19 +423,8 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
> /* IRQs are synced during runtime_suspend, we don't require a wakeref */
> disable_rpm_wakeref_asserts(&i915->runtime_pm);
>
> - /* disable master interrupt before clearing iir */
> - de_ier = raw_reg_read(regs, DEIER);
> - raw_reg_write(regs, DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL);
> -
> - /* Disable south interrupts. We'll only write to SDEIIR once, so further
> - * interrupts will will be stored on its back queue, and then we'll be
> - * able to process them after we restore SDEIER (as soon as we restore
> - * it, we'll get an interrupt if SDEIIR still has something to process
> - * due to its back queue). */
> - if (!HAS_PCH_NOP(display)) {
> - sde_ier = raw_reg_read(regs, SDEIER);
> - raw_reg_write(regs, SDEIER, 0);
> - }
> + /* Disable master and south interrupts */
> + ilk_display_irq_master_disable(display, &de_ier, &sde_ier);
>
> /* Find, clear, then process each source of interrupt */
>
> @@ -449,15 +438,8 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
> ret = IRQ_HANDLED;
> }
>
> - de_iir = raw_reg_read(regs, DEIIR);
> - if (de_iir) {
> - raw_reg_write(regs, DEIIR, de_iir);
> - if (DISPLAY_VER(display) >= 7)
> - ivb_display_irq_handler(display, de_iir);
> - else
> - ilk_display_irq_handler(display, de_iir);
> + if (ilk_display_irq_handler(display))
> ret = IRQ_HANDLED;
> - }
>
> if (GRAPHICS_VER(i915) >= 6) {
> u32 pm_iir = raw_reg_read(regs, GEN6_PMIIR);
> @@ -468,9 +450,8 @@ static irqreturn_t ilk_irq_handler(int irq, void *arg)
> }
> }
>
> - raw_reg_write(regs, DEIER, de_ier);
> - if (sde_ier)
> - raw_reg_write(regs, SDEIER, sde_ier);
> + /* Re-enable master and south interrupts */
> + ilk_display_irq_master_enable(display, de_ier, sde_ier);
>
> pmu_irq_stats(i915, ret);
>
> --
> 2.47.3
--
Ville Syrjälä
Intel
next prev parent reply other threads:[~2025-09-23 14:45 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-23 14:31 [PATCH v2 0/5] drm/i915/irq: display irq refactoring Jani Nikula
2025-09-23 14:31 ` [PATCH v2 1/5] drm/i915/irq: drop intel_psr_regs.h include Jani Nikula
2025-09-23 14:39 ` Ville Syrjälä
2025-09-23 14:31 ` [PATCH v2 2/5] drm/i915/irq: initialize gen2_imr_mask in terms of enable_mask Jani Nikula
2025-09-23 14:40 ` Ville Syrjälä
2025-09-23 14:31 ` [PATCH v2 3/5] drm/i915/irq: abstract i9xx_display_irq_enable_mask() Jani Nikula
2025-09-23 14:41 ` Ville Syrjälä
2025-09-23 14:31 ` [PATCH v2 4/5] drm/i915/irq: move check for HAS_HOTPLUG() inside i9xx_hpd_irq_ack() Jani Nikula
2025-09-23 14:43 ` Ville Syrjälä
2025-09-23 14:31 ` [PATCH v2 5/5] drm/i915/irq: split ILK display irq handling Jani Nikula
2025-09-23 14:45 ` Ville Syrjälä [this message]
2025-09-24 6:47 ` Jani Nikula
2025-09-23 15:08 ` ✓ CI.KUnit: success for drm/i915/irq: display irq refactoring (rev2) Patchwork
2025-09-23 17:58 ` ✗ Xe.CI.Full: failure " Patchwork
2025-09-23 20:50 ` ✓ i915.CI.BAT: success " Patchwork
2025-09-24 5:29 ` ✗ i915.CI.Full: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aNKyfVyQPpMsCpQy@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jani.nikula@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.