disp: msm: sde: fix release fence signaling in error cases

Handle release fence/frame-done error signalling for
error case like esd failure, pp_done timeout, interrupt
disable on cpu, etc. It fixes the race condition for
pending_frame count update and also triggers correct
wait function for wr_ptr wait failure.

Change-Id: Iad08f20592c97221a1626bb40e607c398a9812b6
Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
This commit is contained in:
Veera Sundaram Sankaran
2019-07-30 12:43:37 -07:00
committed by Dhaval Patel
parent 9081908beb
commit 5a2dfc1e83
3 changed files with 35 additions and 30 deletions

View File

@@ -3362,6 +3362,7 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
sde_enc->phys_encs[i]->cont_splash_enabled = false;
sde_enc->phys_encs[i]->connector = NULL;
}
atomic_set(&sde_enc->frame_done_cnt[i], 0);
}
sde_enc->cur_master = NULL;
@@ -3647,8 +3648,7 @@ static void sde_encoder_frame_done_callback(
/* One of the physical encoders has become idle */
for (i = 0; i < sde_enc->num_phys_encs; i++) {
if ((sde_enc->phys_encs[i] == ready_phys) ||
(event & SDE_ENCODER_FRAME_EVENT_ERROR)) {
if (sde_enc->phys_encs[i] == ready_phys) {
SDE_EVT32_VERBOSE(DRMID(drm_enc), i,
atomic_read(&sde_enc->frame_done_cnt[i]));
if (!atomic_add_unless(