From 46e0ac33540878b7b903e421f8025f0c76da418e Mon Sep 17 00:00:00 2001 From: Jeykumar Sankaran Date: Mon, 12 Oct 2020 23:16:01 -0700 Subject: [PATCH 1/3] disp: msm: sde: remove HARD_RESET recovery event on frame-timeouts only On frame timeouts, the driver should only be responsible for reporting the error event to user space clients. Handling of the error events should be left to the user space clients. This change removes explicit mechanism in SDE driver to track error events for a pre-defined threshold levels and RESET hints sent to the user space on handling those error events during frame timeouts. Change-Id: I7bdf2495fae6430384b4031a7edf043b6efe88c5 Signed-off-by: Jeykumar Sankaran --- msm/sde/sde_encoder_phys_cmd.c | 12 +++--------- msm/sde/sde_encoder_phys_vid.c | 16 ++++------------ 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/msm/sde/sde_encoder_phys_cmd.c b/msm/sde/sde_encoder_phys_cmd.c index 9fbafb26b1..fe2af2422a 100644 --- a/msm/sde/sde_encoder_phys_cmd.c +++ b/msm/sde/sde_encoder_phys_cmd.c @@ -23,8 +23,6 @@ #define to_sde_encoder_phys_cmd(x) \ container_of(x, struct sde_encoder_phys_cmd, base) -#define PP_TIMEOUT_MAX_TRIALS 4 - /* * Tearcheck sync start and continue thresholds are empirically found * based on common panels In the future, may want to allow panels to override @@ -507,7 +505,6 @@ static int _sde_encoder_phys_cmd_handle_ppdone_timeout( u32 frame_event = SDE_ENCODER_FRAME_EVENT_ERROR | SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE; struct drm_connector *conn; - int event; u32 pending_kickoff_cnt; unsigned long lock_flags; @@ -553,14 +550,11 @@ static int _sde_encoder_phys_cmd_handle_ppdone_timeout( * if the recovery event is registered by user, don't panic * trigger panic on first timeout if no listener registered */ - if (recovery_events) { - event = cmd_enc->pp_timeout_report_cnt > PP_TIMEOUT_MAX_TRIALS ? - SDE_RECOVERY_HARD_RESET : SDE_RECOVERY_CAPTURE; + if (recovery_events) sde_connector_event_notify(conn, DRM_EVENT_SDE_HW_RECOVERY, - sizeof(uint8_t), event); - } else if (cmd_enc->pp_timeout_report_cnt) { + sizeof(uint8_t), SDE_RECOVERY_CAPTURE); + else if (cmd_enc->pp_timeout_report_cnt) SDE_DBG_DUMP("dsi_dbg_bus", "panic"); - } /* request a ctl reset before the next kickoff */ phys_enc->enable_state = SDE_ENC_ERR_NEEDS_HW_RESET; diff --git a/msm/sde/sde_encoder_phys_vid.c b/msm/sde/sde_encoder_phys_vid.c index 2c556c4ffc..a69fbd685c 100644 --- a/msm/sde/sde_encoder_phys_vid.c +++ b/msm/sde/sde_encoder_phys_vid.c @@ -26,9 +26,6 @@ #define to_sde_encoder_phys_vid(x) \ container_of(x, struct sde_encoder_phys_vid, base) -/* maximum number of consecutive kickoff errors */ -#define KICKOFF_MAX_ERRORS 2 - /* Poll time to do recovery during active region */ #define POLL_TIME_USEC_FOR_LN_CNT 500 #define MAX_POLL_CNT 10 @@ -931,7 +928,6 @@ static int sde_encoder_phys_vid_prepare_for_kickoff( struct sde_hw_ctl *ctl; bool recovery_events; struct drm_connector *conn; - int event; int rc; if (!phys_enc || !params || !phys_enc->hw_ctl) { @@ -973,15 +969,11 @@ static int sde_encoder_phys_vid_prepare_for_kickoff( * if the recovery event is registered by user, don't panic * trigger panic on first timeout if no listener registered */ - if (recovery_events) { - event = vid_enc->error_count > KICKOFF_MAX_ERRORS ? - SDE_RECOVERY_HARD_RESET : SDE_RECOVERY_CAPTURE; - sde_connector_event_notify(conn, - DRM_EVENT_SDE_HW_RECOVERY, - sizeof(uint8_t), event); - } else { + if (recovery_events) + sde_connector_event_notify(conn, DRM_EVENT_SDE_HW_RECOVERY, + sizeof(uint8_t), SDE_RECOVERY_CAPTURE); + else SDE_DBG_DUMP("panic"); - } /* request a ctl reset before the next flush */ phys_enc->enable_state = SDE_ENC_ERR_NEEDS_HW_RESET; From 643e9c2d80d317940f9cd32cb5cce53da00d763a Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Wed, 18 Nov 2020 16:34:03 -0800 Subject: [PATCH 2/3] disp: msm: sde: move vm-ownership check to crtc custom events Currently all the custom event register/unregister calls are blocked based on the vm-ownership checks. Avoid this check for connector events as it has only software updates unlike the crtc events which directly touch the HW registers. This allows the connector events to be registered before the first commit where the VM ownership is obtained. Change-Id: Id78e365929cb958ead10221b9267f1c1c0406a27 Signed-off-by: Veera Sundaram Sankaran --- msm/sde/sde_kms.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 745001b7ef..498349cb88 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -4595,18 +4595,24 @@ static int _sde_kms_register_events(struct msm_kms *kms, } sde_kms = to_sde_kms(kms); - vm_ops = sde_vm_get_ops(sde_kms); - sde_vm_lock(sde_kms); - if (vm_ops && vm_ops->vm_owns_hw && !vm_ops->vm_owns_hw(sde_kms)) { - sde_vm_unlock(sde_kms); - DRM_INFO("HW is owned by other VM\n"); - return -EACCES; - } + /* check vm ownership, if event registration requires HW access */ switch (obj->type) { case DRM_MODE_OBJECT_CRTC: + vm_ops = sde_vm_get_ops(sde_kms); + sde_vm_lock(sde_kms); + + if (vm_ops && vm_ops->vm_owns_hw + && !vm_ops->vm_owns_hw(sde_kms)) { + sde_vm_unlock(sde_kms); + SDE_DEBUG("HW is owned by other VM\n"); + return -EACCES; + } + crtc = obj_to_crtc(obj); ret = sde_crtc_register_custom_event(sde_kms, crtc, event, en); + + sde_vm_unlock(sde_kms); break; case DRM_MODE_OBJECT_CONNECTOR: conn = obj_to_connector(obj); @@ -4615,7 +4621,6 @@ static int _sde_kms_register_events(struct msm_kms *kms, break; } - sde_vm_unlock(sde_kms); return ret; } From db67b18a28c68e02cc52eb069de1307858b73278 Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Wed, 18 Nov 2020 19:32:43 -0800 Subject: [PATCH 3/3] disp: msm: dsi: avoid TE status check based on rechecks count The rechecks count in dsi_display_status_check_te defines the number of times the TE status needs to be checked before exiting. Avoid the execution if rechecks is set to zero as it would avoid unnecessary irq status changes. Change-Id: Ice31701ac06f5b0a82f29b5f415dcb0b055e7b16 Signed-off-by: Veera Sundaram Sankaran --- msm/dsi/dsi_display.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index b32a066b0b..59db8afd22 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -800,6 +800,9 @@ static int dsi_display_status_check_te(struct dsi_display *display, int rc = 1, i = 0; int const esd_te_timeout = msecs_to_jiffies(3*20); + if (!rechecks) + return rc; + dsi_display_change_te_irq_status(display, true); for (i = 0; i < rechecks; i++) {