Add hfi platform file with decoding capabilities for hfi v6_lite.
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
---
drivers/media/platform/qcom/venus/Makefile | 2 +-
.../media/platform/qcom/venus/hfi_platform.c | 2 +
.../media/platform/qcom/venus/hfi_platform.h | 1 +
.../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
4 files changed, 152 insertions(+), 1 deletion(-)
create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
index 91ee6be10292..4a6a942db58b 100644
--- a/drivers/media/platform/qcom/venus/Makefile
+++ b/drivers/media/platform/qcom/venus/Makefile
@@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
hfi_parser.o pm_helpers.o dbgfs.o \
hfi_platform.o hfi_platform_v4.o \
- hfi_platform_v6.o hfi_plat_bufs_v6.o \
+ hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
venus-dec-objs += vdec.o vdec_ctrls.o
venus-enc-objs += venc.o venc_ctrls.o
diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
index 643e5aa138f5..f56b8f9946d7 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform.c
+++ b/drivers/media/platform/qcom/venus/hfi_platform.c
@@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
return &hfi_plat_v4;
case HFI_VERSION_6XX:
return &hfi_plat_v6;
+ case HFI_VERSION_6XX_LITE:
+ return &hfi_plat_v6_lite;
default:
break;
}
diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
index ec89a90a8129..6356e4bd0de2 100644
--- a/drivers/media/platform/qcom/venus/hfi_platform.h
+++ b/drivers/media/platform/qcom/venus/hfi_platform.h
@@ -58,6 +58,7 @@ struct hfi_platform {
extern const struct hfi_platform hfi_plat_v4;
extern const struct hfi_platform hfi_plat_v6;
+extern const struct hfi_platform hfi_plat_v6_lite;
const struct hfi_platform *hfi_platform_get(enum hfi_version version);
unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
new file mode 100644
index 000000000000..41958a3e353b
--- /dev/null
+++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
@@ -0,0 +1,148 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) 2025, The Linux Foundation. All rights reserved.
+ */
+#include "hfi_platform.h"
+
+static const struct hfi_plat_caps caps[] = {
+{
+ .codec = HFI_VIDEO_CODEC_H264,
+ .domain = VIDC_SESSION_TYPE_DEC,
+ .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
+ .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
+ .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
+ .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
+ .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
+ .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
+ .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
+ .num_caps = 7,
+ .pl[0] = {HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_1},
+ .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
+ .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
+ .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
+ .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
+ .num_pl = 5,
+ .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
+ .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
+ .num_fmts = 4,
+}, {
+ .codec = HFI_VIDEO_CODEC_HEVC,
+ .domain = VIDC_SESSION_TYPE_DEC,
+ .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
+ .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
+ .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
+ .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
+ .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
+ .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
+ .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
+ .num_caps = 7,
+ .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
+ .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
+ .num_pl = 2,
+ .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
+ .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
+ .num_fmts = 4,
+}, {
+ .codec = HFI_VIDEO_CODEC_VP9,
+ .domain = VIDC_SESSION_TYPE_DEC,
+ .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
+ .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
+ .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
+ .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
+ .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
+ .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
+ .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
+ .num_caps = 7,
+ .pl[0] = {HFI_VP9_PROFILE_P0, 200},
+ .pl[1] = {HFI_VP9_PROFILE_P2_10B, 200},
+ .num_pl = 2,
+ .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
+ .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
+ .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
+ .num_fmts = 4,
+} };
+
+static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
+{
+ *entries = ARRAY_SIZE(caps);
+ return caps;
+}
+
+static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
+{
+ *enc_codecs = 0x0;
+ *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
+ HFI_VIDEO_CODEC_VP9;
+ *count = 3;
+}
+
+static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
+ { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
+ { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
+ { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
+};
+
+static const struct hfi_platform_codec_freq_data *
+get_codec_freq_data(u32 session_type, u32 pixfmt)
+{
+ const struct hfi_platform_codec_freq_data *data = codec_freq_data;
+ unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
+ const struct hfi_platform_codec_freq_data *found = NULL;
+
+ for (i = 0; i < data_size; i++) {
+ if (data[i].pixfmt == pixfmt &&
+ data[i].session_type == session_type) {
+ found = &data[i];
+ break;
+ }
+ }
+
+ return found;
+}
+
+static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
+{
+ const struct hfi_platform_codec_freq_data *data;
+
+ data = get_codec_freq_data(session_type, codec);
+ if (data)
+ return data->vpp_freq;
+
+ return 0;
+}
+
+static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
+{
+ const struct hfi_platform_codec_freq_data *data;
+
+ data = get_codec_freq_data(session_type, codec);
+ if (data)
+ return data->vsp_freq;
+
+ return 0;
+}
+
+static unsigned long codec_lp_freq(u32 session_type, u32 codec)
+{
+ const struct hfi_platform_codec_freq_data *data;
+
+ data = get_codec_freq_data(session_type, codec);
+ if (data)
+ return data->low_power_freq;
+
+ return 0;
+}
+
+const struct hfi_platform hfi_plat_v6_lite = {
+ .codec_vpp_freq = codec_vpp_freq,
+ .codec_vsp_freq = codec_vsp_freq,
+ .codec_lp_freq = codec_lp_freq,
+ .codecs = get_codecs,
+ .capabilities = get_capabilities,
+ .bufreq = hfi_plat_bufreq_v6,
+};
--
2.34.1
On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> Add hfi platform file with decoding capabilities for hfi v6_lite.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/venus/Makefile | 2 +-
> .../media/platform/qcom/venus/hfi_platform.c | 2 +
> .../media/platform/qcom/venus/hfi_platform.h | 1 +
> .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
> 4 files changed, 152 insertions(+), 1 deletion(-)
> create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>
> diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
> index 91ee6be10292..4a6a942db58b 100644
> --- a/drivers/media/platform/qcom/venus/Makefile
> +++ b/drivers/media/platform/qcom/venus/Makefile
> @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
> hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
> hfi_parser.o pm_helpers.o dbgfs.o \
> hfi_platform.o hfi_platform_v4.o \
> - hfi_platform_v6.o hfi_plat_bufs_v6.o \
> + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
s/hfi_platform_v6_lite/hfi_platform_v4_lite
>
> venus-dec-objs += vdec.o vdec_ctrls.o
> venus-enc-objs += venc.o venc_ctrls.o
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> index 643e5aa138f5..f56b8f9946d7 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> return &hfi_plat_v4;
> case HFI_VERSION_6XX:
> return &hfi_plat_v6;
> + case HFI_VERSION_6XX_LITE:
> + return &hfi_plat_v6_lite;
update here as well.
> default:
> break;
> }
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> index ec89a90a8129..6356e4bd0de2 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> @@ -58,6 +58,7 @@ struct hfi_platform {
>
> extern const struct hfi_platform hfi_plat_v4;
> extern const struct hfi_platform hfi_plat_v6;
> +extern const struct hfi_platform hfi_plat_v6_lite;
ditto
>
> const struct hfi_platform *hfi_platform_get(enum hfi_version version);
> unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> new file mode 100644
> index 000000000000..41958a3e353b
> --- /dev/null
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> @@ -0,0 +1,148 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
> + */
> +#include "hfi_platform.h"
> +
> +static const struct hfi_plat_caps caps[] = {
> +{
> + .codec = HFI_VIDEO_CODEC_H264,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = {HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_1},
> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
what is the reference for these values?
> + .num_pl = 5,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +}, {
> + .codec = HFI_VIDEO_CODEC_HEVC,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
> + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
what is the reference for these values?
> + .num_pl = 2,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +}, {
> + .codec = HFI_VIDEO_CODEC_VP9,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = {HFI_VP9_PROFILE_P0, 200},
> + .pl[1] = {HFI_VP9_PROFILE_P2_10B, 200},
> + .num_pl = 2,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +} };
> +
> +static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> +{
> + *entries = ARRAY_SIZE(caps);
> + return caps;
> +}
> +
> +static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +{
> + *enc_codecs = 0x0;
> + *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> + HFI_VIDEO_CODEC_VP9;
> + *count = 3;
> +}
> +
> +static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> + { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> + { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> + { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> +};
> +
> +static const struct hfi_platform_codec_freq_data *
> +get_codec_freq_data(u32 session_type, u32 pixfmt)
> +{
> + const struct hfi_platform_codec_freq_data *data = codec_freq_data;
> + unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
> + const struct hfi_platform_codec_freq_data *found = NULL;
> +
> + for (i = 0; i < data_size; i++) {
> + if (data[i].pixfmt == pixfmt &&
> + data[i].session_type == session_type) {
> + found = &data[i];
> + break;
> + }
> + }
> +
> + return found;
> +}
> +
> +static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->vpp_freq;
> +
> + return 0;
> +}
> +
> +static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->vsp_freq;
> +
> + return 0;
> +}
> +
> +static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->low_power_freq;
> +
> + return 0;
> +}
> +
> +const struct hfi_platform hfi_plat_v6_lite = {
> + .codec_vpp_freq = codec_vpp_freq,
> + .codec_vsp_freq = codec_vsp_freq,
> + .codec_lp_freq = codec_lp_freq,
> + .codecs = get_codecs,
> + .capabilities = get_capabilities,
> + .bufreq = hfi_plat_bufreq_v6,
buffer requirement should come from firmware, pls drop.
> +};
lot of code duplication here, pls see the possibility to commonize the code.
Thanks,
Dikshita
On 27/06/25 19:02:13, Dikshita Agarwal wrote:
>
>
> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> > Add hfi platform file with decoding capabilities for hfi v6_lite.
> >
> > Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> > ---
> > drivers/media/platform/qcom/venus/Makefile | 2 +-
> > .../media/platform/qcom/venus/hfi_platform.c | 2 +
> > .../media/platform/qcom/venus/hfi_platform.h | 1 +
> > .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
> > 4 files changed, 152 insertions(+), 1 deletion(-)
> > create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> >
> > diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
> > index 91ee6be10292..4a6a942db58b 100644
> > --- a/drivers/media/platform/qcom/venus/Makefile
> > +++ b/drivers/media/platform/qcom/venus/Makefile
> > @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
> > hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
> > hfi_parser.o pm_helpers.o dbgfs.o \
> > hfi_platform.o hfi_platform_v4.o \
> > - hfi_platform_v6.o hfi_plat_bufs_v6.o \
> > + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
> s/hfi_platform_v6_lite/hfi_platform_v4_lite
will remove, will use platform_v4 instead
> >
> > venus-dec-objs += vdec.o vdec_ctrls.o
> > venus-enc-objs += venc.o venc_ctrls.o
> > diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> > index 643e5aa138f5..f56b8f9946d7 100644
> > --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> > +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> > @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> > return &hfi_plat_v4;
> > case HFI_VERSION_6XX:
> > return &hfi_plat_v6;
> > + case HFI_VERSION_6XX_LITE:
> > + return &hfi_plat_v6_lite;
> update here as well.
yes, this function wont get changed
> > default:
> > break;
> > }
> > diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> > index ec89a90a8129..6356e4bd0de2 100644
> > --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> > +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> > @@ -58,6 +58,7 @@ struct hfi_platform {
> >
> > extern const struct hfi_platform hfi_plat_v4;
> > extern const struct hfi_platform hfi_plat_v6;
> > +extern const struct hfi_platform hfi_plat_v6_lite;
> ditto
neither this one
> >
> > const struct hfi_platform *hfi_platform_get(enum hfi_version version);
> > unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
> > diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> > new file mode 100644
> > index 000000000000..41958a3e353b
> > --- /dev/null
> > +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> > @@ -0,0 +1,148 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/*
> > + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
> > + */
> > +#include "hfi_platform.h"
> > +
> > +static const struct hfi_plat_caps caps[] = {
> > +{
> > + .codec = HFI_VIDEO_CODEC_H264,
> > + .domain = VIDC_SESSION_TYPE_DEC,
> > + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> > + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> > + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> > + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> > + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> > + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> > + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> > + .num_caps = 7,
> > + .pl[0] = {HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_1},
> > + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
> > + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> > + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
> > + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
> what is the reference for these values?
what do you mean? what should be the reference? I didnt see a downstream
equivalente to base on so based on the 4XX settings these seem
consistent.
IS there any internal document that you can point me to please?
> > + .num_pl = 5,
> > + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> > + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> > + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> > + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> > + .num_fmts = 4,
> > +}, {
> > + .codec = HFI_VIDEO_CODEC_HEVC,
> > + .domain = VIDC_SESSION_TYPE_DEC,
> > + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> > + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> > + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> > + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> > + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> > + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> > + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> > + .num_caps = 7,
> > + .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
> > + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
> what is the reference for these values?
same as above.
what internal documents do you typically reference to? Havent seen these
references in previous commits.
could you clarify please?
> > + .num_pl = 2,
> > + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> > + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> > + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> > + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> > + .num_fmts = 4,
> > +}, {
> > + .codec = HFI_VIDEO_CODEC_VP9,
> > + .domain = VIDC_SESSION_TYPE_DEC,
> > + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> > + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> > + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> > + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> > + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> > + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> > + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> > + .num_caps = 7,
> > + .pl[0] = {HFI_VP9_PROFILE_P0, 200},
> > + .pl[1] = {HFI_VP9_PROFILE_P2_10B, 200},
> > + .num_pl = 2,
> > + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> > + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> > + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> > + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> > + .num_fmts = 4,
> > +} };
> > +
> > +static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> > +{
> > + *entries = ARRAY_SIZE(caps);
> > + return caps;
> > +}
> > +
> > +static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> > +{
> > + *enc_codecs = 0x0;
> > + *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> > + HFI_VIDEO_CODEC_VP9;
> > + *count = 3;
> > +}
> > +
> > +static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> > + { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> > + { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> > + { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> > +};
> > +
> > +static const struct hfi_platform_codec_freq_data *
> > +get_codec_freq_data(u32 session_type, u32 pixfmt)
> > +{
> > + const struct hfi_platform_codec_freq_data *data = codec_freq_data;
> > + unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
> > + const struct hfi_platform_codec_freq_data *found = NULL;
> > +
> > + for (i = 0; i < data_size; i++) {
> > + if (data[i].pixfmt == pixfmt &&
> > + data[i].session_type == session_type) {
> > + found = &data[i];
> > + break;
> > + }
> > + }
> > +
> > + return found;
> > +}
> > +
> > +static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> > +{
> > + const struct hfi_platform_codec_freq_data *data;
> > +
> > + data = get_codec_freq_data(session_type, codec);
> > + if (data)
> > + return data->vpp_freq;
> > +
> > + return 0;
> > +}
> > +
> > +static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> > +{
> > + const struct hfi_platform_codec_freq_data *data;
> > +
> > + data = get_codec_freq_data(session_type, codec);
> > + if (data)
> > + return data->vsp_freq;
> > +
> > + return 0;
> > +}
> > +
> > +static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> > +{
> > + const struct hfi_platform_codec_freq_data *data;
> > +
> > + data = get_codec_freq_data(session_type, codec);
> > + if (data)
> > + return data->low_power_freq;
> > +
> > + return 0;
> > +}
> > +
> > +const struct hfi_platform hfi_plat_v6_lite = {
> > + .codec_vpp_freq = codec_vpp_freq,
> > + .codec_vsp_freq = codec_vsp_freq,
> > + .codec_lp_freq = codec_lp_freq,
> > + .codecs = get_codecs,
> > + .capabilities = get_capabilities,
> > + .bufreq = hfi_plat_bufreq_v6,
> buffer requirement should come from firmware, pls drop.
yes, this will be hfi_plat_v4 only
> > +};
>
> lot of code duplication here, pls see the possibility to commonize the
> > code.
this file is no longer needed
>
> Thanks,
> Dikshita
On 7/7/2025 2:43 PM, Jorge Ramirez wrote:
> On 27/06/25 19:02:13, Dikshita Agarwal wrote:
>>
>>
>> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
>>> Add hfi platform file with decoding capabilities for hfi v6_lite.
>>>
>>> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
>>> ---
>>> drivers/media/platform/qcom/venus/Makefile | 2 +-
>>> .../media/platform/qcom/venus/hfi_platform.c | 2 +
>>> .../media/platform/qcom/venus/hfi_platform.h | 1 +
>>> .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
>>> 4 files changed, 152 insertions(+), 1 deletion(-)
>>> create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>>>
>>> diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
>>> index 91ee6be10292..4a6a942db58b 100644
>>> --- a/drivers/media/platform/qcom/venus/Makefile
>>> +++ b/drivers/media/platform/qcom/venus/Makefile
>>> @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
>>> hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
>>> hfi_parser.o pm_helpers.o dbgfs.o \
>>> hfi_platform.o hfi_platform_v4.o \
>>> - hfi_platform_v6.o hfi_plat_bufs_v6.o \
>>> + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
>> s/hfi_platform_v6_lite/hfi_platform_v4_lite
>
> will remove, will use platform_v4 instead
>
>>>
>>> venus-dec-objs += vdec.o vdec_ctrls.o
>>> venus-enc-objs += venc.o venc_ctrls.o
>>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
>>> index 643e5aa138f5..f56b8f9946d7 100644
>>> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
>>> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
>>> @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
>>> return &hfi_plat_v4;
>>> case HFI_VERSION_6XX:
>>> return &hfi_plat_v6;
>>> + case HFI_VERSION_6XX_LITE:
>>> + return &hfi_plat_v6_lite;
>> update here as well.
>
> yes, this function wont get changed
>
>>> default:
>>> break;
>>> }
>>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
>>> index ec89a90a8129..6356e4bd0de2 100644
>>> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
>>> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
>>> @@ -58,6 +58,7 @@ struct hfi_platform {
>>>
>>> extern const struct hfi_platform hfi_plat_v4;
>>> extern const struct hfi_platform hfi_plat_v6;
>>> +extern const struct hfi_platform hfi_plat_v6_lite;
>> ditto
>
> neither this one
>
>>>
>>> const struct hfi_platform *hfi_platform_get(enum hfi_version version);
>>> unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
>>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>>> new file mode 100644
>>> index 000000000000..41958a3e353b
>>> --- /dev/null
>>> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>>> @@ -0,0 +1,148 @@
>>> +// SPDX-License-Identifier: GPL-2.0-only
>>> +/*
>>> + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
>>> + */
>>> +#include "hfi_platform.h"
>>> +
>>> +static const struct hfi_plat_caps caps[] = {
>>> +{
>>> + .codec = HFI_VIDEO_CODEC_H264,
>>> + .domain = VIDC_SESSION_TYPE_DEC,
>>> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
>>> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
>>> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
>>> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
>>> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
>>> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
>>> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
>>> + .num_caps = 7,
>>> + .pl[0] = {HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_1},
>>> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
>>> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
>>> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
>>> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
>> what is the reference for these values?
>
> what do you mean? what should be the reference? I didnt see a downstream
> equivalente to base on so based on the 4XX settings these seem
> consistent.
>
My question was regarding the profile and level mapping.
The profiles added are consistent with 4xx, I agree. But the value of
levels mapped with each profile is not matching with [1], hence the
question about the reference used for this mapping.
[1]
https://elixir.bootlin.com/linux/v6.16-rc4/source/drivers/media/platform/qcom/venus/hfi_platform_v4.c#L23
Thanks,
Dikshita
> IS there any internal document that you can point me to please?
>
>
>>> + .num_pl = 5,
>>> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
>>> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
>>> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
>>> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
>>> + .num_fmts = 4,
>>> +}, {
>>> + .codec = HFI_VIDEO_CODEC_HEVC,
>>> + .domain = VIDC_SESSION_TYPE_DEC,
>>> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
>>> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
>>> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
>>> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
>>> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
>>> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
>>> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
>>> + .num_caps = 7,
>>> + .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
>>> + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
>> what is the reference for these values?
>
> same as above.
>
> what internal documents do you typically reference to? Havent seen these
> references in previous commits.
>
> could you clarify please?
>
>
>>> + .num_pl = 2,
>>> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
>>> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
>>> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
>>> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
>>> + .num_fmts = 4,
>>> +}, {
>>> + .codec = HFI_VIDEO_CODEC_VP9,
>>> + .domain = VIDC_SESSION_TYPE_DEC,
>>> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
>>> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
>>> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
>>> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
>>> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
>>> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
>>> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
>>> + .num_caps = 7,
>>> + .pl[0] = {HFI_VP9_PROFILE_P0, 200},
>>> + .pl[1] = {HFI_VP9_PROFILE_P2_10B, 200},
>>> + .num_pl = 2,
>>> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
>>> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
>>> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
>>> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
>>> + .num_fmts = 4,
>>> +} };
>>> +
>>> +static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
>>> +{
>>> + *entries = ARRAY_SIZE(caps);
>>> + return caps;
>>> +}
>>> +
>>> +static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
>>> +{
>>> + *enc_codecs = 0x0;
>>> + *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
>>> + HFI_VIDEO_CODEC_VP9;
>>> + *count = 3;
>>> +}
>>> +
>>> +static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
>>> + { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
>>> + { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
>>> + { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
>>> +};
>>> +
>>> +static const struct hfi_platform_codec_freq_data *
>>> +get_codec_freq_data(u32 session_type, u32 pixfmt)
>>> +{
>>> + const struct hfi_platform_codec_freq_data *data = codec_freq_data;
>>> + unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
>>> + const struct hfi_platform_codec_freq_data *found = NULL;
>>> +
>>> + for (i = 0; i < data_size; i++) {
>>> + if (data[i].pixfmt == pixfmt &&
>>> + data[i].session_type == session_type) {
>>> + found = &data[i];
>>> + break;
>>> + }
>>> + }
>>> +
>>> + return found;
>>> +}
>>> +
>>> +static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
>>> +{
>>> + const struct hfi_platform_codec_freq_data *data;
>>> +
>>> + data = get_codec_freq_data(session_type, codec);
>>> + if (data)
>>> + return data->vpp_freq;
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
>>> +{
>>> + const struct hfi_platform_codec_freq_data *data;
>>> +
>>> + data = get_codec_freq_data(session_type, codec);
>>> + if (data)
>>> + return data->vsp_freq;
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +static unsigned long codec_lp_freq(u32 session_type, u32 codec)
>>> +{
>>> + const struct hfi_platform_codec_freq_data *data;
>>> +
>>> + data = get_codec_freq_data(session_type, codec);
>>> + if (data)
>>> + return data->low_power_freq;
>>> +
>>> + return 0;
>>> +}
>>> +
>>> +const struct hfi_platform hfi_plat_v6_lite = {
>>> + .codec_vpp_freq = codec_vpp_freq,
>>> + .codec_vsp_freq = codec_vsp_freq,
>>> + .codec_lp_freq = codec_lp_freq,
>>> + .codecs = get_codecs,
>>> + .capabilities = get_capabilities,
>>> + .bufreq = hfi_plat_bufreq_v6,
>> buffer requirement should come from firmware, pls drop.
>
> yes, this will be hfi_plat_v4 only
>
>>> +};
>>
>> lot of code duplication here, pls see the possibility to commonize the
>>> code.
>
> this file is no longer needed
>
>>
>> Thanks,
>> Dikshita
On 07/07/25 14:59:05, Dikshita Agarwal wrote:
>
>
> On 7/7/2025 2:43 PM, Jorge Ramirez wrote:
> > On 27/06/25 19:02:13, Dikshita Agarwal wrote:
> >>
> >>
> >> On 6/26/2025 7:29 PM, Jorge Ramirez-Ortiz wrote:
> >>> Add hfi platform file with decoding capabilities for hfi v6_lite.
> >>>
> >>> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> >>> ---
> >>> drivers/media/platform/qcom/venus/Makefile | 2 +-
> >>> .../media/platform/qcom/venus/hfi_platform.c | 2 +
> >>> .../media/platform/qcom/venus/hfi_platform.h | 1 +
> >>> .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
> >>> 4 files changed, 152 insertions(+), 1 deletion(-)
> >>> create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> >>>
> >>> diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
> >>> index 91ee6be10292..4a6a942db58b 100644
> >>> --- a/drivers/media/platform/qcom/venus/Makefile
> >>> +++ b/drivers/media/platform/qcom/venus/Makefile
> >>> @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
> >>> hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
> >>> hfi_parser.o pm_helpers.o dbgfs.o \
> >>> hfi_platform.o hfi_platform_v4.o \
> >>> - hfi_platform_v6.o hfi_plat_bufs_v6.o \
> >>> + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
> >> s/hfi_platform_v6_lite/hfi_platform_v4_lite
> >
> > will remove, will use platform_v4 instead
> >
> >>>
> >>> venus-dec-objs += vdec.o vdec_ctrls.o
> >>> venus-enc-objs += venc.o venc_ctrls.o
> >>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> >>> index 643e5aa138f5..f56b8f9946d7 100644
> >>> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> >>> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> >>> @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> >>> return &hfi_plat_v4;
> >>> case HFI_VERSION_6XX:
> >>> return &hfi_plat_v6;
> >>> + case HFI_VERSION_6XX_LITE:
> >>> + return &hfi_plat_v6_lite;
> >> update here as well.
> >
> > yes, this function wont get changed
> >
> >>> default:
> >>> break;
> >>> }
> >>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> >>> index ec89a90a8129..6356e4bd0de2 100644
> >>> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> >>> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> >>> @@ -58,6 +58,7 @@ struct hfi_platform {
> >>>
> >>> extern const struct hfi_platform hfi_plat_v4;
> >>> extern const struct hfi_platform hfi_plat_v6;
> >>> +extern const struct hfi_platform hfi_plat_v6_lite;
> >> ditto
> >
> > neither this one
> >
> >>>
> >>> const struct hfi_platform *hfi_platform_get(enum hfi_version version);
> >>> unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
> >>> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> >>> new file mode 100644
> >>> index 000000000000..41958a3e353b
> >>> --- /dev/null
> >>> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> >>> @@ -0,0 +1,148 @@
> >>> +// SPDX-License-Identifier: GPL-2.0-only
> >>> +/*
> >>> + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
> >>> + */
> >>> +#include "hfi_platform.h"
> >>> +
> >>> +static const struct hfi_plat_caps caps[] = {
> >>> +{
> >>> + .codec = HFI_VIDEO_CODEC_H264,
> >>> + .domain = VIDC_SESSION_TYPE_DEC,
> >>> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> >>> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> >>> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> >>> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> >>> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> >>> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> >>> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> >>> + .num_caps = 7,
> >>> + .pl[0] = {HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_1},
> >>> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
> >>> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> >>> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
> >>> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
> >> what is the reference for these values?
> >
> > what do you mean? what should be the reference? I didnt see a downstream
> > equivalente to base on so based on the 4XX settings these seem
> > consistent.
> >
> My question was regarding the profile and level mapping.
> The profiles added are consistent with 4xx, I agree. But the value of
> levels mapped with each profile is not matching with [1], hence the
> question about the reference used for this mapping.
>
> [1]
> https://elixir.bootlin.com/linux/v6.16-rc4/source/drivers/media/platform/qcom/venus/hfi_platform_v4.c#L23
ah right, AR50_LITE does not support 52 (the highest is 5).
I see your point - you are right of course.
I was doing a quite a bit of testing with fluster and I left the wrong values. My fault.
will fix.
thanks!
On 26/06/2025 14:59, Jorge Ramirez-Ortiz wrote:
> Add hfi platform file with decoding capabilities for hfi v6_lite.
>
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/venus/Makefile | 2 +-
> .../media/platform/qcom/venus/hfi_platform.c | 2 +
> .../media/platform/qcom/venus/hfi_platform.h | 1 +
> .../qcom/venus/hfi_platform_v6_lite.c | 148 ++++++++++++++++++
> 4 files changed, 152 insertions(+), 1 deletion(-)
> create mode 100644 drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
>
> diff --git a/drivers/media/platform/qcom/venus/Makefile b/drivers/media/platform/qcom/venus/Makefile
> index 91ee6be10292..4a6a942db58b 100644
> --- a/drivers/media/platform/qcom/venus/Makefile
> +++ b/drivers/media/platform/qcom/venus/Makefile
> @@ -5,7 +5,7 @@ venus-core-objs += core.o helpers.o firmware.o \
> hfi_venus.o hfi_msgs.o hfi_cmds.o hfi.o \
> hfi_parser.o pm_helpers.o dbgfs.o \
> hfi_platform.o hfi_platform_v4.o \
> - hfi_platform_v6.o hfi_plat_bufs_v6.o \
> + hfi_platform_v6.o hfi_plat_bufs_v6.o hfi_platform_v6_lite.o \
>
> venus-dec-objs += vdec.o vdec_ctrls.o
> venus-enc-objs += venc.o venc_ctrls.o
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.c b/drivers/media/platform/qcom/venus/hfi_platform.c
> index 643e5aa138f5..f56b8f9946d7 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.c
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.c
> @@ -13,6 +13,8 @@ const struct hfi_platform *hfi_platform_get(enum hfi_version version)
> return &hfi_plat_v4;
> case HFI_VERSION_6XX:
> return &hfi_plat_v6;
> + case HFI_VERSION_6XX_LITE:
> + return &hfi_plat_v6_lite;
> default:
> break;
> }
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform.h b/drivers/media/platform/qcom/venus/hfi_platform.h
> index ec89a90a8129..6356e4bd0de2 100644
> --- a/drivers/media/platform/qcom/venus/hfi_platform.h
> +++ b/drivers/media/platform/qcom/venus/hfi_platform.h
> @@ -58,6 +58,7 @@ struct hfi_platform {
>
> extern const struct hfi_platform hfi_plat_v4;
> extern const struct hfi_platform hfi_plat_v6;
> +extern const struct hfi_platform hfi_plat_v6_lite;
>
> const struct hfi_platform *hfi_platform_get(enum hfi_version version);
> unsigned long hfi_platform_get_codec_vpp_freq(enum hfi_version version, u32 codec,
> diff --git a/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> new file mode 100644
> index 000000000000..41958a3e353b
> --- /dev/null
> +++ b/drivers/media/platform/qcom/venus/hfi_platform_v6_lite.c
> @@ -0,0 +1,148 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2025, The Linux Foundation. All rights reserved.
> + */
> +#include "hfi_platform.h"
> +
> +static const struct hfi_plat_caps caps[] = {
> +{
> + .codec = HFI_VIDEO_CODEC_H264,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = {HFI_H264_PROFILE_BASELINE, HFI_H264_LEVEL_1},
> + .pl[1] = {HFI_H264_PROFILE_MAIN, HFI_H264_LEVEL_41},
> + .pl[2] = {HFI_H264_PROFILE_HIGH, HFI_H264_LEVEL_5},
> + .pl[3] = {HFI_H264_PROFILE_CONSTRAINED_BASE, HFI_H264_LEVEL_41},
> + .pl[4] = {HFI_H264_PROFILE_CONSTRAINED_HIGH, HFI_H264_LEVEL_41},
> + .num_pl = 5,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +}, {
> + .codec = HFI_VIDEO_CODEC_HEVC,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = {HFI_HEVC_PROFILE_MAIN, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
> + .pl[1] = {HFI_HEVC_PROFILE_MAIN10, HFI_HEVC_LEVEL_5 | HFI_HEVC_TIER_MAIN},
> + .num_pl = 2,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +}, {
> + .codec = HFI_VIDEO_CODEC_VP9,
> + .domain = VIDC_SESSION_TYPE_DEC,
> + .caps[0] = {HFI_CAPABILITY_FRAME_WIDTH, 128, 1920, 1},
> + .caps[1] = {HFI_CAPABILITY_FRAME_HEIGHT, 128, 1080, 1},
> + .caps[2] = {HFI_CAPABILITY_MBS_PER_FRAME, 64, 8160, 1},
> + .caps[3] = {HFI_CAPABILITY_BITRATE, 1, 60000000, 1 },
> + .caps[4] = {HFI_CAPABILITY_MBS_PER_SECOND, 64, 244800, 1},
> + .caps[5] = {HFI_CAPABILITY_FRAMERATE, 1, 120, 1},
> + .caps[6] = {HFI_CAPABILITY_MAX_VIDEOCORES, 0, 1, 1},
> + .num_caps = 7,
> + .pl[0] = {HFI_VP9_PROFILE_P0, 200},
> + .pl[1] = {HFI_VP9_PROFILE_P2_10B, 200},
> + .num_pl = 2,
> + .fmts[0] = {HFI_BUFFER_OUTPUT, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[1] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12_UBWC},
> + .fmts[2] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV12},
> + .fmts[3] = {HFI_BUFFER_OUTPUT2, HFI_COLOR_FORMAT_NV21},
> + .num_fmts = 4,
> +} };
> +
> +static const struct hfi_plat_caps *get_capabilities(unsigned int *entries)
> +{
> + *entries = ARRAY_SIZE(caps);
> + return caps;
> +}
> +
> +static void get_codecs(u32 *enc_codecs, u32 *dec_codecs, u32 *count)
> +{
> + *enc_codecs = 0x0;
> + *dec_codecs = HFI_VIDEO_CODEC_H264 | HFI_VIDEO_CODEC_HEVC |
> + HFI_VIDEO_CODEC_VP9;
> + *count = 3;
> +}
> +
> +static const struct hfi_platform_codec_freq_data codec_freq_data[] = {
> + { V4L2_PIX_FMT_H264, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> + { V4L2_PIX_FMT_HEVC, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> + { V4L2_PIX_FMT_VP9, VIDC_SESSION_TYPE_DEC, 440, 0, 440 },
> +};
> +
> +static const struct hfi_platform_codec_freq_data *
> +get_codec_freq_data(u32 session_type, u32 pixfmt)
> +{
> + const struct hfi_platform_codec_freq_data *data = codec_freq_data;
> + unsigned int i, data_size = ARRAY_SIZE(codec_freq_data);
> + const struct hfi_platform_codec_freq_data *found = NULL;
> +
> + for (i = 0; i < data_size; i++) {
> + if (data[i].pixfmt == pixfmt &&
> + data[i].session_type == session_type) {
> + found = &data[i];
> + break;
> + }
> + }
> +
> + return found;
> +}
> +
> +static unsigned long codec_vpp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->vpp_freq;
> +
> + return 0;
> +}
> +
> +static unsigned long codec_vsp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->vsp_freq;
> +
> + return 0;
> +}
> +
> +static unsigned long codec_lp_freq(u32 session_type, u32 codec)
> +{
> + const struct hfi_platform_codec_freq_data *data;
> +
> + data = get_codec_freq_data(session_type, codec);
> + if (data)
> + return data->low_power_freq;
> +
> + return 0;
> +}
> +
> +const struct hfi_platform hfi_plat_v6_lite = {
> + .codec_vpp_freq = codec_vpp_freq,
> + .codec_vsp_freq = codec_vsp_freq,
> + .codec_lp_freq = codec_lp_freq,
> + .codecs = get_codecs,
> + .capabilities = get_capabilities,
> + .bufreq = hfi_plat_bufreq_v6,
> +};
@Dikshita @Vikash happy enough with this ?
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
© 2016 - 2026 Red Hat, Inc.