Linux ARM-MSM sub-architecture
 help / color / mirror / Atom feed
* [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder
@ 2025-03-05 10:43 Dikshita Agarwal
  2025-03-05 10:43 ` [RFC PATCH 01/12] media: iris: Add HEVC and VP9 formats for decoder Dikshita Agarwal
                   ` (12 more replies)
  0 siblings, 13 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Hi all,

This patch series adds initial support for the HEVC(H.265) and VP9
codecs in iris decoder. The objective of this work is to extend the 
decoder's capabilities to handle HEVC and VP9 codec streams,
including necessary format handling and buffer management.
In addition, the series also includes a set of fixes to address issues
identified during testing of these additional codecs.

I'm sharing this series as an RFC because compliance and conformance
testing are still in progress.
While initial functional tests show positive results, I would
appreciate early feedback on the design, implementation, and fixes
before moving to a formal submission.

I plan to submit a formal patch series after completing all compliance
checks. Meanwhile, any feedback or suggestion to improve this work are
very welcome.

Thanks,
Dikshita

Dikshita Agarwal (12):
  media: iris: Add HEVC and VP9 formats for decoder
  media: iris: Add platform capabilities for HEVC and VP9 decoders
  media: iris: Set mandatory properties for HEVC and VP9 decoders.
  media: iris: Add internal buffer calculation for HEVC and VP9 decoders
  media: iris: Skip destroying internal buffer if not dequeued
  media: iris: Update CAPTURE format info based on OUTPUT format
  media: iris: Add handling for corrupt and drop frames
  media: iris: Avoid updating frame size to firmware during reconfig
  media: iris: Avoid sending LAST flag multiple times
  media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
  media: iris: Fix handling of eos buffer during drain
  media: iris: Add handling for no show frames

 .../media/platform/qcom/iris/iris_buffer.c    |  22 +-
 drivers/media/platform/qcom/iris/iris_ctrls.c |  28 +-
 .../platform/qcom/iris/iris_hfi_common.h      |   1 +
 .../qcom/iris/iris_hfi_gen1_command.c         |  38 +-
 .../qcom/iris/iris_hfi_gen1_defines.h         |   4 +
 .../qcom/iris/iris_hfi_gen1_response.c        |  11 +
 .../qcom/iris/iris_hfi_gen2_command.c         | 129 +++++-
 .../qcom/iris/iris_hfi_gen2_defines.h         |   5 +
 .../qcom/iris/iris_hfi_gen2_response.c        |  56 ++-
 .../media/platform/qcom/iris/iris_instance.h  |   6 +
 .../platform/qcom/iris/iris_platform_common.h |  25 +-
 .../platform/qcom/iris/iris_platform_sm8250.c |   4 +-
 .../platform/qcom/iris/iris_platform_sm8550.c | 141 ++++++-
 drivers/media/platform/qcom/iris/iris_vb2.c   |   3 +-
 drivers/media/platform/qcom/iris/iris_vdec.c  |  80 +++-
 drivers/media/platform/qcom/iris/iris_vdec.h  |  11 +
 drivers/media/platform/qcom/iris/iris_vidc.c  |   3 -
 .../platform/qcom/iris/iris_vpu_buffer.c      | 397 +++++++++++++++++-
 .../platform/qcom/iris/iris_vpu_buffer.h      |  46 +-
 19 files changed, 931 insertions(+), 79 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 32+ messages in thread

* [RFC PATCH 01/12] media: iris: Add HEVC and VP9 formats for decoder
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-06  0:17   ` Bryan O'Donoghue
  2025-03-05 10:43 ` [RFC PATCH 02/12] media: iris: Add platform capabilities for HEVC and VP9 decoders Dikshita Agarwal
                   ` (11 subsequent siblings)
  12 siblings, 1 reply; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Extend the decoder driver's supported formats to include HEVC (H.265)
and VP9. This change updates the format enumeration (VIDIOC_ENUM_FMT)
and allows setting these formats via VIDIOC_S_FMT.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 .../qcom/iris/iris_hfi_gen1_command.c         | 18 ++++-
 .../qcom/iris/iris_hfi_gen1_defines.h         |  2 +
 .../qcom/iris/iris_hfi_gen2_command.c         | 16 ++++-
 .../qcom/iris/iris_hfi_gen2_defines.h         |  3 +
 .../media/platform/qcom/iris/iris_instance.h  |  2 +
 drivers/media/platform/qcom/iris/iris_vdec.c  | 69 +++++++++++++++++--
 drivers/media/platform/qcom/iris/iris_vdec.h  | 11 +++
 drivers/media/platform/qcom/iris/iris_vidc.c  |  3 -
 8 files changed, 113 insertions(+), 11 deletions(-)

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 64f887d9a17d..1e774b058ab9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -26,6 +26,20 @@ static u32 iris_hfi_gen1_buf_type_from_driver(enum iris_buffer_type buffer_type)
 	}
 }
 
+static u32 iris_hfi_gen1_v4l2_to_codec_type(u32 pixfmt)
+{
+	switch (pixfmt) {
+	case V4L2_PIX_FMT_H264:
+		return HFI_VIDEO_CODEC_H264;
+	case V4L2_PIX_FMT_HEVC:
+		return HFI_VIDEO_CODEC_HEVC;
+	case V4L2_PIX_FMT_VP9:
+		return HFI_VIDEO_CODEC_VP9;
+	default:
+		return 0;
+	}
+}
+
 static int iris_hfi_gen1_sys_init(struct iris_core *core)
 {
 	struct hfi_sys_init_pkt sys_init_pkt;
@@ -88,16 +102,18 @@ static int iris_hfi_gen1_sys_pc_prep(struct iris_core *core)
 static int iris_hfi_gen1_session_open(struct iris_inst *inst)
 {
 	struct hfi_session_open_pkt packet;
+	u32 codec;
 	int ret;
 
 	if (inst->state != IRIS_INST_DEINIT)
 		return -EALREADY;
 
+	codec = iris_hfi_gen1_v4l2_to_codec_type(inst->codec);
 	packet.shdr.hdr.size = sizeof(struct hfi_session_open_pkt);
 	packet.shdr.hdr.pkt_type = HFI_CMD_SYS_SESSION_INIT;
 	packet.shdr.session_id = inst->session_id;
 	packet.session_domain = HFI_SESSION_TYPE_DEC;
-	packet.session_codec = HFI_VIDEO_CODEC_H264;
+	packet.session_codec = codec;
 
 	reinit_completion(&inst->completion);
 
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 9f246816a286..3bea643068f9 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
@@ -13,6 +13,8 @@
 #define HFI_SESSION_TYPE_DEC				2
 
 #define HFI_VIDEO_CODEC_H264				0x00000002
+#define HFI_VIDEO_CODEC_HEVC				0x00002000
+#define HFI_VIDEO_CODEC_VP9				0x00004000
 
 #define HFI_ERR_NONE					0x0
 
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 a908b41e2868..beaf3a051d7c 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -20,6 +20,20 @@
 #define SYS_NO_PAYLOAD_PKT_SIZE (sizeof(struct iris_hfi_header) + \
 	sizeof(struct iris_hfi_packet))
 
+static u32 iris_hfi_gen2_v4l2_to_codec_type(struct iris_inst *inst)
+{
+	switch (inst->codec) {
+	case V4L2_PIX_FMT_H264:
+		return HFI_CODEC_DECODE_AVC;
+	case V4L2_PIX_FMT_HEVC:
+		return HFI_CODEC_DECODE_HEVC;
+	case V4L2_PIX_FMT_VP9:
+		return HFI_CODEC_DECODE_VP9;
+	default:
+		return 0;
+	}
+}
+
 static int iris_hfi_gen2_sys_init(struct iris_core *core)
 {
 	struct iris_hfi_header *hdr;
@@ -416,7 +430,7 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
 static int iris_hfi_gen2_session_set_codec(struct iris_inst *inst)
 {
 	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
-	u32 codec = HFI_CODEC_DECODE_AVC;
+	u32 codec = iris_hfi_gen2_v4l2_to_codec_type(inst);
 
 	iris_hfi_gen2_packet_session_property(inst,
 					      HFI_PROP_CODEC,
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 806f8bb7f505..2fcf7914b70f 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -104,6 +104,9 @@ enum hfi_color_format {
 enum hfi_codec_type {
 	HFI_CODEC_DECODE_AVC			= 1,
 	HFI_CODEC_ENCODE_AVC			= 2,
+	HFI_CODEC_DECODE_HEVC			= 3,
+	HFI_CODEC_ENCODE_HEVC			= 4,
+	HFI_CODEC_DECODE_VP9			= 5,
 };
 
 enum hfi_picture_type {
diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
index caa3c6507006..d8f076936c2b 100644
--- a/drivers/media/platform/qcom/iris/iris_instance.h
+++ b/drivers/media/platform/qcom/iris/iris_instance.h
@@ -42,6 +42,7 @@
  * @sequence_out: a sequence counter for output queue
  * @tss: timestamp metadata
  * @metadata_idx: index for metadata buffer
+ * @codec: codec type
  */
 
 struct iris_inst {
@@ -72,6 +73,7 @@ struct iris_inst {
 	u32				sequence_out;
 	struct iris_ts_metadata		tss[VIDEO_MAX_FRAME];
 	u32				metadata_idx;
+	u32				codec;
 };
 
 #endif
diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
index 4143acedfc57..cdcfe71f5b96 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -32,6 +32,7 @@ int iris_vdec_inst_init(struct iris_inst *inst)
 	f->fmt.pix_mp.width = DEFAULT_WIDTH;
 	f->fmt.pix_mp.height = DEFAULT_HEIGHT;
 	f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
+	inst->codec = f->fmt.pix_mp.pixelformat;
 	f->fmt.pix_mp.num_planes = 1;
 	f->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
 	f->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_INPUT);
@@ -67,14 +68,67 @@ void iris_vdec_inst_deinit(struct iris_inst *inst)
 	kfree(inst->fmt_src);
 }
 
+static const struct iris_fmt iris_vdec_formats[] = {
+	[IRIS_FMT_H264] = {
+		.pixfmt = V4L2_PIX_FMT_H264,
+		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
+	},
+	[IRIS_FMT_HEVC] = {
+		.pixfmt = V4L2_PIX_FMT_HEVC,
+		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
+	},
+	[IRIS_FMT_VP9] = {
+		.pixfmt = V4L2_PIX_FMT_VP9,
+		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
+	},
+};
+
+static const struct iris_fmt *
+find_format(struct iris_inst *inst, u32 pixfmt, u32 type)
+{
+	const struct iris_fmt *fmt = iris_vdec_formats;
+	unsigned int size = ARRAY_SIZE(iris_vdec_formats);
+	unsigned int i;
+
+	for (i = 0; i < size; i++) {
+		if (fmt[i].pixfmt == pixfmt)
+			break;
+	}
+
+	if (i == size || fmt[i].type != type)
+		return NULL;
+
+	return &fmt[i];
+}
+
+static const struct iris_fmt *
+find_format_by_index(struct iris_inst *inst, u32 index, u32 type)
+{
+	const struct iris_fmt *fmt = iris_vdec_formats;
+	unsigned int size = ARRAY_SIZE(iris_vdec_formats);
+
+	if (index >= size || fmt[index].type != type)
+		return NULL;
+
+	return &fmt[index];
+}
+
 int iris_vdec_enum_fmt(struct iris_inst *inst, struct v4l2_fmtdesc *f)
 {
+	const struct iris_fmt *fmt;
+
 	switch (f->type) {
 	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
-		f->pixelformat = V4L2_PIX_FMT_H264;
+		fmt = find_format_by_index(inst, f->index, f->type);
+		if (!fmt)
+			return -EINVAL;
+
+		f->pixelformat = fmt->pixfmt;
 		f->flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION;
 		break;
 	case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
+		if (f->index)
+			return -EINVAL;
 		f->pixelformat = V4L2_PIX_FMT_NV12;
 		break;
 	default:
@@ -88,13 +142,15 @@ int iris_vdec_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
 {
 	struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
 	struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx;
+	const struct iris_fmt *fmt;
 	struct v4l2_format *f_inst;
 	struct vb2_queue *src_q;
 
 	memset(pixmp->reserved, 0, sizeof(pixmp->reserved));
+	fmt = find_format(inst, pixmp->pixelformat, f->type);
 	switch (f->type) {
 	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
-		if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_H264) {
+		if (!fmt) {
 			f_inst = inst->fmt_src;
 			f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
 			f->fmt.pix_mp.height = f_inst->fmt.pix_mp.height;
@@ -102,7 +158,7 @@ int iris_vdec_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
 		}
 		break;
 	case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
-		if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_NV12) {
+		if (!fmt) {
 			f_inst = inst->fmt_dst;
 			f->fmt.pix_mp.pixelformat = f_inst->fmt.pix_mp.pixelformat;
 			f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
@@ -145,13 +201,14 @@ int iris_vdec_s_fmt(struct iris_inst *inst, struct v4l2_format *f)
 
 	switch (f->type) {
 	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
-		if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_H264)
+		if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
 			return -EINVAL;
 
 		fmt = inst->fmt_src;
 		fmt->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-
-		codec_align = DEFAULT_CODEC_ALIGNMENT;
+		fmt->fmt.pix_mp.pixelformat = f->fmt.pix_mp.pixelformat;
+		inst->codec = fmt->fmt.pix_mp.pixelformat;
+		codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
 		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);
 		fmt->fmt.pix_mp.num_planes = 1;
diff --git a/drivers/media/platform/qcom/iris/iris_vdec.h b/drivers/media/platform/qcom/iris/iris_vdec.h
index b24932dc511a..cd7aab66dc7c 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.h
+++ b/drivers/media/platform/qcom/iris/iris_vdec.h
@@ -8,6 +8,17 @@
 
 struct iris_inst;
 
+enum iris_fmt_type {
+	IRIS_FMT_H264,
+	IRIS_FMT_HEVC,
+	IRIS_FMT_VP9,
+};
+
+struct iris_fmt {
+	u32 pixfmt;
+	u32 type;
+};
+
 int iris_vdec_inst_init(struct iris_inst *inst);
 void iris_vdec_inst_deinit(struct iris_inst *inst);
 int iris_vdec_enum_fmt(struct iris_inst *inst, struct v4l2_fmtdesc *f);
diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/platform/qcom/iris/iris_vidc.c
index ca0f4e310f77..6a6afa15b647 100644
--- a/drivers/media/platform/qcom/iris/iris_vidc.c
+++ b/drivers/media/platform/qcom/iris/iris_vidc.c
@@ -249,9 +249,6 @@ static int iris_enum_fmt(struct file *filp, void *fh, struct v4l2_fmtdesc *f)
 {
 	struct iris_inst *inst = iris_get_inst(filp, NULL);
 
-	if (f->index)
-		return -EINVAL;
-
 	return iris_vdec_enum_fmt(inst, f);
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 02/12] media: iris: Add platform capabilities for HEVC and VP9 decoders
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
  2025-03-05 10:43 ` [RFC PATCH 01/12] media: iris: Add HEVC and VP9 formats for decoder Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-06  0:28   ` Bryan O'Donoghue
  2025-03-05 10:43 ` [RFC PATCH 03/12] media: iris: Set mandatory properties " Dikshita Agarwal
                   ` (10 subsequent siblings)
  12 siblings, 1 reply; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Add platform capabilities for HEVC and VP9 codecs in decoder driver
with related hooks.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_ctrls.c | 28 ++++++-
 .../qcom/iris/iris_hfi_gen2_command.c         | 30 ++++++-
 .../qcom/iris/iris_hfi_gen2_defines.h         |  1 +
 .../qcom/iris/iris_hfi_gen2_response.c        | 36 ++++++++-
 .../platform/qcom/iris/iris_platform_common.h |  9 ++-
 .../platform/qcom/iris/iris_platform_sm8550.c | 80 ++++++++++++++++++-
 6 files changed, 170 insertions(+), 14 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index b690578256d5..fb2b818c7c5c 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -20,9 +20,19 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
 	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
 		return DEBLOCK;
 	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
-		return PROFILE;
+		return PROFILE_H264;
+	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
+		return PROFILE_HEVC;
+	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
+		return PROFILE_VP9;
 	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
-		return LEVEL;
+		return LEVEL_H264;
+	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
+		return LEVEL_HEVC;
+	case V4L2_CID_MPEG_VIDEO_VP9_LEVEL:
+		return LEVEL_VP9;
+	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
+		return TIER;
 	default:
 		return INST_FW_CAP_MAX;
 	}
@@ -36,10 +46,20 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
 	switch (cap_id) {
 	case DEBLOCK:
 		return V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER;
-	case PROFILE:
+	case PROFILE_H264:
 		return V4L2_CID_MPEG_VIDEO_H264_PROFILE;
-	case LEVEL:
+	case PROFILE_HEVC:
+		return V4L2_CID_MPEG_VIDEO_HEVC_PROFILE;
+	case PROFILE_VP9:
+		return V4L2_CID_MPEG_VIDEO_VP9_PROFILE;
+	case LEVEL_H264:
 		return V4L2_CID_MPEG_VIDEO_H264_LEVEL;
+	case LEVEL_HEVC:
+		return V4L2_CID_MPEG_VIDEO_HEVC_LEVEL;
+	case LEVEL_VP9:
+		return V4L2_CID_MPEG_VIDEO_VP9_LEVEL;
+	case TIER:
+		return V4L2_CID_MPEG_VIDEO_HEVC_TIER;
 	default:
 		return 0;
 	}
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 beaf3a051d7c..a3ebcda9a2ba 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -309,7 +309,20 @@ static int iris_hfi_gen2_set_profile(struct iris_inst *inst)
 {
 	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
 	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-	u32 profile = inst->fw_caps[PROFILE].value;
+	u32 profile;
+
+	switch (inst->codec) {
+	case V4L2_PIX_FMT_HEVC:
+		profile = inst->fw_caps[PROFILE_HEVC].value;
+		break;
+	case V4L2_PIX_FMT_VP9:
+		profile = inst->fw_caps[PROFILE_VP9].value;
+		break;
+	case V4L2_PIX_FMT_H264:
+	default:
+		profile = inst->fw_caps[PROFILE_H264].value;
+		break;
+	}
 
 	inst_hfi_gen2->src_subcr_params.profile = profile;
 
@@ -326,7 +339,20 @@ static int iris_hfi_gen2_set_level(struct iris_inst *inst)
 {
 	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
 	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-	u32 level = inst->fw_caps[LEVEL].value;
+	u32 level;
+
+	switch (inst->codec) {
+	case V4L2_PIX_FMT_HEVC:
+		level = inst->fw_caps[LEVEL_HEVC].value;
+		break;
+	case V4L2_PIX_FMT_VP9:
+		level = inst->fw_caps[LEVEL_VP9].value;
+		break;
+	case V4L2_PIX_FMT_H264:
+	default:
+		level = inst->fw_caps[LEVEL_H264].value;
+		break;
+	}
 
 	inst_hfi_gen2->src_subcr_params.level = level;
 
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 2fcf7914b70f..48c507a1ec27 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -46,6 +46,7 @@
 #define HFI_PROP_CROP_OFFSETS			0x03000105
 #define HFI_PROP_PROFILE			0x03000107
 #define HFI_PROP_LEVEL				0x03000108
+#define HFI_PROP_TIER				0x03000109
 #define HFI_PROP_STAGE				0x0300010a
 #define HFI_PROP_PIPE				0x0300010b
 #define HFI_PROP_LUMA_CHROMA_BIT_DEPTH		0x0300010f
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 b75a01641d5d..809bf0f238bd 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -563,8 +563,22 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
 	inst->crop.width = pixmp_ip->width -
 		((subsc_params.crop_offsets[1] >> 16) & 0xFFFF) - inst->crop.left;
 
-	inst->fw_caps[PROFILE].value = subsc_params.profile;
-	inst->fw_caps[LEVEL].value = subsc_params.level;
+	switch (inst->codec) {
+	case V4L2_PIX_FMT_HEVC:
+		inst->fw_caps[PROFILE_HEVC].value = subsc_params.profile;
+		inst->fw_caps[LEVEL_HEVC].value = subsc_params.level;
+		break;
+	case V4L2_PIX_FMT_VP9:
+		inst->fw_caps[PROFILE_VP9].value = subsc_params.profile;
+		inst->fw_caps[LEVEL_VP9].value = subsc_params.level;
+		break;
+	case V4L2_PIX_FMT_H264:
+	default:
+		inst->fw_caps[PROFILE_H264].value = subsc_params.profile;
+		inst->fw_caps[LEVEL_H264].value = subsc_params.level;
+		break;
+	}
+
 	inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
 
 	if (subsc_params.bit_depth != BIT_DEPTH_8 ||
@@ -791,8 +805,22 @@ static void iris_hfi_gen2_init_src_change_param(struct iris_inst *inst)
 					     full_range, video_format,
 					     video_signal_type_present_flag);
 
-	subsc_params->profile = inst->fw_caps[PROFILE].value;
-	subsc_params->level = inst->fw_caps[LEVEL].value;
+	switch (inst->codec) {
+	case V4L2_PIX_FMT_HEVC:
+		subsc_params->profile = inst->fw_caps[PROFILE_HEVC].value;
+		subsc_params->level = inst->fw_caps[LEVEL_HEVC].value;
+		break;
+	case V4L2_PIX_FMT_VP9:
+		subsc_params->profile = inst->fw_caps[PROFILE_VP9].value;
+		subsc_params->level = inst->fw_caps[LEVEL_VP9].value;
+		break;
+	case V4L2_PIX_FMT_H264:
+	default:
+		subsc_params->profile = inst->fw_caps[PROFILE_H264].value;
+		subsc_params->level = inst->fw_caps[LEVEL_H264].value;
+		break;
+	}
+
 	subsc_params->pic_order_cnt = inst->fw_caps[POC].value;
 	subsc_params->bit_depth = inst->fw_caps[BIT_DEPTH].value;
 	if (inst->fw_caps[CODED_FRAMES].value ==
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index f6b15d2805fb..67204cddd44a 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -78,8 +78,12 @@ struct platform_inst_caps {
 };
 
 enum platform_inst_fw_cap_type {
-	PROFILE = 1,
-	LEVEL,
+	PROFILE_H264 = 1,
+	PROFILE_HEVC,
+	PROFILE_VP9,
+	LEVEL_H264,
+	LEVEL_HEVC,
+	LEVEL_VP9,
 	INPUT_BUF_HOST_MAX_COUNT,
 	STAGE,
 	PIPE,
@@ -88,6 +92,7 @@ enum platform_inst_fw_cap_type {
 	BIT_DEPTH,
 	RAP_FRAME,
 	DEBLOCK,
+	TIER,
 	INST_FW_CAP_MAX,
 };
 
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
index 35d278996c43..29bc50785da5 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
@@ -14,7 +14,7 @@
 
 static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
 	{
-		.cap_id = PROFILE,
+		.cap_id = PROFILE_H264,
 		.min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
 		.max = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH,
 		.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
@@ -28,7 +28,29 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
 		.set = iris_set_u32_enum,
 	},
 	{
-		.cap_id = LEVEL,
+		.cap_id = PROFILE_HEVC,
+		.min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
+		.max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE,
+		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE),
+		.value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
+		.hfi_id = HFI_PROP_PROFILE,
+		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		.set = iris_set_u32_enum,
+	},
+	{
+		.cap_id = PROFILE_VP9,
+		.min = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
+		.max = V4L2_MPEG_VIDEO_VP9_PROFILE_2,
+		.step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_0) |
+				BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_2),
+		.value = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
+		.hfi_id = HFI_PROP_PROFILE,
+		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		.set = iris_set_u32_enum,
+	},
+	{
+		.cap_id = LEVEL_H264,
 		.min = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
 		.max = V4L2_MPEG_VIDEO_H264_LEVEL_6_2,
 		.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
@@ -56,6 +78,60 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
 		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		.set = iris_set_u32_enum,
 	},
+	{
+		.cap_id = LEVEL_HEVC,
+		.min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
+		.max = V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
+		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2),
+		.value = V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1,
+		.hfi_id = HFI_PROP_LEVEL,
+		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		.set = iris_set_u32_enum,
+	},
+	{
+		.cap_id = LEVEL_VP9,
+		.min = V4L2_MPEG_VIDEO_VP9_LEVEL_1_0,
+		.max = V4L2_MPEG_VIDEO_VP9_LEVEL_6_0,
+		.step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_0) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_1) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_0) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_1) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_0) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_1) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_0) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_1) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_0) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_1) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_2) |
+				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_6_0),
+		.value = V4L2_MPEG_VIDEO_VP9_LEVEL_6_0,
+		.hfi_id = HFI_PROP_LEVEL,
+		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		.set = iris_set_u32_enum,
+	},
+	{
+		.cap_id = TIER,
+		.min = V4L2_MPEG_VIDEO_HEVC_TIER_MAIN,
+		.max = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
+		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_TIER_MAIN) |
+				BIT(V4L2_MPEG_VIDEO_HEVC_TIER_HIGH),
+		.value = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
+		.hfi_id = HFI_PROP_TIER,
+		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		.set = iris_set_u32_enum,
+	},
 	{
 		.cap_id = INPUT_BUF_HOST_MAX_COUNT,
 		.min = DEFAULT_MAX_HOST_BUF_COUNT,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 03/12] media: iris: Set mandatory properties for HEVC and VP9 decoders.
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
  2025-03-05 10:43 ` [RFC PATCH 01/12] media: iris: Add HEVC and VP9 formats for decoder Dikshita Agarwal
  2025-03-05 10:43 ` [RFC PATCH 02/12] media: iris: Add platform capabilities for HEVC and VP9 decoders Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-05 14:00   ` neil.armstrong
  2025-03-06  0:52   ` Bryan O'Donoghue
  2025-03-05 10:43 ` [RFC PATCH 04/12] media: iris: Add internal buffer calculation " Dikshita Agarwal
                   ` (9 subsequent siblings)
  12 siblings, 2 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Subscribe and set mandatory properties to the firmware for HEVC and VP9
decoders.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 .../platform/qcom/iris/iris_hfi_common.h      |  1 +
 .../qcom/iris/iris_hfi_gen1_command.c         |  4 +-
 .../qcom/iris/iris_hfi_gen2_command.c         | 83 +++++++++++++++++--
 .../qcom/iris/iris_hfi_gen2_response.c        |  7 ++
 .../platform/qcom/iris/iris_platform_common.h | 16 +++-
 .../platform/qcom/iris/iris_platform_sm8250.c |  4 +-
 .../platform/qcom/iris/iris_platform_sm8550.c | 61 ++++++++++++--
 7 files changed, 151 insertions(+), 25 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h b/drivers/media/platform/qcom/iris/iris_hfi_common.h
index b2c541367fc6..9e6aadb83783 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_common.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h
@@ -140,6 +140,7 @@ struct hfi_subscription_params {
 	u32	color_info;
 	u32	profile;
 	u32	level;
+	u32	tier;
 };
 
 u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);
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 1e774b058ab9..a160ae915886 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -784,8 +784,8 @@ static int iris_hfi_gen1_session_set_config_params(struct iris_inst *inst, u32 p
 			iris_hfi_gen1_set_bufsize},
 	};
 
-	config_params = core->iris_platform_data->input_config_params;
-	config_params_size = core->iris_platform_data->input_config_params_size;
+	config_params = core->iris_platform_data->input_config_params_default;
+	config_params_size = core->iris_platform_data->input_config_params_default_size;
 
 	if (V4L2_TYPE_IS_OUTPUT(plane)) {
 		for (i = 0; i < config_params_size; i++) {
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 a3ebcda9a2ba..5b4c89184297 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -192,7 +192,7 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst)
 						  sizeof(u64));
 }
 
-static int iris_hfi_gen2_set_bit_dpeth(struct iris_inst *inst)
+static int iris_hfi_gen2_set_bit_depth(struct iris_inst *inst)
 {
 	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
 	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
@@ -407,6 +407,23 @@ static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst)
 						  sizeof(u64));
 }
 
+static int iris_hfi_gen2_set_tier(struct iris_inst *inst)
+{
+	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
+	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
+	u32 tier = inst->fw_caps[TIER].value;
+
+	inst_hfi_gen2->src_subcr_params.tier = tier;
+
+	return iris_hfi_gen2_session_set_property(inst,
+						  HFI_PROP_TIER,
+						  HFI_HOST_FLAGS_NONE,
+						  port,
+						  HFI_PAYLOAD_U32_ENUM,
+						  &tier,
+						  sizeof(u32));
+}
+
 static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 plane)
 {
 	struct iris_core *core = inst->core;
@@ -418,7 +435,7 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
 		{HFI_PROP_BITSTREAM_RESOLUTION,       iris_hfi_gen2_set_bitstream_resolution   },
 		{HFI_PROP_CROP_OFFSETS,               iris_hfi_gen2_set_crop_offsets           },
 		{HFI_PROP_CODED_FRAMES,               iris_hfi_gen2_set_coded_frames           },
-		{HFI_PROP_LUMA_CHROMA_BIT_DEPTH,      iris_hfi_gen2_set_bit_dpeth              },
+		{HFI_PROP_LUMA_CHROMA_BIT_DEPTH,      iris_hfi_gen2_set_bit_depth              },
 		{HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT, iris_hfi_gen2_set_min_output_count       },
 		{HFI_PROP_PIC_ORDER_CNT_TYPE,         iris_hfi_gen2_set_picture_order_count    },
 		{HFI_PROP_SIGNAL_COLOR_INFO,          iris_hfi_gen2_set_colorspace             },
@@ -426,11 +443,25 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
 		{HFI_PROP_LEVEL,                      iris_hfi_gen2_set_level                  },
 		{HFI_PROP_COLOR_FORMAT,               iris_hfi_gen2_set_colorformat            },
 		{HFI_PROP_LINEAR_STRIDE_SCANLINE,     iris_hfi_gen2_set_linear_stride_scanline },
+		{HFI_PROP_TIER,                       iris_hfi_gen2_set_tier                   },
 	};
 
 	if (V4L2_TYPE_IS_OUTPUT(plane)) {
-		config_params = core->iris_platform_data->input_config_params;
-		config_params_size = core->iris_platform_data->input_config_params_size;
+		if (inst->codec == V4L2_PIX_FMT_H264) {
+			config_params = core->iris_platform_data->input_config_params_default;
+			config_params_size =
+				core->iris_platform_data->input_config_params_default_size;
+		} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
+			config_params = core->iris_platform_data->input_config_params_hevc;
+			config_params_size =
+				core->iris_platform_data->input_config_params_hevc_size;
+		} else if (inst->codec == V4L2_PIX_FMT_VP9) {
+			config_params = core->iris_platform_data->input_config_params_vp9;
+			config_params_size =
+				core->iris_platform_data->input_config_params_vp9_size;
+		} else {
+			return -EINVAL;
+		}
 	} else {
 		config_params = core->iris_platform_data->output_config_params;
 		config_params_size = core->iris_platform_data->output_config_params_size;
@@ -600,8 +631,21 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
 		return 0;
 	}
 
-	change_param = core->iris_platform_data->input_config_params;
-	change_param_size = core->iris_platform_data->input_config_params_size;
+	if (inst->codec == V4L2_PIX_FMT_H264) {
+		change_param = core->iris_platform_data->input_config_params_default;
+		change_param_size =
+			core->iris_platform_data->input_config_params_default_size;
+	} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
+		change_param = core->iris_platform_data->input_config_params_hevc;
+		change_param_size =
+			core->iris_platform_data->input_config_params_hevc_size;
+	} else if (inst->codec == V4L2_PIX_FMT_VP9) {
+		change_param = core->iris_platform_data->input_config_params_vp9;
+		change_param_size =
+			core->iris_platform_data->input_config_params_vp9_size;
+	} else {
+		return -EINVAL;
+	}
 
 	payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
 
@@ -648,6 +692,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
 				payload_size = sizeof(u32);
 				payload_type = HFI_PAYLOAD_U32;
 				break;
+			case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
+				payload[0] = subsc_params.bit_depth;
+				payload_size = sizeof(u32);
+				payload_type = HFI_PAYLOAD_U32;
+				break;
 			case HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT:
 				payload[0] = subsc_params.fw_min_count;
 				payload_size = sizeof(u32);
@@ -673,6 +722,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
 				payload_size = sizeof(u32);
 				payload_type = HFI_PAYLOAD_U32;
 				break;
+			case HFI_PROP_TIER:
+				payload[0] = subsc_params.tier;
+				payload_size = sizeof(u32);
+				payload_type = HFI_PAYLOAD_U32;
+				break;
 			default:
 				prop_type = 0;
 				ret = -EINVAL;
@@ -709,8 +763,21 @@ static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
 		subscribe_prop_size = core->iris_platform_data->dec_input_prop_size;
 		subcribe_prop = core->iris_platform_data->dec_input_prop;
 	} else {
-		subscribe_prop_size = core->iris_platform_data->dec_output_prop_size;
-		subcribe_prop = core->iris_platform_data->dec_output_prop;
+		if (inst->codec == V4L2_PIX_FMT_H264) {
+			subcribe_prop = core->iris_platform_data->dec_output_prop_avc;
+			subscribe_prop_size =
+				core->iris_platform_data->dec_output_prop_avc_size;
+		} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
+			subcribe_prop = core->iris_platform_data->dec_output_prop_hevc;
+			subscribe_prop_size =
+				core->iris_platform_data->dec_output_prop_hevc_size;
+		} else if (inst->codec == V4L2_PIX_FMT_VP9) {
+			subcribe_prop = core->iris_platform_data->dec_output_prop_vp9;
+			subscribe_prop_size =
+				core->iris_platform_data->dec_output_prop_vp9_size;
+		} else {
+			return -EINVAL;
+		}
 	}
 
 	for (i = 0; i < subscribe_prop_size; i++)
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 809bf0f238bd..6846311a26c3 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -580,6 +580,7 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
 	}
 
 	inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
+	inst->fw_caps[TIER].value = subsc_params.tier;
 
 	if (subsc_params.bit_depth != BIT_DEPTH_8 ||
 	    !(subsc_params.coded_frames & HFI_BITMASK_FRAME_MBS_ONLY_FLAG)) {
@@ -664,6 +665,9 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
 		inst_hfi_gen2->src_subcr_params.crop_offsets[0] = pkt->payload[0];
 		inst_hfi_gen2->src_subcr_params.crop_offsets[1] = pkt->payload[1];
 		break;
+	case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
+		inst_hfi_gen2->src_subcr_params.bit_depth = pkt->payload[0];
+		break;
 	case HFI_PROP_CODED_FRAMES:
 		inst_hfi_gen2->src_subcr_params.coded_frames = pkt->payload[0];
 		break;
@@ -682,6 +686,9 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
 	case HFI_PROP_LEVEL:
 		inst_hfi_gen2->src_subcr_params.level = pkt->payload[0];
 		break;
+	case HFI_PROP_TIER:
+		inst_hfi_gen2->src_subcr_params.tier = pkt->payload[0];
+		break;
 	case HFI_PROP_PICTURE_TYPE:
 		inst_hfi_gen2->hfi_frame_info.picture_type = pkt->payload[0];
 		break;
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 67204cddd44a..433ce9b00c68 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -174,14 +174,22 @@ struct iris_platform_data {
 	u32 num_vpp_pipe;
 	u32 max_session_count;
 	u32 max_core_mbpf;
-	const u32 *input_config_params;
-	unsigned int input_config_params_size;
+	const u32 *input_config_params_default;
+	unsigned int input_config_params_default_size;
+	const u32 *input_config_params_hevc;
+	unsigned int input_config_params_hevc_size;
+	const u32 *input_config_params_vp9;
+	unsigned int input_config_params_vp9_size;
 	const u32 *output_config_params;
 	unsigned int output_config_params_size;
 	const u32 *dec_input_prop;
 	unsigned int dec_input_prop_size;
-	const u32 *dec_output_prop;
-	unsigned int dec_output_prop_size;
+	const u32 *dec_output_prop_avc;
+	unsigned int dec_output_prop_avc_size;
+	const u32 *dec_output_prop_hevc;
+	unsigned int dec_output_prop_hevc_size;
+	const u32 *dec_output_prop_vp9;
+	unsigned int dec_output_prop_vp9_size;
 	const u32 *dec_ip_int_buf_tbl;
 	unsigned int dec_ip_int_buf_tbl_size;
 	const u32 *dec_op_int_buf_tbl;
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
index 5c86fd7b7b6f..5f74e57f04fc 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
@@ -137,9 +137,9 @@ struct iris_platform_data sm8250_data = {
 	.num_vpp_pipe = 4,
 	.max_session_count = 16,
 	.max_core_mbpf = (8192 * 4352) / 256,
-	.input_config_params =
+	.input_config_params_default =
 		sm8250_vdec_input_config_param_default,
-	.input_config_params_size =
+	.input_config_params_default_size =
 		ARRAY_SIZE(sm8250_vdec_input_config_param_default),
 
 	.dec_ip_int_buf_tbl = sm8250_dec_ip_int_buf_tbl,
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
index 29bc50785da5..779c71885f51 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
@@ -254,9 +254,10 @@ static struct tz_cp_config tz_cp_config_sm8550 = {
 	.cp_nonpixel_size = 0x24800000,
 };
 
-static const u32 sm8550_vdec_input_config_params[] = {
+static const u32 sm8550_vdec_input_config_params_default[] = {
 	HFI_PROP_BITSTREAM_RESOLUTION,
 	HFI_PROP_CROP_OFFSETS,
+	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
 	HFI_PROP_CODED_FRAMES,
 	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
 	HFI_PROP_PIC_ORDER_CNT_TYPE,
@@ -265,6 +266,26 @@ static const u32 sm8550_vdec_input_config_params[] = {
 	HFI_PROP_SIGNAL_COLOR_INFO,
 };
 
+static const u32 sm8550_vdec_input_config_param_hevc[] = {
+	HFI_PROP_BITSTREAM_RESOLUTION,
+	HFI_PROP_CROP_OFFSETS,
+	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
+	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
+	HFI_PROP_PROFILE,
+	HFI_PROP_LEVEL,
+	HFI_PROP_TIER,
+	HFI_PROP_SIGNAL_COLOR_INFO,
+};
+
+static const u32 sm8550_vdec_input_config_param_vp9[] = {
+	HFI_PROP_BITSTREAM_RESOLUTION,
+	HFI_PROP_CROP_OFFSETS,
+	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
+	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
+	HFI_PROP_PROFILE,
+	HFI_PROP_LEVEL,
+};
+
 static const u32 sm8550_vdec_output_config_params[] = {
 	HFI_PROP_COLOR_FORMAT,
 	HFI_PROP_LINEAR_STRIDE_SCANLINE,
@@ -274,11 +295,19 @@ static const u32 sm8550_vdec_subscribe_input_properties[] = {
 	HFI_PROP_NO_OUTPUT,
 };
 
-static const u32 sm8550_vdec_subscribe_output_properties[] = {
+static const u32 sm8550_vdec_subscribe_output_properties_avc[] = {
 	HFI_PROP_PICTURE_TYPE,
 	HFI_PROP_CABAC_SESSION,
 };
 
+static const u32 sm8550_vdec_subscribe_output_properties_hevc[] = {
+	HFI_PROP_PICTURE_TYPE,
+};
+
+static const u32 sm8550_vdec_subscribe_output_properties_vp9[] = {
+	HFI_PROP_PICTURE_TYPE,
+};
+
 static const u32 sm8550_dec_ip_int_buf_tbl[] = {
 	BUF_BIN,
 	BUF_COMV,
@@ -322,19 +351,33 @@ struct iris_platform_data sm8550_data = {
 	.num_vpp_pipe = 4,
 	.max_session_count = 16,
 	.max_core_mbpf = ((8192 * 4352) / 256) * 2,
-	.input_config_params =
-		sm8550_vdec_input_config_params,
-	.input_config_params_size =
-		ARRAY_SIZE(sm8550_vdec_input_config_params),
+	.input_config_params_default =
+		sm8550_vdec_input_config_params_default,
+	.input_config_params_default_size =
+		ARRAY_SIZE(sm8550_vdec_input_config_params_default),
+	.input_config_params_hevc =
+		sm8550_vdec_input_config_param_hevc,
+	.input_config_params_hevc_size =
+		ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
+	.input_config_params_vp9 =
+		sm8550_vdec_input_config_param_vp9,
+	.input_config_params_vp9_size =
+		ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
 	.output_config_params =
 		sm8550_vdec_output_config_params,
 	.output_config_params_size =
 		ARRAY_SIZE(sm8550_vdec_output_config_params),
 	.dec_input_prop = sm8550_vdec_subscribe_input_properties,
 	.dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
-	.dec_output_prop = sm8550_vdec_subscribe_output_properties,
-	.dec_output_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
-
+	.dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
+	.dec_output_prop_avc_size =
+		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
+	.dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
+	.dec_output_prop_hevc_size =
+		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
+	.dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
+	.dec_output_prop_vp9_size =
+		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
 	.dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
 	.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
 	.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 04/12] media: iris: Add internal buffer calculation for HEVC and VP9 decoders
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (2 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 03/12] media: iris: Set mandatory properties " Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-06  1:05   ` Bryan O'Donoghue
  2025-03-05 10:43 ` [RFC PATCH 05/12] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
                   ` (8 subsequent siblings)
  12 siblings, 1 reply; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Add internal buffer count and size calculations for HEVC and VP9
decoders.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 .../media/platform/qcom/iris/iris_buffer.c    |   3 +
 .../platform/qcom/iris/iris_vpu_buffer.c      | 397 +++++++++++++++++-
 .../platform/qcom/iris/iris_vpu_buffer.h      |  46 +-
 3 files changed, 432 insertions(+), 14 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
index e5c5a564fcb8..8c9d5b7fe75c 100644
--- a/drivers/media/platform/qcom/iris/iris_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_buffer.c
@@ -205,6 +205,9 @@ static u32 iris_bitstream_buffer_size(struct iris_inst *inst)
 	if (num_mbs > NUM_MBS_4K) {
 		div_factor = 4;
 		base_res_mbs = caps->max_mbpf;
+	} else {
+		if (inst->codec == V4L2_PIX_FMT_VP9)
+			div_factor = 1;
 	}
 
 	/*
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
index dce25e410d80..13ee93356bcb 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
@@ -31,6 +31,42 @@ static u32 hfi_buffer_bin_h264d(u32 frame_width, u32 frame_height, u32 num_vpp_p
 	return size_h264d_hw_bin_buffer(n_aligned_w, n_aligned_h, num_vpp_pipes);
 }
 
+static u32 size_h265d_hw_bin_buffer(u32 frame_width, u32 frame_height, u32 num_vpp_pipes)
+{
+	u32 product = frame_width * frame_height;
+	u32 size_yuv, size_bin_hdr, size_bin_res;
+
+	size_yuv = (product <= BIN_BUFFER_THRESHOLD) ?
+		((BIN_BUFFER_THRESHOLD * 3) >> 1) : ((product * 3) >> 1);
+	size_bin_hdr = size_yuv * H265_CABAC_HDR_RATIO_HD_TOT;
+	size_bin_res = size_yuv * H265_CABAC_RES_RATIO_HD_TOT;
+	size_bin_hdr = ALIGN(size_bin_hdr / num_vpp_pipes, DMA_ALIGNMENT) * num_vpp_pipes;
+	size_bin_res = ALIGN(size_bin_res / num_vpp_pipes, DMA_ALIGNMENT) * num_vpp_pipes;
+
+	return size_bin_hdr + size_bin_res;
+}
+
+static u32 hfi_buffer_bin_vp9d(u32 frame_width, u32 frame_height, u32 num_vpp_pipes)
+{
+	u32 _size_yuv = ALIGN(frame_width, 16) * ALIGN(frame_height, 16) * 3 / 2;
+	u32 _size = ALIGN(((max_t(u32, _size_yuv, ((BIN_BUFFER_THRESHOLD * 3) >> 1)) *
+			VPX_DECODER_FRAME_BIN_HDR_BUDGET / VPX_DECODER_FRAME_BIN_DENOMINATOR *
+			VPX_DECODER_FRAME_CONCURENCY_LVL) / num_vpp_pipes), DMA_ALIGNMENT) +
+			ALIGN(((max_t(u32, _size_yuv, ((BIN_BUFFER_THRESHOLD * 3) >> 1)) *
+			VPX_DECODER_FRAME_BIN_RES_BUDGET / VPX_DECODER_FRAME_BIN_DENOMINATOR *
+			VPX_DECODER_FRAME_CONCURENCY_LVL) / num_vpp_pipes), DMA_ALIGNMENT);
+
+	return _size * num_vpp_pipes;
+}
+
+static u32 hfi_buffer_bin_h265d(u32 frame_width, u32 frame_height, u32 num_vpp_pipes)
+{
+	u32 n_aligned_w = ALIGN(frame_width, 16);
+	u32 n_aligned_h = ALIGN(frame_height, 16);
+
+	return size_h265d_hw_bin_buffer(n_aligned_w, n_aligned_h, num_vpp_pipes);
+}
+
 static u32 hfi_buffer_comv_h264d(u32 frame_width, u32 frame_height, u32 _comv_bufcount)
 {
 	u32 frame_height_in_mbs = DIV_ROUND_UP(frame_height, 16);
@@ -55,6 +91,17 @@ static u32 hfi_buffer_comv_h264d(u32 frame_width, u32 frame_height, u32 _comv_bu
 	return (size_colloc * (_comv_bufcount)) + 512;
 }
 
+static u32 hfi_buffer_comv_h265d(u32 frame_width, u32 frame_height, u32 _comv_bufcount)
+{
+	u32 frame_height_in_mbs = (frame_height + 15) >> 4;
+	u32 frame_width_in_mbs = (frame_width + 15) >> 4;
+	u32 _size;
+
+	_size = ALIGN(((frame_width_in_mbs * frame_height_in_mbs) << 8), 512);
+
+	return (_size * (_comv_bufcount)) + 512;
+}
+
 static u32 size_h264d_bse_cmd_buf(u32 frame_height)
 {
 	u32 height = ALIGN(frame_height, 32);
@@ -63,6 +110,44 @@ static u32 size_h264d_bse_cmd_buf(u32 frame_height)
 		SIZE_H264D_BSE_CMD_PER_BUF;
 }
 
+static u32 size_h265d_bse_cmd_buf(u32 frame_width, u32 frame_height)
+{
+	u32 _size = ALIGN(((ALIGN(frame_width, LCU_MAX_SIZE_PELS) / LCU_MIN_SIZE_PELS) *
+			   (ALIGN(frame_height, LCU_MAX_SIZE_PELS) / LCU_MIN_SIZE_PELS)) *
+			  NUM_HW_PIC_BUF, DMA_ALIGNMENT);
+	_size = min_t(u32, _size, H265D_MAX_SLICE + 1);
+	_size = 2 * _size * SIZE_H265D_BSE_CMD_PER_BUF;
+
+	return _size;
+}
+
+static u32 hfi_buffer_persist_h265d(u32 rpu_enabled)
+{
+	return ALIGN((SIZE_SLIST_BUF_H265 * NUM_SLIST_BUF_H265 +
+		      H265_NUM_FRM_INFO * H265_DISPLAY_BUF_SIZE +
+		      H265_NUM_TILE * sizeof(u32) +
+		      NUM_HW_PIC_BUF * SIZE_SEI_USERDATA +
+		      rpu_enabled * NUM_HW_PIC_BUF * SIZE_DOLBY_RPU_METADATA),
+		     DMA_ALIGNMENT);
+}
+
+static inline
+u32 hfi_iris3_vp9d_comv_size(void)
+{
+	return (((8192 + 63) >> 6) * ((4320 + 63) >> 6) * 8 * 8 * 2 * 8);
+}
+
+static u32 hfi_buffer_persist_vp9d(void)
+{
+	return ALIGN(VP9_NUM_PROBABILITY_TABLE_BUF * VP9_PROB_TABLE_SIZE, DMA_ALIGNMENT) +
+		ALIGN(hfi_iris3_vp9d_comv_size(), DMA_ALIGNMENT) +
+		ALIGN(MAX_SUPERFRAME_HEADER_LEN, DMA_ALIGNMENT) +
+		ALIGN(VP9_UDC_HEADER_BUF_SIZE, DMA_ALIGNMENT) +
+		ALIGN(VP9_NUM_FRAME_INFO_BUF * CCE_TILE_OFFSET_SIZE, DMA_ALIGNMENT) +
+		ALIGN(VP9_NUM_FRAME_INFO_BUF * VP9_FRAME_INFO_BUF_SIZE, DMA_ALIGNMENT) +
+		HDR10_HIST_EXTRADATA_SIZE;
+}
+
 static u32 size_h264d_vpp_cmd_buf(u32 frame_height)
 {
 	u32 size, height = ALIGN(frame_height, 32);
@@ -83,17 +168,45 @@ static u32 hfi_buffer_persist_h264d(void)
 
 static u32 hfi_buffer_non_comv_h264d(u32 frame_width, u32 frame_height, u32 num_vpp_pipes)
 {
-	u32 size_bse, size_vpp, size;
-
-	size_bse = size_h264d_bse_cmd_buf(frame_height);
-	size_vpp = size_h264d_vpp_cmd_buf(frame_height);
-	size = ALIGN(size_bse, DMA_ALIGNMENT) +
+	u32 size_bse = size_h264d_bse_cmd_buf(frame_height);
+	u32 size_vpp = size_h264d_vpp_cmd_buf(frame_height);
+	u32 size = ALIGN(size_bse, DMA_ALIGNMENT) +
 		ALIGN(size_vpp, DMA_ALIGNMENT) +
 		ALIGN(SIZE_HW_PIC(SIZE_H264D_HW_PIC_T), DMA_ALIGNMENT);
 
 	return ALIGN(size, DMA_ALIGNMENT);
 }
 
+static u32 size_h265d_vpp_cmd_buf(u32 frame_width, u32 frame_height)
+{
+	u32 _size = ALIGN(((ALIGN(frame_width, LCU_MAX_SIZE_PELS) / LCU_MIN_SIZE_PELS) *
+			   (ALIGN(frame_height, LCU_MAX_SIZE_PELS) / LCU_MIN_SIZE_PELS)) *
+			  NUM_HW_PIC_BUF, DMA_ALIGNMENT);
+	_size = min_t(u32, _size, H265D_MAX_SLICE + 1);
+	_size = ALIGN(_size, 4);
+	_size = 2 * _size * SIZE_H265D_VPP_CMD_PER_BUF;
+	if (_size > VPP_CMD_MAX_SIZE)
+		_size = VPP_CMD_MAX_SIZE;
+
+	return _size;
+}
+
+static u32 hfi_buffer_non_comv_h265d(u32 frame_width, u32 frame_height, u32 num_vpp_pipes)
+{
+	u32 _size_bse = size_h265d_bse_cmd_buf(frame_width, frame_height);
+	u32 _size_vpp = size_h265d_vpp_cmd_buf(frame_width, frame_height);
+	u32 _size = ALIGN(_size_bse, DMA_ALIGNMENT) +
+		ALIGN(_size_vpp, DMA_ALIGNMENT) +
+		ALIGN(NUM_HW_PIC_BUF * 20 * 22 * 4, DMA_ALIGNMENT) +
+		ALIGN(2 * sizeof(u16) *
+		(ALIGN(frame_width, LCU_MAX_SIZE_PELS) / LCU_MIN_SIZE_PELS) *
+		(ALIGN(frame_height, LCU_MAX_SIZE_PELS) / LCU_MIN_SIZE_PELS), DMA_ALIGNMENT) +
+		ALIGN(SIZE_HW_PIC(SIZE_H265D_HW_PIC_T), DMA_ALIGNMENT) +
+		HDR10_HIST_EXTRADATA_SIZE;
+
+	return ALIGN(_size, DMA_ALIGNMENT);
+}
+
 static u32 size_vpss_lb(u32 frame_width, u32 frame_height)
 {
 	u32 opb_lb_wr_llb_y_buffer_size, opb_lb_wr_llb_uv_buffer_size;
@@ -119,6 +232,203 @@ static u32 size_vpss_lb(u32 frame_width, u32 frame_height)
 		opb_lb_wr_llb_y_buffer_size;
 }
 
+static inline
+u32 size_h265d_lb_fe_top_data(u32 frame_width, u32 frame_height)
+{
+	return MAX_FE_NBR_DATA_LUMA_LINE_BUFFER_SIZE *
+		(ALIGN(frame_width, 64) + 8) * 2;
+}
+
+static inline
+u32 size_h265d_lb_fe_top_ctrl(u32 frame_width, u32 frame_height)
+{
+	return MAX_FE_NBR_CTRL_LCU64_LINE_BUFFER_SIZE *
+		(ALIGN(frame_width, LCU_MAX_SIZE_PELS) / LCU_MIN_SIZE_PELS);
+}
+
+static inline
+u32 size_h265d_lb_fe_left_ctrl(u32 frame_width, u32 frame_height)
+{
+	return MAX_FE_NBR_CTRL_LCU64_LINE_BUFFER_SIZE *
+		(ALIGN(frame_height, LCU_MAX_SIZE_PELS) / LCU_MIN_SIZE_PELS);
+}
+
+static inline
+u32 size_h265d_lb_se_top_ctrl(u32 frame_width, u32 frame_height)
+{
+	return (LCU_MAX_SIZE_PELS / 8 * (128 / 8)) * ((frame_width + 15) >> 4);
+}
+
+static inline
+u32 size_h265d_lb_se_left_ctrl(u32 frame_width, u32 frame_height)
+{
+	return max_t(u32, ((frame_height + 16 - 1) / 8) *
+		MAX_SE_NBR_CTRL_LCU16_LINE_BUFFER_SIZE,
+		max_t(u32, ((frame_height + 32 - 1) / 8) *
+		MAX_SE_NBR_CTRL_LCU32_LINE_BUFFER_SIZE,
+		((frame_height + 64 - 1) / 8) *
+		MAX_SE_NBR_CTRL_LCU64_LINE_BUFFER_SIZE));
+}
+
+static inline
+u32 size_h265d_lb_pe_top_data(u32 frame_width, u32 frame_height)
+{
+	return MAX_PE_NBR_DATA_LCU64_LINE_BUFFER_SIZE *
+		(ALIGN(frame_width, LCU_MIN_SIZE_PELS) / LCU_MIN_SIZE_PELS);
+}
+
+static inline
+u32 size_h265d_lb_vsp_top(u32 frame_width, u32 frame_height)
+{
+	return ((frame_width + 63) >> 6) * 128;
+}
+
+static inline
+u32 size_h265d_lb_vsp_left(u32 frame_width, u32 frame_height)
+{
+	return ((frame_height + 63) >> 6) * 128;
+}
+
+static inline
+u32 size_h265d_lb_recon_dma_metadata_wr(u32 frame_width, u32 frame_height)
+{
+	return size_h264d_lb_recon_dma_metadata_wr(frame_height);
+}
+
+static inline
+u32 size_h265d_qp(u32 frame_width, u32 frame_height)
+{
+	return size_h264d_qp(frame_width, frame_height);
+}
+
+static inline
+u32 hfi_buffer_line_h265d(u32 frame_width, u32 frame_height, bool is_opb, u32 num_vpp_pipes)
+{
+	u32 vpss_lb_size = 0, _size;
+
+	_size = ALIGN(size_h265d_lb_fe_top_data(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_h265d_lb_fe_top_ctrl(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_h265d_lb_fe_left_ctrl(frame_width, frame_height),
+		      DMA_ALIGNMENT) * num_vpp_pipes +
+		ALIGN(size_h265d_lb_se_left_ctrl(frame_width, frame_height),
+		      DMA_ALIGNMENT) * num_vpp_pipes +
+		ALIGN(size_h265d_lb_se_top_ctrl(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_h265d_lb_pe_top_data(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_h265d_lb_vsp_top(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_h265d_lb_vsp_left(frame_width, frame_height),
+		      DMA_ALIGNMENT) * num_vpp_pipes +
+		ALIGN(size_h265d_lb_recon_dma_metadata_wr(frame_width, frame_height),
+		      DMA_ALIGNMENT) * 4 +
+		ALIGN(size_h265d_qp(frame_width, frame_height), DMA_ALIGNMENT);
+	if (is_opb)
+		vpss_lb_size = size_vpss_lb(frame_width, frame_height);
+
+	return ALIGN((_size + vpss_lb_size), DMA_ALIGNMENT);
+}
+
+static inline
+u32 size_vpxd_lb_fe_left_ctrl(u32 frame_width, u32 frame_height)
+{
+	return max_t(u32, ((frame_height + 15) >> 4) *
+		     MAX_FE_NBR_CTRL_LCU16_LINE_BUFFER_SIZE,
+		     max_t(u32, ((frame_height + 31) >> 5) *
+			   MAX_FE_NBR_CTRL_LCU32_LINE_BUFFER_SIZE,
+			   ((frame_height + 63) >> 6) *
+			   MAX_FE_NBR_CTRL_LCU64_LINE_BUFFER_SIZE));
+}
+
+static inline
+u32 size_vpxd_lb_fe_top_ctrl(u32 frame_width, u32 frame_height)
+{
+	return ((ALIGN(frame_width, 64) + 8) * 10 * 2);
+}
+
+static inline
+u32 size_vpxd_lb_se_top_ctrl(u32 frame_width, u32 frame_height)
+{
+	return ((frame_width + 15) >> 4) * MAX_FE_NBR_CTRL_LCU16_LINE_BUFFER_SIZE;
+}
+
+static inline
+u32 size_vpxd_lb_se_left_ctrl(u32 frame_width, u32 frame_height)
+{
+	return max_t(u32, ((frame_height + 15) >> 4) *
+		     MAX_SE_NBR_CTRL_LCU16_LINE_BUFFER_SIZE,
+		     max_t(u32, ((frame_height + 31) >> 5) *
+			   MAX_SE_NBR_CTRL_LCU32_LINE_BUFFER_SIZE,
+			   ((frame_height + 63) >> 6) *
+			   MAX_SE_NBR_CTRL_LCU64_LINE_BUFFER_SIZE));
+}
+
+static inline
+u32 size_vpxd_lb_recon_dma_metadata_wr(u32 frame_width, u32 frame_height)
+{
+	return ALIGN((ALIGN(frame_height, 8) / (4 / 2)) * 64,
+		BUFFER_ALIGNMENT_32_BYTES);
+}
+
+static inline
+u32 size_mp2d_lb_fe_top_data(u32 frame_width, u32 frame_height)
+{
+	return ((ALIGN(frame_width, 16) + 8) * 10 * 2);
+}
+
+static inline
+u32 size_vp9d_lb_fe_top_data(u32 frame_width, u32 frame_height)
+{
+	return (ALIGN(ALIGN(frame_width, 8), 64) + 8) * 10 * 2;
+}
+
+static inline
+u32 size_vp9d_lb_pe_top_data(u32 frame_width, u32 frame_height)
+{
+	return ((ALIGN(ALIGN(frame_width, 8), 64) >> 6) * 176);
+}
+
+static inline
+u32 size_vp9d_lb_vsp_top(u32 frame_width, u32 frame_height)
+{
+	return (((ALIGN(ALIGN(frame_width, 8), 64) >> 6) * 64 * 8) + 256);
+}
+
+static inline
+u32 size_vp9d_qp(u32 frame_width, u32 frame_height)
+{
+	return size_h264d_qp(frame_width, frame_height);
+}
+
+static inline
+u32 hfi_iris3_vp9d_lb_size(u32 frame_width, u32 frame_height, u32 num_vpp_pipes)
+{
+	return ALIGN(size_vpxd_lb_fe_left_ctrl(frame_width, frame_height), DMA_ALIGNMENT) *
+		num_vpp_pipes +
+		ALIGN(size_vpxd_lb_se_left_ctrl(frame_width, frame_height), DMA_ALIGNMENT) *
+		num_vpp_pipes +
+		ALIGN(size_vp9d_lb_vsp_top(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_vpxd_lb_fe_top_ctrl(frame_width, frame_height), DMA_ALIGNMENT) +
+		2 * ALIGN(size_vpxd_lb_recon_dma_metadata_wr(frame_width, frame_height),
+			  DMA_ALIGNMENT) +
+		ALIGN(size_vpxd_lb_se_top_ctrl(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_vp9d_lb_pe_top_data(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_vp9d_lb_fe_top_data(frame_width, frame_height), DMA_ALIGNMENT) +
+		ALIGN(size_vp9d_qp(frame_width, frame_height), DMA_ALIGNMENT);
+}
+
+static inline
+u32 hfi_buffer_line_vp9d(u32 frame_width, u32 frame_height, u32 _yuv_bufcount_min, bool is_opb,
+			 u32 num_vpp_pipes)
+{
+	u32 vpss_lb_size = 0;
+	u32 _lb_size;
+
+	_lb_size = hfi_iris3_vp9d_lb_size(frame_width, frame_height, num_vpp_pipes);
+
+	if (is_opb)
+		vpss_lb_size = size_vpss_lb(frame_width, frame_height);
+
+	return _lb_size + vpss_lb_size + 4096;
+}
+
 static u32 hfi_buffer_line_h264d(u32 frame_width, u32 frame_height,
 				 bool is_opb, u32 num_vpp_pipes)
 {
@@ -148,7 +458,14 @@ static u32 iris_vpu_dec_bin_size(struct iris_inst *inst)
 	u32 height = f->fmt.pix_mp.height;
 	u32 width = f->fmt.pix_mp.width;
 
-	return hfi_buffer_bin_h264d(width, height, num_vpp_pipes);
+	if (inst->codec == V4L2_PIX_FMT_H264)
+		return hfi_buffer_bin_h264d(width, height, num_vpp_pipes);
+	else if (inst->codec == V4L2_PIX_FMT_HEVC)
+		return hfi_buffer_bin_h265d(width, height, num_vpp_pipes);
+	else if (inst->codec == V4L2_PIX_FMT_VP9)
+		return hfi_buffer_bin_vp9d(width, height, num_vpp_pipes);
+
+	return 0;
 }
 
 static u32 iris_vpu_dec_comv_size(struct iris_inst *inst)
@@ -158,12 +475,24 @@ static u32 iris_vpu_dec_comv_size(struct iris_inst *inst)
 	u32 height = f->fmt.pix_mp.height;
 	u32 width = f->fmt.pix_mp.width;
 
-	return hfi_buffer_comv_h264d(width, height, num_comv);
+	if (inst->codec == V4L2_PIX_FMT_H264)
+		return hfi_buffer_comv_h264d(width, height, num_comv);
+	else if (inst->codec == V4L2_PIX_FMT_HEVC)
+		return hfi_buffer_comv_h265d(width, height, num_comv);
+
+	return 0;
 }
 
 static u32 iris_vpu_dec_persist_size(struct iris_inst *inst)
 {
-	return hfi_buffer_persist_h264d();
+	if (inst->codec == V4L2_PIX_FMT_H264)
+		return hfi_buffer_persist_h264d();
+	else if (inst->codec == V4L2_PIX_FMT_HEVC)
+		return hfi_buffer_persist_h265d(0);
+	else if (inst->codec == V4L2_PIX_FMT_VP9)
+		return hfi_buffer_persist_vp9d();
+
+	return 0;
 }
 
 static u32 iris_vpu_dec_dpb_size(struct iris_inst *inst)
@@ -181,7 +510,12 @@ static u32 iris_vpu_dec_non_comv_size(struct iris_inst *inst)
 	u32 height = f->fmt.pix_mp.height;
 	u32 width = f->fmt.pix_mp.width;
 
-	return hfi_buffer_non_comv_h264d(width, height, num_vpp_pipes);
+	if (inst->codec == V4L2_PIX_FMT_H264)
+		return hfi_buffer_non_comv_h264d(width, height, num_vpp_pipes);
+	else if (inst->codec == V4L2_PIX_FMT_HEVC)
+		return hfi_buffer_non_comv_h265d(width, height, num_vpp_pipes);
+
+	return 0;
 }
 
 static u32 iris_vpu_dec_line_size(struct iris_inst *inst)
@@ -191,11 +525,20 @@ static u32 iris_vpu_dec_line_size(struct iris_inst *inst)
 	u32 height = f->fmt.pix_mp.height;
 	u32 width = f->fmt.pix_mp.width;
 	bool is_opb = false;
+	u32 out_min_count = inst->buffers[BUF_OUTPUT].min_count;
 
 	if (iris_split_mode_enabled(inst))
 		is_opb = true;
 
-	return hfi_buffer_line_h264d(width, height, is_opb, num_vpp_pipes);
+	if (inst->codec == V4L2_PIX_FMT_H264)
+		return hfi_buffer_line_h264d(width, height, is_opb, num_vpp_pipes);
+	else if (inst->codec == V4L2_PIX_FMT_HEVC)
+		return hfi_buffer_line_h265d(width, height, is_opb, num_vpp_pipes);
+	else if (inst->codec == V4L2_PIX_FMT_VP9)
+		return hfi_buffer_line_vp9d(width, height, out_min_count, is_opb,
+			num_vpp_pipes);
+
+	return 0;
 }
 
 static u32 iris_vpu_dec_scratch1_size(struct iris_inst *inst)
@@ -205,6 +548,24 @@ static u32 iris_vpu_dec_scratch1_size(struct iris_inst *inst)
 		iris_vpu_dec_line_size(inst);
 }
 
+static int output_min_count(struct iris_inst *inst)
+{
+	int output_min_count = 4;
+
+	/* fw_min_count > 0 indicates reconfig event has already arrived */
+	if (inst->fw_min_count) {
+		if (iris_split_mode_enabled(inst) && inst->codec == V4L2_PIX_FMT_VP9)
+			return min_t(u32, 4, inst->fw_min_count);
+		else
+			return inst->fw_min_count;
+	}
+
+	if (inst->codec == V4L2_PIX_FMT_VP9)
+		output_min_count = 9;
+
+	return output_min_count;
+}
+
 struct iris_vpu_buf_type_handle {
 	enum iris_buffer_type type;
 	u32 (*handle)(struct iris_inst *inst);
@@ -238,6 +599,19 @@ int iris_vpu_buf_size(struct iris_inst *inst, enum iris_buffer_type buffer_type)
 	return size;
 }
 
