]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/msm/dpu: fix vblank IRQ registration before atomic_mode_set
authorCédric Bellegarde <cedric.bellegarde@adishatz.org>
Wed, 18 Mar 2026 17:17:00 +0000 (18:17 +0100)
committerDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Wed, 25 Mar 2026 06:06:14 +0000 (08:06 +0200)
dpu_encoder_toggle_vblank_for_crtc() can call control_vblank_irq()
at any time in response to a userspace vblank request, independently
of the atomic commit sequence. If this happens before the encoder's
first atomic_mode_set(), irq[INTR_IDX_RDPTR] is still zero.

Passing irq_idx=0 to dpu_core_irq_register_callback() is treated as
invalid, and DPU_IRQ_REG(0) and DPU_IRQ_BIT(0) produce misleading
values of 134217727 and 31 respectively due to unsigned wraparound
in the (irq_idx - 1) macros, resulting in the confusing error:

  [dpu error]invalid IRQ=[134217727, 31]

Since irq[INTR_IDX_RDPTR] will be properly populated by
atomic_mode_set() and registered by irq_enable() as part of the
normal modeset sequence, silently skip the vblank IRQ registration
when the index has not yet been initialized. This matches the
existing pattern of the master encoder check above it.

Signed-off-by: Cédric Bellegarde <cedric.bellegarde@adishatz.org>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Patchwork: https://patchwork.freedesktop.org/patch/712752/
Link: https://lore.kernel.org/r/20260318171700.394945-1-cedric.bellegarde@adishatz.org
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c

index 93db1484f6069820408a951d1b209b3c9af22a75..45079ee59cf674fa0556082c7f3045a563812469 100644 (file)
@@ -257,6 +257,12 @@ static int dpu_encoder_phys_cmd_control_vblank_irq(
        if (!dpu_encoder_phys_cmd_is_master(phys_enc))
                goto end;
 
+       /* IRQ not yet initialized */
+       if (!phys_enc->irq[INTR_IDX_RDPTR]) {
+               ret = -EINVAL;
+               goto end;
+       }
+
        /* protect against negative */
        if (!enable && refcount == 0) {
                ret = -EINVAL;