From patchwork Fri Mar 14 13:26:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Fricke X-Patchwork-Id: 14016895 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DAAFA2E3398; Fri, 14 Mar 2025 13:27:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958833; cv=pass; b=SdsDq24Pf91xw2lwysbZMN0bencK5NPW56ahz8jnqLrlUOvi5xTNO6i91pQ8LY7+KsNuJzMmyUbtuJRxF5JL04Dd6CK/5nbQ53vUl1Va7tnVyeqCelBYKEUBwTIb6k4vblk2NovV0JBTkEdbXFqj2ALS7ffT619LC60y43PjeDs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958833; c=relaxed/simple; bh=sxx9sMpD06poRom5zVC4YKJwk1lBZQxtCTPM3pbmkzQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aw5ExEI/bBMVCAjMRaHOLrF7/tMSpUMTDc3lDc/mnNR5qU0pQBv1aW79WMGl9oSp0oAcaeoY62J6kzDyzLQf+CtC3K5ykzGGFfukKLLbpGQhm6YjZBjEGWZVd4W8wEHgpQM3HuuHUgImpgTm8Vk/Xb2UeSduwPltqdko84839ik= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b=Qv8oUF2x; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b="Qv8oUF2x" ARC-Seal: i=1; a=rsa-sha256; t=1741958806; cv=none; d=zohomail.com; s=zohoarc; b=Z4W+LsH/yJVY8B2N8xt6Is2fJE82So2XzSPtn7d1dWbqu4KuqlKZPvCJ7kAh5Y0sSRkpbTvljesD5Kw9AVLRWAhGoaDrXRHsyjhGzW0hAc2YgaqajgYYb2ZEoCXbSU89HF1ZB82muum0unsKRvH/5wAqtiqyP1PHJNgWeL1sD84= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741958806; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=r5PKoNAd5zdxZnMwzm0dBWgFUNSzx8BJjkS0WWVbCIU=; b=AIinGbWMGyIBE8aBnER/snIY71HEWQQI4rocF/uQhMHT9lXY6UUjTtDCfEx9ipVP5gfgUwHXB0qHzKIxgKX1+8EkLp9SVbHAyIPZeahTwXhHhBH7oWrCXxj2dCLu+eNSMhhKkxXS2t/YvOHhwW7wrZdq6pjdxUIlC4l9M9T/tyQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=sebastian.fricke@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1741958806; s=zohomail; d=collabora.com; i=sebastian.fricke@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=r5PKoNAd5zdxZnMwzm0dBWgFUNSzx8BJjkS0WWVbCIU=; b=Qv8oUF2xoV7SRGHb8WOn1havaIyZS9juaRsefyEHe2dbt1msKRDccagbfNOKPW87 zTiFnyzdYiHi3wNHHfIuIXKtduni4uLVngjGleHDg05twcBc7y/GTP2+V2hvTdWXAPh EjBTzg5QqH8QaO4CUgzNw3Fkl0hWey8tNuOtra6M= Received: by mx.zohomail.com with SMTPS id 1741958804809871.0776006949541; Fri, 14 Mar 2025 06:26:44 -0700 (PDT) From: Sebastian Fricke Date: Fri, 14 Mar 2025 14:26:26 +0100 Subject: [PATCH 1/5] media: mc: add manual request completion Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-1-5e277a3d695b@collabora.com> References: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> In-Reply-To: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> To: Sakari Ailus , Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Tiffany Lin , Andrew-CT Chen , Yunfei Dong , Matthias Brugger , AngeloGioacchino Del Regno Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, kernel@collabora.com, Sebastian Fricke , Hans Verkuil X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1741958789; l=5988; i=sebastian.fricke@collabora.com; s=linux-media; h=from:subject:message-id; bh=lUKighMYgVNAExQB5VpogYNcL74ZwJPIAc0FRqQAaq0=; b=7wlGUTVZ371dfKFxqOPYsO1RtwsP+gLegIco+T4VVi5ZIkPmx+P08yrYtk3qysCozDkqEurtV e2waPI9m/NRCYSojyDp2r85Rx0RLLkTEwFd/KjNugkMM4z2v399MP2y X-Developer-Key: i=sebastian.fricke@collabora.com; a=ed25519; pk=pYXedPwrTtErcj7ERYeo/IpTrpe4QbJuEzSB52fslBg= X-ZohoMailClient: External From: Hans Verkuil By default when the last request object is completed, the whole request completes as well. But sometimes you want to manually complete a request in a driver, so add a manual complete mode for this. In req_queue the driver marks the request for manual completion by calling media_request_mark_manual_completion, and when the driver wants to manually complete the request it calls media_request_manual_complete(). Signed-off-by: Hans Verkuil --- drivers/media/mc/mc-request.c | 38 ++++++++++++++++++++++++++++++++++++-- include/media/media-request.h | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/drivers/media/mc/mc-request.c b/drivers/media/mc/mc-request.c index 5edfc2791ce7c7485def5db675bbf53ee223d837..398d0806d1d274eb8c454fc5c37b77476abe1e74 100644 --- a/drivers/media/mc/mc-request.c +++ b/drivers/media/mc/mc-request.c @@ -54,6 +54,7 @@ static void media_request_clean(struct media_request *req) req->access_count = 0; WARN_ON(req->num_incomplete_objects); req->num_incomplete_objects = 0; + req->manual_completion = false; wake_up_interruptible_all(&req->poll_wait); } @@ -313,6 +314,7 @@ int media_request_alloc(struct media_device *mdev, int *alloc_fd) req->mdev = mdev; req->state = MEDIA_REQUEST_STATE_IDLE; req->num_incomplete_objects = 0; + req->manual_completion = false; kref_init(&req->kref); INIT_LIST_HEAD(&req->objects); spin_lock_init(&req->lock); @@ -459,7 +461,7 @@ void media_request_object_unbind(struct media_request_object *obj) req->num_incomplete_objects--; if (req->state == MEDIA_REQUEST_STATE_QUEUED && - !req->num_incomplete_objects) { + !req->num_incomplete_objects && !req->manual_completion) { req->state = MEDIA_REQUEST_STATE_COMPLETE; completed = true; wake_up_interruptible_all(&req->poll_wait); @@ -488,7 +490,7 @@ void media_request_object_complete(struct media_request_object *obj) WARN_ON(req->state != MEDIA_REQUEST_STATE_QUEUED)) goto unlock; - if (!--req->num_incomplete_objects) { + if (!--req->num_incomplete_objects && !req->manual_completion) { req->state = MEDIA_REQUEST_STATE_COMPLETE; wake_up_interruptible_all(&req->poll_wait); completed = true; @@ -499,3 +501,35 @@ void media_request_object_complete(struct media_request_object *obj) media_request_put(req); } EXPORT_SYMBOL_GPL(media_request_object_complete); + +void media_request_manual_complete(struct media_request *req) +{ + unsigned long flags; + bool completed = false; + + if (WARN_ON(!req)) + return; + if (WARN_ON(!req->manual_completion)) + return; + + spin_lock_irqsave(&req->lock, flags); + if (WARN_ON(req->state != MEDIA_REQUEST_STATE_QUEUED)) + goto unlock; + + req->manual_completion = false; + /* + * It is expected that all other objects in this request are + * completed when this function is called. WARN if that is + * not the case. + */ + if (!WARN_ON(req->num_incomplete_objects)) { + req->state = MEDIA_REQUEST_STATE_COMPLETE; + wake_up_interruptible_all(&req->poll_wait); + completed = true; + } +unlock: + spin_unlock_irqrestore(&req->lock, flags); + if (completed) + media_request_put(req); +} +EXPORT_SYMBOL_GPL(media_request_manual_complete); diff --git a/include/media/media-request.h b/include/media/media-request.h index d4ac557678a78372222704400c8c96cf3150b9d9..645d18907be7148ca50dcc9248ff06bd8ccdf953 100644 --- a/include/media/media-request.h +++ b/include/media/media-request.h @@ -56,6 +56,10 @@ struct media_request_object; * @access_count: count the number of request accesses that are in progress * @objects: List of @struct media_request_object request objects * @num_incomplete_objects: The number of incomplete objects in the request + * @manual_completion: if true, then the request won't be marked as completed + * when @num_incomplete_objects reaches 0. Call media_request_manual_complete() + * to set this field to false and complete the request + * if @num_incomplete_objects == 0. * @poll_wait: Wait queue for poll * @lock: Serializes access to this struct */ @@ -68,6 +72,7 @@ struct media_request { unsigned int access_count; struct list_head objects; unsigned int num_incomplete_objects; + bool manual_completion; wait_queue_head_t poll_wait; spinlock_t lock; }; @@ -218,6 +223,35 @@ media_request_get_by_fd(struct media_device *mdev, int request_fd); int media_request_alloc(struct media_device *mdev, int *alloc_fd); +/** + * media_request_mark_manual_completion - Set manual_completion to true + * + * @req: The request + * + * Mark that the request has to be manually completed by calling + * media_request_manual_complete(). + * + * This function should be called in the req_queue callback. + */ +static inline void +media_request_mark_manual_completion(struct media_request *req) +{ + req->manual_completion = true; +} + +/** + * media_request_manual_complete - Set manual_completion to false + * + * @req: The request + * + * Set @manual_completion to false, and if @num_incomplete_objects + * is 0, then mark the request as completed. + * + * If there are still incomplete objects in the request, then + * WARN for that since that suggests a driver error. + */ +void media_request_manual_complete(struct media_request *req); + #else static inline void media_request_get(struct media_request *req) @@ -336,7 +370,7 @@ void media_request_object_init(struct media_request_object *obj); * @req: The media request * @ops: The object ops for this object * @priv: A driver-specific priv pointer associated with this object - * @is_buffer: Set to true if the object a buffer object. + * @is_buffer: Set to true if the object is a buffer object. * @obj: The object * * Bind this object to the request and set the ops and priv values of From patchwork Fri Mar 14 13:26:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Fricke X-Patchwork-Id: 14016897 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 77E7C1FFC7D; Fri, 14 Mar 2025 13:27:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958839; cv=pass; b=Ofsv8mylULsZ9STi/k3XlZIgP2yTSFbHx6wUccAbGQT5v7ROVNehLC9uN06FqWI1H7Bycs57M+eHfX+6JbS82UF908w5IWbL+j9DSfvrQceD+6THJby6szdxbO189PqDm6R7vV+XV8Vv3XozVzLIFaK9scZJABGB5FbWj9liAQY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958839; c=relaxed/simple; bh=rc0Zwv9+8zh0LW/r40T8FHT2fNdjewfM+ic8XkC+kuA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jZJgw8r3muR9KXZtkiSoIxlzAv2Fwb0X8M+EVmwvGjIUYHeJtx9/0+LLABzG9Ry0t3rkzeUyUzKEzPlwfdx3hMs2kFcSRsfxNYVtOp3pWZg44MI9QYrv+iqjuRb6E84//S4kKVbzwJS4U1gGazSucRxV9tC/VeoCnNUUElCEuzI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b=MRDqTmOp; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b="MRDqTmOp" ARC-Seal: i=1; a=rsa-sha256; t=1741958814; cv=none; d=zohomail.com; s=zohoarc; b=XQJWIVK2qMI1ScgbVEEAArXbYLsJPrbuzUPh6pCzFrA8d6EmqWN79E2fB9AM3goz0mx6JwqVObNCHa0aJh1DU3DHfLsFd6/tCmcGim4bv6j4XHZcq5CDN/xzK8Qf9P+g2Y9iPklAuwjioKurYrBG2r+XPBACCTkQVDLRNFiUIPQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741958814; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=uXACaEKDc7l/ytvNs6hjCC+fzdSguwb6QUDm1mUCdQ0=; b=mpCbogDaVoeYSeGcq1/FccrTfD0K3HJh0hIa0sy+dagyb9R8QmHgYcnfx61X1rnuxBDCKPBw4ERBuwzdym0zvL6m6/3TmNlOqsuKJjn95oAwXF6bmmPkEm+mzlZSiF55Gfej1N+c2aPPT2UGtp5tRnuCMvpB+q+BTtp9lMZnvNo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=sebastian.fricke@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1741958814; s=zohomail; d=collabora.com; i=sebastian.fricke@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=uXACaEKDc7l/ytvNs6hjCC+fzdSguwb6QUDm1mUCdQ0=; b=MRDqTmOp9ITF0wEglKu/te5ZX/0hcjt/PiRHf4ctZXa9bE+ZbIm0mUX4ZyiifXng 4dNMF1zo+9PFne0EiBpvsAXMXKHfN/BkIVQiaqxy7D+3jY8sSwsthiCXNCkILbdd2xz 8UraER3YV2WHocySRI5hFcke7QPzi/XVdHT0RG38= Received: by mx.zohomail.com with SMTPS id 1741958811570783.6540028974323; Fri, 14 Mar 2025 06:26:51 -0700 (PDT) From: Sebastian Fricke Date: Fri, 14 Mar 2025 14:26:27 +0100 Subject: [PATCH 2/5] media: vicodec: add support for manual completion Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-2-5e277a3d695b@collabora.com> References: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> In-Reply-To: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> To: Sakari Ailus , Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Tiffany Lin , Andrew-CT Chen , Yunfei Dong , Matthias Brugger , AngeloGioacchino Del Regno Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, kernel@collabora.com, Sebastian Fricke , Hans Verkuil X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1741958789; l=2581; i=sebastian.fricke@collabora.com; s=linux-media; h=from:subject:message-id; bh=LP+cDWb9txkkC2/qdjribPzGGgfAS/BIXNqjRzmbVj8=; b=OJGb/6zw6xhr6cJd5YfPuS4KtTMkzNYtKweE0Hqvzbd4E82jGna7SWrIvWV3kM+Ph4RE75Mn3 27evC1fQu0aAoJHMarKjBfmBeMo4XLXoZFOBLACrEsw0vgl3cyD7wD0 X-Developer-Key: i=sebastian.fricke@collabora.com; a=ed25519; pk=pYXedPwrTtErcj7ERYeo/IpTrpe4QbJuEzSB52fslBg= X-ZohoMailClient: External From: Hans Verkuil Manually complete the requests: this tests the manual completion code. Signed-off-by: Hans Verkuil --- drivers/media/test-drivers/vicodec/vicodec-core.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/media/test-drivers/vicodec/vicodec-core.c b/drivers/media/test-drivers/vicodec/vicodec-core.c index c45f5cf12ded3c8b57483b148bf7bbffb8a458c5..88cb6e6a713f08bd4f412ca2940b1309bb87513b 100644 --- a/drivers/media/test-drivers/vicodec/vicodec-core.c +++ b/drivers/media/test-drivers/vicodec/vicodec-core.c @@ -448,8 +448,10 @@ static void device_run(void *priv) ctx->comp_magic_cnt = 0; ctx->comp_has_frame = false; spin_unlock(ctx->lock); - if (ctx->is_stateless && src_req) + if (ctx->is_stateless && src_req) { v4l2_ctrl_request_complete(src_req, &ctx->hdl); + media_request_manual_complete(src_req); + } if (ctx->is_enc) v4l2_m2m_job_finish(dev->stateful_enc.m2m_dev, ctx->fh.m2m_ctx); @@ -1525,8 +1527,12 @@ static void vicodec_return_bufs(struct vb2_queue *q, u32 state) vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); if (vbuf == NULL) return; - v4l2_ctrl_request_complete(vbuf->vb2_buf.req_obj.req, - &ctx->hdl); + if (ctx->is_stateless && V4L2_TYPE_IS_OUTPUT(q->type)) { + struct media_request *req = vbuf->vb2_buf.req_obj.req; + + v4l2_ctrl_request_complete(req, &ctx->hdl); + media_request_manual_complete(req); + } spin_lock(ctx->lock); v4l2_m2m_buf_done(vbuf, state); spin_unlock(ctx->lock); @@ -1679,6 +1685,7 @@ static void vicodec_buf_request_complete(struct vb2_buffer *vb) struct vicodec_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); v4l2_ctrl_request_complete(vb->req_obj.req, &ctx->hdl); + media_request_manual_complete(vb->req_obj.req); } @@ -2010,6 +2017,12 @@ static int vicodec_request_validate(struct media_request *req) return vb2_request_validate(req); } +static void vicodec_request_queue(struct media_request *req) +{ + media_request_mark_manual_completion(req); + v4l2_m2m_request_queue(req); +} + static const struct v4l2_file_operations vicodec_fops = { .owner = THIS_MODULE, .open = vicodec_open, @@ -2030,7 +2043,7 @@ static const struct video_device vicodec_videodev = { static const struct media_device_ops vicodec_m2m_media_ops = { .req_validate = vicodec_request_validate, - .req_queue = v4l2_m2m_request_queue, + .req_queue = vicodec_request_queue, }; static const struct v4l2_m2m_ops m2m_ops = { From patchwork Fri Mar 14 13:26:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Fricke X-Patchwork-Id: 14016898 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B00531FF61D; Fri, 14 Mar 2025 13:27:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958845; cv=pass; b=CNmkJ8IffUeA7i658AFwGn778xMbmUdWfNJkoDg/t91GzuWRIZ8qqp3lnsP7XFeIw0+X/2/T1xyBMhntykoxL/FjZngIBC8/QroQjL+f3zheBj8kF6j7yWe2Nu7aFLPciJudJv4JkNMhvceWjxjcMmsu4HwSdKndWDZJWMzlmH8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958845; c=relaxed/simple; bh=EJejHjE/Sy87AkaWcM/ue9+P7DKpUEEmXtERYp7OFec=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RumvJst7NGgwF4ADlKg644HxWllMw/W2TduQtL2QoPWM+2Dj73SE1W9rgY5l1EOEw9dXOIvATeNKP/h/MPAXd66mzszrTq8RHf2rnd3JIXyBRql4ahiWqx8pEAIcZJV0ZORj2lORitKTFM//0TLG4wqK9hg90Ngwp7XKvg5bmPI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b=fBD85kA+; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b="fBD85kA+" ARC-Seal: i=1; a=rsa-sha256; t=1741958820; cv=none; d=zohomail.com; s=zohoarc; b=SIsQsMACcYgOomsQftkZ5ZBewHSw0Qlxq0LqcIlREZdOinq1AhPCliYMfnqZtrOF3zn4pTBcXlmp2eoUx1jJVnk198MOkIANX3mV5ijulga2n0m8Tnok5NgTnAy/cNQ4q0QaCBPEs0zcBzdI0vodSDGwup9Awt878pEYorpoSNo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741958820; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=tWYP84KCgY/CJVQIqNmTt3VNzhUu/s+bY6Shukj3Q64=; b=AFG/6HSG01Fln7YzM986EHmDdksg8aqXIAKTdxQ4D+mcBhp++Ecl/3/NwgKM3NIfcpteS8v2b+0wntOQm6F93cD1NqbVy6HK7L3S+DkqLCZCzlq4tr7shF7wGKXu9DIahnsfBHph7ajkQ2odt0PtFDpddoQa8J+8ZV5/sVnsO18= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=sebastian.fricke@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1741958820; s=zohomail; d=collabora.com; i=sebastian.fricke@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=tWYP84KCgY/CJVQIqNmTt3VNzhUu/s+bY6Shukj3Q64=; b=fBD85kA+kUEVism7eZeOikmpwErk5YRhDXIy7LLoVRTbI8NWkUahP98sjCNjjFF6 Rw2urCQxvgFMDhikzEXndvzMJZB6aB6ZXoLsZkOgGAGj667jibabm3scKTTLxCuqQU2 TwjQikhDMT19Prs7Usgr3r+/GdMu51y3int42eFI= Received: by mx.zohomail.com with SMTPS id 1741958818680572.8775231015699; Fri, 14 Mar 2025 06:26:58 -0700 (PDT) From: Sebastian Fricke Date: Fri, 14 Mar 2025 14:26:28 +0100 Subject: [PATCH 3/5] media: mc: add debugfs node to keep track of requests Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-3-5e277a3d695b@collabora.com> References: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> In-Reply-To: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> To: Sakari Ailus , Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Tiffany Lin , Andrew-CT Chen , Yunfei Dong , Matthias Brugger , AngeloGioacchino Del Regno Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, kernel@collabora.com, Sebastian Fricke , Hans Verkuil X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1741958789; l=8354; i=sebastian.fricke@collabora.com; s=linux-media; h=from:subject:message-id; bh=qjOZ2DpO7aqlpwdIPD6R4s709b3gkctM/vdEmPB4De4=; b=IFMqG8mT7+TkteWhN0bOrQwEqS/Oh2Hp+noNAcjizIUpERiNixeXY0lSKvjsdiVR57YR1DKxV G7rgMrSsdyiCyFVV/88o0SwJj21EP5G6q1BrFRSYrK0tIRDulSQFLGT X-Developer-Key: i=sebastian.fricke@collabora.com; a=ed25519; pk=pYXedPwrTtErcj7ERYeo/IpTrpe4QbJuEzSB52fslBg= X-ZohoMailClient: External From: Hans Verkuil Keep track of the number of requests and request objects of a media device. Helps to verify that all request-related memory is freed. Signed-off-by: Hans Verkuil --- drivers/media/mc/mc-device.c | 30 ++++++++++++++++++++++++++++++ drivers/media/mc/mc-devnode.c | 5 +++++ drivers/media/mc/mc-request.c | 6 ++++++ include/media/media-device.h | 9 +++++++++ include/media/media-devnode.h | 4 ++++ include/media/media-request.h | 2 ++ 6 files changed, 56 insertions(+) diff --git a/drivers/media/mc/mc-device.c b/drivers/media/mc/mc-device.c index c0dd4ae5722725f1744bc6fd6282d5c765438059..5a458160200afb540d8014fed42d8bf2dab9c8c3 100644 --- a/drivers/media/mc/mc-device.c +++ b/drivers/media/mc/mc-device.c @@ -679,6 +679,23 @@ void media_device_unregister_entity(struct media_entity *entity) } EXPORT_SYMBOL_GPL(media_device_unregister_entity); +#ifdef CONFIG_DEBUG_FS +/* + * Log the state of media requests. + * Very useful for debugging. + */ +static int media_device_requests(struct seq_file *file, void *priv) +{ + struct media_device *dev = dev_get_drvdata(file->private); + + seq_printf(file, "number of requests: %d\n", + atomic_read(&dev->num_requests)); + seq_printf(file, "number of request objects: %d\n", + atomic_read(&dev->num_request_objects)); + return 0; +} +#endif + void media_device_init(struct media_device *mdev) { INIT_LIST_HEAD(&mdev->entities); @@ -697,6 +714,9 @@ void media_device_init(struct media_device *mdev) media_set_bus_info(mdev->bus_info, sizeof(mdev->bus_info), mdev->dev); + atomic_set(&mdev->num_requests, 0); + atomic_set(&mdev->num_request_objects, 0); + dev_dbg(mdev->dev, "Media device initialized\n"); } EXPORT_SYMBOL_GPL(media_device_init); @@ -748,6 +768,15 @@ int __must_check __media_device_register(struct media_device *mdev, dev_dbg(mdev->dev, "Media device registered\n"); +#ifdef CONFIG_DEBUG_FS + if (!media_debugfs_root) + media_debugfs_root = debugfs_create_dir("media", NULL); + mdev->media_dir = debugfs_create_dir(dev_name(&devnode->dev), + media_debugfs_root); + debugfs_create_devm_seqfile(&devnode->dev, "requests", + mdev->media_dir, media_device_requests); +#endif + return 0; } EXPORT_SYMBOL_GPL(__media_device_register); @@ -824,6 +853,7 @@ void media_device_unregister(struct media_device *mdev) dev_dbg(mdev->dev, "Media device unregistered\n"); + debugfs_remove_recursive(mdev->media_dir); device_remove_file(&mdev->devnode->dev, &dev_attr_model); media_devnode_unregister(mdev->devnode); /* devnode free is handled in media_devnode_*() */ diff --git a/drivers/media/mc/mc-devnode.c b/drivers/media/mc/mc-devnode.c index 56444edaf13651874331e7c04e86b0a585067d38..d0a8bcc11dd6350fdbc04add70f62de2c5f01178 100644 --- a/drivers/media/mc/mc-devnode.c +++ b/drivers/media/mc/mc-devnode.c @@ -45,6 +45,9 @@ static dev_t media_dev_t; static DEFINE_MUTEX(media_devnode_lock); static DECLARE_BITMAP(media_devnode_nums, MEDIA_NUM_DEVICES); +/* debugfs */ +struct dentry *media_debugfs_root; + /* Called when the last user of the media device exits. */ static void media_devnode_release(struct device *cd) { @@ -236,6 +239,7 @@ int __must_check media_devnode_register(struct media_device *mdev, if (devnode->parent) devnode->dev.parent = devnode->parent; dev_set_name(&devnode->dev, "media%d", devnode->minor); + dev_set_drvdata(&devnode->dev, mdev); device_initialize(&devnode->dev); /* Part 2: Initialize the character device */ @@ -313,6 +317,7 @@ static int __init media_devnode_init(void) static void __exit media_devnode_exit(void) { + debugfs_remove_recursive(media_debugfs_root); bus_unregister(&media_bus_type); unregister_chrdev_region(media_dev_t, MEDIA_NUM_DEVICES); } diff --git a/drivers/media/mc/mc-request.c b/drivers/media/mc/mc-request.c index 398d0806d1d274eb8c454fc5c37b77476abe1e74..829e35a5d56d41c52cc583cdea1c959bcb4fce60 100644 --- a/drivers/media/mc/mc-request.c +++ b/drivers/media/mc/mc-request.c @@ -75,6 +75,7 @@ static void media_request_release(struct kref *kref) mdev->ops->req_free(req); else kfree(req); + atomic_dec(&mdev->num_requests); } void media_request_put(struct media_request *req) @@ -326,6 +327,7 @@ int media_request_alloc(struct media_device *mdev, int *alloc_fd) snprintf(req->debug_str, sizeof(req->debug_str), "%u:%d", atomic_inc_return(&mdev->request_id), fd); + atomic_inc(&mdev->num_requests); dev_dbg(mdev->dev, "request: allocated %s\n", req->debug_str); fd_install(fd, filp); @@ -349,10 +351,12 @@ static void media_request_object_release(struct kref *kref) struct media_request_object *obj = container_of(kref, struct media_request_object, kref); struct media_request *req = obj->req; + struct media_device *mdev = obj->mdev; if (WARN_ON(req)) media_request_object_unbind(obj); obj->ops->release(obj); + atomic_dec(&mdev->num_request_objects); } struct media_request_object * @@ -417,6 +421,7 @@ int media_request_object_bind(struct media_request *req, obj->req = req; obj->ops = ops; obj->priv = priv; + obj->mdev = req->mdev; if (is_buffer) list_add_tail(&obj->list, &req->objects); @@ -424,6 +429,7 @@ int media_request_object_bind(struct media_request *req, list_add(&obj->list, &req->objects); req->num_incomplete_objects++; ret = 0; + atomic_inc(&obj->mdev->num_request_objects); unlock: spin_unlock_irqrestore(&req->lock, flags); diff --git a/include/media/media-device.h b/include/media/media-device.h index 53d2a16a70b0d9d6e5cc28fe1fc5d5ef384410d5..749c327e3c582c3c583e0394468321ccd6160da5 100644 --- a/include/media/media-device.h +++ b/include/media/media-device.h @@ -11,6 +11,7 @@ #ifndef _MEDIA_DEVICE_H #define _MEDIA_DEVICE_H +#include #include #include #include @@ -106,6 +107,9 @@ struct media_device_ops { * @ops: Operation handler callbacks * @req_queue_mutex: Serialise the MEDIA_REQUEST_IOC_QUEUE ioctl w.r.t. * other operations that stop or start streaming. + * @num_requests: number of associated requests + * @num_request_objects: number of associated request objects + * @media_dir: DebugFS media directory * @request_id: Used to generate unique request IDs * * This structure represents an abstract high-level media device. It allows easy @@ -179,6 +183,11 @@ struct media_device { const struct media_device_ops *ops; struct mutex req_queue_mutex; + atomic_t num_requests; + atomic_t num_request_objects; + + /* debugfs */ + struct dentry *media_dir; atomic_t request_id; }; diff --git a/include/media/media-devnode.h b/include/media/media-devnode.h index d27c1c646c2805171be3997d72210dd4d1a38e32..dbcabeffcb572ae707f5fe1f51ff719d451c6784 100644 --- a/include/media/media-devnode.h +++ b/include/media/media-devnode.h @@ -20,9 +20,13 @@ #include #include #include +#include struct media_device; +/* debugfs top-level media directory */ +extern struct dentry *media_debugfs_root; + /* * Flag to mark the media_devnode struct as registered. Drivers must not touch * this flag directly, it will be set and cleared by media_devnode_register and diff --git a/include/media/media-request.h b/include/media/media-request.h index 645d18907be7148ca50dcc9248ff06bd8ccdf953..c8dad380c40767f192f30dcf1c69b9ad1310f449 100644 --- a/include/media/media-request.h +++ b/include/media/media-request.h @@ -290,6 +290,7 @@ struct media_request_object_ops { * struct media_request_object - An opaque object that belongs to a media * request * + * @mdev: Media device this object belongs to * @ops: object's operations * @priv: object's priv pointer * @req: the request this object belongs to (can be NULL) @@ -301,6 +302,7 @@ struct media_request_object_ops { * another struct that contains the actual data for this request object. */ struct media_request_object { + struct media_device *mdev; const struct media_request_object_ops *ops; void *priv; struct media_request *req; From patchwork Fri Mar 14 13:26:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Fricke X-Patchwork-Id: 14016899 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 23BC91FF7DE; Fri, 14 Mar 2025 13:27:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958853; cv=pass; b=Nm2hc2443+OMZCgWQuwSvG/GgabZR6wnwx7psldDopDIRZ0oOjTyJWughCxPlNQFXAHNHecGpgLxc4nhWXaodHvNpj3703lj2w7zeCbxwWUucZrANGmWlIQbBBGhng0VRrY8vQWCn9N/4mRq2c47loL/krZtUN7qihF5VjzEx3w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958853; c=relaxed/simple; bh=49IRp4qINEWgdCFKaoU9py89jwvFRkP6xuW8xZsZ+Lk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BpR18SiGSIUWC4o/Oj8Lt8H6AiynyR9ER0ZwQ6M4Xq88iMoPRrlVdFJI48sGpZpu57n4EDd3HMR5QAaw8EnmNF+iCwPxS37APa4JJbcFVTUtBflrT1nHtmpYcep9YWa/ArsIr9drBWoRLKl4favL+5Xr0n2K9KERp9LY9ETh/fA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b=Wrjx3lU2; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b="Wrjx3lU2" ARC-Seal: i=1; a=rsa-sha256; t=1741958826; cv=none; d=zohomail.com; s=zohoarc; b=KNlrIGLgZXif8X/RDiHS4ZJxK4/bH1vkN0eF3QFgjd5bNqNr3Zr7zhJ5VGhfuA99LFCP+or/zCTbmUoFJe5PNI+u3UsO8qvj39GPw16/FsWxwWIEeuBQKUoxbvKmUJ3SLrrfTtE4PexMzdYT16vSdFKCkFtGopOzLl//8o8xZiQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741958826; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=DkLkmHVXAPwesD88730WIjN61344npAlgzyKDIEb8iw=; b=IjGhk9sCFdY8ldltxF+yzTLVJh8XDn18AYS7AkAvjxxb1CiRQsmKCuc+flH06OODstyPdX2ZkqXuayoFhL9xwHreOtIqu4IIvdHGK/td8UVR/hnRRdjr+iXf6nTffx09knE1FjXy8mLhMCI1/aEBsi0qxqgs0HEDLzzWDXxmdn8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=sebastian.fricke@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1741958826; s=zohomail; d=collabora.com; i=sebastian.fricke@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=DkLkmHVXAPwesD88730WIjN61344npAlgzyKDIEb8iw=; b=Wrjx3lU2XKEaU2hy+iKsjLq0hG80ZXL3SeLjFF4Spn+UjgupRQi3VrgVfTXUwn0X vS5rc2amYSVBwZP119K4yExYxjyBXcqvp2XbfUSnpWXIFvJUsch44NbPKuazJBVbehe U7qrcvIxx+05vpcMSgVex/TyxWe2IxsVYZm8mhHQ= Received: by mx.zohomail.com with SMTPS id 1741958825346474.16390275865274; Fri, 14 Mar 2025 06:27:05 -0700 (PDT) From: Sebastian Fricke Date: Fri, 14 Mar 2025 14:26:29 +0100 Subject: [PATCH 4/5] media: vcodec: Implement manual request completion Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-4-5e277a3d695b@collabora.com> References: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> In-Reply-To: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> To: Sakari Ailus , Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Tiffany Lin , Andrew-CT Chen , Yunfei Dong , Matthias Brugger , AngeloGioacchino Del Regno Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, kernel@collabora.com, Sebastian Fricke X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1741958789; l=9678; i=sebastian.fricke@collabora.com; s=linux-media; h=from:subject:message-id; bh=49IRp4qINEWgdCFKaoU9py89jwvFRkP6xuW8xZsZ+Lk=; b=8EakE9LW8OjUw0KCyJvVHYLnY19r58LI3I/NHK1TDOcDqV1zPlr/xnOiehWAGkH3IdLW9HQ2C yUHW9OEeRfAAMCiN4SsMsqBHAAhQC4gT5+EXlSAzQJXerR/pq2jbzhB X-Developer-Key: i=sebastian.fricke@collabora.com; a=ed25519; pk=pYXedPwrTtErcj7ERYeo/IpTrpe4QbJuEzSB52fslBg= X-ZohoMailClient: External Rework how requests are completed in the MediaTek VCodec driver, by implementing the new manual request completion feature, which allows to keep a request open while allowing to add new bitstream data. This is useful in this case, because the hardware has a LAT and a core decode work, after the LAT decode the bitstream isn't required anymore so the source buffer can be set done and the request stays open until the core decode work finishes. Signed-off-by: Sebastian Fricke --- .../mediatek/vcodec/common/mtk_vcodec_cmn_drv.h | 13 ++++++ .../mediatek/vcodec/decoder/mtk_vcodec_dec.c | 4 +- .../mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c | 52 ++++++++++++++++++++++ .../mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h | 4 ++ .../vcodec/decoder/mtk_vcodec_dec_stateless.c | 46 +++++++++---------- 5 files changed, 94 insertions(+), 25 deletions(-) diff --git a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_cmn_drv.h b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_cmn_drv.h index 6087e27bd604d24e5d37b48de5bb37eab86fc1ab..81ec5beecfaed239ed70bee3460aae27e476231c 100644 --- a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_cmn_drv.h +++ b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_cmn_drv.h @@ -105,6 +105,19 @@ enum mtk_instance_state { MTK_STATE_ABORT = 4, }; +/** + * enum mtk_request_state - Stages of processing a request + * MTK_REQUEST_RECEIVED: Hardware prepared for the LAT decode + * MTK_REQUEST_DONE_WITH_BITSTREAM: LAT decode finished, the bitstream is not + * needed anymore + * MTK_REQUEST_COMPLETE: CORE decode finished + */ +enum mtk_request_state { + MTK_REQUEST_RECEIVED = 0, + MTK_REQUEST_LAT_DONE = 1, + MTK_REQUEST_CORE_DONE = 2, +}; + enum mtk_fmt_type { MTK_FMT_DEC = 0, MTK_FMT_ENC = 1, diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c index 98838217b97d45ed2b5431fdf87c94e0ff79fc57..036ad191a9c3e644fe99b4ce25d6a089292f1e57 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c +++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec.c @@ -889,8 +889,10 @@ void vb2ops_vdec_stop_streaming(struct vb2_queue *q) src_buf->vb2_buf.req_obj.req; v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR); - if (req) + if (req) { v4l2_ctrl_request_complete(req, &ctx->ctrl_hdl); + media_request_manual_complete(req); + } } } return; diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c index 9247d92d431d8570609423156b989878f7901f1c..d9c7aaec0c4515cb73b80c913b1ad5b08392dd18 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c +++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c @@ -26,6 +26,58 @@ #include "mtk_vcodec_dec_pm.h" #include "../common/mtk_vcodec_intr.h" +const char *state_to_str(enum mtk_request_state state) +{ + switch (state) { + case MTK_REQUEST_RECEIVED: + return "RECEIVED"; + case MTK_REQUEST_LAT_DONE: + return "LAT_DONE"; + case MTK_REQUEST_CORE_DONE: + return "CORE_DONE"; + default: + return "UNKNOWN"; + } +} + +int mtk_vcodec_complete(struct mtk_vcodec_dec_ctx *ctx, enum mtk_request_state state, + enum vb2_buffer_state buffer_state, struct media_request *src_buf_req) +{ + struct vb2_v4l2_buffer *src_buf, *dst_buf; + + mutex_lock(&ctx->lock); + + if (ctx->req_state >= state) { + mutex_unlock(&ctx->lock); + return -EINVAL; + } + + switch (ctx->req_state) { + case MTK_REQUEST_RECEIVED: + v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl); + src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx); + v4l2_m2m_buf_done(src_buf, buffer_state); + ctx->req_state = MTK_REQUEST_LAT_DONE; + if (state == MTK_REQUEST_LAT_DONE) + break; + fallthrough; + case MTK_REQUEST_LAT_DONE: + dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx); + v4l2_m2m_buf_done(dst_buf, buffer_state); + media_request_manual_complete(src_buf_req); + ctx->req_state = MTK_REQUEST_CORE_DONE; + break; + default: + break; + } + + mtk_v4l2_vdec_dbg(3, ctx, "Switch state from %s to %s.\n", + state_to_str(ctx->req_state), state_to_str(state)); + ctx->req_state = state; + mutex_unlock(&ctx->lock); + return 0; +} + static int mtk_vcodec_get_hw_count(struct mtk_vcodec_dec_ctx *ctx, struct mtk_vcodec_dec_dev *dev) { switch (dev->vdec_pdata->hw_arch) { diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h index ac568ed14fa257d25b533b6fd6b3cd341227ecc2..21c2301363d0151ba3cf384a2a32fff9f5d46034 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h +++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h @@ -185,6 +185,7 @@ struct mtk_vcodec_dec_ctx { struct mtk_q_data q_data[2]; int id; enum mtk_instance_state state; + enum mtk_request_state req_state; const struct vdec_common_if *dec_if; void *drv_handle; @@ -326,6 +327,9 @@ wake_up_dec_ctx(struct mtk_vcodec_dec_ctx *ctx, unsigned int reason, unsigned in wake_up_interruptible(&ctx->queue[hw_id]); } +int mtk_vcodec_complete(struct mtk_vcodec_dec_ctx *ctx, enum mtk_request_state state, + enum vb2_buffer_state buffer_state, struct media_request *src_buf_req); + #define mtk_vdec_err(ctx, fmt, args...) \ mtk_vcodec_err((ctx)->id, (ctx)->dev->plat_dev, fmt, ##args) diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c index afa224da0f4165cf5701d6861f1f787c6317bfe4..9187d7bcfc8aea17f3fc98d94419777d8026db51 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c +++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c @@ -247,7 +247,6 @@ static const struct v4l2_frmsize_stepwise stepwise_fhd = { static void mtk_vdec_stateless_cap_to_disp(struct mtk_vcodec_dec_ctx *ctx, int error, struct media_request *src_buf_req) { - struct vb2_v4l2_buffer *vb2_dst; enum vb2_buffer_state state; if (error) @@ -255,17 +254,7 @@ static void mtk_vdec_stateless_cap_to_disp(struct mtk_vcodec_dec_ctx *ctx, int e else state = VB2_BUF_STATE_DONE; - vb2_dst = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx); - if (vb2_dst) { - v4l2_m2m_buf_done(vb2_dst, state); - mtk_v4l2_vdec_dbg(2, ctx, "free frame buffer id:%d to done list", - vb2_dst->vb2_buf.index); - } else { - mtk_v4l2_vdec_err(ctx, "dst buffer is NULL"); - } - - if (src_buf_req) - v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl); + mtk_vcodec_complete(ctx, MTK_REQUEST_CORE_DONE, state, src_buf_req); } static struct vdec_fb *vdec_get_cap_buffer(struct mtk_vcodec_dec_ctx *ctx) @@ -308,6 +297,7 @@ static void vb2ops_vdec_buf_request_complete(struct vb2_buffer *vb) struct mtk_vcodec_dec_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); v4l2_ctrl_request_complete(vb->req_obj.req, &ctx->ctrl_hdl); + media_request_manual_complete(vb->req_obj.req); } static void mtk_vdec_worker(struct work_struct *work) @@ -358,12 +348,17 @@ static void mtk_vdec_worker(struct work_struct *work) else mtk_v4l2_vdec_err(ctx, "vb2 buffer media request is NULL"); + mutex_lock(&ctx->lock); + ctx->req_state = MTK_REQUEST_RECEIVED; + mutex_unlock(&ctx->lock); + ret = vdec_if_decode(ctx, bs_src, NULL, &res_chg); + if (ret && ret != -EAGAIN) { mtk_v4l2_vdec_err(ctx, - "[%d] decode src_buf[%d] sz=0x%zx pts=%llu ret=%d res_chg=%d", + "[%d] decode src_buf[%d] sz=0x%zx pts=%llu res_chg=%d ret=%d", ctx->id, vb2_src->index, bs_src->size, - vb2_src->timestamp, ret, res_chg); + vb2_src->timestamp, res_chg, ret); if (ret == -EIO) { mutex_lock(&ctx->lock); dec_buf_src->error = true; @@ -372,18 +367,15 @@ static void mtk_vdec_worker(struct work_struct *work) } state = ret ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE; + if (ret != -EAGAIN) + mtk_vcodec_complete(ctx, MTK_REQUEST_LAT_DONE, state, src_buf_req); + if (!IS_VDEC_LAT_ARCH(dev->vdec_pdata->hw_arch) || ctx->current_codec == V4L2_PIX_FMT_VP8_FRAME) { - v4l2_m2m_buf_done_and_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx, state); - if (src_buf_req) - v4l2_ctrl_request_complete(src_buf_req, &ctx->ctrl_hdl); - } else { - if (ret != -EAGAIN) { - v4l2_m2m_src_buf_remove(ctx->m2m_ctx); - v4l2_m2m_buf_done(vb2_v4l2_src, state); - } - v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx); + mtk_vcodec_complete(ctx, MTK_REQUEST_CORE_DONE, state, src_buf_req); } + + v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx); } static void vb2ops_vdec_stateless_buf_queue(struct vb2_buffer *vb) @@ -731,9 +723,15 @@ static int fops_media_request_validate(struct media_request *mreq) return vb2_request_validate(mreq); } +static void fops_media_request_queue(struct media_request *mreq) +{ + media_request_mark_manual_completion(mreq); + v4l2_m2m_request_queue(mreq); +} + const struct media_device_ops mtk_vcodec_media_ops = { .req_validate = fops_media_request_validate, - .req_queue = v4l2_m2m_request_queue, + .req_queue = fops_media_request_queue, }; static void mtk_vcodec_add_formats(unsigned int fourcc, From patchwork Fri Mar 14 13:26:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Fricke X-Patchwork-Id: 14016900 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5239B1FFC59; Fri, 14 Mar 2025 13:27:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958866; cv=pass; b=ZQzqGkzsvUWAUgQm1CM2S5Tn5JbVan7aNsefl3S9+a13yKrDjav8+CNypENmyjOUrZ/cwEjQeoWpU17PmpMYE/Z8wsItQx1ohxRUnw/OSeYT6huxgRPjoKZ6xZlyGIgb4B11e1gWZDSOZe3UpsyHGGnNoJ5DtPISKpifhmzxQQM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741958866; c=relaxed/simple; bh=41uAuDBAdwDURpr00ZnHEdCpyfUzB/9vnikmEpd4glM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=txnmYzxB5TOfEEBhyG1MR3lElNI/o2rXNhytidHaSetckKBUIQ388AXxAlrx6kscfVJHDRoM/KkuPVEvPTvLxiru1RmqIO6KQw9DarGlJnDDRQXYgyDI3kD1+uJmowlMOvo/Y3wSMJGHIws1BnsgaZaGK2VwVo/jWiGZ18K+i1w= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b=AzLZgyEo; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=sebastian.fricke@collabora.com header.b="AzLZgyEo" ARC-Seal: i=1; a=rsa-sha256; t=1741958834; cv=none; d=zohomail.com; s=zohoarc; b=NsS4F1K90WlNKnGrraMnXP8XW5Y09jO/+BORJJ/hXkN31ua4XWH/RKftru+7EEzjC+F7HY9AWte1a9XuK1I2MfwvY2FliqOqcWLDQjGNAiPbCwak5PbuGLZbOH64dYa1M+MnmPDkPel9g3zgJqkHmwi9O12x1iFfmt1EsWjEuek= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1741958834; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=uCoDkNxle5kYQxEYElD69IYy2zg+RTAZoMqICiRmeUE=; b=dnDjZQFKOG7k/KbiuZUiIiVSMTxgB+oKf66bO0JbxU6isK/TJhs0NPODkf63CnCyse/WR/Nq6MT7s03RkGPd+GqOvPikdra40TXSQRPCg2DGTlvTPE+EzyN3ArTSf/MeoyIVAwlj9F4qLj9EXaV+HGj+qBmBi4FNStcTHQ+lopo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=sebastian.fricke@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1741958834; s=zohomail; d=collabora.com; i=sebastian.fricke@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=uCoDkNxle5kYQxEYElD69IYy2zg+RTAZoMqICiRmeUE=; b=AzLZgyEoRHU2ZMpk6ReS0fi31DtyDvOCHBnCOaQGxESo8INRr8lrr9Bl/rCKhYTd 78kkeLeO6zBJIp8PFLK1NNGGAFA7HAwztquhc53d7CM32iUKSfYJUWO50azwBShvaS1 9OMKrHoCqppyJggRmwjTEzY2F3t+y7lUOei7jXi4= Received: by mx.zohomail.com with SMTPS id 1741958831940301.9413422942897; Fri, 14 Mar 2025 06:27:11 -0700 (PDT) From: Sebastian Fricke Date: Fri, 14 Mar 2025 14:26:30 +0100 Subject: [PATCH 5/5] media: mtk-vcodec: Don't try to decode 422/444 VP9 Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-5-5e277a3d695b@collabora.com> References: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> In-Reply-To: <20250314-sebastianfricke-vcodec_manual_request_completion_with_state_machine-v1-0-5e277a3d695b@collabora.com> To: Sakari Ailus , Laurent Pinchart , Mauro Carvalho Chehab , Hans Verkuil , Tiffany Lin , Andrew-CT Chen , Yunfei Dong , Matthias Brugger , AngeloGioacchino Del Regno Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, kernel@collabora.com, Sebastian Fricke , Nicolas Dufresne X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1741958789; l=1233; i=sebastian.fricke@collabora.com; s=linux-media; h=from:subject:message-id; bh=emJE1X62MuP0DezjydZOlvtEYLKSLG8mtfx8cJ7l/Ak=; b=8osgM6j4VT/PtVsmE7tkbG8dQ7JBOV2MAMNuNrQGJk5n2F7j6aPuW/gs9ohRwuBFlnr3mskub 7aWEdfocOPcDm1ourg2ImJ9zqwCQiJegWK3m+BOYhhMj0jR6xd3YVrj X-Developer-Key: i=sebastian.fricke@collabora.com; a=ed25519; pk=pYXedPwrTtErcj7ERYeo/IpTrpe4QbJuEzSB52fslBg= X-ZohoMailClient: External From: Nicolas Dufresne This is not supported by the hardware and trying to decode these leads to LAT timeout errors. Signed-off-by: Nicolas Dufresne --- .../platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c index 9187d7bcfc8aea17f3fc98d94419777d8026db51..3dbd251034b85e521c3c93538d9ecf9078ef3820 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c +++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateless.c @@ -496,6 +496,12 @@ static int mtk_vdec_s_ctrl(struct v4l2_ctrl *ctrl) mtk_v4l2_vdec_err(ctx, "VP9: bit_depth:%d", frame->bit_depth); return -EINVAL; } + + if (!(frame->flags & V4L2_VP9_FRAME_FLAG_X_SUBSAMPLING) || + !(frame->flags & V4L2_VP9_FRAME_FLAG_Y_SUBSAMPLING)) { + mtk_v4l2_vdec_err(ctx, "VP9: only 420 subsampling is supported"); + return -EINVAL; + } break; case V4L2_CID_STATELESS_AV1_SEQUENCE: seq = (struct v4l2_ctrl_av1_sequence *)hdr_ctrl->p_new.p;