+static u32 internal_buffer_count(struct iris_inst *inst,
+				 enum iris_buffer_type buffer_type)
+{
+	if (buffer_type == BUF_BIN || buffer_type == BUF_LINE ||
+	    buffer_type == BUF_PERSIST) {
+		return 1;
+	} else if (buffer_type == BUF_COMV || buffer_type == BUF_NON_COMV) {
+		if (inst->codec == V4L2_PIX_FMT_H264 || inst->codec == V4L2_PIX_FMT_HEVC)
+			return 1;
+	}
+	return 0;
+}
+
 static inline int iris_vpu_dpb_count(struct iris_inst *inst)
 {
 	if (iris_split_mode_enabled(inst)) {
@@ -254,12 +628,13 @@ int iris_vpu_buf_count(struct iris_inst *inst, enum iris_buffer_type buffer_type
 	case BUF_INPUT:
 		return MIN_BUFFERS;
 	case BUF_OUTPUT:
-		return inst->fw_min_count;
+		return output_min_count(inst);
 	case BUF_BIN:
 	case BUF_COMV:
 	case BUF_NON_COMV:
 	case BUF_LINE:
 	case BUF_PERSIST:
+		return internal_buffer_count(inst, buffer_type);
 	case BUF_SCRATCH_1:
 		return 1; /* internal buffer count needed by firmware is 1 */
 	case BUF_DPB:
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.h b/drivers/media/platform/qcom/iris/iris_vpu_buffer.h
index 62af6ea6ba1f..2272f0c21683 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.h
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.h
@@ -13,6 +13,10 @@ struct iris_inst;
 #define DMA_ALIGNMENT			256
 
 #define NUM_HW_PIC_BUF			32
+#define LCU_MAX_SIZE_PELS 64
+#define LCU_MIN_SIZE_PELS 16
+#define HDR10_HIST_EXTRADATA_SIZE (4 * 1024)
+
 #define SIZE_HW_PIC(size_per_buf)	(NUM_HW_PIC_BUF * (size_per_buf))
 
 #define MAX_TILE_COLUMNS		32
@@ -28,11 +32,47 @@ struct iris_inst;
 #define SIZE_SLIST_BUF_H264		512
 #define H264_DISPLAY_BUF_SIZE		3328
 #define H264_NUM_FRM_INFO		66
-
-#define SIZE_SEI_USERDATA		4096
-
+#define H265_NUM_TILE_COL 32
+#define H265_NUM_TILE_ROW 12
+#define H265_NUM_TILE (H265_NUM_TILE_ROW * H265_NUM_TILE_COL + 1)
+#define SIZE_H265D_BSE_CMD_PER_BUF (16 * sizeof(u32))
+
+#define NUM_SLIST_BUF_H265 (80 + 20)
+#define SIZE_SLIST_BUF_H265 (BIT(10))
+#define H265_DISPLAY_BUF_SIZE (3072)
+#define H265_NUM_FRM_INFO (48)
+
+#define VP9_NUM_FRAME_INFO_BUF 32
+#define VP9_NUM_PROBABILITY_TABLE_BUF (VP9_NUM_FRAME_INFO_BUF + 4)
+#define VP9_PROB_TABLE_SIZE (3840)
+#define VP9_FRAME_INFO_BUF_SIZE (6144)
+#define BUFFER_ALIGNMENT_32_BYTES 32
+#define CCE_TILE_OFFSET_SIZE ALIGN(32 * 4 * 4, BUFFER_ALIGNMENT_32_BYTES)
+#define MAX_SUPERFRAME_HEADER_LEN (34)
+#define MAX_FE_NBR_CTRL_LCU64_LINE_BUFFER_SIZE 64
+#define MAX_FE_NBR_CTRL_LCU32_LINE_BUFFER_SIZE 64
+#define MAX_FE_NBR_CTRL_LCU16_LINE_BUFFER_SIZE 64
+#define MAX_SE_NBR_CTRL_LCU16_LINE_BUFFER_SIZE (128 / 8)
+#define MAX_SE_NBR_CTRL_LCU32_LINE_BUFFER_SIZE (128 / 8)
+#define VP9_UDC_HEADER_BUF_SIZE	(3 * 128)
+
+#define SIZE_SEI_USERDATA			4096
+#define SIZE_DOLBY_RPU_METADATA (41 * 1024)
 #define H264_CABAC_HDR_RATIO_HD_TOT	1
 #define H264_CABAC_RES_RATIO_HD_TOT	3
+#define H265D_MAX_SLICE	1200
+#define SIZE_H265D_HW_PIC_T SIZE_H264D_HW_PIC_T
+#define H265_CABAC_HDR_RATIO_HD_TOT 2
+#define H265_CABAC_RES_RATIO_HD_TOT 2
+#define SIZE_H265D_VPP_CMD_PER_BUF (256)
+
+#define VPX_DECODER_FRAME_CONCURENCY_LVL (2)
+#define VPX_DECODER_FRAME_BIN_HDR_BUDGET 1
+#define VPX_DECODER_FRAME_BIN_RES_BUDGET 3
+#define VPX_DECODER_FRAME_BIN_DENOMINATOR 2
+
+#define VPX_DECODER_FRAME_BIN_RES_BUDGET_RATIO (3 / 2)
+
 #define SIZE_H264D_HW_PIC_T		(BIT(11))
 
 #define MAX_FE_NBR_CTRL_LCU64_LINE_BUFFER_SIZE	64
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 05/12] media: iris: Skip destroying internal buffer if not dequeued
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (3 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 04/12] media: iris: Add internal buffer calculation " Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-05 20:44   ` Dmitry Baryshkov
  2025-03-05 10:43 ` [RFC PATCH 06/12] media: iris: Update CAPTURE format info based on OUTPUT format Dikshita Agarwal
                   ` (7 subsequent siblings)
  12 siblings, 1 reply; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Firmware might hold the DPB buffers for reference in case of sequence
change, so skip destroying buffers for which QUEUED flag is not removed.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_buffer.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
index 8c9d5b7fe75c..305b630ca269 100644
--- a/drivers/media/platform/qcom/iris/iris_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_buffer.c
@@ -399,6 +399,13 @@ int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane)
 	for (i = 0; i < len; i++) {
 		buffers = &inst->buffers[internal_buf_type[i]];
 		list_for_each_entry_safe(buf, next, &buffers->list, list) {
+			/*
+			 * skip destroying internal(DPB) buffer if firmware
+			 * did not return it.
+			 */
+			if (buf->attr & BUF_ATTR_QUEUED)
+				continue;
+
 			ret = iris_destroy_internal_buffer(inst, buf);
 			if (ret)
 				return ret;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 06/12] media: iris: Update CAPTURE format info based on OUTPUT format
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (4 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 05/12] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-05 20:45   ` Dmitry Baryshkov
  2025-03-05 10:43 ` [RFC PATCH 07/12] media: iris: Add handling for corrupt and drop frames Dikshita Agarwal
                   ` (6 subsequent siblings)
  12 siblings, 1 reply; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Update the width, height and buffer size of CAPTURE based on the
resolution set to OUTPUT via VIDIOC_S_FMT. This is required to set the
updated capture resolution to firmware when S_FMT is called only for
OUTPUT.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_vdec.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
index cdcfe71f5b96..16ae83948076 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -228,6 +228,11 @@ int iris_vdec_s_fmt(struct iris_inst *inst, struct v4l2_format *f)
 		output_fmt->fmt.pix_mp.ycbcr_enc = f->fmt.pix_mp.ycbcr_enc;
 		output_fmt->fmt.pix_mp.quantization = f->fmt.pix_mp.quantization;
 
+		/* Update capture format based on new ip w/h */
+		output_fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, 128);
+		output_fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, 32);
+		inst->buffers[BUF_OUTPUT].size = iris_get_buffer_size(inst, BUF_OUTPUT);
+
 		inst->crop.left = 0;
 		inst->crop.top = 0;
 		inst->crop.width = f->fmt.pix_mp.width;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 07/12] media: iris: Add handling for corrupt and drop frames
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (5 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 06/12] media: iris: Update CAPTURE format info based on OUTPUT format Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-06  1:12   ` Bryan O'Donoghue
  2025-03-05 10:43 ` [RFC PATCH 08/12] media: iris: Avoid updating frame size to firmware during reconfig Dikshita Agarwal
                   ` (5 subsequent siblings)
  12 siblings, 1 reply; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Firmware attach DATACORRUPT/DROP buffer flags for the frames which
needs to be dropped, handle it by setting VB2_BUF_STATE_ERROR for these
buffers before calling buf_done.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_buffer.c        | 11 ++++++++---
 .../media/platform/qcom/iris/iris_hfi_gen1_defines.h  |  2 ++
 .../media/platform/qcom/iris/iris_hfi_gen1_response.c |  6 ++++++
 3 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
index 305b630ca269..e5180340383b 100644
--- a/drivers/media/platform/qcom/iris/iris_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_buffer.c
@@ -603,10 +603,13 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
 
 	vb2 = &vbuf->vb2_buf;
 
-	if (buf->flags & V4L2_BUF_FLAG_ERROR)
+	if (buf->flags & V4L2_BUF_FLAG_ERROR) {
 		state = VB2_BUF_STATE_ERROR;
-	else
-		state = VB2_BUF_STATE_DONE;
+		vb2_set_plane_payload(vb2, 0, 0);
+		vb2->timestamp = 0;
+		v4l2_m2m_buf_done(vbuf, state);
+		return 0;
+	}
 
 	vbuf->flags |= buf->flags;
 
@@ -626,6 +629,8 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
 			v4l2_m2m_mark_stopped(m2m_ctx);
 		}
 	}
