]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/irq: add intel_display_irq_ack() to irq funcs
authorJani Nikula <jani.nikula@intel.com>
Wed, 13 May 2026 16:13:30 +0000 (19:13 +0300)
committerJani Nikula <jani.nikula@intel.com>
Sat, 16 May 2026 09:19:23 +0000 (12:19 +0300)
Call the platform specific display irq ack hooks, if any, via
intel_display_irq_ack().

Check for HAS_DISPLAY() in intel_display_irq_ack() for completeness even
though fusing is not possible on the platforms in question.

v3:
- Pure vfunc change (Ville)

v2:
- Include LPE audio in the ack part
- Check for HAS_DISPLAY()

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patch.msgid.link/a72974d66f7696ca35380b44f13f938b2d4d690d.1778688699.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_display_irq.c
drivers/gpu/drm/i915/display/intel_display_irq.h
drivers/gpu/drm/i915/i915_irq.c

index 672fd4f245ffa76e436fc64444fbe42ca1ad4f8d..c777b7f249c824cdc6b30b4c1977f1f83b60ec51 100644 (file)
@@ -2023,8 +2023,8 @@ static void i965_display_irq_postinstall(struct intel_display *display)
        i915_enable_asle_pipestat(display);
 }
 
-void i9xx_display_irq_ack(struct intel_display *display,
-                         struct intel_display_irq_state *state)
+static void i9xx_display_irq_ack(struct intel_display *display,
+                                struct intel_display_irq_state *state)
 {
        if (state->iir & I915_DISPLAY_PORT_INTERRUPT)
                state->hotplug_status = i9xx_hpd_irq_ack(display);
@@ -2119,8 +2119,8 @@ static u32 vlv_lpe_irq_mask(struct intel_display *display)
                return I915_LPE_PIPE_A_INTERRUPT | I915_LPE_PIPE_B_INTERRUPT;
 }
 
-void vlv_display_irq_ack(struct intel_display *display,
-                        struct intel_display_irq_state *state)
+static void vlv_display_irq_ack(struct intel_display *display,
+                               struct intel_display_irq_state *state)
 {
        if (state->iir & I915_DISPLAY_PORT_INTERRUPT)
                state->hotplug_status = i9xx_hpd_irq_ack(display);
@@ -2528,6 +2528,7 @@ static void gen11_de_irq_postinstall(struct intel_display *display)
 struct intel_display_irq_funcs {
        void (*reset)(struct intel_display *display);
        void (*postinstall)(struct intel_display *display);
+       void (*ack)(struct intel_display *display, struct intel_display_irq_state *state);
 };
 
 static const struct intel_display_irq_funcs gen11_display_irq_funcs = {
@@ -2543,6 +2544,7 @@ static const struct intel_display_irq_funcs gen8_display_irq_funcs = {
 static const struct intel_display_irq_funcs vlv_display_irq_funcs = {
        .reset = vlv_display_irq_reset,
        .postinstall = vlv_display_irq_postinstall,
+       .ack = vlv_display_irq_ack,
 };
 
 static const struct intel_display_irq_funcs ilk_display_irq_funcs = {
@@ -2553,11 +2555,13 @@ static const struct intel_display_irq_funcs ilk_display_irq_funcs = {
 static const struct intel_display_irq_funcs i965_display_irq_funcs = {
        .reset = i9xx_display_irq_reset,
        .postinstall = i965_display_irq_postinstall,
+       .ack = i9xx_display_irq_ack,
 };
 
 static const struct intel_display_irq_funcs i915_display_irq_funcs = {
        .reset = i9xx_display_irq_reset,
        .postinstall = i915_display_irq_postinstall,
+       .ack = i9xx_display_irq_ack,
 };
 
 void intel_display_irq_reset(struct intel_display *display)
@@ -2576,6 +2580,15 @@ void intel_display_irq_postinstall(struct intel_display *display)
        display->irq.funcs->postinstall(display);
 }
 
+void intel_display_irq_ack(struct intel_display *display,
+                          struct intel_display_irq_state *state)
+{
+       if (!HAS_DISPLAY(display) || !display->irq.funcs->ack)
+               return;
+
+       display->irq.funcs->ack(display, state);
+}
+
 void intel_display_irq_init(struct intel_display *display)
 {
        spin_lock_init(&display->irq.lock);
index 59ec673ffc9b1c5c674c0d47f085fb3636db7787..876ee171d74aa17d2f18d4451b76991873bb6e6e 100644 (file)
@@ -66,9 +66,7 @@ struct intel_display_irq_state {
 
 void intel_display_irq_reset(struct intel_display *display);
 void intel_display_irq_postinstall(struct intel_display *display);
-
-void vlv_display_irq_ack(struct intel_display *display, struct intel_display_irq_state *state);
-void i9xx_display_irq_ack(struct intel_display *display, struct intel_display_irq_state *state);
+void intel_display_irq_ack(struct intel_display *display, struct intel_display_irq_state *state);
 
 bool ilk_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state);
 bool gen8_display_irq_handler(struct intel_display *display, const struct intel_display_irq_state *state);
index 0d0ee2c43f0089ee57d248b38208174f2a2ed8c9..321dc1e573ccc72e4103be35fab2ae84956c07ce 100644 (file)
@@ -268,7 +268,7 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
                if (pm_iir)
                        intel_uncore_write(&dev_priv->uncore, GEN6_PMIIR, pm_iir);
 
-               vlv_display_irq_ack(display, &state);
+               intel_display_irq_ack(display, &state);
 
                /*
                 * VLV_IIR is single buffered, and reflects the level
@@ -338,7 +338,7 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 
                gen8_gt_irq_handler(to_gt(dev_priv), master_ctl);
 
-               vlv_display_irq_ack(display, &state);
+               intel_display_irq_ack(display, &state);
 
                /*
                 * VLV_IIR is single buffered, and reflects the level
@@ -873,7 +873,7 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
 
                ret = IRQ_HANDLED;
 
-               i9xx_display_irq_ack(display, &state);
+               intel_display_irq_ack(display, &state);
 
                if (state.iir & I915_MASTER_ERROR_INTERRUPT)
                        i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);
@@ -972,7 +972,7 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
 
                ret = IRQ_HANDLED;
 
-               i9xx_display_irq_ack(display, &state);
+               intel_display_irq_ack(display, &state);
 
                if (state.iir & I915_MASTER_ERROR_INTERRUPT)
                        i9xx_error_irq_ack(dev_priv, &eir, &eir_stuck);