diff options
| author | Thomas Zimmermann <tzimmermann@suse.de> | 2026-08-27 10:23:45 +0200 |
|---|---|---|
| committer | Thomas Zimmermann <tzimmermann@suse.de> | 2026-09-10 09:47:32 +0200 |
| commit | 225635a3f482aa45841eff9e6128a747e98933d7 (patch) | |
| tree | 3d087801674be0590e408c52dd9a9abc8744bc00 | |
| parent | 6ddd3164f656a9af531b7180c64a158b55d12acc (diff) | |
| download | linux-next-225635a3f482aa45841eff9e6128a747e98933d7.tar.gz linux-next-225635a3f482aa45841eff9e6128a747e98933d7.zip | |
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 <tzimmermann@suse.de>
Reviewed-by: Yongbang Shi <shiyongbang@huawei.com>
Link: https://patch.msgid.link/20260827082915.61176-3-tzimmermann@suse.de
| -rw-r--r-- | drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 16 |
1 files 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 <drm/drm_gem_atomic_helper.h> #include <drm/drm_gem_framebuffer_helper.h> #include <drm/drm_vblank.h> +#include <drm/drm_vblank_helper.h> #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, |
