[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <34c7c47e753ef6c53cf4aa7554c8ad05707df166.camel@collabora.com>
Date: Fri, 14 Nov 2025 16:31:05 -0500
From: Nicolas Dufresne <nicolas.dufresne@...labora.com>
To: Kyrie Wu <kyrie.wu@...iatek.com>, Tiffany Lin
<tiffany.lin@...iatek.com>, Andrew-CT Chen <andrew-ct.chen@...iatek.com>,
Yunfei Dong <yunfei.dong@...iatek.com>, Mauro Carvalho Chehab
<mchehab@...nel.org>, Rob Herring <robh@...nel.org>, Krzysztof Kozlowski
<krzk+dt@...nel.org>, Conor Dooley <conor+dt@...nel.org>, Matthias Brugger
<matthias.bgg@...il.com>, AngeloGioacchino Del Regno
<angelogioacchino.delregno@...labora.com>, Hans Verkuil
<hverkuil@...all.nl>, Christophe JAILLET <christophe.jaillet@...adoo.fr>,
Sebastian Fricke <sebastian.fricke@...labora.com>, Nathan Hebert
<nhebert@...omium.org>, Arnd Bergmann <arnd@...db.de>, Irui Wang
<irui.wang@...iatek.com>, George Sun <george.sun@...iatek.com>,
linux-media@...r.kernel.org, devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
linux-mediatek@...ts.infradead.org
Cc: Neil Armstrong <neil.armstrong@...aro.org>, Andrzej Pietrasiewicz
<andrzejtp2010@...il.com>
Subject: Re: [PATCH v3 2/6] media: mediatek: encoder: Add support for common
firmware interface
Hi,
Le jeudi 14 août 2025 à 16:56 +0800, Kyrie Wu a écrit :
> From: Irui Wang <irui.wang@...iatek.com>
>
> The existing encoder firmware interface implied just one type of codec:
> H.264. Future encoders may support additional codecs; however adding
> entire sets of interfaces for them is not scalable.
>
> Instead, a new "common" firmware interface is defined for non codec
> specific messages. The new messages encapsulate the old ones for
> backward compatibility.
>
> This patch adds support for these new messages.
>
> Signed-off-by: Irui Wang <irui.wang@...iatek.com>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@...labora.com>
> ---
> .../vcodec/encoder/mtk_vcodec_enc_drv.h | 3 ++
> .../mediatek/vcodec/encoder/venc_drv_if.c | 3 +-
> .../mediatek/vcodec/encoder/venc_ipi_msg.h | 26 +++++++++++++
> .../mediatek/vcodec/encoder/venc_vpu_if.c | 37 ++++++++++++-------
> 4 files changed, 54 insertions(+), 15 deletions(-)
>
> diff --git
> a/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc_drv.h
> b/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc_drv.h
> index b1277bcfcf53..426b1398f815 100644
> --- a/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc_drv.h
> +++ b/drivers/media/platform/mediatek/vcodec/encoder/mtk_vcodec_enc_drv.h
> @@ -16,6 +16,7 @@
>
> #define MTK_ENC_CTX_IS_EXT(ctx) ((ctx)->dev->venc_pdata->uses_ext)
> #define MTK_ENC_IOVA_IS_34BIT(ctx) ((ctx)->dev->venc_pdata->uses_34bit)
> +#define MTK_ENC_DRV_IS_COMM(ctx) (((ctx)->dev->venc_pdata-
> >uses_common_fw_iface))
>
> /**
> * struct mtk_vcodec_enc_pdata - compatible data for each IC
> @@ -29,6 +30,7 @@
> * @num_output_formats: number of entries in output_formats
> * @core_id: stand for h264 or vp8 encode index
> * @uses_34bit: whether the encoder uses 34-bit iova
> + * @uses_common_fw_iface: whether the encoder uses common driver interface
> */
> struct mtk_vcodec_enc_pdata {
> bool uses_ext;
> @@ -40,6 +42,7 @@ struct mtk_vcodec_enc_pdata {
> size_t num_output_formats;
> u8 core_id;
> bool uses_34bit;
> + bool uses_common_fw_iface;
> };
>
> /*
> diff --git a/drivers/media/platform/mediatek/vcodec/encoder/venc_drv_if.c
> b/drivers/media/platform/mediatek/vcodec/encoder/venc_drv_if.c
> index e83747b8d69a..f8c9349c18c0 100644
> --- a/drivers/media/platform/mediatek/vcodec/encoder/venc_drv_if.c
> +++ b/drivers/media/platform/mediatek/vcodec/encoder/venc_drv_if.c
> @@ -19,13 +19,14 @@
> int venc_if_init(struct mtk_vcodec_enc_ctx *ctx, unsigned int fourcc)
> {
> int ret = 0;
> + const bool uses_common_fw_iface = MTK_ENC_DRV_IS_COMM(ctx);
>
> switch (fourcc) {
> case V4L2_PIX_FMT_VP8:
> ctx->enc_if = &venc_vp8_if;
> break;
> case V4L2_PIX_FMT_H264:
> - ctx->enc_if = &venc_h264_if;
> + ctx->enc_if = uses_common_fw_iface ? &venc_if :
> &venc_h264_if;
> break;
> default:
> return -EINVAL;
> diff --git a/drivers/media/platform/mediatek/vcodec/encoder/venc_ipi_msg.h
> b/drivers/media/platform/mediatek/vcodec/encoder/venc_ipi_msg.h
> index bb16d96a7f57..ce3c2c8059fb 100644
> --- a/drivers/media/platform/mediatek/vcodec/encoder/venc_ipi_msg.h
> +++ b/drivers/media/platform/mediatek/vcodec/encoder/venc_ipi_msg.h
> @@ -45,6 +45,20 @@ struct venc_ap_ipi_msg_init {
> uint64_t venc_inst;
> };
>
> +/**
> + * struct venc_ap_ipi_msg_init_comm - AP to VPU init cmd structure
> + * @base: AP to VPU init cmd structure
> + * @codec_type: encoder type
> + * @reserved: reserved field
> + * @shared_iova: shared iova
> + */
> +struct venc_ap_ipi_msg_init_comm {
> + struct venc_ap_ipi_msg_init base;
> + u32 codec_type;
> + u32 reserved;
> + u64 shared_iova;
> +};
> +
> /**
> * struct venc_ap_ipi_msg_set_param - AP to VPU set_param cmd structure
> * @msg_id: message id (AP_IPIMSG_XXX_ENC_SET_PARAM)
> @@ -175,6 +189,18 @@ struct venc_vpu_ipi_msg_init {
> uint32_t venc_abi_version;
> };
>
> +/**
> + * struct venc_vpu_ipi_msg_init_comm - VPU ack AP init cmd structure
> + * @init_ack: AP init cmd structure
> + * @vpu_vsi_addr: VSI address from VPU
> + * @reserved: reserved field
> + */
> +struct venc_vpu_ipi_msg_init_comm {
> + struct venc_vpu_ipi_msg_init init_ack;
> + u32 vpu_vsi_addr;
> + u32 reserved;
> +};
> +
> /**
> * struct venc_vpu_ipi_msg_set_param - VPU ack AP set_param cmd structure
> * @msg_id: message id (VPU_IPIMSG_XXX_ENC_SET_PARAM_DONE)
> diff --git a/drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c
> b/drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c
> index 51bb7ee141b9..537b9955932e 100644
> --- a/drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c
> +++ b/drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c
> @@ -10,24 +10,25 @@
>
> static void handle_enc_init_msg(struct venc_vpu_inst *vpu, const void *data)
> {
> - const struct venc_vpu_ipi_msg_init *msg = data;
> + const struct venc_vpu_ipi_msg_init_comm *msg = data;
> + struct mtk_vcodec_fw *fw = vpu->ctx->dev->fw_handler;
>
> - vpu->inst_addr = msg->vpu_inst_addr;
> - vpu->vsi = mtk_vcodec_fw_map_dm_addr(vpu->ctx->dev->fw_handler,
> - msg->vpu_inst_addr);
> + vpu->inst_addr = msg->init_ack.vpu_inst_addr;
> + vpu->vsi = mtk_vcodec_fw_map_dm_addr(fw, vpu->inst_addr);
>
> /* Firmware version field value is unspecified on MT8173. */
> - if (mtk_vcodec_fw_get_type(vpu->ctx->dev->fw_handler) == VPU)
> + if (mtk_vcodec_fw_get_type(fw) == VPU)
> return;
>
> /* Check firmware version. */
> - mtk_venc_debug(vpu->ctx, "firmware version: 0x%x\n", msg-
> >venc_abi_version);
> - switch (msg->venc_abi_version) {
> + mtk_venc_debug(vpu->ctx, "firmware version: 0x%x\n",
> + msg->init_ack.venc_abi_version);
> + switch (msg->init_ack.venc_abi_version) {
> case 1:
> break;
> default:
> mtk_venc_err(vpu->ctx, "unhandled firmware version 0x%x\n",
> - msg->venc_abi_version);
> + msg->init_ack.venc_abi_version);
> vpu->failure = 1;
> break;
> }
> @@ -132,7 +133,8 @@ static int vpu_enc_send_msg(struct venc_vpu_inst *vpu,
> void *msg,
> int vpu_enc_init(struct venc_vpu_inst *vpu)
> {
> int status;
> - struct venc_ap_ipi_msg_init out;
> + size_t msg_size;
> + struct venc_ap_ipi_msg_init_comm out;
>
> init_waitqueue_head(&vpu->wq_hd);
> vpu->signaled = 0;
> @@ -149,9 +151,16 @@ int vpu_enc_init(struct venc_vpu_inst *vpu)
> }
>
> memset(&out, 0, sizeof(out));
> - out.msg_id = AP_IPIMSG_ENC_INIT;
> - out.venc_inst = (unsigned long)vpu;
> - if (vpu_enc_send_msg(vpu, &out, sizeof(out))) {
> + out.base.msg_id = AP_IPIMSG_ENC_INIT;
> + out.base.venc_inst = (unsigned long)vpu;
> + if (MTK_ENC_DRV_IS_COMM(vpu->ctx)) {
> + out.codec_type = vpu->ctx->q_data[MTK_Q_DATA_DST].fmt-
> >fourcc;
> + msg_size = sizeof(struct venc_ap_ipi_msg_init_comm);
> + } else {
> + msg_size = sizeof(struct venc_ap_ipi_msg_init);
> + }
> +
> + if (vpu_enc_send_msg(vpu, &out, msg_size)) {
> mtk_venc_err(vpu->ctx, "AP_IPIMSG_ENC_INIT fail");
> return -EINVAL;
> }
> @@ -260,7 +269,7 @@ static int vpu_enc_encode_32bits(struct venc_vpu_inst
> *vpu,
> sizeof(struct venc_ap_ipi_msg_enc);
> struct venc_ap_ipi_msg_enc_ext out;
>
> - mtk_venc_debug(vpu->ctx, "bs_mode %d ->", bs_mode);
> + mtk_venc_debug(vpu->ctx, "%s, bs_mode %d ->", __func__, bs_mode);
>
> memset(&out, 0, sizeof(out));
> out.base.msg_id = AP_IPIMSG_ENC_ENCODE;
> @@ -305,7 +314,7 @@ static int vpu_enc_encode_34bits(struct venc_vpu_inst
> *vpu,
> struct venc_ap_ipi_msg_enc_ext_34 out;
> size_t msg_size = sizeof(struct venc_ap_ipi_msg_enc_ext_34);
>
> - mtk_venc_debug(vpu->ctx, "bs_mode %d ->", bs_mode);
> + mtk_venc_debug(vpu->ctx, "%s, bs_mode %d ->", __func__, bs_mode);
>
> memset(&out, 0, sizeof(out));
> out.msg_id = AP_IPIMSG_ENC_ENCODE;
Download attachment "signature.asc" of type "application/pgp-signature" (229 bytes)
Powered by blists - more mailing lists