From 225635a3f482aa45841eff9e6128a747e98933d7 Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann Date: Thu, 27 Aug 2026 10:23:45 +0200 Subject: [PATCH] drm/hibmc: Set up vblank event to be send on the next vblank Do not send the vblank event when the page flip completes, but when the vblank interrupt fires. Sending the vblank event at the wrong time can break synchronization of the display update with the vblank period. Use the vblank helper drm_crtc_vblank_atomic_flush(), which sets up the vblank event accordingly. In case of an error, it still sends out the vblank event immediately; thus not starving consumers. Signed-off-by: Thomas Zimmermann Reviewed-by: Yongbang Shi Link: https://patch.msgid.link/20260827082915.61176-3-tzimmermann@suse.de --- drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c index 33402cf54072..7849abd0488e 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "hibmc_drm_drv.h" #include "hibmc_drm_regs.h" @@ -420,19 +421,6 @@ static void hibmc_crtc_atomic_begin(struct drm_crtc *crtc, /* We can add more initialization as needed. */ } -static void hibmc_crtc_atomic_flush(struct drm_crtc *crtc, - struct drm_atomic_commit *state) - -{ - unsigned long flags; - - spin_lock_irqsave(&crtc->dev->event_lock, flags); - if (crtc->state->event) - drm_crtc_send_vblank_event(crtc, crtc->state->event); - crtc->state->event = NULL; - spin_unlock_irqrestore(&crtc->dev->event_lock, flags); -} - static int hibmc_crtc_enable_vblank(struct drm_crtc *crtc) { struct hibmc_drm_private *priv = to_hibmc_drm_private(crtc->dev); @@ -502,7 +490,7 @@ static const struct drm_crtc_funcs hibmc_crtc_funcs = { static const struct drm_crtc_helper_funcs hibmc_crtc_helper_funcs = { .mode_set_nofb = hibmc_crtc_mode_set_nofb, .atomic_begin = hibmc_crtc_atomic_begin, - .atomic_flush = hibmc_crtc_atomic_flush, + .atomic_flush = drm_crtc_vblank_atomic_flush, .atomic_enable = hibmc_crtc_atomic_enable, .atomic_disable = hibmc_crtc_atomic_disable, .mode_valid = hibmc_crtc_mode_valid,