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

Commit d0a22cfc authored by Benjamin Chan's avatar Benjamin Chan Committed by Alan Kwong
Browse files

msm: sde: Wait for Rotator HW complete if stop streaming timeout



SDE rotator commit handler is running under workqueue, and it is
possible that it gets blocked longer than the expected timeout setting
in fence timeout and stream stop timeout. In the case of stream stop
wait timeout, it is important to wait for the rotator commit handler
finished by issuing a cancel request, to ensure buffer resources are
safe to release in the V4L2 framework.

CRs-Fixed: 2013724
Change-Id: I40bbbd8072bf6d0bf1f0d61cc1668a431b12f707
Signed-off-by: default avatarBenjamin Chan <bkchan@codeaurora.org>
parent 6db7eb5f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2007,7 +2007,7 @@ static void sde_rotator_cancel_request(struct sde_rot_mgr *mgr,
	devm_kfree(&mgr->pdev->dev, req);
}

static void sde_rotator_cancel_all_requests(struct sde_rot_mgr *mgr,
void sde_rotator_cancel_all_requests(struct sde_rot_mgr *mgr,
	struct sde_rot_file_private *private)
{
	struct sde_rot_entry_container *req, *req_next;
+8 −0
Original line number Diff line number Diff line
@@ -685,6 +685,14 @@ int sde_rotator_validate_request(struct sde_rot_mgr *rot_dev,
 */
int sde_rotator_clk_ctrl(struct sde_rot_mgr *mgr, int enable);

/*
 * sde_rotator_cancel_all_requests - cancel all outstanding requests
 * @mgr: Pointer to rotator manager
 * @private: Pointer to rotator manager per file context
 */
void sde_rotator_cancel_all_requests(struct sde_rot_mgr *mgr,
	struct sde_rot_file_private *private);

/*
 * sde_rot_mgr_lock - serialization lock prior to rotator manager calls
 * @mgr: Pointer to rotator manager
+5 −1
Original line number Diff line number Diff line
@@ -450,11 +450,15 @@ static void sde_rotator_stop_streaming(struct vb2_queue *q)
			list_empty(&ctx->pending_list),
			msecs_to_jiffies(rot_dev->streamoff_timeout));
	mutex_lock(q->lock);
	if (!ret)
	if (!ret) {
		SDEDEV_ERR(rot_dev->dev,
				"timeout to stream off s:%d t:%d p:%d\n",
				ctx->session_id, q->type,
				!list_empty(&ctx->pending_list));
		sde_rot_mgr_lock(rot_dev->mgr);
		sde_rotator_cancel_all_requests(rot_dev->mgr, ctx->private);
		sde_rot_mgr_unlock(rot_dev->mgr);
	}

	sde_rotator_return_all_buffers(q, VB2_BUF_STATE_ERROR);