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()

Signed-off-by: Jani Nikula <[email protected]>
---
 .../gpu/drm/i915/display/intel_display_irq.c  | 21 +++++++++++++++----
 .../gpu/drm/i915/display/intel_display_irq.h  |  4 +---
 drivers/gpu/drm/i915/i915_irq.c               |  8 +++----
 3 files changed, 22 insertions(+), 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 672fd4f245ff..c777b7f249c8 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.c
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.c
@@ -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);
diff --git a/drivers/gpu/drm/i915/display/intel_display_irq.h 
b/drivers/gpu/drm/i915/display/intel_display_irq.h
index 59ec673ffc9b..876ee171d74a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_irq.h
+++ b/drivers/gpu/drm/i915/display/intel_display_irq.h
@@ -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);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 0d0ee2c43f00..321dc1e573cc 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -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);
-- 
2.47.3

Reply via email to