disp: msm: sde: manage vblank refcount concurrency

Vblank refcount can reach out of sync with below case
 1. event_thread triggers the vblank_enable
 2. commit_thread triggers the modeset
   2.a modeset resets the vblank refcount with mode_set
 3. event_thread triggers the vblank_disable

Event 2.a resets the vblank refcount and vblank disable
request after 2.a is going to fail. This can be fixed
by avoiding concurrency between mode_set call and vblank
request.

Change-Id: Ibb810ec90e81d63feee443f1c37dd736d5cfac0d
Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
This commit is contained in:
Dhaval Patel
2020-06-12 15:39:33 -07:00
committed by Gerrit - the friendly Code Review server
父節點 743dc695c4
當前提交 44cde01fc7
共有 5 個文件被更改,包括 37 次插入27 次删除

查看文件

@@ -365,15 +365,7 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
cur_work->crtc_id = crtc_id;
cur_work->enable = enable;
cur_work->priv = priv;
/* During modeset scenario, vblank request is queued to
* display thread to avoid enabling irq resulting in
* vblank refcount mismatch
*/
if (crtc->state && drm_atomic_crtc_needs_modeset(crtc->state))
worker = &priv->disp_thread[crtc_id].worker;
else
worker = &priv->event_thread[crtc_id].worker;
worker = &priv->event_thread[crtc_id].worker;
kthread_queue_work(worker, &cur_work->work);
return 0;