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 - 2025 Red Hat, Inc.