[PATCH 8/9] media: iris: move the encode format list into the firmware data
From: Dmitry Baryshkov
Date: Thu Jul 09 2026 - 15:42:48 EST
Like the decode format list, the set of supported encode formats depends
on the firmware generation, but it was kept in the encoder's built-in
iris_venc_formats_cap[] array. A single static array cannot describe the
different format sets the same SoC exposes depending on which firmware it
booted.
Move the encode format list into struct iris_firmware_data next to the
decode list, and drop the static iris_venc_formats_cap[] array. Each
firmware data instance now carries the exact set of encode formats its
generation supports, so the formats advertised to userspace always match
the running firmware.
No functional change: every SoC advertises the same encode formats as
before.
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxxxxxxxx>
---
drivers/media/platform/qcom/iris/iris_hfi_gen1.c | 9 +++++++++
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 11 +++++++++++
drivers/media/platform/qcom/iris/iris_platform_common.h | 12 +++++++-----
drivers/media/platform/qcom/iris/iris_venc.c | 13 ++++---------
4 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1.c
index 4b05c2a47b0b..0451ee321840 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1.c
@@ -467,6 +467,11 @@ static const u32 iris_hfi_gen1_ar50lt_dec_fmts[] = {
V4L2_PIX_FMT_VP9,
};
+static const u32 iris_hfi_gen1_enc_fmts[] = {
+ V4L2_PIX_FMT_H264,
+ V4L2_PIX_FMT_HEVC,
+};
+
const struct iris_firmware_data iris_hfi_gen1_data = {
.init_hfi_ops = &iris_hfi_gen1_sys_ops_init,
@@ -477,6 +482,8 @@ const struct iris_firmware_data iris_hfi_gen1_data = {
.dec_fmts = iris_hfi_gen1_dec_fmts,
.dec_fmts_size = ARRAY_SIZE(iris_hfi_gen1_dec_fmts),
+ .enc_fmts = iris_hfi_gen1_enc_fmts,
+ .enc_fmts_size = ARRAY_SIZE(iris_hfi_gen1_enc_fmts),
.dec_input_config_params_default =
sm8250_vdec_input_config_param_default,
@@ -721,6 +728,8 @@ const struct iris_firmware_data iris_hfi_gen1_ar50lt_data = {
.dec_fmts = iris_hfi_gen1_ar50lt_dec_fmts,
.dec_fmts_size = ARRAY_SIZE(iris_hfi_gen1_ar50lt_dec_fmts),
+ .enc_fmts = iris_hfi_gen1_enc_fmts,
+ .enc_fmts_size = ARRAY_SIZE(iris_hfi_gen1_enc_fmts),
.dec_input_config_params_default =
sm8250_vdec_input_config_param_default,
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index 6c1d562ab8c2..665de0275a0b 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -1249,6 +1249,11 @@ static const u32 iris_hfi_gen2_vpu2_dec_fmts[] = {
V4L2_PIX_FMT_VP9,
};
+static const u32 iris_hfi_gen2_enc_fmts[] = {
+ V4L2_PIX_FMT_H264,
+ V4L2_PIX_FMT_HEVC,
+};
+
const struct iris_firmware_data iris_hfi_gen2_data = {
.init_hfi_ops = iris_hfi_gen2_sys_ops_init,
@@ -1261,6 +1266,8 @@ const struct iris_firmware_data iris_hfi_gen2_data = {
.dec_fmts = iris_hfi_gen2_dec_fmts,
.dec_fmts_size = ARRAY_SIZE(iris_hfi_gen2_dec_fmts),
+ .enc_fmts = iris_hfi_gen2_enc_fmts,
+ .enc_fmts_size = ARRAY_SIZE(iris_hfi_gen2_enc_fmts),
.dec_input_config_params_default =
sm8550_vdec_input_config_params_default,
@@ -1335,6 +1342,8 @@ const struct iris_firmware_data iris_hfi_gen2_vpu2_data = {
.dec_fmts = iris_hfi_gen2_vpu2_dec_fmts,
.dec_fmts_size = ARRAY_SIZE(iris_hfi_gen2_vpu2_dec_fmts),
+ .enc_fmts = iris_hfi_gen2_enc_fmts,
+ .enc_fmts_size = ARRAY_SIZE(iris_hfi_gen2_enc_fmts),
.dec_input_config_params_default =
sm8550_vdec_input_config_params_default,
@@ -1955,6 +1964,8 @@ const struct iris_firmware_data iris_hfi_gen2_ar50lt_data = {
.inst_fw_caps_enc_size = ARRAY_SIZE(inst_fw_cap_gen2_ar50lt_enc),
.dec_fmts = iris_hfi_gen2_vpu2_dec_fmts,
.dec_fmts_size = ARRAY_SIZE(iris_hfi_gen2_vpu2_dec_fmts),
+ .enc_fmts = iris_hfi_gen2_enc_fmts,
+ .enc_fmts_size = ARRAY_SIZE(iris_hfi_gen2_enc_fmts),
.dec_input_config_params_default =
sm8550_vdec_input_config_params_default,
.dec_input_config_params_default_size =
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 3d631effe307..7e670d04c10c 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -259,14 +259,16 @@ struct iris_firmware_data {
u32 inst_fw_caps_enc_size;
/*
- * List of coded formats supported by this firmware generation, used to
- * advertise decode (bitstream) formats to userspace. This lives in the
- * firmware data because a single SoC can boot either firmware
- * generation, and some codecs (e.g. VP8, MPEG2, AV1) are only supported
- * by one generation.
+ * Lists of coded formats supported by this firmware generation, used
+ * to advertise decode (bitstream) and encode (capture) formats to
+ * userspace. These live in the firmware data because a single SoC can
+ * boot either firmware generation, and some codecs (e.g. VP8, MPEG2,
+ * AV1) are only supported by one generation.
*/
const u32 *dec_fmts;
unsigned int dec_fmts_size;
+ const u32 *enc_fmts;
+ unsigned int enc_fmts_size;
const u32 *dec_input_config_params_default;
unsigned int dec_input_config_params_default_size;
diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
index 2f2c56bf9122..91749e580d5b 100644
--- a/drivers/media/platform/qcom/iris/iris_venc.c
+++ b/drivers/media/platform/qcom/iris/iris_venc.c
@@ -80,11 +80,6 @@ int iris_venc_inst_init(struct iris_inst *inst)
return iris_ctrls_init(inst);
}
-static const u32 iris_venc_formats_cap[] = {
- V4L2_PIX_FMT_H264,
- V4L2_PIX_FMT_HEVC,
-};
-
static const u32 iris_venc_formats_out[] = {
V4L2_PIX_FMT_NV12,
V4L2_PIX_FMT_QC08C,
@@ -111,8 +106,8 @@ static bool check_format(struct iris_inst *inst, u32 pixfmt, u32 type)
}
break;
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
- fmt = iris_venc_formats_cap;
- size = ARRAY_SIZE(iris_venc_formats_cap);
+ fmt = inst->core->iris_firmware_data->enc_fmts;
+ size = inst->core->iris_firmware_data->enc_fmts_size;
break;
default:
return false;
@@ -143,8 +138,8 @@ static u32 find_format_by_index(struct iris_inst *inst, u32 index, u32 type)
}
break;
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
- fmt = iris_venc_formats_cap;
- size = ARRAY_SIZE(iris_venc_formats_cap);
+ fmt = inst->core->iris_firmware_data->enc_fmts;
+ size = inst->core->iris_firmware_data->enc_fmts_size;
break;
default:
return 0;
--
2.47.3