+
+	state = VB2_BUF_STATE_DONE;
 	vb2->timestamp = buf->timestamp;
 	v4l2_m2m_buf_done(vbuf, state);
 
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 3bea643068f9..bfeeea643300 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
@@ -119,6 +119,8 @@
 #define HFI_FRAME_NOTCODED				0x7f002000
 #define HFI_FRAME_YUV					0x7f004000
 #define HFI_UNUSED_PICT					0x10000000
+#define HFI_BUFFERFLAG_DATACORRUPT			0x00000008
+#define HFI_BUFFERFLAG_DROP_FRAME			0x20000000
 
 struct hfi_pkt_hdr {
 	u32 size;
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
index b72d503dd740..91d95eed68aa 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
@@ -481,6 +481,12 @@ static void iris_hfi_gen1_session_ftb_done(struct iris_inst *inst, void *packet)
 	buf->attr |= BUF_ATTR_DEQUEUED;
 	buf->attr |= BUF_ATTR_BUFFER_DONE;
 
+	if (hfi_flags & HFI_BUFFERFLAG_DATACORRUPT)
+		flags |= V4L2_BUF_FLAG_ERROR;
+
+	if (hfi_flags & HFI_BUFFERFLAG_DROP_FRAME)
+		flags |= V4L2_BUF_FLAG_ERROR;
+
 	buf->flags |= flags;
 
 	iris_vb2_buffer_done(inst, buf);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 08/12] media: iris: Avoid updating frame size to firmware during reconfig
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (6 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 07/12] media: iris: Add handling for corrupt and drop frames Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-06  1:26   ` Bryan O'Donoghue
  2025-03-05 10:43 ` [RFC PATCH 09/12] media: iris: Avoid sending LAST flag multiple times Dikshita Agarwal
                   ` (4 subsequent siblings)
  12 siblings, 1 reply; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

During the reconfig, firmware sends the resolution aligned by 8 byte,
if driver set the same resoluton to firmware, it will be aligned to 16
byte causing another sequence change which would be incorrect.
Fix this by not setting the updated resolution to firmware during
reconfig.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 .../platform/qcom/iris/iris_hfi_gen1_command.c    | 15 ++++++++-------
 .../platform/qcom/iris/iris_hfi_gen1_response.c   |  1 +
 drivers/media/platform/qcom/iris/iris_instance.h  |  2 ++
 drivers/media/platform/qcom/iris/iris_vdec.c      |  4 ++++
 4 files changed, 15 insertions(+), 7 deletions(-)

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 a160ae915886..d5e81049d37e 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -562,14 +562,15 @@ static int iris_hfi_gen1_set_resolution(struct iris_inst *inst)
 	struct hfi_framesize fs;
 	int ret;
 
-	fs.buffer_type = HFI_BUFFER_INPUT;
-	fs.width = inst->fmt_src->fmt.pix_mp.width;
-	fs.height = inst->fmt_src->fmt.pix_mp.height;
-
-	ret = hfi_gen1_set_property(inst, ptype, &fs, sizeof(fs));
-	if (ret)
-		return ret;
+	if (!inst->in_reconfig) {
+		fs.buffer_type = HFI_BUFFER_INPUT;
+		fs.width = inst->fmt_src->fmt.pix_mp.width;
+		fs.height = inst->fmt_src->fmt.pix_mp.height;
 
+		ret = hfi_gen1_set_property(inst, ptype, &fs, sizeof(fs));
+		if (ret)
+			return ret;
+	}
 	fs.buffer_type = HFI_BUFFER_OUTPUT2;
 	fs.width = inst->fmt_dst->fmt.pix_mp.width;
 	fs.height = inst->fmt_dst->fmt.pix_mp.height;
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
index 91d95eed68aa..6576496fdbdf 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
@@ -155,6 +155,7 @@ static void iris_hfi_gen1_read_changed_params(struct iris_inst *inst,
 		inst->crop.height = event.height;
 	}
 
+	inst->in_reconfig = true;
 	inst->fw_min_count = event.buf_count;
 	inst->buffers[BUF_OUTPUT].min_count = iris_vpu_buf_count(inst, BUF_OUTPUT);
 	inst->buffers[BUF_OUTPUT].size = pixmp_op->plane_fmt[0].sizeimage;
diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
index d8f076936c2b..625325f7f9b0 100644
--- a/drivers/media/platform/qcom/iris/iris_instance.h
+++ b/drivers/media/platform/qcom/iris/iris_instance.h
@@ -43,6 +43,7 @@
  * @tss: timestamp metadata
  * @metadata_idx: index for metadata buffer
  * @codec: codec type
+ * @in_reconfig: a flag raised by decoder when the stream resolution changes
  */
 
 struct iris_inst {
@@ -74,6 +75,7 @@ struct iris_inst {
 	struct iris_ts_metadata		tss[VIDEO_MAX_FRAME];
 	u32				metadata_idx;
 	u32				codec;
+	bool				in_reconfig;
 };
 
 #endif
diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
index 16ae83948076..d5127d88d103 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -453,6 +453,8 @@ static int iris_vdec_process_streamon_input(struct iris_inst *inst)
 	if (ret)
 		return ret;
 
+	inst->in_reconfig = false;
+
 	return iris_inst_change_sub_state(inst, 0, set_sub_state);
 }
 
@@ -544,6 +546,8 @@ static int iris_vdec_process_streamon_output(struct iris_inst *inst)
 	if (ret)
 		return ret;
 
+	inst->in_reconfig = false;
+
 	return iris_inst_change_sub_state(inst, clear_sub_state, 0);
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 09/12] media: iris: Avoid sending LAST flag multiple times
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (7 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 08/12] media: iris: Avoid updating frame size to firmware during reconfig Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-05 10:43 ` [RFC PATCH 10/12] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length Dikshita Agarwal
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Add a flag to check if LAST flag is sent by driver, to make sure  it is
send only once for a sequence change.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_buffer.c   | 1 +
 drivers/media/platform/qcom/iris/iris_instance.h | 2 ++
 drivers/media/platform/qcom/iris/iris_vb2.c      | 3 ++-
 drivers/media/platform/qcom/iris/iris_vdec.c     | 2 ++
 4 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
index e5180340383b..9e5ef7cb803a 100644
--- a/drivers/media/platform/qcom/iris/iris_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_buffer.c
@@ -628,6 +628,7 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
 			v4l2_event_queue_fh(&inst->fh, &ev);
 			v4l2_m2m_mark_stopped(m2m_ctx);
 		}
+		inst->last_buffer_dequeued = true;
 	}
 
 	state = VB2_BUF_STATE_DONE;
diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
index 625325f7f9b0..43239e7c678f 100644
--- a/drivers/media/platform/qcom/iris/iris_instance.h
+++ b/drivers/media/platform/qcom/iris/iris_instance.h
@@ -44,6 +44,7 @@
  * @metadata_idx: index for metadata buffer
  * @codec: codec type
  * @in_reconfig: a flag raised by decoder when the stream resolution changes
+ * @last_buffer_dequeued: a flag to indicate that last buffer is sent by driver
  */
 
 struct iris_inst {
@@ -76,6 +77,7 @@ struct iris_inst {
 	u32				metadata_idx;
 	u32				codec;
 	bool				in_reconfig;
+	bool				last_buffer_dequeued;
 };
 
 #endif
diff --git a/drivers/media/platform/qcom/iris/iris_vb2.c b/drivers/media/platform/qcom/iris/iris_vb2.c
index cdf11feb590b..23473cbd0b2e 100644
--- a/drivers/media/platform/qcom/iris/iris_vb2.c
+++ b/drivers/media/platform/qcom/iris/iris_vb2.c
@@ -304,7 +304,7 @@ void iris_vb2_buf_queue(struct vb2_buffer *vb2)
 		goto exit;
 	}
 
-	if (V4L2_TYPE_IS_CAPTURE(vb2->vb2_queue->type)) {
+	if (!inst->last_buffer_dequeued && V4L2_TYPE_IS_CAPTURE(vb2->vb2_queue->type)) {
 		if ((inst->sub_state & IRIS_INST_SUB_DRC &&
 		     inst->sub_state & IRIS_INST_SUB_DRC_LAST) ||
 		    (inst->sub_state & IRIS_INST_SUB_DRAIN &&
@@ -318,6 +318,7 @@ void iris_vb2_buf_queue(struct vb2_buffer *vb2)
 				v4l2_event_queue_fh(&inst->fh, &eos);
 				v4l2_m2m_mark_stopped(m2m_ctx);
 			}
+			inst->last_buffer_dequeued = true;
 			goto exit;
 		}
 	}
diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
index d5127d88d103..0c9997cc7445 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -454,6 +454,7 @@ static int iris_vdec_process_streamon_input(struct iris_inst *inst)
 		return ret;
 
 	inst->in_reconfig = false;
+	inst->last_buffer_dequeued = false;
 
 	return iris_inst_change_sub_state(inst, 0, set_sub_state);
 }
@@ -547,6 +548,7 @@ static int iris_vdec_process_streamon_output(struct iris_inst *inst)
 		return ret;
 
 	inst->in_reconfig = false;
+	inst->last_buffer_dequeued = false;
 
 	return iris_inst_change_sub_state(inst, clear_sub_state, 0);
 }
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 10/12] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (8 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 09/12] media: iris: Avoid sending LAST flag multiple times Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-05 10:43 ` [RFC PATCH 11/12] media: iris: Fix handling of eos buffer during drain Dikshita Agarwal
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Firmware sends buffers with 0 filled length which needs to be dropped,
to achieve the same, add V4L2_BUF_FLAG_ERROR to such buffers.
Also make sure:
- These 0 length buffers are not returned as result of flush.
- Its not a buffer with LAST flag enabled which will also have 0 filled
  length.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c | 6 ++++++
 1 file changed, 6 insertions(+)

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 6846311a26c3..bb0ecb79fc24 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -377,6 +377,12 @@ static int iris_hfi_gen2_handle_output_buffer(struct iris_inst *inst,
 
 	buf->flags = iris_hfi_gen2_get_driver_buffer_flags(inst, hfi_buffer->flags);
 
+	if (!buf->data_size && inst->state == IRIS_INST_STREAMING &&
+	    !(hfi_buffer->flags & HFI_BUF_FW_FLAG_LAST) &&
+	    !(inst->sub_state & IRIS_INST_SUB_DRC)) {
+		buf->flags |= V4L2_BUF_FLAG_ERROR;
+	}
+
 	return 0;
 }
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 11/12] media: iris: Fix handling of eos buffer during drain
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (9 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 10/12] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-05 10:43 ` [RFC PATCH 12/12] media: iris: Add handling for no show frames Dikshita Agarwal
  2025-03-05 14:22 ` [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder neil.armstrong
  12 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

To handle drain, a NULL EOS buffer is queued to firmware, for which
the firmware doesn't return a response. For VP9 codec, firmware has a
check to compare etb and ebd count, and asserts if it doesn't match.
Fix this by queuing a non NULL buffer to the firmware in drain.
Also, make sure to avoid calling vb2_buffer_done for the same buffer
when response is received from the firmware.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c  | 1 +
 drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c | 4 ++++
 2 files changed, 5 insertions(+)

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 d5e81049d37e..cb3519cf6542 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -402,6 +402,7 @@ static int iris_hfi_gen1_session_drain(struct iris_inst *inst, u32 plane)
 	ip_pkt.shdr.hdr.pkt_type = HFI_CMD_SESSION_EMPTY_BUFFER;
 	ip_pkt.shdr.session_id = inst->session_id;
 	ip_pkt.flags = HFI_BUFFERFLAG_EOS;
+	ip_pkt.packet_buffer = 0xdeadb000;
 
 	return iris_hfi_queue_cmd_write(inst->core, &ip_pkt, ip_pkt.shdr.hdr.size);
 }
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
index 6576496fdbdf..f7792ecaeaf5 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
@@ -349,6 +349,10 @@ static void iris_hfi_gen1_session_etb_done(struct iris_inst *inst, void *packet)
 	struct iris_buffer *buf = NULL;
 	bool found = false;
 
+	/* EOS buffer sent via drain won't be in v4l2 buffer list */
+	if (pkt->packet_buffer == 0xdeadb000)
+		return;
+
 	v4l2_m2m_for_each_src_buf_safe(m2m_ctx, m2m_buffer, n) {
 		buf = to_iris_buffer(&m2m_buffer->vb);
 		if (buf->index == pkt->input_tag) {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* [RFC PATCH 12/12] media: iris: Add handling for no show frames
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (10 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 11/12] media: iris: Fix handling of eos buffer during drain Dikshita Agarwal
@ 2025-03-05 10:43 ` Dikshita Agarwal
  2025-03-05 14:22 ` [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder neil.armstrong
  12 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-05 10:43 UTC (permalink / raw)
  To: quic_vgarodia, quic_abhinavk, mchehab, quic_dikshita
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Firmware sends the picture type as NO_SHOW for frames which are not
supposed to be displayed, add handling for the same in driver to drop
them.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h  | 1 +
 drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c | 7 +++----
 2 files changed, 4 insertions(+), 4 deletions(-)

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 48c507a1ec27..5f13dc11bea5 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -117,6 +117,7 @@ enum hfi_picture_type {
 	HFI_PICTURE_I				= 0x00000008,
 	HFI_PICTURE_CRA				= 0x00000010,
 	HFI_PICTURE_BLA				= 0x00000020,
+	HFI_PICTURE_NOSHOW			= 0x00000040,
 };
 
 enum hfi_buffer_type {
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 bb0ecb79fc24..406b760712e7 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -91,7 +91,9 @@ static int iris_hfi_gen2_get_driver_buffer_flags(struct iris_inst *inst, u32 hfi
 	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
 	u32 driver_flags = 0;
 
-	if (inst_hfi_gen2->hfi_frame_info.picture_type & keyframe)
+	if (inst_hfi_gen2->hfi_frame_info.picture_type & HFI_PICTURE_NOSHOW)
+		driver_flags |= V4L2_BUF_FLAG_ERROR;
+	else if (inst_hfi_gen2->hfi_frame_info.picture_type & keyframe)
 		driver_flags |= V4L2_BUF_FLAG_KEYFRAME;
 	else if (inst_hfi_gen2->hfi_frame_info.picture_type & HFI_PICTURE_P)
 		driver_flags |= V4L2_BUF_FLAG_PFRAME;
@@ -657,9 +659,6 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
 {
 	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
 
-	if (pkt->port != HFI_PORT_BITSTREAM)
-		return 0;
-
 	if (pkt->flags & HFI_FW_FLAGS_INFORMATION)
 		return 0;
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 03/12] media: iris: Set mandatory properties for HEVC and VP9 decoders.
  2025-03-05 10:43 ` [RFC PATCH 03/12] media: iris: Set mandatory properties " Dikshita Agarwal
