[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <747f661f-1be3-59d3-0cec-71bb6a6e2fa6@oss.qualcomm.com>
Date: Wed, 3 Dec 2025 09:58:49 +0530
From: Dikshita Agarwal <dikshita.agarwal@....qualcomm.com>
To: Wangao Wang <wangao.wang@....qualcomm.com>,
Vikash Garodia <vikash.garodia@....qualcomm.com>,
Abhinav Kumar <abhinav.kumar@...ux.dev>,
Bryan O'Donoghue <bod@...nel.org>,
Mauro Carvalho Chehab <mchehab@...nel.org>
Cc: quic_qiweil@...cinc.com, Renjiang Han <renjiang.han@....qualcomm.com>,
linux-media@...r.kernel.org, linux-arm-msm@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH 1/4] media: qcom: iris: Add intra refresh support for gen1
encoder
On 11/27/2025 1:14 PM, Wangao Wang wrote:
> Add support for intra refresh configuration on gen1 encoder by enabling
> V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD and
> V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE controls.
>
> Key changes:
> Added intra refresh capability for gen1 encoder.
> Implemented handler for intra refresh period and type.
> Defined HFI property and structure for gen1.
> Renamed iris_set_ir_period_gen2() for gen2 to keep implementation separate.
No need to explain the code in commit text.
>
> Signed-off-by: Wangao Wang <wangao.wang@....qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 36 +++++++++++++++++++++-
> drivers/media/platform/qcom/iris/iris_ctrls.h | 3 +-
> .../platform/qcom/iris/iris_hfi_gen1_command.c | 8 +++++
> .../platform/qcom/iris/iris_hfi_gen1_defines.h | 13 ++++++++
> .../media/platform/qcom/iris/iris_platform_gen1.c | 19 ++++++++++++
> .../media/platform/qcom/iris/iris_platform_gen2.c | 2 +-
> 6 files changed, 78 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
> index 1910aa31a9b9218e9423f2916aa40b85185f0dfb..cdf38c285b9133f20bdb9bc3dd0f5e916d3ed7f8 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.c
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
> @@ -962,7 +962,41 @@ int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> &hfi_val, sizeof(u32));
> }
>
> -int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> +int iris_set_ir_period_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> +{
> + const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
> + struct v4l2_pix_format_mplane *fmt = &inst->fmt_dst->fmt.pix_mp;
> + u32 ir_period = inst->fw_caps[cap_id].value;
> + u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
> + struct hfi_intra_refresh hfi_val;
> +
> + if (!ir_period)
> + return -EINVAL;
> +
> + if (inst->fw_caps[IR_TYPE].value ==
> + V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) {
> + hfi_val.mode = HFI_INTRA_REFRESH_RANDOM;
> + } else if (inst->fw_caps[IR_TYPE].value ==
> + V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC) {
> + hfi_val.mode = HFI_INTRA_REFRESH_CYCLIC;
> + } else {
> + return -EINVAL;
> + }
> +
> + hfi_val.mbs = fmt->width * fmt->height;
> + hfi_val.mbs /= 16 * 16;
> + if (hfi_val.mbs % ir_period)
> + hfi_val.mbs++;
> + hfi_val.mbs /= ir_period;
Can we have some comment here to explain what is this calculation for?
> +
> + return hfi_ops->session_set_property(inst, hfi_id,
> + HFI_HOST_FLAGS_NONE,
> + iris_get_port_info(inst, cap_id),
> + HFI_PAYLOAD_STRUCTURE,
> + &hfi_val, sizeof(hfi_val));
> +}
> +
> +int iris_set_ir_period_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> {
> const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
> struct vb2_queue *q = v4l2_m2m_get_dst_vq(inst->m2m_ctx);
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
> index 9518803577bc39f5c1339a49878dd0c3e8f510ad..a0d5338bdc910bd30407132e8b700c333ad74e4c 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.h
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
> @@ -34,7 +34,8 @@ int iris_set_frame_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
> int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> -int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> +int iris_set_ir_period_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> +int iris_set_ir_period_gen2(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_gen1_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> index 52da7ef7bab08fb1cb2ac804ccc6e3c7f9677890..4d9632ba86bc8f629cee6d726eb44efcdeba2475 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> @@ -685,6 +685,14 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_session_set_property_pkt *p
> packet->shdr.hdr.size += sizeof(u32) + sizeof(*plane_actual_info);
> break;
> }
> + case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: {
> + struct hfi_intra_refresh *in = pdata, *intra_refresh = prop_data;
> +
> + intra_refresh->mode = in->mode;
> + intra_refresh->mbs = in->mbs;
> + packet->shdr.hdr.size += sizeof(u32) + sizeof(*intra_refresh);
> + break;
> + }
> default:
> return -EINVAL;
> }
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
> index 42226ccee3d9b9eb5f793c3be127acd8afad2138..04c79ee0463d7f32a2042044fe4564718cc01561 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
> @@ -139,6 +139,14 @@
> #define HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL 0x2005003
> #define HFI_PROPERTY_PARAM_VENC_RATE_CONTROL 0x2005004
> #define HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2 0x2005009
> +
> +#define HFI_INTRA_REFRESH_NONE 0x1
> +#define HFI_INTRA_REFRESH_CYCLIC 0x2
> +#define HFI_INTRA_REFRESH_ADAPTIVE 0x3
> +#define HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE 0x4
HFI_INTRA_REFRESH_ADAPTIVE and HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE are not
being used, do we need these macros here?
> +#define HFI_INTRA_REFRESH_RANDOM 0x5
> +
> +#define HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH 0x200500d
> #define HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES 0x2005020
> #define HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE 0x2006001
> #define HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER 0x2006008
> @@ -447,6 +455,11 @@ struct hfi_framerate {
> u32 framerate;
> };
>
> +struct hfi_intra_refresh {
> + u32 mode;
> + u32 mbs;
> +};
> +
> struct hfi_event_data {
> u32 error;
> u32 height;
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> index 34cbeb8f52e248b6aec3e0ee911e14d50df07cce..e7645bd60eb46785e0110a34f3257f7c37bbfca5 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c
> @@ -230,6 +230,25 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8250_enc[] = {
> .flags = CAP_FLAG_OUTPUT_PORT,
> .set = iris_set_qp_range,
> },
> + {
> + .cap_id = IR_TYPE,
> + .min = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
> + .max = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC,
> + .step_or_mask = BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) |
> + BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC),
> + .value = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
> + .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> + },
> + {
> + .cap_id = IR_PERIOD,
> + .min = 0,
> + .max = INT_MAX,
is this value correct? please recheck.
Thanks,
Dikshita
> + .step_or_mask = 1,
> + .value = 0,
> + .hfi_id = HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH,
> + .flags = CAP_FLAG_OUTPUT_PORT,
> + .set = iris_set_ir_period_gen1,
> + },
> };
>
> static struct platform_inst_caps platform_inst_cap_sm8250 = {
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index a2025d32b3235aaff25793ba77db143000e54bae..b3425dcea22ceadbd56021e5859a24134100d5df 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -635,7 +635,7 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
> .value = 0,
> .flags = CAP_FLAG_OUTPUT_PORT |
> CAP_FLAG_DYNAMIC_ALLOWED,
> - .set = iris_set_ir_period,
> + .set = iris_set_ir_period_gen2,
> },
> };
>
>
Powered by blists - more mailing lists