From patchwork Wed Mar 19 03:50:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "jackson.lee" X-Patchwork-Id: 14022029 Received: from SEVP216CU002.outbound.protection.outlook.com (mail-koreacentralazon11022108.outbound.protection.outlook.com [40.107.43.108]) (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 3D56A24EA9B; Wed, 19 Mar 2025 03:50:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.43.108 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742356251; cv=fail; b=LKFapegeZKKnwM9ip0CB2tjih9PbuRb0qZeTH8lD9AjQIwEIIwPel6/coezSFwyfWIG0bINs0eR9dFGqFt5NyXHRDVE2Vlp2RlGuZIGic0zFGdXi24qO7waTxWzD/87qQp5kL2IkZN8bAUdiOtDfFxgetOGAytG0xVPNBTLpGkQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742356251; c=relaxed/simple; bh=O57VXptonyG3Q2rLxZNHhSvAnsMKr8p/sdzW2LbZ9gU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=B1aO4Fa7zaaJBSu44giPNYdSPVunBLNxb301OKAUaNVLsl37RG/FJBq9bvnkQ8ykOD1Ak9xZ2U6Gu5QjtiUpSoy6ioEv7by4FnuTU8JoNLYKGPiBOMbqKrKBW5Z3OJ41wb1f7D3ktFDwdptWRlIpPwWKfFxWtU3VQ2aTw7LAHoc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=chipsnmedia.com; spf=fail smtp.mailfrom=chipsnmedia.com; dkim=pass (1024-bit key) header.d=chipsnmedia.com header.i=@chipsnmedia.com header.b=FF7nAd8s; arc=fail smtp.client-ip=40.107.43.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=chipsnmedia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=chipsnmedia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chipsnmedia.com header.i=@chipsnmedia.com header.b="FF7nAd8s" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qfaPHL4VcvMTFoOrvBDda8JQk4hxTkPEtK6Wz9uts30meS57UrNWOlTc4q50tMZG8JCPWWZSc9qxrNrr8+JY7z1M+KXEYFYz+fUKAz/DprhZW7Od8A/BKMqeWofVwmxBdZrTE8LmBy+zNa+D8GZNoTsATeHu05IVnLtbgiwbLB/5MjmT+aQcRQ6h7S+AJXVitSswzm93Zd67stou+4qDPmi4bSW4hJGxkX+pJEz6hSEtyZfJ47hl9zTG8DCzQrC/tMGJxdj4rDTokCqs4NbPdToc+/VEMIs6GuGMNg/CG2Wa9ntj96UNfvFbnE2+7Y+gH2Iw/gRUcrKDa82nJMgdCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=SOFB508/Sd59Vfz5YPzNugZCd259xSiL6x6E+sSmwBo=; b=GN5DWrVuoPy9q7lE458jkDLEeN7UJYB8ps74P3BuWLLG9HsmGuh9i8Zw/VX1/SPcIvuVj+H+oB4icWJ35RhJt/RT5s3RGO3av5dAOcK9zcEp9SdAjJM5KiUgfQFzz84AcYbCH6xPfJ5vi82Z98bvlpta8iQRH4xaUTYBQtB6DXRU/XRNRILEdTs90eEzijuDsnPUA82nuVr2Moc9j8OuLFrNKwh+MGvksj9w3LJTOqMkpaxDzpBpsO8XojxOnwGqxdrYXjF6dCZZgb08SDi9gmFK6WYHqKXIYl2LBxoGASy0T6lbBfHtKX3aybal3j1UpRMvZi2ZsNfeMpU8RGgzYA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=chipsnmedia.com; dmarc=pass action=none header.from=chipsnmedia.com; dkim=pass header.d=chipsnmedia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chipsnmedia.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SOFB508/Sd59Vfz5YPzNugZCd259xSiL6x6E+sSmwBo=; b=FF7nAd8sf0cVQnYKYyCfiOJDxnmXhC2SNtyFNgdtaoPqtZS52vJbUpRJMHemjp8s2FJ41q1AuysS+UmoVGSmGhE7MdxTk4o4l6p/1EtGQt7W17IFNZE8Xm6grUc5l0gZsIPMNd8peE4FGf3bZjBiSbUuFMP+POQIZey9NzV57rE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=chipsnmedia.com; Received: from SE1P216MB1303.KORP216.PROD.OUTLOOK.COM (2603:1096:101:15::5) by PU4P216MB2051.KORP216.PROD.OUTLOOK.COM (2603:1096:301:130::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Wed, 19 Mar 2025 03:50:43 +0000 Received: from SE1P216MB1303.KORP216.PROD.OUTLOOK.COM ([fe80::b711:5ab1:b5a4:d01b]) by SE1P216MB1303.KORP216.PROD.OUTLOOK.COM ([fe80::b711:5ab1:b5a4:d01b%6]) with mapi id 15.20.8534.034; Wed, 19 Mar 2025 03:50:43 +0000 From: "Jackson.lee" To: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, sebastian.fricke@collabora.com, nicolas.dufresne@collabora.com, bob.beckett@collabora.com, dafna.hirschfeld@collabora.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, jackson.lee@chipsnmedia.com, lafley.kim@chipsnmedia.com, b-brnich@ti.com, hverkuil@xs4all.nl, nas.chung@chipsnmedia.com Subject: [RESEND PATCH v0 1/3] media: chips-media: wave5: Improve performance of decoder Date: Wed, 19 Mar 2025 12:50:32 +0900 Message-Id: <20250319035034.111-2-jackson.lee@chipsnmedia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250319035034.111-1-jackson.lee@chipsnmedia.com> References: <20250319035034.111-1-jackson.lee@chipsnmedia.com> X-ClientProxiedBy: SL2P216CA0085.KORP216.PROD.OUTLOOK.COM (2603:1096:101:2::18) To SE1P216MB1303.KORP216.PROD.OUTLOOK.COM (2603:1096:101:15::5) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SE1P216MB1303:EE_|PU4P216MB2051:EE_ X-MS-Office365-Filtering-Correlation-Id: 6ed5c85a-6826-498b-2f4f-08dd669938f7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|52116014|7416014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: 8Qgm8e4zie9cuUizwP42QwsgJ4672QIRJSL/y4CVmlzJJxvrR2AF8kKjt1TAov9TYB8ZTgW4YzJTTa6ggAhVkGAe3yYkTShNqHpWUi62ZSRpiqBWGwns/p1Y3FMdPWu25cB6A97hzdnnP8MnWMD2PCW8RQzPBLn4/9kdIkfAPgOtERWK/hfsId9RwHvDT/GgEJ0WMlz5iK3i/V/74bSy7ATgmYxW2+gBltRAKrOp2oEIkXaGRdvQd1Z+BRBewRdxL4LEQZBcHXVdwF1qJ6a5TjT1yQ8Gn8SYx60MyrAA5mzg7eC2gbwG+JKdJFf2cNy6O/O3GgS3mUCyCI624vojRLg1A61Jp0MBqBaofuqSUOattEQThWWV1Ig0IpyaQO3+X2GiKC3kdrqWkLB4tE4U5iMnGZG3jwqX8pKTDY9/uJrBL0tZi/cDx4jDr5FF4cbC4E5+CLl73cjBpuTGsFf74XY1DddVV8eYdDuC7TfIN5kfwwKrO0jM+VNm1BB8SUzwgtmhADsi9RXP5nFPqXKtv55MhmkGeprCvlDfjA2TInod6mVV23B5LYXKnLe5BmaPi3m07IB+qcnQg46Etug8oZxDWoLjzy44HtWK9QNVBR06g4ZLUatbe85Hk5vjbg2ugBVrsRPOhy+OSC9gjmhcYEsm57yN0i89jI1ssa5EbURwkx3WLO2LeXwPOMJqf3P1vwWk9i038j4B6vopPpM/IoEBhF3Y9DowP4TnF+fBts7V9cKh6cn6PqjkXOrmcxAYHAgUwZSSi9HDahmEvZHS6NH7mmZnW9j17zQSsp7nYuYOZb7YdD/ItbohkLIPXnREqUd0sj9cfiJX07aZuj1CUPrFrXvekKZuD220MUfG9npDHiSF+CW9bj/c/RnUAFZz5jDiHK9tuGhSUC+4x7XSSigFlpCGZUIEc4OsEqfwc8Qznn8w+sS3AlkIZl5S84qL6utMxiQU4oWN+h7T5yVueYUmhcTqwuiXf3zSTEeAt/wyF+4WN8pIohVbGIgBIDF5DsY4DDokGhbGSJuGADF1KA3Tpg7sNN+V72mCbit5HdhjmYReKaE1hIH9+tN5NfCUk149NcYsHuVf3ashxyxDh6gz8ON2C8RlU9sjT8jAqJ7NyvDtxkPcqomCpLhwgCopAmh7nBrNpSxUpeDEdmsyq5KaCOxyKeek5JBe+XMm2pii/r/nDSAjTlYAo887bGAgIjMW/GXxRVTz/gW3geXRbLN291c8Hs/4klUU8Y99H0ddE/0idShMWRriyxq+BAGsqHP+N0MxxPDjk5S61kh5hwHB69C6NqmpHwcOeQ73Yd2/3FQ8TycYF2x21+hH0zz0lx81hCkU9eBMZSNG2nBarZF1utXyaYZgs5ruLPrDShEOvlSq5ZnBGQDu8KI+4yWCSMKucgHomzAQMXpYcZezuMbe7hbYbfOEi8KaIALR57UyOQUBqXs2//gm/oPOOpNF X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SE1P216MB1303.KORP216.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(52116014)(7416014)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ktSVXAvoNYwXElVJ8XP2O6RBobnEpAXnTBJwSlmTS/qGBI4p7yO6ktIe5/qH0kmgfK8w0g2G12MPVry4r4JJRf2qp4WjOsYgKCHQo47V7xsilP7EiTKROLWGxfUBt2CdBnHKsAgwTuYZ8v9L2hzpwRwzshQjO1KKGNpIzpsDhY/w9hy1fdwSCOvQhfnpwaSuPN7u1Y4h605zHUYMtBJuTsJcglc0e9E+OBvRcC/YvSIU8g7WozpofE7UEebFK2HluWrkHhRAiVCxhLyXYxSIRMLTflC2dUMVvp/sBa4yL76JChI+W7lsTyrylJoPIL2vxNf3E2MJokRevqkNEU086Yz6ia1RGq92iflMxf7wheL+yYQIFCN4pcW9tX6yRvbF3nI8sHZ5pmbKtSZ07iKzs5EJ4UDHIWzcCuyM7d5lwVKT6kjnC1FpkeZdSsluRI7+BOepLiHtx+PB4Ni6onYyU0IqY6r4NDUMqsXzpWjdjHtlBlgSmIyFmOlKXboHHoYZfrHW38R7of2bfresg6uiNRhtEm2VXzOjDnM22co1wDOwJPdLjkBz2seZHTX2JVwvO7FPPWIYlN1PBQE56Cy8GANcrr7DdUXFVfgksDhzt1qmiT51rAHX3BzL3KCUMlv3QAZsCbeQ91XJ3O75/u/gv910Oj1Ujy8qPK7SYUjFRv1dbZ90YweBonYjF30u4ATU2hMtrLPrhZzZ64d6YViKYC44j5317W+pAePd6nGiNPGqUCdGEbeR5waeBq3fpCAcEhNezSSXtYWqnH5u5v/2jQFyeA09o2dnMxVOBWc7qXqwstOaE4iryt/hHSAVN392c0XeCj7LAs1eMeIQFzbkowbGrHpC7c0mT8TLhcOErJ1g+hzOH8aY8CS51ZkyU1DdIGjOCcfqg9Uz+UHtXj8stWj4fixmgCYYkkgd/2RX31NctBf4vAwiS2wkDxpnjaZeSXm61ilXBzcQpnT6vh5CwZczzFqugxts9X5APwR7DFOKUMYzVlujLrdjxS02Mfc0yd5V9hdqrlMphSRZmLqBY7cT4uMh9vddY06Kcgu6bv7NKirNpzjbJ37FSuopzVdRH4LVEQ0niq6DM+Ht0hVdUtG1o5AaiyAp9IwTDSKP1YYhoEbDqvotT5+5gG8s0Q6SWzO3GHrZnPzCT2L62c/N5lqjm5huTehY3/OFyBmc6w1+Z3dUK8oSa+YcbB3irc+sHx9Ru77Godf1weV9ZBSNHOV9COUiRo1dH7AtHlcw7RsGqj11EPnXvnOAHeKfA8BR2FTr6utHcTBOvqF0TNePMncIZLmWPWk5PuhIeRg8yO08OFTQOjoakwf2T0G9WbN2E76uKDTXFRHuoxVWHVtT0MBRPmmlhRuMaJqF+UsDst5f3FpLXY9a9JmsX3FMIgiHz2v+sXIBHnc0ijrqVXs3rEIKjLT5qGEEouCSv7F7QyL+r1+gt7a83MfAZWuzUFVGaR4XP74GhF9FTQL0PYRCkTOMzHDK2fPzUcmUEEQA3BYxc2+zkc6bwSdOG2v82LZNfdsWjXll0ffkHPhC9MrOIyUMLHibSiDD52Ksg+Dj3X7r5JnvakwND7Xb6QQ9x8P74DvyJroFsORLnqp418dj3w== X-OriginatorOrg: chipsnmedia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6ed5c85a-6826-498b-2f4f-08dd669938f7 X-MS-Exchange-CrossTenant-AuthSource: SE1P216MB1303.KORP216.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Mar 2025 03:50:42.9399 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4d70c8e9-142b-4389-b7f2-fa8a3c68c467 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: iX1hdrPvMHJQH7oMwgSA4e28HeK/bAQXaaR3RXZQsInSqqjg09eHDykzFpNlUzRg2cNmSJikMUbhOg7tiZ4qKp85kg7xi9qVg3XUh1oFalw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PU4P216MB2051 From: Jackson Lee The existing way for decoding frames was to wait until each frame was decoded after feeding a bitstream. As a result, performance was low and Wave5 could not achieve max pixel processing rate. Update driver to use an asynchronous approach for decoding and feeding a bitstream in order to achieve full capabilities of the device. Signed-off-by: Jackson Lee Signed-off-by: Nas Chung --- .../chips-media/wave5/wave5-vpu-dec.c | 344 ++++++++++-------- .../chips-media/wave5/wave5-vpu-enc.c | 3 - .../platform/chips-media/wave5/wave5-vpuapi.c | 25 +- .../platform/chips-media/wave5/wave5-vpuapi.h | 5 +- 4 files changed, 211 insertions(+), 166 deletions(-) diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c index fd71f0c43ac3..cc47da509703 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c @@ -230,12 +230,147 @@ static int start_decode(struct vpu_instance *inst, u32 *fail_res) switch_state(inst, VPU_INST_STATE_STOP); dev_dbg(inst->dev->dev, "%s: pic run failed / finish job", __func__); - v4l2_m2m_job_finish(inst->v4l2_m2m_dev, m2m_ctx); } return ret; } +static int write_to_ringbuffer(struct vpu_instance *inst, void *buffer, size_t buffer_size, + struct vpu_buf *ring_buffer, dma_addr_t wr_ptr) +{ + size_t size; + size_t offset = wr_ptr - ring_buffer->daddr; + int ret; + + if (wr_ptr + buffer_size > ring_buffer->daddr + ring_buffer->size) { + size = ring_buffer->daddr + ring_buffer->size - wr_ptr; + ret = wave5_vdi_write_memory(inst->dev, ring_buffer, offset, (u8 *)buffer, size); + if (ret < 0) + return ret; + + ret = wave5_vdi_write_memory(inst->dev, ring_buffer, 0, (u8 *)buffer + size, + buffer_size - size); + if (ret < 0) + return ret; + } else { + ret = wave5_vdi_write_memory(inst->dev, ring_buffer, offset, (u8 *)buffer, + buffer_size); + if (ret < 0) + return ret; + } + + return 0; +} + +static int fill_ringbuffer(struct vpu_instance *inst) +{ + struct v4l2_m2m_ctx *m2m_ctx = inst->v4l2_fh.m2m_ctx; + struct vpu_src_buffer *vpu_buf; + int ret = 0; + + if (m2m_ctx->last_src_buf) { + struct vpu_src_buffer *vpu_buf = wave5_to_vpu_src_buf(m2m_ctx->last_src_buf); + + if (vpu_buf->consumed) { + dev_dbg(inst->dev->dev, "last src buffer already written\n"); + return 0; + } + } + + list_for_each_entry(vpu_buf, &inst->avail_src_bufs, list) { + struct vb2_v4l2_buffer *vbuf = &vpu_buf->v4l2_m2m_buf.vb; + struct vpu_buf *ring_buffer = &inst->bitstream_vbuf; + size_t src_size = vb2_get_plane_payload(&vbuf->vb2_buf, 0); + void *src_buf = vb2_plane_vaddr(&vbuf->vb2_buf, 0); + dma_addr_t rd_ptr = 0; + dma_addr_t wr_ptr = 0; + size_t remain_size = 0; + + if (vpu_buf->consumed) { + dev_dbg(inst->dev->dev, "already copied src buf (%u) to the ring buffer\n", + vbuf->vb2_buf.index); + continue; + } + + if (!src_buf) { + dev_dbg(inst->dev->dev, + "%s: Acquiring kernel pointer to src buf (%u), fail\n", + __func__, vbuf->vb2_buf.index); + break; + } + + ret = wave5_vpu_dec_get_bitstream_buffer(inst, &rd_ptr, &wr_ptr, &remain_size); + if (ret) { + /* Unable to acquire the mutex */ + dev_err(inst->dev->dev, "Getting the bitstream buffer, fail: %d\n", + ret); + return ret; + } + + dev_dbg(inst->dev->dev, "%s: rd_ptr %pad wr_ptr %pad", __func__, &rd_ptr, &wr_ptr); + + if (remain_size < src_size) { + dev_dbg(inst->dev->dev, + "%s: remaining size: %zu < source size: %zu for src buf (%u)\n", + __func__, remain_size, src_size, vbuf->vb2_buf.index); + break; + } + + ret = write_to_ringbuffer(inst, src_buf, src_size, ring_buffer, wr_ptr); + if (ret) { + dev_err(inst->dev->dev, "Write src buf (%u) to ring buffer, fail: %d\n", + vbuf->vb2_buf.index, ret); + return ret; + } + + ret = wave5_vpu_dec_update_bitstream_buffer(inst, src_size); + if (ret) { + dev_dbg(inst->dev->dev, + "update_bitstream_buffer fail: %d for src buf (%u)\n", + ret, vbuf->vb2_buf.index); + break; + } + + vpu_buf->consumed = true; + + /* Don't write buffers passed the last one while draining. */ + if (v4l2_m2m_is_last_draining_src_buf(m2m_ctx, vbuf)) { + dev_dbg(inst->dev->dev, "last src buffer written to the ring buffer\n"); + break; + } + + inst->queuing_num++; + list_del_init(&vpu_buf->list); + break; + } + + return ret; +} + +static void wave5_vpu_dec_feed_remaining(struct vpu_instance *inst) +{ + int ret = 0; + struct v4l2_m2m_ctx *m2m_ctx = inst->v4l2_fh.m2m_ctx; + u32 fail_res = 0; + + mutex_lock(&inst->feed_lock); + ret = fill_ringbuffer(inst); + mutex_unlock(&inst->feed_lock); + if (ret) { + dev_warn(inst->dev->dev, "Filling ring buffer failed\n"); + return; + } + + ret = start_decode(inst, &fail_res); + if (ret) { + dev_err(inst->dev->dev, + "Frame decoding on m2m context (%p), fail: %d (result: %d)\n", + m2m_ctx, ret, fail_res); + } + + v4l2_m2m_job_finish(inst->v4l2_m2m_dev, m2m_ctx); +} + static void flag_last_buffer_done(struct vpu_instance *inst) { struct v4l2_m2m_ctx *m2m_ctx = inst->v4l2_fh.m2m_ctx; @@ -347,7 +482,6 @@ static void wave5_vpu_dec_finish_decode(struct vpu_instance *inst) struct vb2_v4l2_buffer *dec_buf = NULL; struct vb2_v4l2_buffer *disp_buf = NULL; struct vb2_queue *dst_vq = v4l2_m2m_get_dst_vq(m2m_ctx); - struct queue_status_info q_status; dev_dbg(inst->dev->dev, "%s: Fetch output info from firmware.", __func__); @@ -441,20 +575,6 @@ static void wave5_vpu_dec_finish_decode(struct vpu_instance *inst) } spin_unlock_irqrestore(&inst->state_spinlock, flags); } - - /* - * During a resolution change and while draining, the firmware may flush - * the reorder queue regardless of having a matching decoding operation - * pending. Only terminate the job if there are no more IRQ coming. - */ - wave5_vpu_dec_give_command(inst, DEC_GET_QUEUE_STATUS, &q_status); - if (q_status.report_queue_count == 0 && - (q_status.instance_queue_count == 0 || dec_info.sequence_changed)) { - dev_dbg(inst->dev->dev, "%s: finishing job.\n", __func__); - pm_runtime_mark_last_busy(inst->dev->dev); - pm_runtime_put_autosuspend(inst->dev->dev); - v4l2_m2m_job_finish(inst->v4l2_m2m_dev, m2m_ctx); - } } static int wave5_vpu_dec_querycap(struct file *file, void *fh, struct v4l2_capability *cap) @@ -794,11 +914,21 @@ static int wave5_vpu_dec_stop(struct vpu_instance *inst) } if (inst->state != VPU_INST_STATE_NONE) { + struct vb2_v4l2_buffer *vbuf; + struct vpu_src_buffer *vpu_buf; + /* * Temporarily release the state_spinlock so that subsequent * calls do not block on a mutex while inside this spinlock. */ spin_unlock_irqrestore(&inst->state_spinlock, flags); + vbuf = v4l2_m2m_last_src_buf(m2m_ctx); + if (vbuf) { + vpu_buf = wave5_to_vpu_src_buf(vbuf); + if (!vpu_buf->consumed) + wave5_vpu_dec_feed_remaining(inst); + } + ret = wave5_vpu_dec_set_eos_on_firmware(inst); if (ret) return ret; @@ -1116,115 +1246,6 @@ static int wave5_prepare_fb(struct vpu_instance *inst) return 0; } -static int write_to_ringbuffer(struct vpu_instance *inst, void *buffer, size_t buffer_size, - struct vpu_buf *ring_buffer, dma_addr_t wr_ptr) -{ - size_t size; - size_t offset = wr_ptr - ring_buffer->daddr; - int ret; - - if (wr_ptr + buffer_size > ring_buffer->daddr + ring_buffer->size) { - size = ring_buffer->daddr + ring_buffer->size - wr_ptr; - ret = wave5_vdi_write_memory(inst->dev, ring_buffer, offset, (u8 *)buffer, size); - if (ret < 0) - return ret; - - ret = wave5_vdi_write_memory(inst->dev, ring_buffer, 0, (u8 *)buffer + size, - buffer_size - size); - if (ret < 0) - return ret; - } else { - ret = wave5_vdi_write_memory(inst->dev, ring_buffer, offset, (u8 *)buffer, - buffer_size); - if (ret < 0) - return ret; - } - - return 0; -} - -static int fill_ringbuffer(struct vpu_instance *inst) -{ - struct v4l2_m2m_ctx *m2m_ctx = inst->v4l2_fh.m2m_ctx; - struct v4l2_m2m_buffer *buf, *n; - int ret; - - if (m2m_ctx->last_src_buf) { - struct vpu_src_buffer *vpu_buf = wave5_to_vpu_src_buf(m2m_ctx->last_src_buf); - - if (vpu_buf->consumed) { - dev_dbg(inst->dev->dev, "last src buffer already written\n"); - return 0; - } - } - - v4l2_m2m_for_each_src_buf_safe(m2m_ctx, buf, n) { - struct vb2_v4l2_buffer *vbuf = &buf->vb; - struct vpu_src_buffer *vpu_buf = wave5_to_vpu_src_buf(vbuf); - struct vpu_buf *ring_buffer = &inst->bitstream_vbuf; - size_t src_size = vb2_get_plane_payload(&vbuf->vb2_buf, 0); - void *src_buf = vb2_plane_vaddr(&vbuf->vb2_buf, 0); - dma_addr_t rd_ptr = 0; - dma_addr_t wr_ptr = 0; - size_t remain_size = 0; - - if (vpu_buf->consumed) { - dev_dbg(inst->dev->dev, "already copied src buf (%u) to the ring buffer\n", - vbuf->vb2_buf.index); - continue; - } - - if (!src_buf) { - dev_dbg(inst->dev->dev, - "%s: Acquiring kernel pointer to src buf (%u), fail\n", - __func__, vbuf->vb2_buf.index); - break; - } - - ret = wave5_vpu_dec_get_bitstream_buffer(inst, &rd_ptr, &wr_ptr, &remain_size); - if (ret) { - /* Unable to acquire the mutex */ - dev_err(inst->dev->dev, "Getting the bitstream buffer, fail: %d\n", - ret); - return ret; - } - - dev_dbg(inst->dev->dev, "%s: rd_ptr %pad wr_ptr %pad", __func__, &rd_ptr, &wr_ptr); - - if (remain_size < src_size) { - dev_dbg(inst->dev->dev, - "%s: remaining size: %zu < source size: %zu for src buf (%u)\n", - __func__, remain_size, src_size, vbuf->vb2_buf.index); - break; - } - - ret = write_to_ringbuffer(inst, src_buf, src_size, ring_buffer, wr_ptr); - if (ret) { - dev_err(inst->dev->dev, "Write src buf (%u) to ring buffer, fail: %d\n", - vbuf->vb2_buf.index, ret); - return ret; - } - - ret = wave5_vpu_dec_update_bitstream_buffer(inst, src_size); - if (ret) { - dev_dbg(inst->dev->dev, - "update_bitstream_buffer fail: %d for src buf (%u)\n", - ret, vbuf->vb2_buf.index); - break; - } - - vpu_buf->consumed = true; - - /* Don't write buffers passed the last one while draining. */ - if (v4l2_m2m_is_last_draining_src_buf(m2m_ctx, vbuf)) { - dev_dbg(inst->dev->dev, "last src buffer written to the ring buffer\n"); - break; - } - } - - return 0; -} - static void wave5_vpu_dec_buf_queue_src(struct vb2_buffer *vb) { struct vpu_instance *inst = vb2_get_drv_priv(vb->vb2_queue); @@ -1236,6 +1257,11 @@ static void wave5_vpu_dec_buf_queue_src(struct vb2_buffer *vb) vbuf->sequence = inst->queued_src_buf_num++; v4l2_m2m_buf_queue(m2m_ctx, vbuf); + + INIT_LIST_HEAD(&vpu_buf->list); + mutex_lock(&inst->feed_lock); + list_add_tail(&vpu_buf->list, &inst->avail_src_bufs); + mutex_unlock(&inst->feed_lock); } static void wave5_vpu_dec_buf_queue_dst(struct vb2_buffer *vb) @@ -1362,7 +1388,6 @@ static int wave5_vpu_dec_start_streaming(struct vb2_queue *q, unsigned int count goto return_buffers; } } - } pm_runtime_mark_last_busy(inst->dev->dev); pm_runtime_put_autosuspend(inst->dev->dev); @@ -1385,6 +1410,13 @@ static int streamoff_output(struct vb2_queue *q) dma_addr_t new_rd_ptr; struct dec_output_info dec_info; unsigned int i; + struct vpu_src_buffer *vpu_buf, *tmp; + + inst->retry = false; + inst->queuing_num = 0; + + list_for_each_entry_safe(vpu_buf, tmp, &inst->avail_src_bufs, list) + list_del_init(&vpu_buf->list); for (i = 0; i < v4l2_m2m_num_dst_bufs_ready(m2m_ctx); i++) { ret = wave5_vpu_dec_set_disp_flag(inst, i); @@ -1481,10 +1513,8 @@ static void wave5_vpu_dec_stop_streaming(struct vb2_queue *q) wave5_vpu_dec_give_command(inst, DEC_GET_QUEUE_STATUS, &q_status); - if (q_status.report_queue_count == 0) - break; - - if (wave5_vpu_wait_interrupt(inst, VPU_DEC_TIMEOUT) < 0) + if ((inst->state == VPU_INST_STATE_STOP || q_status.instance_queue_count == 0) && + q_status.report_queue_count == 0) break; if (wave5_vpu_dec_get_output_info(inst, &dec_output_info)) @@ -1577,13 +1607,23 @@ static void wave5_vpu_dec_device_run(void *priv) struct queue_status_info q_status; u32 fail_res = 0; int ret = 0; + unsigned long flags; dev_dbg(inst->dev->dev, "%s: Fill the ring buffer with new bitstream data", __func__); pm_runtime_resume_and_get(inst->dev->dev); - ret = fill_ringbuffer(inst); - if (ret) { - dev_warn(inst->dev->dev, "Filling ring buffer failed\n"); - goto finish_job_and_return; + if (!inst->retry) { + mutex_lock(&inst->feed_lock); + ret = fill_ringbuffer(inst); + mutex_unlock(&inst->feed_lock); + if (ret < 0) { + dev_warn(inst->dev->dev, "Filling ring buffer failed\n"); + goto finish_job_and_return; + } else if (!inst->eos && + inst->queuing_num == 0 && + inst->state == VPU_INST_STATE_PIC_RUN) { + dev_dbg(inst->dev->dev, "%s: no bitstream for feeding, so skip ", __func__); + goto finish_job_and_return; + } } switch (inst->state) { @@ -1619,7 +1659,9 @@ static void wave5_vpu_dec_device_run(void *priv) * we had a chance to switch, which leads to an invalid state * change. */ + spin_lock_irqsave(&inst->state_spinlock, flags); switch_state(inst, VPU_INST_STATE_PIC_RUN); + spin_unlock_irqrestore(&inst->state_spinlock, flags); /* * During DRC, the picture decoding remains pending, so just leave the job @@ -1634,12 +1676,14 @@ static void wave5_vpu_dec_device_run(void *priv) ret = wave5_prepare_fb(inst); if (ret) { dev_warn(inst->dev->dev, "Framebuffer preparation, fail: %d\n", ret); + spin_lock_irqsave(&inst->state_spinlock, flags); switch_state(inst, VPU_INST_STATE_STOP); + spin_unlock_irqrestore(&inst->state_spinlock, flags); break; } if (q_status.instance_queue_count) { - dev_dbg(inst->dev->dev, "%s: leave with active job", __func__); + v4l2_m2m_job_finish(inst->v4l2_m2m_dev, m2m_ctx); return; } @@ -1650,14 +1694,22 @@ static void wave5_vpu_dec_device_run(void *priv) dev_err(inst->dev->dev, "Frame decoding on m2m context (%p), fail: %d (result: %d)\n", m2m_ctx, ret, fail_res); - break; + goto finish_job_and_return; + } + + if (fail_res == WAVE5_SYSERR_QUEUEING_FAIL) { + inst->retry = true; + } else { + inst->retry = false; + if (!inst->eos) + inst->queuing_num--; } - /* Return so that we leave this job active */ - dev_dbg(inst->dev->dev, "%s: leave with active job", __func__); - return; - default: - WARN(1, "Execution of a job in state %s illegal.\n", state_to_str(inst->state)); break; + default: + if (!v4l2_m2m_has_stopped(m2m_ctx)) + WARN(1, "Execution of a job in state %s illegal.\n", + state_to_str(inst->state)); + return; } finish_job_and_return: @@ -1676,10 +1728,7 @@ static void wave5_vpu_dec_job_abort(void *priv) if (ret) return; - ret = wave5_vpu_dec_set_eos_on_firmware(inst); - if (ret) - dev_warn(inst->dev->dev, - "Setting EOS for the bitstream, fail: %d\n", ret); + v4l2_m2m_job_finish(inst->v4l2_m2m_dev, inst->v4l2_fh.m2m_ctx); } static int wave5_vpu_dec_job_ready(void *priv) @@ -1755,6 +1804,8 @@ static int wave5_vpu_open_dec(struct file *filp) inst->ops = &wave5_vpu_dec_inst_ops; spin_lock_init(&inst->state_spinlock); + mutex_init(&inst->feed_lock); + INIT_LIST_HEAD(&inst->avail_src_bufs); inst->codec_info = kzalloc(sizeof(*inst->codec_info), GFP_KERNEL); if (!inst->codec_info) @@ -1830,9 +1881,6 @@ static int wave5_vpu_open_dec(struct file *filp) if (ret) goto cleanup_inst; - if (list_empty(&dev->instances)) - pm_runtime_use_autosuspend(inst->dev->dev); - list_add_tail(&inst->list, &dev->instances); mutex_unlock(&dev->dev_lock); diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c index 1e5fc5f8b856..cf20f774ed1b 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c @@ -1774,9 +1774,6 @@ static int wave5_vpu_open_enc(struct file *filp) if (ret) goto cleanup_inst; - if (list_empty(&dev->instances)) - pm_runtime_use_autosuspend(inst->dev->dev); - list_add_tail(&inst->list, &dev->instances); mutex_unlock(&dev->dev_lock); diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.c b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.c index e5e879a13e8b..c1737fac6edd 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.c +++ b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.c @@ -207,8 +207,6 @@ int wave5_vpu_dec_close(struct vpu_instance *inst, u32 *fail_res) int retry = 0; struct vpu_device *vpu_dev = inst->dev; int i; - int inst_count = 0; - struct vpu_instance *inst_elm; *fail_res = 0; if (!inst->codec_info) @@ -233,6 +231,16 @@ int wave5_vpu_dec_close(struct vpu_instance *inst, u32 *fail_res) retry++ >= MAX_FIRMWARE_CALL_RETRY) { ret = -ETIMEDOUT; goto unlock_and_return; + } else if (*fail_res == WAVE5_SYSERR_VPU_STILL_RUNNING) { + struct dec_output_info dec_info; + + mutex_unlock(&vpu_dev->hw_lock); + wave5_vpu_dec_get_output_info(inst, &dec_info); + ret = mutex_lock_interruptible(&vpu_dev->hw_lock); + if (ret) { + pm_runtime_put_sync(inst->dev->dev); + return ret; + } } } while (ret != 0); @@ -249,11 +257,7 @@ int wave5_vpu_dec_close(struct vpu_instance *inst, u32 *fail_res) } wave5_vdi_free_dma_memory(vpu_dev, &p_dec_info->vb_task); - - list_for_each_entry(inst_elm, &vpu_dev->instances, list) - inst_count++; - if (inst_count == 1) - pm_runtime_dont_use_autosuspend(vpu_dev->dev); + mutex_destroy(&inst->feed_lock); unlock_and_return: mutex_unlock(&vpu_dev->hw_lock); @@ -720,8 +724,6 @@ int wave5_vpu_enc_close(struct vpu_instance *inst, u32 *fail_res) int ret; int retry = 0; struct vpu_device *vpu_dev = inst->dev; - int inst_count = 0; - struct vpu_instance *inst_elm; *fail_res = 0; if (!inst->codec_info) @@ -765,11 +767,6 @@ int wave5_vpu_enc_close(struct vpu_instance *inst, u32 *fail_res) wave5_vdi_free_dma_memory(vpu_dev, &p_enc_info->vb_task); - list_for_each_entry(inst_elm, &vpu_dev->instances, list) - inst_count++; - if (inst_count == 1) - pm_runtime_dont_use_autosuspend(vpu_dev->dev); - mutex_unlock(&vpu_dev->hw_lock); pm_runtime_put_sync(inst->dev->dev); diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h index 45615c15beca..6ca1ddc67c64 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h +++ b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h @@ -163,7 +163,7 @@ enum set_param_option { #define BUFFER_MARGIN 4096 -#define MAX_FIRMWARE_CALL_RETRY 10 +#define MAX_FIRMWARE_CALL_RETRY 30 #define VDI_LITTLE_ENDIAN 0x0 @@ -812,6 +812,9 @@ struct vpu_instance { bool cbcr_interleave; bool nv21; bool eos; + bool retry; + int queuing_num; + struct mutex feed_lock; /* lock for feeding bitstream buffers */ struct vpu_buf bitstream_vbuf; dma_addr_t last_rd_ptr; size_t remaining_consumed_bytes; From patchwork Wed Mar 19 03:50:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "jackson.lee" X-Patchwork-Id: 14022030 Received: from SEVP216CU002.outbound.protection.outlook.com (mail-koreacentralazon11022108.outbound.protection.outlook.com [40.107.43.108]) (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 BB4CD24EF74; Wed, 19 Mar 2025 03:50:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.43.108 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742356253; cv=fail; b=rJwLWK9zDnTkEkkZq3AjheEleavtkfTNAMmNLlHtmGUQPmmWtH55FFLrv5ECgS1qT3rj1TBn7hz2XPoFW2Ecbj53C+PDhG4jyDGDo0n4xNGolyHcmQuVIX+LdiTrsx8ggEy7QTG/wFDYAfwn0Remqsvq61mXJ9N0vCUp0ccpPeo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742356253; c=relaxed/simple; bh=0wpiRU4g35XyqLsrD7lYpNfV6QpZ98dcHP1DQJWv1tc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=aLTcule8pCxCB3iw8tZJu3UOuGIoe8lulU2rdUvPqmdqpizRlCQqVm7SKaWQzqRgaIoMBtwLHlJGPDFiS4Nh+a+tZDZxh1ogYzE96gSpsdYL+WGKgIB/vnrBTVH1rcoU26RYwn9NcHPmqjOa8iu0lrIRVQJwqdF/9m68eqL8RkI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=chipsnmedia.com; spf=fail smtp.mailfrom=chipsnmedia.com; dkim=pass (1024-bit key) header.d=chipsnmedia.com header.i=@chipsnmedia.com header.b=JGO8mIMP; arc=fail smtp.client-ip=40.107.43.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=chipsnmedia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=chipsnmedia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chipsnmedia.com header.i=@chipsnmedia.com header.b="JGO8mIMP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PFDJc7iIBxXjQTK1NbXl/qdM/LipU6hJs3tpU5py36RpWI/fI275RttxUV2Uk1S0I6IwCu3KwNkDUZsrvmWEx8TjrBtxS9NnzGc+TpQWAHUqOAQmz2moVbWIuy6BOr6HvhVSinFnzxLw3bzzT0KwVkCV6/o3fXMa5XAgMxq660sskYLURYH4KwYYT8GX19rJHKXzQJY5TSo9knkFRoTKRFmBQmeUX6I9uXiNwdJ/3JN3cDIjwM+ljoW7jOtpiVF4VVrW2s86fXuTp9LfAMa4Ed0DK7JdzrbGM8BChhM3XGn8491U1kxqYBY+C1/y3fcs95A7F074wsQzU96JBTn9eA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=rl/CRTQCiOJ2PRwkrhO17DtPxSJLPNq6JXLj5I1yjws=; b=MxjM52eNx+c6jYIw9HiZ5nYxLOQGUrcjE9rYO/n7d6FXU/TarmqSDXSq/0UcBV+JidgYfO/6l8qXQvlYehJ/YcwhhjPXDnoApQ0HGwgdnA3QIcaf97437BMXYvI1avgI3qgPVFjx4EBCsKxxuMbB/6rx7DtIZFI9Z/D9OHE+QKI+6pbwc5m29MJZxSrAF0NvK7ImEJpPkJYbYPSzAbBWxJnYT+NKCIh7vAyrg+cYk9lg8eBePNKG03RDaMjn5sJRCpXRoVOqmV16ZTbfv+zy15ZE48cdzA7rkyMhHzPapg2reBNmiitzTgvJbCEwUiGxE+9Souy62ZUZdYwa74d2KQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=chipsnmedia.com; dmarc=pass action=none header.from=chipsnmedia.com; dkim=pass header.d=chipsnmedia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chipsnmedia.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rl/CRTQCiOJ2PRwkrhO17DtPxSJLPNq6JXLj5I1yjws=; b=JGO8mIMPvIJPVzuZzDHs/DD+re9qqk7naThBV+xCYAaaXvpOZ8tP0QVfD/pAKc43H6GIF7dYk6kIEI3ulCUE5f+umDyyIcjG8VNcRKKDuZ4/8PDmA/XfM0JBygkTHKz4+1ayXegmOtJT96TzBANPOo3Hs+G7C/KfWIZwPMGaMfI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=chipsnmedia.com; Received: from SE1P216MB1303.KORP216.PROD.OUTLOOK.COM (2603:1096:101:15::5) by PU4P216MB2051.KORP216.PROD.OUTLOOK.COM (2603:1096:301:130::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Wed, 19 Mar 2025 03:50:43 +0000 Received: from SE1P216MB1303.KORP216.PROD.OUTLOOK.COM ([fe80::b711:5ab1:b5a4:d01b]) by SE1P216MB1303.KORP216.PROD.OUTLOOK.COM ([fe80::b711:5ab1:b5a4:d01b%6]) with mapi id 15.20.8534.034; Wed, 19 Mar 2025 03:50:43 +0000 From: "Jackson.lee" To: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, sebastian.fricke@collabora.com, nicolas.dufresne@collabora.com, bob.beckett@collabora.com, dafna.hirschfeld@collabora.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, jackson.lee@chipsnmedia.com, lafley.kim@chipsnmedia.com, b-brnich@ti.com, hverkuil@xs4all.nl, nas.chung@chipsnmedia.com Subject: [RESEND PATCH v0 2/3] media: chips-media: wave5: Reduce high CPU load Date: Wed, 19 Mar 2025 12:50:33 +0900 Message-Id: <20250319035034.111-3-jackson.lee@chipsnmedia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250319035034.111-1-jackson.lee@chipsnmedia.com> References: <20250319035034.111-1-jackson.lee@chipsnmedia.com> X-ClientProxiedBy: SL2P216CA0085.KORP216.PROD.OUTLOOK.COM (2603:1096:101:2::18) To SE1P216MB1303.KORP216.PROD.OUTLOOK.COM (2603:1096:101:15::5) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SE1P216MB1303:EE_|PU4P216MB2051:EE_ X-MS-Office365-Filtering-Correlation-Id: abca870c-93e5-41ed-dc5f-08dd6699392c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|52116014|7416014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: 2zBfG7psPnL8XXhHKpQDj857Y+0iddUSHG/jI0gv5OHlb1Cj5vm+GjFypK6ff2hKKjBT9k9ibXnkDC/5HID2YGyFj33irbLHpn7BYNj+YdogHVDsspg2tpKB4CokfRlb6t5u8hTIRhPY4URbyLnGvq3VQQCCBIqSvATtfl8GrUNb9oi4dVSgyLYM+2CE7nb2akrNUnYzA2h2r7+eh/QkONX+AV26KkMynLxiwp6wt/G8DQE8kwD6yH0YBIViLw/UV7wvQ3leyQwRrRLhkfma8+czRMqrtEM//GEFQ++5h29R7xdkSgn4uQZSnJgwRfor8XHT0URtr7wJGfohRmEl1pZszKV2RTwPZZ/iMKz+SswYVkRelKdD5MVzi86gWDdV7lrlP/GV4tzy2BwwfAI/tehPOe7C9GBwBpfRzbNikZDP+KsML9BJa0+f9WfnBRTkwcmGm+3PgeR1rghPKm2SPHvZyFjkJT1ipIHAEQuWoyyI8qxvI9BGKT6u9xdaT01WKmLWztAcctldMnN8d0nokGmYxt1VCPEU4w2TfJh2bKp/L0CyHAzBB+N89xugMq4WWPKX0xqOHUd+V9EuJu8yVZCCZM5c4wpchD6TG4+x1po/q+CT3NppYEvHajiegs+mTVhq6ObXGwQihHyOB37ekEuLiNv+i/chMzaZzyoVDqURrluLg+OkKuh6izr8OpiFXV/hp83Ue5Nopca+5uXTz/JBXl6kh+ur7UmqbwcnH0GXqnDuxbIVDIpm8J4qWaXfnmM0slcoOK6RzJMXf5TLawGwAgZC/EEE3QiN+mDUn1ia4mwAyLkE/DUAz3HI8T/do0cgRBUVy1KtPpTN/Wl64ieUePlPf2h5vid9H+IvdV+aGNHSFvTnDCkp9ipk3gdjeOfZFx+EwnjU2JNoIQQ0i+0DXHxbu1FUaH55Bnh+DWaplUhFlYV9bwRrH9bzxcPnBXcQFMlfDZP7ikc5FFEPOoSX7G3rjXfLO6h15G3UoU/9+gZdHPz0Qa5L5H9vZ+8Ud3CkNBtacKyvzCu0M23q5A6OeqktoexxucLYKODQQ1zZElkgT4gsmjkSSsY3PTm3LdculSYXEzoRsezLc5VeIN+vNUFQqi0hoD2fOSmAHsPnjE62ptzvOD5WHPntGlX/NBlpImcjgWvZ8CtTiRG4L/7JGK0Vz6oFg2r2Oz7q16jGdGC+mxlmJ//BPbpZUZoCNYlHF0ziSOEoBFUuynwN68UwG7XASfhXd+BvU7C1gTN5hOKJHt1e/DIY6SlGPB9XGglFTPcR5A53DDRexJFSmCL+5iOF7ZRQnJF3DXb/PtWkeOaA8W2QQ4xiWCuF0gMnjUS0k0IDugQMuFfFfRonTShwCaFQ3WuglGY2n5C0bTpTZZA7k+aV0uA+yEsWs1RZAxujk8l5ERawOFQlCdAsFcB82Z0X52Ary6h5GFv2WvHDKGSu6jolAzwh4dejzABX X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SE1P216MB1303.KORP216.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(52116014)(7416014)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: y+uao13z7Tsph4FrzAatIz+9XI9r3Aym2O1FPyI9zbjz21YkwOeJ5/aPuBT4oJ0NkYWNpMGgvL8Ah0SKLC1UpP7qfCL1dJJqlaC5Ux/OvNQ2B9ocJq6gl3MAPeUUz5ifmPtBN6hFAN3apnDQJBH/ME7p274Ug7lG53yOTTevY9tGP9cYG9zI6YjTNdhtLnd+T4BQUCMnQSKKThhu2ZJtz8aYlmmyWaZrzVgRKAN+aNm3eqHKtugrcY0XZPaJ0oZYMWd2sjKQw7QG6T45+KAl7Yw4t5XyR81vSeltzxOLZX+6ZkMSDWUnK9cY5EXcLCkbCv6yHpX3AXipI9M9kVrtyzPuDINkNvoi/4GFs8EtjKYiKYOW4HoeoiMPXT7y6wfs94Sfh7RxO0RGk9ksVz1OO81QTQ8rtIIpDVxnv5lf+Q7zZKRD3+nDBuRgOYXMROpZ062r/wqnoIw+kt2oh2fTyEQpcgJDSaraHIGwLbGexolhb8GJUT/TLvaBkkBMaUf0B4tuWq1Wz8nwhxgJJvonESVLj4YHLkSjJdBzp09LcP4UEQaBb+j8qVeyIzAx8Efn0gajfzKaDZiO+tFHvCloFl+PDjWjUTH6N+MlrOaVUKTJDefIqq8nNVr4C9b2tTEpLoX7rqJ84H08f9VC8WBY+g6zIbLCZkCJ3hwxHx35b4q8Jc6r8SqMKT9rBb/A7hvWAfU96aiIbpJP1Nkxq9LPwsP9NlUBMqj+JehEUAO/NLoMTnScXzvFKDy4ZS07H6h1cOpIT1JtzSsKxfFPIshgDHJvB+xZnQQ7dLeK3J0mK7dYTqyLwKH5ax1PyumDFyCklFE6wlMZ9cXNHAK9lvYCDfivNvKvXefmhL0KlILouBIQYojU/y07uhc1MnjkMrkB/6MLXKANJwGWX4fSxZUFddYQa3ACGK+qLkdqC4CVP1PGIDEHapv4NxmQSKDWjpb6kgB04dICSxjewK7BbkhXGBxSsL57pc5Fpp1FUpJmHC1h8IlSzpywjlhgejCFiin4JsPAZ2nuYJ19N902ojMMsf1FTJ7Bao7oQyyXYqttIX2Kc/7UurdCU43ObESx41AS3+0Je0r9YY6vGEgrajXV+/Rr/3NUFyc86pf9ybRIpKZkTAAvmqaS1xKUeCL9mF7vwx4juV8uiRzJ9QaaFqTo414s6FPsq0EwegwELB7Y62TSLsYEr21OmbUjhUqjWeq7oUws0RTwL6A5Bf7wFONSl3ImN4IU70zymyBjUHH3FX/y0fnQym+VkCMRge8qU2ITcbyIsjHlLDhxAGyWoL/fq+is2IZGPmwb/5cD6bBqsZPDkt9NV/MwTWqJ+8+QjH6dbmYAsuze1xqIl3Pl3OUTmYoShw4z69qxSxcY0jH6cxAXyAm9KYUzZMMbikxL18j1FN6IBLaFFINjwxGkW78A8HYEKiMUs9yzmoORP77LQ08vaK5D2s6GYRWA+bzjnlk+co7uKJr7Us0gdqAqH77gp3xk/zGxOoFolLExF/abTJzLIxVO4SiMus2WsrTlDZe8nqWtfFZHzusp43f7mvMXTclFhylpLUQmnLYx9Mb7SCx+4ocNTTrDv+FCHQjDKRQ9DnmIHGPFstZZX4mU0KVv9g== X-OriginatorOrg: chipsnmedia.com X-MS-Exchange-CrossTenant-Network-Message-Id: abca870c-93e5-41ed-dc5f-08dd6699392c X-MS-Exchange-CrossTenant-AuthSource: SE1P216MB1303.KORP216.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Mar 2025 03:50:43.4091 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4d70c8e9-142b-4389-b7f2-fa8a3c68c467 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: NK8/jeclcXUTh9CJuw41yPlxEgW43Ajwbb/P8eHzlb1lnEomVSXVHfaaKvlBhY0tSdYgR8N0f3CgMR7xW4T08I7T5A3rvggoqXQhaE1HCiI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PU4P216MB2051 From: Jackson Lee Since applying changes for performance improvement of decoder, there was a problem related to high CPU load. CPU load was more than 4 times when comparing CPU load. The root cause was the device_run was called many times even if there was no bitstream which should be queued. Signed-off-by: Jackson Lee Signed-off-by: Nas Chung --- .../media/platform/chips-media/wave5/wave5-vpu-dec.c | 12 +++++++++--- .../media/platform/chips-media/wave5/wave5-vpuapi.h | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c index cc47da509703..5ba3aaba24ce 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c @@ -1313,10 +1313,13 @@ static void wave5_vpu_dec_buf_queue(struct vb2_buffer *vb) __func__, vb->type, vb->index, vb2_plane_size(&vbuf->vb2_buf, 0), vb2_plane_size(&vbuf->vb2_buf, 1), vb2_plane_size(&vbuf->vb2_buf, 2)); - if (vb->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) + if (vb->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { + if (inst->empty_queue) + inst->empty_queue = false; wave5_vpu_dec_buf_queue_src(vb); - else if (vb->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) + } else if (vb->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { wave5_vpu_dec_buf_queue_dst(vb); + } } static int wave5_vpu_dec_allocate_ring_buffer(struct vpu_instance *inst) @@ -1506,6 +1509,7 @@ static void wave5_vpu_dec_stop_streaming(struct vb2_queue *q) dev_dbg(inst->dev->dev, "%s: type: %u\n", __func__, q->type); pm_runtime_resume_and_get(inst->dev->dev); + inst->empty_queue = false; while (check_cmd) { struct queue_status_info q_status; @@ -1622,6 +1626,7 @@ static void wave5_vpu_dec_device_run(void *priv) inst->queuing_num == 0 && inst->state == VPU_INST_STATE_PIC_RUN) { dev_dbg(inst->dev->dev, "%s: no bitstream for feeding, so skip ", __func__); + inst->empty_queue = true; goto finish_job_and_return; } } @@ -1764,7 +1769,8 @@ static int wave5_vpu_dec_job_ready(void *priv) "No capture buffer ready to decode!\n"); break; } else if (!wave5_is_draining_or_eos(inst) && - !v4l2_m2m_num_src_bufs_ready(m2m_ctx)) { + (!v4l2_m2m_num_src_bufs_ready(m2m_ctx) || + inst->empty_queue)) { dev_dbg(inst->dev->dev, "No bitstream data to decode!\n"); break; diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h index 6ca1ddc67c64..3f6e37b6be86 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h +++ b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h @@ -813,6 +813,7 @@ struct vpu_instance { bool nv21; bool eos; bool retry; + bool empty_queue; int queuing_num; struct mutex feed_lock; /* lock for feeding bitstream buffers */ struct vpu_buf bitstream_vbuf; From patchwork Wed Mar 19 03:50:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "jackson.lee" X-Patchwork-Id: 14022031 Received: from SEVP216CU002.outbound.protection.outlook.com (mail-koreacentralazon11022108.outbound.protection.outlook.com [40.107.43.108]) (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 E61E224F594; Wed, 19 Mar 2025 03:50:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.43.108 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742356256; cv=fail; b=f2fRxMwarJw9B5AzXODBMsVuBcnZiR1ERFw1J10rzzRRBcwZMIx9uH2VIA7hHMLNmnOEhXp5WylWuLc6AcyzLCDk+M66AW761Zk0AmPWRXTgqkDkrlR2dFP9jKegrotq7ipikQsdcUX80WINfxt9G3TIsK3rwHzI2gXQV4/Olh8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742356256; c=relaxed/simple; bh=kfv2KXRFezh74wVkyT8AM/nGrknV7Tw6RPGF3Os/QvQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=HdKjfGrDrGDhhwHL3RqbycwCfeI8mq+k4QyPQeCFhqvwRBpuFBAG9uUAn83GduORx5iluhFQM6B5a3ftF5tiKu9WMvcSamQGGUgInHHdFJlPs7gvDvPfmuSKd/VPMGmk0EUUTN+xZT00mXB7rVYXuvAS0OFOZ0f8N1Y103sjZ7s= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=chipsnmedia.com; spf=fail smtp.mailfrom=chipsnmedia.com; dkim=pass (1024-bit key) header.d=chipsnmedia.com header.i=@chipsnmedia.com header.b=A5yqrUms; arc=fail smtp.client-ip=40.107.43.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=chipsnmedia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=chipsnmedia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chipsnmedia.com header.i=@chipsnmedia.com header.b="A5yqrUms" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Y7OfOaZ058xAvdkRvSAsoPuxW7cFKMkEQufbOgW83zIbdIT4xD01KPQccLoy/nO3e2c5JyxEx7heTJfqWhI8kq9p8wSHAOumiurnbKHsiibgP2OA/K6VCSCrju784wYB1hdVCEU5yI1Kl5yDNUzvWZj0aX2nKak5ftrdL34NWy7m5oAJ0aYVzL+K+dhvjdv7BOhKe44tcHT3aVoNmx3JANFWXLAnWVDle+BqymmPismfYOPyAaaTmteskqpyK+2mFOemHqlnQK15JCNncurun1H8ysN4pJiJtCxW14SDVQLyTv79Rf59hBfG5A5yHQ1dKFUxzdCwp5wKGZdtVHilzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=c6z30Q+2UXaNMxS4uKdeVPjaoSaJTlzXcua8T7qQn3c=; b=ywkkECYO8Lch3y/QobQ5gAm8hKV1GgGNLeLSbpaixgcwQ5YAC7zjSNlgKpg4v0XPGdgIyxwdjef4SrbPoMKSk6YDyX0g7m8bX4FBPXjH1sF9Elu9MMDkBjb4gq7yZGhqiST8FXu1JKJwTBT9K+jeYwtuRn/ug5e2LgWAztktRbo4Wi++3AJQUGHsf299jJg+HXG0mSrJE6SWKeImGxI8jBjAHoJyGPhHNjFr/gFaGpWGz7wUyuT+jef58uVcu6D0Zm7b2wMw6Unaen99oX9SS9Bjs/ix4cnzZ1tLe2L1odZvq+ZkuZjy4EM1LEIK6SAOC19Twn1siHQIMwxO4/zmtQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=chipsnmedia.com; dmarc=pass action=none header.from=chipsnmedia.com; dkim=pass header.d=chipsnmedia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chipsnmedia.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=c6z30Q+2UXaNMxS4uKdeVPjaoSaJTlzXcua8T7qQn3c=; b=A5yqrUmss/YNjnrZzIxD6ikb+kt0ZN4URq03zxd+HPF+E3hntBXbcWzsNn7QewK7hiy5Ryq3sLYb/qFZ7aY2rP1Ba2U21rDCNQm4/7C0cn0rcSCHODt6Mxo7RrKjNQwHIPd/1HnoV0W36LaOloN9MVMaanNUa3q7kH0hYEzECCE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=chipsnmedia.com; Received: from SE1P216MB1303.KORP216.PROD.OUTLOOK.COM (2603:1096:101:15::5) by PU4P216MB2051.KORP216.PROD.OUTLOOK.COM (2603:1096:301:130::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Wed, 19 Mar 2025 03:50:43 +0000 Received: from SE1P216MB1303.KORP216.PROD.OUTLOOK.COM ([fe80::b711:5ab1:b5a4:d01b]) by SE1P216MB1303.KORP216.PROD.OUTLOOK.COM ([fe80::b711:5ab1:b5a4:d01b%6]) with mapi id 15.20.8534.034; Wed, 19 Mar 2025 03:50:43 +0000 From: "Jackson.lee" To: mchehab@kernel.org, hverkuil-cisco@xs4all.nl, sebastian.fricke@collabora.com, nicolas.dufresne@collabora.com, bob.beckett@collabora.com, dafna.hirschfeld@collabora.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, jackson.lee@chipsnmedia.com, lafley.kim@chipsnmedia.com, b-brnich@ti.com, hverkuil@xs4all.nl, nas.chung@chipsnmedia.com Subject: [RESEND PATCH v0 3/3] media: chips-media: wave5: Fix Null reference while testing fluster Date: Wed, 19 Mar 2025 12:50:34 +0900 Message-Id: <20250319035034.111-4-jackson.lee@chipsnmedia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250319035034.111-1-jackson.lee@chipsnmedia.com> References: <20250319035034.111-1-jackson.lee@chipsnmedia.com> X-ClientProxiedBy: SL2P216CA0085.KORP216.PROD.OUTLOOK.COM (2603:1096:101:2::18) To SE1P216MB1303.KORP216.PROD.OUTLOOK.COM (2603:1096:101:15::5) Precedence: bulk X-Mailing-List: linux-media@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SE1P216MB1303:EE_|PU4P216MB2051:EE_ X-MS-Office365-Filtering-Correlation-Id: a0ea24ad-fc96-428e-90f0-08dd6699396b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|52116014|7416014|376014|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: YOoYWYIFvzYjDABx0b4cZ+9wnnrootOoaO4zFrLvMjloFhXel7qnRxqZ2qs9Wh44DAaPdfb50DhICLC0vp/QuFpHvJlYvyXhFqdhmRzZ2jafvc7QtvmbcmMaaCn+z2gFq4uX0PjdA4mjSqgXlLuMZFlP2GmxCiX+pPqXe/ayGgchMIBkQCYR0sB8HR7U0uxMIljO8rNSraLKXXBpHREYG+KjCyttEHR5VJx8CheurWrpEcK6i0IfWnAzXxKldgiect6RgUtNgz0g+k14QED15Js8nDSTamOIJXSVKXMzeGq9xlAjFdhKb+d33bLF3OUT6+XUaUXS/wo3kjAGRCMYZmva+dhvsGIH3kJux/EUNcTIKL/YG8iwfikzKd7vpwIxdlvakVROr3HxI1ACb7qT0h694ZWL957ZyEMM+x4khEe+WdkozkXdlvyvuANGF79ItPayUPHGcs/miXzMo5M9XVIZWEiyXr9RoOWet/+gKFnIq+hr2pQjlqOGhMjUFv5bzkKu+3x+/dCnaYSKS0P59Tex+dZ2bejWGRT/wWPqf/vrRKWvRs6P0r3Djk4zdGrimo+bwi+2GhBElMf9zvL6Yz+DomXYt73UUevUr+EYH9g/lbOFDEPcJy0M9RlqUUaVzKH5EArDJzRtMgLWmfMO7Tw80BGS81wC1xs/LanAqMg7X4Uzlh85DRfa3K8BmLMCX80fCcHY9Ln2f78d1DOVDVEyzNjjeHLHePzG9dzHvVnqDQNSor+bSTCzBFa6sQoZa1DLuEY6yk2rKETd6CqKsfcewHKCbeODKO0n17Xt8ziwDQbVDdRZY4s1xi+zTe1F3igdiM0fnYUCtmDZ0sLnhH0gWg5BdYv4OZcDI7hviCxyEU5AMO6i1ZihVHXK+DGZBfENZk2Vm3kN8z/iUbshvaBJOXGpnN4nQdQu0ZkuB4hxha0x12snW4FFac79tK5jevS6zri6EqnNX3LHTGWw96kvc8jrj30d3LDVX2lLqkUo822bWORMZ8cITr5gxnceU5YKTy8zL9al4Z+9B/dZOJzR5X9AqC6nVDDaOT2dyNSAYV23s5CwLczaJ1G3wCcZcVzXUGDbBrxXFLcJTGwFaCCIecELUJLqCKqLBOxNIOwDFElbWJcugtcAFdUartIV+aFgzifQpag+T0EH6gANIdVSaEUhAcCO2gXGvA108D6WQF1TQjNsWAZiDELmhQl3yLnrHpsisboQqfF/WkUXVI0HyLNDreNcS6TNc6Eh6z/dRqGseInmc2B9hvet7S3L92kGPNMn+Cw0KvpAxWC86B879xvF6TS1+iFVDDcF5n9I5EfwO/5zkyoZRcPf0w359Tjt9LF/eSo+ZFwy3ZVlUW7k+mf3QNLkqjxyhPrG7HcqBzCrP1cPGkAxUE1QS27+xU5j2ziJPO2Yb1JTvWrahD18z15G67Puzw6HiC63P0T09b6PephTwCgJ9jHQmcIG X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SE1P216MB1303.KORP216.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(52116014)(7416014)(376014)(1800799024)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: FnDxHaJFq3BRtNs8d05ixg9SQpZ3OnrbqN1OXxSW1HDAh31uc7cy9bYoke+8sK5/rugWXyU72E07ab4D79l0uMEG6ShPnomnvYKW+B9BI3FjQh6p++yKwKVJ2C97JmlQn1OLxYL7fXqMF/qDo0A+17EZvWYcp1fPS+SXxHubzMjn7AR4858FDAPtOg2O3fk2OsnqsBGEEJeFcHCThsiMg45sEW2zVl0MHs+Kgww4UcsIZKlkIdb1SbqeZZbqPgA5cqmMV6ss58CKtipT3Ozo2mnc+IKNs+Ts96mTtAH0KwOUvQqaU3LP+pUBWFkL50UfNDAgbGP28zS8JToBUtNVlS6mByc+F7HYOYNi0AnDlMgxSsS8u52RNo+RD2X4hS8EPUXvBlqtR3A0nrsV6BPaDMRQrCQpZCAQ+iFggycTGjnrF7xhvlOFXjrmxwkO4McxxbF9vp4ECspWdvHz1uYxVGv7kPFWJr1MSh9IvLi+j+qfg/vDpDWKABZllIBFunkzC4L6YDYJ5Y56fsJydu7BiJ1mx1QTLQ1M00csXO8j4VTp2GwxTwmWZ3DyRhuQ1rHkfMPuxsVaX1gSoObTr7ucJEA3sHaSfDV6jOs0rJwhpHPG5h1BVQeLnJKd57gf+l0UF0uYyB6JxyW199r5iLsysmCIGs7q+tE/LsfWYN6tWqeKwr0ybxhvq12AEJZUI4qQcu9oFzJ8CpE0i/5zo32nocgcRe8j9IursBVa6LhWdIxCrH2zNK9R1RfWqG1wusV9VjTb/SsxSHo0anA1ypDHHyQ029PyCPaf/ZjOUql1PPio/JPHkLgebg37eOzTmrArHvnfxjrJLXEm9JiRDLebg7v4yi1bC287HeU35jslMzAZywA7Ua92qG/fzNTPEF6T/VskTK+lYy9tmv2mD2uPYiSbtnC6nCttZv4xP/Kjs5W5dOpN2KIpX4fB5k/kGhj0/Ao6xMokCmRTys/jO4FXPHgcxI3aeGfFRAo3w/ULiE+EyXL0GEJPu7PPJtMhDw6grCARanEQfiU1jdIdEmuG6AvqvQI95hpvd7TzO0qJF+wqletOavy+cXfBJL/fTPVoebL/RtDNUVXp4IwOMtqY2Qf2XG9CGP6OwOtJkcXjil7RxjwW4fX7RLs2jdwXzBlheteRRz3/M7Ehl9/uIWovuZLZ/6V70H5Ov3xBOczfWEDiqibz2Knmrcl/zSVE3nAlC5RlULPukcI8zidgCVhEfrhK9fIZCJlHP0KcacV6fcMDxWM/Ek/WI/WpwMmurTxqqL79l+njNO8Dw8X7e+T3CKME8laSkTsQiLJYcb0QoXmhYFYp8Z8zmZHZZOZ8IU6kPLXeTQIKtkQMMqG2s/gaNiBspXjVE/ZvT2wl+xXHjCovM7Rib2cYTmTusEUXheb43lA7cNF5iZbXkctCXmuCTa0C0iWuOSN+MKTPbYCqL6dAkWBIk+kUsNdZvPK1YvJIWtXw9J9HyeHSs8DFVS+5Z7Vt96EF2CrN46i5gFZBnrE7a0EmhT6aES/HFAWSDVuPcWLQMxy7+atIdxOZHIlIVPilwXo+l/a74cNCEhHCqXv3Pee3RmG83BUzpJ8Pw+fIymU9ErCYALslXeep4vfDLw== X-OriginatorOrg: chipsnmedia.com X-MS-Exchange-CrossTenant-Network-Message-Id: a0ea24ad-fc96-428e-90f0-08dd6699396b X-MS-Exchange-CrossTenant-AuthSource: SE1P216MB1303.KORP216.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Mar 2025 03:50:43.7212 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4d70c8e9-142b-4389-b7f2-fa8a3c68c467 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: O8m8+Ta52sSvN1k8+8bNU+TsaCTKosV/Q5SFDRolmwGzSRm4+PpVEzkfLrWUxUVxRasMkGstx+6EB3NS4YmmZXu070CCvwh4r2pDMZ+xF0c= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PU4P216MB2051 From: Jackson Lee When multi instances are created/destroyed, many interrupts happens or structures for decoder are removed. "struct vpu_instance" this structure is shared for all flow in decoder, so if the structure is not protected by lock, Null reference exception could happens sometimes. IRQ Handler was spilt to two phases and Lock was added as well. Signed-off-by: Jackson Lee Signed-off-by: Nas Chung --- .../platform/chips-media/wave5/wave5-helper.c | 10 ++- .../chips-media/wave5/wave5-vpu-dec.c | 5 ++ .../chips-media/wave5/wave5-vpu-enc.c | 5 ++ .../platform/chips-media/wave5/wave5-vpu.c | 69 ++++++++++++++++--- .../platform/chips-media/wave5/wave5-vpuapi.h | 6 ++ 5 files changed, 86 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/chips-media/wave5/wave5-helper.c b/drivers/media/platform/chips-media/wave5/wave5-helper.c index 2c9d8cbca6e4..5d9969bb7ada 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-helper.c +++ b/drivers/media/platform/chips-media/wave5/wave5-helper.c @@ -49,7 +49,7 @@ void wave5_cleanup_instance(struct vpu_instance *inst) v4l2_fh_del(&inst->v4l2_fh); v4l2_fh_exit(&inst->v4l2_fh); } - list_del_init(&inst->list); + kfifo_free(&inst->irq_status); ida_free(&inst->dev->inst_ida, inst->id); kfree(inst->codec_info); kfree(inst); @@ -61,8 +61,16 @@ int wave5_vpu_release_device(struct file *filp, { struct vpu_instance *inst = wave5_to_vpu_inst(filp->private_data); int ret = 0; + unsigned long flags; v4l2_m2m_ctx_release(inst->v4l2_fh.m2m_ctx); + ret = mutex_lock_interruptible(&inst->dev->irq_lock); + if (ret) + return ret; + spin_lock_irqsave(&inst->dev->irq_spinlock, flags); + list_del_init(&inst->list); + spin_unlock_irqrestore(&inst->dev->irq_spinlock, flags); + mutex_unlock(&inst->dev->irq_lock); if (inst->state != VPU_INST_STATE_NONE) { u32 fail_res; diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c index 5ba3aaba24ce..38f7a98192ad 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c @@ -1868,6 +1868,11 @@ static int wave5_vpu_open_dec(struct file *filp) inst->xfer_func = V4L2_XFER_FUNC_DEFAULT; init_completion(&inst->irq_done); + ret = kfifo_alloc(&inst->irq_status, 16 * sizeof(int), GFP_KERNEL); + if (ret) { + dev_err(inst->dev->dev, "failed to allocate fifo\n"); + goto cleanup_inst; + } inst->id = ida_alloc(&inst->dev->inst_ida, GFP_KERNEL); if (inst->id < 0) { diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c index cf20f774ed1b..7f1aa392805f 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu-enc.c @@ -1760,6 +1760,11 @@ static int wave5_vpu_open_enc(struct file *filp) inst->frame_rate = 30; init_completion(&inst->irq_done); + ret = kfifo_alloc(&inst->irq_status, 16 * sizeof(int), GFP_KERNEL); + if (ret) { + dev_err(inst->dev->dev, "failed to allocate fifo\n"); + goto cleanup_inst; + } inst->id = ida_alloc(&inst->dev->inst_ida, GFP_KERNEL); if (inst->id < 0) { diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpu.c b/drivers/media/platform/chips-media/wave5/wave5-vpu.c index 5948a18958d1..1a8eec206f53 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpu.c +++ b/drivers/media/platform/chips-media/wave5/wave5-vpu.c @@ -51,8 +51,11 @@ static void wave5_vpu_handle_irq(void *dev_id) u32 seq_done; u32 cmd_done; u32 irq_reason; - struct vpu_instance *inst; + u32 irq_subreason; + struct vpu_instance *inst, *tmp; struct vpu_device *dev = dev_id; + int val; + unsigned long flags; irq_reason = wave5_vdi_read_register(dev, W5_VPU_VINT_REASON); seq_done = wave5_vdi_read_register(dev, W5_RET_SEQ_DONE_INSTANCE_INFO); @@ -60,7 +63,8 @@ static void wave5_vpu_handle_irq(void *dev_id) wave5_vdi_write_register(dev, W5_VPU_VINT_REASON_CLR, irq_reason); wave5_vdi_write_register(dev, W5_VPU_VINT_CLEAR, 0x1); - list_for_each_entry(inst, &dev->instances, list) { + spin_lock_irqsave(&dev->irq_spinlock, flags); + list_for_each_entry_safe(inst, tmp, &dev->instances, list) { if (irq_reason & BIT(INT_WAVE5_INIT_SEQ) || irq_reason & BIT(INT_WAVE5_ENC_SET_PARAM)) { @@ -82,14 +86,22 @@ static void wave5_vpu_handle_irq(void *dev_id) irq_reason & BIT(INT_WAVE5_ENC_PIC)) { if (cmd_done & BIT(inst->id)) { cmd_done &= ~BIT(inst->id); - wave5_vdi_write_register(dev, W5_RET_QUEUE_CMD_DONE_INST, - cmd_done); - inst->ops->finish_process(inst); + if (dev->irq >= 0) { + irq_subreason = + wave5_vdi_read_register(dev, W5_VPU_VINT_REASON); + if (!(irq_subreason & BIT(INT_WAVE5_DEC_PIC))) + wave5_vdi_write_register(dev, + W5_RET_QUEUE_CMD_DONE_INST, + cmd_done); + } + val = BIT(INT_WAVE5_DEC_PIC); + kfifo_in(&inst->irq_status, &val, sizeof(int)); } } - - wave5_vpu_clear_interrupt(inst, irq_reason); } + spin_unlock_irqrestore(&dev->irq_spinlock, flags); + + up(&dev->irq_sem); } static irqreturn_t wave5_vpu_irq_thread(int irq, void *dev_id) @@ -121,6 +133,35 @@ static enum hrtimer_restart wave5_vpu_timer_callback(struct hrtimer *timer) return HRTIMER_RESTART; } +static int irq_thread(void *data) +{ + struct vpu_device *dev = (struct vpu_device *)data; + struct vpu_instance *inst, *tmp; + int irq_status, ret; + + while (!kthread_should_stop()) { + if (down_interruptible(&dev->irq_sem)) + continue; + + if (kthread_should_stop()) + break; + + mutex_lock(&dev->irq_lock); + list_for_each_entry_safe(inst, tmp, &dev->instances, list) { + while (kfifo_len(&inst->irq_status)) { + ret = kfifo_out(&inst->irq_status, &irq_status, sizeof(int)); + if (!ret) + break; + + inst->ops->finish_process(inst); + } + } + mutex_unlock(&dev->irq_lock); + } + + return 0; +} + static int wave5_vpu_load_firmware(struct device *dev, const char *fw_name, u32 *revision) { @@ -224,6 +265,8 @@ static int wave5_vpu_probe(struct platform_device *pdev) mutex_init(&dev->dev_lock); mutex_init(&dev->hw_lock); + mutex_init(&dev->irq_lock); + spin_lock_init(&dev->irq_spinlock); dev_set_drvdata(&pdev->dev, dev); dev->dev = &pdev->dev; @@ -266,6 +309,10 @@ static int wave5_vpu_probe(struct platform_device *pdev) } dev->product = wave5_vpu_get_product_id(dev); + sema_init(&dev->irq_sem, 1); + INIT_LIST_HEAD(&dev->instances); + dev->irq_thread = kthread_run(irq_thread, dev, "irq thread"); + dev->irq = platform_get_irq(pdev, 0); if (dev->irq < 0) { dev_err(&pdev->dev, "failed to get irq resource, falling back to polling\n"); @@ -288,7 +335,6 @@ static int wave5_vpu_probe(struct platform_device *pdev) } } - INIT_LIST_HEAD(&dev->instances); ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); if (ret) { dev_err(&pdev->dev, "v4l2_device_register, fail: %d\n", ret); @@ -351,6 +397,12 @@ static void wave5_vpu_remove(struct platform_device *pdev) { struct vpu_device *dev = dev_get_drvdata(&pdev->dev); + if (dev->irq_thread) { + kthread_stop(dev->irq_thread); + up(&dev->irq_sem); + dev->irq_thread = NULL; + } + if (dev->irq < 0) { kthread_destroy_worker(dev->worker); hrtimer_cancel(&dev->hrtimer); @@ -361,6 +413,7 @@ static void wave5_vpu_remove(struct platform_device *pdev) mutex_destroy(&dev->dev_lock); mutex_destroy(&dev->hw_lock); + mutex_destroy(&dev->irq_lock); reset_control_assert(dev->resets); clk_bulk_disable_unprepare(dev->num_clks, dev->clks); wave5_vpu_enc_unregister_device(dev); diff --git a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h index 3f6e37b6be86..6fcaae62bd73 100644 --- a/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h +++ b/drivers/media/platform/chips-media/wave5/wave5-vpuapi.h @@ -8,6 +8,7 @@ #ifndef VPUAPI_H_INCLUDED #define VPUAPI_H_INCLUDED +#include #include #include #include @@ -747,6 +748,7 @@ struct vpu_device { struct video_device *video_dev_enc; struct mutex dev_lock; /* lock for the src, dst v4l2 queues */ struct mutex hw_lock; /* lock hw configurations */ + struct mutex irq_lock; int irq; enum product_id product; struct vpu_attr attr; @@ -764,7 +766,10 @@ struct vpu_device { struct kthread_worker *worker; int vpu_poll_interval; int num_clks; + struct task_struct *irq_thread; + struct semaphore irq_sem; struct reset_control *resets; + spinlock_t irq_spinlock; /* protect instances list */ }; struct vpu_instance; @@ -788,6 +793,7 @@ struct vpu_instance { enum v4l2_ycbcr_encoding ycbcr_enc; enum v4l2_quantization quantization; + struct kfifo irq_status; enum vpu_instance_state state; enum vpu_instance_type type; const struct vpu_instance_ops *ops;