Browse Source

Merge "disp: msm: sde: avoid idle pc during ESD recovery"

qctecmdr 4 years ago
parent
commit
057a68cd55
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;
 
 	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,

+ 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 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;
 	}