Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0fcbf8f authored by Veera Sundaram Sankaran's avatar Veera Sundaram Sankaran
Browse files

drm/msm/sde: move UBWC error logging to frame event callback



Check and log the UWBC error status of all the planes
in the frame event callback before queuing it to the
worker thread. This will ensure that the clks are enabled
at this point as this happens from the vsync/pp-done
interrupt context.

Change-Id: I826da30e1b1ffe3e5c7cd076460a762495fc643d
Signed-off-by: default avatarVeera Sundaram Sankaran <veeras@codeaurora.org>
parent 1943573b
Loading
Loading
Loading
Loading
+20 −19
Original line number Original line Diff line number Diff line
@@ -2200,6 +2200,8 @@ static void sde_crtc_frame_event_cb(void *data, u32 event)
	struct msm_drm_private *priv;
	struct msm_drm_private *priv;
	struct sde_crtc_frame_event *fevent;
	struct sde_crtc_frame_event *fevent;
	struct sde_crtc_frame_event_cb_data *cb_data;
	struct sde_crtc_frame_event_cb_data *cb_data;
	struct drm_plane *plane;
	u32 ubwc_error;
	unsigned long flags;
	unsigned long flags;
	u32 crtc_id;
	u32 crtc_id;


@@ -2235,6 +2237,24 @@ static void sde_crtc_frame_event_cb(void *data, u32 event)
		return;
		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)) {
		drm_for_each_plane_mask(plane, crtc->dev,
						sde_crtc->plane_mask_old) {
			ubwc_error = sde_plane_get_ubwc_error(plane);
			if (ubwc_error) {
				SDE_EVT32(DRMID(crtc), DRMID(plane),
						ubwc_error, SDE_EVTLOG_ERROR);
				SDE_DEBUG("crtc%d plane %d ubwc_error %d\n",
						DRMID(crtc), DRMID(plane),
						ubwc_error);
				sde_plane_clear_ubwc_error(plane);
			}
		}
	}

	fevent->event = event;
	fevent->event = event;
	fevent->crtc = crtc;
	fevent->crtc = crtc;
	fevent->connector = cb_data->connector;
	fevent->connector = cb_data->connector;
@@ -2388,9 +2408,6 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
	struct drm_crtc *crtc;
	struct drm_crtc *crtc;
	struct sde_crtc *sde_crtc;
	struct sde_crtc *sde_crtc;
	struct sde_kms *sde_kms;
	struct sde_kms *sde_kms;
	struct drm_plane *plane;
	u32 ubwc_error;
	bool frame_done_event = false;
	unsigned long flags;
	unsigned long flags;
	bool in_clone_mode = false;
	bool in_clone_mode = false;


@@ -2446,7 +2463,6 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
			SDE_EVT32_VERBOSE(DRMID(crtc), fevent->event,
			SDE_EVT32_VERBOSE(DRMID(crtc), fevent->event,
							SDE_EVTLOG_FUNC_CASE3);
							SDE_EVTLOG_FUNC_CASE3);
		}
		}
		frame_done_event = true;
	}
	}


	if (fevent->event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE) {
	if (fevent->event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE) {
@@ -2467,21 +2483,6 @@ static void sde_crtc_frame_event_work(struct kthread_work *work)
		SDE_ERROR("crtc%d ts:%lld received panel dead event\n",
		SDE_ERROR("crtc%d ts:%lld received panel dead event\n",
				crtc->base.id, ktime_to_ns(fevent->ts));
				crtc->base.id, ktime_to_ns(fevent->ts));


	if (frame_done_event) {
		drm_for_each_plane_mask(plane, crtc->dev,
						sde_crtc->plane_mask_old) {
			ubwc_error = sde_plane_get_ubwc_error(plane);
			if (ubwc_error) {
				SDE_EVT32(DRMID(crtc), DRMID(plane),
						ubwc_error, SDE_EVTLOG_ERROR);
				SDE_DEBUG("crtc%d plane %d ubwc_error %d\n",
						DRMID(crtc), DRMID(plane),
						ubwc_error);
				sde_plane_clear_ubwc_error(plane);
			}
		}
	}

	spin_lock_irqsave(&sde_crtc->spin_lock, flags);
	spin_lock_irqsave(&sde_crtc->spin_lock, flags);
	list_add_tail(&fevent->list, &sde_crtc->frame_event_list);
	list_add_tail(&fevent->list, &sde_crtc->frame_event_list);
	spin_unlock_irqrestore(&sde_crtc->spin_lock, flags);
	spin_unlock_irqrestore(&sde_crtc->spin_lock, flags);