Re: [PATCH 1/5] media: iris: support decode-order output on HFI gen2

From: Nicolas Dufresne

Date: Tue Nov 03 2026 - 17:21:24 EST


Le jeudi 29 octobre 2026 à 11:58 +0800, Xilin Wu a écrit :
> Synchronous per-picture clients such as VA-API can stall when firmware
> holds decoded pictures for display reordering while the client waits for
> the current picture before submitting more input.
>
> Expose the decoder display-delay controls on HFI gen2, with a zero delay
> selecting decode-order output. Keep display-order output as the default.

Ack-by: Nicolas Dufresne <nicolas.dufresne@xxxxxxxxxxxxx>

A better justification would be to match Venus feature here. Doing VA-API is a
bit borderline as nobody will understand that VA does not work in the normal
V4L2 stateful decoder order, nor the level of spurious effort needed to glue
these two things together.

Nicolas

>
> Signed-off-by: Xilin Wu <sophon@xxxxxxxxx>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 8 ++++++++
> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 20 ++++++++++++++++++++
> .../media/platform/qcom/iris/iris_hfi_gen2_command.c | 18 ++++++++++++++++++
> .../media/platform/qcom/iris/iris_hfi_gen2_defines.h | 1 +
> .../media/platform/qcom/iris/iris_platform_common.h | 2 ++
> 5 files changed, 49 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
> index 4f2633bbb49f..1dbea37c93c3 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.c
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
> @@ -155,6 +155,10 @@ 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_DEC_DISPLAY_DELAY_ENABLE:
> + return DISPLAY_DELAY_ENABLE;
> + case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY:
> + return DISPLAY_DELAY;
> case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:
> return REQUEST_SYNC_FRAME;
> case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
> @@ -306,6 +310,10 @@ 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 DISPLAY_DELAY_ENABLE:
> + return V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE;
> + case DISPLAY_DELAY:
> + return V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY;
> case REQUEST_SYNC_FRAME:
> return V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME;
> case SLICE_MODE:
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
> index 79bbd06ef8d2..65af61b63a29 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c
> @@ -842,6 +842,22 @@ static const struct platform_inst_fw_cap inst_fw_cap_milos_enc[] = {
> };
>
> static const struct platform_inst_fw_cap inst_fw_cap_sm8550_dec[] = {
> + {
> + .cap_id = DISPLAY_DELAY_ENABLE,
> + .min = 0,
> + .max = 1,
> + .step_or_mask = 1,
> + .value = 0,
> + .hfi_id = HFI_PROP_DECODE_ORDER_OUTPUT,
> + .flags = CAP_FLAG_INPUT_PORT,
> + },
> + {
> + .cap_id = DISPLAY_DELAY,
> + .min = 0,
> + .max = 0,
> + .step_or_mask = 1,
> + .value = 0,
> + },
> {
> .cap_id = PROFILE_H264,
> .min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
> @@ -1818,6 +1834,7 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
> };
>
> static const u32 sm8550_vdec_input_config_params_default[] = {
> + HFI_PROP_DECODE_ORDER_OUTPUT,
> HFI_PROP_BITSTREAM_RESOLUTION,
> HFI_PROP_CROP_OFFSETS,
> HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> @@ -1830,6 +1847,7 @@ static const u32 sm8550_vdec_input_config_params_default[] = {
> };
>
> static const u32 sm8550_vdec_input_config_param_hevc[] = {
> + HFI_PROP_DECODE_ORDER_OUTPUT,
> HFI_PROP_BITSTREAM_RESOLUTION,
> HFI_PROP_CROP_OFFSETS,
> HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> @@ -1841,6 +1859,7 @@ static const u32 sm8550_vdec_input_config_param_hevc[] = {
> };
>
> static const u32 sm8550_vdec_input_config_param_vp9[] = {
> + HFI_PROP_DECODE_ORDER_OUTPUT,
> HFI_PROP_BITSTREAM_RESOLUTION,
> HFI_PROP_CROP_OFFSETS,
> HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> @@ -1850,6 +1869,7 @@ static const u32 sm8550_vdec_input_config_param_vp9[] = {
> };
>
> static const u32 sm8550_vdec_input_config_param_av1[] = {
> + HFI_PROP_DECODE_ORDER_OUTPUT,
> HFI_PROP_BITSTREAM_RESOLUTION,
> HFI_PROP_CROP_OFFSETS,
> HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> index 388a36ff2b07..a285e6fc8728 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -665,6 +665,23 @@ static int iris_hfi_gen2_set_super_block(struct iris_inst *inst, u32 plane)
> sizeof(u32));
> }
>
> +static int iris_hfi_gen2_set_decode_order_output(struct iris_inst *inst, u32 plane)
> +{
> + struct platform_inst_fw_cap *cap = &inst->fw_caps[DISPLAY_DELAY_ENABLE];
> + u32 decode_order = cap->value;
> +
> + /* Leave the firmware default unchanged unless userspace sets the control. */
> + if (!(cap->flags & CAP_FLAG_CLIENT_SET))
> + return 0;
> +
> + return iris_hfi_gen2_session_set_property(inst,
> + HFI_PROP_DECODE_ORDER_OUTPUT,
> + HFI_HOST_FLAGS_NONE,
> + HFI_PORT_BITSTREAM,
> + HFI_PAYLOAD_U32,
> + &decode_order, sizeof(decode_order));
> +}
> +
> static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 plane)
> {
> const struct iris_firmware_data *fdata = inst->core->iris_firmware_data;
> @@ -691,6 +708,7 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
> {HFI_PROP_FRAME_RATE, iris_hfi_gen2_set_frame_rate },
> {HFI_PROP_AV1_FILM_GRAIN_PRESENT, iris_hfi_gen2_set_film_grain },
> {HFI_PROP_AV1_SUPER_BLOCK_ENABLED, iris_hfi_gen2_set_super_block },
> + {HFI_PROP_DECODE_ORDER_OUTPUT, iris_hfi_gen2_set_decode_order_output },
> };
>
> if (inst->domain == DECODER) {
> 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 2b8b057d35a9..e89ed4075526 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> @@ -130,6 +130,7 @@ enum hfi_flip {
>
> #define HFI_PROP_FLIP 0x0300014c
> #define HFI_PROP_SIGNAL_COLOR_INFO 0x03000155
> +#define HFI_PROP_DECODE_ORDER_OUTPUT 0x0300015b
> #define HFI_PROP_PICTURE_TYPE 0x03000162
> #define HFI_PROP_DEC_DEFAULT_HEADER 0x03000168
> #define HFI_PROP_DEC_START_FROM_RAP_FRAME 0x03000169
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index cddab9a9c375..aa8cd2e1b3f1 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -211,6 +211,8 @@ enum platform_inst_fw_cap_type {
> SLICE_MODE,
> SLICE_MAX_BYTES,
> SLICE_MAX_MB,
> + DISPLAY_DELAY_ENABLE,
> + DISPLAY_DELAY,
> INST_FW_CAP_MAX,
> };
>

Attachment: signature.asc
Description: This is a digitally signed message part