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: 14016892 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 09928C28B30 for ; Fri, 14 Mar 2025 13:28:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=r5PKoNAd5zdxZnMwzm0dBWgFUNSzx8BJjkS0WWVbCIU=; b=KvYum+za5UZR7lDXOP9NtNOqS8 /JRISYO1rxjQ7RB8wwI5YwbnZLt41O3HKY3+A0WcYHW3dsdN/oriJJQXb9rtsv9nN3pZX8F/2pWGs i0eo9LJF3BWhni7uXFJMgTH9or0s3QMeLKv5dAWP5U884itlzKzDVuiUgGGB/inSxlgRVA9FkMwjd 7QbbwvhM0ZGEIiPEbjsGy4e3IcI0i4QAOzcFi/hVn5tFfF1E/4JlDwcF3Y5z6YQ63o18rCgMQxa27 BosWqwZ3MEJif5PTFFF4faXfUViyTMzkRnb6dqW9S7wX1rtSLvWUhE31xeDwdECDDmaavrc8IJs/I XcprxaEw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt55d-0000000EHBn-3uxe; Fri, 14 Mar 2025 13:28:41 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tt53x-0000000EGsy-1hQ6; Fri, 14 Mar 2025 13:26:58 +0000 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 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250314_062657_591562_F26E27DA X-CRM114-Status: GOOD ( 22.60 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org 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: 14016912 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B2D77C282EC for ; Fri, 14 Mar 2025 13:32:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=uXACaEKDc7l/ytvNs6hjCC+fzdSguwb6QUDm1mUCdQ0=; b=ObJYv3arjOqtU5Fita53LZHqoa 36gvtwaQUdN3SHytXDp3ZGFr+YHtY31lH4oELPyErYYNd5PRRBwYgPPR4MIvGkE1oZk6OsGEVPHas Kfh3cDmYVwT0NsXUhlET6CuaTIfKqtPtPMV8vlg6twQNWWZah267BqPBfGSNsyNbfzQqxP5yTXUPe ZKWQqUbYGtaHpTiNSMsoP5slgU7etBzALH07AkGGLOwPJhqDVup1G/IpJt5oXSOYAiSg7NrG2oeTj elfhRTt1b7+nDEruZDE/vYWPQV76YgwjfyUxx28oy3Mt3Q/6Xbytweh3qfQPbnWOVhZ7jAufIXeiN EEzyrx6w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt58w-0000000EHmX-3uEF; Fri, 14 Mar 2025 13:32:06 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tt543-0000000EGu7-2Bua; Fri, 14 Mar 2025 13:27:04 +0000 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 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250314_062703_598278_DB6C0228 X-CRM114-Status: GOOD ( 12.58 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org 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: 14016913 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4B53DC35FF1 for ; Fri, 14 Mar 2025 13:33:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=tWYP84KCgY/CJVQIqNmTt3VNzhUu/s+bY6Shukj3Q64=; b=i2YOGS7zG0u2Ghadpztu209mp4 hOP3Y8MN0+A6PUucxh9MDqCHG+f09OvTTVUMNxWQabX6snKyxFWu9Kj12IiQJA9fsLQlTiMIFxRdE zrS/pkFoEuYD7jtk7gbys/yNPNE+qrX70XcNv+ThrM+6d+pBCRfe1biy8YqQS0ps7uigNBNEbIwgb sEApcxY4tBG1QcNWy9w1se3hK6aJTk9rfmtcFOdlS33J2Mp91/HmFMxlQGpcTdW9nOJ7w73V23aC+ nMCMsbFavk7szNs+SuzC5nhY1xPsIEFYOcggImFGAnafkYy8UMYtI1rea60+1HogwIZpULg7remh1 E+O9BLBA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt5Ab-0000000EI0D-1KZl; Fri, 14 Mar 2025 13:33:49 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tt549-0000000EGvV-19Z0; Fri, 14 Mar 2025 13:27:10 +0000 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 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250314_062709_384750_B0702A5A X-CRM114-Status: GOOD ( 19.57 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org 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: 14016914 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3EC66C282EC for ; Fri, 14 Mar 2025 13:35:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=DkLkmHVXAPwesD88730WIjN61344npAlgzyKDIEb8iw=; b=0DbNDngcKnLPoDiUrL3mLfNMSg JhZPbMkvuQ3O5P66bHVf+styWWo2jM+Y2/PSskQP6KMfkfePaidMPX5QsCmwnrOT9URb4NJhnZYrA TtvBePatKjA8XMhRXhA3oukYMEs11Dgx8DLEgOuhLJ6/X39Ew0SsGa1TMvuTXyKx+S8JEuDlEPSkG 4sLZoZPhebHVVeJs2So84Dbma3Rwlb9E+QRa3IwmAEUCcafu6mUBzdFgp22yCCY4zrojT+V8gbzs/ 5/3Jd0B00B6AMqP8cnh7vpnvPoDz8nEz8RJCAoB7xUg4EIMg6hDP6KntTkbkx70RmtqSYoM54Qm4A p3rn8OiQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt5CF-0000000EIMe-1SuW; Fri, 14 Mar 2025 13:35:31 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tt54H-0000000EGwY-0ImG; Fri, 14 Mar 2025 13:27:18 +0000 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 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250314_062717_180216_529C2302 X-CRM114-Status: GOOD ( 20.51 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org 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: 14016924 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BCDEDC282EC for ; Fri, 14 Mar 2025 13:37:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=uCoDkNxle5kYQxEYElD69IYy2zg+RTAZoMqICiRmeUE=; b=ERTqufYxwyueD5o4SvFmsthi16 8BjxqtIsZjFMxrwn0l5Pi4Zl8+oCpftn/VvuIiEHaki/PeQDTcPHy9Z8SJ1lqEtabhP8ZmqlnKQlc oqikQi8miMnxAC9knMNPsFsTB8Ns0nye1vkjH6z6WXWVECDmtJJT8v19flFx8QqQbw4QrW+LX6VXH H3iUEidGZaSMkQDqhZOTZDMpvTIAKmdFxI0iKp4zoveS2m0GYLvwN0EZjE+0YnBpATisgJST1qSs0 ZQzWi0AtCrgcuxUpylsIJv5bStETqewv4HnjPmU5qd8shxTQmrMNRom5tHFGSrOKG4auM2Q4kwWDV gTHa5ioQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt5Ds-0000000EIdr-3Z68; Fri, 14 Mar 2025 13:37:12 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tt54O-0000000EGxv-1CCX; Fri, 14 Mar 2025 13:27:25 +0000 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 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250314_062724_394549_C3F7DE76 X-CRM114-Status: UNSURE ( 9.07 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org 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;