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
