[PATCH v2 04/14] media: mediatek: vcodec: add driver to support vcp encoder
From: Yunfei Dong <yunfei.dong@mediatek.com>
Date: 2025-08-15 08:52:55
Also in:
linux-devicetree, linux-media, linux-mediatek, lkml
Subsystem:
media input infrastructure (v4l/dvb), mediatek media driver, the rest · Maintainers:
Mauro Carvalho Chehab, Tiffany Lin, Andrew-CT Chen, Yunfei Dong, Linus Torvalds
Encoder also need to call vcp interface to communicate with vcp, add driver to support encoder. Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com> --- .../vcodec/common/mtk_vcodec_fw_vcp.c | 40 +++++++++++++++---- .../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, 36 insertions(+), 8 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 227310c116c6..c9e5cde40aef 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
@@ -189,8 +191,8 @@ static int mtk_vcodec_vcp_msg_ipi_send(struct mtk_vcodec_fw *fw, int id, void *b } mutex_lock(msg_mutex); - feature_id = VDEC_FEATURE_ID; - mailbox_id = IPI_OUT_VDEC_1; + feature_id = (fw->fw_use == ENCODER) ? VENC_FEATURE_ID : VDEC_FEATURE_ID; + mailbox_id = (fw->fw_use == ENCODER) ? IPI_OUT_VENC_0 : IPI_OUT_VDEC_1; timeout_jiffies = jiffies + msecs_to_jiffies(VCP_SYNC_TIMEOUT_MS); while (!vcp_device->ops->vcp_is_ready(feature_id)) {
@@ -300,10 +302,10 @@ 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; + feature_id = fw->fw_use == ENCODER ? VENC_FEATURE_ID : VDEC_FEATURE_ID; + mem_id = fw->fw_use == ENCODER ? VENC_MEM_ID : VDEC_MEM_ID; + mailbox_id = fw->fw_use == ENCODER ? IPI_IN_VENC_0 : IPI_IN_VDEC_1; + ipi_id = fw->fw_use == ENCODER ? VCP_IPI_ENCODER : VCP_IPI_LAT_DECODER; ret = mtk_vcp_mbox_ipc_register(vcp_get_ipidev(vcp_device), mailbox_id, mtk_vcodec_vcp_msg_ack_isr, fw, &fw->vcp->share_data);
@@ -322,6 +324,20 @@ static int mtk_vcodec_vcp_load_firmware(struct mtk_vcodec_fw *fw) mutex_init(&fw->vcp->ipi_desc[ipi_id].lock); mutex_init(&fw->vcp->ipi_mutex); + if (fw->fw_use == ENCODER) { + kthread_run(mtk_vcodec_vcp_msg_process_thread, fw, "vcp_enc_msq_thread"); + + fw->vcp->vsi_addr = vcp_device->ops->vcp_get_mem_virt(mem_id); + fw->vcp->vsi_size = vcp_device->ops->vcp_get_mem_size(mem_id); + fw->vcp->iova_addr = vcp_device->ops->vcp_get_mem_iova(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); + + init_waitqueue_head(&fw->vcp->msg_wq[VCP_IPI_ENCODER]); + return 0; + } + kthread_run(mtk_vcodec_vcp_msg_process_thread, fw, "vcp_vdec_msq_thread"); fw->vcp->vsi_addr = vcp_device->ops->vcp_get_mem_virt(mem_id);
@@ -345,6 +361,11 @@ static unsigned int mtk_vcodec_vcp_get_vdec_capa(struct mtk_vcodec_fw *fw) MTK_VDEC_IS_SUPPORT_10BIT | MTK_VDEC_IS_SUPPORT_EXT; } +static unsigned int mtk_vcodec_vcp_get_venc_capa(struct mtk_vcodec_fw *fw) +{ + return MTK_VENC_4K_CAPABILITY_ENABLE; +} + static void *mtk_vcodec_vcp_dm_addr(struct mtk_vcodec_fw *fw, u32 dtcm_dmem_addr) { return NULL;
@@ -396,6 +417,7 @@ static void mtk_vcodec_vcp_release(struct mtk_vcodec_fw *fw) static const struct mtk_vcodec_fw_ops mtk_vcodec_vcp_msg = { .load_firmware = mtk_vcodec_vcp_load_firmware, .get_vdec_capa = mtk_vcodec_vcp_get_vdec_capa, + .get_venc_capa = mtk_vcodec_vcp_get_venc_capa, .map_dm_addr = mtk_vcodec_vcp_dm_addr, .ipi_register = mtk_vcodec_vcp_set_ipi_register, .ipi_send = mtk_vcodec_vcp_ipi_send,
@@ -409,7 +431,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 40f5481d1889..53080ed12c69 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 a01dc25a7699..dcafb1303c29 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 908d8179b2d2..84156c102d8d 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.45.2