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 <quic_agajjar@quicinc.com>
This commit is contained in:
@@ -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);
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user