@ 2025-03-05 14:00   ` neil.armstrong
  2025-03-06 12:10     ` Dikshita Agarwal
  2025-03-06  0:52   ` Bryan O'Donoghue
  1 sibling, 1 reply; 32+ messages in thread
From: neil.armstrong @ 2025-03-05 14:00 UTC (permalink / raw)
  To: Dikshita Agarwal, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

On 05/03/2025 11:43, Dikshita Agarwal wrote:
> Subscribe and set mandatory properties to the firmware for HEVC and VP9
> decoders.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>   .../platform/qcom/iris/iris_hfi_common.h      |  1 +
>   .../qcom/iris/iris_hfi_gen1_command.c         |  4 +-
>   .../qcom/iris/iris_hfi_gen2_command.c         | 83 +++++++++++++++++--
>   .../qcom/iris/iris_hfi_gen2_response.c        |  7 ++
>   .../platform/qcom/iris/iris_platform_common.h | 16 +++-
>   .../platform/qcom/iris/iris_platform_sm8250.c |  4 +-
>   .../platform/qcom/iris/iris_platform_sm8550.c | 61 ++++++++++++--
>   7 files changed, 151 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h b/drivers/media/platform/qcom/iris/iris_hfi_common.h
> index b2c541367fc6..9e6aadb83783 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h
> @@ -140,6 +140,7 @@ struct hfi_subscription_params {
>   	u32	color_info;
>   	u32	profile;
>   	u32	level;
> +	u32	tier;
>   };
>   
>   u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);
> 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 1e774b058ab9..a160ae915886 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> @@ -784,8 +784,8 @@ static int iris_hfi_gen1_session_set_config_params(struct iris_inst *inst, u32 p
>   			iris_hfi_gen1_set_bufsize},
>   	};
>   
> -	config_params = core->iris_platform_data->input_config_params;
> -	config_params_size = core->iris_platform_data->input_config_params_size;
> +	config_params = core->iris_platform_data->input_config_params_default;
> +	config_params_size = core->iris_platform_data->input_config_params_default_size;
>   
>   	if (V4L2_TYPE_IS_OUTPUT(plane)) {
>   		for (i = 0; i < config_params_size; i++) {
> 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 a3ebcda9a2ba..5b4c89184297 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -192,7 +192,7 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst)
>   						  sizeof(u64));
>   }
>   
> -static int iris_hfi_gen2_set_bit_dpeth(struct iris_inst *inst)
> +static int iris_hfi_gen2_set_bit_depth(struct iris_inst *inst)

Please move typo fixes to separate patch with Fixes tag.

Neil

>   {
>   	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
>   	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
> @@ -407,6 +407,23 @@ static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst)
>   						  sizeof(u64));
>   }
>   
> +static int iris_hfi_gen2_set_tier(struct iris_inst *inst)
> +{
> +	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
> +	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
> +	u32 tier = inst->fw_caps[TIER].value;
> +
> +	inst_hfi_gen2->src_subcr_params.tier = tier;
> +
> +	return iris_hfi_gen2_session_set_property(inst,
> +						  HFI_PROP_TIER,
> +						  HFI_HOST_FLAGS_NONE,
> +						  port,
> +						  HFI_PAYLOAD_U32_ENUM,
> +						  &tier,
> +						  sizeof(u32));
> +}
> +
>   static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 plane)
>   {
>   	struct iris_core *core = inst->core;
> @@ -418,7 +435,7 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
>   		{HFI_PROP_BITSTREAM_RESOLUTION,       iris_hfi_gen2_set_bitstream_resolution   },
>   		{HFI_PROP_CROP_OFFSETS,               iris_hfi_gen2_set_crop_offsets           },
>   		{HFI_PROP_CODED_FRAMES,               iris_hfi_gen2_set_coded_frames           },
> -		{HFI_PROP_LUMA_CHROMA_BIT_DEPTH,      iris_hfi_gen2_set_bit_dpeth              },
> +		{HFI_PROP_LUMA_CHROMA_BIT_DEPTH,      iris_hfi_gen2_set_bit_depth              },
>   		{HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT, iris_hfi_gen2_set_min_output_count       },
>   		{HFI_PROP_PIC_ORDER_CNT_TYPE,         iris_hfi_gen2_set_picture_order_count    },
>   		{HFI_PROP_SIGNAL_COLOR_INFO,          iris_hfi_gen2_set_colorspace             },
> @@ -426,11 +443,25 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
>   		{HFI_PROP_LEVEL,                      iris_hfi_gen2_set_level                  },
>   		{HFI_PROP_COLOR_FORMAT,               iris_hfi_gen2_set_colorformat            },
>   		{HFI_PROP_LINEAR_STRIDE_SCANLINE,     iris_hfi_gen2_set_linear_stride_scanline },
> +		{HFI_PROP_TIER,                       iris_hfi_gen2_set_tier                   },
>   	};
>   
>   	if (V4L2_TYPE_IS_OUTPUT(plane)) {
> -		config_params = core->iris_platform_data->input_config_params;
> -		config_params_size = core->iris_platform_data->input_config_params_size;
> +		if (inst->codec == V4L2_PIX_FMT_H264) {
> +			config_params = core->iris_platform_data->input_config_params_default;
> +			config_params_size =
> +				core->iris_platform_data->input_config_params_default_size;
> +		} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
> +			config_params = core->iris_platform_data->input_config_params_hevc;
> +			config_params_size =
> +				core->iris_platform_data->input_config_params_hevc_size;
> +		} else if (inst->codec == V4L2_PIX_FMT_VP9) {
> +			config_params = core->iris_platform_data->input_config_params_vp9;
> +			config_params_size =
> +				core->iris_platform_data->input_config_params_vp9_size;
> +		} else {
> +			return -EINVAL;
> +		}
>   	} else {
>   		config_params = core->iris_platform_data->output_config_params;
>   		config_params_size = core->iris_platform_data->output_config_params_size;
> @@ -600,8 +631,21 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>   		return 0;
>   	}
>   
> -	change_param = core->iris_platform_data->input_config_params;
> -	change_param_size = core->iris_platform_data->input_config_params_size;
> +	if (inst->codec == V4L2_PIX_FMT_H264) {
> +		change_param = core->iris_platform_data->input_config_params_default;
> +		change_param_size =
> +			core->iris_platform_data->input_config_params_default_size;
> +	} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
> +		change_param = core->iris_platform_data->input_config_params_hevc;
> +		change_param_size =
> +			core->iris_platform_data->input_config_params_hevc_size;
> +	} else if (inst->codec == V4L2_PIX_FMT_VP9) {
> +		change_param = core->iris_platform_data->input_config_params_vp9;
> +		change_param_size =
> +			core->iris_platform_data->input_config_params_vp9_size;
> +	} else {
> +		return -EINVAL;
> +	}
>   
>   	payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
>   
> @@ -648,6 +692,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>   				payload_size = sizeof(u32);
>   				payload_type = HFI_PAYLOAD_U32;
>   				break;
> +			case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
> +				payload[0] = subsc_params.bit_depth;
> +				payload_size = sizeof(u32);
> +				payload_type = HFI_PAYLOAD_U32;
> +				break;
>   			case HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT:
>   				payload[0] = subsc_params.fw_min_count;
>   				payload_size = sizeof(u32);
> @@ -673,6 +722,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>   				payload_size = sizeof(u32);
>   				payload_type = HFI_PAYLOAD_U32;
>   				break;
> +			case HFI_PROP_TIER:
> +				payload[0] = subsc_params.tier;
> +				payload_size = sizeof(u32);
> +				payload_type = HFI_PAYLOAD_U32;
> +				break;
>   			default:
>   				prop_type = 0;
>   				ret = -EINVAL;
> @@ -709,8 +763,21 @@ static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
>   		subscribe_prop_size = core->iris_platform_data->dec_input_prop_size;
>   		subcribe_prop = core->iris_platform_data->dec_input_prop;
>   	} else {
> -		subscribe_prop_size = core->iris_platform_data->dec_output_prop_size;
> -		subcribe_prop = core->iris_platform_data->dec_output_prop;
> +		if (inst->codec == V4L2_PIX_FMT_H264) {
> +			subcribe_prop = core->iris_platform_data->dec_output_prop_avc;
> +			subscribe_prop_size =
> +				core->iris_platform_data->dec_output_prop_avc_size;
> +		} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
> +			subcribe_prop = core->iris_platform_data->dec_output_prop_hevc;
> +			subscribe_prop_size =
> +				core->iris_platform_data->dec_output_prop_hevc_size;
> +		} else if (inst->codec == V4L2_PIX_FMT_VP9) {
> +			subcribe_prop = core->iris_platform_data->dec_output_prop_vp9;
> +			subscribe_prop_size =
> +				core->iris_platform_data->dec_output_prop_vp9_size;
> +		} else {
> +			return -EINVAL;
> +		}
>   	}
>   
>   	for (i = 0; i < subscribe_prop_size; i++)
> 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 809bf0f238bd..6846311a26c3 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> @@ -580,6 +580,7 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
>   	}
>   
>   	inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
> +	inst->fw_caps[TIER].value = subsc_params.tier;
>   
>   	if (subsc_params.bit_depth != BIT_DEPTH_8 ||
>   	    !(subsc_params.coded_frames & HFI_BITMASK_FRAME_MBS_ONLY_FLAG)) {
> @@ -664,6 +665,9 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
>   		inst_hfi_gen2->src_subcr_params.crop_offsets[0] = pkt->payload[0];
>   		inst_hfi_gen2->src_subcr_params.crop_offsets[1] = pkt->payload[1];
>   		break;
> +	case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
> +		inst_hfi_gen2->src_subcr_params.bit_depth = pkt->payload[0];
> +		break;
>   	case HFI_PROP_CODED_FRAMES:
>   		inst_hfi_gen2->src_subcr_params.coded_frames = pkt->payload[0];
>   		break;
> @@ -682,6 +686,9 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
>   	case HFI_PROP_LEVEL:
>   		inst_hfi_gen2->src_subcr_params.level = pkt->payload[0];
>   		break;
> +	case HFI_PROP_TIER:
> +		inst_hfi_gen2->src_subcr_params.tier = pkt->payload[0];
> +		break;
>   	case HFI_PROP_PICTURE_TYPE:
>   		inst_hfi_gen2->hfi_frame_info.picture_type = pkt->payload[0];
>   		break;
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index 67204cddd44a..433ce9b00c68 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -174,14 +174,22 @@ struct iris_platform_data {
>   	u32 num_vpp_pipe;
>   	u32 max_session_count;
>   	u32 max_core_mbpf;
> -	const u32 *input_config_params;
> -	unsigned int input_config_params_size;
> +	const u32 *input_config_params_default;
> +	unsigned int input_config_params_default_size;
> +	const u32 *input_config_params_hevc;
> +	unsigned int input_config_params_hevc_size;
> +	const u32 *input_config_params_vp9;
> +	unsigned int input_config_params_vp9_size;
>   	const u32 *output_config_params;
>   	unsigned int output_config_params_size;
>   	const u32 *dec_input_prop;
>   	unsigned int dec_input_prop_size;
> -	const u32 *dec_output_prop;
> -	unsigned int dec_output_prop_size;
> +	const u32 *dec_output_prop_avc;
> +	unsigned int dec_output_prop_avc_size;
> +	const u32 *dec_output_prop_hevc;
> +	unsigned int dec_output_prop_hevc_size;
> +	const u32 *dec_output_prop_vp9;
> +	unsigned int dec_output_prop_vp9_size;
>   	const u32 *dec_ip_int_buf_tbl;
>   	unsigned int dec_ip_int_buf_tbl_size;
>   	const u32 *dec_op_int_buf_tbl;
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
> index 5c86fd7b7b6f..5f74e57f04fc 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
> @@ -137,9 +137,9 @@ struct iris_platform_data sm8250_data = {
>   	.num_vpp_pipe = 4,
>   	.max_session_count = 16,
>   	.max_core_mbpf = (8192 * 4352) / 256,
> -	.input_config_params =
> +	.input_config_params_default =
>   		sm8250_vdec_input_config_param_default,
> -	.input_config_params_size =
> +	.input_config_params_default_size =
>   		ARRAY_SIZE(sm8250_vdec_input_config_param_default),
>   
>   	.dec_ip_int_buf_tbl = sm8250_dec_ip_int_buf_tbl,
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> index 29bc50785da5..779c71885f51 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> @@ -254,9 +254,10 @@ static struct tz_cp_config tz_cp_config_sm8550 = {
>   	.cp_nonpixel_size = 0x24800000,
>   };
>   
> -static const u32 sm8550_vdec_input_config_params[] = {
> +static const u32 sm8550_vdec_input_config_params_default[] = {
>   	HFI_PROP_BITSTREAM_RESOLUTION,
>   	HFI_PROP_CROP_OFFSETS,
> +	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
>   	HFI_PROP_CODED_FRAMES,
>   	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>   	HFI_PROP_PIC_ORDER_CNT_TYPE,
> @@ -265,6 +266,26 @@ static const u32 sm8550_vdec_input_config_params[] = {
>   	HFI_PROP_SIGNAL_COLOR_INFO,
>   };
>   
> +static const u32 sm8550_vdec_input_config_param_hevc[] = {
> +	HFI_PROP_BITSTREAM_RESOLUTION,
> +	HFI_PROP_CROP_OFFSETS,
> +	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> +	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
> +	HFI_PROP_PROFILE,
> +	HFI_PROP_LEVEL,
> +	HFI_PROP_TIER,
> +	HFI_PROP_SIGNAL_COLOR_INFO,
> +};
> +
> +static const u32 sm8550_vdec_input_config_param_vp9[] = {
> +	HFI_PROP_BITSTREAM_RESOLUTION,
> +	HFI_PROP_CROP_OFFSETS,
> +	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> +	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
> +	HFI_PROP_PROFILE,
> +	HFI_PROP_LEVEL,
> +};
> +
>   static const u32 sm8550_vdec_output_config_params[] = {
>   	HFI_PROP_COLOR_FORMAT,
>   	HFI_PROP_LINEAR_STRIDE_SCANLINE,
> @@ -274,11 +295,19 @@ static const u32 sm8550_vdec_subscribe_input_properties[] = {
>   	HFI_PROP_NO_OUTPUT,
>   };
>   
> -static const u32 sm8550_vdec_subscribe_output_properties[] = {
> +static const u32 sm8550_vdec_subscribe_output_properties_avc[] = {
>   	HFI_PROP_PICTURE_TYPE,
>   	HFI_PROP_CABAC_SESSION,
>   };
>   
> +static const u32 sm8550_vdec_subscribe_output_properties_hevc[] = {
> +	HFI_PROP_PICTURE_TYPE,
> +};
> +
> +static const u32 sm8550_vdec_subscribe_output_properties_vp9[] = {
> +	HFI_PROP_PICTURE_TYPE,
> +};
> +
>   static const u32 sm8550_dec_ip_int_buf_tbl[] = {
>   	BUF_BIN,
>   	BUF_COMV,
> @@ -322,19 +351,33 @@ struct iris_platform_data sm8550_data = {
>   	.num_vpp_pipe = 4,
>   	.max_session_count = 16,
>   	.max_core_mbpf = ((8192 * 4352) / 256) * 2,
> -	.input_config_params =
> -		sm8550_vdec_input_config_params,
> -	.input_config_params_size =
> -		ARRAY_SIZE(sm8550_vdec_input_config_params),
> +	.input_config_params_default =
> +		sm8550_vdec_input_config_params_default,
> +	.input_config_params_default_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_params_default),
> +	.input_config_params_hevc =
> +		sm8550_vdec_input_config_param_hevc,
> +	.input_config_params_hevc_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
> +	.input_config_params_vp9 =
> +		sm8550_vdec_input_config_param_vp9,
> +	.input_config_params_vp9_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
>   	.output_config_params =
>   		sm8550_vdec_output_config_params,
>   	.output_config_params_size =
>   		ARRAY_SIZE(sm8550_vdec_output_config_params),
>   	.dec_input_prop = sm8550_vdec_subscribe_input_properties,
>   	.dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
> -	.dec_output_prop = sm8550_vdec_subscribe_output_properties,
> -	.dec_output_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
> -
> +	.dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
> +	.dec_output_prop_avc_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
> +	.dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
> +	.dec_output_prop_hevc_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
> +	.dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
> +	.dec_output_prop_vp9_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
>   	.dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
>   	.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
>   	.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder
  2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (11 preceding siblings ...)
  2025-03-05 10:43 ` [RFC PATCH 12/12] media: iris: Add handling for no show frames Dikshita Agarwal
@ 2025-03-05 14:22 ` neil.armstrong
  2025-03-06 12:34   ` Dikshita Agarwal
  12 siblings, 1 reply; 32+ messages in thread
From: neil.armstrong @ 2025-03-05 14:22 UTC (permalink / raw)
  To: Dikshita Agarwal, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

Hi,

On 05/03/2025 11:43, Dikshita Agarwal wrote:
> Hi all,
> 
> This patch series adds initial support for the HEVC(H.265) and VP9
> codecs in iris decoder. The objective of this work is to extend the
> decoder's capabilities to handle HEVC and VP9 codec streams,
> including necessary format handling and buffer management.
> In addition, the series also includes a set of fixes to address issues
> identified during testing of these additional codecs.
> 
> I'm sharing this series as an RFC because compliance and conformance
> testing are still in progress.
> While initial functional tests show positive results, I would
> appreciate early feedback on the design, implementation, and fixes
> before moving to a formal submission.
> 
> I plan to submit a formal patch series after completing all compliance
> checks. Meanwhile, any feedback or suggestion to improve this work are
> very welcome.
> 
> Thanks,
> Dikshita
> 
> Dikshita Agarwal (12):
>    media: iris: Add HEVC and VP9 formats for decoder
>    media: iris: Add platform capabilities for HEVC and VP9 decoders
>    media: iris: Set mandatory properties for HEVC and VP9 decoders.
>    media: iris: Add internal buffer calculation for HEVC and VP9 decoders
>    media: iris: Skip destroying internal buffer if not dequeued
>    media: iris: Update CAPTURE format info based on OUTPUT format
>    media: iris: Add handling for corrupt and drop frames
>    media: iris: Avoid updating frame size to firmware during reconfig
>    media: iris: Avoid sending LAST flag multiple times
>    media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>    media: iris: Fix handling of eos buffer during drain
>    media: iris: Add handling for no show frames

I should be better to move patches 1, 2 & 3 at the end, after the patches
adding support for specific hecv & h265 features, and please check that
none of the patches breaks h264 at any time to keep bisectability.

Neil

Neil

> 
>   .../media/platform/qcom/iris/iris_buffer.c    |  22 +-
>   drivers/media/platform/qcom/iris/iris_ctrls.c |  28 +-
>   .../platform/qcom/iris/iris_hfi_common.h      |   1 +
>   .../qcom/iris/iris_hfi_gen1_command.c         |  38 +-
>   .../qcom/iris/iris_hfi_gen1_defines.h         |   4 +
>   .../qcom/iris/iris_hfi_gen1_response.c        |  11 +
>   .../qcom/iris/iris_hfi_gen2_command.c         | 129 +++++-
>   .../qcom/iris/iris_hfi_gen2_defines.h         |   5 +
>   .../qcom/iris/iris_hfi_gen2_response.c        |  56 ++-
>   .../media/platform/qcom/iris/iris_instance.h  |   6 +
>   .../platform/qcom/iris/iris_platform_common.h |  25 +-
>   .../platform/qcom/iris/iris_platform_sm8250.c |   4 +-
>   .../platform/qcom/iris/iris_platform_sm8550.c | 141 ++++++-
>   drivers/media/platform/qcom/iris/iris_vb2.c   |   3 +-
>   drivers/media/platform/qcom/iris/iris_vdec.c  |  80 +++-
>   drivers/media/platform/qcom/iris/iris_vdec.h  |  11 +
>   drivers/media/platform/qcom/iris/iris_vidc.c  |   3 -
>   .../platform/qcom/iris/iris_vpu_buffer.c      | 397 +++++++++++++++++-
>   .../platform/qcom/iris/iris_vpu_buffer.h      |  46 +-
>   19 files changed, 931 insertions(+), 79 deletions(-)
> 


^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 05/12] media: iris: Skip destroying internal buffer if not dequeued
  2025-03-05 10:43 ` [RFC PATCH 05/12] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
@ 2025-03-05 20:44   ` Dmitry Baryshkov
  2025-03-06 12:26     ` Dikshita Agarwal
  0 siblings, 1 reply; 32+ messages in thread
From: Dmitry Baryshkov @ 2025-03-05 20:44 UTC (permalink / raw)
  To: Dikshita Agarwal
  Cc: quic_vgarodia, quic_abhinavk, mchehab, hverkuil, linux-media,
	linux-arm-msm, linux-kernel

On Wed, Mar 05, 2025 at 04:13:28PM +0530, Dikshita Agarwal wrote:
> Firmware might hold the DPB buffers for reference in case of sequence
> change, so skip destroying buffers for which QUEUED flag is not removed.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>

Please add FIxes tag and move closer to the top.

> ---
>  drivers/media/platform/qcom/iris/iris_buffer.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
> index 8c9d5b7fe75c..305b630ca269 100644
> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
> @@ -399,6 +399,13 @@ int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane)
>  	for (i = 0; i < len; i++) {
>  		buffers = &inst->buffers[internal_buf_type[i]];
>  		list_for_each_entry_safe(buf, next, &buffers->list, list) {
> +			/*
> +			 * skip destroying internal(DPB) buffer if firmware
> +			 * did not return it.
> +			 */
> +			if (buf->attr & BUF_ATTR_QUEUED)
> +				continue;
> +
>  			ret = iris_destroy_internal_buffer(inst, buf);
>  			if (ret)
>  				return ret;
> -- 
> 2.34.1
> 

-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 06/12] media: iris: Update CAPTURE format info based on OUTPUT format
  2025-03-05 10:43 ` [RFC PATCH 06/12] media: iris: Update CAPTURE format info based on OUTPUT format Dikshita Agarwal
@ 2025-03-05 20:45   ` Dmitry Baryshkov
  2025-03-06 12:27     ` Dikshita Agarwal
  0 siblings, 1 reply; 32+ messages in thread
From: Dmitry Baryshkov @ 2025-03-05 20:45 UTC (permalink / raw)
  To: Dikshita Agarwal
  Cc: quic_vgarodia, quic_abhinavk, mchehab, hverkuil, linux-media,
	linux-arm-msm, linux-kernel

On Wed, Mar 05, 2025 at 04:13:29PM +0530, Dikshita Agarwal wrote:
> Update the width, height and buffer size of CAPTURE based on the
> resolution set to OUTPUT via VIDIOC_S_FMT. This is required to set the
> updated capture resolution to firmware when S_FMT is called only for
> OUTPUT.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>  drivers/media/platform/qcom/iris/iris_vdec.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 

This also looks like a fix, so Fixes, cc:stable, move to the top.

-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 01/12] media: iris: Add HEVC and VP9 formats for decoder
  2025-03-05 10:43 ` [RFC PATCH 01/12] media: iris: Add HEVC and VP9 formats for decoder Dikshita Agarwal
@ 2025-03-06  0:17   ` Bryan O'Donoghue
  2025-03-06 11:55     ` Dikshita Agarwal
  0 siblings, 1 reply; 32+ messages in thread
From: Bryan O'Donoghue @ 2025-03-06  0:17 UTC (permalink / raw)
  To: Dikshita Agarwal, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

On 05/03/2025 10:43, Dikshita Agarwal wrote:
> Extend the decoder driver's supported formats to include HEVC (H.265)
> and VP9. This change updates the format enumeration (VIDIOC_ENUM_FMT)
> and allows setting these formats via VIDIOC_S_FMT.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>   .../qcom/iris/iris_hfi_gen1_command.c         | 18 ++++-
>   .../qcom/iris/iris_hfi_gen1_defines.h         |  2 +
>   .../qcom/iris/iris_hfi_gen2_command.c         | 16 ++++-
>   .../qcom/iris/iris_hfi_gen2_defines.h         |  3 +
>   .../media/platform/qcom/iris/iris_instance.h  |  2 +
>   drivers/media/platform/qcom/iris/iris_vdec.c  | 69 +++++++++++++++++--
>   drivers/media/platform/qcom/iris/iris_vdec.h  | 11 +++
>   drivers/media/platform/qcom/iris/iris_vidc.c  |  3 -
>   8 files changed, 113 insertions(+), 11 deletions(-)
> 
> 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 64f887d9a17d..1e774b058ab9 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> @@ -26,6 +26,20 @@ static u32 iris_hfi_gen1_buf_type_from_driver(enum iris_buffer_type buffer_type)
>   	}
>   }
>   
> +static u32 iris_hfi_gen1_v4l2_to_codec_type(u32 pixfmt)
> +{
> +	switch (pixfmt) {
> +	case V4L2_PIX_FMT_H264:
> +		return HFI_VIDEO_CODEC_H264;
> +	case V4L2_PIX_FMT_HEVC:
> +		return HFI_VIDEO_CODEC_HEVC;
> +	case V4L2_PIX_FMT_VP9:
> +		return HFI_VIDEO_CODEC_VP9;
> +	default:
> +		return 0;
> +	}

Unknown is 0 here - perhaps it should be a define.

> +}
> +
>   static int iris_hfi_gen1_sys_init(struct iris_core *core)
>   {
>   	struct hfi_sys_init_pkt sys_init_pkt;
> @@ -88,16 +102,18 @@ static int iris_hfi_gen1_sys_pc_prep(struct iris_core *core)
>   static int iris_hfi_gen1_session_open(struct iris_inst *inst)
>   {
>   	struct hfi_session_open_pkt packet;
> +	u32 codec;
>   	int ret;
>   
>   	if (inst->state != IRIS_INST_DEINIT)
>   		return -EALREADY;
>   
> +	codec = iris_hfi_gen1_v4l2_to_codec_type(inst->codec);


You can return an error from this function - suggest better error 
handling is

if (!codec)
	return -EINVAL; -ENO

or some other error value that makes more sense to you.

> +static u32 iris_hfi_gen2_v4l2_to_codec_type(struct iris_inst *inst)
> +{
> +	switch (inst->codec) {
> +	case V4L2_PIX_FMT_H264:
> +		return HFI_CODEC_DECODE_AVC;
> +	case V4L2_PIX_FMT_HEVC:
> +		return HFI_CODEC_DECODE_HEVC;
> +	case V4L2_PIX_FMT_VP9:
> +		return HFI_CODEC_DECODE_VP9;
> +	default:
> +		return 0;

>   static int iris_hfi_gen2_session_set_codec(struct iris_inst *inst)
>   {
>   	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
> -	u32 codec = HFI_CODEC_DECODE_AVC;
> +	u32 codec = iris_hfi_gen2_v4l2_to_codec_type(inst);

Same comment for gen2

>   
>   	iris_hfi_gen2_packet_session_property(inst,
>   					      HFI_PROP_CODEC,
> 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 806f8bb7f505..2fcf7914b70f 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> @@ -104,6 +104,9 @@ enum hfi_color_format {
>   enum hfi_codec_type {
>   	HFI_CODEC_DECODE_AVC			= 1,
>   	HFI_CODEC_ENCODE_AVC			= 2,
> +	HFI_CODEC_DECODE_HEVC			= 3,
> +	HFI_CODEC_ENCODE_HEVC			= 4,
> +	HFI_CODEC_DECODE_VP9			= 5,
>   };
>   
>   enum hfi_picture_type {
> diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
> index caa3c6507006..d8f076936c2b 100644
> --- a/drivers/media/platform/qcom/iris/iris_instance.h
> +++ b/drivers/media/platform/qcom/iris/iris_instance.h
> @@ -42,6 +42,7 @@
>    * @sequence_out: a sequence counter for output queue
>    * @tss: timestamp metadata
>    * @metadata_idx: index for metadata buffer
> + * @codec: codec type
>    */
>   
>   struct iris_inst {
> @@ -72,6 +73,7 @@ struct iris_inst {
>   	u32				sequence_out;
>   	struct iris_ts_metadata		tss[VIDEO_MAX_FRAME];
>   	u32				metadata_idx;
> +	u32				codec;
>   };
>   
>   #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
> index 4143acedfc57..cdcfe71f5b96 100644
> --- a/drivers/media/platform/qcom/iris/iris_vdec.c
> +++ b/drivers/media/platform/qcom/iris/iris_vdec.c
> @@ -32,6 +32,7 @@ int iris_vdec_inst_init(struct iris_inst *inst)
>   	f->fmt.pix_mp.width = DEFAULT_WIDTH;
>   	f->fmt.pix_mp.height = DEFAULT_HEIGHT;
>   	f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
> +	inst->codec = f->fmt.pix_mp.pixelformat;
>   	f->fmt.pix_mp.num_planes = 1;
>   	f->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
>   	f->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_INPUT);
> @@ -67,14 +68,67 @@ void iris_vdec_inst_deinit(struct iris_inst *inst)
>   	kfree(inst->fmt_src);
>   }
>   
> +static const struct iris_fmt iris_vdec_formats[] = {
> +	[IRIS_FMT_H264] = {
> +		.pixfmt = V4L2_PIX_FMT_H264,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +	[IRIS_FMT_HEVC] = {
> +		.pixfmt = V4L2_PIX_FMT_HEVC,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +	[IRIS_FMT_VP9] = {
> +		.pixfmt = V4L2_PIX_FMT_VP9,
> +		.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
> +	},
> +};
> +
> +static const struct iris_fmt *
> +find_format(struct iris_inst *inst, u32 pixfmt, u32 type)
> +{
> +	const struct iris_fmt *fmt = iris_vdec_formats;
> +	unsigned int size = ARRAY_SIZE(iris_vdec_formats);
> +	unsigned int i;

Slightly neater as a reverse christmas tree.

> +
> +	for (i = 0; i < size; i++) {
> +		if (fmt[i].pixfmt == pixfmt)
> +			break;
> +	}
> +
> +	if (i == size || fmt[i].type != type)
> +		return NULL;
> +
> +	return &fmt[i];
> +}
> +
> +static const struct iris_fmt *
> +find_format_by_index(struct iris_inst *inst, u32 index, u32 type)
> +{
> +	const struct iris_fmt *fmt = iris_vdec_formats;
> +	unsigned int size = ARRAY_SIZE(iris_vdec_formats);
> +
> +	if (index >= size || fmt[index].type != type)
> +		return NULL;
> +
> +	return &fmt[index];
> +}
> +
>   int iris_vdec_enum_fmt(struct iris_inst *inst, struct v4l2_fmtdesc *f)
>   {
> +	const struct iris_fmt *fmt;
> +
>   	switch (f->type) {
>   	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
> -		f->pixelformat = V4L2_PIX_FMT_H264;
> +		fmt = find_format_by_index(inst, f->index, f->type);
> +		if (!fmt)
> +			return -EINVAL;
> +
> +		f->pixelformat = fmt->pixfmt;
>   		f->flags = V4L2_FMT_FLAG_COMPRESSED | V4L2_FMT_FLAG_DYN_RESOLUTION;
>   		break;
>   	case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
> +		if (f->index)
> +			return -EINVAL;
>   		f->pixelformat = V4L2_PIX_FMT_NV12;
>   		break;
>   	default:
> @@ -88,13 +142,15 @@ int iris_vdec_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
>   {
>   	struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
>   	struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx;
> +	const struct iris_fmt *fmt;
>   	struct v4l2_format *f_inst;
>   	struct vb2_queue *src_q;
>   
>   	memset(pixmp->reserved, 0, sizeof(pixmp->reserved));
> +	fmt = find_format(inst, pixmp->pixelformat, f->type);
>   	switch (f->type) {
>   	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
> -		if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_H264) {
> +		if (!fmt) {
>   			f_inst = inst->fmt_src;
>   			f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
>   			f->fmt.pix_mp.height = f_inst->fmt.pix_mp.height;
> @@ -102,7 +158,7 @@ int iris_vdec_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
>   		}
>   		break;
>   	case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
> -		if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_NV12) {
> +		if (!fmt) {
>   			f_inst = inst->fmt_dst;
>   			f->fmt.pix_mp.pixelformat = f_inst->fmt.pix_mp.pixelformat;
>   			f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
> @@ -145,13 +201,14 @@ int iris_vdec_s_fmt(struct iris_inst *inst, struct v4l2_format *f)
>   
>   	switch (f->type) {
>   	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
> -		if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_H264)
> +		if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
>   			return -EINVAL;
>   
>   		fmt = inst->fmt_src;
>   		fmt->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
> -
> -		codec_align = DEFAULT_CODEC_ALIGNMENT;
> +		fmt->fmt.pix_mp.pixelformat = f->fmt.pix_mp.pixelformat;
> +		inst->codec = fmt->fmt.pix_mp.pixelformat;
> +		codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;

For preference I'd choose a default assignment and then an if for 
whatever you choose as non-default.

codec_align = 16;
if (inst->codec == V4L2_PIX_FMT_HEVC)
	codec_align = 32;

>   		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);
>   		fmt->fmt.pix_mp.num_planes = 1;
> diff --git a/drivers/media/platform/qcom/iris/iris_vdec.h b/drivers/media/platform/qcom/iris/iris_vdec.h
> index b24932dc511a..cd7aab66dc7c 100644
> --- a/drivers/media/platform/qcom/iris/iris_vdec.h
> +++ b/drivers/media/platform/qcom/iris/iris_vdec.h
> @@ -8,6 +8,17 @@
>   
>   struct iris_inst;
>   
> +enum iris_fmt_type {
> +	IRIS_FMT_H264,

I persoanlly like to init enums = 0,


> +	IRIS_FMT_HEVC,
> +	IRIS_FMT_VP9,
> +};
> +
> +struct iris_fmt {
> +	u32 pixfmt;
> +	u32 type;
> +};
> +
>   int iris_vdec_inst_init(struct iris_inst *inst);
>   void iris_vdec_inst_deinit(struct iris_inst *inst);
>   int iris_vdec_enum_fmt(struct iris_inst *inst, struct v4l2_fmtdesc *f);
> diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/platform/qcom/iris/iris_vidc.c
> index ca0f4e310f77..6a6afa15b647 100644
> --- a/drivers/media/platform/qcom/iris/iris_vidc.c
> +++ b/drivers/media/platform/qcom/iris/iris_vidc.c
> @@ -249,9 +249,6 @@ static int iris_enum_fmt(struct file *filp, void *fh, struct v4l2_fmtdesc *f)
>   {
>   	struct iris_inst *inst = iris_get_inst(filp, NULL);
>   
> -	if (f->index)
> -		return -EINVAL;
> -
>   	return iris_vdec_enum_fmt(inst, f);
>   }
>   

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 02/12] media: iris: Add platform capabilities for HEVC and VP9 decoders
  2025-03-05 10:43 ` [RFC PATCH 02/12] media: iris: Add platform capabilities for HEVC and VP9 decoders Dikshita Agarwal
