summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Zimmermann <tzimmermann@suse.de>2026-08-27 10:23:45 +0200
committerThomas Zimmermann <tzimmermann@suse.de>2026-09-10 09:47:32 +0200
commit225635a3f482aa45841eff9e6128a747e98933d7 (patch)
tree3d087801674be0590e408c52dd9a9abc8744bc00
parent6ddd3164f656a9af531b7180c64a158b55d12acc (diff)
downloadlinux-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.c16
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,