From ba95cccfecba2a18d5a388a0d6f75bb36e6d8aca Mon Sep 17 00:00:00 2001 From: Samantha Tran Date: Wed, 12 May 2021 09:33:24 -0700 Subject: [PATCH] disp: msm: sde: avoid idle pc during ESD recovery This change prevents entering into idle pc during ESD recovery. In the event of a panel dead scenario, the panel TE is no longer valid until display is enabled again. Until the time display is enabled, idle pc will be blocked so that display does not fall into then exit idle pc and attempt to set the vsync source to this invalid panel TE. Change-Id: Ibdc71b803d50923832f08b238a96aa28854aaea0 Signed-off-by: Samantha Tran --- msm/sde/sde_connector.c | 2 +- msm/sde/sde_encoder.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 6e3dc0a049..2b4154b6b6 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -2494,10 +2494,10 @@ static void _sde_connector_report_panel_dead(struct sde_connector *conn, return; SDE_EVT32(SDE_EVTLOG_ERROR); + conn->panel_dead = true; sde_encoder_display_failure_notification(conn->encoder, skip_pre_kickoff); - conn->panel_dead = true; event.type = DRM_EVENT_PANEL_DEAD; event.length = sizeof(bool); msm_mode_object_event_notify(&conn->base.base, diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 2a6fc4f536..9b6a0580c7 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -2074,23 +2074,27 @@ static int _sde_encoder_rc_idle(struct drm_encoder *drm_enc, struct sde_kms *sde_kms; struct drm_crtc *crtc = drm_enc->crtc; struct sde_crtc *sde_crtc = to_sde_crtc(crtc); + struct sde_connector *sde_conn; priv = drm_enc->dev->dev_private; sde_kms = to_sde_kms(priv->kms); + sde_conn = to_sde_connector(sde_enc->cur_master->connector); mutex_lock(&sde_enc->rc_lock); - if (sde_enc->rc_state != SDE_ENC_RC_STATE_ON) { + if (sde_conn->panel_dead) { + SDE_DEBUG_ENC(sde_enc, "skip idle. Panel in dead state\n"); + SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, SDE_EVTLOG_ERROR); + goto end; + } else if (sde_enc->rc_state != SDE_ENC_RC_STATE_ON) { SDE_DEBUG_ENC(sde_enc, "sw_event:%d, rc:%d !ON state\n", sw_event, sde_enc->rc_state); - SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, - SDE_EVTLOG_ERROR); + SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, SDE_EVTLOG_ERROR); goto end; } else if (sde_crtc_frame_pending(sde_enc->crtc)) { SDE_DEBUG_ENC(sde_enc, "skip idle entry"); SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state, - sde_crtc_frame_pending(sde_enc->crtc), - SDE_EVTLOG_ERROR); + sde_crtc_frame_pending(sde_enc->crtc), SDE_EVTLOG_ERROR); _sde_encoder_rc_kickoff_delayed(sde_enc, sw_event); goto end; }