[PATCH v6 04/10] media: mediatek: vcodec: add profile and level supporting for MT8189
From: Kyrie Wu <hidden>
Date: 2025-12-02 07:40:56
Also in:
linux-arm-kernel, 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
add profile and level supporting for H264 and vp9 of MT8189 Signed-off-by: Kyrie Wu <redacted> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> --- .../vcodec/decoder/mtk_vcodec_dec_drv.h | 16 ++ .../vcodec/decoder/mtk_vcodec_dec_stateful.c | 12 ++ .../vcodec/decoder/mtk_vcodec_dec_stateless.c | 177 ++++++++++-------- 3 files changed, 130 insertions(+), 75 deletions(-)
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 2dbde8d00e6f..a8baeab98477 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@@ -76,6 +76,16 @@ struct vdec_pic_info { unsigned int reserved; }; +/** + * struct mtk_vcodec_dec_params - decoder supported parameters + * @level: decoder supported vcodec level + * @profile: decoder supported vcodec profile + */ +struct mtk_vcodec_dec_params { + s64 level; + s64 profile; +}; + /** * struct mtk_vcodec_dec_pdata - compatible data for each IC * @init_vdec_params: init vdec params
@@ -96,6 +106,9 @@ struct vdec_pic_info { * @is_subdev_supported: whether support parent-node architecture(subdev) * @uses_stateless_api: whether the decoder uses the stateless API with requests * @chip_name: platforms configuration values + * @h264_params: H264 decoder default supported params + * @h265_params: H265 decoder default supported params + * @vp9_params: VP9 decoder default supported params */ struct mtk_vcodec_dec_pdata { void (*init_vdec_params)(struct mtk_vcodec_dec_ctx *ctx);
@@ -118,6 +131,9 @@ struct mtk_vcodec_dec_pdata { bool is_subdev_supported; bool uses_stateless_api; unsigned int chip_name; + struct mtk_vcodec_dec_params h264_params; + struct mtk_vcodec_dec_params h265_params; + struct mtk_vcodec_dec_params vp9_params; }; /**
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateful.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateful.c
index 8ddb61670dc6..a47906b9d717 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateful.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_stateful.c@@ -619,4 +619,16 @@ const struct mtk_vcodec_dec_pdata mtk_vdec_8173_pdata = { .is_subdev_supported = false, .hw_arch = MTK_VDEC_PURE_SINGLE_CORE, .chip_name = 8173, + .h264_params = { + .level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1, + .profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + }, + .h265_params = { + .level = V4L2_MPEG_VIDEO_HEVC_LEVEL_4, + .profile = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE, + }, + .vp9_params = { + .level = V4L2_MPEG_VIDEO_VP9_LEVEL_4_0, + .profile = V4L2_MPEG_VIDEO_VP9_PROFILE_1, + }, };
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 9e43c54f8c4d..dc3e9a2ccc2c 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@@ -549,106 +549,49 @@ static const struct v4l2_ctrl_ops mtk_vcodec_dec_ctrl_ops = { static void mtk_vcodec_dec_fill_h264_level(struct v4l2_ctrl_config *cfg, struct mtk_vcodec_dec_ctx *ctx) { - switch (ctx->dev->chip_name) { - case 8192: - case 8188: - cfg->max = V4L2_MPEG_VIDEO_H264_LEVEL_5_2; - break; - case 8195: - case 8196: - cfg->max = V4L2_MPEG_VIDEO_H264_LEVEL_6_0; - break; - case 8183: - case 8186: - cfg->max = V4L2_MPEG_VIDEO_H264_LEVEL_4_2; - break; - default: - cfg->max = V4L2_MPEG_VIDEO_H264_LEVEL_4_1; - break; - } + struct mtk_vcodec_dec_dev *pdev = ctx->dev; + + cfg->max = pdev->vdec_pdata->h264_params.level; } static void mtk_vcodec_dec_fill_h264_profile(struct v4l2_ctrl_config *cfg, struct mtk_vcodec_dec_ctx *ctx) { - switch (ctx->dev->chip_name) { - case 8188: - case 8195: - case 8196: - cfg->max = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10; - break; - default: - cfg->max = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH; - break; - } + struct mtk_vcodec_dec_dev *pdev = ctx->dev; + + cfg->max = pdev->vdec_pdata->h264_params.profile; } static void mtk_vcodec_dec_fill_h265_level(struct v4l2_ctrl_config *cfg, struct mtk_vcodec_dec_ctx *ctx) { - switch (ctx->dev->chip_name) { - case 8188: - cfg->max = V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1; - break; - case 8195: - case 8196: - cfg->max = V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2; - break; - default: - cfg->max = V4L2_MPEG_VIDEO_HEVC_LEVEL_4; - break; - } + struct mtk_vcodec_dec_dev *pdev = ctx->dev; + + cfg->max = pdev->vdec_pdata->h265_params.level; } static void mtk_vcodec_dec_fill_h265_profile(struct v4l2_ctrl_config *cfg, struct mtk_vcodec_dec_ctx *ctx) { - switch (ctx->dev->chip_name) { - case 8188: - case 8195: - case 8196: - cfg->max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10; - break; - default: - cfg->max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE; - break; - } + struct mtk_vcodec_dec_dev *pdev = ctx->dev; + + cfg->max = pdev->vdec_pdata->h265_params.profile; } static void mtk_vcodec_dec_fill_vp9_level(struct v4l2_ctrl_config *cfg, struct mtk_vcodec_dec_ctx *ctx) { - switch (ctx->dev->chip_name) { - case 8192: - case 8188: - cfg->max = V4L2_MPEG_VIDEO_VP9_LEVEL_5_1; - break; - case 8195: - case 8196: - cfg->max = V4L2_MPEG_VIDEO_VP9_LEVEL_5_2; - break; - case 8186: - cfg->max = V4L2_MPEG_VIDEO_VP9_LEVEL_4_1; - break; - default: - cfg->max = V4L2_MPEG_VIDEO_VP9_LEVEL_4_0; - break; - } + struct mtk_vcodec_dec_dev *pdev = ctx->dev; + + cfg->max = pdev->vdec_pdata->vp9_params.level; } static void mtk_vcodec_dec_fill_vp9_profile(struct v4l2_ctrl_config *cfg, struct mtk_vcodec_dec_ctx *ctx) { - switch (ctx->dev->chip_name) { - case 8188: - case 8195: - case 8196: - cfg->max = V4L2_MPEG_VIDEO_VP9_PROFILE_2; - break; - default: - cfg->max = V4L2_MPEG_VIDEO_VP9_PROFILE_1; - break; - } + struct mtk_vcodec_dec_dev *pdev = ctx->dev; + + cfg->max = pdev->vdec_pdata->vp9_params.profile; } static void mtk_vcodec_dec_reset_controls(struct v4l2_ctrl_config *cfg,
@@ -887,6 +830,18 @@ const struct mtk_vcodec_dec_pdata mtk_vdec_8183_pdata = { .is_subdev_supported = false, .hw_arch = MTK_VDEC_PURE_SINGLE_CORE, .chip_name = 8183, + .h264_params = { + .level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2, + .profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + }, + .h265_params = { + .level = V4L2_MPEG_VIDEO_HEVC_LEVEL_4, + .profile = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE, + }, + .vp9_params = { + .level = V4L2_MPEG_VIDEO_VP9_LEVEL_4_0, + .profile = V4L2_MPEG_VIDEO_VP9_PROFILE_1, + }, }; /* This platform data is used for one lat and one core architecture. */
@@ -923,6 +878,18 @@ const struct mtk_vcodec_dec_pdata mtk_vdec_8188_pdata = { .is_subdev_supported = true, .hw_arch = MTK_VDEC_LAT_SINGLE_CORE, .chip_name = 8188, + .h264_params = { + .level = V4L2_MPEG_VIDEO_H264_LEVEL_5_2, + .profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10, + }, + .h265_params = { + .level = V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1, + .profile = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10, + }, + .vp9_params = { + .level = V4L2_MPEG_VIDEO_VP9_LEVEL_5_1, + .profile = V4L2_MPEG_VIDEO_VP9_PROFILE_2, + }, }; const struct mtk_vcodec_dec_pdata mtk_vdec_8192_pdata = {
@@ -941,6 +908,18 @@ const struct mtk_vcodec_dec_pdata mtk_vdec_8192_pdata = { .is_subdev_supported = true, .hw_arch = MTK_VDEC_LAT_SINGLE_CORE, .chip_name = 8192, + .h264_params = { + .level = V4L2_MPEG_VIDEO_H264_LEVEL_5_2, + .profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + }, + .h265_params = { + .level = V4L2_MPEG_VIDEO_HEVC_LEVEL_4, + .profile = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE, + }, + .vp9_params = { + .level = V4L2_MPEG_VIDEO_VP9_LEVEL_5_1, + .profile = V4L2_MPEG_VIDEO_VP9_PROFILE_1, + }, }; const struct mtk_vcodec_dec_pdata mtk_vdec_8195_pdata = {
@@ -959,6 +938,18 @@ const struct mtk_vcodec_dec_pdata mtk_vdec_8195_pdata = { .is_subdev_supported = true, .hw_arch = MTK_VDEC_LAT_SINGLE_CORE, .chip_name = 8195, + .h264_params = { + .level = V4L2_MPEG_VIDEO_H264_LEVEL_6_0, + .profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10, + }, + .h265_params = { + .level = V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2, + .profile = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10, + }, + .vp9_params = { + .level = V4L2_MPEG_VIDEO_VP9_LEVEL_5_2, + .profile = V4L2_MPEG_VIDEO_VP9_PROFILE_2, + }, }; const struct mtk_vcodec_dec_pdata mtk_vdec_8196_pdata = {
@@ -977,6 +968,18 @@ const struct mtk_vcodec_dec_pdata mtk_vdec_8196_pdata = { .is_subdev_supported = true, .hw_arch = MTK_VDEC_LAT_SINGLE_CORE, .chip_name = 8196, + .h264_params = { + .level = V4L2_MPEG_VIDEO_H264_LEVEL_6_0, + .profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10, + }, + .h265_params = { + .level = V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2, + .profile = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10, + }, + .vp9_params = { + .level = V4L2_MPEG_VIDEO_VP9_LEVEL_5_2, + .profile = V4L2_MPEG_VIDEO_VP9_PROFILE_2, + }, }; const struct mtk_vcodec_dec_pdata mtk_vdec_single_core_pdata = {
@@ -1012,6 +1015,18 @@ const struct mtk_vcodec_dec_pdata mtk_vdec_8186_pdata = { .is_subdev_supported = true, .hw_arch = MTK_VDEC_PURE_SINGLE_CORE, .chip_name = 8186, + .h264_params = { + .level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2, + .profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + }, + .h265_params = { + .level = V4L2_MPEG_VIDEO_HEVC_LEVEL_4, + .profile = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE, + }, + .vp9_params = { + .level = V4L2_MPEG_VIDEO_VP9_LEVEL_4_1, + .profile = V4L2_MPEG_VIDEO_VP9_PROFILE_1, + }, }; const struct mtk_vcodec_dec_pdata mtk_vdec_8189_pdata = {
@@ -1030,4 +1045,16 @@ const struct mtk_vcodec_dec_pdata mtk_vdec_8189_pdata = { .is_subdev_supported = true, .hw_arch = MTK_VDEC_PURE_SINGLE_CORE, .chip_name = 8189, + .h264_params = { + .level = V4L2_MPEG_VIDEO_H264_LEVEL_5_2, + .profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10, + }, + .h265_params = { + .level = V4L2_MPEG_VIDEO_HEVC_LEVEL_4, + .profile = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE, + }, + .vp9_params = { + .level = V4L2_MPEG_VIDEO_VP9_LEVEL_5_2, + .profile = V4L2_MPEG_VIDEO_VP9_PROFILE_2, + }, };
--
2.45.2