From 58bff0115ebe0bf8d12fe62eb66fe9e653fc5e55 Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Thu, 1 Sep 2022 21:40:58 -0700 Subject: [PATCH] disp: msm: sde: move some frame_events from crtc commit to event thread Move frame data stats collection/notification during frame-done and retire fence sysfs notification to event thread. This will free up some interrupt time. Change-Id: I2648ac4287ce8712e9a059edd408a59753aa6d32 Signed-off-by: Veera Sundaram Sankaran --- msm/sde/sde_crtc.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index fa50d1113f..1ebf361fea 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -2823,24 +2823,11 @@ static void sde_crtc_frame_event_cb(void *data, u32 event, ktime_t ts) spin_unlock_irqrestore(&sde_crtc->fevent_spin_lock, flags); if (!fevent) { - SDE_ERROR("crtc%d event %d overflow\n", - crtc->base.id, event); + SDE_ERROR("crtc%d event %d overflow\n", DRMID(crtc), event); SDE_EVT32(DRMID(crtc), event); return; } - /* log and clear plane ubwc errors if any */ - if (event & (SDE_ENCODER_FRAME_EVENT_ERROR - | SDE_ENCODER_FRAME_EVENT_PANEL_DEAD - | SDE_ENCODER_FRAME_EVENT_DONE)) - sde_crtc_get_frame_data(crtc); - - if ((event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE) && - (sde_crtc && sde_crtc->retire_frame_event_sf)) { - sde_crtc->retire_frame_event_time = ktime_get(); - sysfs_notify_dirent(sde_crtc->retire_frame_event_sf); - } - fevent->event = event; fevent->ts = ts; fevent->crtc = crtc; @@ -3103,6 +3090,7 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) struct sde_kms *sde_kms; unsigned long flags; bool in_clone_mode = false; + int ret; if (!work) { SDE_ERROR("invalid work handle\n"); @@ -3137,6 +3125,17 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) if (!in_clone_mode && (fevent->event & (SDE_ENCODER_FRAME_EVENT_ERROR | SDE_ENCODER_FRAME_EVENT_PANEL_DEAD | SDE_ENCODER_FRAME_EVENT_DONE))) { + + ret = pm_runtime_resume_and_get(crtc->dev->dev); + if (ret < 0) { + SDE_ERROR("failed to enable power resource %d\n", ret); + SDE_EVT32(ret, SDE_EVTLOG_ERROR); + } else { + /* log and clear plane ubwc errors if any */ + sde_crtc_get_frame_data(crtc); + pm_runtime_put_sync(crtc->dev->dev); + } + if (atomic_read(&sde_crtc->frame_pending) < 1) { /* this should not happen */ SDE_ERROR("crtc%d ts:%lld invalid frame_pending:%d\n", @@ -3168,11 +3167,17 @@ static void sde_crtc_frame_event_work(struct kthread_work *work) SDE_ATRACE_END("signal_release_fence"); } - if (fevent->event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE) + if (fevent->event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE) { + if (sde_crtc->retire_frame_event_sf) { + sde_crtc->retire_frame_event_time = fevent->ts; + sysfs_notify_dirent(sde_crtc->retire_frame_event_sf); + } + /* this api should be called without spin_lock */ _sde_crtc_retire_event(fevent->connector, fevent->ts, (fevent->event & SDE_ENCODER_FRAME_EVENT_ERROR) ? SDE_FENCE_SIGNAL_ERROR : SDE_FENCE_SIGNAL); + } if (fevent->event & SDE_ENCODER_FRAME_EVENT_PANEL_DEAD) SDE_ERROR("crtc%d ts:%lld received panel dead event\n",