Browse Source

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 <[email protected]>
Samantha Tran 4 years ago
parent
commit
ba95cccfec
2 changed files with 10 additions and 6 deletions
  1. 1 1
      msm/sde/sde_connector.c
  2. 9 5
      msm/sde/sde_encoder.c

+ 1 - 1
msm/sde/sde_connector.c

@@ -2494,10 +2494,10 @@ static void _sde_connector_report_panel_dead(struct sde_connector *conn,
 		return;
 		return;
 
 
 	SDE_EVT32(SDE_EVTLOG_ERROR);
 	SDE_EVT32(SDE_EVTLOG_ERROR);
+	conn->panel_dead = true;
 	sde_encoder_display_failure_notification(conn->encoder,
 	sde_encoder_display_failure_notification(conn->encoder,
 		skip_pre_kickoff);
 		skip_pre_kickoff);
 
 
-	conn->panel_dead = true;
 	event.type = DRM_EVENT_PANEL_DEAD;
 	event.type = DRM_EVENT_PANEL_DEAD;
 	event.length = sizeof(bool);
 	event.length = sizeof(bool);
 	msm_mode_object_event_notify(&conn->base.base,
 	msm_mode_object_event_notify(&conn->base.base,

+ 9 - 5
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 sde_kms *sde_kms;
 	struct drm_crtc *crtc = drm_enc->crtc;
 	struct drm_crtc *crtc = drm_enc->crtc;
 	struct sde_crtc *sde_crtc = to_sde_crtc(crtc);
 	struct sde_crtc *sde_crtc = to_sde_crtc(crtc);
+	struct sde_connector *sde_conn;
 
 
 	priv = drm_enc->dev->dev_private;
 	priv = drm_enc->dev->dev_private;
 	sde_kms = to_sde_kms(priv->kms);
 	sde_kms = to_sde_kms(priv->kms);
+	sde_conn = to_sde_connector(sde_enc->cur_master->connector);
 
 
 	mutex_lock(&sde_enc->rc_lock);
 	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",
 		SDE_DEBUG_ENC(sde_enc, "sw_event:%d, rc:%d !ON state\n",
 				sw_event, sde_enc->rc_state);
 				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;
 		goto end;
 	} else if (sde_crtc_frame_pending(sde_enc->crtc)) {
 	} else if (sde_crtc_frame_pending(sde_enc->crtc)) {
 		SDE_DEBUG_ENC(sde_enc, "skip idle entry");
 		SDE_DEBUG_ENC(sde_enc, "skip idle entry");
 		SDE_EVT32(DRMID(drm_enc), sw_event, sde_enc->rc_state,
 		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);
 		_sde_encoder_rc_kickoff_delayed(sde_enc, sw_event);
 		goto end;
 		goto end;
 	}
 	}