diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index d0a7bb1eaa..ba2efe1cdd 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -1918,7 +1918,8 @@ static int sde_connector_atomic_check(struct drm_connector *connector, return 0; } -static void _sde_connector_report_panel_dead(struct sde_connector *conn) +static void _sde_connector_report_panel_dead(struct sde_connector *conn, + bool skip_pre_kickoff) { struct drm_event event; @@ -1938,7 +1939,8 @@ static void _sde_connector_report_panel_dead(struct sde_connector *conn) event.length = sizeof(bool); msm_mode_object_event_notify(&conn->base.base, conn->base.dev, &event, (u8 *)&conn->panel_dead); - sde_encoder_display_failure_notification(conn->encoder); + sde_encoder_display_failure_notification(conn->encoder, + skip_pre_kickoff); SDE_EVT32(SDE_EVTLOG_ERROR); SDE_ERROR("esd check failed report PANEL_DEAD conn_id: %d enc_id: %d\n", conn->base.base.id, conn->encoder->base.id); @@ -1973,7 +1975,7 @@ int sde_connector_esd_status(struct drm_connector *conn) if (ret <= 0) { /* cancel if any pending esd work */ sde_connector_schedule_status_work(conn, false); - _sde_connector_report_panel_dead(sde_conn); + _sde_connector_report_panel_dead(sde_conn, true); ret = -ETIMEDOUT; } else { SDE_DEBUG("Successfully received TE from panel\n"); @@ -2021,7 +2023,7 @@ static void sde_connector_check_status_work(struct work_struct *work) return; } - _sde_connector_report_panel_dead(conn); + _sde_connector_report_panel_dead(conn, false); } static const struct drm_connector_helper_funcs sde_connector_helper_ops = { diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index cfcef3269b..4b8c13828b 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -5838,7 +5838,8 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder, return ret; } -int sde_encoder_display_failure_notification(struct drm_encoder *enc) +int sde_encoder_display_failure_notification(struct drm_encoder *enc, + bool skip_pre_kickoff) { struct msm_drm_thread *event_thread = NULL; struct msm_drm_private *priv = NULL; @@ -5864,9 +5865,11 @@ int sde_encoder_display_failure_notification(struct drm_encoder *enc) event_thread = &priv->event_thread[sde_enc->crtc->index]; - kthread_queue_work(&event_thread->worker, - &sde_enc->esd_trigger_work); - kthread_flush_work(&sde_enc->esd_trigger_work); + if (!skip_pre_kickoff) { + kthread_queue_work(&event_thread->worker, + &sde_enc->esd_trigger_work); + kthread_flush_work(&sde_enc->esd_trigger_work); + } /** * panel may stop generating te signal (vsync) during esd failure. rsc @@ -5875,7 +5878,8 @@ int sde_encoder_display_failure_notification(struct drm_encoder *enc) */ _sde_encoder_switch_to_watchdog_vsync(enc); - sde_encoder_wait_for_event(enc, MSM_ENC_TX_COMPLETE); + if (!skip_pre_kickoff) + sde_encoder_wait_for_event(enc, MSM_ENC_TX_COMPLETE); return 0; } diff --git a/msm/sde/sde_encoder.h b/msm/sde/sde_encoder.h index 098ccf088c..973f075e11 100644 --- a/msm/sde/sde_encoder.h +++ b/msm/sde/sde_encoder.h @@ -255,9 +255,12 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder, * * TODO: manage the event at sde_kms level for forward processing. * @drm_enc: Pointer to drm encoder structure + * @skip_pre_kickoff: Caller can avoid pre_kickoff if it is triggering this + * event only to switch the panel TE to watchdog mode. * @Return: true if successful in updating the encoder structure */ -int sde_encoder_display_failure_notification(struct drm_encoder *enc); +int sde_encoder_display_failure_notification(struct drm_encoder *enc, + bool skip_pre_kickoff); /** * sde_encoder_recovery_events_enabled - checks if client has enabled