* [PATCH 0/2] media: iris: add vbv delay support
@ 2026-07-30 14:55 Sachin Kumar Garg
2026-07-30 14:55 ` [PATCH 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
` (2 more replies)
0 siblings, 3 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-07-30 14:55 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
This series adds VBV_DELAY (V4L2_CID_MPEG_VIDEO_VBV_DELAY) support
for Qualcomm iris encoder sessions, allowing users to configure the
initial VBV (Video Buffer Verifier) delay for CBR-encoded streams.
This is useful for latency-sensitive encoding use cases (e.g.
low-latency streaming) where the client needs explicit control over
the encoder's buffering delay.
Patch 1 is a prerequisite for patch 2. The PIPE capability (control
over the number of VPP hardware pipes used for a session) was
previously only wired up for decoder sessions. Achieving low VBV delay
values (34-100 ms) requires the encoder to be constrained to a single
VPP pipe, so patch 1 enables the PIPE capability on the encoder path as
well, which patch 2 then relies on to force single-pipe operation when
VBV delay falls in that low-latency range.
Patch 2 adds the VBV_DELAY capability: it registers HFI_PROP_VBV_DELAY,
wires up the V4L2_CID_MPEG_VIDEO_VBV_DELAY control for the gen2
encoder, and only applies the property when rate control is set to CBR
since VBV delay is only meaningful for constant-bitrate encoding.
It adds vbv_delay support for iris HFI Gen2 based targets (qcs8300,
sm8550, sm8650, sm8750, x1p42100). Support for HFI Gen1 targets will
be added in a follow-up series.
This series has been verified with GST level testing.
Command used:
gst-launch-1.0 -v videotestsrc ! video/x-raw,format=NV12, \
width=1280,height=720,framerate=30/1 ! v4l2h264enc output-io-mode=4 \
capture-io-mode=4 extra-controls="controls,video_bitrate_mode=1, \
initial_delay_for_vbv_control=300;" ! filesink location=/opt/test_enc.h264
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
Sachin Kumar Garg (2):
media: iris: enable pipe for hfi gen2 encoder
media: iris: add support for vbv delay
drivers/media/platform/qcom/iris/iris_ctrls.c | 47 ++++++++++++++++++++--
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 19 ++++++++-
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
5 files changed, 65 insertions(+), 4 deletions(-)
---
base-commit: a52e6f7923c17a672135b485ffd96fbd72f46267
change-id: 20260730-iris_vbv_delay-343d2fa30842
Best regards,
--
Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH 1/2] media: iris: enable pipe for hfi gen2 encoder
2026-07-30 14:55 [PATCH 0/2] media: iris: add vbv delay support Sachin Kumar Garg
@ 2026-07-30 14:55 ` Sachin Kumar Garg
2026-09-22 13:50 ` Vikash Garodia
2026-07-30 14:55 ` [PATCH 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
2026-09-26 13:08 ` [PATCH v2 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2 siblings, 1 reply; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-07-30 14:55 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
Currently the PIPE capability (HFI_PROP_PIPE / work-route) is only
wired up for the HFI Gen2 decoder. Add a PIPE entry to the HFI Gen2
encoder instance capability table, and extend the encoder
branch of iris_session_init_caps() to derive PIPE's min/max/value
from the platform's num_vpp_pipe, mirroring the existing decoder
handling.
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 16 +++++++++++++---
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 7 +++++++
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 10e33b8a73f6..33114d80aa68 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -453,13 +453,23 @@ void iris_session_init_caps(struct iris_core *core)
continue;
core->inst_fw_caps_enc[cap_id].cap_id = caps[i].cap_id;
- core->inst_fw_caps_enc[cap_id].min = caps[i].min;
- core->inst_fw_caps_enc[cap_id].max = caps[i].max;
core->inst_fw_caps_enc[cap_id].step_or_mask = caps[i].step_or_mask;
- core->inst_fw_caps_enc[cap_id].value = caps[i].value;
core->inst_fw_caps_enc[cap_id].flags = caps[i].flags;
core->inst_fw_caps_enc[cap_id].hfi_id = caps[i].hfi_id;
core->inst_fw_caps_enc[cap_id].set = caps[i].set;
+
+ if (cap_id == PIPE) {
+ core->inst_fw_caps_enc[cap_id].value =
+ core->iris_platform_data->num_vpp_pipe;
+ core->inst_fw_caps_enc[cap_id].min =
+ core->iris_platform_data->num_vpp_pipe;
+ core->inst_fw_caps_enc[cap_id].max =
+ core->iris_platform_data->num_vpp_pipe;
+ } else {
+ core->inst_fw_caps_enc[cap_id].min = caps[i].min;
+ core->inst_fw_caps_enc[cap_id].max = caps[i].max;
+ core->inst_fw_caps_enc[cap_id].value = caps[i].value;
+ }
}
}
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index acc0ed8adda1..45a418fde7e9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -365,6 +365,13 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.hfi_id = HFI_PROP_STAGE,
.set = iris_set_stage,
},
+ {
+ .cap_id = PIPE,
+ /* .max, .min and .value are set via platform data */
+ .step_or_mask = 1,
+ .hfi_id = HFI_PROP_PIPE,
+ .set = iris_set_pipe,
+ },
{
.cap_id = HEADER_MODE,
.min = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH 2/2] media: iris: add support for vbv delay
2026-07-30 14:55 [PATCH 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-07-30 14:55 ` [PATCH 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
@ 2026-07-30 14:55 ` Sachin Kumar Garg
2026-09-22 13:51 ` Vikash Garodia
2026-09-26 13:08 ` [PATCH v2 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2 siblings, 1 reply; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-07-30 14:55 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
is only meaningful for CBR rate-control modes.
Low VBV delay values (34-100 ms) require the encoder to run
with a single video pipe, so extend iris_set_pipe() to force
work_route to 1 whenever the configured VBV_DELAY falls in that
range.
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 31 ++++++++++++++++++++++
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 ++++++++-
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
5 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 33114d80aa68..0ad873f3be78 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -154,6 +154,8 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return LAYER4_BITRATE_HEVC;
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR:
return LAYER5_BITRATE_HEVC;
+ case V4L2_CID_MPEG_VIDEO_VBV_DELAY:
+ return VBV_DELAY;
default:
return INST_FW_CAP_MAX;
}
@@ -297,6 +299,8 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR;
case LAYER5_BITRATE_HEVC:
return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR;
+ case VBV_DELAY:
+ return V4L2_CID_MPEG_VIDEO_VBV_DELAY;
default:
return 0;
}
@@ -544,6 +548,11 @@ int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
u32 work_route = inst->fw_caps[PIPE].value;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ if (inst->domain == ENCODER) {
+ if (inst->fw_caps[VBV_DELAY].value > 34 && inst->fw_caps[VBV_DELAY].value < 100)
+ work_route = 1;
+ }
+
return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
iris_get_port_info(inst, cap_id),
@@ -1487,6 +1496,28 @@ int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_typ
&bitrate, sizeof(u32));
}
+int iris_set_vbv_delay(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
+{
+ const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
+ u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 rc_type = inst->hfi_rc_type;
+ u32 hfi_val;
+
+ if (rc_type != HFI_RC_CBR_VFR &&
+ rc_type != HFI_RC_CBR_CFR) {
+ dev_err(inst->core->dev, "vbv_delay unsupported, rc_type: %#x\n", rc_type);
+ return -EINVAL;
+ }
+
+ hfi_val = inst->fw_caps[cap_id].value;
+
+ return hfi_ops->session_set_property(inst, hfi_id,
+ HFI_HOST_FLAGS_NONE,
+ iris_get_port_info(inst, cap_id),
+ HFI_PAYLOAD_U32,
+ &hfi_val, sizeof(u32));
+}
+
int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 3c462ec9190b..16939e31c784 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -47,6 +47,7 @@ int iris_set_layer_type(struct iris_inst *inst, enum platform_inst_fw_cap_type c
int iris_set_layer_count_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_count_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
+int iris_set_vbv_delay(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index 45a418fde7e9..716947f256f1 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -944,7 +944,17 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_layer_bitrate,
- }
+ },
+ {
+ .cap_id = VBV_DELAY,
+ .min = 34,
+ .max = 300,
+ .step_or_mask = 1,
+ .value = 300,
+ .hfi_id = HFI_PROP_VBV_DELAY,
+ .flags = CAP_FLAG_OUTPUT_PORT,
+ .set = iris_set_vbv_delay,
+ },
};
static const u32 sm8550_vdec_input_config_params_default[] = {
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index 776b21cd11b2..19d04981cdb9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -127,6 +127,7 @@ enum hfi_flip {
#define HFI_PROP_BUFFER_MARK 0x0300016c
#define HFI_PROP_WORST_COMPRESSION_RATIO 0x03000174
#define HFI_PROP_WORST_COMPLEXITY_FACTOR 0x03000175
+#define HFI_PROP_VBV_DELAY 0x03000176
#define HFI_PROP_RAW_RESOLUTION 0x03000178
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
#define HFI_PROP_AV1_FILM_GRAIN_PRESENT 0x03000180
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index c9256f2323dc..a533740ced7c 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -183,6 +183,7 @@ enum platform_inst_fw_cap_type {
LAYER3_BITRATE_HEVC,
LAYER4_BITRATE_HEVC,
LAYER5_BITRATE_HEVC,
+ VBV_DELAY,
INST_FW_CAP_MAX,
};
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 1/2] media: iris: enable pipe for hfi gen2 encoder
2026-07-30 14:55 ` [PATCH 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
@ 2026-09-22 13:50 ` Vikash Garodia
0 siblings, 0 replies; 19+ messages in thread
From: Vikash Garodia @ 2026-09-22 13:50 UTC (permalink / raw)
To: Sachin Kumar Garg, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel
On 7/30/2026 8:25 PM, Sachin Kumar Garg wrote:
> Currently the PIPE capability (HFI_PROP_PIPE / work-route) is only
> wired up for the HFI Gen2 decoder. Add a PIPE entry to the HFI Gen2
> encoder instance capability table, and extend the encoder
> branch of iris_session_init_caps() to derive PIPE's min/max/value
> from the platform's num_vpp_pipe, mirroring the existing decoder
> handling.
>
> Signed-off-by: Sachin Kumar Garg<sachin.garg@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 16 +++++++++++++---
> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 7 +++++++
> 2 files changed, 20 insertions(+), 3 deletions(-)
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/2] media: iris: add support for vbv delay
2026-07-30 14:55 ` [PATCH 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
@ 2026-09-22 13:51 ` Vikash Garodia
0 siblings, 0 replies; 19+ messages in thread
From: Vikash Garodia @ 2026-09-22 13:51 UTC (permalink / raw)
To: Sachin Kumar Garg, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel
On 7/30/2026 8:25 PM, Sachin Kumar Garg wrote:
> Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
> exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
> HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
> is only meaningful for CBR rate-control modes.
>
> Low VBV delay values (34-100 ms) require the encoder to run
> with a single video pipe, so extend iris_set_pipe() to force
> work_route to 1 whenever the configured VBV_DELAY falls in that
> range.
>
> Signed-off-by: Sachin Kumar Garg<sachin.garg@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 31 ++++++++++++++++++++++
> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 ++++++++-
> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
> .../platform/qcom/iris/iris_platform_common.h | 1 +
> 5 files changed, 45 insertions(+), 1 deletion(-)
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v2 0/2] media: iris: add vbv delay support
2026-07-30 14:55 [PATCH 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-07-30 14:55 ` [PATCH 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
2026-07-30 14:55 ` [PATCH 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
@ 2026-09-26 13:08 ` Sachin Kumar Garg
2026-09-26 13:08 ` [PATCH v2 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
` (2 more replies)
2 siblings, 3 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-26 13:08 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
This series adds VBV_DELAY (V4L2_CID_MPEG_VIDEO_VBV_DELAY) support
for Qualcomm iris encoder sessions, allowing users to configure the
initial VBV (Video Buffer Verifier) delay for CBR-encoded streams.
This is useful for latency-sensitive encoding use cases (e.g.
low-latency streaming) where the client needs explicit control over
the encoder's buffering delay.
Patch 1 is a prerequisite for patch 2. The PIPE capability (control
over the number of VPP hardware pipes used for a session) was
previously only wired up for decoder sessions. Achieving low VBV delay
values (34-100 ms) requires the encoder to be constrained to a single
VPP pipe, so patch 1 enables the PIPE capability on the encoder path as
well, which patch 2 then relies on to force single-pipe operation when
VBV delay falls in that low-latency range.
Patch 2 adds the VBV_DELAY capability: it registers HFI_PROP_VBV_DELAY,
wires up the V4L2_CID_MPEG_VIDEO_VBV_DELAY control for the gen2
encoder, and only applies the property when rate control is set to CBR
since VBV delay is only meaningful for constant-bitrate encoding.
It adds vbv_delay support for iris HFI Gen2 based targets (qcs8300,
sm8550, sm8650, sm8750, x1p42100). Support for HFI Gen1 targets will
be added in a follow-up series.
This series has been verified with GST level testing.
Command used:
gst-launch-1.0 -v videotestsrc ! video/x-raw,format=NV12, \
width=1280,height=720,framerate=30/1 ! v4l2h264enc output-io-mode=4 \
capture-io-mode=4 extra-controls="controls,video_bitrate_mode=1, \
initial_delay_for_vbv_control=300;" ! filesink location=/opt/test_enc.h264
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
Changes in v2:
- iris_set_pipe(): use inclusive VBV_DELAY bounds (>= 34 && <= 100 ms)
matching the documented range.
- iris_set_pipe(): only force single-pipe under CBR rate control so
a stale in-range VBV_DELAY no longer affects non-CBR streams.
- iris_set_pipe(): read fw_caps[VBV_DELAY].value once instead of
twice in the same condition, and derive the default work_route from
the immutable fw_caps[PIPE].max instead of the self-mutated .value,
writing the final decision back into .value so frequency scaling
picks up the corrected pipe count instead of a stale one.
- iris_set_vbv_delay(): drop the dev_err() logged for non-CBR rate
control; that is an expected, valid configuration, not an error.
- Link to v1: https://lore.kernel.org/r/20260730-iris_vbv_delay-v1-0-7b5a7953bcdf@oss.qualcomm.com
---
Sachin Kumar Garg (2):
media: iris: enable pipe for hfi gen2 encoder
media: iris: add support for vbv delay
drivers/media/platform/qcom/iris/iris_ctrls.c | 52 ++++++++++++++++++++--
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 19 +++++++-
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
5 files changed, 69 insertions(+), 5 deletions(-)
---
base-commit: a52e6f7923c17a672135b485ffd96fbd72f46267
change-id: 20260730-iris_vbv_delay-343d2fa30842
Best regards,
--
Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v2 1/2] media: iris: enable pipe for hfi gen2 encoder
2026-09-26 13:08 ` [PATCH v2 0/2] media: iris: add vbv delay support Sachin Kumar Garg
@ 2026-09-26 13:08 ` Sachin Kumar Garg
2026-09-26 13:08 ` [PATCH v2 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2 siblings, 0 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-26 13:08 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
Currently the PIPE capability (HFI_PROP_PIPE / work-route) is only
wired up for the HFI Gen2 decoder. Add a PIPE entry to the HFI Gen2
encoder instance capability table, and extend the encoder
branch of iris_session_init_caps() to derive PIPE's min/max/value
from the platform's num_vpp_pipe, mirroring the existing decoder
handling.
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 16 +++++++++++++---
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 7 +++++++
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 10e33b8a73f6..33114d80aa68 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -453,13 +453,23 @@ void iris_session_init_caps(struct iris_core *core)
continue;
core->inst_fw_caps_enc[cap_id].cap_id = caps[i].cap_id;
- core->inst_fw_caps_enc[cap_id].min = caps[i].min;
- core->inst_fw_caps_enc[cap_id].max = caps[i].max;
core->inst_fw_caps_enc[cap_id].step_or_mask = caps[i].step_or_mask;
- core->inst_fw_caps_enc[cap_id].value = caps[i].value;
core->inst_fw_caps_enc[cap_id].flags = caps[i].flags;
core->inst_fw_caps_enc[cap_id].hfi_id = caps[i].hfi_id;
core->inst_fw_caps_enc[cap_id].set = caps[i].set;
+
+ if (cap_id == PIPE) {
+ core->inst_fw_caps_enc[cap_id].value =
+ core->iris_platform_data->num_vpp_pipe;
+ core->inst_fw_caps_enc[cap_id].min =
+ core->iris_platform_data->num_vpp_pipe;
+ core->inst_fw_caps_enc[cap_id].max =
+ core->iris_platform_data->num_vpp_pipe;
+ } else {
+ core->inst_fw_caps_enc[cap_id].min = caps[i].min;
+ core->inst_fw_caps_enc[cap_id].max = caps[i].max;
+ core->inst_fw_caps_enc[cap_id].value = caps[i].value;
+ }
}
}
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index acc0ed8adda1..45a418fde7e9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -365,6 +365,13 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.hfi_id = HFI_PROP_STAGE,
.set = iris_set_stage,
},
+ {
+ .cap_id = PIPE,
+ /* .max, .min and .value are set via platform data */
+ .step_or_mask = 1,
+ .hfi_id = HFI_PROP_PIPE,
+ .set = iris_set_pipe,
+ },
{
.cap_id = HEADER_MODE,
.min = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v2 2/2] media: iris: add support for vbv delay
2026-09-26 13:08 ` [PATCH v2 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-09-26 13:08 ` [PATCH v2 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
@ 2026-09-26 13:08 ` Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2 siblings, 0 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-26 13:08 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
is only meaningful for CBR rate-control modes.
Low VBV delay values (34-100 ms) require the encoder to run
with a single video pipe, so extend iris_set_pipe() to force
work_route to 1 whenever the configured VBV_DELAY falls in that
range.
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 36 +++++++++++++++++++++-
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 +++++++-
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
5 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 33114d80aa68..53d8b1ba15fe 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -154,6 +154,8 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return LAYER4_BITRATE_HEVC;
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR:
return LAYER5_BITRATE_HEVC;
+ case V4L2_CID_MPEG_VIDEO_VBV_DELAY:
+ return VBV_DELAY;
default:
return INST_FW_CAP_MAX;
}
@@ -297,6 +299,8 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR;
case LAYER5_BITRATE_HEVC:
return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR;
+ case VBV_DELAY:
+ return V4L2_CID_MPEG_VIDEO_VBV_DELAY;
default:
return 0;
}
@@ -541,8 +545,18 @@ int iris_set_stage(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id
int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
- u32 work_route = inst->fw_caps[PIPE].value;
+ u32 work_route = inst->fw_caps[PIPE].max;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 vbv_delay;
+
+ if (inst->domain == ENCODER &&
+ (inst->hfi_rc_type == HFI_RC_CBR_VFR || inst->hfi_rc_type == HFI_RC_CBR_CFR)) {
+ vbv_delay = inst->fw_caps[VBV_DELAY].value;
+ if (vbv_delay >= 34 && vbv_delay <= 100)
+ work_route = 1;
+ }
+
+ inst->fw_caps[PIPE].value = work_route;
return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
@@ -1487,6 +1501,26 @@ int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_typ
&bitrate, sizeof(u32));
}
+int iris_set_vbv_delay(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
+{
+ const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
+ u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 rc_type = inst->hfi_rc_type;
+ u32 hfi_val;
+
+ if (rc_type != HFI_RC_CBR_VFR &&
+ rc_type != HFI_RC_CBR_CFR)
+ return -EINVAL;
+
+ hfi_val = inst->fw_caps[cap_id].value;
+
+ return hfi_ops->session_set_property(inst, hfi_id,
+ HFI_HOST_FLAGS_NONE,
+ iris_get_port_info(inst, cap_id),
+ HFI_PAYLOAD_U32,
+ &hfi_val, sizeof(u32));
+}
+
int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 3c462ec9190b..16939e31c784 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -47,6 +47,7 @@ int iris_set_layer_type(struct iris_inst *inst, enum platform_inst_fw_cap_type c
int iris_set_layer_count_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_count_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
+int iris_set_vbv_delay(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index 45a418fde7e9..716947f256f1 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -944,7 +944,17 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_layer_bitrate,
- }
+ },
+ {
+ .cap_id = VBV_DELAY,
+ .min = 34,
+ .max = 300,
+ .step_or_mask = 1,
+ .value = 300,
+ .hfi_id = HFI_PROP_VBV_DELAY,
+ .flags = CAP_FLAG_OUTPUT_PORT,
+ .set = iris_set_vbv_delay,
+ },
};
static const u32 sm8550_vdec_input_config_params_default[] = {
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index 776b21cd11b2..19d04981cdb9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -127,6 +127,7 @@ enum hfi_flip {
#define HFI_PROP_BUFFER_MARK 0x0300016c
#define HFI_PROP_WORST_COMPRESSION_RATIO 0x03000174
#define HFI_PROP_WORST_COMPLEXITY_FACTOR 0x03000175
+#define HFI_PROP_VBV_DELAY 0x03000176
#define HFI_PROP_RAW_RESOLUTION 0x03000178
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
#define HFI_PROP_AV1_FILM_GRAIN_PRESENT 0x03000180
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index c9256f2323dc..a533740ced7c 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -183,6 +183,7 @@ enum platform_inst_fw_cap_type {
LAYER3_BITRATE_HEVC,
LAYER4_BITRATE_HEVC,
LAYER5_BITRATE_HEVC,
+ VBV_DELAY,
INST_FW_CAP_MAX,
};
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 0/2] media: iris: add vbv delay support
2026-09-26 13:08 ` [PATCH v2 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-09-26 13:08 ` [PATCH v2 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
2026-09-26 13:08 ` [PATCH v2 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
@ 2026-09-26 17:09 ` Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
` (2 more replies)
2 siblings, 3 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-26 17:09 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
This series adds VBV_DELAY (V4L2_CID_MPEG_VIDEO_VBV_DELAY) support
for Qualcomm iris encoder sessions, allowing users to configure the
initial VBV (Video Buffer Verifier) delay for CBR-encoded streams.
This is useful for latency-sensitive encoding use cases (e.g.
low-latency streaming) where the client needs explicit control over
the encoder's buffering delay.
Patch 1 is a prerequisite for patch 2. The PIPE capability (control
over the number of VPP hardware pipes used for a session) was
previously only wired up for decoder sessions. Achieving low VBV delay
values (34-100 ms) requires the encoder to be constrained to a single
VPP pipe, so patch 1 enables the PIPE capability on the encoder path as
well, which patch 2 then relies on to force single-pipe operation when
VBV delay falls in that low-latency range.
Patch 2 adds the VBV_DELAY capability: it registers HFI_PROP_VBV_DELAY,
wires up the V4L2_CID_MPEG_VIDEO_VBV_DELAY control for the gen2
encoder, and only applies the property when rate control is set to CBR
since VBV delay is only meaningful for constant-bitrate encoding.
It adds vbv_delay support for iris HFI Gen2 based targets (qcs8300,
sm8550, sm8650, sm8750, x1p42100). Support for HFI Gen1 targets will
be added in a follow-up series.
This series has been verified with GST level testing.
Command used:
gst-launch-1.0 -v videotestsrc ! video/x-raw,format=NV12, \
width=1280,height=720,framerate=30/1 ! v4l2h264enc output-io-mode=4 \
capture-io-mode=4 extra-controls="controls,video_bitrate_mode=1, \
initial_delay_for_vbv_control=300;" ! filesink location=/opt/test_enc.h264
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
Changes in v3:
- iris_set_pipe(): check fw_caps[BITRATE_MODE].value directly instead of
inst->hfi_rc_type, which is stale here since BITRATE_MODE is applied
after PIPE in platform_inst_fw_cap_type order.
- Link to v2: https://lore.kernel.org/r/20260926-iris_vbv_delay-v2-0-83dd80765dee@oss.qualcomm.com
Changes in v2:
- iris_set_pipe(): use inclusive VBV_DELAY bounds (>= 34 && <= 100 ms)
matching the documented range.
- iris_set_pipe(): only force single-pipe under CBR rate control so
a stale in-range VBV_DELAY no longer affects non-CBR streams.
- iris_set_pipe(): read fw_caps[VBV_DELAY].value once instead of
twice in the same condition, and derive the default work_route from
the immutable fw_caps[PIPE].max instead of the self-mutated .value,
writing the final decision back into .value so frequency scaling
picks up the corrected pipe count instead of a stale one.
- iris_set_vbv_delay(): drop the dev_err() logged for non-CBR rate
control; that is an expected, valid configuration, not an error.
- Link to v1: https://lore.kernel.org/r/20260730-iris_vbv_delay-v1-0-7b5a7953bcdf@oss.qualcomm.com
---
Sachin Kumar Garg (2):
media: iris: enable pipe for hfi gen2 encoder
media: iris: add support for vbv delay
drivers/media/platform/qcom/iris/iris_ctrls.c | 52 ++++++++++++++++++++--
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 19 +++++++-
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
5 files changed, 69 insertions(+), 5 deletions(-)
---
base-commit: a52e6f7923c17a672135b485ffd96fbd72f46267
change-id: 20260730-iris_vbv_delay-343d2fa30842
Best regards,
--
Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 1/2] media: iris: enable pipe for hfi gen2 encoder
2026-09-26 17:09 ` [PATCH v3 0/2] media: iris: add vbv delay support Sachin Kumar Garg
@ 2026-09-26 17:09 ` Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
2026-09-27 3:57 ` [PATCH v4 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2 siblings, 0 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-26 17:09 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
Currently the PIPE capability (HFI_PROP_PIPE / work-route) is only
wired up for the HFI Gen2 decoder. Add a PIPE entry to the HFI Gen2
encoder instance capability table, and extend the encoder
branch of iris_session_init_caps() to derive PIPE's min/max/value
from the platform's num_vpp_pipe, mirroring the existing decoder
handling.
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 16 +++++++++++++---
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 7 +++++++
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 10e33b8a73f6..33114d80aa68 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -453,13 +453,23 @@ void iris_session_init_caps(struct iris_core *core)
continue;
core->inst_fw_caps_enc[cap_id].cap_id = caps[i].cap_id;
- core->inst_fw_caps_enc[cap_id].min = caps[i].min;
- core->inst_fw_caps_enc[cap_id].max = caps[i].max;
core->inst_fw_caps_enc[cap_id].step_or_mask = caps[i].step_or_mask;
- core->inst_fw_caps_enc[cap_id].value = caps[i].value;
core->inst_fw_caps_enc[cap_id].flags = caps[i].flags;
core->inst_fw_caps_enc[cap_id].hfi_id = caps[i].hfi_id;
core->inst_fw_caps_enc[cap_id].set = caps[i].set;
+
+ if (cap_id == PIPE) {
+ core->inst_fw_caps_enc[cap_id].value =
+ core->iris_platform_data->num_vpp_pipe;
+ core->inst_fw_caps_enc[cap_id].min =
+ core->iris_platform_data->num_vpp_pipe;
+ core->inst_fw_caps_enc[cap_id].max =
+ core->iris_platform_data->num_vpp_pipe;
+ } else {
+ core->inst_fw_caps_enc[cap_id].min = caps[i].min;
+ core->inst_fw_caps_enc[cap_id].max = caps[i].max;
+ core->inst_fw_caps_enc[cap_id].value = caps[i].value;
+ }
}
}
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index acc0ed8adda1..45a418fde7e9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -365,6 +365,13 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.hfi_id = HFI_PROP_STAGE,
.set = iris_set_stage,
},
+ {
+ .cap_id = PIPE,
+ /* .max, .min and .value are set via platform data */
+ .step_or_mask = 1,
+ .hfi_id = HFI_PROP_PIPE,
+ .set = iris_set_pipe,
+ },
{
.cap_id = HEADER_MODE,
.min = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v3 2/2] media: iris: add support for vbv delay
2026-09-26 17:09 ` [PATCH v3 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
@ 2026-09-26 17:09 ` Sachin Kumar Garg
2026-09-27 3:57 ` [PATCH v4 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2 siblings, 0 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-26 17:09 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
is only meaningful for CBR rate-control modes.
Low VBV delay values (34-100 ms) require the encoder to run
with a single video pipe, so extend iris_set_pipe() to force
work_route to 1 whenever the configured VBV_DELAY falls in that
range.
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 36 +++++++++++++++++++++-
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 +++++++-
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
5 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 33114d80aa68..de216661a477 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -154,6 +154,8 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return LAYER4_BITRATE_HEVC;
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR:
return LAYER5_BITRATE_HEVC;
+ case V4L2_CID_MPEG_VIDEO_VBV_DELAY:
+ return VBV_DELAY;
default:
return INST_FW_CAP_MAX;
}
@@ -297,6 +299,8 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR;
case LAYER5_BITRATE_HEVC:
return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR;
+ case VBV_DELAY:
+ return V4L2_CID_MPEG_VIDEO_VBV_DELAY;
default:
return 0;
}
@@ -541,8 +545,18 @@ int iris_set_stage(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id
int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
- u32 work_route = inst->fw_caps[PIPE].value;
+ u32 work_route = inst->fw_caps[PIPE].max;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 vbv_delay;
+
+ if (inst->domain == ENCODER &&
+ inst->fw_caps[BITRATE_MODE].value == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
+ vbv_delay = inst->fw_caps[VBV_DELAY].value;
+ if (vbv_delay >= 34 && vbv_delay <= 100)
+ work_route = 1;
+ }
+
+ inst->fw_caps[PIPE].value = work_route;
return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
@@ -1487,6 +1501,26 @@ int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_typ
&bitrate, sizeof(u32));
}
+int iris_set_vbv_delay(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
+{
+ const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
+ u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 rc_type = inst->hfi_rc_type;
+ u32 hfi_val;
+
+ if (rc_type != HFI_RC_CBR_VFR &&
+ rc_type != HFI_RC_CBR_CFR)
+ return -EINVAL;
+
+ hfi_val = inst->fw_caps[cap_id].value;
+
+ return hfi_ops->session_set_property(inst, hfi_id,
+ HFI_HOST_FLAGS_NONE,
+ iris_get_port_info(inst, cap_id),
+ HFI_PAYLOAD_U32,
+ &hfi_val, sizeof(u32));
+}
+
int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 3c462ec9190b..16939e31c784 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -47,6 +47,7 @@ int iris_set_layer_type(struct iris_inst *inst, enum platform_inst_fw_cap_type c
int iris_set_layer_count_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_count_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
+int iris_set_vbv_delay(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index 45a418fde7e9..716947f256f1 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -944,7 +944,17 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_layer_bitrate,
- }
+ },
+ {
+ .cap_id = VBV_DELAY,
+ .min = 34,
+ .max = 300,
+ .step_or_mask = 1,
+ .value = 300,
+ .hfi_id = HFI_PROP_VBV_DELAY,
+ .flags = CAP_FLAG_OUTPUT_PORT,
+ .set = iris_set_vbv_delay,
+ },
};
static const u32 sm8550_vdec_input_config_params_default[] = {
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index 776b21cd11b2..19d04981cdb9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -127,6 +127,7 @@ enum hfi_flip {
#define HFI_PROP_BUFFER_MARK 0x0300016c
#define HFI_PROP_WORST_COMPRESSION_RATIO 0x03000174
#define HFI_PROP_WORST_COMPLEXITY_FACTOR 0x03000175
+#define HFI_PROP_VBV_DELAY 0x03000176
#define HFI_PROP_RAW_RESOLUTION 0x03000178
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
#define HFI_PROP_AV1_FILM_GRAIN_PRESENT 0x03000180
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index c9256f2323dc..a533740ced7c 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -183,6 +183,7 @@ enum platform_inst_fw_cap_type {
LAYER3_BITRATE_HEVC,
LAYER4_BITRATE_HEVC,
LAYER5_BITRATE_HEVC,
+ VBV_DELAY,
INST_FW_CAP_MAX,
};
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v4 0/2] media: iris: add vbv delay support
2026-09-26 17:09 ` [PATCH v3 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
@ 2026-09-27 3:57 ` Sachin Kumar Garg
2026-09-27 3:57 ` [PATCH v4 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
2026-09-27 3:57 ` [PATCH v4 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
2 siblings, 2 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-27 3:57 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
This series adds VBV_DELAY (V4L2_CID_MPEG_VIDEO_VBV_DELAY) support
for Qualcomm iris encoder sessions, allowing users to configure the
initial VBV (Video Buffer Verifier) delay for CBR-encoded streams.
This is useful for latency-sensitive encoding use cases (e.g.
low-latency streaming) where the client needs explicit control over
the encoder's buffering delay.
Patch 1 is a prerequisite for patch 2. The PIPE capability (control
over the number of VPP hardware pipes used for a session) was
previously only wired up for decoder sessions. Achieving low VBV delay
values (34-100 ms) requires the encoder to be constrained to a single
VPP pipe, so patch 1 enables the PIPE capability on the encoder path as
well, which patch 2 then relies on to force single-pipe operation when
VBV delay falls in that low-latency range.
Patch 2 adds the VBV_DELAY capability: it registers HFI_PROP_VBV_DELAY,
wires up the V4L2_CID_MPEG_VIDEO_VBV_DELAY control for the gen2
encoder, and only applies the property when rate control is set to CBR
since VBV delay is only meaningful for constant-bitrate encoding.
It adds vbv_delay support for iris HFI Gen2 based targets (qcs8300,
sm8550, sm8650, sm8750, x1p42100). Support for HFI Gen1 targets will
be added in a follow-up series.
This series has been verified with GST level testing.
Command used:
gst-launch-1.0 -v videotestsrc ! video/x-raw,format=NV12, \
width=1280,height=720,framerate=30/1 ! v4l2h264enc output-io-mode=4 \
capture-io-mode=4 extra-controls="controls,video_bitrate_mode=1, \
initial_delay_for_vbv_control=300;" ! filesink location=/opt/test_enc.h264
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
Changes in v4:
- iris_set_pipe(): also require fw_caps[FRAME_RC_ENABLE].value before
forcing single-pipe, since disabling rate control makes the bitrate
mode (and VBV delay) meaningless regardless of CBR/VBR selection.
- Link to v3: https://lore.kernel.org/r/20260926-iris_vbv_delay-v3-0-d6894f117be5@oss.qualcomm.com
Changes in v3:
- iris_set_pipe(): check fw_caps[BITRATE_MODE].value directly instead of
inst->hfi_rc_type, which is stale here since BITRATE_MODE is applied
after PIPE in platform_inst_fw_cap_type order.
- Link to v2: https://lore.kernel.org/r/20260926-iris_vbv_delay-v2-0-83dd80765dee@oss.qualcomm.com
Changes in v2:
- iris_set_pipe(): use inclusive VBV_DELAY bounds (>= 34 && <= 100 ms)
matching the documented range.
- iris_set_pipe(): only force single-pipe under CBR rate control so
a stale in-range VBV_DELAY no longer affects non-CBR streams.
- iris_set_pipe(): read fw_caps[VBV_DELAY].value once instead of
twice in the same condition, and derive the default work_route from
the immutable fw_caps[PIPE].max instead of the self-mutated .value,
writing the final decision back into .value so frequency scaling
picks up the corrected pipe count instead of a stale one.
- iris_set_vbv_delay(): drop the dev_err() logged for non-CBR rate
control; that is an expected, valid configuration, not an error.
- Link to v1: https://lore.kernel.org/r/20260730-iris_vbv_delay-v1-0-7b5a7953bcdf@oss.qualcomm.com
---
Sachin Kumar Garg (2):
media: iris: enable pipe for hfi gen2 encoder
media: iris: add support for vbv delay
drivers/media/platform/qcom/iris/iris_ctrls.c | 53 ++++++++++++++++++++--
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 19 +++++++-
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
5 files changed, 70 insertions(+), 5 deletions(-)
---
base-commit: a52e6f7923c17a672135b485ffd96fbd72f46267
change-id: 20260730-iris_vbv_delay-343d2fa30842
Best regards,
--
Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v4 1/2] media: iris: enable pipe for hfi gen2 encoder
2026-09-27 3:57 ` [PATCH v4 0/2] media: iris: add vbv delay support Sachin Kumar Garg
@ 2026-09-27 3:57 ` Sachin Kumar Garg
2026-09-27 18:23 ` Dmitry Baryshkov
2026-09-27 3:57 ` [PATCH v4 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
1 sibling, 1 reply; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-27 3:57 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
Currently the PIPE capability (HFI_PROP_PIPE / work-route) is only
wired up for the HFI Gen2 decoder. Add a PIPE entry to the HFI Gen2
encoder instance capability table, and extend the encoder
branch of iris_session_init_caps() to derive PIPE's min/max/value
from the platform's num_vpp_pipe, mirroring the existing decoder
handling.
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 16 +++++++++++++---
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 7 +++++++
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 10e33b8a73f6..33114d80aa68 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -453,13 +453,23 @@ void iris_session_init_caps(struct iris_core *core)
continue;
core->inst_fw_caps_enc[cap_id].cap_id = caps[i].cap_id;
- core->inst_fw_caps_enc[cap_id].min = caps[i].min;
- core->inst_fw_caps_enc[cap_id].max = caps[i].max;
core->inst_fw_caps_enc[cap_id].step_or_mask = caps[i].step_or_mask;
- core->inst_fw_caps_enc[cap_id].value = caps[i].value;
core->inst_fw_caps_enc[cap_id].flags = caps[i].flags;
core->inst_fw_caps_enc[cap_id].hfi_id = caps[i].hfi_id;
core->inst_fw_caps_enc[cap_id].set = caps[i].set;
+
+ if (cap_id == PIPE) {
+ core->inst_fw_caps_enc[cap_id].value =
+ core->iris_platform_data->num_vpp_pipe;
+ core->inst_fw_caps_enc[cap_id].min =
+ core->iris_platform_data->num_vpp_pipe;
+ core->inst_fw_caps_enc[cap_id].max =
+ core->iris_platform_data->num_vpp_pipe;
+ } else {
+ core->inst_fw_caps_enc[cap_id].min = caps[i].min;
+ core->inst_fw_caps_enc[cap_id].max = caps[i].max;
+ core->inst_fw_caps_enc[cap_id].value = caps[i].value;
+ }
}
}
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index acc0ed8adda1..45a418fde7e9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -365,6 +365,13 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.hfi_id = HFI_PROP_STAGE,
.set = iris_set_stage,
},
+ {
+ .cap_id = PIPE,
+ /* .max, .min and .value are set via platform data */
+ .step_or_mask = 1,
+ .hfi_id = HFI_PROP_PIPE,
+ .set = iris_set_pipe,
+ },
{
.cap_id = HEADER_MODE,
.min = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v4 2/2] media: iris: add support for vbv delay
2026-09-27 3:57 ` [PATCH v4 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-09-27 3:57 ` [PATCH v4 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
@ 2026-09-27 3:57 ` Sachin Kumar Garg
2026-09-27 18:25 ` Dmitry Baryshkov
1 sibling, 1 reply; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-27 3:57 UTC (permalink / raw)
To: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab
Cc: linux-media, linux-arm-msm, linux-kernel, Sachin Kumar Garg
Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
is only meaningful for CBR rate-control modes.
Low VBV delay values (34-100 ms) require the encoder to run
with a single video pipe, so extend iris_set_pipe() to force
work_route to 1 whenever the configured VBV_DELAY falls in that
range.
Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 37 +++++++++++++++++++++-
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 ++++++-
.../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
5 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 33114d80aa68..758c1e77de3f 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -154,6 +154,8 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return LAYER4_BITRATE_HEVC;
case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR:
return LAYER5_BITRATE_HEVC;
+ case V4L2_CID_MPEG_VIDEO_VBV_DELAY:
+ return VBV_DELAY;
default:
return INST_FW_CAP_MAX;
}
@@ -297,6 +299,8 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR;
case LAYER5_BITRATE_HEVC:
return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR;
+ case VBV_DELAY:
+ return V4L2_CID_MPEG_VIDEO_VBV_DELAY;
default:
return 0;
}
@@ -541,8 +545,19 @@ int iris_set_stage(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id
int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
{
const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
- u32 work_route = inst->fw_caps[PIPE].value;
+ u32 work_route = inst->fw_caps[PIPE].max;
u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 vbv_delay;
+
+ if (inst->domain == ENCODER &&
+ inst->fw_caps[FRAME_RC_ENABLE].value &&
+ inst->fw_caps[BITRATE_MODE].value == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
+ vbv_delay = inst->fw_caps[VBV_DELAY].value;
+ if (vbv_delay >= 34 && vbv_delay <= 100)
+ work_route = 1;
+ }
+
+ inst->fw_caps[PIPE].value = work_route;
return hfi_ops->session_set_property(inst, hfi_id,
HFI_HOST_FLAGS_NONE,
@@ -1487,6 +1502,26 @@ int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_typ
&bitrate, sizeof(u32));
}
+int iris_set_vbv_delay(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
+{
+ const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
+ u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 rc_type = inst->hfi_rc_type;
+ u32 hfi_val;
+
+ if (rc_type != HFI_RC_CBR_VFR &&
+ rc_type != HFI_RC_CBR_CFR)
+ return -EINVAL;
+
+ hfi_val = inst->fw_caps[cap_id].value;
+
+ return hfi_ops->session_set_property(inst, hfi_id,
+ HFI_HOST_FLAGS_NONE,
+ iris_get_port_info(inst, cap_id),
+ HFI_PAYLOAD_U32,
+ &hfi_val, sizeof(u32));
+}
+
int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 3c462ec9190b..16939e31c784 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -47,6 +47,7 @@ int iris_set_layer_type(struct iris_inst *inst, enum platform_inst_fw_cap_type c
int iris_set_layer_count_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_count_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
+int iris_set_vbv_delay(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
index 45a418fde7e9..716947f256f1 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
@@ -944,7 +944,17 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_layer_bitrate,
- }
+ },
+ {
+ .cap_id = VBV_DELAY,
+ .min = 34,
+ .max = 300,
+ .step_or_mask = 1,
+ .value = 300,
+ .hfi_id = HFI_PROP_VBV_DELAY,
+ .flags = CAP_FLAG_OUTPUT_PORT,
+ .set = iris_set_vbv_delay,
+ },
};
static const u32 sm8550_vdec_input_config_params_default[] = {
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index 776b21cd11b2..19d04981cdb9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -127,6 +127,7 @@ enum hfi_flip {
#define HFI_PROP_BUFFER_MARK 0x0300016c
#define HFI_PROP_WORST_COMPRESSION_RATIO 0x03000174
#define HFI_PROP_WORST_COMPLEXITY_FACTOR 0x03000175
+#define HFI_PROP_VBV_DELAY 0x03000176
#define HFI_PROP_RAW_RESOLUTION 0x03000178
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
#define HFI_PROP_AV1_FILM_GRAIN_PRESENT 0x03000180
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index c9256f2323dc..a533740ced7c 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -183,6 +183,7 @@ enum platform_inst_fw_cap_type {
LAYER3_BITRATE_HEVC,
LAYER4_BITRATE_HEVC,
LAYER5_BITRATE_HEVC,
+ VBV_DELAY,
INST_FW_CAP_MAX,
};
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v4 1/2] media: iris: enable pipe for hfi gen2 encoder
2026-09-27 3:57 ` [PATCH v4 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
@ 2026-09-27 18:23 ` Dmitry Baryshkov
0 siblings, 0 replies; 19+ messages in thread
From: Dmitry Baryshkov @ 2026-09-27 18:23 UTC (permalink / raw)
To: Sachin Kumar Garg
Cc: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab, linux-media,
linux-arm-msm, linux-kernel
On Sun, Sep 27, 2026 at 09:27:45AM +0530, Sachin Kumar Garg wrote:
> Currently the PIPE capability (HFI_PROP_PIPE / work-route) is only
> wired up for the HFI Gen2 decoder. Add a PIPE entry to the HFI Gen2
> encoder instance capability table, and extend the encoder
> branch of iris_session_init_caps() to derive PIPE's min/max/value
> from the platform's num_vpp_pipe, mirroring the existing decoder
> handling.
>
> Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
> Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 16 +++++++++++++---
> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 7 +++++++
> 2 files changed, 20 insertions(+), 3 deletions(-)
>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Nit: it's strongly recommended to send new iterations of the series as a
new thread instead of sending it as a reply to the previous iteration.
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v4 2/2] media: iris: add support for vbv delay
2026-09-27 3:57 ` [PATCH v4 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
@ 2026-09-27 18:25 ` Dmitry Baryshkov
2026-09-29 11:53 ` Sachin Kumar Garg
0 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2026-09-27 18:25 UTC (permalink / raw)
To: Sachin Kumar Garg
Cc: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab, linux-media,
linux-arm-msm, linux-kernel
On Sun, Sep 27, 2026 at 09:27:46AM +0530, Sachin Kumar Garg wrote:
> Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
> exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
> HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
> is only meaningful for CBR rate-control modes.
>
> Low VBV delay values (34-100 ms) require the encoder to run
> with a single video pipe, so extend iris_set_pipe() to force
> work_route to 1 whenever the configured VBV_DELAY falls in that
> range.
>
> Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
> Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 37 +++++++++++++++++++++-
> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 ++++++-
> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
> .../platform/qcom/iris/iris_platform_common.h | 1 +
> 5 files changed, 50 insertions(+), 2 deletions(-)
>
> @@ -541,8 +545,19 @@ int iris_set_stage(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id
> int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> {
> const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
> - u32 work_route = inst->fw_caps[PIPE].value;
> + u32 work_route = inst->fw_caps[PIPE].max;
Why is being set to the max value instead of using the .value?
> u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
> + u32 vbv_delay;
> +
> + if (inst->domain == ENCODER &&
> + inst->fw_caps[FRAME_RC_ENABLE].value &&
> + inst->fw_caps[BITRATE_MODE].value == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
> + vbv_delay = inst->fw_caps[VBV_DELAY].value;
> + if (vbv_delay >= 34 && vbv_delay <= 100)
> + work_route = 1;
> + }
> +
> + inst->fw_caps[PIPE].value = work_route;
>
> return hfi_ops->session_set_property(inst, hfi_id,
> HFI_HOST_FLAGS_NONE,
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v4 2/2] media: iris: add support for vbv delay
2026-09-27 18:25 ` Dmitry Baryshkov
@ 2026-09-29 11:53 ` Sachin Kumar Garg
2026-09-29 15:05 ` Dmitry Baryshkov
0 siblings, 1 reply; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-29 11:53 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab, linux-media,
linux-arm-msm, linux-kernel
On 9/27/2026 11:55 PM, Dmitry Baryshkov wrote:
> On Sun, Sep 27, 2026 at 09:27:46AM +0530, Sachin Kumar Garg wrote:
>> Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
>> exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
>> HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
>> is only meaningful for CBR rate-control modes.
>>
>> Low VBV delay values (34-100 ms) require the encoder to run
>> with a single video pipe, so extend iris_set_pipe() to force
>> work_route to 1 whenever the configured VBV_DELAY falls in that
>> range.
>>
>> Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
>> Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
>> ---
>> drivers/media/platform/qcom/iris/iris_ctrls.c | 37 +++++++++++++++++++++-
>> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
>> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 ++++++-
>> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
>> .../platform/qcom/iris/iris_platform_common.h | 1 +
>> 5 files changed, 50 insertions(+), 2 deletions(-)
>>
>> @@ -541,8 +545,19 @@ int iris_set_stage(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id
>> int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
>> {
>> const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
>> - u32 work_route = inst->fw_caps[PIPE].value;
>> + u32 work_route = inst->fw_caps[PIPE].max;
>
> Why is being set to the max value instead of using the .value?
>
fw_caps[PIPE].min/.max/.value are all seeded from the same platform
constant (num_vpp_pipe) at init, so .max and .value were interchangeable
before this patch. This patch now writes the applied pipe count back
into .value (used elsewhere for power/cycle estimation), which makes
.value stateful. Since iris_set_pipe() is re-invoked on every resolution
change while streaming, seeding work_route from .value would let a
previous single-pipe override persist as the new baseline on the next
call, even after the VBV-delay/CBR condition no longer applies. Reading
from .max instead keeps the default pipe count stable and re-evaluates
the workaround fresh on every call.
Regards,
Sachin>> u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
>> + u32 vbv_delay;
>> +
>> + if (inst->domain == ENCODER &&
>> + inst->fw_caps[FRAME_RC_ENABLE].value &&
>> + inst->fw_caps[BITRATE_MODE].value == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
>> + vbv_delay = inst->fw_caps[VBV_DELAY].value;
>> + if (vbv_delay >= 34 && vbv_delay <= 100)
>> + work_route = 1;
>> + }
>> +
>> + inst->fw_caps[PIPE].value = work_route;
>>
>> return hfi_ops->session_set_property(inst, hfi_id,
>> HFI_HOST_FLAGS_NONE,
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v4 2/2] media: iris: add support for vbv delay
2026-09-29 11:53 ` Sachin Kumar Garg
@ 2026-09-29 15:05 ` Dmitry Baryshkov
2026-09-29 16:07 ` Sachin Kumar Garg
0 siblings, 1 reply; 19+ messages in thread
From: Dmitry Baryshkov @ 2026-09-29 15:05 UTC (permalink / raw)
To: Sachin Kumar Garg
Cc: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab, linux-media,
linux-arm-msm, linux-kernel
On Tue, 29 Sept 2026 at 14:54, Sachin Kumar Garg
<sachin.garg@oss.qualcomm.com> wrote:
>
>
>
> On 9/27/2026 11:55 PM, Dmitry Baryshkov wrote:
> > On Sun, Sep 27, 2026 at 09:27:46AM +0530, Sachin Kumar Garg wrote:
> >> Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
> >> exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
> >> HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
> >> is only meaningful for CBR rate-control modes.
> >>
> >> Low VBV delay values (34-100 ms) require the encoder to run
> >> with a single video pipe, so extend iris_set_pipe() to force
> >> work_route to 1 whenever the configured VBV_DELAY falls in that
> >> range.
> >>
> >> Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
> >> Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
> >> ---
> >> drivers/media/platform/qcom/iris/iris_ctrls.c | 37 +++++++++++++++++++++-
> >> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
> >> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 ++++++-
> >> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
> >> .../platform/qcom/iris/iris_platform_common.h | 1 +
> >> 5 files changed, 50 insertions(+), 2 deletions(-)
> >>
> >> @@ -541,8 +545,19 @@ int iris_set_stage(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id
> >> int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> >> {
> >> const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
> >> - u32 work_route = inst->fw_caps[PIPE].value;
> >> + u32 work_route = inst->fw_caps[PIPE].max;
> >
> > Why is being set to the max value instead of using the .value?
> >
>
> fw_caps[PIPE].min/.max/.value are all seeded from the same platform
> constant (num_vpp_pipe) at init, so .max and .value were interchangeable
> before this patch. This patch now writes the applied pipe count back
> into .value (used elsewhere for power/cycle estimation), which makes
> .value stateful. Since iris_set_pipe() is re-invoked on every resolution
> change while streaming, seeding work_route from .value would let a
> previous single-pipe override persist as the new baseline on the next
> call, even after the VBV-delay/CBR condition no longer applies. Reading
> from .max instead keeps the default pipe count stable and re-evaluates
> the workaround fresh on every call.
With the .value being written, does it need a lock protection?
>
> Regards,
> Sachin>> u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
> >> + u32 vbv_delay;
> >> +
> >> + if (inst->domain == ENCODER &&
> >> + inst->fw_caps[FRAME_RC_ENABLE].value &&
> >> + inst->fw_caps[BITRATE_MODE].value == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
> >> + vbv_delay = inst->fw_caps[VBV_DELAY].value;
> >> + if (vbv_delay >= 34 && vbv_delay <= 100)
> >> + work_route = 1;
> >> + }
> >> +
> >> + inst->fw_caps[PIPE].value = work_route;
> >>
> >> return hfi_ops->session_set_property(inst, hfi_id,
> >> HFI_HOST_FLAGS_NONE,
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v4 2/2] media: iris: add support for vbv delay
2026-09-29 15:05 ` Dmitry Baryshkov
@ 2026-09-29 16:07 ` Sachin Kumar Garg
0 siblings, 0 replies; 19+ messages in thread
From: Sachin Kumar Garg @ 2026-09-29 16:07 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Vikash Garodia, Dikshita Agarwal, Abhinav Kumar,
Bryan O'Donoghue, Mauro Carvalho Chehab, linux-media,
linux-arm-msm, linux-kernel
On 9/29/2026 8:35 PM, Dmitry Baryshkov wrote:
> On Tue, 29 Sept 2026 at 14:54, Sachin Kumar Garg
> <sachin.garg@oss.qualcomm.com> wrote:
>>
>>
>>
>> On 9/27/2026 11:55 PM, Dmitry Baryshkov wrote:
>>> On Sun, Sep 27, 2026 at 09:27:46AM +0530, Sachin Kumar Garg wrote:
>>>> Add the VBV_DELAY instance capability for the HFI Gen2 encoder,
>>>> exposed to userspace via V4L2_CID_MPEG_VIDEO_VBV_DELAY and mapped to
>>>> HFI_PROP_VBV_DELAY through a new iris_set_vbv_delay(). The property
>>>> is only meaningful for CBR rate-control modes.
>>>>
>>>> Low VBV delay values (34-100 ms) require the encoder to run
>>>> with a single video pipe, so extend iris_set_pipe() to force
>>>> work_route to 1 whenever the configured VBV_DELAY falls in that
>>>> range.
>>>>
>>>> Reviewed-by: Vikash Garodia <vikash.garodia@oss.qualcomm.com>
>>>> Signed-off-by: Sachin Kumar Garg <sachin.garg@oss.qualcomm.com>
>>>> ---
>>>> drivers/media/platform/qcom/iris/iris_ctrls.c | 37 +++++++++++++++++++++-
>>>> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
>>>> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 12 ++++++-
>>>> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
>>>> .../platform/qcom/iris/iris_platform_common.h | 1 +
>>>> 5 files changed, 50 insertions(+), 2 deletions(-)
>>>>
>>>> @@ -541,8 +545,19 @@ int iris_set_stage(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id
>>>> int iris_set_pipe(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
>>>> {
>>>> const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
>>>> - u32 work_route = inst->fw_caps[PIPE].value;
>>>> + u32 work_route = inst->fw_caps[PIPE].max;
>>>
>>> Why is being set to the max value instead of using the .value?
>>>
>>
>> fw_caps[PIPE].min/.max/.value are all seeded from the same platform
>> constant (num_vpp_pipe) at init, so .max and .value were interchangeable
>> before this patch. This patch now writes the applied pipe count back
>> into .value (used elsewhere for power/cycle estimation), which makes
>> .value stateful. Since iris_set_pipe() is re-invoked on every resolution
>> change while streaming, seeding work_route from .value would let a
>> previous single-pipe override persist as the new baseline on the next
>> call, even after the VBV-delay/CBR condition no longer applies. Reading
>> from .max instead keeps the default pipe count stable and re-evaluates
>> the workaround fresh on every call.
>
> With the .value being written, does it need a lock protection?
>
No — inst->lock already serializes this. iris_set_pipe()'s write to
fw_caps[PIPE].value only happens inside start_streaming
(iris_venc/vdec_streamon_output(), both the iris_set_properties() cap
loop and the DRC re-apply path), and start_streaming takes inst->lock
before reaching either. The only reader outside that same call chain is
the power/clock-scaling code (iris_vpu3x_vpu4x_calculate_frequency()),
which is only invoked via iris_scale_power(), itself called from
start_streaming and buf_queue — both of which also hold inst->lock. So
writer and readers already can't run concurrently; adding a lock here
would just be redundant with the existing vb2-op locking, and no other
.set() callback in this file takes one either.
Regards,
Sachin>>
>> Regards,
>> Sachin>> u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
>>>> + u32 vbv_delay;
>>>> +
>>>> + if (inst->domain == ENCODER &&
>>>> + inst->fw_caps[FRAME_RC_ENABLE].value &&
>>>> + inst->fw_caps[BITRATE_MODE].value == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
>>>> + vbv_delay = inst->fw_caps[VBV_DELAY].value;
>>>> + if (vbv_delay >= 34 && vbv_delay <= 100)
>>>> + work_route = 1;
>>>> + }
>>>> +
>>>> + inst->fw_caps[PIPE].value = work_route;
>>>>
>>>> return hfi_ops->session_set_property(inst, hfi_id,
>>>> HFI_HOST_FLAGS_NONE,
>>
>
>
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2026-09-29 16:07 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-30 14:55 [PATCH 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-07-30 14:55 ` [PATCH 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
2026-09-22 13:50 ` Vikash Garodia
2026-07-30 14:55 ` [PATCH 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
2026-09-22 13:51 ` Vikash Garodia
2026-09-26 13:08 ` [PATCH v2 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-09-26 13:08 ` [PATCH v2 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
2026-09-26 13:08 ` [PATCH v2 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
2026-09-26 17:09 ` [PATCH v3 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
2026-09-27 3:57 ` [PATCH v4 0/2] media: iris: add vbv delay support Sachin Kumar Garg
2026-09-27 3:57 ` [PATCH v4 1/2] media: iris: enable pipe for hfi gen2 encoder Sachin Kumar Garg
2026-09-27 18:23 ` Dmitry Baryshkov
2026-09-27 3:57 ` [PATCH v4 2/2] media: iris: add support for vbv delay Sachin Kumar Garg
2026-09-27 18:25 ` Dmitry Baryshkov
2026-09-29 11:53 ` Sachin Kumar Garg
2026-09-29 15:05 ` Dmitry Baryshkov
2026-09-29 16:07 ` Sachin Kumar Garg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®