@ 2025-03-06  0:28   ` Bryan O'Donoghue
  2025-03-06 12:07     ` Dikshita Agarwal
  0 siblings, 1 reply; 32+ messages in thread
From: Bryan O'Donoghue @ 2025-03-06  0:28 UTC (permalink / raw)
  To: Dikshita Agarwal, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

On 05/03/2025 10:43, Dikshita Agarwal wrote:
> Add platform capabilities for HEVC and VP9 codecs in decoder driver
> with related hooks.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>   drivers/media/platform/qcom/iris/iris_ctrls.c | 28 ++++++-
>   .../qcom/iris/iris_hfi_gen2_command.c         | 30 ++++++-
>   .../qcom/iris/iris_hfi_gen2_defines.h         |  1 +
>   .../qcom/iris/iris_hfi_gen2_response.c        | 36 ++++++++-
>   .../platform/qcom/iris/iris_platform_common.h |  9 ++-
>   .../platform/qcom/iris/iris_platform_sm8550.c | 80 ++++++++++++++++++-
>   6 files changed, 170 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
> index b690578256d5..fb2b818c7c5c 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.c
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
> @@ -20,9 +20,19 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
>   	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
>   		return DEBLOCK;
>   	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
> -		return PROFILE;
> +		return PROFILE_H264;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
> +		return PROFILE_HEVC;
> +	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
> +		return PROFILE_VP9;
>   	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
> -		return LEVEL;
> +		return LEVEL_H264;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
> +		return LEVEL_HEVC;
> +	case V4L2_CID_MPEG_VIDEO_VP9_LEVEL:
> +		return LEVEL_VP9;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
> +		return TIER;
>   	default:
>   		return INST_FW_CAP_MAX;
>   	}
> @@ -36,10 +46,20 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
>   	switch (cap_id) {
>   	case DEBLOCK:
>   		return V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER;
> -	case PROFILE:
> +	case PROFILE_H264:
>   		return V4L2_CID_MPEG_VIDEO_H264_PROFILE;
> -	case LEVEL:
> +	case PROFILE_HEVC:
> +		return V4L2_CID_MPEG_VIDEO_HEVC_PROFILE;
> +	case PROFILE_VP9:
> +		return V4L2_CID_MPEG_VIDEO_VP9_PROFILE;
> +	case LEVEL_H264:
>   		return V4L2_CID_MPEG_VIDEO_H264_LEVEL;
> +	case LEVEL_HEVC:
> +		return V4L2_CID_MPEG_VIDEO_HEVC_LEVEL;
> +	case LEVEL_VP9:
> +		return V4L2_CID_MPEG_VIDEO_VP9_LEVEL;
> +	case TIER:
> +		return V4L2_CID_MPEG_VIDEO_HEVC_TIER;
>   	default:
>   		return 0;
>   	}
> 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 beaf3a051d7c..a3ebcda9a2ba 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -309,7 +309,20 @@ static int iris_hfi_gen2_set_profile(struct iris_inst *inst)
>   {
>   	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
>   	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
> -	u32 profile = inst->fw_caps[PROFILE].value;
> +	u32 profile;
> +
> +	switch (inst->codec) {
> +	case V4L2_PIX_FMT_HEVC:
> +		profile = inst->fw_caps[PROFILE_HEVC].value;
> +		break;
> +	case V4L2_PIX_FMT_VP9:
> +		profile = inst->fw_caps[PROFILE_VP9].value;
> +		break;
> +	case V4L2_PIX_FMT_H264:
> +	default:
> +		profile = inst->fw_caps[PROFILE_H264].value;
> +		break;

Following up on my previous comment about returning a 0 default and 
running with it instead of erroring it - you then treat default == 0 @ 
inst->codec assigned in iris_hfi_gen[1|2]_sys_init as H264.

In fact why have a default by the time you get this this point in the 
code anyway ?

Just chuck out parameters which aren't expected as errors and then don't 
bother with these defaults.

> +	}
>   
>   	inst_hfi_gen2->src_subcr_params.profile = profile;
>   
> @@ -326,7 +339,20 @@ static int iris_hfi_gen2_set_level(struct iris_inst *inst)
>   {
>   	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
>   	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
> -	u32 level = inst->fw_caps[LEVEL].value;
> +	u32 level;
> +
> +	switch (inst->codec) {
> +	case V4L2_PIX_FMT_HEVC:
> +		level = inst->fw_caps[LEVEL_HEVC].value;
> +		break;
> +	case V4L2_PIX_FMT_VP9:
> +		level = inst->fw_caps[LEVEL_VP9].value;
> +		break;
> +	case V4L2_PIX_FMT_H264:
> +	default:
> +		level = inst->fw_caps[LEVEL_H264].value;
> +		break;
> +	}
>   
>   	inst_hfi_gen2->src_subcr_params.level = level;
>   
> 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 2fcf7914b70f..48c507a1ec27 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> @@ -46,6 +46,7 @@
>   #define HFI_PROP_CROP_OFFSETS			0x03000105
>   #define HFI_PROP_PROFILE			0x03000107
>   #define HFI_PROP_LEVEL				0x03000108
> +#define HFI_PROP_TIER				0x03000109
>   #define HFI_PROP_STAGE				0x0300010a
>   #define HFI_PROP_PIPE				0x0300010b
>   #define HFI_PROP_LUMA_CHROMA_BIT_DEPTH		0x0300010f

These seem like - probably bitfields ?

Could we get the bits in a follow on patch/series ?

> 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 b75a01641d5d..809bf0f238bd 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> @@ -563,8 +563,22 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
>   	inst->crop.width = pixmp_ip->width -
>   		((subsc_params.crop_offsets[1] >> 16) & 0xFFFF) - inst->crop.left;
>   
> -	inst->fw_caps[PROFILE].value = subsc_params.profile;
> -	inst->fw_caps[LEVEL].value = subsc_params.level;
> +	switch (inst->codec) {
> +	case V4L2_PIX_FMT_HEVC:
> +		inst->fw_caps[PROFILE_HEVC].value = subsc_params.profile;
> +		inst->fw_caps[LEVEL_HEVC].value = subsc_params.level;
> +		break;
> +	case V4L2_PIX_FMT_VP9:
> +		inst->fw_caps[PROFILE_VP9].value = subsc_params.profile;
> +		inst->fw_caps[LEVEL_VP9].value = subsc_params.level;
> +		break;
> +	case V4L2_PIX_FMT_H264:
> +	default:
> +		inst->fw_caps[PROFILE_H264].value = subsc_params.profile;
> +		inst->fw_caps[LEVEL_H264].value = subsc_params.level;
> +		break;
> +	}
> +
>   	inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
>   
>   	if (subsc_params.bit_depth != BIT_DEPTH_8 ||
> @@ -791,8 +805,22 @@ static void iris_hfi_gen2_init_src_change_param(struct iris_inst *inst)
>   					     full_range, video_format,
>   					     video_signal_type_present_flag);
>   
> -	subsc_params->profile = inst->fw_caps[PROFILE].value;
> -	subsc_params->level = inst->fw_caps[LEVEL].value;
> +	switch (inst->codec) {
> +	case V4L2_PIX_FMT_HEVC:
> +		subsc_params->profile = inst->fw_caps[PROFILE_HEVC].value;
> +		subsc_params->level = inst->fw_caps[LEVEL_HEVC].value;
> +		break;
> +	case V4L2_PIX_FMT_VP9:
> +		subsc_params->profile = inst->fw_caps[PROFILE_VP9].value;
> +		subsc_params->level = inst->fw_caps[LEVEL_VP9].value;
> +		break;
> +	case V4L2_PIX_FMT_H264:
> +	default:
> +		subsc_params->profile = inst->fw_caps[PROFILE_H264].value;
> +		subsc_params->level = inst->fw_caps[LEVEL_H264].value;
> +		break;
> +	}
> +
>   	subsc_params->pic_order_cnt = inst->fw_caps[POC].value;
>   	subsc_params->bit_depth = inst->fw_caps[BIT_DEPTH].value;
>   	if (inst->fw_caps[CODED_FRAMES].value ==
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index f6b15d2805fb..67204cddd44a 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -78,8 +78,12 @@ struct platform_inst_caps {
>   };
>   
>   enum platform_inst_fw_cap_type {
> -	PROFILE = 1,
> -	LEVEL,
> +	PROFILE_H264 = 1,
> +	PROFILE_HEVC,
> +	PROFILE_VP9,
> +	LEVEL_H264,
> +	LEVEL_HEVC,
> +	LEVEL_VP9,
>   	INPUT_BUF_HOST_MAX_COUNT,
>   	STAGE,
>   	PIPE,
> @@ -88,6 +92,7 @@ enum platform_inst_fw_cap_type {
>   	BIT_DEPTH,
>   	RAP_FRAME,
>   	DEBLOCK,
> +	TIER,
>   	INST_FW_CAP_MAX,
>   };
>   
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> index 35d278996c43..29bc50785da5 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> @@ -14,7 +14,7 @@
>   
>   static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
>   	{
> -		.cap_id = PROFILE,
> +		.cap_id = PROFILE_H264,
>   		.min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
>   		.max = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH,
>   		.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
> @@ -28,7 +28,29 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
>   		.set = iris_set_u32_enum,
>   	},
>   	{
> -		.cap_id = LEVEL,
> +		.cap_id = PROFILE_HEVC,
> +		.min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
> +		.max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE),
> +		.value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
> +		.hfi_id = HFI_PROP_PROFILE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = PROFILE_VP9,
> +		.min = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
> +		.max = V4L2_MPEG_VIDEO_VP9_PROFILE_2,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_2),
> +		.value = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
> +		.hfi_id = HFI_PROP_PROFILE,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = LEVEL_H264,
>   		.min = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
>   		.max = V4L2_MPEG_VIDEO_H264_LEVEL_6_2,
>   		.step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
> @@ -56,6 +78,60 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
>   		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
>   		.set = iris_set_u32_enum,
>   	},
> +	{
> +		.cap_id = LEVEL_HEVC,
> +		.min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
> +		.max = V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2),
> +		.value = V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1,
> +		.hfi_id = HFI_PROP_LEVEL,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = LEVEL_VP9,
> +		.min = V4L2_MPEG_VIDEO_VP9_LEVEL_1_0,
> +		.max = V4L2_MPEG_VIDEO_VP9_LEVEL_6_0,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_0) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_1) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_2) |
> +				BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_6_0),
> +		.value = V4L2_MPEG_VIDEO_VP9_LEVEL_6_0,
> +		.hfi_id = HFI_PROP_LEVEL,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
> +	{
> +		.cap_id = TIER,
> +		.min = V4L2_MPEG_VIDEO_HEVC_TIER_MAIN,
> +		.max = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
> +		.step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_TIER_MAIN) |
> +				BIT(V4L2_MPEG_VIDEO_HEVC_TIER_HIGH),
> +		.value = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
> +		.hfi_id = HFI_PROP_TIER,
> +		.flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
> +		.set = iris_set_u32_enum,
> +	},
>   	{
>   		.cap_id = INPUT_BUF_HOST_MAX_COUNT,
>   		.min = DEFAULT_MAX_HOST_BUF_COUNT,

Other than those nits

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 03/12] media: iris: Set mandatory properties for HEVC and VP9 decoders.
  2025-03-05 10:43 ` [RFC PATCH 03/12] media: iris: Set mandatory properties " Dikshita Agarwal
  2025-03-05 14:00   ` neil.armstrong
@ 2025-03-06  0:52   ` Bryan O'Donoghue
  2025-03-06 12:16     ` Dikshita Agarwal
  1 sibling, 1 reply; 32+ messages in thread
From: Bryan O'Donoghue @ 2025-03-06  0:52 UTC (permalink / raw)
  To: Dikshita Agarwal, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

On 05/03/2025 10:43, Dikshita Agarwal wrote:
> Subscribe and set mandatory properties to the firmware for HEVC and VP9
> decoders.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>   .../platform/qcom/iris/iris_hfi_common.h      |  1 +
>   .../qcom/iris/iris_hfi_gen1_command.c         |  4 +-
>   .../qcom/iris/iris_hfi_gen2_command.c         | 83 +++++++++++++++++--
>   .../qcom/iris/iris_hfi_gen2_response.c        |  7 ++
>   .../platform/qcom/iris/iris_platform_common.h | 16 +++-
>   .../platform/qcom/iris/iris_platform_sm8250.c |  4 +-
>   .../platform/qcom/iris/iris_platform_sm8550.c | 61 ++++++++++++--
>   7 files changed, 151 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h b/drivers/media/platform/qcom/iris/iris_hfi_common.h
> index b2c541367fc6..9e6aadb83783 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h
> @@ -140,6 +140,7 @@ struct hfi_subscription_params {
>   	u32	color_info;
>   	u32	profile;
>   	u32	level;
> +	u32	tier;
>   };
>   
>   u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);
> 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 1e774b058ab9..a160ae915886 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> @@ -784,8 +784,8 @@ static int iris_hfi_gen1_session_set_config_params(struct iris_inst *inst, u32 p
>   			iris_hfi_gen1_set_bufsize},
>   	};
>   
> -	config_params = core->iris_platform_data->input_config_params;
> -	config_params_size = core->iris_platform_data->input_config_params_size;
> +	config_params = core->iris_platform_data->input_config_params_default;
> +	config_params_size = core->iris_platform_data->input_config_params_default_size;
>   
>   	if (V4L2_TYPE_IS_OUTPUT(plane)) {
>   		for (i = 0; i < config_params_size; i++) {
> 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 a3ebcda9a2ba..5b4c89184297 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -192,7 +192,7 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst)
>   						  sizeof(u64));
>   }
>   
> -static int iris_hfi_gen2_set_bit_dpeth(struct iris_inst *inst)
> +static int iris_hfi_gen2_set_bit_depth(struct iris_inst *inst)
>   {
>   	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
>   	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
> @@ -407,6 +407,23 @@ static int iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst)
>   						  sizeof(u64));
>   }
>   
> +static int iris_hfi_gen2_set_tier(struct iris_inst *inst)
> +{
> +	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
> +	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
> +	u32 tier = inst->fw_caps[TIER].value;
> +
> +	inst_hfi_gen2->src_subcr_params.tier = tier;
> +
> +	return iris_hfi_gen2_session_set_property(inst,
> +						  HFI_PROP_TIER,
> +						  HFI_HOST_FLAGS_NONE,
> +						  port,
> +						  HFI_PAYLOAD_U32_ENUM,
> +						  &tier,
> +						  sizeof(u32));
> +}
> +
>   static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 plane)
>   {
>   	struct iris_core *core = inst->core;
> @@ -418,7 +435,7 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
>   		{HFI_PROP_BITSTREAM_RESOLUTION,       iris_hfi_gen2_set_bitstream_resolution   },
>   		{HFI_PROP_CROP_OFFSETS,               iris_hfi_gen2_set_crop_offsets           },
>   		{HFI_PROP_CODED_FRAMES,               iris_hfi_gen2_set_coded_frames           },
> -		{HFI_PROP_LUMA_CHROMA_BIT_DEPTH,      iris_hfi_gen2_set_bit_dpeth              },
> +		{HFI_PROP_LUMA_CHROMA_BIT_DEPTH,      iris_hfi_gen2_set_bit_depth              },
>   		{HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT, iris_hfi_gen2_set_min_output_count       },
>   		{HFI_PROP_PIC_ORDER_CNT_TYPE,         iris_hfi_gen2_set_picture_order_count    },
>   		{HFI_PROP_SIGNAL_COLOR_INFO,          iris_hfi_gen2_set_colorspace             },
> @@ -426,11 +443,25 @@ static int iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
>   		{HFI_PROP_LEVEL,                      iris_hfi_gen2_set_level                  },
>   		{HFI_PROP_COLOR_FORMAT,               iris_hfi_gen2_set_colorformat            },
>   		{HFI_PROP_LINEAR_STRIDE_SCANLINE,     iris_hfi_gen2_set_linear_stride_scanline },
> +		{HFI_PROP_TIER,                       iris_hfi_gen2_set_tier                   },
>   	};
>   
>   	if (V4L2_TYPE_IS_OUTPUT(plane)) {
> -		config_params = core->iris_platform_data->input_config_params;
> -		config_params_size = core->iris_platform_data->input_config_params_size;
> +		if (inst->codec == V4L2_PIX_FMT_H264) {
> +			config_params = core->iris_platform_data->input_config_params_default;
> +			config_params_size =
> +				core->iris_platform_data->input_config_params_default_size;
> +		} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
> +			config_params = core->iris_platform_data->input_config_params_hevc;
> +			config_params_size =
> +				core->iris_platform_data->input_config_params_hevc_size;
> +		} else if (inst->codec == V4L2_PIX_FMT_VP9) {
> +			config_params = core->iris_platform_data->input_config_params_vp9;
> +			config_params_size =
> +				core->iris_platform_data->input_config_params_vp9_size;
> +		} else {
> +			return -EINVAL;
> +		}
>   	} else {
>   		config_params = core->iris_platform_data->output_config_params;
>   		config_params_size = core->iris_platform_data->output_config_params_size;
> @@ -600,8 +631,21 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>   		return 0;
>   	}
>   
> -	change_param = core->iris_platform_data->input_config_params;
> -	change_param_size = core->iris_platform_data->input_config_params_size;
> +	if (inst->codec == V4L2_PIX_FMT_H264) {
> +		change_param = core->iris_platform_data->input_config_params_default;
> +		change_param_size =
> +			core->iris_platform_data->input_config_params_default_size;
> +	} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
> +		change_param = core->iris_platform_data->input_config_params_hevc;
> +		change_param_size =
> +			core->iris_platform_data->input_config_params_hevc_size;
> +	} else if (inst->codec == V4L2_PIX_FMT_VP9) {
> +		change_param = core->iris_platform_data->input_config_params_vp9;
> +		change_param_size =
> +			core->iris_platform_data->input_config_params_vp9_size;
> +	} else {
> +		return -EINVAL;
> +	}

I'm not a massive fan of multi-clause if/elses - in this particular case 
this will grow and grow into something very sprawling.

Grateful if you'd switch() this.

