[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <6e8266a5-99c8-4a34-8caf-fb828782d2a6@linaro.org>
Date: Fri, 31 Oct 2025 11:54:32 +0100
From: Neil Armstrong <neil.armstrong@...aro.org>
To: Wangao Wang <wangao.wang@....qualcomm.com>,
Vikash Garodia <vikash.garodia@....qualcomm.com>,
Dikshita Agarwal <dikshita.agarwal@....qualcomm.com>,
Abhinav Kumar <abhinav.kumar@...ux.dev>, Bryan O'Donoghue <bod@...nel.org>,
Mauro Carvalho Chehab <mchehab@...nel.org>
Cc: linux-media@...r.kernel.org, linux-arm-msm@...r.kernel.org,
linux-kernel@...r.kernel.org, quic_qiweil@...cinc.com,
quic_renjiang@...cinc.com
Subject: Re: [PATCH v2 2/5] media: qcom: iris: Add scale support for encoder
On 10/31/25 10:50, Wangao Wang wrote:
> Add members enc_scale_width, enc_scale_height to the struct iris_inst to
> support scale requirements.
>
> Add output width and height settings in iris_venc_s_fmt_output to
> enable scaling functionality.
>
> Add VPSS buffer to platform data, which the scale function requires.
>
> Signed-off-by: Wangao Wang <wangao.wang@....qualcomm.com>
> ---
> .../platform/qcom/iris/iris_hfi_gen2_command.c | 4 ++--
> .../platform/qcom/iris/iris_hfi_gen2_response.c | 2 ++
> drivers/media/platform/qcom/iris/iris_instance.h | 4 ++++
> .../media/platform/qcom/iris/iris_platform_gen2.c | 12 +++++++++++
> drivers/media/platform/qcom/iris/iris_venc.c | 23 +++++++++++++++++++++-
> drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 9 +++++----
> 6 files changed, 47 insertions(+), 7 deletions(-)
>
> 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 ada9b4d298ef10ac47a573061369828a1e150f85..6ec217268a2bc1f939fa33820c1ae19adaad2e96 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -194,8 +194,8 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
> payload_type = HFI_PAYLOAD_U32;
> } else {
> codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> - resolution = ALIGN(inst->fmt_dst->fmt.pix_mp.width, codec_align) << 16 |
> - ALIGN(inst->fmt_dst->fmt.pix_mp.height, codec_align);
> + resolution = ALIGN(inst->enc_scale_width, codec_align) << 16 |
> + ALIGN(inst->enc_scale_height, codec_align);
> inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
> payload_type = HFI_PAYLOAD_32_PACKED;
> }
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> index 2f1f118eae4f6462ab1aa1d16844b34e6e699f1e..dc3e606b6ab429a1d15536fa8316afb1e384d674 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> @@ -54,6 +54,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_inst *inst,
> return BUF_SCRATCH_2;
> case HFI_BUFFER_PERSIST:
> return BUF_PERSIST;
> + case HFI_BUFFER_VPSS:
> + return BUF_VPSS;
> default:
> return 0;
> }
> diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
> index fbae1662947df73bb3d10b7892839fa1076b7e61..5ff01dd7177fc919d0cc69553fadede5801592a1 100644
> --- a/drivers/media/platform/qcom/iris/iris_instance.h
> +++ b/drivers/media/platform/qcom/iris/iris_instance.h
> @@ -66,6 +66,8 @@ struct iris_fmt {
> * @hfi_rc_type: rate control type
> * @enc_raw_width: raw image width for encoder instance
> * @enc_raw_height: raw image height for encoder instance
> + * @enc_scale_width: scale width for encoder instance
> + * @enc_scale_height: scale height for encoder instance
> */
>
> struct iris_inst {
> @@ -106,6 +108,8 @@ struct iris_inst {
> u32 hfi_rc_type;
> u32 enc_raw_width;
> u32 enc_raw_height;
> + u32 enc_scale_width;
> + u32 enc_scale_height;
> };
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index 36d69cc73986b74534a2912524c8553970fd862e..d3306189d902a1f42666010468c9e4e4316a66e1 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -729,6 +729,10 @@ static const u32 sm8550_dec_op_int_buf_tbl[] = {
> BUF_DPB,
> };
>
> +static const u32 sm8550_enc_ip_int_buf_tbl[] = {
> + BUF_VPSS,
> +};
> +
> static const u32 sm8550_enc_op_int_buf_tbl[] = {
> BUF_BIN,
> BUF_COMV,
> @@ -816,6 +820,8 @@ struct iris_platform_data sm8550_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -908,6 +914,8 @@ struct iris_platform_data sm8650_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -989,6 +997,8 @@ struct iris_platform_data sm8750_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -1077,6 +1087,8 @@ struct iris_platform_data qcs8300_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
> index 6adadc89e360a6e4bebe1f839d38892990e10fa2..17a2e59e4ba8ff650895dde9fe569da39ef88093 100644
> --- a/drivers/media/platform/qcom/iris/iris_venc.c
> +++ b/drivers/media/platform/qcom/iris/iris_venc.c
> @@ -70,6 +70,8 @@ int iris_venc_inst_init(struct iris_inst *inst)
>
> inst->enc_raw_width = DEFAULT_WIDTH;
> inst->enc_raw_height = DEFAULT_HEIGHT;
> + inst->enc_scale_width = DEFAULT_WIDTH;
> + inst->enc_scale_height = DEFAULT_HEIGHT;
>
> memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
> INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
> @@ -188,15 +190,32 @@ int iris_venc_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
>
> static int iris_venc_s_fmt_output(struct iris_inst *inst, struct v4l2_format *f)
> {
> + const struct iris_fmt *venc_fmt;
> struct v4l2_format *fmt;
> + u32 codec_align;
>
> iris_venc_try_fmt(inst, f);
>
> - if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
> + venc_fmt = find_format(inst, f->fmt.pix_mp.pixelformat, f->type);
> + if (!venc_fmt)
> return -EINVAL;
>
> + codec_align = venc_fmt->pixfmt == V4L2_PIX_FMT_HEVC ? 32 : 16;
> +
> fmt = inst->fmt_dst;
> fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
> + /*
> + * If output format size != input format size,
> + * it is considered a scaling case,
> + * and the scaled size needs to be saved.
> + */
> + if (f->fmt.pix_mp.width != fmt->fmt.pix_mp.width ||
> + f->fmt.pix_mp.height != fmt->fmt.pix_mp.height) {
> + fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, codec_align);
> + fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, codec_align);
> + inst->enc_scale_width = f->fmt.pix_mp.width;
> + inst->enc_scale_height = f->fmt.pix_mp.height;
> + }
> fmt->fmt.pix_mp.num_planes = 1;
> fmt->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
> fmt->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_OUTPUT);
> @@ -254,6 +273,8 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
>
> inst->enc_raw_width = f->fmt.pix_mp.width;
> inst->enc_raw_height = f->fmt.pix_mp.height;
> + inst->enc_scale_width = f->fmt.pix_mp.width;
> + inst->enc_scale_height = f->fmt.pix_mp.height;
>
> if (f->fmt.pix_mp.width != inst->crop.width ||
> f->fmt.pix_mp.height != inst->crop.height) {
> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> index 4463be05ce165adef6b152eb0c155d2e6a7b3c36..db5adadd1b39c06bc41ae6f1b3d2f924b3ebf150 100644
> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> @@ -1131,10 +1131,11 @@ static u32 iris_vpu_enc_arp_size(struct iris_inst *inst)
>
> inline bool is_scaling_enabled(struct iris_inst *inst)
> {
> - return inst->crop.left != inst->compose.left ||
> - inst->crop.top != inst->compose.top ||
> - inst->crop.width != inst->compose.width ||
> - inst->crop.height != inst->compose.height;
> + struct v4l2_pix_format_mplane *dst_fmt = &inst->fmt_dst->fmt.pix_mp;
> + struct v4l2_pix_format_mplane *src_fmt = &inst->fmt_src->fmt.pix_mp;
> +
> + return dst_fmt->width != src_fmt->width ||
> + dst_fmt->height != src_fmt->height;
> }
>
> static inline
>
Tested-by: Neil Armstrong <neil.armstrong@...aro.org> # on SM8650-HDK
Powered by blists - more mailing lists