Hi, Jason: Jason-JH.Lin <jason-jh.lin@xxxxxxxxxxxx> 於 2024年12月11日 週三 上午11:47寫道: > > mtk_crtc_finish_page_flip() is used to notify userspace that a > page flip has been completed, allowing userspace to free the frame > buffer of the last frame and commit the next frame. > > In MediaTek's hardware design for configuring display hardware by using > GCE, `DRM_EVENT_FLIP_COMPLETE` should be notified to userspace after > GCE has finished configuring all display hardware settings for each > atomic_commit(). > > Currently, mtk_crtc_finish_page_flip() cannot guarantee that GCE has > configured all the display hardware settings of the last frame. > Therefore, to increase the accuracy of the timing for notifying > `DRM_EVENT_FLIP_COMPLETE` to userspace, mtk_crtc_finish_page_flip() > should be moved to ddp_cmdq_cb(). Applied to mediatek-drm-fixes [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-fixes Regards, Chun-Kuang. > > Fixes: 7f82d9c43879 ("drm/mediatek: Clear pending flag when cmdq packet is done") > Signed-off-by: Jason-JH.Lin <jason-jh.lin@xxxxxxxxxxxx> > --- > drivers/gpu/drm/mediatek/mtk_crtc.c | 25 +++++++++++++++++++------ > 1 file changed, 19 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_crtc.c b/drivers/gpu/drm/mediatek/mtk_crtc.c > index eb0e1233ad04..5674f5707cca 100644 > --- a/drivers/gpu/drm/mediatek/mtk_crtc.c > +++ b/drivers/gpu/drm/mediatek/mtk_crtc.c > @@ -112,6 +112,11 @@ static void mtk_drm_finish_page_flip(struct mtk_crtc *mtk_crtc) > > drm_crtc_handle_vblank(&mtk_crtc->base); > > +#if IS_REACHABLE(CONFIG_MTK_CMDQ) > + if (mtk_crtc->cmdq_client.chan) > + return; > +#endif > + > spin_lock_irqsave(&mtk_crtc->config_lock, flags); > if (!mtk_crtc->config_updating && mtk_crtc->pending_needs_vblank) { > mtk_crtc_finish_page_flip(mtk_crtc); > @@ -284,10 +289,8 @@ static void ddp_cmdq_cb(struct mbox_client *cl, void *mssg) > state = to_mtk_crtc_state(mtk_crtc->base.state); > > spin_lock_irqsave(&mtk_crtc->config_lock, flags); > - if (mtk_crtc->config_updating) { > - spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); > + if (mtk_crtc->config_updating) > goto ddp_cmdq_cb_out; > - } > > state->pending_config = false; > > @@ -315,10 +318,15 @@ static void ddp_cmdq_cb(struct mbox_client *cl, void *mssg) > mtk_crtc->pending_async_planes = false; > } > > - spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); > - > ddp_cmdq_cb_out: > > + if (mtk_crtc->pending_needs_vblank) { > + mtk_crtc_finish_page_flip(mtk_crtc); > + mtk_crtc->pending_needs_vblank = false; > + } > + > + spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); > + > mtk_crtc->cmdq_vblank_cnt = 0; > wake_up(&mtk_crtc->cb_blocking_queue); > } > @@ -606,13 +614,18 @@ static void mtk_crtc_update_config(struct mtk_crtc *mtk_crtc, bool needs_vblank) > */ > mtk_crtc->cmdq_vblank_cnt = 3; > > + spin_lock_irqsave(&mtk_crtc->config_lock, flags); > + mtk_crtc->config_updating = false; > + spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); > + > mbox_send_message(mtk_crtc->cmdq_client.chan, cmdq_handle); > mbox_client_txdone(mtk_crtc->cmdq_client.chan, 0); > } > -#endif > +#else > spin_lock_irqsave(&mtk_crtc->config_lock, flags); > mtk_crtc->config_updating = false; > spin_unlock_irqrestore(&mtk_crtc->config_lock, flags); > +#endif > > mutex_unlock(&mtk_crtc->hw_lock); > } > -- > 2.43.0 >