From b151e6660b0992fc0d388a56751b920ed27650f5 Mon Sep 17 00:00:00 2001 From: Lei Chen Date: Tue, 3 Aug 2021 15:29:27 +0800 Subject: [PATCH] disp: msm: sde: remove clearing cur_master in encoder enable function SDE IRQ callback can run in parallel thread to modeset after removing pp_done wait before pre_modeset. If cur_master is cleared in encoder enable function and irq callback is triggered at the same time, the irq callback could not be handled properly as cur_master is NULL. So remove clearing cur_master in encoder enable function to avoid the race condition between modeset and irq callback. Change-Id: I2059c699a68838b3c9f6a7dd658a35f178b18c42 Signed-off-by: Lei Chen --- msm/sde/sde_encoder.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 1fe64d66d7..50a351f7dd 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -2970,6 +2970,7 @@ static void sde_encoder_off_work(struct kthread_work *work) static void sde_encoder_virt_enable(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc = NULL; + bool has_master_enc = false; int i, ret = 0; struct sde_connector_state *c_state; struct drm_display_mode *cur_mode = NULL; @@ -2994,18 +2995,19 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc) SDE_DEBUG_ENC(sde_enc, "\n"); SDE_EVT32(DRMID(drm_enc), cur_mode->hdisplay, cur_mode->vdisplay); - sde_enc->cur_master = NULL; for (i = 0; i < sde_enc->num_phys_encs; i++) { struct sde_encoder_phys *phys = sde_enc->phys_encs[i]; if (phys && phys->ops.is_master && phys->ops.is_master(phys)) { SDE_DEBUG_ENC(sde_enc, "master is now idx %d\n", i); sde_enc->cur_master = phys; + has_master_enc = true; break; } } - if (!sde_enc->cur_master) { + if (!has_master_enc) { + sde_enc->cur_master = NULL; SDE_ERROR("virt encoder has no master! num_phys %d\n", i); return; }