>   
>   	payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
>   
> @@ -648,6 +692,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>   				payload_size = sizeof(u32);
>   				payload_type = HFI_PAYLOAD_U32;
>   				break;
> +			case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
> +				payload[0] = subsc_params.bit_depth;
> +				payload_size = sizeof(u32);
> +				payload_type = HFI_PAYLOAD_U32;
> +				break;
>   			case HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT:
>   				payload[0] = subsc_params.fw_min_count;
>   				payload_size = sizeof(u32);
> @@ -673,6 +722,11 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>   				payload_size = sizeof(u32);
>   				payload_type = HFI_PAYLOAD_U32;
>   				break;
> +			case HFI_PROP_TIER:
> +				payload[0] = subsc_params.tier;
> +				payload_size = sizeof(u32);
> +				payload_type = HFI_PAYLOAD_U32;
> +				break;
>   			default:
>   				prop_type = 0;
>   				ret = -EINVAL;
> @@ -709,8 +763,21 @@ static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
>   		subscribe_prop_size = core->iris_platform_data->dec_input_prop_size;
>   		subcribe_prop = core->iris_platform_data->dec_input_prop;
>   	} else {
> -		subscribe_prop_size = core->iris_platform_data->dec_output_prop_size;
> -		subcribe_prop = core->iris_platform_data->dec_output_prop;
> +		if (inst->codec == V4L2_PIX_FMT_H264) {
> +			subcribe_prop = core->iris_platform_data->dec_output_prop_avc;
> +			subscribe_prop_size =
> +				core->iris_platform_data->dec_output_prop_avc_size;
> +		} else if (inst->codec == V4L2_PIX_FMT_HEVC) {
> +			subcribe_prop = core->iris_platform_data->dec_output_prop_hevc;
> +			subscribe_prop_size =
> +				core->iris_platform_data->dec_output_prop_hevc_size;
> +		} else if (inst->codec == V4L2_PIX_FMT_VP9) {
> +			subcribe_prop = core->iris_platform_data->dec_output_prop_vp9;
> +			subscribe_prop_size =
> +				core->iris_platform_data->dec_output_prop_vp9_size;
> +		} else {
> +			return -EINVAL;
> +		}

Same here, this code will be neater IMO as a swtich statement as it 
grows with new codecs.

>   	}
>   
>   	for (i = 0; i < subscribe_prop_size; i++)
> 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 809bf0f238bd..6846311a26c3 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> @@ -580,6 +580,7 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
>   	}
>   
>   	inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
> +	inst->fw_caps[TIER].value = subsc_params.tier;
>   
>   	if (subsc_params.bit_depth != BIT_DEPTH_8 ||
>   	    !(subsc_params.coded_frames & HFI_BITMASK_FRAME_MBS_ONLY_FLAG)) {
> @@ -664,6 +665,9 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
>   		inst_hfi_gen2->src_subcr_params.crop_offsets[0] = pkt->payload[0];
>   		inst_hfi_gen2->src_subcr_params.crop_offsets[1] = pkt->payload[1];
>   		break;
> +	case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
> +		inst_hfi_gen2->src_subcr_params.bit_depth = pkt->payload[0];
> +		break;
>   	case HFI_PROP_CODED_FRAMES:
>   		inst_hfi_gen2->src_subcr_params.coded_frames = pkt->payload[0];
>   		break;
> @@ -682,6 +686,9 @@ static int iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
>   	case HFI_PROP_LEVEL:
>   		inst_hfi_gen2->src_subcr_params.level = pkt->payload[0];
>   		break;
> +	case HFI_PROP_TIER:
> +		inst_hfi_gen2->src_subcr_params.tier = pkt->payload[0];
> +		break;
>   	case HFI_PROP_PICTURE_TYPE:
>   		inst_hfi_gen2->hfi_frame_info.picture_type = pkt->payload[0];
>   		break;
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index 67204cddd44a..433ce9b00c68 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -174,14 +174,22 @@ struct iris_platform_data {
>   	u32 num_vpp_pipe;
>   	u32 max_session_count;
>   	u32 max_core_mbpf;
> -	const u32 *input_config_params;
> -	unsigned int input_config_params_size;
> +	const u32 *input_config_params_default;
> +	unsigned int input_config_params_default_size;
> +	const u32 *input_config_params_hevc;
> +	unsigned int input_config_params_hevc_size;
> +	const u32 *input_config_params_vp9;
> +	unsigned int input_config_params_vp9_size;
>   	const u32 *output_config_params;
>   	unsigned int output_config_params_size;
>   	const u32 *dec_input_prop;
>   	unsigned int dec_input_prop_size;
> -	const u32 *dec_output_prop;
> -	unsigned int dec_output_prop_size;
> +	const u32 *dec_output_prop_avc;
> +	unsigned int dec_output_prop_avc_size;
> +	const u32 *dec_output_prop_hevc;
> +	unsigned int dec_output_prop_hevc_size;
> +	const u32 *dec_output_prop_vp9;
> +	unsigned int dec_output_prop_vp9_size;
>   	const u32 *dec_ip_int_buf_tbl;
>   	unsigned int dec_ip_int_buf_tbl_size;
>   	const u32 *dec_op_int_buf_tbl;
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
> index 5c86fd7b7b6f..5f74e57f04fc 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
> @@ -137,9 +137,9 @@ struct iris_platform_data sm8250_data = {
>   	.num_vpp_pipe = 4,
>   	.max_session_count = 16,
>   	.max_core_mbpf = (8192 * 4352) / 256,
> -	.input_config_params =
> +	.input_config_params_default =
>   		sm8250_vdec_input_config_param_default,
> -	.input_config_params_size =
> +	.input_config_params_default_size =
>   		ARRAY_SIZE(sm8250_vdec_input_config_param_default),
>   
>   	.dec_ip_int_buf_tbl = sm8250_dec_ip_int_buf_tbl,
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> index 29bc50785da5..779c71885f51 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> @@ -254,9 +254,10 @@ static struct tz_cp_config tz_cp_config_sm8550 = {
>   	.cp_nonpixel_size = 0x24800000,
>   };
>   
> -static const u32 sm8550_vdec_input_config_params[] = {
> +static const u32 sm8550_vdec_input_config_params_default[] = {
>   	HFI_PROP_BITSTREAM_RESOLUTION,
>   	HFI_PROP_CROP_OFFSETS,
> +	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
>   	HFI_PROP_CODED_FRAMES,
>   	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>   	HFI_PROP_PIC_ORDER_CNT_TYPE,
> @@ -265,6 +266,26 @@ static const u32 sm8550_vdec_input_config_params[] = {
>   	HFI_PROP_SIGNAL_COLOR_INFO,
>   };
>   
> +static const u32 sm8550_vdec_input_config_param_hevc[] = {
> +	HFI_PROP_BITSTREAM_RESOLUTION,
> +	HFI_PROP_CROP_OFFSETS,
> +	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> +	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
> +	HFI_PROP_PROFILE,
> +	HFI_PROP_LEVEL,
> +	HFI_PROP_TIER,
> +	HFI_PROP_SIGNAL_COLOR_INFO,
> +};
> +
> +static const u32 sm8550_vdec_input_config_param_vp9[] = {
> +	HFI_PROP_BITSTREAM_RESOLUTION,
> +	HFI_PROP_CROP_OFFSETS,
> +	HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
> +	HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
> +	HFI_PROP_PROFILE,
> +	HFI_PROP_LEVEL,
> +};
> +
>   static const u32 sm8550_vdec_output_config_params[] = {
>   	HFI_PROP_COLOR_FORMAT,
>   	HFI_PROP_LINEAR_STRIDE_SCANLINE,
> @@ -274,11 +295,19 @@ static const u32 sm8550_vdec_subscribe_input_properties[] = {
>   	HFI_PROP_NO_OUTPUT,
>   };
>   
> -static const u32 sm8550_vdec_subscribe_output_properties[] = {
> +static const u32 sm8550_vdec_subscribe_output_properties_avc[] = {
>   	HFI_PROP_PICTURE_TYPE,
>   	HFI_PROP_CABAC_SESSION,
>   };
>   
> +static const u32 sm8550_vdec_subscribe_output_properties_hevc[] = {
> +	HFI_PROP_PICTURE_TYPE,
> +};
> +
> +static const u32 sm8550_vdec_subscribe_output_properties_vp9[] = {
> +	HFI_PROP_PICTURE_TYPE,
> +};
> +
>   static const u32 sm8550_dec_ip_int_buf_tbl[] = {
>   	BUF_BIN,
>   	BUF_COMV,
> @@ -322,19 +351,33 @@ struct iris_platform_data sm8550_data = {
>   	.num_vpp_pipe = 4,
>   	.max_session_count = 16,
>   	.max_core_mbpf = ((8192 * 4352) / 256) * 2,

I realise it's not in your changeset but....

mbpf - mega bytes per frame ?

What do these numbers capture and how do we validate them ?

Defines with meaning would be better

((MAX_BYTES_PER_THING * NUMBER_OF_LINES_OF_PIXELS) / SOME_ALIGNMENT ) * 2

or whatever it is those numbers ultimately capture.

> -	.input_config_params =
> -		sm8550_vdec_input_config_params,
> -	.input_config_params_size =
> -		ARRAY_SIZE(sm8550_vdec_input_config_params),
> +	.input_config_params_default =
> +		sm8550_vdec_input_config_params_default,
> +	.input_config_params_default_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_params_default),
> +	.input_config_params_hevc =
> +		sm8550_vdec_input_config_param_hevc,
> +	.input_config_params_hevc_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
> +	.input_config_params_vp9 =
> +		sm8550_vdec_input_config_param_vp9,
> +	.input_config_params_vp9_size =
> +		ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
>   	.output_config_params =
>   		sm8550_vdec_output_config_params,
>   	.output_config_params_size =
>   		ARRAY_SIZE(sm8550_vdec_output_config_params),
>   	.dec_input_prop = sm8550_vdec_subscribe_input_properties,
>   	.dec_input_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
> -	.dec_output_prop = sm8550_vdec_subscribe_output_properties,
> -	.dec_output_prop_size = ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
> -
> +	.dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
> +	.dec_output_prop_avc_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
> +	.dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
> +	.dec_output_prop_hevc_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
> +	.dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
> +	.dec_output_prop_vp9_size =
> +		ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
>   	.dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
>   	.dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
>   	.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,

---
bod

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 04/12] media: iris: Add internal buffer calculation for HEVC and VP9 decoders
  2025-03-05 10:43 ` [RFC PATCH 04/12] media: iris: Add internal buffer calculation " Dikshita Agarwal
@ 2025-03-06  1:05   ` Bryan O'Donoghue
  2025-03-06 12:26     ` Dikshita Agarwal
  0 siblings, 1 reply; 32+ messages in thread
From: Bryan O'Donoghue @ 2025-03-06  1:05 UTC (permalink / raw)
  To: Dikshita Agarwal, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

On 05/03/2025 10:43, Dikshita Agarwal wrote:
> Add internal buffer count and size calculations for HEVC and VP9
> decoders.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>   .../media/platform/qcom/iris/iris_buffer.c    |   3 +
>   .../platform/qcom/iris/iris_vpu_buffer.c      | 397 +++++++++++++++++-
>   .../platform/qcom/iris/iris_vpu_buffer.h      |  46 +-
>   3 files changed, 432 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
> index e5c5a564fcb8..8c9d5b7fe75c 100644
> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
> @@ -205,6 +205,9 @@ static u32 iris_bitstream_buffer_size(struct iris_inst *inst)
>   	if (num_mbs > NUM_MBS_4K) {
>   		div_factor = 4;
>   		base_res_mbs = caps->max_mbpf;
> +	} else {
> +		if (inst->codec == V4L2_PIX_FMT_VP9)
> +			div_factor = 1;
>   	}
>   
>   	/*
> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> index dce25e410d80..13ee93356bcb 100644
> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> @@ -31,6 +31,42 @@ static u32 hfi_buffer_bin_h264d(u32 frame_width, u32 frame_height, u32 num_vpp_p
>   	return size_h264d_hw_bin_buffer(n_aligned_w, n_aligned_h, num_vpp_pipes);
>   }
>   
> +static u32 size_h265d_hw_bin_buffer(u32 frame_width, u32 frame_height, u32 num_vpp_pipes)
> +{
> +	u32 product = frame_width * frame_height;
> +	u32 size_yuv, size_bin_hdr, size_bin_res;
> +
> +	size_yuv = (product <= BIN_BUFFER_THRESHOLD) ?
> +		((BIN_BUFFER_THRESHOLD * 3) >> 1) : ((product * 3) >> 1);

When I read this code I have no way of knowing if it makes sense.

#define BIN_BUFFER_THRESHOLD		(1280 * 736)

((BIN_BUFFER_THRESHOLD * 3) >> 1)

How/why is that correct ?

> +	size_bin_hdr = size_yuv * H265_CABAC_HDR_RATIO_HD_TOT;
> +	size_bin_res = size_yuv * H265_CABAC_RES_RATIO_HD_TOT;
> +	size_bin_hdr = ALIGN(size_bin_hdr / num_vpp_pipes, DMA_ALIGNMENT) * num_vpp_pipes;
> +	size_bin_res = ALIGN(size_bin_res / num_vpp_pipes, DMA_ALIGNMENT) * num_vpp_pipes;
> +
> +	return size_bin_hdr + size_bin_res;
> +}
> +
> +static u32 hfi_buffer_bin_vp9d(u32 frame_width, u32 frame_height, u32 num_vpp_pipes)
> +{
> +	u32 _size_yuv = ALIGN(frame_width, 16) * ALIGN(frame_height, 16) * 3 / 2;
> +	u32 _size = ALIGN(((max_t(u32, _size_yuv, ((BIN_BUFFER_THRESHOLD * 3) >> 1)) *
> +			VPX_DECODER_FRAME_BIN_HDR_BUDGET / VPX_DECODER_FRAME_BIN_DENOMINATOR *
> +			VPX_DECODER_FRAME_CONCURENCY_LVL) / num_vpp_pipes), DMA_ALIGNMENT) +
> +			ALIGN(((max_t(u32, _size_yuv, ((BIN_BUFFER_THRESHOLD * 3) >> 1)) *
> +			VPX_DECODER_FRAME_BIN_RES_BUDGET / VPX_DECODER_FRAME_BIN_DENOMINATOR *
> +			VPX_DECODER_FRAME_CONCURENCY_LVL) / num_vpp_pipes), DMA_ALIGNMENT);

The size_yuv I guess just about makes sense but the _size component here 
is pretty hard to say whether or not this adds up.

Could you please add some comments to describe the calculations in these 
complex size/alignment clauses.

---
bod

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 07/12] media: iris: Add handling for corrupt and drop frames
  2025-03-05 10:43 ` [RFC PATCH 07/12] media: iris: Add handling for corrupt and drop frames Dikshita Agarwal
@ 2025-03-06  1:12   ` Bryan O'Donoghue
  0 siblings, 0 replies; 32+ messages in thread
From: Bryan O'Donoghue @ 2025-03-06  1:12 UTC (permalink / raw)
  To: Dikshita Agarwal, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

On 05/03/2025 10:43, Dikshita Agarwal wrote:
> Firmware attach DATACORRUPT/DROP buffer flags for the frames which
> needs to be dropped, handle it by setting VB2_BUF_STATE_ERROR for these
> buffers before calling buf_done.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>   drivers/media/platform/qcom/iris/iris_buffer.c        | 11 ++++++++---
>   .../media/platform/qcom/iris/iris_hfi_gen1_defines.h  |  2 ++
>   .../media/platform/qcom/iris/iris_hfi_gen1_response.c |  6 ++++++
>   3 files changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
> index 305b630ca269..e5180340383b 100644
> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
> @@ -603,10 +603,13 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
>   
>   	vb2 = &vbuf->vb2_buf;
>   
> -	if (buf->flags & V4L2_BUF_FLAG_ERROR)
> +	if (buf->flags & V4L2_BUF_FLAG_ERROR) {
>   		state = VB2_BUF_STATE_ERROR;
> -	else
> -		state = VB2_BUF_STATE_DONE;
> +		vb2_set_plane_payload(vb2, 0, 0);
> +		vb2->timestamp = 0;
> +		v4l2_m2m_buf_done(vbuf, state);
> +		return 0;
> +	}
>   
>   	vbuf->flags |= buf->flags;
>   
> @@ -626,6 +629,8 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
>   			v4l2_m2m_mark_stopped(m2m_ctx);
>   		}
>   	}
> +
> +	state = VB2_BUF_STATE_DONE;
>   	vb2->timestamp = buf->timestamp;
>   	v4l2_m2m_buf_done(vbuf, state);
>   
> 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 3bea643068f9..bfeeea643300 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
> @@ -119,6 +119,8 @@
>   #define HFI_FRAME_NOTCODED				0x7f002000
>   #define HFI_FRAME_YUV					0x7f004000
>   #define HFI_UNUSED_PICT					0x10000000
> +#define HFI_BUFFERFLAG_DATACORRUPT			0x00000008
> +#define HFI_BUFFERFLAG_DROP_FRAME			0x20000000
>   
>   struct hfi_pkt_hdr {
>   	u32 size;
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
> index b72d503dd740..91d95eed68aa 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
> @@ -481,6 +481,12 @@ static void iris_hfi_gen1_session_ftb_done(struct iris_inst *inst, void *packet)
>   	buf->attr |= BUF_ATTR_DEQUEUED;
>   	buf->attr |= BUF_ATTR_BUFFER_DONE;
>   
> +	if (hfi_flags & HFI_BUFFERFLAG_DATACORRUPT)
> +		flags |= V4L2_BUF_FLAG_ERROR;
> +
> +	if (hfi_flags & HFI_BUFFERFLAG_DROP_FRAME)
> +		flags |= V4L2_BUF_FLAG_ERROR;
> +
>   	buf->flags |= flags;
>   
>   	iris_vb2_buffer_done(inst, buf);

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 08/12] media: iris: Avoid updating frame size to firmware during reconfig
  2025-03-05 10:43 ` [RFC PATCH 08/12] media: iris: Avoid updating frame size to firmware during reconfig Dikshita Agarwal
@ 2025-03-06  1:26   ` Bryan O'Donoghue
  2025-03-06 12:32     ` Dikshita Agarwal
  0 siblings, 1 reply; 32+ messages in thread
From: Bryan O'Donoghue @ 2025-03-06  1:26 UTC (permalink / raw)
  To: Dikshita Agarwal, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel

On 05/03/2025 10:43, Dikshita Agarwal wrote:
> During the reconfig, firmware sends the resolution aligned by 8 byte,
> if driver set the same resoluton to firmware, it will be aligned to 16
> byte causing another sequence change which would be incorrect.

During reconfig the firmware sends the resolution aligned to 8 bytes. If 
the driver sends the same resolution back to the firmware the resolution 
will be aligned to 16 bytes not 8.

The alignment mismatch would then subsequently cause the firmware to 
send another redundant sequence change.

> Fix this by not setting the updated resolution to firmware during
> reconfig.

Fix this by not setting the resolution property during reconfig.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>   .../platform/qcom/iris/iris_hfi_gen1_command.c    | 15 ++++++++-------
>   .../platform/qcom/iris/iris_hfi_gen1_response.c   |  1 +
>   drivers/media/platform/qcom/iris/iris_instance.h  |  2 ++
>   drivers/media/platform/qcom/iris/iris_vdec.c      |  4 ++++
>   4 files changed, 15 insertions(+), 7 deletions(-)
> 
> 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 a160ae915886..d5e81049d37e 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
> @@ -562,14 +562,15 @@ static int iris_hfi_gen1_set_resolution(struct iris_inst *inst)
>   	struct hfi_framesize fs;
>   	int ret;
>   
> -	fs.buffer_type = HFI_BUFFER_INPUT;
> -	fs.width = inst->fmt_src->fmt.pix_mp.width;
> -	fs.height = inst->fmt_src->fmt.pix_mp.height;
> -
> -	ret = hfi_gen1_set_property(inst, ptype, &fs, sizeof(fs));
> -	if (ret)
> -		return ret;
> +	if (!inst->in_reconfig) {
> +		fs.buffer_type = HFI_BUFFER_INPUT;
> +		fs.width = inst->fmt_src->fmt.pix_mp.width;
> +		fs.height = inst->fmt_src->fmt.pix_mp.height;
>   
> +		ret = hfi_gen1_set_property(inst, ptype, &fs, sizeof(fs));
> +		if (ret)
> +			return ret;
> +	}
>   	fs.buffer_type = HFI_BUFFER_OUTPUT2;
>   	fs.width = inst->fmt_dst->fmt.pix_mp.width;
>   	fs.height = inst->fmt_dst->fmt.pix_mp.height;
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
> index 91d95eed68aa..6576496fdbdf 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
> @@ -155,6 +155,7 @@ static void iris_hfi_gen1_read_changed_params(struct iris_inst *inst,
>   		inst->crop.height = event.height;
>   	}
>   
> +	inst->in_reconfig = true;

This flag can be changed by iris_hfi_isr_handler() down the chain.


> @@ -453,6 +453,8 @@ static int iris_vdec_process_streamon_input(struct iris_inst *inst)
>   	if (ret)
>   		return ret;
>   
> +	inst->in_reconfig = false;
> +
>   	return iris_inst_change_sub_state(inst, 0, set_sub_state);
>   }
>   
> @@ -544,6 +546,8 @@ static int iris_vdec_process_streamon_output(struct iris_inst *inst)
>   	if (ret)
>   		return ret;
>   
> +	inst->in_reconfig = false;
> +

Are these usages of the in_reconfig flag then thread-safe ?

i.e. are both iris_vdec_process_streamon_input() and 
iris_vdec_process_streamon_output() guaranteed not to run @ the same time ?

I don't see any obvious locking here.

---
bod

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 01/12] media: iris: Add HEVC and VP9 formats for decoder
  2025-03-06  0:17   ` Bryan O'Donoghue
@ 2025-03-06 11:55     ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 11:55 UTC (permalink / raw)
  To: Bryan O'Donoghue, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel



On 3/6/2025 5:47 AM, Bryan O'Donoghue wrote:
> On 05/03/2025 10:43, Dikshita Agarwal wrote:
>> Extend the decoder driver's supported formats to include HEVC (H.265)
>> and VP9. This change updates the format enumeration (VIDIOC_ENUM_FMT)
>> and allows setting these formats via VIDIOC_S_FMT.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>>   .../qcom/iris/iris_hfi_gen1_command.c         | 18 ++++-
>>   .../qcom/iris/iris_hfi_gen1_defines.h         |  2 +
>>   .../qcom/iris/iris_hfi_gen2_command.c         | 16 ++++-
>>   .../qcom/iris/iris_hfi_gen2_defines.h         |  3 +
>>   .../media/platform/qcom/iris/iris_instance.h  |  2 +
>>   drivers/media/platform/qcom/iris/iris_vdec.c  | 69 +++++++++++++++++--
>>   drivers/media/platform/qcom/iris/iris_vdec.h  | 11 +++
>>   drivers/media/platform/qcom/iris/iris_vidc.c  |  3 -
>>   8 files changed, 113 insertions(+), 11 deletions(-)
>>
>> 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 64f887d9a17d..1e774b058ab9 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> @@ -26,6 +26,20 @@ static u32 iris_hfi_gen1_buf_type_from_driver(enum
>> iris_buffer_type buffer_type)
>>       }
>>   }
>>   +static u32 iris_hfi_gen1_v4l2_to_codec_type(u32 pixfmt)
>> +{
>> +    switch (pixfmt) {
>> +    case V4L2_PIX_FMT_H264:
>> +        return HFI_VIDEO_CODEC_H264;
>> +    case V4L2_PIX_FMT_HEVC:
>> +        return HFI_VIDEO_CODEC_HEVC;
>> +    case V4L2_PIX_FMT_VP9:
>> +        return HFI_VIDEO_CODEC_VP9;
>> +    default:
>> +        return 0;
>> +    }
> 
> Unknown is 0 here - perhaps it should be a define.
> 
>> +}
>> +
>>   static int iris_hfi_gen1_sys_init(struct iris_core *core)
>>   {
>>       struct hfi_sys_init_pkt sys_init_pkt;
>> @@ -88,16 +102,18 @@ static int iris_hfi_gen1_sys_pc_prep(struct
>> iris_core *core)
>>   static int iris_hfi_gen1_session_open(struct iris_inst *inst)
>>   {
>>       struct hfi_session_open_pkt packet;
>> +    u32 codec;
>>       int ret;
>>         if (inst->state != IRIS_INST_DEINIT)
>>           return -EALREADY;
>>   +    codec = iris_hfi_gen1_v4l2_to_codec_type(inst->codec);
> 
> 
> You can return an error from this function - suggest better error handling is
> 
> if (!codec)
>     return -EINVAL; -ENO
> 
> or some other error value that makes more sense to you.
> 
This will never happen, as code will not reach to this point for
unsupported codec. I can just simply remove the default case.
>> +static u32 iris_hfi_gen2_v4l2_to_codec_type(struct iris_inst *inst)
>> +{
>> +    switch (inst->codec) {
>> +    case V4L2_PIX_FMT_H264:
>> +        return HFI_CODEC_DECODE_AVC;
>> +    case V4L2_PIX_FMT_HEVC:
>> +        return HFI_CODEC_DECODE_HEVC;
>> +    case V4L2_PIX_FMT_VP9:
>> +        return HFI_CODEC_DECODE_VP9;
>> +    default:
>> +        return 0;
> 
>>   static int iris_hfi_gen2_session_set_codec(struct iris_inst *inst)
>>   {
>>       struct iris_inst_hfi_gen2 *inst_hfi_gen2 =
>> to_iris_inst_hfi_gen2(inst);
>> -    u32 codec = HFI_CODEC_DECODE_AVC;
>> +    u32 codec = iris_hfi_gen2_v4l2_to_codec_type(inst);
> 
> Same comment for gen2
> 
>>         iris_hfi_gen2_packet_session_property(inst,
>>                             HFI_PROP_CODEC,
>> 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 806f8bb7f505..2fcf7914b70f 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
>> @@ -104,6 +104,9 @@ enum hfi_color_format {
>>   enum hfi_codec_type {
>>       HFI_CODEC_DECODE_AVC            = 1,
>>       HFI_CODEC_ENCODE_AVC            = 2,
>> +    HFI_CODEC_DECODE_HEVC            = 3,
>> +    HFI_CODEC_ENCODE_HEVC            = 4,
>> +    HFI_CODEC_DECODE_VP9            = 5,
>>   };
>>     enum hfi_picture_type {
>> diff --git a/drivers/media/platform/qcom/iris/iris_instance.h
>> b/drivers/media/platform/qcom/iris/iris_instance.h
>> index caa3c6507006..d8f076936c2b 100644
>> --- a/drivers/media/platform/qcom/iris/iris_instance.h
>> +++ b/drivers/media/platform/qcom/iris/iris_instance.h
>> @@ -42,6 +42,7 @@
>>    * @sequence_out: a sequence counter for output queue
>>    * @tss: timestamp metadata
>>    * @metadata_idx: index for metadata buffer
>> + * @codec: codec type
>>    */
>>     struct iris_inst {
>> @@ -72,6 +73,7 @@ struct iris_inst {
>>       u32                sequence_out;
>>       struct iris_ts_metadata        tss[VIDEO_MAX_FRAME];
>>       u32                metadata_idx;
>> +    u32                codec;
>>   };
>>     #endif
>> diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c
>> b/drivers/media/platform/qcom/iris/iris_vdec.c
>> index 4143acedfc57..cdcfe71f5b96 100644
>> --- a/drivers/media/platform/qcom/iris/iris_vdec.c
>> +++ b/drivers/media/platform/qcom/iris/iris_vdec.c
>> @@ -32,6 +32,7 @@ int iris_vdec_inst_init(struct iris_inst *inst)
>>       f->fmt.pix_mp.width = DEFAULT_WIDTH;
>>       f->fmt.pix_mp.height = DEFAULT_HEIGHT;
>>       f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
>> +    inst->codec = f->fmt.pix_mp.pixelformat;
>>       f->fmt.pix_mp.num_planes = 1;
>>       f->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
>>       f->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst,
>> BUF_INPUT);
>> @@ -67,14 +68,67 @@ void iris_vdec_inst_deinit(struct iris_inst *inst)
>>       kfree(inst->fmt_src);
>>   }
>>   +static const struct iris_fmt iris_vdec_formats[] = {
>> +    [IRIS_FMT_H264] = {
>> +        .pixfmt = V4L2_PIX_FMT_H264,
>> +        .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
>> +    },
>> +    [IRIS_FMT_HEVC] = {
>> +        .pixfmt = V4L2_PIX_FMT_HEVC,
>> +        .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
>> +    },
>> +    [IRIS_FMT_VP9] = {
>> +        .pixfmt = V4L2_PIX_FMT_VP9,
>> +        .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
>> +    },
>> +};
>> +
>> +static const struct iris_fmt *
>> +find_format(struct iris_inst *inst, u32 pixfmt, u32 type)
>> +{
>> +    const struct iris_fmt *fmt = iris_vdec_formats;
>> +    unsigned int size = ARRAY_SIZE(iris_vdec_formats);
>> +    unsigned int i;
> 
> Slightly neater as a reverse christmas tree.
> 
Noted.
>> +
>> +    for (i = 0; i < size; i++) {
>> +        if (fmt[i].pixfmt == pixfmt)
>> +            break;
>> +    }
>> +
>> +    if (i == size || fmt[i].type != type)
>> +        return NULL;
>> +
>> +    return &fmt[i];
>> +}
>> +
>> +static const struct iris_fmt *
>> +find_format_by_index(struct iris_inst *inst, u32 index, u32 type)
>> +{
>> +    const struct iris_fmt *fmt = iris_vdec_formats;
>> +    unsigned int size = ARRAY_SIZE(iris_vdec_formats);
>> +
>> +    if (index >= size || fmt[index].type != type)
>> +        return NULL;
>> +
>> +    return &fmt[index];
>> +}
>> +
>>   int iris_vdec_enum_fmt(struct iris_inst *inst, struct v4l2_fmtdesc *f)
>>   {
>> +    const struct iris_fmt *fmt;
>> +
>>       switch (f->type) {
>>       case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
>> -        f->pixelformat = V4L2_PIX_FMT_H264;
>> +        fmt = find_format_by_index(inst, f->index, f->type);
>> +        if (!fmt)
>> +            return -EINVAL;
>> +
>> +        f->pixelformat = fmt->pixfmt;
>>           f->flags = V4L2_FMT_FLAG_COMPRESSED |
>> V4L2_FMT_FLAG_DYN_RESOLUTION;
>>           break;
>>       case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
>> +        if (f->index)
>> +            return -EINVAL;
>>           f->pixelformat = V4L2_PIX_FMT_NV12;
>>           break;
>>       default:
>> @@ -88,13 +142,15 @@ int iris_vdec_try_fmt(struct iris_inst *inst, struct
>> v4l2_format *f)
>>   {
>>       struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
>>       struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx;
>> +    const struct iris_fmt *fmt;
>>       struct v4l2_format *f_inst;
>>       struct vb2_queue *src_q;
>>         memset(pixmp->reserved, 0, sizeof(pixmp->reserved));
>> +    fmt = find_format(inst, pixmp->pixelformat, f->type);
>>       switch (f->type) {
>>       case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
>> -        if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_H264) {
>> +        if (!fmt) {
>>               f_inst = inst->fmt_src;
>>               f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
>>               f->fmt.pix_mp.height = f_inst->fmt.pix_mp.height;
>> @@ -102,7 +158,7 @@ int iris_vdec_try_fmt(struct iris_inst *inst, struct
>> v4l2_format *f)
>>           }
>>           break;
>>       case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
>> -        if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_NV12) {
>> +        if (!fmt) {
>>               f_inst = inst->fmt_dst;
>>               f->fmt.pix_mp.pixelformat = f_inst->fmt.pix_mp.pixelformat;
>>               f->fmt.pix_mp.width = f_inst->fmt.pix_mp.width;
>> @@ -145,13 +201,14 @@ int iris_vdec_s_fmt(struct iris_inst *inst, struct
>> v4l2_format *f)
>>         switch (f->type) {
>>       case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
>> -        if (f->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_H264)
>> +        if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
>>               return -EINVAL;
>>             fmt = inst->fmt_src;
>>           fmt->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
>> -
>> -        codec_align = DEFAULT_CODEC_ALIGNMENT;
>> +        fmt->fmt.pix_mp.pixelformat = f->fmt.pix_mp.pixelformat;
>> +        inst->codec = fmt->fmt.pix_mp.pixelformat;
>> +        codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> 
> For preference I'd choose a default assignment and then an if for whatever
> you choose as non-default.
> 
> codec_align = 16;
> if (inst->codec == V4L2_PIX_FMT_HEVC)
>     codec_align = 32;
> 
I don't see any issue with using ternary operator here, since it's just a
simple value selection.
>>           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);
>>           fmt->fmt.pix_mp.num_planes = 1;
>> diff --git a/drivers/media/platform/qcom/iris/iris_vdec.h
>> b/drivers/media/platform/qcom/iris/iris_vdec.h
>> index b24932dc511a..cd7aab66dc7c 100644
>> --- a/drivers/media/platform/qcom/iris/iris_vdec.h
>> +++ b/drivers/media/platform/qcom/iris/iris_vdec.h
>> @@ -8,6 +8,17 @@
>>     struct iris_inst;
>>   +enum iris_fmt_type {
>> +    IRIS_FMT_H264,
> 
> I persoanlly like to init enums = 0,
> 
we are initializing enum only if it starts with non zero value in the
driver code currently so would like to follow the same practise, unless
there is strong concern here.
> 
>> +    IRIS_FMT_HEVC,
>> +    IRIS_FMT_VP9,
>> +};
>> +
>> +struct iris_fmt {
>> +    u32 pixfmt;
>> +    u32 type;
>> +};
>> +
>>   int iris_vdec_inst_init(struct iris_inst *inst);
>>   void iris_vdec_inst_deinit(struct iris_inst *inst);
>>   int iris_vdec_enum_fmt(struct iris_inst *inst, struct v4l2_fmtdesc *f);
>> diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c
>> b/drivers/media/platform/qcom/iris/iris_vidc.c
>> index ca0f4e310f77..6a6afa15b647 100644
>> --- a/drivers/media/platform/qcom/iris/iris_vidc.c
>> +++ b/drivers/media/platform/qcom/iris/iris_vidc.c
>> @@ -249,9 +249,6 @@ static int iris_enum_fmt(struct file *filp, void *fh,
>> struct v4l2_fmtdesc *f)
>>   {
>>       struct iris_inst *inst = iris_get_inst(filp, NULL);
>>   -    if (f->index)
>> -        return -EINVAL;
>> -
>>       return iris_vdec_enum_fmt(inst, f);
>>   }
>>   
> 
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>

Thanks,
Dikshita

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 02/12] media: iris: Add platform capabilities for HEVC and VP9 decoders
  2025-03-06  0:28   ` Bryan O'Donoghue
@ 2025-03-06 12:07     ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 12:07 UTC (permalink / raw)
  To: Bryan O'Donoghue, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel



On 3/6/2025 5:58 AM, Bryan O'Donoghue wrote:
> On 05/03/2025 10:43, Dikshita Agarwal wrote:
>> Add platform capabilities for HEVC and VP9 codecs in decoder driver
>> with related hooks.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>>   drivers/media/platform/qcom/iris/iris_ctrls.c | 28 ++++++-
>>   .../qcom/iris/iris_hfi_gen2_command.c         | 30 ++++++-
>>   .../qcom/iris/iris_hfi_gen2_defines.h         |  1 +
>>   .../qcom/iris/iris_hfi_gen2_response.c        | 36 ++++++++-
>>   .../platform/qcom/iris/iris_platform_common.h |  9 ++-
>>   .../platform/qcom/iris/iris_platform_sm8550.c | 80 ++++++++++++++++++-
>>   6 files changed, 170 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c
>> b/drivers/media/platform/qcom/iris/iris_ctrls.c
>> index b690578256d5..fb2b818c7c5c 100644
>> --- a/drivers/media/platform/qcom/iris/iris_ctrls.c
>> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
>> @@ -20,9 +20,19 @@ static enum platform_inst_fw_cap_type
>> iris_get_cap_id(u32 id)
>>       case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
>>           return DEBLOCK;
>>       case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
>> -        return PROFILE;
>> +        return PROFILE_H264;
>> +    case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
>> +        return PROFILE_HEVC;
>> +    case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
>> +        return PROFILE_VP9;
>>       case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
>> -        return LEVEL;
>> +        return LEVEL_H264;
>> +    case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
>> +        return LEVEL_HEVC;
>> +    case V4L2_CID_MPEG_VIDEO_VP9_LEVEL:
>> +        return LEVEL_VP9;
>> +    case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
>> +        return TIER;
>>       default:
>>           return INST_FW_CAP_MAX;
>>       }
>> @@ -36,10 +46,20 @@ static u32 iris_get_v4l2_id(enum
>> platform_inst_fw_cap_type cap_id)
>>       switch (cap_id) {
>>       case DEBLOCK:
>>           return V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER;
>> -    case PROFILE:
>> +    case PROFILE_H264:
>>           return V4L2_CID_MPEG_VIDEO_H264_PROFILE;
>> -    case LEVEL:
>> +    case PROFILE_HEVC:
>> +        return V4L2_CID_MPEG_VIDEO_HEVC_PROFILE;
>> +    case PROFILE_VP9:
>> +        return V4L2_CID_MPEG_VIDEO_VP9_PROFILE;
>> +    case LEVEL_H264:
>>           return V4L2_CID_MPEG_VIDEO_H264_LEVEL;
>> +    case LEVEL_HEVC:
>> +        return V4L2_CID_MPEG_VIDEO_HEVC_LEVEL;
>> +    case LEVEL_VP9:
>> +        return V4L2_CID_MPEG_VIDEO_VP9_LEVEL;
>> +    case TIER:
>> +        return V4L2_CID_MPEG_VIDEO_HEVC_TIER;
>>       default:
>>           return 0;
>>       }
>> 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 beaf3a051d7c..a3ebcda9a2ba 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
>> @@ -309,7 +309,20 @@ static int iris_hfi_gen2_set_profile(struct
>> iris_inst *inst)
>>   {
>>       struct iris_inst_hfi_gen2 *inst_hfi_gen2 =
>> to_iris_inst_hfi_gen2(inst);
>>       u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
>> -    u32 profile = inst->fw_caps[PROFILE].value;
>> +    u32 profile;
>> +
>> +    switch (inst->codec) {
>> +    case V4L2_PIX_FMT_HEVC:
>> +        profile = inst->fw_caps[PROFILE_HEVC].value;
>> +        break;
>> +    case V4L2_PIX_FMT_VP9:
>> +        profile = inst->fw_caps[PROFILE_VP9].value;
>> +        break;
>> +    case V4L2_PIX_FMT_H264:
>> +    default:
>> +        profile = inst->fw_caps[PROFILE_H264].value;
>> +        break;
> 
> Following up on my previous comment about returning a 0 default and running
> with it instead of erroring it - you then treat default == 0 @ inst->codec
> assigned in iris_hfi_gen[1|2]_sys_init as H264.
> 
> In fact why have a default by the time you get this this point in the code
> anyway ?
> 
> Just chuck out parameters which aren't expected as errors and then don't
> bother with these defaults.
> 
Ack, as mentioned in previous comment, will remove the default case.
>> +    }
>>         inst_hfi_gen2->src_subcr_params.profile = profile;
>>   @@ -326,7 +339,20 @@ static int iris_hfi_gen2_set_level(struct
>> iris_inst *inst)
>>   {
>>       struct iris_inst_hfi_gen2 *inst_hfi_gen2 =
>> to_iris_inst_hfi_gen2(inst);
>>       u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
>> -    u32 level = inst->fw_caps[LEVEL].value;
>> +    u32 level;
>> +
>> +    switch (inst->codec) {
>> +    case V4L2_PIX_FMT_HEVC:
>> +        level = inst->fw_caps[LEVEL_HEVC].value;
>> +        break;
>> +    case V4L2_PIX_FMT_VP9:
>> +        level = inst->fw_caps[LEVEL_VP9].value;
>> +        break;
>> +    case V4L2_PIX_FMT_H264:
>> +    default:
>> +        level = inst->fw_caps[LEVEL_H264].value;
>> +        break;
>> +    }
>>         inst_hfi_gen2->src_subcr_params.level = level;
>>   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 2fcf7914b70f..48c507a1ec27 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
>> @@ -46,6 +46,7 @@
>>   #define HFI_PROP_CROP_OFFSETS            0x03000105
>>   #define HFI_PROP_PROFILE            0x03000107
>>   #define HFI_PROP_LEVEL                0x03000108
>> +#define HFI_PROP_TIER                0x03000109
>>   #define HFI_PROP_STAGE                0x0300010a
>>   #define HFI_PROP_PIPE                0x0300010b
>>   #define HFI_PROP_LUMA_CHROMA_BIT_DEPTH        0x0300010f
> 
> These seem like - probably bitfields ?
> 
> Could we get the bits in a follow on patch/series ?
> 
I didn't understand this comment.
These are not bit fields, but HFI macros, which we use to communicate with
firmware.
>> 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 b75a01641d5d..809bf0f238bd 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
>> @@ -563,8 +563,22 @@ static void
>> iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
>>       inst->crop.width = pixmp_ip->width -
>>           ((subsc_params.crop_offsets[1] >> 16) & 0xFFFF) - inst->crop.left;
>>   -    inst->fw_caps[PROFILE].value = subsc_params.profile;
>> -    inst->fw_caps[LEVEL].value = subsc_params.level;
>> +    switch (inst->codec) {
>> +    case V4L2_PIX_FMT_HEVC:
>> +        inst->fw_caps[PROFILE_HEVC].value = subsc_params.profile;
>> +        inst->fw_caps[LEVEL_HEVC].value = subsc_params.level;
>> +        break;
>> +    case V4L2_PIX_FMT_VP9:
>> +        inst->fw_caps[PROFILE_VP9].value = subsc_params.profile;
>> +        inst->fw_caps[LEVEL_VP9].value = subsc_params.level;
>> +        break;
>> +    case V4L2_PIX_FMT_H264:
>> +    default:
>> +        inst->fw_caps[PROFILE_H264].value = subsc_params.profile;
>> +        inst->fw_caps[LEVEL_H264].value = subsc_params.level;
>> +        break;
>> +    }
>> +
>>       inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
>>         if (subsc_params.bit_depth != BIT_DEPTH_8 ||
>> @@ -791,8 +805,22 @@ static void
>> iris_hfi_gen2_init_src_change_param(struct iris_inst *inst)
>>                            full_range, video_format,
>>                            video_signal_type_present_flag);
>>   -    subsc_params->profile = inst->fw_caps[PROFILE].value;
>> -    subsc_params->level = inst->fw_caps[LEVEL].value;
>> +    switch (inst->codec) {
>> +    case V4L2_PIX_FMT_HEVC:
>> +        subsc_params->profile = inst->fw_caps[PROFILE_HEVC].value;
>> +        subsc_params->level = inst->fw_caps[LEVEL_HEVC].value;
>> +        break;
>> +    case V4L2_PIX_FMT_VP9:
>> +        subsc_params->profile = inst->fw_caps[PROFILE_VP9].value;
>> +        subsc_params->level = inst->fw_caps[LEVEL_VP9].value;
>> +        break;
>> +    case V4L2_PIX_FMT_H264:
>> +    default:
>> +        subsc_params->profile = inst->fw_caps[PROFILE_H264].value;
>> +        subsc_params->level = inst->fw_caps[LEVEL_H264].value;
>> +        break;
>> +    }
>> +
>>       subsc_params->pic_order_cnt = inst->fw_caps[POC].value;
>>       subsc_params->bit_depth = inst->fw_caps[BIT_DEPTH].value;
>>       if (inst->fw_caps[CODED_FRAMES].value ==
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h
>> b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> index f6b15d2805fb..67204cddd44a 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> @@ -78,8 +78,12 @@ struct platform_inst_caps {
>>   };
>>     enum platform_inst_fw_cap_type {
>> -    PROFILE = 1,
>> -    LEVEL,
>> +    PROFILE_H264 = 1,
>> +    PROFILE_HEVC,
>> +    PROFILE_VP9,
>> +    LEVEL_H264,
>> +    LEVEL_HEVC,
>> +    LEVEL_VP9,
>>       INPUT_BUF_HOST_MAX_COUNT,
>>       STAGE,
>>       PIPE,
>> @@ -88,6 +92,7 @@ enum platform_inst_fw_cap_type {
>>       BIT_DEPTH,
>>       RAP_FRAME,
>>       DEBLOCK,
>> +    TIER,
>>       INST_FW_CAP_MAX,
>>   };
>>   diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> index 35d278996c43..29bc50785da5 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> @@ -14,7 +14,7 @@
>>     static struct platform_inst_fw_cap inst_fw_cap_sm8550[] = {
>>       {
>> -        .cap_id = PROFILE,
>> +        .cap_id = PROFILE_H264,
>>           .min = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE,
>>           .max = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH,
>>           .step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
>> @@ -28,7 +28,29 @@ static struct platform_inst_fw_cap
>> inst_fw_cap_sm8550[] = {
>>           .set = iris_set_u32_enum,
>>       },
>>       {
>> -        .cap_id = LEVEL,
>> +        .cap_id = PROFILE_HEVC,
>> +        .min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
>> +        .max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE,
>> +        .step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE),
>> +        .value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
>> +        .hfi_id = HFI_PROP_PROFILE,
>> +        .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
>> +        .set = iris_set_u32_enum,
>> +    },
>> +    {
>> +        .cap_id = PROFILE_VP9,
>> +        .min = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
>> +        .max = V4L2_MPEG_VIDEO_VP9_PROFILE_2,
>> +        .step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_0) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_PROFILE_2),
>> +        .value = V4L2_MPEG_VIDEO_VP9_PROFILE_0,
>> +        .hfi_id = HFI_PROP_PROFILE,
>> +        .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
>> +        .set = iris_set_u32_enum,
>> +    },
>> +    {
>> +        .cap_id = LEVEL_H264,
>>           .min = V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
>>           .max = V4L2_MPEG_VIDEO_H264_LEVEL_6_2,
>>           .step_or_mask = BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
>> @@ -56,6 +78,60 @@ static struct platform_inst_fw_cap
>> inst_fw_cap_sm8550[] = {
>>           .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
>>           .set = iris_set_u32_enum,
>>       },
>> +    {
>> +        .cap_id = LEVEL_HEVC,
>> +        .min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
>> +        .max = V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
>> +        .step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2),
>> +        .value = V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1,
>> +        .hfi_id = HFI_PROP_LEVEL,
>> +        .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
>> +        .set = iris_set_u32_enum,
>> +    },
>> +    {
>> +        .cap_id = LEVEL_VP9,
>> +        .min = V4L2_MPEG_VIDEO_VP9_LEVEL_1_0,
>> +        .max = V4L2_MPEG_VIDEO_VP9_LEVEL_6_0,
>> +        .step_or_mask = BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_0) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_1_1) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_0) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_2_1) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_0) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_3_1) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_0) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_4_1) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_0) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_1) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_5_2) |
>> +                BIT(V4L2_MPEG_VIDEO_VP9_LEVEL_6_0),
>> +        .value = V4L2_MPEG_VIDEO_VP9_LEVEL_6_0,
>> +        .hfi_id = HFI_PROP_LEVEL,
>> +        .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
>> +        .set = iris_set_u32_enum,
>> +    },
>> +    {
>> +        .cap_id = TIER,
>> +        .min = V4L2_MPEG_VIDEO_HEVC_TIER_MAIN,
>> +        .max = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
>> +        .step_or_mask = BIT(V4L2_MPEG_VIDEO_HEVC_TIER_MAIN) |
>> +                BIT(V4L2_MPEG_VIDEO_HEVC_TIER_HIGH),
>> +        .value = V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
>> +        .hfi_id = HFI_PROP_TIER,
>> +        .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
>> +        .set = iris_set_u32_enum,
>> +    },
>>       {
>>           .cap_id = INPUT_BUF_HOST_MAX_COUNT,
>>           .min = DEFAULT_MAX_HOST_BUF_COUNT,
> 
> Other than those nits
> 
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>

Thanks,
Dikshita

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 03/12] media: iris: Set mandatory properties for HEVC and VP9 decoders.
  2025-03-05 14:00   ` neil.armstrong
@ 2025-03-06 12:10     ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 12:10 UTC (permalink / raw)
  To: neil.armstrong, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel



On 3/5/2025 7:30 PM, neil.armstrong@linaro.org wrote:
> On 05/03/2025 11:43, Dikshita Agarwal wrote:
>> Subscribe and set mandatory properties to the firmware for HEVC and VP9
>> decoders.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>>   .../platform/qcom/iris/iris_hfi_common.h      |  1 +
>>   .../qcom/iris/iris_hfi_gen1_command.c         |  4 +-
>>   .../qcom/iris/iris_hfi_gen2_command.c         | 83 +++++++++++++++++--
>>   .../qcom/iris/iris_hfi_gen2_response.c        |  7 ++
>>   .../platform/qcom/iris/iris_platform_common.h | 16 +++-
>>   .../platform/qcom/iris/iris_platform_sm8250.c |  4 +-
>>   .../platform/qcom/iris/iris_platform_sm8550.c | 61 ++++++++++++--
>>   7 files changed, 151 insertions(+), 25 deletions(-)
>>
>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h
>> b/drivers/media/platform/qcom/iris/iris_hfi_common.h
>> index b2c541367fc6..9e6aadb83783 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h
>> @@ -140,6 +140,7 @@ struct hfi_subscription_params {
>>       u32    color_info;
>>       u32    profile;
>>       u32    level;
>> +    u32    tier;
>>   };
>>     u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);
>> 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 1e774b058ab9..a160ae915886 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> @@ -784,8 +784,8 @@ static int
>> iris_hfi_gen1_session_set_config_params(struct iris_inst *inst, u32 p
>>               iris_hfi_gen1_set_bufsize},
>>       };
>>   -    config_params = core->iris_platform_data->input_config_params;
>> -    config_params_size =
>> core->iris_platform_data->input_config_params_size;
>> +    config_params = core->iris_platform_data->input_config_params_default;
>> +    config_params_size =
>> core->iris_platform_data->input_config_params_default_size;
>>         if (V4L2_TYPE_IS_OUTPUT(plane)) {
>>           for (i = 0; i < config_params_size; i++) {
>> 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 a3ebcda9a2ba..5b4c89184297 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
>> @@ -192,7 +192,7 @@ static int iris_hfi_gen2_set_crop_offsets(struct
>> iris_inst *inst)
>>                             sizeof(u64));
>>   }
>>   -static int iris_hfi_gen2_set_bit_dpeth(struct iris_inst *inst)
>> +static int iris_hfi_gen2_set_bit_depth(struct iris_inst *inst)
> 
> Please move typo fixes to separate patch with Fixes tag.
> 
> Neil
> 
Ack.

Thanks,
Dikshita
>>   {
>>       struct iris_inst_hfi_gen2 *inst_hfi_gen2 =
>> to_iris_inst_hfi_gen2(inst);
>>       u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
>> @@ -407,6 +407,23 @@ static int
>> iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst)
>>                             sizeof(u64));
>>   }
>>   +static int iris_hfi_gen2_set_tier(struct iris_inst *inst)
>> +{
>> +    struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
>> +    u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
>> +    u32 tier = inst->fw_caps[TIER].value;
>> +
>> +    inst_hfi_gen2->src_subcr_params.tier = tier;
>> +
>> +    return iris_hfi_gen2_session_set_property(inst,
>> +                          HFI_PROP_TIER,
>> +                          HFI_HOST_FLAGS_NONE,
>> +                          port,
>> +                          HFI_PAYLOAD_U32_ENUM,
>> +                          &tier,
>> +                          sizeof(u32));
>> +}
>> +
>>   static int iris_hfi_gen2_session_set_config_params(struct iris_inst
>> *inst, u32 plane)
>>   {
>>       struct iris_core *core = inst->core;
>> @@ -418,7 +435,7 @@ static int
>> iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
>>           {HFI_PROP_BITSTREAM_RESOLUTION,      
>> iris_hfi_gen2_set_bitstream_resolution   },
>>           {HFI_PROP_CROP_OFFSETS,              
>> iris_hfi_gen2_set_crop_offsets           },
>>           {HFI_PROP_CODED_FRAMES,              
>> iris_hfi_gen2_set_coded_frames           },
>> -        {HFI_PROP_LUMA_CHROMA_BIT_DEPTH,     
>> iris_hfi_gen2_set_bit_dpeth              },
>> +        {HFI_PROP_LUMA_CHROMA_BIT_DEPTH,     
>> iris_hfi_gen2_set_bit_depth              },
>>           {HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>> iris_hfi_gen2_set_min_output_count       },
>>           {HFI_PROP_PIC_ORDER_CNT_TYPE,        
>> iris_hfi_gen2_set_picture_order_count    },
>>           {HFI_PROP_SIGNAL_COLOR_INFO,         
>> iris_hfi_gen2_set_colorspace             },
>> @@ -426,11 +443,25 @@ static int
>> iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
>>           {HFI_PROP_LEVEL,                     
>> iris_hfi_gen2_set_level                  },
>>           {HFI_PROP_COLOR_FORMAT,              
>> iris_hfi_gen2_set_colorformat            },
>>           {HFI_PROP_LINEAR_STRIDE_SCANLINE,    
>> iris_hfi_gen2_set_linear_stride_scanline },
>> +        {HFI_PROP_TIER,                      
>> iris_hfi_gen2_set_tier                   },
>>       };
>>         if (V4L2_TYPE_IS_OUTPUT(plane)) {
>> -        config_params = core->iris_platform_data->input_config_params;
>> -        config_params_size =
>> core->iris_platform_data->input_config_params_size;
>> +        if (inst->codec == V4L2_PIX_FMT_H264) {
>> +            config_params =
>> core->iris_platform_data->input_config_params_default;
>> +            config_params_size =
>> +                core->iris_platform_data->input_config_params_default_size;
>> +        } else if (inst->codec == V4L2_PIX_FMT_HEVC) {
>> +            config_params =
>> core->iris_platform_data->input_config_params_hevc;
>> +            config_params_size =
>> +                core->iris_platform_data->input_config_params_hevc_size;
>> +        } else if (inst->codec == V4L2_PIX_FMT_VP9) {
>> +            config_params =
>> core->iris_platform_data->input_config_params_vp9;
>> +            config_params_size =
>> +                core->iris_platform_data->input_config_params_vp9_size;
>> +        } else {
>> +            return -EINVAL;
>> +        }
>>       } else {
>>           config_params = core->iris_platform_data->output_config_params;
>>           config_params_size =
>> core->iris_platform_data->output_config_params_size;
>> @@ -600,8 +631,21 @@ static int
>> iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>>           return 0;
>>       }
>>   -    change_param = core->iris_platform_data->input_config_params;
>> -    change_param_size = core->iris_platform_data->input_config_params_size;
>> +    if (inst->codec == V4L2_PIX_FMT_H264) {
>> +        change_param =
>> core->iris_platform_data->input_config_params_default;
>> +        change_param_size =
>> +            core->iris_platform_data->input_config_params_default_size;
>> +    } else if (inst->codec == V4L2_PIX_FMT_HEVC) {
>> +        change_param = core->iris_platform_data->input_config_params_hevc;
>> +        change_param_size =
>> +            core->iris_platform_data->input_config_params_hevc_size;
>> +    } else if (inst->codec == V4L2_PIX_FMT_VP9) {
>> +        change_param = core->iris_platform_data->input_config_params_vp9;
>> +        change_param_size =
>> +            core->iris_platform_data->input_config_params_vp9_size;
>> +    } else {
>> +        return -EINVAL;
>> +    }
>>         payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
>>   @@ -648,6 +692,11 @@ static int
>> iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>>                   payload_size = sizeof(u32);
>>                   payload_type = HFI_PAYLOAD_U32;
>>                   break;
>> +            case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
>> +                payload[0] = subsc_params.bit_depth;
>> +                payload_size = sizeof(u32);
>> +                payload_type = HFI_PAYLOAD_U32;
>> +                break;
>>               case HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT:
>>                   payload[0] = subsc_params.fw_min_count;
>>                   payload_size = sizeof(u32);
>> @@ -673,6 +722,11 @@ static int
>> iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>>                   payload_size = sizeof(u32);
>>                   payload_type = HFI_PAYLOAD_U32;
>>                   break;
>> +            case HFI_PROP_TIER:
>> +                payload[0] = subsc_params.tier;
>> +                payload_size = sizeof(u32);
>> +                payload_type = HFI_PAYLOAD_U32;
>> +                break;
>>               default:
>>                   prop_type = 0;
>>                   ret = -EINVAL;
>> @@ -709,8 +763,21 @@ static int iris_hfi_gen2_subscribe_property(struct
>> iris_inst *inst, u32 plane)
>>           subscribe_prop_size =
>> core->iris_platform_data->dec_input_prop_size;
>>           subcribe_prop = core->iris_platform_data->dec_input_prop;
>>       } else {
>> -        subscribe_prop_size =
>> core->iris_platform_data->dec_output_prop_size;
>> -        subcribe_prop = core->iris_platform_data->dec_output_prop;
>> +        if (inst->codec == V4L2_PIX_FMT_H264) {
>> +            subcribe_prop = core->iris_platform_data->dec_output_prop_avc;
>> +            subscribe_prop_size =
>> +                core->iris_platform_data->dec_output_prop_avc_size;
>> +        } else if (inst->codec == V4L2_PIX_FMT_HEVC) {
>> +            subcribe_prop = core->iris_platform_data->dec_output_prop_hevc;
>> +            subscribe_prop_size =
>> +                core->iris_platform_data->dec_output_prop_hevc_size;
>> +        } else if (inst->codec == V4L2_PIX_FMT_VP9) {
>> +            subcribe_prop = core->iris_platform_data->dec_output_prop_vp9;
>> +            subscribe_prop_size =
>> +                core->iris_platform_data->dec_output_prop_vp9_size;
>> +        } else {
>> +            return -EINVAL;
>> +        }
>>       }
>>         for (i = 0; i < subscribe_prop_size; i++)
>> 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 809bf0f238bd..6846311a26c3 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
>> @@ -580,6 +580,7 @@ static void
>> iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
>>       }
>>         inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
>> +    inst->fw_caps[TIER].value = subsc_params.tier;
>>         if (subsc_params.bit_depth != BIT_DEPTH_8 ||
>>           !(subsc_params.coded_frames & HFI_BITMASK_FRAME_MBS_ONLY_FLAG)) {
>> @@ -664,6 +665,9 @@ static int
>> iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
>>           inst_hfi_gen2->src_subcr_params.crop_offsets[0] = pkt->payload[0];
>>           inst_hfi_gen2->src_subcr_params.crop_offsets[1] = pkt->payload[1];
>>           break;
>> +    case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
>> +        inst_hfi_gen2->src_subcr_params.bit_depth = pkt->payload[0];
>> +        break;
>>       case HFI_PROP_CODED_FRAMES:
>>           inst_hfi_gen2->src_subcr_params.coded_frames = pkt->payload[0];
>>           break;
>> @@ -682,6 +686,9 @@ static int
>> iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
>>       case HFI_PROP_LEVEL:
>>           inst_hfi_gen2->src_subcr_params.level = pkt->payload[0];
>>           break;
>> +    case HFI_PROP_TIER:
>> +        inst_hfi_gen2->src_subcr_params.tier = pkt->payload[0];
>> +        break;
>>       case HFI_PROP_PICTURE_TYPE:
>>           inst_hfi_gen2->hfi_frame_info.picture_type = pkt->payload[0];
>>           break;
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h
>> b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> index 67204cddd44a..433ce9b00c68 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> @@ -174,14 +174,22 @@ struct iris_platform_data {
>>       u32 num_vpp_pipe;
>>       u32 max_session_count;
>>       u32 max_core_mbpf;
>> -    const u32 *input_config_params;
>> -    unsigned int input_config_params_size;
>> +    const u32 *input_config_params_default;
>> +    unsigned int input_config_params_default_size;
>> +    const u32 *input_config_params_hevc;
>> +    unsigned int input_config_params_hevc_size;
>> +    const u32 *input_config_params_vp9;
>> +    unsigned int input_config_params_vp9_size;
>>       const u32 *output_config_params;
>>       unsigned int output_config_params_size;
>>       const u32 *dec_input_prop;
>>       unsigned int dec_input_prop_size;
>> -    const u32 *dec_output_prop;
>> -    unsigned int dec_output_prop_size;
>> +    const u32 *dec_output_prop_avc;
>> +    unsigned int dec_output_prop_avc_size;
>> +    const u32 *dec_output_prop_hevc;
>> +    unsigned int dec_output_prop_hevc_size;
>> +    const u32 *dec_output_prop_vp9;
>> +    unsigned int dec_output_prop_vp9_size;
>>       const u32 *dec_ip_int_buf_tbl;
>>       unsigned int dec_ip_int_buf_tbl_size;
>>       const u32 *dec_op_int_buf_tbl;
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> index 5c86fd7b7b6f..5f74e57f04fc 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> @@ -137,9 +137,9 @@ struct iris_platform_data sm8250_data = {
>>       .num_vpp_pipe = 4,
>>       .max_session_count = 16,
>>       .max_core_mbpf = (8192 * 4352) / 256,
>> -    .input_config_params =
>> +    .input_config_params_default =
>>           sm8250_vdec_input_config_param_default,
>> -    .input_config_params_size =
>> +    .input_config_params_default_size =
>>           ARRAY_SIZE(sm8250_vdec_input_config_param_default),
>>         .dec_ip_int_buf_tbl = sm8250_dec_ip_int_buf_tbl,
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> index 29bc50785da5..779c71885f51 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> @@ -254,9 +254,10 @@ static struct tz_cp_config tz_cp_config_sm8550 = {
>>       .cp_nonpixel_size = 0x24800000,
>>   };
>>   -static const u32 sm8550_vdec_input_config_params[] = {
>> +static const u32 sm8550_vdec_input_config_params_default[] = {
>>       HFI_PROP_BITSTREAM_RESOLUTION,
>>       HFI_PROP_CROP_OFFSETS,
>> +    HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
>>       HFI_PROP_CODED_FRAMES,
>>       HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>>       HFI_PROP_PIC_ORDER_CNT_TYPE,
>> @@ -265,6 +266,26 @@ static const u32 sm8550_vdec_input_config_params[] = {
>>       HFI_PROP_SIGNAL_COLOR_INFO,
>>   };
>>   +static const u32 sm8550_vdec_input_config_param_hevc[] = {
>> +    HFI_PROP_BITSTREAM_RESOLUTION,
>> +    HFI_PROP_CROP_OFFSETS,
>> +    HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
>> +    HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>> +    HFI_PROP_PROFILE,
>> +    HFI_PROP_LEVEL,
>> +    HFI_PROP_TIER,
>> +    HFI_PROP_SIGNAL_COLOR_INFO,
>> +};
>> +
>> +static const u32 sm8550_vdec_input_config_param_vp9[] = {
>> +    HFI_PROP_BITSTREAM_RESOLUTION,
>> +    HFI_PROP_CROP_OFFSETS,
>> +    HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
>> +    HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>> +    HFI_PROP_PROFILE,
>> +    HFI_PROP_LEVEL,
>> +};
>> +
>>   static const u32 sm8550_vdec_output_config_params[] = {
>>       HFI_PROP_COLOR_FORMAT,
>>       HFI_PROP_LINEAR_STRIDE_SCANLINE,
>> @@ -274,11 +295,19 @@ static const u32
>> sm8550_vdec_subscribe_input_properties[] = {
>>       HFI_PROP_NO_OUTPUT,
>>   };
>>   -static const u32 sm8550_vdec_subscribe_output_properties[] = {
>> +static const u32 sm8550_vdec_subscribe_output_properties_avc[] = {
>>       HFI_PROP_PICTURE_TYPE,
>>       HFI_PROP_CABAC_SESSION,
>>   };
>>   +static const u32 sm8550_vdec_subscribe_output_properties_hevc[] = {
>> +    HFI_PROP_PICTURE_TYPE,
>> +};
>> +
>> +static const u32 sm8550_vdec_subscribe_output_properties_vp9[] = {
>> +    HFI_PROP_PICTURE_TYPE,
>> +};
>> +
>>   static const u32 sm8550_dec_ip_int_buf_tbl[] = {
>>       BUF_BIN,
>>       BUF_COMV,
>> @@ -322,19 +351,33 @@ struct iris_platform_data sm8550_data = {
>>       .num_vpp_pipe = 4,
>>       .max_session_count = 16,
>>       .max_core_mbpf = ((8192 * 4352) / 256) * 2,
>> -    .input_config_params =
>> -        sm8550_vdec_input_config_params,
>> -    .input_config_params_size =
>> -        ARRAY_SIZE(sm8550_vdec_input_config_params),
>> +    .input_config_params_default =
>> +        sm8550_vdec_input_config_params_default,
>> +    .input_config_params_default_size =
>> +        ARRAY_SIZE(sm8550_vdec_input_config_params_default),
>> +    .input_config_params_hevc =
>> +        sm8550_vdec_input_config_param_hevc,
>> +    .input_config_params_hevc_size =
>> +        ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
>> +    .input_config_params_vp9 =
>> +        sm8550_vdec_input_config_param_vp9,
>> +    .input_config_params_vp9_size =
>> +        ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
>>       .output_config_params =
>>           sm8550_vdec_output_config_params,
>>       .output_config_params_size =
>>           ARRAY_SIZE(sm8550_vdec_output_config_params),
>>       .dec_input_prop = sm8550_vdec_subscribe_input_properties,
>>       .dec_input_prop_size =
>> ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
>> -    .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>> -    .dec_output_prop_size =
>> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>> -
>> +    .dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
>> +    .dec_output_prop_avc_size =
>> +        ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
>> +    .dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
>> +    .dec_output_prop_hevc_size =
>> +        ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
>> +    .dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
>> +    .dec_output_prop_vp9_size =
>> +        ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
>>       .dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
>>       .dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
>>       .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> 

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 03/12] media: iris: Set mandatory properties for HEVC and VP9 decoders.
  2025-03-06  0:52   ` Bryan O'Donoghue
