From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) (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 C3D1C23B61B; Mon, 20 Jul 2026 01:21:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.61.82.184 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784510480; cv=none; b=LyZi0GubeqSF3uUKJXm5elmbKDlCPU2KH1TV2ccXIIstF23RlQ0fnNpuZk7f1UWtsl7I2EaPbIdi2jqEY7VD/HsGYMBU1kUdAarR83DLLk7AcxDskoQx5Itdwv/HemmriqyRV0SD2ZbLsal5kvzFzNuUMYNhYGA3eTExMsbXaNo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784510480; c=relaxed/simple; bh=lm7i3IU7XLHh8obCKs7NK2uER0zIJ1/oGywz+WaUi/o=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ktiaaFiLmh3I9hpAj633JwjACFPuErN/1jPC1XqYu+AKHyCn/Xi3/S7/SVT/cPjwFpeQ3+wz76Eo8S6vNiOVRenFcQ8+VcHMjs/N3f9ZyeQG85lUxigxICvPeRVcUCxCTL7fvf6LuriAIP9YAd6UTGPF6teT+ZA9TxQ9oZSlHUA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mediatek.com; spf=pass smtp.mailfrom=mediatek.com; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b=FZgyHwoO; arc=none smtp.client-ip=210.61.82.184 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mediatek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mediatek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="FZgyHwoO" X-UUID: 4785309483d911f18dc8c9802ae25ab1-20260720 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=4FjZd+7YQSfLoIr7uUTI6uz693s6U2ThrLtVy9x4Ymw=; b=FZgyHwoO+CoKEQ02pQNSkd7QVgeFUJZWmLRFk84WUj/dBt0mEs7H9RPw/VkYq/1Qknf+7hdpSBetiHo+BPnz3+jz12frJTAWqlRe1tsZF4kXbZxc6TJYh8io/NwQa42rKPuT315eQ/3mm4T54j33dKQr3M0KJjpE3EOtOClQacQ=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.18,REQID:6c23dcea-59a7-4c00-b991-1971c69a8cf4,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:0 X-CID-META: VersionHash:8a735a6,CLOUDID:f756d2fa-f958-43c4-854f-eb42fbf32dd1,B ulkID:nil,BulkQuantity:0,SF:81|82|102|136|836|865|888|898,TC:-5,Content:0| 15|50|99|100|102|152|156,EDM:-3|-100,IP:nil,URL:0,File:130,RT:0,Bulk:nil,Q S:nil,BEC:-1,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,A RC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 4785309483d911f18dc8c9802ae25ab1-20260720 Received: from mtkmbs10n1.mediatek.inc [(172.21.101.34)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1632947941; Mon, 20 Jul 2026 09:21:05 +0800 Received: from mtkmbs11n1.mediatek.inc (172.21.101.185) by MTKMBS14N1.mediatek.inc (172.21.101.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Mon, 20 Jul 2026 09:21:05 +0800 Received: from gcnsap21.gcn.mediatek.inc (10.17.81.22) by mtkmbs11n1.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.2562.29 via Frontend Transport; Mon, 20 Jul 2026 09:21:03 +0800 From: Kyrie Wu To: Tiffany Lin , Andrew-CT Chen , Yunfei Dong , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno , Kyrie Wu , Nicolas Dufresne , Ricardo Ribalda , Kees Cook , Hans Verkuil , Fei Shao , Haoxiang Li , Chen-Yu Tsai , Laurent Pinchart , Tomasz Figa , Sebastian Fricke , Philipp Zabel , Benjamin Gaignard , Qianfeng Rong , Irui Wang , Jacopo Mondi , Fan Wu , , , , , CC: Sakari Ailus Subject: [PATCH v6 03/14] media: mediatek: vcodec: add driver to support vcp encoder Date: Mon, 20 Jul 2026 09:20:45 +0800 Message-ID: <20260720012056.1026551-4-kyrie.wu@mediatek.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260720012056.1026551-1-kyrie.wu@mediatek.com> References: <20260720012056.1026551-1-kyrie.wu@mediatek.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-MTK: N Encoder also need to call vcp interface to communicate with vcp, add driver to support encoder. Signed-off-by: Kyrie Wu --- .../vcodec/common/mtk_vcodec_fw_vcp.c | 52 ++++++++++++++++--- .../vcodec/common/mtk_vcodec_fw_vcp.h | 1 + .../mediatek/vcodec/encoder/mtk_vcodec_enc.c | 1 - .../mediatek/vcodec/encoder/mtk_vcodec_enc.h | 2 + 4 files changed, 47 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.c b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.c index 150d842c7..ece4e3e87 100644 --- a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.c +++ b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.c @@ -13,6 +13,8 @@ #include "../decoder/mtk_vcodec_dec_drv.h" #include "../decoder/vdec_ipi_msg.h" +#include "../encoder/mtk_vcodec_enc.h" +#include "../encoder/mtk_vcodec_enc_drv.h" #include "mtk_vcodec_fw_priv.h" #define IPI_SEND_TIMEOUT_MS 100U @@ -223,8 +225,13 @@ static int mtk_vcodec_vcp_msg_ipi_send(struct mtk_vcodec_fw *fw, int id, void *b } mutex_lock(&vcp->ipi_mutex); - feature_id = VDEC_FEATURE_ID; - mailbox_id = IPI_OUT_VDEC_1; + if (fw->fw_use == ENCODER) { + feature_id = VENC_FEATURE_ID; + mailbox_id = IPI_OUT_VENC_0; + } else { + feature_id = VDEC_FEATURE_ID; + mailbox_id = IPI_OUT_VDEC_1; + } timeout_jiffies = jiffies + msecs_to_jiffies(VCP_SYNC_TIMEOUT_MS); while (!vcp_device->ops->vcp_is_ready(vcp_device, feature_id)) { @@ -348,7 +355,7 @@ static void mtk_vcodec_vcp_put_device(struct mtk_vcodec_fw *fw) static int mtk_vcodec_vcp_load_firmware(struct mtk_vcodec_fw *fw) { struct mtk_vcp_device *vcp_device; - int ret, feature_id, mem_id, mailbox_id, ipi_id; + int ret, feature_id, mem_id, mailbox_id; int i; if (fw->vcp->is_init_done) { @@ -363,10 +370,15 @@ static int mtk_vcodec_vcp_load_firmware(struct mtk_vcodec_fw *fw) vcp_device = fw->vcp->vcp_device; - feature_id = VDEC_FEATURE_ID; - mem_id = VDEC_MEM_ID; - mailbox_id = IPI_IN_VDEC_1; - ipi_id = VCP_IPI_LAT_DECODER; + if (fw->fw_use == ENCODER) { + feature_id = VENC_FEATURE_ID; + mem_id = VENC_MEM_ID; + mailbox_id = IPI_IN_VENC_0; + } else { + feature_id = VDEC_FEATURE_ID; + mem_id = VDEC_MEM_ID; + mailbox_id = IPI_IN_VDEC_1; + } ret = mtk_vcp_mbox_ipc_register(vcp_get_ipidev(vcp_device), mailbox_id, mtk_vcodec_vcp_msg_ack_isr, fw, &fw->vcp->share_data); @@ -402,6 +414,26 @@ static int mtk_vcodec_vcp_load_firmware(struct mtk_vcodec_fw *fw) mutex_init(&fw->vcp->ipi_desc[i].lock); mutex_init(&fw->vcp->ipi_mutex); + if (fw->fw_use == ENCODER) { + init_waitqueue_head(&fw->vcp->msg_wq[VCP_IPI_ENCODER]); + fw->vcp->msg_thread = + kthread_run(mtk_vcodec_vcp_msg_process_thread, fw, "vcp_enc_msq_thread"); + if (IS_ERR(fw->vcp->msg_thread)) { + ret = PTR_ERR(fw->vcp->msg_thread); + fw->vcp->msg_thread = NULL; + goto err_deregister_feature; + } + + fw->vcp->vsi_addr = vcp_device->ops->get_mem_virt(vcp_device, mem_id); + fw->vcp->vsi_size = vcp_device->ops->get_mem_size(vcp_device, mem_id); + fw->vcp->iova_addr = vcp_device->ops->get_mem_iova(vcp_device, mem_id); + + dev_dbg(&fw->pdev->dev, "enc vcp init done => va: %p size:0x%x iova:%pad.\n", + fw->vcp->vsi_addr, fw->vcp->vsi_size, &fw->vcp->iova_addr); + + return 0; + } + init_waitqueue_head(&fw->vcp->msg_wq[VCP_IPI_LAT_DECODER]); init_waitqueue_head(&fw->vcp->msg_wq[VCP_IPI_CORE_DECODER]); fw->vcp->msg_thread = @@ -530,7 +562,11 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_vcp_init(void *priv, enum mtk_vcodec_fw_use struct mtk_vcodec_fw *fw; int i; - if (fw_use == DECODER) { + if (fw_use == ENCODER) { + struct mtk_vcodec_enc_dev *enc_dev = priv; + + plat_dev = enc_dev->plat_dev; + } else if (fw_use == DECODER) { struct mtk_vcodec_dec_dev *dec_dev = priv; plat_dev = dec_dev->plat_dev; diff --git a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.h b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.h index 83742096e..97ba642dc 100644 --- a/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.h +++ b/drivers/media/platform/mediatek/vcodec/common/mtk_vcodec_fw_vcp.h @@ -16,6 +16,7 @@ typedef void (*vcp_ipi_handler_t) (void *data, unsigned int len, void *priv); /* enum mtk_vcp_ipi_index - index used to separate different hardware */ enum mtk_vcp_ipi_index { + VCP_IPI_ENCODER, VCP_IPI_LAT_DECODER, VCP_IPI_CORE_DECODER, VCP_IPI_MAX, diff --git a/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.c b/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.c index 0d4e94463..48cb5dded 100644 --- a/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.c +++ b/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.c @@ -26,7 +26,6 @@ #define MTK_DEFAULT_FRAMERATE_NUM 1001 #define MTK_DEFAULT_FRAMERATE_DENOM 30000 -#define MTK_VENC_4K_CAPABILITY_ENABLE BIT(0) static void mtk_venc_worker(struct work_struct *work); diff --git a/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.h b/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.h index 908d8179b..84156c102 100644 --- a/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.h +++ b/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc.h @@ -23,6 +23,8 @@ #define MTK_VENC_IRQ_STATUS_OFFSET 0x05C #define MTK_VENC_IRQ_ACK_OFFSET 0x060 +#define MTK_VENC_4K_CAPABILITY_ENABLE BIT(0) + /** * struct mtk_video_enc_buf - Private data related to each VB2 buffer. * @m2m_buf: M2M buffer -- 2.51.0.windows.2