From 4cb481f5f886f82e3eb3c844537a4d2ca742bcfe Mon Sep 17 00:00:00 2001 From: Akash Gajjar Date: Thu, 13 Jul 2023 18:47:41 +0530 Subject: [PATCH] disp: msm: sde: adjust the vblank refcount until the completion of poms In POMS use case, the handling of the wait for vsync event completion coincides with the concurrent drm_crtc_funcs.enable_vblank. This concurrency causes a vsync event complete timeout while disabling the encoder. to fix this concurrency problem, increment the vblank refcount in encoder disable and release the vblank refcount in encoder enable. Change-Id: I79671e4a2bafdd01a6b2523a80fe511bff23d6b6 Signed-off-by: Akash Gajjar --- msm/sde/sde_encoder.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 8e9c9f29..17762486 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -3271,6 +3271,10 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc) return; } + if (sde_encoder_is_built_in_display(drm_enc) && + msm_is_mode_seamless_poms(&c_state->msm_mode)) + drm_crtc_vblank_put(sde_enc->crtc); + memset(&sde_enc->cur_master->intf_cfg_v1, 0, sizeof(sde_enc->cur_master->intf_cfg_v1)); @@ -3359,6 +3363,7 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) struct sde_encoder_virt *sde_enc = NULL; struct sde_connector *sde_conn; struct sde_kms *sde_kms; + struct sde_connector_state *c_state = NULL; enum sde_intf_mode intf_mode; int ret, i = 0; @@ -3390,6 +3395,12 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) if (!sde_kms) return; + c_state = to_sde_connector_state(sde_enc->cur_master->connector->state); + if (!c_state) { + SDE_ERROR("invalid connector state\n"); + return; + } + intf_mode = sde_encoder_get_intf_mode(drm_enc); SDE_EVT32(DRMID(drm_enc)); @@ -3412,6 +3423,10 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) _sde_encoder_input_handler_unregister(drm_enc); flush_delayed_work(&sde_conn->status_work); + + if (sde_encoder_is_built_in_display(drm_enc) && + msm_is_mode_seamless_poms(&c_state->msm_mode)) + drm_crtc_vblank_get(sde_enc->crtc); /* * For primary command mode and video mode encoders, execute the * resource control pre-stop operations before the physical encoders @@ -3447,7 +3462,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) * wait for any pending vsync timestamp event to sf * to ensure vbalnk irq is disabled. */ - if (sde_enc->vblank_enabled) + if (sde_enc->vblank_enabled && + !msm_is_mode_seamless_poms(&c_state->msm_mode)) sde_encoder_wait_for_vsync_event_complete(sde_enc); /*