@ 2025-03-06 12:16     ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 12:16 UTC (permalink / raw)
  To: Bryan O'Donoghue, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel



On 3/6/2025 6:22 AM, Bryan O'Donoghue wrote:
> On 05/03/2025 10:43, Dikshita Agarwal wrote:
>> Subscribe and set mandatory properties to the firmware for HEVC and VP9
>> decoders.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>>   .../platform/qcom/iris/iris_hfi_common.h      |  1 +
>>   .../qcom/iris/iris_hfi_gen1_command.c         |  4 +-
>>   .../qcom/iris/iris_hfi_gen2_command.c         | 83 +++++++++++++++++--
>>   .../qcom/iris/iris_hfi_gen2_response.c        |  7 ++
>>   .../platform/qcom/iris/iris_platform_common.h | 16 +++-
>>   .../platform/qcom/iris/iris_platform_sm8250.c |  4 +-
>>   .../platform/qcom/iris/iris_platform_sm8550.c | 61 ++++++++++++--
>>   7 files changed, 151 insertions(+), 25 deletions(-)
>>
>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h
>> b/drivers/media/platform/qcom/iris/iris_hfi_common.h
>> index b2c541367fc6..9e6aadb83783 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h
>> @@ -140,6 +140,7 @@ struct hfi_subscription_params {
>>       u32    color_info;
>>       u32    profile;
>>       u32    level;
>> +    u32    tier;
>>   };
>>     u32 iris_hfi_get_v4l2_color_primaries(u32 hfi_primaries);
>> 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 1e774b058ab9..a160ae915886 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> @@ -784,8 +784,8 @@ static int
>> iris_hfi_gen1_session_set_config_params(struct iris_inst *inst, u32 p
>>               iris_hfi_gen1_set_bufsize},
>>       };
>>   -    config_params = core->iris_platform_data->input_config_params;
>> -    config_params_size =
>> core->iris_platform_data->input_config_params_size;
>> +    config_params = core->iris_platform_data->input_config_params_default;
>> +    config_params_size =
>> core->iris_platform_data->input_config_params_default_size;
>>         if (V4L2_TYPE_IS_OUTPUT(plane)) {
>>           for (i = 0; i < config_params_size; i++) {
>> 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 a3ebcda9a2ba..5b4c89184297 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
>> @@ -192,7 +192,7 @@ static int iris_hfi_gen2_set_crop_offsets(struct
>> iris_inst *inst)
>>                             sizeof(u64));
>>   }
>>   -static int iris_hfi_gen2_set_bit_dpeth(struct iris_inst *inst)
>> +static int iris_hfi_gen2_set_bit_depth(struct iris_inst *inst)
>>   {
>>       struct iris_inst_hfi_gen2 *inst_hfi_gen2 =
>> to_iris_inst_hfi_gen2(inst);
>>       u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
>> @@ -407,6 +407,23 @@ static int
>> iris_hfi_gen2_set_linear_stride_scanline(struct iris_inst *inst)
>>                             sizeof(u64));
>>   }
>>   +static int iris_hfi_gen2_set_tier(struct iris_inst *inst)
>> +{
>> +    struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
>> +    u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
>> +    u32 tier = inst->fw_caps[TIER].value;
>> +
>> +    inst_hfi_gen2->src_subcr_params.tier = tier;
>> +
>> +    return iris_hfi_gen2_session_set_property(inst,
>> +                          HFI_PROP_TIER,
>> +                          HFI_HOST_FLAGS_NONE,
>> +                          port,
>> +                          HFI_PAYLOAD_U32_ENUM,
>> +                          &tier,
>> +                          sizeof(u32));
>> +}
>> +
>>   static int iris_hfi_gen2_session_set_config_params(struct iris_inst
>> *inst, u32 plane)
>>   {
>>       struct iris_core *core = inst->core;
>> @@ -418,7 +435,7 @@ static int
>> iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
>>           {HFI_PROP_BITSTREAM_RESOLUTION,      
>> iris_hfi_gen2_set_bitstream_resolution   },
>>           {HFI_PROP_CROP_OFFSETS,              
>> iris_hfi_gen2_set_crop_offsets           },
>>           {HFI_PROP_CODED_FRAMES,              
>> iris_hfi_gen2_set_coded_frames           },
>> -        {HFI_PROP_LUMA_CHROMA_BIT_DEPTH,     
>> iris_hfi_gen2_set_bit_dpeth              },
>> +        {HFI_PROP_LUMA_CHROMA_BIT_DEPTH,     
>> iris_hfi_gen2_set_bit_depth              },
>>           {HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>> iris_hfi_gen2_set_min_output_count       },
>>           {HFI_PROP_PIC_ORDER_CNT_TYPE,        
>> iris_hfi_gen2_set_picture_order_count    },
>>           {HFI_PROP_SIGNAL_COLOR_INFO,         
>> iris_hfi_gen2_set_colorspace             },
>> @@ -426,11 +443,25 @@ static int
>> iris_hfi_gen2_session_set_config_params(struct iris_inst *inst, u32 p
>>           {HFI_PROP_LEVEL,                     
>> iris_hfi_gen2_set_level                  },
>>           {HFI_PROP_COLOR_FORMAT,              
>> iris_hfi_gen2_set_colorformat            },
>>           {HFI_PROP_LINEAR_STRIDE_SCANLINE,    
>> iris_hfi_gen2_set_linear_stride_scanline },
>> +        {HFI_PROP_TIER,                      
>> iris_hfi_gen2_set_tier                   },
>>       };
>>         if (V4L2_TYPE_IS_OUTPUT(plane)) {
>> -        config_params = core->iris_platform_data->input_config_params;
>> -        config_params_size =
>> core->iris_platform_data->input_config_params_size;
>> +        if (inst->codec == V4L2_PIX_FMT_H264) {
>> +            config_params =
>> core->iris_platform_data->input_config_params_default;
>> +            config_params_size =
>> +                core->iris_platform_data->input_config_params_default_size;
>> +        } else if (inst->codec == V4L2_PIX_FMT_HEVC) {
>> +            config_params =
>> core->iris_platform_data->input_config_params_hevc;
>> +            config_params_size =
>> +                core->iris_platform_data->input_config_params_hevc_size;
>> +        } else if (inst->codec == V4L2_PIX_FMT_VP9) {
>> +            config_params =
>> core->iris_platform_data->input_config_params_vp9;
>> +            config_params_size =
>> +                core->iris_platform_data->input_config_params_vp9_size;
>> +        } else {
>> +            return -EINVAL;
>> +        }
>>       } else {
>>           config_params = core->iris_platform_data->output_config_params;
>>           config_params_size =
>> core->iris_platform_data->output_config_params_size;
>> @@ -600,8 +631,21 @@ static int
>> iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>>           return 0;
>>       }
>>   -    change_param = core->iris_platform_data->input_config_params;
>> -    change_param_size = core->iris_platform_data->input_config_params_size;
>> +    if (inst->codec == V4L2_PIX_FMT_H264) {
>> +        change_param =
>> core->iris_platform_data->input_config_params_default;
>> +        change_param_size =
>> +            core->iris_platform_data->input_config_params_default_size;
>> +    } else if (inst->codec == V4L2_PIX_FMT_HEVC) {
>> +        change_param = core->iris_platform_data->input_config_params_hevc;
>> +        change_param_size =
>> +            core->iris_platform_data->input_config_params_hevc_size;
>> +    } else if (inst->codec == V4L2_PIX_FMT_VP9) {
>> +        change_param = core->iris_platform_data->input_config_params_vp9;
>> +        change_param_size =
>> +            core->iris_platform_data->input_config_params_vp9_size;
>> +    } else {
>> +        return -EINVAL;
>> +    }
> 
> I'm not a massive fan of multi-clause if/elses - in this particular case
> this will grow and grow into something very sprawling.
> 
Sure, I can move to switch case if that is the preffered choice.
> Grateful if you'd switch() this.
>>>         payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
>>   @@ -648,6 +692,11 @@ static int
>> iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>>                   payload_size = sizeof(u32);
>>                   payload_type = HFI_PAYLOAD_U32;
>>                   break;
>> +            case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
>> +                payload[0] = subsc_params.bit_depth;
>> +                payload_size = sizeof(u32);
>> +                payload_type = HFI_PAYLOAD_U32;
>> +                break;
>>               case HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT:
>>                   payload[0] = subsc_params.fw_min_count;
>>                   payload_size = sizeof(u32);
>> @@ -673,6 +722,11 @@ static int
>> iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
>>                   payload_size = sizeof(u32);
>>                   payload_type = HFI_PAYLOAD_U32;
>>                   break;
>> +            case HFI_PROP_TIER:
>> +                payload[0] = subsc_params.tier;
>> +                payload_size = sizeof(u32);
>> +                payload_type = HFI_PAYLOAD_U32;
>> +                break;
>>               default:
>>                   prop_type = 0;
>>                   ret = -EINVAL;
>> @@ -709,8 +763,21 @@ static int iris_hfi_gen2_subscribe_property(struct
>> iris_inst *inst, u32 plane)
>>           subscribe_prop_size =
>> core->iris_platform_data->dec_input_prop_size;
>>           subcribe_prop = core->iris_platform_data->dec_input_prop;
>>       } else {
>> -        subscribe_prop_size =
>> core->iris_platform_data->dec_output_prop_size;
>> -        subcribe_prop = core->iris_platform_data->dec_output_prop;
>> +        if (inst->codec == V4L2_PIX_FMT_H264) {
>> +            subcribe_prop = core->iris_platform_data->dec_output_prop_avc;
>> +            subscribe_prop_size =
>> +                core->iris_platform_data->dec_output_prop_avc_size;
>> +        } else if (inst->codec == V4L2_PIX_FMT_HEVC) {
>> +            subcribe_prop = core->iris_platform_data->dec_output_prop_hevc;
>> +            subscribe_prop_size =
>> +                core->iris_platform_data->dec_output_prop_hevc_size;
>> +        } else if (inst->codec == V4L2_PIX_FMT_VP9) {
>> +            subcribe_prop = core->iris_platform_data->dec_output_prop_vp9;
>> +            subscribe_prop_size =
>> +                core->iris_platform_data->dec_output_prop_vp9_size;
>> +        } else {
>> +            return -EINVAL;
>> +        }
> 
> Same here, this code will be neater IMO as a swtich statement as it grows
> with new codecs.
> 
>>       }
>>         for (i = 0; i < subscribe_prop_size; i++)
>> 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 809bf0f238bd..6846311a26c3 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
>> @@ -580,6 +580,7 @@ static void
>> iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
>>       }
>>         inst->fw_caps[POC].value = subsc_params.pic_order_cnt;
>> +    inst->fw_caps[TIER].value = subsc_params.tier;
>>         if (subsc_params.bit_depth != BIT_DEPTH_8 ||
>>           !(subsc_params.coded_frames & HFI_BITMASK_FRAME_MBS_ONLY_FLAG)) {
>> @@ -664,6 +665,9 @@ static int
>> iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
>>           inst_hfi_gen2->src_subcr_params.crop_offsets[0] = pkt->payload[0];
>>           inst_hfi_gen2->src_subcr_params.crop_offsets[1] = pkt->payload[1];
>>           break;
>> +    case HFI_PROP_LUMA_CHROMA_BIT_DEPTH:
>> +        inst_hfi_gen2->src_subcr_params.bit_depth = pkt->payload[0];
>> +        break;
>>       case HFI_PROP_CODED_FRAMES:
>>           inst_hfi_gen2->src_subcr_params.coded_frames = pkt->payload[0];
>>           break;
>> @@ -682,6 +686,9 @@ static int
>> iris_hfi_gen2_handle_session_property(struct iris_inst *inst,
>>       case HFI_PROP_LEVEL:
>>           inst_hfi_gen2->src_subcr_params.level = pkt->payload[0];
>>           break;
>> +    case HFI_PROP_TIER:
>> +        inst_hfi_gen2->src_subcr_params.tier = pkt->payload[0];
>> +        break;
>>       case HFI_PROP_PICTURE_TYPE:
>>           inst_hfi_gen2->hfi_frame_info.picture_type = pkt->payload[0];
>>           break;
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h
>> b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> index 67204cddd44a..433ce9b00c68 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
>> @@ -174,14 +174,22 @@ struct iris_platform_data {
>>       u32 num_vpp_pipe;
>>       u32 max_session_count;
>>       u32 max_core_mbpf;
>> -    const u32 *input_config_params;
>> -    unsigned int input_config_params_size;
>> +    const u32 *input_config_params_default;
>> +    unsigned int input_config_params_default_size;
>> +    const u32 *input_config_params_hevc;
>> +    unsigned int input_config_params_hevc_size;
>> +    const u32 *input_config_params_vp9;
>> +    unsigned int input_config_params_vp9_size;
>>       const u32 *output_config_params;
>>       unsigned int output_config_params_size;
>>       const u32 *dec_input_prop;
>>       unsigned int dec_input_prop_size;
>> -    const u32 *dec_output_prop;
>> -    unsigned int dec_output_prop_size;
>> +    const u32 *dec_output_prop_avc;
>> +    unsigned int dec_output_prop_avc_size;
>> +    const u32 *dec_output_prop_hevc;
>> +    unsigned int dec_output_prop_hevc_size;
>> +    const u32 *dec_output_prop_vp9;
>> +    unsigned int dec_output_prop_vp9_size;
>>       const u32 *dec_ip_int_buf_tbl;
>>       unsigned int dec_ip_int_buf_tbl_size;
>>       const u32 *dec_op_int_buf_tbl;
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> index 5c86fd7b7b6f..5f74e57f04fc 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
>> @@ -137,9 +137,9 @@ struct iris_platform_data sm8250_data = {
>>       .num_vpp_pipe = 4,
>>       .max_session_count = 16,
>>       .max_core_mbpf = (8192 * 4352) / 256,
>> -    .input_config_params =
>> +    .input_config_params_default =
>>           sm8250_vdec_input_config_param_default,
>> -    .input_config_params_size =
>> +    .input_config_params_default_size =
>>           ARRAY_SIZE(sm8250_vdec_input_config_param_default),
>>         .dec_ip_int_buf_tbl = sm8250_dec_ip_int_buf_tbl,
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> index 29bc50785da5..779c71885f51 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> @@ -254,9 +254,10 @@ static struct tz_cp_config tz_cp_config_sm8550 = {
>>       .cp_nonpixel_size = 0x24800000,
>>   };
>>   -static const u32 sm8550_vdec_input_config_params[] = {
>> +static const u32 sm8550_vdec_input_config_params_default[] = {
>>       HFI_PROP_BITSTREAM_RESOLUTION,
>>       HFI_PROP_CROP_OFFSETS,
>> +    HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
>>       HFI_PROP_CODED_FRAMES,
>>       HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>>       HFI_PROP_PIC_ORDER_CNT_TYPE,
>> @@ -265,6 +266,26 @@ static const u32 sm8550_vdec_input_config_params[] = {
>>       HFI_PROP_SIGNAL_COLOR_INFO,
>>   };
>>   +static const u32 sm8550_vdec_input_config_param_hevc[] = {
>> +    HFI_PROP_BITSTREAM_RESOLUTION,
>> +    HFI_PROP_CROP_OFFSETS,
>> +    HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
>> +    HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>> +    HFI_PROP_PROFILE,
>> +    HFI_PROP_LEVEL,
>> +    HFI_PROP_TIER,
>> +    HFI_PROP_SIGNAL_COLOR_INFO,
>> +};
>> +
>> +static const u32 sm8550_vdec_input_config_param_vp9[] = {
>> +    HFI_PROP_BITSTREAM_RESOLUTION,
>> +    HFI_PROP_CROP_OFFSETS,
>> +    HFI_PROP_LUMA_CHROMA_BIT_DEPTH,
>> +    HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
>> +    HFI_PROP_PROFILE,
>> +    HFI_PROP_LEVEL,
>> +};
>> +
>>   static const u32 sm8550_vdec_output_config_params[] = {
>>       HFI_PROP_COLOR_FORMAT,
>>       HFI_PROP_LINEAR_STRIDE_SCANLINE,
>> @@ -274,11 +295,19 @@ static const u32
>> sm8550_vdec_subscribe_input_properties[] = {
>>       HFI_PROP_NO_OUTPUT,
>>   };
>>   -static const u32 sm8550_vdec_subscribe_output_properties[] = {
>> +static const u32 sm8550_vdec_subscribe_output_properties_avc[] = {
>>       HFI_PROP_PICTURE_TYPE,
>>       HFI_PROP_CABAC_SESSION,
>>   };
>>   +static const u32 sm8550_vdec_subscribe_output_properties_hevc[] = {
>> +    HFI_PROP_PICTURE_TYPE,
>> +};
>> +
>> +static const u32 sm8550_vdec_subscribe_output_properties_vp9[] = {
>> +    HFI_PROP_PICTURE_TYPE,
>> +};
>> +
>>   static const u32 sm8550_dec_ip_int_buf_tbl[] = {
>>       BUF_BIN,
>>       BUF_COMV,
>> @@ -322,19 +351,33 @@ struct iris_platform_data sm8550_data = {
>>       .num_vpp_pipe = 4,
>>       .max_session_count = 16,
>>       .max_core_mbpf = ((8192 * 4352) / 256) * 2,
> 
> I realise it's not in your changeset but....
> 
> mbpf - mega bytes per frame ?
> 
> What do these numbers capture and how do we validate them ?
> 
> Defines with meaning would be better
> 
> ((MAX_BYTES_PER_THING * NUMBER_OF_LINES_OF_PIXELS) / SOME_ALIGNMENT ) * 2
> 
> or whatever it is those numbers ultimately capture.
> 
mbpf is macroblocks per frame, 8192 * 4352 is 8k resolution
I can add a comment if that helps to understand this better.

Thanks,
Dikshita
>> -    .input_config_params =
>> -        sm8550_vdec_input_config_params,
>> -    .input_config_params_size =
>> -        ARRAY_SIZE(sm8550_vdec_input_config_params),
>> +    .input_config_params_default =
>> +        sm8550_vdec_input_config_params_default,
>> +    .input_config_params_default_size =
>> +        ARRAY_SIZE(sm8550_vdec_input_config_params_default),
>> +    .input_config_params_hevc =
>> +        sm8550_vdec_input_config_param_hevc,
>> +    .input_config_params_hevc_size =
>> +        ARRAY_SIZE(sm8550_vdec_input_config_param_hevc),
>> +    .input_config_params_vp9 =
>> +        sm8550_vdec_input_config_param_vp9,
>> +    .input_config_params_vp9_size =
>> +        ARRAY_SIZE(sm8550_vdec_input_config_param_vp9),
>>       .output_config_params =
>>           sm8550_vdec_output_config_params,
>>       .output_config_params_size =
>>           ARRAY_SIZE(sm8550_vdec_output_config_params),
>>       .dec_input_prop = sm8550_vdec_subscribe_input_properties,
>>       .dec_input_prop_size =
>> ARRAY_SIZE(sm8550_vdec_subscribe_input_properties),
>> -    .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>> -    .dec_output_prop_size =
>> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>> -
>> +    .dec_output_prop_avc = sm8550_vdec_subscribe_output_properties_avc,
>> +    .dec_output_prop_avc_size =
>> +        ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_avc),
>> +    .dec_output_prop_hevc = sm8550_vdec_subscribe_output_properties_hevc,
>> +    .dec_output_prop_hevc_size =
>> +        ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_hevc),
>> +    .dec_output_prop_vp9 = sm8550_vdec_subscribe_output_properties_vp9,
>> +    .dec_output_prop_vp9_size =
>> +        ARRAY_SIZE(sm8550_vdec_subscribe_output_properties_vp9),
>>       .dec_ip_int_buf_tbl = sm8550_dec_ip_int_buf_tbl,
>>       .dec_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_ip_int_buf_tbl),
>>       .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> 
> ---
> bod

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 04/12] media: iris: Add internal buffer calculation for HEVC and VP9 decoders
  2025-03-06  1:05   ` Bryan O'Donoghue
@ 2025-03-06 12:26     ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 12:26 UTC (permalink / raw)
  To: Bryan O'Donoghue, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel



On 3/6/2025 6:35 AM, Bryan O'Donoghue wrote:
> On 05/03/2025 10:43, Dikshita Agarwal wrote:
>> Add internal buffer count and size calculations for HEVC and VP9
>> decoders.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>>   .../media/platform/qcom/iris/iris_buffer.c    |   3 +
>>   .../platform/qcom/iris/iris_vpu_buffer.c      | 397 +++++++++++++++++-
>>   .../platform/qcom/iris/iris_vpu_buffer.h      |  46 +-
>>   3 files changed, 432 insertions(+), 14 deletions(-)
>>
>> diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c
>> b/drivers/media/platform/qcom/iris/iris_buffer.c
>> index e5c5a564fcb8..8c9d5b7fe75c 100644
>> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
>> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
>> @@ -205,6 +205,9 @@ static u32 iris_bitstream_buffer_size(struct
>> iris_inst *inst)
>>       if (num_mbs > NUM_MBS_4K) {
>>           div_factor = 4;
>>           base_res_mbs = caps->max_mbpf;
>> +    } else {
>> +        if (inst->codec == V4L2_PIX_FMT_VP9)
>> +            div_factor = 1;
>>       }
>>         /*
>> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
>> b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
>> index dce25e410d80..13ee93356bcb 100644
>> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
>> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
>> @@ -31,6 +31,42 @@ static u32 hfi_buffer_bin_h264d(u32 frame_width, u32
>> frame_height, u32 num_vpp_p
>>       return size_h264d_hw_bin_buffer(n_aligned_w, n_aligned_h,
>> num_vpp_pipes);
>>   }
>>   +static u32 size_h265d_hw_bin_buffer(u32 frame_width, u32 frame_height,
>> u32 num_vpp_pipes)
>> +{
>> +    u32 product = frame_width * frame_height;
>> +    u32 size_yuv, size_bin_hdr, size_bin_res;
>> +
>> +    size_yuv = (product <= BIN_BUFFER_THRESHOLD) ?
>> +        ((BIN_BUFFER_THRESHOLD * 3) >> 1) : ((product * 3) >> 1);
> 
> When I read this code I have no way of knowing if it makes sense.
> 
> #define BIN_BUFFER_THRESHOLD        (1280 * 736)
> 
> ((BIN_BUFFER_THRESHOLD * 3) >> 1)
> 
> How/why is that correct ?
> 
Bin buffers are intermediate buffers which are used by different sub
hardware blocks within video IP. The calculation of these buffers are
hardware mandated. While we can't explain/justify every factor, these are
based on hardware constraints and validated with firmware requirements,
Software is just coding it up the way hardware specification defines it.
>> +    size_bin_hdr = size_yuv * H265_CABAC_HDR_RATIO_HD_TOT;
>> +    size_bin_res = size_yuv * H265_CABAC_RES_RATIO_HD_TOT;
>> +    size_bin_hdr = ALIGN(size_bin_hdr / num_vpp_pipes, DMA_ALIGNMENT) *
>> num_vpp_pipes;
>> +    size_bin_res = ALIGN(size_bin_res / num_vpp_pipes, DMA_ALIGNMENT) *
>> num_vpp_pipes;
>> +
>> +    return size_bin_hdr + size_bin_res;
>> +}
>> +
>> +static u32 hfi_buffer_bin_vp9d(u32 frame_width, u32 frame_height, u32
>> num_vpp_pipes)
>> +{
>> +    u32 _size_yuv = ALIGN(frame_width, 16) * ALIGN(frame_height, 16) * 3
>> / 2;
>> +    u32 _size = ALIGN(((max_t(u32, _size_yuv, ((BIN_BUFFER_THRESHOLD *
>> 3) >> 1)) *
>> +            VPX_DECODER_FRAME_BIN_HDR_BUDGET /
>> VPX_DECODER_FRAME_BIN_DENOMINATOR *
>> +            VPX_DECODER_FRAME_CONCURENCY_LVL) / num_vpp_pipes),
>> DMA_ALIGNMENT) +
>> +            ALIGN(((max_t(u32, _size_yuv, ((BIN_BUFFER_THRESHOLD * 3) >>
>> 1)) *
>> +            VPX_DECODER_FRAME_BIN_RES_BUDGET /
>> VPX_DECODER_FRAME_BIN_DENOMINATOR *
>> +            VPX_DECODER_FRAME_CONCURENCY_LVL) / num_vpp_pipes),
>> DMA_ALIGNMENT);
> 
> The size_yuv I guess just about makes sense but the _size component here is
> pretty hard to say whether or not this adds up.
> 
> Could you please add some comments to describe the calculations in these
> complex size/alignment clauses.
I believe the MACROS here defines the parameters used in calculation,
beyond this, its again how internal buffers (used by hardware) are
calculated by hardware and defined in the hardware specification.

Thanks,
Dikshita
> 
> ---
> bod

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 05/12] media: iris: Skip destroying internal buffer if not dequeued
  2025-03-05 20:44   ` Dmitry Baryshkov
@ 2025-03-06 12:26     ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 12:26 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: quic_vgarodia, quic_abhinavk, mchehab, hverkuil, linux-media,
	linux-arm-msm, linux-kernel



On 3/6/2025 2:14 AM, Dmitry Baryshkov wrote:
> On Wed, Mar 05, 2025 at 04:13:28PM +0530, Dikshita Agarwal wrote:
>> Firmware might hold the DPB buffers for reference in case of sequence
>> change, so skip destroying buffers for which QUEUED flag is not removed.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> 
> Please add FIxes tag and move closer to the top.
> 
Noted.
>> ---
>>  drivers/media/platform/qcom/iris/iris_buffer.c | 7 +++++++
>>  1 file changed, 7 insertions(+)
>>
>> diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
>> index 8c9d5b7fe75c..305b630ca269 100644
>> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
>> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
>> @@ -399,6 +399,13 @@ int iris_destroy_internal_buffers(struct iris_inst *inst, u32 plane)
>>  	for (i = 0; i < len; i++) {
>>  		buffers = &inst->buffers[internal_buf_type[i]];
>>  		list_for_each_entry_safe(buf, next, &buffers->list, list) {
>> +			/*
>> +			 * skip destroying internal(DPB) buffer if firmware
>> +			 * did not return it.
>> +			 */
>> +			if (buf->attr & BUF_ATTR_QUEUED)
>> +				continue;
>> +
>>  			ret = iris_destroy_internal_buffer(inst, buf);
>>  			if (ret)
>>  				return ret;
>> -- 
>> 2.34.1
>>
> 

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 06/12] media: iris: Update CAPTURE format info based on OUTPUT format
  2025-03-05 20:45   ` Dmitry Baryshkov
@ 2025-03-06 12:27     ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 12:27 UTC (permalink / raw)
  To: Dmitry Baryshkov
  Cc: quic_vgarodia, quic_abhinavk, mchehab, hverkuil, linux-media,
	linux-arm-msm, linux-kernel



On 3/6/2025 2:15 AM, Dmitry Baryshkov wrote:
> On Wed, Mar 05, 2025 at 04:13:29PM +0530, Dikshita Agarwal wrote:
>> Update the width, height and buffer size of CAPTURE based on the
>> resolution set to OUTPUT via VIDIOC_S_FMT. This is required to set the
>> updated capture resolution to firmware when S_FMT is called only for
>> OUTPUT.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>>  drivers/media/platform/qcom/iris/iris_vdec.c | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
> 
> This also looks like a fix, so Fixes, cc:stable, move to the top.
Ack.
> 

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 08/12] media: iris: Avoid updating frame size to firmware during reconfig
  2025-03-06  1:26   ` Bryan O'Donoghue
@ 2025-03-06 12:32     ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 12:32 UTC (permalink / raw)
  To: Bryan O'Donoghue, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel



On 3/6/2025 6:56 AM, Bryan O'Donoghue wrote:
> On 05/03/2025 10:43, Dikshita Agarwal wrote:
>> During the reconfig, firmware sends the resolution aligned by 8 byte,
>> if driver set the same resoluton to firmware, it will be aligned to 16
>> byte causing another sequence change which would be incorrect.
> 
> During reconfig the firmware sends the resolution aligned to 8 bytes. If
> the driver sends the same resolution back to the firmware the resolution
> will be aligned to 16 bytes not 8.
> 
> The alignment mismatch would then subsequently cause the firmware to send
> another redundant sequence change.
> 
>> Fix this by not setting the updated resolution to firmware during
>> reconfig.
> 
> Fix this by not setting the resolution property during reconfig.
Ack.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>>   .../platform/qcom/iris/iris_hfi_gen1_command.c    | 15 ++++++++-------
>>   .../platform/qcom/iris/iris_hfi_gen1_response.c   |  1 +
>>   drivers/media/platform/qcom/iris/iris_instance.h  |  2 ++
>>   drivers/media/platform/qcom/iris/iris_vdec.c      |  4 ++++
>>   4 files changed, 15 insertions(+), 7 deletions(-)
>>
>> 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 a160ae915886..d5e81049d37e 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
>> @@ -562,14 +562,15 @@ static int iris_hfi_gen1_set_resolution(struct
>> iris_inst *inst)
>>       struct hfi_framesize fs;
>>       int ret;
>>   -    fs.buffer_type = HFI_BUFFER_INPUT;
>> -    fs.width = inst->fmt_src->fmt.pix_mp.width;
>> -    fs.height = inst->fmt_src->fmt.pix_mp.height;
>> -
>> -    ret = hfi_gen1_set_property(inst, ptype, &fs, sizeof(fs));
>> -    if (ret)
>> -        return ret;
>> +    if (!inst->in_reconfig) {
>> +        fs.buffer_type = HFI_BUFFER_INPUT;
>> +        fs.width = inst->fmt_src->fmt.pix_mp.width;
>> +        fs.height = inst->fmt_src->fmt.pix_mp.height;
>>   +        ret = hfi_gen1_set_property(inst, ptype, &fs, sizeof(fs));
>> +        if (ret)
>> +            return ret;
>> +    }
>>       fs.buffer_type = HFI_BUFFER_OUTPUT2;
>>       fs.width = inst->fmt_dst->fmt.pix_mp.width;
>>       fs.height = inst->fmt_dst->fmt.pix_mp.height;
>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
>> b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
>> index 91d95eed68aa..6576496fdbdf 100644
>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
>> @@ -155,6 +155,7 @@ static void iris_hfi_gen1_read_changed_params(struct
>> iris_inst *inst,
>>           inst->crop.height = event.height;
>>       }
>>   +    inst->in_reconfig = true;
> 
> This flag can be changed by iris_hfi_isr_handler() down the chain.
> 
> 
>> @@ -453,6 +453,8 @@ static int iris_vdec_process_streamon_input(struct
>> iris_inst *inst)
>>       if (ret)
>>           return ret;
>>   +    inst->in_reconfig = false;
>> +
>>       return iris_inst_change_sub_state(inst, 0, set_sub_state);
>>   }
>>   @@ -544,6 +546,8 @@ static int iris_vdec_process_streamon_output(struct
>> iris_inst *inst)
>>       if (ret)
>>           return ret;
>>   +    inst->in_reconfig = false;
>> +
> 
> Are these usages of the in_reconfig flag then thread-safe ?
> 
> i.e. are both iris_vdec_process_streamon_input() and
> iris_vdec_process_streamon_output() guaranteed not to run @ the same time ?
> 
> I don't see any obvious locking here.
> 
Since reconfig handling is only relevant to capture port, the usage of
in_reconfig flag in output port is unnecessary. I'll remove the redundant
flag from output stream_on to simplify the code.

Thanks,
Dikshita
> ---
> bod

^ permalink raw reply	[flat|nested] 32+ messages in thread

* Re: [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder
  2025-03-05 14:22 ` [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder neil.armstrong
@ 2025-03-06 12:34   ` Dikshita Agarwal
  0 siblings, 0 replies; 32+ messages in thread
From: Dikshita Agarwal @ 2025-03-06 12:34 UTC (permalink / raw)
  To: neil.armstrong, quic_vgarodia, quic_abhinavk, mchehab
  Cc: hverkuil, linux-media, linux-arm-msm, linux-kernel



On 3/5/2025 7:52 PM, neil.armstrong@linaro.org wrote:
> Hi,
> 
> On 05/03/2025 11:43, Dikshita Agarwal wrote:
>> Hi all,
>>
>> This patch series adds initial support for the HEVC(H.265) and VP9
>> codecs in iris decoder. The objective of this work is to extend the
>> decoder's capabilities to handle HEVC and VP9 codec streams,
>> including necessary format handling and buffer management.
>> In addition, the series also includes a set of fixes to address issues
>> identified during testing of these additional codecs.
>>
>> I'm sharing this series as an RFC because compliance and conformance
>> testing are still in progress.
>> While initial functional tests show positive results, I would
>> appreciate early feedback on the design, implementation, and fixes
>> before moving to a formal submission.
>>
>> I plan to submit a formal patch series after completing all compliance
>> checks. Meanwhile, any feedback or suggestion to improve this work are
>> very welcome.
>>
>> Thanks,
>> Dikshita
>>
>> Dikshita Agarwal (12):
>>    media: iris: Add HEVC and VP9 formats for decoder
>>    media: iris: Add platform capabilities for HEVC and VP9 decoders
>>    media: iris: Set mandatory properties for HEVC and VP9 decoders.
>>    media: iris: Add internal buffer calculation for HEVC and VP9 decoders
>>    media: iris: Skip destroying internal buffer if not dequeued
>>    media: iris: Update CAPTURE format info based on OUTPUT format
>>    media: iris: Add handling for corrupt and drop frames
>>    media: iris: Avoid updating frame size to firmware during reconfig
>>    media: iris: Avoid sending LAST flag multiple times
>>    media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>>    media: iris: Fix handling of eos buffer during drain
>>    media: iris: Add handling for no show frames
> 
> I should be better to move patches 1, 2 & 3 at the end, after the patches
> adding support for specific hecv & h265 features, and please check that
> none of the patches breaks h264 at any time to keep bisectability.
> 
Noted.

Thanks,
Dikshita
> Neil
> 
> Neil
> 
>>
>>   .../media/platform/qcom/iris/iris_buffer.c    |  22 +-
>>   drivers/media/platform/qcom/iris/iris_ctrls.c |  28 +-
>>   .../platform/qcom/iris/iris_hfi_common.h      |   1 +
>>   .../qcom/iris/iris_hfi_gen1_command.c         |  38 +-
>>   .../qcom/iris/iris_hfi_gen1_defines.h         |   4 +
>>   .../qcom/iris/iris_hfi_gen1_response.c        |  11 +
>>   .../qcom/iris/iris_hfi_gen2_command.c         | 129 +++++-
>>   .../qcom/iris/iris_hfi_gen2_defines.h         |   5 +
>>   .../qcom/iris/iris_hfi_gen2_response.c        |  56 ++-
>>   .../media/platform/qcom/iris/iris_instance.h  |   6 +
>>   .../platform/qcom/iris/iris_platform_common.h |  25 +-
>>   .../platform/qcom/iris/iris_platform_sm8250.c |   4 +-
>>   .../platform/qcom/iris/iris_platform_sm8550.c | 141 ++++++-
>>   drivers/media/platform/qcom/iris/iris_vb2.c   |   3 +-
>>   drivers/media/platform/qcom/iris/iris_vdec.c  |  80 +++-
>>   drivers/media/platform/qcom/iris/iris_vdec.h  |  11 +
>>   drivers/media/platform/qcom/iris/iris_vidc.c  |   3 -
>>   .../platform/qcom/iris/iris_vpu_buffer.c      | 397 +++++++++++++++++-
>>   .../platform/qcom/iris/iris_vpu_buffer.h      |  46 +-
>>   19 files changed, 931 insertions(+), 79 deletions(-)
>>
> 

^ permalink raw reply	[flat|nested] 32+ messages in thread

end of thread, other threads:[~2025-03-06 12:34 UTC | newest]

Thread overview: 32+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-05 10:43 [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 01/12] media: iris: Add HEVC and VP9 formats for decoder Dikshita Agarwal
2025-03-06  0:17   ` Bryan O'Donoghue
2025-03-06 11:55     ` Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 02/12] media: iris: Add platform capabilities for HEVC and VP9 decoders Dikshita Agarwal
2025-03-06  0:28   ` Bryan O'Donoghue
2025-03-06 12:07     ` Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 03/12] media: iris: Set mandatory properties " Dikshita Agarwal
2025-03-05 14:00   ` neil.armstrong
2025-03-06 12:10     ` Dikshita Agarwal
2025-03-06  0:52   ` Bryan O'Donoghue
2025-03-06 12:16     ` Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 04/12] media: iris: Add internal buffer calculation " Dikshita Agarwal
2025-03-06  1:05   ` Bryan O'Donoghue
2025-03-06 12:26     ` Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 05/12] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
2025-03-05 20:44   ` Dmitry Baryshkov
2025-03-06 12:26     ` Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 06/12] media: iris: Update CAPTURE format info based on OUTPUT format Dikshita Agarwal
2025-03-05 20:45   ` Dmitry Baryshkov
2025-03-06 12:27     ` Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 07/12] media: iris: Add handling for corrupt and drop frames Dikshita Agarwal
2025-03-06  1:12   ` Bryan O'Donoghue
2025-03-05 10:43 ` [RFC PATCH 08/12] media: iris: Avoid updating frame size to firmware during reconfig Dikshita Agarwal
2025-03-06  1:26   ` Bryan O'Donoghue
2025-03-06 12:32     ` Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 09/12] media: iris: Avoid sending LAST flag multiple times Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 10/12] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 11/12] media: iris: Fix handling of eos buffer during drain Dikshita Agarwal
2025-03-05 10:43 ` [RFC PATCH 12/12] media: iris: Add handling for no show frames Dikshita Agarwal
2025-03-05 14:22 ` [RFC PATCH 00/12] Add support for HEVC and VP9 codecs in decoder neil.armstrong
2025-03-06 12:34   ` Dikshita Agarwal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox