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

Commit 41a52059 authored by Rob Clark's avatar Rob Clark
Browse files

drm/msm/dpu: handle_frame_done() from vblank irq



Previously the callback was called from whoever called wait_for_vblank(),
but that isn't a great plan when wait_for_vblank() stops getting called,
and results in frame_done_timer expiring.

Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Reviewed-by: default avatarSean Paul <sean@poorly.run>
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
parent fe9df3f5
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -313,12 +313,7 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)
				| DPU_ENCODER_FRAME_EVENT_PANEL_DEAD)) {

		if (atomic_read(&dpu_crtc->frame_pending) < 1) {
			/* this should not happen */
			DRM_ERROR("crtc%d ev:%u ts:%lld frame_pending:%d\n",
					crtc->base.id,
					fevent->event,
					ktime_to_ns(fevent->ts),
					atomic_read(&dpu_crtc->frame_pending));
			/* ignore vblank when not pending */
		} else if (atomic_dec_return(&dpu_crtc->frame_pending) == 0) {
			/* release bandwidth and other resources */
			trace_dpu_crtc_frame_event_done(DRMID(crtc),
+8 −17
Original line number Diff line number Diff line
@@ -324,6 +324,10 @@ static void dpu_encoder_phys_vid_vblank_irq(void *arg, int irq_idx)

	/* Signal any waiting atomic commit thread */
	wake_up_all(&phys_enc->pending_kickoff_wq);

	phys_enc->parent_ops->handle_frame_done(phys_enc->parent, phys_enc,
			DPU_ENCODER_FRAME_EVENT_DONE);

	DPU_ATRACE_END("vblank_irq");
}

@@ -483,8 +487,8 @@ static void dpu_encoder_phys_vid_get_hw_resources(
	hw_res->intfs[phys_enc->intf_idx - INTF_0] = INTF_MODE_VIDEO;
}

static int _dpu_encoder_phys_vid_wait_for_vblank(
		struct dpu_encoder_phys *phys_enc, bool notify)
static int dpu_encoder_phys_vid_wait_for_vblank(
		struct dpu_encoder_phys *phys_enc)
{
	struct dpu_encoder_wait_info wait_info;
	int ret;
@@ -499,10 +503,6 @@ static int _dpu_encoder_phys_vid_wait_for_vblank(
	wait_info.timeout_ms = KICKOFF_TIMEOUT_MS;

	if (!dpu_encoder_phys_vid_is_master(phys_enc)) {
		if (notify && phys_enc->parent_ops->handle_frame_done)
			phys_enc->parent_ops->handle_frame_done(
					phys_enc->parent, phys_enc,
					DPU_ENCODER_FRAME_EVENT_DONE);
		return 0;
	}

@@ -512,18 +512,9 @@ static int _dpu_encoder_phys_vid_wait_for_vblank(

	if (ret == -ETIMEDOUT) {
		dpu_encoder_helper_report_irq_timeout(phys_enc, INTR_IDX_VSYNC);
	} else if (!ret && notify && phys_enc->parent_ops->handle_frame_done)
		phys_enc->parent_ops->handle_frame_done(
				phys_enc->parent, phys_enc,
				DPU_ENCODER_FRAME_EVENT_DONE);

	return ret;
	}

static int dpu_encoder_phys_vid_wait_for_vblank(
		struct dpu_encoder_phys *phys_enc)
{
	return _dpu_encoder_phys_vid_wait_for_vblank(phys_enc, true);
	return ret;
}

static int dpu_encoder_phys_vid_wait_for_commit_done(
@@ -615,7 +606,7 @@ static void dpu_encoder_phys_vid_disable(struct dpu_encoder_phys *phys_enc)
	 * scanout buffer) don't latch properly..
	 */
	if (dpu_encoder_phys_vid_is_master(phys_enc)) {
		ret = _dpu_encoder_phys_vid_wait_for_vblank(phys_enc, false);
		ret = dpu_encoder_phys_vid_wait_for_vblank(phys_enc);
		if (ret) {
			atomic_set(&phys_enc->pending_kickoff_cnt, 0);
			DRM_ERROR("wait disable failed: id:%u intf:%d ret:%d\n",