mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
@ 2025-04-08 15:54 Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
                   ` (21 more replies)
  0 siblings, 22 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal, stable, Dan Carpenter

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.

These patches also address the comments and feedback received from the 
RFC patches previously sent. I have made the necessary improvements 
based on the community's suggestions.

Changes sinces RFC:
- Added additional fixes to address issues identified during further 
testing.
- Moved typo fix to a seperate patch [Neil]
- Reordered the patches for better logical flow and clarity [Neil, 
Dmitry]
- Added fixes tag wherever applicable [Neil, Dmitry]
- Removed the default case in the switch statement for codecs [Bryan]
- Replaced if-else statements with switch-case [Bryan]
- Added comments for mbpf [Bryan]
- RFC: https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/

These patches are tested on SM8250 and SM8550 with v4l2-ctl and 
Gstreamer for HEVC and VP9 decoders, at the same time ensured that 
the existing H264 decoder functionality remains uneffected.

Note: 1 of the fluster compliance test is fixed with firmware [1]
[1]: https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u 

The result of fluster test on SM8550:
 131/147 testcases passed while testing JCT-VC-HEVC_V1 with 
 GStreamer-H.265-V4L2-Gst1.0.
 The failing test case:
 - 10 testcases failed due to unsupported 10 bit format.
   - DBLK_A_MAIN10_VIXS_4
   - INITQP_B_Main10_Sony_1
   - TSUNEQBD_A_MAIN10_Technicolor_2
   - WP_A_MAIN10_Toshiba_3
   - WP_MAIN10_B_Toshiba_3
   - WPP_A_ericsson_MAIN10_2
   - WPP_B_ericsson_MAIN10_2
   - WPP_C_ericsson_MAIN10_2
   - WPP_E_ericsson_MAIN10_2
   - WPP_F_ericsson_MAIN10_2
 - 4 testcase failed due to unsupported resolution
   - PICSIZE_A_Bossen_1
   - PICSIZE_B_Bossen_1
   - WPP_D_ericsson_MAIN10_2
   - WPP_D_ericsson_MAIN_2 
 - 1 testcase failed as bitstream is invalid (this fails with reference 
   as well)
   - RAP_B_Bossen_2
 - 1 testcase failed due to CRC mismatch
   - RAP_A_docomo_6
     Analysis - First few frames in this discarded by firmware and are 
     sent to driver with 0 filled length. Driver send such buffers to 
     client with timestamp 0 and payload set to 0 and 
     make buf state to VB2_BUF_STATE_ERROR. Such buffers should be 
     dropped by GST. But instead, the first frame displayed as green 
     frame and when a valid buffer is sent to client later with same 0 
     timestamp, its dropped, leading to CRC mismatch for first frame.

 235/305 testcases passed while testing VP9-TEST-VECTORS with 
 GStreamer-VP9-V4L2-Gst1.0.
 The failing test case:
 - 64 testcases failed due to unsupported resolution
   - vp90-2-02-size-08x08.webm
   - vp90-2-02-size-08x10.webm
   - vp90-2-02-size-08x16.webm
   - vp90-2-02-size-08x18.webm
   - vp90-2-02-size-08x32.webm
   - vp90-2-02-size-08x34.webm
   - vp90-2-02-size-08x64.webm
   - vp90-2-02-size-08x66.webm
   - vp90-2-02-size-10x08.webm
   - vp90-2-02-size-10x10.webm
   - vp90-2-02-size-10x16.webm
   - vp90-2-02-size-10x18.webm
   - vp90-2-02-size-10x32.webm
   - vp90-2-02-size-10x34.webm
   - vp90-2-02-size-10x64.webm
   - vp90-2-02-size-10x66.webm
   - vp90-2-02-size-16x08.webm
   - vp90-2-02-size-16x10.webm
   - vp90-2-02-size-16x16.webm
   - vp90-2-02-size-16x18.webm
   - vp90-2-02-size-16x32.webm
   - vp90-2-02-size-16x34.webm
   - vp90-2-02-size-16x64.webm
   - vp90-2-02-size-16x66.webm
   - vp90-2-02-size-18x08.webm
   - vp90-2-02-size-18x10.webm
   - vp90-2-02-size-18x16.webm
   - vp90-2-02-size-18x18.webm
   - vp90-2-02-size-18x32.webm
   - vp90-2-02-size-18x34.webm
   - vp90-2-02-size-18x64.webm
   - vp90-2-02-size-18x66.webm
   - vp90-2-02-size-32x08.webm
   - vp90-2-02-size-32x10.webm
   - vp90-2-02-size-32x16.webm
   - vp90-2-02-size-32x18.webm
   - vp90-2-02-size-32x32.webm
   - vp90-2-02-size-32x34.webm
   - vp90-2-02-size-32x64.webm
   - vp90-2-02-size-32x66.webm
   - vp90-2-02-size-34x08.webm
   - vp90-2-02-size-34x10.webm
   - vp90-2-02-size-34x16.webm
   - vp90-2-02-size-34x18.webm
   - vp90-2-02-size-34x32.webm
   - vp90-2-02-size-34x34.webm
   - vp90-2-02-size-34x64.webm
   - vp90-2-02-size-34x66.webm
   - vp90-2-02-size-64x08.webm
   - vp90-2-02-size-64x10.webm
   - vp90-2-02-size-64x16.webm
   - vp90-2-02-size-64x18.webm
   - vp90-2-02-size-64x32.webm
   - vp90-2-02-size-64x34.webm
   - vp90-2-02-size-64x64.webm
   - vp90-2-02-size-64x66.webm
   - vp90-2-02-size-66x08.webm
   - vp90-2-02-size-66x10.webm
   - vp90-2-02-size-66x16.webm
   - vp90-2-02-size-66x18.webm
   - vp90-2-02-size-66x32.webm
   - vp90-2-02-size-66x34.webm
   - vp90-2-02-size-66x64.webm
   - vp90-2-02-size-66x66.webm
 - 2 testcases failed due to unsupported format
   - vp91-2-04-yuv422.webm
   - vp91-2-04-yuv444.webm
 - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
   - vp90-2-22-svc_1280x720_3.ivf
 - 2 testcase failed due to unsupported resolution after sequence change
   - vp90-2-21-resize_inter_320x180_5_1-2.webm
   - vp90-2-21-resize_inter_320x180_7_1-2.webm
 - 1 testcase failed due to unsupported stream
   - vp90-2-16-intra-only.webm
 Note: There is a timing issue with the clips having multiple resolution 
 change. Where firmware returned all the buffers with previous sequence 
 and has no buffer left to attach the LAST flag to. At the same time, 
 client is not queueing any further buffers, so there is deadlock where 
 client is waiting for LAST flag, while firmware doesn't have any 
 capture buffer to attach LAST flag to.
 Ideally client should keep queueing the buffers on capture queue untill
 the LAST flag is received.

The result of fluster test on SM8250:
 132/147 testcases passed while testing JCT-VC-HEVC_V1 with
 GStreamer-H.265-V4L2-Gst1.0.
 The failing test case:
 - 10 testcases failed due to unsupported 10 bit format.
   - DBLK_A_MAIN10_VIXS_4
   - INITQP_B_Main10_Sony_1
   - TSUNEQBD_A_MAIN10_Technicolor_2
   - WP_A_MAIN10_Toshiba_3
   - WP_MAIN10_B_Toshiba_3
   - WPP_A_ericsson_MAIN10_2
   - WPP_B_ericsson_MAIN10_2
   - WPP_C_ericsson_MAIN10_2
   - WPP_E_ericsson_MAIN10_2
   - WPP_F_ericsson_MAIN10_2
 - 4 testcase failed due to unsupported resolution
   - PICSIZE_A_Bossen_1
   - PICSIZE_B_Bossen_1
   - WPP_D_ericsson_MAIN10_2
   - WPP_D_ericsson_MAIN_2
 - 1 testcase failed as bitstream is invalid (this fails with reference
   as well)
   - RAP_B_Bossen_2

 232/305 testcases passed while testing VP9-TEST-VECTORS with
 GStreamer-VP9-V4L2-Gst1.0.
 The failing test case:
 - 64 testcases failed due to unsupported resolution
   - vp90-2-02-size-08x08.webm
   - vp90-2-02-size-08x10.webm
   - vp90-2-02-size-08x16.webm
   - vp90-2-02-size-08x18.webm
   - vp90-2-02-size-08x32.webm
   - vp90-2-02-size-08x34.webm
   - vp90-2-02-size-08x64.webm
   - vp90-2-02-size-08x66.webm
   - vp90-2-02-size-10x08.webm
   - vp90-2-02-size-10x10.webm
   - vp90-2-02-size-10x16.webm
   - vp90-2-02-size-10x18.webm
   - vp90-2-02-size-10x32.webm
   - vp90-2-02-size-10x34.webm
   - vp90-2-02-size-10x64.webm
   - vp90-2-02-size-10x66.webm
   - vp90-2-02-size-16x08.webm
   - vp90-2-02-size-16x10.webm
   - vp90-2-02-size-16x16.webm
   - vp90-2-02-size-16x18.webm
   - vp90-2-02-size-16x32.webm
   - vp90-2-02-size-16x34.webm
   - vp90-2-02-size-16x64.webm
   - vp90-2-02-size-16x66.webm
   - vp90-2-02-size-18x08.webm
   - vp90-2-02-size-18x10.webm
   - vp90-2-02-size-18x16.webm
   - vp90-2-02-size-18x18.webm
   - vp90-2-02-size-18x32.webm
   - vp90-2-02-size-18x34.webm
   - vp90-2-02-size-18x64.webm
   - vp90-2-02-size-18x66.webm
   - vp90-2-02-size-32x08.webm
   - vp90-2-02-size-32x10.webm
   - vp90-2-02-size-32x16.webm
   - vp90-2-02-size-32x18.webm
   - vp90-2-02-size-32x32.webm
   - vp90-2-02-size-32x34.webm
   - vp90-2-02-size-32x64.webm
   - vp90-2-02-size-32x66.webm
   - vp90-2-02-size-34x08.webm
   - vp90-2-02-size-34x10.webm
   - vp90-2-02-size-34x16.webm
   - vp90-2-02-size-34x18.webm
   - vp90-2-02-size-34x32.webm
   - vp90-2-02-size-34x34.webm
   - vp90-2-02-size-34x64.webm
   - vp90-2-02-size-34x66.webm
   - vp90-2-02-size-64x08.webm
   - vp90-2-02-size-64x10.webm
   - vp90-2-02-size-64x16.webm
   - vp90-2-02-size-64x18.webm
   - vp90-2-02-size-64x32.webm
   - vp90-2-02-size-64x34.webm
   - vp90-2-02-size-64x64.webm
   - vp90-2-02-size-64x66.webm
   - vp90-2-02-size-66x08.webm
   - vp90-2-02-size-66x10.webm
   - vp90-2-02-size-66x16.webm
   - vp90-2-02-size-66x18.webm
   - vp90-2-02-size-66x32.webm
   - vp90-2-02-size-66x34.webm
   - vp90-2-02-size-66x64.webm
   - vp90-2-02-size-66x66.webm
 - 2 testcases failed due to unsupported format
   - vp91-2-04-yuv422.webm
   - vp91-2-04-yuv444.webm
 - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
   - vp90-2-22-svc_1280x720_3.ivf
 - 5 testcase failed due to unsupported resolution after sequence change
   - vp90-2-21-resize_inter_320x180_5_1-2.webm
   - vp90-2-21-resize_inter_320x180_7_1-2.webm
   - vp90-2-21-resize_inter_320x240_5_1-2.webm
   - vp90-2-21-resize_inter_320x240_7_1-2.webm
   - vp90-2-18-resize.ivf
 - 1 testcase failed with CRC mismatch
   - vp90-2-16-intra-only.webm
   Analysis: First few frames are marked by firmware as NO_SHOW frame.
   Driver make buf state to VB2_BUF_STATE_ERROR for such frames.
   Such buffers should be dropped by GST. But instead, the first frame 
   is being displayed and when a valid buffer is sent to client later
   with same timestamp, its dropped, leading to CRC mismatch for first 
   frame.
 Note: Same timing issue as observed on SM8550 is seen on SM8250 as 
 well.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
Dikshita Agarwal (20):
      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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
      media: iris: Add handling for no show frames
      media: iris: Improve last flag handling
      media: iris: Skip flush on first sequence change
      media: iris: Prevent HFI queue writes when core is in deinit state
      media: iris: Remove redundant buffer count check in stream off
      media: iris: Remove deprecated property setting to firmware
      media: iris: Fix missing function pointer initialization
      media: iris: Fix NULL pointer dereference
      media: iris: Fix typo in depth variable
      media: iris: Add a comment to explain usage of MBPS
      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: Add codec specific check for VP9 decoder drain handling

 drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
 drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
 drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
 .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
 .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
 .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
 .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
 .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
 .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
 drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
 drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
 .../platform/qcom/iris/iris_platform_common.h      |  28 +-
 .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
 .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
 drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
 drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
 drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
 drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
 drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
 drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
 20 files changed, 948 insertions(+), 153 deletions(-)
---
base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d

Best regards,
-- 
Dikshita Agarwal <quic_dikshita@quicinc.com>


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

* [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-11 12:10   ` Bryan O'Donoghue
  2025-04-08 15:54 ` [PATCH 02/20] media: iris: Update CAPTURE format info based on OUTPUT format Dikshita Agarwal
                   ` (20 subsequent siblings)
  21 siblings, 1 reply; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal, stable

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

Cc: stable@vger.kernel.org
Fixes: 73702f45db81 ("media: iris: allocate, initialize and queue internal buffers")
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 e5c5a564fcb8..75fe63cc2327 100644
--- a/drivers/media/platform/qcom/iris/iris_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_buffer.c
@@ -396,6 +396,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] 44+ messages in thread

* [PATCH 02/20] media: iris: Update CAPTURE format info based on OUTPUT format
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-11 12:46   ` Bryan O'Donoghue
  2025-04-08 15:54 ` [PATCH 03/20] media: iris: Add handling for corrupt and drop frames Dikshita Agarwal
                   ` (19 subsequent siblings)
  21 siblings, 1 reply; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal, stable

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.

Cc: stable@vger.kernel.org
Fixes: b530b95de22c ("media: iris: implement s_fmt, g_fmt and try_fmt ioctls")
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 4143acedfc57..c5d85936b3ae 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -171,6 +171,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	[flat|nested] 44+ messages in thread

* [PATCH 03/20] media: iris: Add handling for corrupt and drop frames
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 02/20] media: iris: Update CAPTURE format info based on OUTPUT format Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 04/20] media: iris: Avoid updating frame size to firmware during reconfig Dikshita Agarwal
                   ` (18 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

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.

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_buffer.c            | 11 ++++++++---
 drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h  |  2 ++
 drivers/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 75fe63cc2327..8ae1f791d943 100644
--- a/drivers/media/platform/qcom/iris/iris_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_buffer.c
@@ -600,10 +600,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;
 
@@ -623,6 +626,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 9f246816a286..93b5f838c290 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
@@ -117,6 +117,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	[flat|nested] 44+ messages in thread

* [PATCH 04/20] media: iris: Avoid updating frame size to firmware during reconfig
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (2 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 03/20] media: iris: Add handling for corrupt and drop frames Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-11 12:47   ` Bryan O'Donoghue
  2025-04-08 15:54 ` [PATCH 05/20] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length Dikshita Agarwal
                   ` (17 subsequent siblings)
  21 siblings, 1 reply; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

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 resolution property during reconfig.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c  | 15 ++++++++-------
 drivers/media/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              |  1 +
 4 files changed, 12 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 64f887d9a17d..2239708d2d7e 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -546,14 +546,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 caa3c6507006..a893751766ca 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
+ * @in_reconfig: a flag raised by decoder when the stream resolution changes
  */
 
 struct iris_inst {
@@ -72,6 +73,7 @@ struct iris_inst {
 	u32				sequence_out;
 	struct iris_ts_metadata		tss[VIDEO_MAX_FRAME];
 	u32				metadata_idx;
+	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 c5d85936b3ae..2e06311f9893 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -487,6 +487,7 @@ 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	[flat|nested] 44+ messages in thread

* [PATCH 05/20] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (3 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 04/20] media: iris: Avoid updating frame size to firmware during reconfig Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-11 12:51   ` Bryan O'Donoghue
  2025-04-08 15:54 ` [PATCH 06/20] media: iris: Add handling for no show frames Dikshita Agarwal
                   ` (16 subsequent siblings)
  21 siblings, 1 reply; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

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 b75a01641d5d..91c5f04dd926 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	[flat|nested] 44+ messages in thread

* [PATCH 06/20] media: iris: Add handling for no show frames
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (4 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 05/20] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-22 20:23   ` Bryan O'Donoghue
  2025-04-08 15:54 ` [PATCH 07/20] media: iris: Improve last flag handling Dikshita Agarwal
                   ` (15 subsequent siblings)
  21 siblings, 1 reply; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

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 806f8bb7f505..666061a612c3 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -113,6 +113,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 91c5f04dd926..de823a314efd 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;
@@ -642,9 +644,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	[flat|nested] 44+ messages in thread

* [PATCH 07/20] media: iris: Improve last flag handling
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (5 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 06/20] media: iris: Add handling for no show frames Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 08/20] media: iris: Skip flush on first sequence change Dikshita Agarwal
                   ` (14 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

Improve the handling of the V4L2_BUF_FLAG_LAST flag in the driver:
- Ensure that the last flag is not sent multiple times.
- Attach the last flag to the first capture buffer returned during
  flush, triggered by a sequence change, addressing cases where the
  firmware does not set the last flag.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_buffer.c            | 1 +
 drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c | 8 +++++++-
 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 ++
 5 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
index 8ae1f791d943..c091a49bd140 100644
--- a/drivers/media/platform/qcom/iris/iris_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_buffer.c
@@ -625,6 +625,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_hfi_gen1_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
index 6576496fdbdf..ba858abab336 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
@@ -456,7 +456,13 @@ static void iris_hfi_gen1_session_ftb_done(struct iris_inst *inst, void *packet)
 		timestamp_us = timestamp_hi;
 		timestamp_us = (timestamp_us << 32) | timestamp_lo;
 	} else {
-		flags |= V4L2_BUF_FLAG_LAST;
+		if (pkt->stream_id == 1 && !inst->last_buffer_dequeued) {
+			if (inst->sub_state & IRIS_INST_SUB_DRC &&
+			    inst->sub_state & IRIS_INST_SUB_DRC_LAST) {
+				flags |= V4L2_BUF_FLAG_LAST;
+				inst->last_buffer_dequeued = true;
+			}
+		}
 	}
 	buf->timestamp = timestamp_us;
 
diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
index a893751766ca..5150237f0020 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
  * @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 {
@@ -74,6 +75,7 @@ struct iris_inst {
 	struct iris_ts_metadata		tss[VIDEO_MAX_FRAME];
 	u32				metadata_idx;
 	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 2e06311f9893..7058f2d789bd 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -488,6 +488,8 @@ 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	[flat|nested] 44+ messages in thread

* [PATCH 08/20] media: iris: Skip flush on first sequence change
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (6 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 07/20] media: iris: Improve last flag handling Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 09/20] media: iris: Prevent HFI queue writes when core is in deinit state Dikshita Agarwal
                   ` (13 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

Add a condition to skip the flush operation during the first sequence
change event. At this point, the capture queue is not streaming, making
the flush unnecessary.

Additionally, remove the reinit_completion call for the flush completion
signal, as it is not needed. This simplifies the code and avoids
unnecessary reinitialization.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

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 ba858abab336..dfca45d85759 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
@@ -201,8 +201,7 @@ static void iris_hfi_gen1_event_seq_changed(struct iris_inst *inst,
 
 	iris_hfi_gen1_read_changed_params(inst, pkt);
 
-	if (inst->state != IRIS_INST_ERROR) {
-		reinit_completion(&inst->flush_completion);
+	if (inst->state != IRIS_INST_ERROR && !(inst->sub_state & IRIS_INST_SUB_FIRST_IPSC)) {
 
 		flush_pkt.shdr.hdr.size = sizeof(struct hfi_session_flush_pkt);
 		flush_pkt.shdr.hdr.pkt_type = HFI_CMD_SESSION_FLUSH;

-- 
2.34.1


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

* [PATCH 09/20] media: iris: Prevent HFI queue writes when core is in deinit state
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (7 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 08/20] media: iris: Skip flush on first sequence change Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 10/20] media: iris: Remove redundant buffer count check in stream off Dikshita Agarwal
                   ` (12 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal, stable

The current check only considers the core error state before allowing
writes to the HFI queues. However, the core can also transition to the
deinit state due to a system error triggered by the response thread.
In such cases, writing to the HFI queues should not be allowed.

Fix this by adding a check for the core deinit state, ensuring that
writes are rejected when core is not in a valid state.

Cc: stable@vger.kernel.org
Fixes: fb583a214337 ("media: iris: introduce host firmware interface with necessary hooks")
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_queue.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/media/platform/qcom/iris/iris_hfi_queue.c b/drivers/media/platform/qcom/iris/iris_hfi_queue.c
index fac7df0c4d1a..221dcd09e1e1 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_queue.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_queue.c
@@ -113,7 +113,7 @@ int iris_hfi_queue_cmd_write_locked(struct iris_core *core, void *pkt, u32 pkt_s
 {
 	struct iris_iface_q_info *q_info = &core->command_queue;
 
-	if (core->state == IRIS_CORE_ERROR)
+	if (core->state == IRIS_CORE_ERROR || core->state == IRIS_CORE_DEINIT)
 		return -EINVAL;
 
 	if (!iris_hfi_queue_write(q_info, pkt, pkt_size)) {

-- 
2.34.1


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

* [PATCH 10/20] media: iris: Remove redundant buffer count check in stream off
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (8 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 09/20] media: iris: Prevent HFI queue writes when core is in deinit state Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 11/20] media: iris: Remove deprecated property setting to firmware Dikshita Agarwal
                   ` (11 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

Currently, the stream off process checks the count of buffers in
v4l2_m2m_queues using v4l2_m2m_for_each_src_buf_safe and
v4l2_m2m_for_each_dst_buf_safe APIs. If the count is non-zero, it
returns an error. This check is redundant as the V4L2 framework already
handles buffer management internally.

Remove the unnecessary buffer count check in stream off, simplifying the
process and relying on V4L2's internal mechanisms for buffer management.

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

diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
index 7058f2d789bd..1305b981a72d 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -244,35 +244,6 @@ void iris_vdec_src_change(struct iris_inst *inst)
 	v4l2_event_queue_fh(&inst->fh, &event);
 }
 
-static int iris_vdec_get_num_queued_buffers(struct iris_inst *inst,
-					    enum iris_buffer_type type)
-{
-	struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx;
-	struct v4l2_m2m_buffer *buffer, *n;
-	struct iris_buffer *buf;
-	u32 count = 0;
-
-	switch (type) {
-	case BUF_INPUT:
-		v4l2_m2m_for_each_src_buf_safe(m2m_ctx, buffer, n) {
-			buf = to_iris_buffer(&buffer->vb);
-			if (!(buf->attr & BUF_ATTR_QUEUED))
-				continue;
-			count++;
-		}
-		return count;
-	case BUF_OUTPUT:
-		v4l2_m2m_for_each_dst_buf_safe(m2m_ctx, buffer, n) {
-			buf = to_iris_buffer(&buffer->vb);
-			if (!(buf->attr & BUF_ATTR_QUEUED))
-				continue;
-			count++;
-		}
-		return count;
-	default:
-		return count;
-	}
-}
 
 static void iris_vdec_flush_deferred_buffers(struct iris_inst *inst,
 					     enum iris_buffer_type type)
@@ -321,7 +292,6 @@ int iris_vdec_session_streamoff(struct iris_inst *inst, u32 plane)
 {
 	const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
 	enum iris_buffer_type buffer_type;
-	u32 count;
 	int ret;
 
 	switch (plane) {
@@ -339,12 +309,6 @@ int iris_vdec_session_streamoff(struct iris_inst *inst, u32 plane)
 	if (ret)
 		goto error;
 
-	count = iris_vdec_get_num_queued_buffers(inst, buffer_type);
-	if (count) {
-		ret = -EINVAL;
-		goto error;
-	}
-
 	ret = iris_inst_state_change_streamoff(inst, plane);
 	if (ret)
 		goto error;

-- 
2.34.1


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

* [PATCH 11/20] media: iris: Remove deprecated property setting to firmware
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (9 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 10/20] media: iris: Remove redundant buffer count check in stream off Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 12/20] media: iris: Fix missing function pointer initialization Dikshita Agarwal
                   ` (10 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal, stable

HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER is deprecated and no longer
supported on current firmware, remove setting the same to firmware.

At the same time, remove the check for non-zero number of v4l2 controls
as some SOC might not expose any capability which requires v4l2 control.

Cc: stable@vger.kernel.org
Fixes: 79865252acb6 ("media: iris: enable video driver probe of SM8250 SoC")
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_ctrls.c            | 6 ------
 drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c | 8 --------
 drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h | 1 -
 drivers/media/platform/qcom/iris/iris_platform_common.h  | 2 +-
 drivers/media/platform/qcom/iris/iris_platform_sm8250.c  | 9 ---------
 5 files changed, 1 insertion(+), 25 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index b690578256d5..915de101fcba 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -17,8 +17,6 @@ static inline bool iris_valid_cap_id(enum platform_inst_fw_cap_type cap_id)
 static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
 {
 	switch (id) {
-	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
-		return DEBLOCK;
 	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
 		return PROFILE;
 	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
@@ -34,8 +32,6 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
 		return 0;
 
 	switch (cap_id) {
-	case DEBLOCK:
-		return V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER;
 	case PROFILE:
 		return V4L2_CID_MPEG_VIDEO_H264_PROFILE;
 	case LEVEL:
@@ -84,8 +80,6 @@ int iris_ctrls_init(struct iris_inst *inst)
 		if (iris_get_v4l2_id(cap[idx].cap_id))
 			num_ctrls++;
 	}
-	if (!num_ctrls)
-		return -EINVAL;
 
 	/* Adding 1 to num_ctrls to include V4L2_CID_MIN_BUFFERS_FOR_CAPTURE */
 
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 2239708d2d7e..f9f3e2d2ce29 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -490,14 +490,6 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_session_set_property_pkt *p
 		packet->shdr.hdr.size += sizeof(u32) + sizeof(*wm);
 		break;
 	}
-	case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER: {
-		struct hfi_enable *en = prop_data;
-		u32 *in = pdata;
-
-		en->enable = *in;
-		packet->shdr.hdr.size += sizeof(u32) + sizeof(*en);
-		break;
-	}
 	default:
 		return -EINVAL;
 	}
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
index 93b5f838c290..adffcead58ea 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h
@@ -65,7 +65,6 @@
 
 #define HFI_PROPERTY_CONFIG_BUFFER_REQUIREMENTS		0x202001
 
-#define HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER	0x1200001
 #define HFI_PROPERTY_PARAM_VDEC_DPB_COUNTS		0x120300e
 #define HFI_PROPERTY_CONFIG_VDEC_ENTROPY		0x1204004
 
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index f6b15d2805fb..c00fd4a83ba7 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -87,7 +87,7 @@ enum platform_inst_fw_cap_type {
 	CODED_FRAMES,
 	BIT_DEPTH,
 	RAP_FRAME,
-	DEBLOCK,
+	TIER,
 	INST_FW_CAP_MAX,
 };
 
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
index 5c86fd7b7b6f..543fa2661539 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
@@ -30,15 +30,6 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8250[] = {
 		.hfi_id = HFI_PROPERTY_PARAM_WORK_MODE,
 		.set = iris_set_stage,
 	},
-	{
-		.cap_id = DEBLOCK,
-		.min = 0,
-		.max = 1,
-		.step_or_mask = 1,
-		.value = 0,
-		.hfi_id = HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER,
-		.set = iris_set_u32,
-	},
 };
 
 static struct platform_inst_caps platform_inst_cap_sm8250 = {

-- 
2.34.1


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

* [PATCH 12/20] media: iris: Fix missing function pointer initialization
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (10 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 11/20] media: iris: Remove deprecated property setting to firmware Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 13/20] media: iris: Fix NULL pointer dereference Dikshita Agarwal
                   ` (9 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal, stable

The function pointers responsible for setting firmware properties were
never initialized in the instance capability structure, causing it to
remain NULL. As a result, the firmware properties were not being set
correctly.

Fix this by properly assigning the function pointers from the core
capability to the instance capability, ensuring that the properties are
correctly applied to the firmware.

Cc: stable@vger.kernel.org
Fixes: 3a19d7b9e08b ("media: iris: implement set properties to firmware during streamon")
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_ctrls.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 915de101fcba..13f5cf0d0e8a 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -157,6 +157,7 @@ void iris_session_init_caps(struct iris_core *core)
 		core->inst_fw_caps[cap_id].value = caps[i].value;
 		core->inst_fw_caps[cap_id].flags = caps[i].flags;
 		core->inst_fw_caps[cap_id].hfi_id = caps[i].hfi_id;
+		core->inst_fw_caps[cap_id].set = caps[i].set;
 	}
 }
 

-- 
2.34.1


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

* [PATCH 13/20] media: iris: Fix NULL pointer dereference
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (11 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 12/20] media: iris: Fix missing function pointer initialization Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 14/20] media: iris: Fix typo in depth variable Dikshita Agarwal
                   ` (8 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal, stable, Dan Carpenter

A warning reported by smatch indicated a possible null pointer
dereference where one of the arguments to API
"iris_hfi_gen2_handle_system_error" could sometimes be null.

To fix this, add a check to validate that the argument passed is not
null before accessing its members.

Cc: stable@vger.kernel.org
Fixes: fb583a214337 ("media: iris: introduce host firmware interface with necessary hooks")
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Closes: https://lore.kernel.org/linux-media/634cc9b8-f099-4b54-8556-d879fb2b5169@stanley.mountain/
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

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 de823a314efd..2267e220c9ea 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -267,7 +267,8 @@ static int iris_hfi_gen2_handle_system_error(struct iris_core *core,
 {
 	struct iris_inst *instance;
 
-	dev_err(core->dev, "received system error of type %#x\n", pkt->type);
+	if (pkt)
+		dev_err(core->dev, "received system error of type %#x\n", pkt->type);
 
 	core->state = IRIS_CORE_ERROR;
 

-- 
2.34.1


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

* [PATCH 14/20] media: iris: Fix typo in depth variable
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (12 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 13/20] media: iris: Fix NULL pointer dereference Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 15/20] media: iris: Add a comment to explain usage of MBPS Dikshita Agarwal
                   ` (7 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal, stable

Correct a typo from "dpeth" to "depth".

Cc: stable@vger.kernel.org
Fixes: 3a19d7b9e08b ("media: iris: implement set properties to firmware during streamon")
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
index a908b41e2868..802fa62c26eb 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -178,7 +178,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);
@@ -378,7 +378,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             },

-- 
2.34.1


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

* [PATCH 15/20] media: iris: Add a comment to explain usage of MBPS
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (13 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 14/20] media: iris: Fix typo in depth variable Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 16/20] media: iris: Add HEVC and VP9 formats for decoder Dikshita Agarwal
                   ` (6 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

Add a comment to explain usage of MBPS and define a macro for 8K
resolution for better readability

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

diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index c00fd4a83ba7..229697b2257a 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -21,6 +21,7 @@ struct iris_inst;
 #define DEFAULT_MAX_HOST_BUF_COUNT		64
 #define DEFAULT_MAX_HOST_BURST_BUF_COUNT	256
 #define DEFAULT_FPS				30
+#define NUM_MBS_8K				((8192 * 4352) / 256)
 
 enum stage_type {
 	STAGE_1 = 1,
@@ -168,6 +169,7 @@ struct iris_platform_data {
 	struct ubwc_config_data *ubwc_config;
 	u32 num_vpp_pipe;
 	u32 max_session_count;
+	/* max number of macroblocks per frame supported */
 	u32 max_core_mbpf;
 	const u32 *input_config_params;
 	unsigned int input_config_params_size;
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
index 543fa2661539..8183e4e95fa4 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
@@ -127,7 +127,7 @@ struct iris_platform_data sm8250_data = {
 	.hw_response_timeout = HW_RESPONSE_TIMEOUT_VALUE,
 	.num_vpp_pipe = 4,
 	.max_session_count = 16,
-	.max_core_mbpf = (8192 * 4352) / 256,
+	.max_core_mbpf = NUM_MBS_8K,
 	.input_config_params =
 		sm8250_vdec_input_config_param_default,
 	.input_config_params_size =
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
index 35d278996c43..49e775dd1b95 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
@@ -245,7 +245,7 @@ struct iris_platform_data sm8550_data = {
 	.ubwc_config = &ubwc_config_sm8550,
 	.num_vpp_pipe = 4,
 	.max_session_count = 16,
-	.max_core_mbpf = ((8192 * 4352) / 256) * 2,
+	.max_core_mbpf = NUM_MBS_8K * 2,
 	.input_config_params =
 		sm8550_vdec_input_config_params,
 	.input_config_params_size =

-- 
2.34.1


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

* [PATCH 16/20] media: iris: Add HEVC and VP9 formats for decoder
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (14 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 15/20] media: iris: Add a comment to explain usage of MBPS Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 17/20] media: iris: Add platform capabilities for HEVC and VP9 decoders Dikshita Agarwal
                   ` (5 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

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.

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 .../platform/qcom/iris/iris_hfi_gen1_command.c     | 15 ++++-
 .../platform/qcom/iris/iris_hfi_gen1_defines.h     |  2 +
 .../platform/qcom/iris/iris_hfi_gen2_command.c     | 14 ++++-
 .../platform/qcom/iris/iris_hfi_gen2_defines.h     |  3 +
 drivers/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, 108 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 f9f3e2d2ce29..8b7c7822a4d4 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -88,16 +88,29 @@ 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 = 0;
 	int ret;
 
 	if (inst->state != IRIS_INST_DEINIT)
 		return -EALREADY;
 
+	switch (inst->codec) {
+	case V4L2_PIX_FMT_H264:
+		codec = HFI_VIDEO_CODEC_H264;
+		break;
+	case V4L2_PIX_FMT_HEVC:
+		codec = HFI_VIDEO_CODEC_HEVC;
+		break;
+	case V4L2_PIX_FMT_VP9:
+		codec = HFI_VIDEO_CODEC_VP9;
+		break;
+	}
+
 	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 adffcead58ea..d4d119ca98b0 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 802fa62c26eb..f23be2340658 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -416,7 +416,19 @@ 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 = 0;
+
+	switch (inst->codec) {
+	case V4L2_PIX_FMT_H264:
+		codec = HFI_CODEC_DECODE_AVC;
+		break;
+	case V4L2_PIX_FMT_HEVC:
+		codec = HFI_CODEC_DECODE_HEVC;
+		break;
+	case V4L2_PIX_FMT_VP9:
+		codec = HFI_CODEC_DECODE_VP9;
+		break;
+	}
 
 	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 666061a612c3..283d2f27e4c8 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 5150237f0020..43239e7c678f 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
  * @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
  */
@@ -74,6 +75,7 @@ struct iris_inst {
 	u32				sequence_out;
 	struct iris_ts_metadata		tss[VIDEO_MAX_FRAME];
 	u32				metadata_idx;
+	u32				codec;
 	bool				in_reconfig;
 	bool				last_buffer_dequeued;
 };
diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
index 1305b981a72d..ed99dadaf0f9 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)
+{
+	unsigned int size = ARRAY_SIZE(iris_vdec_formats);
+	const struct iris_fmt *fmt = 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	[flat|nested] 44+ messages in thread

* [PATCH 17/20] media: iris: Add platform capabilities for HEVC and VP9 decoders
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (15 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 16/20] media: iris: Add HEVC and VP9 formats for decoder Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 18/20] media: iris: Set mandatory properties " Dikshita Agarwal
                   ` (4 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

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

Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_ctrls.c      | 28 ++++++--
 .../platform/qcom/iris/iris_hfi_gen2_command.c     | 28 +++++++-
 .../platform/qcom/iris/iris_hfi_gen2_defines.h     |  1 +
 .../platform/qcom/iris/iris_hfi_gen2_response.c    | 34 +++++++--
 .../platform/qcom/iris/iris_platform_common.h      |  8 ++-
 .../platform/qcom/iris/iris_platform_sm8550.c      | 80 +++++++++++++++++++++-
 6 files changed, 165 insertions(+), 14 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 13f5cf0d0e8a..9136b723c0f2 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -18,9 +18,19 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
 {
 	switch (id) {
 	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;
 	}
@@ -32,10 +42,20 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
 		return 0;
 
 	switch (cap_id) {
-	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 f23be2340658..8c91d336ff7e 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -295,7 +295,19 @@ 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 = 0;
+
+	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:
+		profile = inst->fw_caps[PROFILE_H264].value;
+		break;
+	}
 
 	inst_hfi_gen2->src_subcr_params.profile = profile;
 
@@ -312,7 +324,19 @@ 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 = 0;
+
+	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:
+		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 283d2f27e4c8..5f13dc11bea5 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 2267e220c9ea..1b8787c0f6a7 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -572,8 +572,21 @@ 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:
+		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 ||
@@ -797,8 +810,21 @@ 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:
+		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 229697b2257a..45507929efa4 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -79,8 +79,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,
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
index 49e775dd1b95..6f0688377dc6 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	[flat|nested] 44+ messages in thread

* [PATCH 18/20] media: iris: Set mandatory properties for HEVC and VP9 decoders.
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (16 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 17/20] media: iris: Add platform capabilities for HEVC and VP9 decoders Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 19/20] media: iris: Add internal buffer calculation " Dikshita Agarwal
                   ` (3 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

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

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_common.h |  1 +
 .../platform/qcom/iris/iris_hfi_gen1_command.c     |  4 +-
 .../platform/qcom/iris/iris_hfi_gen2_command.c     | 97 +++++++++++++++++++---
 .../platform/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, 161 insertions(+), 29 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 8b7c7822a4d4..b98f781b4f48 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -774,8 +774,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 8c91d336ff7e..7ca5ae13d62b 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -391,11 +391,28 @@ 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;
-	u32 config_params_size, i, j;
-	const u32 *config_params;
+	u32 config_params_size = 0, i, j;
+	const u32 *config_params = NULL;
 	int ret;
 
 	static const struct iris_hfi_prop_type_handle prop_type_handle_arr[] = {
@@ -410,11 +427,27 @@ 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;
+		switch (inst->codec) {
+		case 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;
+			break;
+		case 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;
+			break;
+		case 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;
+			break;
+		}
 	} else {
 		config_params = core->iris_platform_data->output_config_params;
 		config_params_size = core->iris_platform_data->output_config_params_size;
@@ -584,8 +617,8 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
 	struct hfi_subscription_params subsc_params;
 	u32 prop_type, payload_size, payload_type;
 	struct iris_core *core = inst->core;
-	const u32 *change_param;
-	u32 change_param_size;
+	const u32 *change_param = NULL;
+	u32 change_param_size = 0;
 	u32 payload[32] = {0};
 	u32 hfi_port = 0, i;
 	int ret;
@@ -596,8 +629,23 @@ 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;
+	switch (inst->codec) {
+	case 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;
+		break;
+	case 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;
+		break;
+	case 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;
+		break;
+	}
 
 	payload[0] = HFI_MODE_PORT_SETTINGS_CHANGE;
 
@@ -644,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);
@@ -669,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;
@@ -695,8 +753,8 @@ static int iris_hfi_gen2_subscribe_change_param(struct iris_inst *inst, u32 plan
 static int iris_hfi_gen2_subscribe_property(struct iris_inst *inst, u32 plane)
 {
 	struct iris_core *core = inst->core;
-	u32 subscribe_prop_size, i;
-	const u32 *subcribe_prop;
+	u32 subscribe_prop_size = 0, i;
+	const u32 *subcribe_prop = NULL;
 	u32 payload[32] = {0};
 
 	payload[0] = HFI_MODE_PROPERTY;
@@ -705,8 +763,23 @@ 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;
+		switch (inst->codec) {
+		case 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;
+			break;
+		case 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;
+			break;
+		case 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;
+			break;
+		}
 	}
 
 	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 1b8787c0f6a7..221f84d98a48 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -588,6 +588,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)) {
@@ -669,6 +670,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;
@@ -687,6 +691,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 45507929efa4..a7f9eb1d269a 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -175,14 +175,22 @@ struct iris_platform_data {
 	u32 max_session_count;
 	/* max number of macroblocks per frame supported */
 	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 8183e4e95fa4..8d0816a67ae0 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c
@@ -128,9 +128,9 @@ struct iris_platform_data sm8250_data = {
 	.num_vpp_pipe = 4,
 	.max_session_count = 16,
 	.max_core_mbpf = NUM_MBS_8K,
-	.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 6f0688377dc6..7260becdb102 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 = NUM_MBS_8K * 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	[flat|nested] 44+ messages in thread

* [PATCH 19/20] media: iris: Add internal buffer calculation for HEVC and VP9 decoders
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (17 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 18/20] media: iris: Set mandatory properties " Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 15:54 ` [PATCH 20/20] media: iris: Add codec specific check for VP9 decoder drain handling Dikshita Agarwal
                   ` (2 subsequent siblings)
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

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

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_buffer.c     |   3 +
 drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
 drivers/media/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 c091a49bd140..9e5ef7cb803a 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	[flat|nested] 44+ messages in thread

* [PATCH 20/20] media: iris: Add codec specific check for VP9 decoder drain handling
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (18 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 19/20] media: iris: Add internal buffer calculation " Dikshita Agarwal
@ 2025-04-08 15:54 ` Dikshita Agarwal
  2025-04-08 18:37 ` [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Nicolas Dufresne
  2025-04-09 14:29 ` Bryan O'Donoghue
  21 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-08 15:54 UTC (permalink / raw)
  To: Vikash Garodia, Abhinav Kumar, Mauro Carvalho Chehab,
	Stefan Schmidt, Hans Verkuil, Bjorn Andersson, Konrad Dybcio,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree,
	Dikshita Agarwal

Add a codec specific for the VP9 decoder to ensure that a non-null
buffer is sent to the firmware during drain. The firmware enforces a
check for VP9 decoder that the number of buffers queued and dequeued on
the output plane should match. When a null buffer is sent, the firmware
does not return a response for it, leading to a count mismatch and an
assertion failure from the firmware.

Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c  | 2 ++
 drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c | 4 ++++
 2 files changed, 6 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 b98f781b4f48..d198094c2920 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
@@ -399,6 +399,8 @@ 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;
+	if (inst->codec == V4L2_PIX_FMT_VP9)
+		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 dfca45d85759..017aa9dc0b79 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
@@ -348,6 +348,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	[flat|nested] 44+ messages in thread

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (19 preceding siblings ...)
  2025-04-08 15:54 ` [PATCH 20/20] media: iris: Add codec specific check for VP9 decoder drain handling Dikshita Agarwal
@ 2025-04-08 18:37 ` Nicolas Dufresne
  2025-04-21 11:05   ` Dikshita Agarwal
  2025-04-09 14:29 ` Bryan O'Donoghue
  21 siblings, 1 reply; 44+ messages in thread
From: Nicolas Dufresne @ 2025-04-08 18:37 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree, stable,
	Dan Carpenter

Hi,

This is for Bryan and Vikash to review first, but here's some initial feedback on that report.

Le mardi 08 avril 2025 à 21:24 +0530, Dikshita Agarwal a écrit :
> 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.
> 
> These patches also address the comments and feedback received from the 
> RFC patches previously sent. I have made the necessary improvements 
> based on the community's suggestions.
> 
> Changes sinces RFC:
> - Added additional fixes to address issues identified during further 
> testing.
> - Moved typo fix to a seperate patch [Neil]
> - Reordered the patches for better logical flow and clarity [Neil, 
> Dmitry]
> - Added fixes tag wherever applicable [Neil, Dmitry]
> - Removed the default case in the switch statement for codecs [Bryan]
> - Replaced if-else statements with switch-case [Bryan]
> - Added comments for mbpf [Bryan]
> - RFC: https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
> 
> These patches are tested on SM8250 and SM8550 with v4l2-ctl and 
> Gstreamer for HEVC and VP9 decoders, at the same time ensured that 
> the existing H264 decoder functionality remains uneffected.
> 
> Note: 1 of the fluster compliance test is fixed with firmware [1]
> [1]: https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u 
> 
> The result of fluster test on SM8550:
>  131/147 testcases passed while testing JCT-VC-HEVC_V1 with 
>  GStreamer-H.265-V4L2-Gst1.0.
>  The failing test case:
>  - 10 testcases failed due to unsupported 10 bit format.
>    - DBLK_A_MAIN10_VIXS_4
>    - INITQP_B_Main10_Sony_1
>    - TSUNEQBD_A_MAIN10_Technicolor_2
>    - WP_A_MAIN10_Toshiba_3
>    - WP_MAIN10_B_Toshiba_3
>    - WPP_A_ericsson_MAIN10_2
>    - WPP_B_ericsson_MAIN10_2
>    - WPP_C_ericsson_MAIN10_2
>    - WPP_E_ericsson_MAIN10_2
>    - WPP_F_ericsson_MAIN10_2
>  - 4 testcase failed due to unsupported resolution
>    - PICSIZE_A_Bossen_1
>    - PICSIZE_B_Bossen_1
>    - WPP_D_ericsson_MAIN10_2
>    - WPP_D_ericsson_MAIN_2 
>  - 1 testcase failed as bitstream is invalid (this fails with reference 
>    as well)
>    - RAP_B_Bossen_2

I was surprised of this comment, so I ran it myself through the
official JCT reference decoder.

   [JCT-VC-HEVC_V1] (JCT-VT-H.265) RAP_B_Bossen_2                  ... Success

I'm pretty sure this stream is valid. I personally care about these
reports since otherwise we cannot differentiate HW limitation, FW bugs
or V4L2 API limitation. The later is really something we want to know
about, since we can fix it. We cannot fix HW, and its up to the vendor
to fix their firmware.

This specific test is very nice test. It changes the coding
width/height but keeps the conf window the same (416x240).

Here's the coded size changes I could see:

Frame  0: 448 x 256
Frame 25: 416 x 240
Frame 70: 448 x 256

Each time, the driver must sent SRC_CHANGE, and if all went well, the
decoder should reallocate. Note that all this code in GStreamer is
recent, so it also a possibility, but something we can fix. I haven't
tried ffmpeg much, but same.

>  - 1 testcase failed due to CRC mismatch
>    - RAP_A_docomo_6
>      Analysis - First few frames in this discarded by firmware and are 
>      sent to driver with 0 filled length. Driver send such buffers to
>      client with timestamp 0 and payload set to 0 and 
>      make buf state to VB2_BUF_STATE_ERROR. Such buffers should be 
>      dropped by GST. But instead, the first frame displayed as green 
>      frame and when a valid buffer is sent to client later with same 0 
>      timestamp, its dropped, leading to CRC mismatch for first frame.

This looks like a firmware bug, even if GStreamer had drop them all,
the CRC would still miss-match.

Important question is if this worked on Venus firmware ? If so, it
sounds like it should be addressed.

> 
>  235/305 testcases passed while testing VP9-TEST-VECTORS with 
>  GStreamer-VP9-V4L2-Gst1.0.
>  The failing test case:
>  - 64 testcases failed due to unsupported resolution
>    - vp90-2-02-size-08x08.webm
>    - vp90-2-02-size-08x10.webm
>    - vp90-2-02-size-08x16.webm
>    - vp90-2-02-size-08x18.webm
>    - vp90-2-02-size-08x32.webm
>    - vp90-2-02-size-08x34.webm
>    - vp90-2-02-size-08x64.webm
>    - vp90-2-02-size-08x66.webm
>    - vp90-2-02-size-10x08.webm
>    - vp90-2-02-size-10x10.webm
>    - vp90-2-02-size-10x16.webm
>    - vp90-2-02-size-10x18.webm
>    - vp90-2-02-size-10x32.webm
>    - vp90-2-02-size-10x34.webm
>    - vp90-2-02-size-10x64.webm
>    - vp90-2-02-size-10x66.webm
>    - vp90-2-02-size-16x08.webm
>    - vp90-2-02-size-16x10.webm
>    - vp90-2-02-size-16x16.webm
>    - vp90-2-02-size-16x18.webm
>    - vp90-2-02-size-16x32.webm
>    - vp90-2-02-size-16x34.webm
>    - vp90-2-02-size-16x64.webm
>    - vp90-2-02-size-16x66.webm
>    - vp90-2-02-size-18x08.webm
>    - vp90-2-02-size-18x10.webm
>    - vp90-2-02-size-18x16.webm
>    - vp90-2-02-size-18x18.webm
>    - vp90-2-02-size-18x32.webm
>    - vp90-2-02-size-18x34.webm
>    - vp90-2-02-size-18x64.webm
>    - vp90-2-02-size-18x66.webm
>    - vp90-2-02-size-32x08.webm
>    - vp90-2-02-size-32x10.webm
>    - vp90-2-02-size-32x16.webm
>    - vp90-2-02-size-32x18.webm
>    - vp90-2-02-size-32x32.webm
>    - vp90-2-02-size-32x34.webm
>    - vp90-2-02-size-32x64.webm
>    - vp90-2-02-size-32x66.webm
>    - vp90-2-02-size-34x08.webm
>    - vp90-2-02-size-34x10.webm
>    - vp90-2-02-size-34x16.webm
>    - vp90-2-02-size-34x18.webm
>    - vp90-2-02-size-34x32.webm
>    - vp90-2-02-size-34x34.webm
>    - vp90-2-02-size-34x64.webm
>    - vp90-2-02-size-34x66.webm
>    - vp90-2-02-size-64x08.webm
>    - vp90-2-02-size-64x10.webm
>    - vp90-2-02-size-64x16.webm
>    - vp90-2-02-size-64x18.webm
>    - vp90-2-02-size-64x32.webm
>    - vp90-2-02-size-64x34.webm
>    - vp90-2-02-size-64x64.webm
>    - vp90-2-02-size-64x66.webm
>    - vp90-2-02-size-66x08.webm
>    - vp90-2-02-size-66x10.webm
>    - vp90-2-02-size-66x16.webm
>    - vp90-2-02-size-66x18.webm
>    - vp90-2-02-size-66x32.webm
>    - vp90-2-02-size-66x34.webm
>    - vp90-2-02-size-66x64.webm
>    - vp90-2-02-size-66x66.webm
>  - 2 testcases failed due to unsupported format
>    - vp91-2-04-yuv422.webm
>    - vp91-2-04-yuv444.webm
>  - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>    - vp90-2-22-svc_1280x720_3.ivf

Not completely true:

	[VP9-TEST-VECTORS] (libvpx-VP9) vp90-2-22-svc_1280x720_3.ivf ... Success

But fails with the GStreamer libvpx integration. Would you mind filling
an issue please ? There is clearly a GStreamer bug (not a reference
one), please document it as-such in the next report.

>  - 2 testcase failed due to unsupported resolution after sequence change
>    - vp90-2-21-resize_inter_320x180_5_1-2.webm
>    - vp90-2-21-resize_inter_320x180_7_1-2.webm

Just be more precise, inter-frame resolution changes are not currently
supported in V4L2 stateful decoders. The concept and internals are
ready though. Basically, userpace would have to progressively re-
allocate the frames as they get dequeued, before being re-queued. That
is significant userspace modification, fine to not support it atm.

>  - 1 testcase failed due to unsupported stream
>    - vp90-2-16-intra-only.webm
>  Note: There is a timing issue with the clips having multiple resolution 
>  change. Where firmware returned all the buffers with previous sequence 
>  and has no buffer left to attach the LAST flag to. At the same time,
>  client is not queueing any further buffers, so there is deadlock where 
>  client is waiting for LAST flag, while firmware doesn't have any 
>  capture buffer to attach LAST flag to.
>  Ideally client should keep queueing the buffers on capture queue untill
>  the LAST flag is received.

At least GStreamer do, so I slightly doubt your analyzes (happy to see
a bug report with relevant demonstration showing that !). I'll read it
as there is still bug with the resolution change draining process in
this driver.

> 
> The result of fluster test on SM8250:
>  132/147 testcases passed while testing JCT-VC-HEVC_V1 with
>  GStreamer-H.265-V4L2-Gst1.0.
>  The failing test case:
>  - 10 testcases failed due to unsupported 10 bit format.
>    - DBLK_A_MAIN10_VIXS_4
>    - INITQP_B_Main10_Sony_1
>    - TSUNEQBD_A_MAIN10_Technicolor_2
>    - WP_A_MAIN10_Toshiba_3
>    - WP_MAIN10_B_Toshiba_3
>    - WPP_A_ericsson_MAIN10_2
>    - WPP_B_ericsson_MAIN10_2
>    - WPP_C_ericsson_MAIN10_2
>    - WPP_E_ericsson_MAIN10_2
>    - WPP_F_ericsson_MAIN10_2
>  - 4 testcase failed due to unsupported resolution
>    - PICSIZE_A_Bossen_1
>    - PICSIZE_B_Bossen_1
>    - WPP_D_ericsson_MAIN10_2
>    - WPP_D_ericsson_MAIN_2
>  - 1 testcase failed as bitstream is invalid (this fails with reference
>    as well)
>    - RAP_B_Bossen_2
> 
>  232/305 testcases passed while testing VP9-TEST-VECTORS with
>  GStreamer-VP9-V4L2-Gst1.0.
>  The failing test case:
>  - 64 testcases failed due to unsupported resolution
>    - vp90-2-02-size-08x08.webm
>    - vp90-2-02-size-08x10.webm
>    - vp90-2-02-size-08x16.webm
>    - vp90-2-02-size-08x18.webm
>    - vp90-2-02-size-08x32.webm
>    - vp90-2-02-size-08x34.webm
>    - vp90-2-02-size-08x64.webm
>    - vp90-2-02-size-08x66.webm
>    - vp90-2-02-size-10x08.webm
>    - vp90-2-02-size-10x10.webm
>    - vp90-2-02-size-10x16.webm
>    - vp90-2-02-size-10x18.webm
>    - vp90-2-02-size-10x32.webm
>    - vp90-2-02-size-10x34.webm
>    - vp90-2-02-size-10x64.webm
>    - vp90-2-02-size-10x66.webm
>    - vp90-2-02-size-16x08.webm
>    - vp90-2-02-size-16x10.webm
>    - vp90-2-02-size-16x16.webm
>    - vp90-2-02-size-16x18.webm
>    - vp90-2-02-size-16x32.webm
>    - vp90-2-02-size-16x34.webm
>    - vp90-2-02-size-16x64.webm
>    - vp90-2-02-size-16x66.webm
>    - vp90-2-02-size-18x08.webm
>    - vp90-2-02-size-18x10.webm
>    - vp90-2-02-size-18x16.webm
>    - vp90-2-02-size-18x18.webm
>    - vp90-2-02-size-18x32.webm
>    - vp90-2-02-size-18x34.webm
>    - vp90-2-02-size-18x64.webm
>    - vp90-2-02-size-18x66.webm
>    - vp90-2-02-size-32x08.webm
>    - vp90-2-02-size-32x10.webm
>    - vp90-2-02-size-32x16.webm
>    - vp90-2-02-size-32x18.webm
>    - vp90-2-02-size-32x32.webm
>    - vp90-2-02-size-32x34.webm
>    - vp90-2-02-size-32x64.webm
>    - vp90-2-02-size-32x66.webm
>    - vp90-2-02-size-34x08.webm
>    - vp90-2-02-size-34x10.webm
>    - vp90-2-02-size-34x16.webm
>    - vp90-2-02-size-34x18.webm
>    - vp90-2-02-size-34x32.webm
>    - vp90-2-02-size-34x34.webm
>    - vp90-2-02-size-34x64.webm
>    - vp90-2-02-size-34x66.webm
>    - vp90-2-02-size-64x08.webm
>    - vp90-2-02-size-64x10.webm
>    - vp90-2-02-size-64x16.webm
>    - vp90-2-02-size-64x18.webm
>    - vp90-2-02-size-64x32.webm
>    - vp90-2-02-size-64x34.webm
>    - vp90-2-02-size-64x64.webm
>    - vp90-2-02-size-64x66.webm
>    - vp90-2-02-size-66x08.webm
>    - vp90-2-02-size-66x10.webm
>    - vp90-2-02-size-66x16.webm
>    - vp90-2-02-size-66x18.webm
>    - vp90-2-02-size-66x32.webm
>    - vp90-2-02-size-66x34.webm
>    - vp90-2-02-size-66x64.webm
>    - vp90-2-02-size-66x66.webm
>  - 2 testcases failed due to unsupported format
>    - vp91-2-04-yuv422.webm
>    - vp91-2-04-yuv444.webm
>  - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>    - vp90-2-22-svc_1280x720_3.ivf
>  - 5 testcase failed due to unsupported resolution after sequence change
>    - vp90-2-21-resize_inter_320x180_5_1-2.webm
>    - vp90-2-21-resize_inter_320x180_7_1-2.webm
>    - vp90-2-21-resize_inter_320x240_5_1-2.webm
>    - vp90-2-21-resize_inter_320x240_7_1-2.webm
>    - vp90-2-18-resize.ivf
>  - 1 testcase failed with CRC mismatch
>    - vp90-2-16-intra-only.webm
>    Analysis: First few frames are marked by firmware as NO_SHOW frame.
>    Driver make buf state to VB2_BUF_STATE_ERROR for such frames.
>    Such buffers should be dropped by GST. But instead, the first frame 
>    is being displayed and when a valid buffer is sent to client later
>    with same timestamp, its dropped, leading to CRC mismatch for first 
>    frame.

I checked this one, 3 first frame are "decode only" indeed. Though, by
returning these buffer with STATE_ERROR, you loose the ability to show
these frame later. GStreamer should be fixed to do internal ref frame
management, not silently drop these though.

What you can do instead, is leave these frames queued, and only mark
them done once you hit a matching show_existing_frame. It will fix this
specific stream (and most usage of show existing frame in the wild),
but show-existing frame will remain broken. The other solution is to
keep the reference frame internal, and output copies, but that imply
some HW design, and also cost quite a lot in bandwidth.

This test hits the known V4L2 queue limitation that it can only output
a frame once, and can only input a frame once (you cannot encode twice
the same frame notably). I open to suggestion how to fix those, but I
don't have any solutions for now.

p.s. a third solution is make the firmware stateless :-D

>  Note: Same timing issue as observed on SM8550 is seen on SM8250 as 
>  well.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
> Dikshita Agarwal (20):
>       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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>       media: iris: Add handling for no show frames
>       media: iris: Improve last flag handling
>       media: iris: Skip flush on first sequence change
>       media: iris: Prevent HFI queue writes when core is in deinit state
>       media: iris: Remove redundant buffer count check in stream off
>       media: iris: Remove deprecated property setting to firmware
>       media: iris: Fix missing function pointer initialization
>       media: iris: Fix NULL pointer dereference
>       media: iris: Fix typo in depth variable
>       media: iris: Add a comment to explain usage of MBPS
>       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: Add codec specific check for VP9 decoder drain handling
> 
>  drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>  drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>  drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>  .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>  .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>  .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>  .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>  .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>  .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>  drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>  drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>  .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>  .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>  .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>  drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>  drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>  drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>  drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>  drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
>  drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>  20 files changed, 948 insertions(+), 153 deletions(-)
> ---
> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
> 
> Best regards,

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

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
                   ` (20 preceding siblings ...)
  2025-04-08 18:37 ` [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Nicolas Dufresne
@ 2025-04-09 14:29 ` Bryan O'Donoghue
  2025-04-09 14:37   ` Bryan O'Donoghue
                     ` (2 more replies)
  21 siblings, 3 replies; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-09 14:29 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable, Dan Carpenter

On 08/04/2025 16:54, 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.
> 
> These patches also address the comments and feedback received from the
> RFC patches previously sent. I have made the necessary improvements
> based on the community's suggestions.
> 
> Changes sinces RFC:
> - Added additional fixes to address issues identified during further
> testing.
> - Moved typo fix to a seperate patch [Neil]
> - Reordered the patches for better logical flow and clarity [Neil,
> Dmitry]
> - Added fixes tag wherever applicable [Neil, Dmitry]
> - Removed the default case in the switch statement for codecs [Bryan]
> - Replaced if-else statements with switch-case [Bryan]
> - Added comments for mbpf [Bryan]
> - RFC: https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
> 
> These patches are tested on SM8250 and SM8550 with v4l2-ctl and
> Gstreamer for HEVC and VP9 decoders, at the same time ensured that
> the existing H264 decoder functionality remains uneffected.
> 
> Note: 1 of the fluster compliance test is fixed with firmware [1]
> [1]: https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u
> 
> The result of fluster test on SM8550:
>   131/147 testcases passed while testing JCT-VC-HEVC_V1 with
>   GStreamer-H.265-V4L2-Gst1.0.
>   The failing test case:
>   - 10 testcases failed due to unsupported 10 bit format.
>     - DBLK_A_MAIN10_VIXS_4
>     - INITQP_B_Main10_Sony_1
>     - TSUNEQBD_A_MAIN10_Technicolor_2
>     - WP_A_MAIN10_Toshiba_3
>     - WP_MAIN10_B_Toshiba_3
>     - WPP_A_ericsson_MAIN10_2
>     - WPP_B_ericsson_MAIN10_2
>     - WPP_C_ericsson_MAIN10_2
>     - WPP_E_ericsson_MAIN10_2
>     - WPP_F_ericsson_MAIN10_2
>   - 4 testcase failed due to unsupported resolution
>     - PICSIZE_A_Bossen_1
>     - PICSIZE_B_Bossen_1
>     - WPP_D_ericsson_MAIN10_2
>     - WPP_D_ericsson_MAIN_2
>   - 1 testcase failed as bitstream is invalid (this fails with reference
>     as well)
>     - RAP_B_Bossen_2
>   - 1 testcase failed due to CRC mismatch
>     - RAP_A_docomo_6
>       Analysis - First few frames in this discarded by firmware and are
>       sent to driver with 0 filled length. Driver send such buffers to
>       client with timestamp 0 and payload set to 0 and
>       make buf state to VB2_BUF_STATE_ERROR. Such buffers should be
>       dropped by GST. But instead, the first frame displayed as green
>       frame and when a valid buffer is sent to client later with same 0
>       timestamp, its dropped, leading to CRC mismatch for first frame.
> 
>   235/305 testcases passed while testing VP9-TEST-VECTORS with
>   GStreamer-VP9-V4L2-Gst1.0.
>   The failing test case:
>   - 64 testcases failed due to unsupported resolution
>     - vp90-2-02-size-08x08.webm
>     - vp90-2-02-size-08x10.webm
>     - vp90-2-02-size-08x16.webm
>     - vp90-2-02-size-08x18.webm
>     - vp90-2-02-size-08x32.webm
>     - vp90-2-02-size-08x34.webm
>     - vp90-2-02-size-08x64.webm
>     - vp90-2-02-size-08x66.webm
>     - vp90-2-02-size-10x08.webm
>     - vp90-2-02-size-10x10.webm
>     - vp90-2-02-size-10x16.webm
>     - vp90-2-02-size-10x18.webm
>     - vp90-2-02-size-10x32.webm
>     - vp90-2-02-size-10x34.webm
>     - vp90-2-02-size-10x64.webm
>     - vp90-2-02-size-10x66.webm
>     - vp90-2-02-size-16x08.webm
>     - vp90-2-02-size-16x10.webm
>     - vp90-2-02-size-16x16.webm
>     - vp90-2-02-size-16x18.webm
>     - vp90-2-02-size-16x32.webm
>     - vp90-2-02-size-16x34.webm
>     - vp90-2-02-size-16x64.webm
>     - vp90-2-02-size-16x66.webm
>     - vp90-2-02-size-18x08.webm
>     - vp90-2-02-size-18x10.webm
>     - vp90-2-02-size-18x16.webm
>     - vp90-2-02-size-18x18.webm
>     - vp90-2-02-size-18x32.webm
>     - vp90-2-02-size-18x34.webm
>     - vp90-2-02-size-18x64.webm
>     - vp90-2-02-size-18x66.webm
>     - vp90-2-02-size-32x08.webm
>     - vp90-2-02-size-32x10.webm
>     - vp90-2-02-size-32x16.webm
>     - vp90-2-02-size-32x18.webm
>     - vp90-2-02-size-32x32.webm
>     - vp90-2-02-size-32x34.webm
>     - vp90-2-02-size-32x64.webm
>     - vp90-2-02-size-32x66.webm
>     - vp90-2-02-size-34x08.webm
>     - vp90-2-02-size-34x10.webm
>     - vp90-2-02-size-34x16.webm
>     - vp90-2-02-size-34x18.webm
>     - vp90-2-02-size-34x32.webm
>     - vp90-2-02-size-34x34.webm
>     - vp90-2-02-size-34x64.webm
>     - vp90-2-02-size-34x66.webm
>     - vp90-2-02-size-64x08.webm
>     - vp90-2-02-size-64x10.webm
>     - vp90-2-02-size-64x16.webm
>     - vp90-2-02-size-64x18.webm
>     - vp90-2-02-size-64x32.webm
>     - vp90-2-02-size-64x34.webm
>     - vp90-2-02-size-64x64.webm
>     - vp90-2-02-size-64x66.webm
>     - vp90-2-02-size-66x08.webm
>     - vp90-2-02-size-66x10.webm
>     - vp90-2-02-size-66x16.webm
>     - vp90-2-02-size-66x18.webm
>     - vp90-2-02-size-66x32.webm
>     - vp90-2-02-size-66x34.webm
>     - vp90-2-02-size-66x64.webm
>     - vp90-2-02-size-66x66.webm
>   - 2 testcases failed due to unsupported format
>     - vp91-2-04-yuv422.webm
>     - vp91-2-04-yuv444.webm
>   - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>     - vp90-2-22-svc_1280x720_3.ivf
>   - 2 testcase failed due to unsupported resolution after sequence change
>     - vp90-2-21-resize_inter_320x180_5_1-2.webm
>     - vp90-2-21-resize_inter_320x180_7_1-2.webm
>   - 1 testcase failed due to unsupported stream
>     - vp90-2-16-intra-only.webm
>   Note: There is a timing issue with the clips having multiple resolution
>   change. Where firmware returned all the buffers with previous sequence
>   and has no buffer left to attach the LAST flag to. At the same time,
>   client is not queueing any further buffers, so there is deadlock where
>   client is waiting for LAST flag, while firmware doesn't have any
>   capture buffer to attach LAST flag to.
>   Ideally client should keep queueing the buffers on capture queue untill
>   the LAST flag is received.
> 
> The result of fluster test on SM8250:
>   132/147 testcases passed while testing JCT-VC-HEVC_V1 with
>   GStreamer-H.265-V4L2-Gst1.0.
>   The failing test case:
>   - 10 testcases failed due to unsupported 10 bit format.
>     - DBLK_A_MAIN10_VIXS_4
>     - INITQP_B_Main10_Sony_1
>     - TSUNEQBD_A_MAIN10_Technicolor_2
>     - WP_A_MAIN10_Toshiba_3
>     - WP_MAIN10_B_Toshiba_3
>     - WPP_A_ericsson_MAIN10_2
>     - WPP_B_ericsson_MAIN10_2
>     - WPP_C_ericsson_MAIN10_2
>     - WPP_E_ericsson_MAIN10_2
>     - WPP_F_ericsson_MAIN10_2
>   - 4 testcase failed due to unsupported resolution
>     - PICSIZE_A_Bossen_1
>     - PICSIZE_B_Bossen_1
>     - WPP_D_ericsson_MAIN10_2
>     - WPP_D_ericsson_MAIN_2
>   - 1 testcase failed as bitstream is invalid (this fails with reference
>     as well)
>     - RAP_B_Bossen_2
> 
>   232/305 testcases passed while testing VP9-TEST-VECTORS with
>   GStreamer-VP9-V4L2-Gst1.0.
>   The failing test case:
>   - 64 testcases failed due to unsupported resolution
>     - vp90-2-02-size-08x08.webm
>     - vp90-2-02-size-08x10.webm
>     - vp90-2-02-size-08x16.webm
>     - vp90-2-02-size-08x18.webm
>     - vp90-2-02-size-08x32.webm
>     - vp90-2-02-size-08x34.webm
>     - vp90-2-02-size-08x64.webm
>     - vp90-2-02-size-08x66.webm
>     - vp90-2-02-size-10x08.webm
>     - vp90-2-02-size-10x10.webm
>     - vp90-2-02-size-10x16.webm
>     - vp90-2-02-size-10x18.webm
>     - vp90-2-02-size-10x32.webm
>     - vp90-2-02-size-10x34.webm
>     - vp90-2-02-size-10x64.webm
>     - vp90-2-02-size-10x66.webm
>     - vp90-2-02-size-16x08.webm
>     - vp90-2-02-size-16x10.webm
>     - vp90-2-02-size-16x16.webm
>     - vp90-2-02-size-16x18.webm
>     - vp90-2-02-size-16x32.webm
>     - vp90-2-02-size-16x34.webm
>     - vp90-2-02-size-16x64.webm
>     - vp90-2-02-size-16x66.webm
>     - vp90-2-02-size-18x08.webm
>     - vp90-2-02-size-18x10.webm
>     - vp90-2-02-size-18x16.webm
>     - vp90-2-02-size-18x18.webm
>     - vp90-2-02-size-18x32.webm
>     - vp90-2-02-size-18x34.webm
>     - vp90-2-02-size-18x64.webm
>     - vp90-2-02-size-18x66.webm
>     - vp90-2-02-size-32x08.webm
>     - vp90-2-02-size-32x10.webm
>     - vp90-2-02-size-32x16.webm
>     - vp90-2-02-size-32x18.webm
>     - vp90-2-02-size-32x32.webm
>     - vp90-2-02-size-32x34.webm
>     - vp90-2-02-size-32x64.webm
>     - vp90-2-02-size-32x66.webm
>     - vp90-2-02-size-34x08.webm
>     - vp90-2-02-size-34x10.webm
>     - vp90-2-02-size-34x16.webm
>     - vp90-2-02-size-34x18.webm
>     - vp90-2-02-size-34x32.webm
>     - vp90-2-02-size-34x34.webm
>     - vp90-2-02-size-34x64.webm
>     - vp90-2-02-size-34x66.webm
>     - vp90-2-02-size-64x08.webm
>     - vp90-2-02-size-64x10.webm
>     - vp90-2-02-size-64x16.webm
>     - vp90-2-02-size-64x18.webm
>     - vp90-2-02-size-64x32.webm
>     - vp90-2-02-size-64x34.webm
>     - vp90-2-02-size-64x64.webm
>     - vp90-2-02-size-64x66.webm
>     - vp90-2-02-size-66x08.webm
>     - vp90-2-02-size-66x10.webm
>     - vp90-2-02-size-66x16.webm
>     - vp90-2-02-size-66x18.webm
>     - vp90-2-02-size-66x32.webm
>     - vp90-2-02-size-66x34.webm
>     - vp90-2-02-size-66x64.webm
>     - vp90-2-02-size-66x66.webm
>   - 2 testcases failed due to unsupported format
>     - vp91-2-04-yuv422.webm
>     - vp91-2-04-yuv444.webm
>   - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>     - vp90-2-22-svc_1280x720_3.ivf
>   - 5 testcase failed due to unsupported resolution after sequence change
>     - vp90-2-21-resize_inter_320x180_5_1-2.webm
>     - vp90-2-21-resize_inter_320x180_7_1-2.webm
>     - vp90-2-21-resize_inter_320x240_5_1-2.webm
>     - vp90-2-21-resize_inter_320x240_7_1-2.webm
>     - vp90-2-18-resize.ivf
>   - 1 testcase failed with CRC mismatch
>     - vp90-2-16-intra-only.webm
>     Analysis: First few frames are marked by firmware as NO_SHOW frame.
>     Driver make buf state to VB2_BUF_STATE_ERROR for such frames.
>     Such buffers should be dropped by GST. But instead, the first frame
>     is being displayed and when a valid buffer is sent to client later
>     with same timestamp, its dropped, leading to CRC mismatch for first
>     frame.
>   Note: Same timing issue as observed on SM8550 is seen on SM8250 as
>   well.
> 
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
> Dikshita Agarwal (20):
>        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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>        media: iris: Add handling for no show frames
>        media: iris: Improve last flag handling
>        media: iris: Skip flush on first sequence change
>        media: iris: Prevent HFI queue writes when core is in deinit state
>        media: iris: Remove redundant buffer count check in stream off
>        media: iris: Remove deprecated property setting to firmware
>        media: iris: Fix missing function pointer initialization
>        media: iris: Fix NULL pointer dereference
>        media: iris: Fix typo in depth variable
>        media: iris: Add a comment to explain usage of MBPS
>        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: Add codec specific check for VP9 decoder drain handling
> 
>   drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>   drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>   drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>   .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>   .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>   .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>   .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>   .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>   .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>   drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>   drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>   .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>   .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>   .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>   drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>   drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>   drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>   drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>   drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
>   drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>   20 files changed, 948 insertions(+), 153 deletions(-)
> ---
> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
> 
> Best regards,

Assuming we merge Neils sm8650 stuff first, which I think we should 
merge first, you'll have a subsequent build error to fix [1]

https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris?ref_type=heads

Testing your series in isolation. I can confirm vp9 decodes also getting 
some strange prinouts which we need to follow up to see if they exist 
with the baseline driver [2].

https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris-20250408-iris-dec-hevc-vp9-v1-0-acd258778bd6@quicinc.com?ref_type=heads

[1]

  CC [M]  drivers/media/platform/qcom/iris/iris_vdec.o
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:432:10: 
error: ‘struct iris_platform_data’ has no member named 
‘input_config_params’; did you mean ‘output_config_params’?
   432 |         .input_config_params =
       |          ^~~~~~~~~~~~~~~~~~~
       |          output_config_params
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:433:17: 
error: ‘sm8550_vdec_input_config_params’ undeclared here (not in a 
function); did you mean ‘sm8550_vdec_output_config_params’?
   433 |                 sm8550_vdec_input_config_params,
       |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       |                 sm8550_vdec_output_config_params
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:434:10: 
error: ‘struct iris_platform_data’ has no member named 
‘input_config_params_size’; did you mean ‘output_config_params_size’?
   434 |         .input_config_params_size =
       |          ^~~~~~~~~~~~~~~~~~~~~~~~
       |          output_config_params_size
In file included from 
/home/deckard/Development/linux/include/linux/dev_printk.h:14,
                  from 
/home/deckard/Development/linux/include/linux/device.h:15,
                  from 
/home/deckard/Development/linux/include/linux/pm_domain.h:11,
                  from 
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_core.h:10,
                  from 
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:6:
/home/deckard/Development/linux/include/linux/compiler.h:197:77: error: 
expression in static assertion is not an integer
   197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct 
{_Static_assert(!(e), msg);}))
       |             ^
/home/deckard/Development/linux/include/linux/compiler.h:202:33: note: 
in expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
   202 | #define __must_be_array(a) 
__BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
       |                                 ^~~~~~~~~~~~~~~~~~~~~~~
/home/deckard/Development/linux/include/linux/array_size.h:11:59: note: 
in expansion of macro ‘__must_be_array’
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       | ^~~~~~~~~~~~~~~
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:435:17: 
note: in expansion of macro ‘ARRAY_SIZE’
   435 |                 ARRAY_SIZE(sm8550_vdec_input_config_params),
       |                 ^~~~~~~~~~
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:10: 
error: ‘struct iris_platform_data’ has no member named 
‘dec_output_prop’; did you mean ‘dec_input_prop’?
   442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
       |          ^~~~~~~~~~~~~~~
       |          dec_input_prop
   CC [M]  drivers/media/platform/qcom/iris/iris_vpu3x.o
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:28: 
error: ‘sm8550_vdec_subscribe_output_properties’ undeclared here (not in 
a function); did you mean ‘sm8550_vdec_subscribe_input_properties’?
   442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
       |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       |                            sm8550_vdec_subscribe_input_properties
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:10: 
error: ‘struct iris_platform_data’ has no member named 
‘dec_output_prop_size’; did you mean ‘dec_input_prop_size’?
   443 |         .dec_output_prop_size = 
ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
       |          ^~~~~~~~~~~~~~~~~~~~
       |          dec_input_prop_size
/home/deckard/Development/linux/include/linux/compiler.h:197:77: error: 
expression in static assertion is not an integer
   197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct 
{_Static_assert(!(e), msg);}))
       |             ^
/home/deckard/Development/linux/include/linux/compiler.h:202:33: note: 
in expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
   202 | #define __must_be_array(a) 
__BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
       |                                 ^~~~~~~~~~~~~~~~~~~~~~~
/home/deckard/Development/linux/include/linux/array_size.h:11:59: note: 
in expansion of macro ‘__must_be_array’
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       | ^~~~~~~~~~~~~~~
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:33: 
note: in expansion of macro ‘ARRAY_SIZE’
   443 |         .dec_output_prop_size = 
ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
       |                                 ^~~~~~~~~~
make[8]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:203: 
drivers/media/platform/qcom/iris/iris_platform_sm8550.o] Error 1
make[8]: *** Waiting for unfinished jobs....
make[7]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: 
drivers/media/platform/qcom/iris] Error 2
make[6]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: 
drivers/media/platform/qcom] Error 2
make[5]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: 
drivers/media/platform] Error 2
make[4]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: 
drivers/media] Error 2
make[3]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: drivers] 
Error 2
make[2]: *** [/home/deckard/Development/linux/Makefile:2006: .] Error 2
make[1]: *** [/home/deckard/Development/linux/Makefile:248: __sub-make] 
Error 2
make[1]: Leaving directory 
'/home/deckard/Development/linux-tools/qlt-kernel/build/x1e80100-crd_qlt_integration'
make: *** [Makefile:248: __sub-make] Error 2
make[1]: Entering directory 
'/home/deckard/Development/linux-tools/qlt-kernel/build/x1e80100-crd_qlt_integration'
   GEN     Makefile
   CALL    /home/deckard/Development/linux/scripts/checksyscalls.sh
   CC [M]  drivers/media/platform/qcom/iris/iris_platform_sm8550.o
   CC [M]  drivers/media/platform/qcom/iris/iris_vpu_buffer.o
   CC [M]  drivers/media/platform/qcom/iris/iris_vpu_common.o
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:432:10: 
error: ‘struct iris_platform_data’ has no member named 
‘input_config_params’; did you mean ‘output_config_params’?
   432 |         .input_config_params =
       |          ^~~~~~~~~~~~~~~~~~~
       |          output_config_params
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:433:17: 
error: ‘sm8550_vdec_input_config_params’ undeclared here (not in a 
function); did you mean ‘sm8550_vdec_output_config_params’?
   433 |                 sm8550_vdec_input_config_params,
       |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       |                 sm8550_vdec_output_config_params
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:434:10: 
error: ‘struct iris_platform_data’ has no member named 
‘input_config_params_size’; did you mean ‘output_config_params_size’?
   434 |         .input_config_params_size =
       |          ^~~~~~~~~~~~~~~~~~~~~~~~
       |          output_config_params_size
In file included from 
/home/deckard/Development/linux/include/linux/dev_printk.h:14,
                  from 
/home/deckard/Development/linux/include/linux/device.h:15,
                  from 
/home/deckard/Development/linux/include/linux/pm_domain.h:11,
                  from 
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_core.h:10,
                  from 
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:6:
/home/deckard/Development/linux/include/linux/compiler.h:197:77: error: 
expression in static assertion is not an integer
   197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct 
{_Static_assert(!(e), msg);}))
       |             ^
/home/deckard/Development/linux/include/linux/compiler.h:202:33: note: 
in expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
   202 | #define __must_be_array(a) 
__BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
       |                                 ^~~~~~~~~~~~~~~~~~~~~~~
/home/deckard/Development/linux/include/linux/array_size.h:11:59: note: 
in expansion of macro ‘__must_be_array’
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       | ^~~~~~~~~~~~~~~
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:435:17: 
note: in expansion of macro ‘ARRAY_SIZE’
   435 |                 ARRAY_SIZE(sm8550_vdec_input_config_params),
       |                 ^~~~~~~~~~
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:10: 
error: ‘struct iris_platform_data’ has no member named 
‘dec_output_prop’; did you mean ‘dec_input_prop’?
   442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
       |          ^~~~~~~~~~~~~~~
       |          dec_input_prop
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:28: 
error: ‘sm8550_vdec_subscribe_output_properties’ undeclared here (not in 
a function); did you mean ‘sm8550_vdec_subscribe_input_properties’?
   442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
       |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       |                            sm8550_vdec_subscribe_input_properties
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:10: 
error: ‘struct iris_platform_data’ has no member named 
‘dec_output_prop_size’; did you mean ‘dec_input_prop_size’?
   443 |         .dec_output_prop_size = 
ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
       |          ^~~~~~~~~~~~~~~~~~~~
       |          dec_input_prop_size
/home/deckard/Development/linux/include/linux/compiler.h:197:77: error: 
expression in static assertion is not an integer
   197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct 
{_Static_assert(!(e), msg);}))
       |             ^
/home/deckard/Development/linux/include/linux/compiler.h:202:33: note: 
in expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
   202 | #define __must_be_array(a) 
__BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
       |                                 ^~~~~~~~~~~~~~~~~~~~~~~
/home/deckard/Development/linux/include/linux/array_size.h:11:59: note: 
in expansion of macro ‘__must_be_array’
    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + 
__must_be_array(arr))
       | ^~~~~~~~~~~~~~~
/home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:33: 
note: in expansion of macro ‘ARRAY_SIZE’
   443 |         .dec_output_prop_size = 
ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
       |                                 ^~~~~~~~~~
make[8]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:203: 
drivers/media/platform/qcom/iris/iris_platform_sm8550.o] Error 1
make[8]: *** Waiting for unfinished jobs....
make[7]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: 
drivers/media/platform/qcom/iris] Error 2
make[6]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: 
drivers/media/platform/qcom] Error 2
make[5]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: 
drivers/media/platform] Error 2
make[4]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: 
drivers/media] Error 2
make[3]: *** 
[/home/deckard/Development/linux/scripts/Makefile.build:461: drivers] 
Error 2


[2]

[   58.165118] qcom-iris aa00000.video-codec: invalid plane
[   58.165721] ------------[ cut here ]------------
[   58.165727] WARNING: CPU: 1 PID: 1209 at 
drivers/media/common/videobuf2/videobuf2-core.c:2222 
__vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
[   58.165749] Modules linked in: rfcomm michael_mic reset_gpio 
snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai 
q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211 
ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common 
btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc 
regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh 
snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss 
snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro 
snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro 
soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode 
snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2 
videobuf2_common v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci 
videodev snd_compress mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm 
qcom_pd_mapper rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd 
pwrseq_core snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
[   58.165914]  ip_tables x_tables autofs4 ipv6 fuse socinfo 
qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng 
rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100 
pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp 
hid_multitouch i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats 
phy_qcom_snps_eusb2 sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam 
qcom_spmi_temp_alarm industrialio sha3_ce phy_qcom_qmp_combo aux_bridge 
phy_qcom_eusb2_repeater qcom_pon reboot_mode sm3_ce sm3 ucsi_glink 
pmic_glink_altmode typec_ucsi qcom_battmgr aux_hpd_bridge pmic_glink 
pdr_interface qcom_pdr_msg typec msm drm_client_lib drm_exec llcc_qcom 
gpu_sched i2c_hid_of i2c_hid qrtr qcom_q6v5_pas qcom_pil_info 
qcom_common qcom_glink_smem qcom_glink qcom_q6v5 qcom_sysmon mdt_loader 
rpmsg_core qmi_helpers input_leds panel_edp drm_display_helper 
drm_dp_aux_bus drm_kms_helper drm i2c_core mhi libarc4 nvme nvme_core 
usb_storage r8152 mii libphy led_class dm_crypt dm_mod
[   58.166115] CPU: 1 UID: 1001 PID: 1209 Comm: GstPlay Tainted: G 
  W           6.15.0-rc1 #69 PREEMPT
[   58.166125] Tainted: [W]=WARN
[   58.166129] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3, 
BIOS 2.5.0 12/16/2024
[   58.166133] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS 
BTYPE=--)
[   58.166140] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
[   58.166146] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
[   58.166152] sp : ffff800083f9bb00
[   58.166155] x29: ffff800083f9bb00 x28: ffff6ad64770c020 x27: 
0000000000000000
[   58.166165] x26: 0000000040045613 x25: 0000000000000000 x24: 
ffffac02677a6bc8
[   58.166174] x23: ffff6ad64770c060 x22: ffff6ad68e60c780 x21: 
ffff6ad679c36428
[   58.166183] x20: 0000000000000009 x19: ffff6ad679c36428 x18: 
0000000000000000
[   58.166192] x17: 0000000000000000 x16: ffffac027ba13408 x15: 
0000ffff000304b0
[   58.166200] x14: 0000000000000000 x13: 0000000000000000 x12: 
0000000000000000
[   58.166208] x11: 0000000000000000 x10: 0000000000000000 x9 : 
0000000000000000
[   58.166216] x8 : ffff800083f9bd48 x7 : ffffac02677a6e28 x6 : 
ffffac02677a6e28
[   58.166226] x5 : 0000000000000000 x4 : 0000000000000001 x3 : 
0000000000000000
[   58.166233] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 : 
0000000000000008
[   58.166242] Call trace:
[   58.166246]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
[   58.166254]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
[   58.166260]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
[   58.166267]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
[   58.166273]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
[   58.166279]  v4l_streamoff+0x24/0x30 [videodev]
[   58.166289]  __video_do_ioctl+0x40c/0x4a0 [videodev]
[   58.166298]  video_usercopy+0x2bc/0x688 [videodev]
[   58.166307]  video_ioctl2+0x18/0x38 [videodev]
[   58.166315]  v4l2_ioctl+0x40/0x60 [videodev]
[   58.166323]  __arm64_sys_ioctl+0xb4/0xf4
[   58.166335]  invoke_syscall+0x48/0x104
[   58.166346]  el0_svc_common.constprop.0+0x40/0xe0
[   58.166355]  do_el0_svc+0x1c/0x28
[   58.166363]  el0_svc+0x30/0xcc
[   58.166373]  el0t_64_sync_handler+0x10c/0x138
[   58.166381]  el0t_64_sync+0x198/0x19c
[   58.166386] ---[ end trace 0000000000000000 ]---
[   58.166390] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 0 in active state
[   58.166395] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 1 in active state
[   58.166398] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 2 in active state
[   58.166401] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 3 in active state
[   58.166404] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 5 in active state
[   58.166407] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 6 in active state
[   58.166410] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 7 in active state
[   58.166413] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 8 in active state
[   58.169738] qcom-iris aa00000.video-codec: invalid plane
[   61.517138] ------------[ cut here ]------------
[   61.517147] WARNING: CPU: 1 PID: 1209 at 
drivers/media/common/videobuf2/videobuf2-core.c:2222 
__vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
[   61.517157] Modules linked in: rfcomm michael_mic reset_gpio 
snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai 
q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211 
ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common 
btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc 
regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh 
snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss 
snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro 
snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro 
soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode 
snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2 
videobuf2_common v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci 
videodev snd_compress mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm 
qcom_pd_mapper rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd 
pwrseq_core snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
[   61.517210]  ip_tables x_tables autofs4 ipv6 fuse socinfo 
qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng 
rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100 
pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp 
hid_multitouch i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats 
phy_qcom_snps_eusb2 sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam 
qcom_spmi_temp_alarm industrialio sha3_ce phy_qcom_qmp_combo aux_bridge 
phy_qcom_eusb2_repeater qcom_pon reboot_mode sm3_ce sm3 ucsi_glink 
pmic_glink_altmode typec_ucsi qcom_battmgr aux_hpd_bridge pmic_glink 
pdr_interface qcom_pdr_msg typec msm drm_client_lib drm_exec llcc_qcom 
gpu_sched i2c_hid_of i2c_hid qrtr qcom_q6v5_pas qcom_pil_info 
qcom_common qcom_glink_smem qcom_glink qcom_q6v5 qcom_sysmon mdt_loader 
rpmsg_core qmi_helpers input_leds panel_edp drm_display_helper 
drm_dp_aux_bus drm_kms_helper drm i2c_core mhi libarc4 nvme nvme_core 
usb_storage r8152 mii libphy led_class dm_crypt dm_mod
[   61.517282] CPU: 1 UID: 1001 PID: 1209 Comm: GstPlay Tainted: G 
  W           6.15.0-rc1 #69 PREEMPT
[   61.517286] Tainted: [W]=WARN
[   61.517288] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3, 
BIOS 2.5.0 12/16/2024
[   61.517289] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS 
BTYPE=--)
[   61.517291] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
[   61.517293] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
[   61.517295] sp : ffff800083f9bb00
[   61.517296] x29: ffff800083f9bb00 x28: ffff6ad64770c020 x27: 
0000000000000000
[   61.517299] x26: 0000000040045613 x25: 0000000000000000 x24: 
ffffac02677a6bc8
[   61.517301] x23: ffff6ad64770c060 x22: ffff6ad68e60c780 x21: 
ffff6ad679c36428
[   61.517304] x20: 0000000000000009 x19: ffff6ad679c36428 x18: 
0000000000000000
[   61.517306] x17: 0000000000000000 x16: ffffac027ba13408 x15: 
0000ffff000304b0
[   61.517309] x14: 0000000000000000 x13: 0000000000000000 x12: 
0000000000000000
[   61.517311] x11: 0000000000000000 x10: 0000000000000000 x9 : 
0000000000000000
[   61.517314] x8 : ffff800083f9bd48 x7 : ffffac02677a6e28 x6 : 
ffffac02677a6e28
[   61.517316] x5 : 0000000000000000 x4 : 0000000000000001 x3 : 
0000000000000000
[   61.517319] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 : 
0000000000000008
[   61.517321] Call trace:
[   61.517323]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
[   61.517325]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
[   61.517327]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
[   61.517330]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
[   61.517332]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
[   61.517334]  v4l_streamoff+0x24/0x30 [videodev]
[   61.517338]  __video_do_ioctl+0x40c/0x4a0 [videodev]
[   61.517341]  video_usercopy+0x2bc/0x688 [videodev]
[   61.517343]  video_ioctl2+0x18/0x38 [videodev]
[   61.517346]  v4l2_ioctl+0x40/0x60 [videodev]
[   61.517348]  __arm64_sys_ioctl+0xb4/0xf4
[   61.517355]  invoke_syscall+0x48/0x104
[   61.517359]  el0_svc_common.constprop.0+0x40/0xe0
[   61.517362]  do_el0_svc+0x1c/0x28
[   61.517364]  el0_svc+0x30/0xcc
[   61.517368]  el0t_64_sync_handler+0x10c/0x138
[   61.517371]  el0t_64_sync+0x198/0x19c
[   61.517372] ---[ end trace 0000000000000000 ]---
[   61.517375] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 0 in active state
[   61.517377] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 1 in active state
[   61.517378] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 2 in active state
[   61.517379] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 3 in active state
[   61.517381] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 5 in active state
[   61.517382] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 6 in active state
[   61.517383] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 7 in active state
[   61.517384] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 8 in active state
[   84.239087] ------------[ cut here ]------------
[   84.239099] WARNING: CPU: 0 PID: 1283 at 
drivers/media/common/videobuf2/videobuf2-core.c:2222 
__vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
[   84.239110] Modules linked in: rfcomm michael_mic reset_gpio 
snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai 
q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211 
ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common 
btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc 
regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh 
snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss 
snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro 
snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro 
soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode 
snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2 
videobuf2_common v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci 
videodev snd_compress mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm 
qcom_pd_mapper rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd 
pwrseq_core snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
[   84.239190]  ip_tables x_tables autofs4 ipv6 fuse socinfo 
qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng 
rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100 
pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp 
hid_multitouch i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats 
phy_qcom_snps_eusb2 sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam 
qcom_spmi_temp_alarm industrialio sha3_ce phy_qcom_qmp_combo aux_bridge 
phy_qcom_eusb2_repeater qcom_pon reboot_mode sm3_ce sm3 ucsi_glink 
pmic_glink_altmode typec_ucsi qcom_battmgr aux_hpd_bridge pmic_glink 
pdr_interface qcom_pdr_msg typec msm drm_client_lib drm_exec llcc_qcom 
gpu_sched i2c_hid_of i2c_hid qrtr qcom_q6v5_pas qcom_pil_info 
qcom_common qcom_glink_smem qcom_glink qcom_q6v5 qcom_sysmon mdt_loader 
rpmsg_core qmi_helpers input_leds panel_edp drm_display_helper 
drm_dp_aux_bus drm_kms_helper drm i2c_core mhi libarc4 nvme nvme_core 
usb_storage r8152 mii libphy led_class dm_crypt dm_mod
[   84.239292] CPU: 0 UID: 1001 PID: 1283 Comm: GstPlay Tainted: G 
  W           6.15.0-rc1 #69 PREEMPT
[   84.239297] Tainted: [W]=WARN
[   84.239299] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3, 
BIOS 2.5.0 12/16/2024
[   84.239301] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS 
BTYPE=--)
[   84.239304] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
[   84.239307] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
[   84.239309] sp : ffff800082333b00
[   84.239311] x29: ffff800082333b00 x28: ffff6ad65e9d5020 x27: 
0000000000000000
[   84.239315] x26: 0000000040045613 x25: 0000000000000000 x24: 
ffffac02677a6bc8
[   84.239319] x23: ffff6ad65e9d5060 x22: ffff6ad646d64d80 x21: 
ffff6ad65f005028
[   84.239324] x20: 0000000000000009 x19: ffff6ad65f005028 x18: 
0000000000000000
[   84.239328] x17: 0000000000000000 x16: ffffac027ba13408 x15: 
0000ffff20030410
[   84.239332] x14: 0000000000000000 x13: 0000000000000000 x12: 
0000000000000000
[   84.239335] x11: 0000000000000000 x10: 0000000000000000 x9 : 
0000000000000000
[   84.239339] x8 : ffff800082333d48 x7 : ffffac02677a6e28 x6 : 
ffffac02677a6e28
[   84.239343] x5 : 0000000000000000 x4 : 0000000000000001 x3 : 
0000000000000000
[   84.239347] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 : 
0000000000000016
[   84.239351] Call trace:
[   84.239353]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
[   84.239357]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
[   84.239360]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
[   84.239364]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
[   84.239368]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
[   84.239370]  v4l_streamoff+0x24/0x30 [videodev]
[   84.239376]  __video_do_ioctl+0x40c/0x4a0 [videodev]
[   84.239380]  video_usercopy+0x2bc/0x688 [videodev]
[   84.239384]  video_ioctl2+0x18/0x38 [videodev]
[   84.239388]  v4l2_ioctl+0x40/0x60 [videodev]
[   84.239392]  __arm64_sys_ioctl+0xb4/0xf4
[   84.239400]  invoke_syscall+0x48/0x104
[   84.239407]  el0_svc_common.constprop.0+0x40/0xe0
[   84.239411]  do_el0_svc+0x1c/0x28
[   84.239415]  el0_svc+0x30/0xcc
[   84.239421]  el0t_64_sync_handler+0x10c/0x138
[   84.239425]  el0t_64_sync+0x198/0x19c
[   84.239428] ---[ end trace 0000000000000000 ]---
[   84.239430] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 0 in active state
[   84.239432] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 1 in active state
[   84.239433] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 2 in active state
[   84.239435] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 3 in active state
[   84.239436] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 4 in active state
[   84.239438] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 5 in active state
[   84.239439] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 7 in active state
[   84.239440] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 8 in active state
[   84.239442] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 9 in active state
[   84.239443] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 10 in active state
[   84.239445] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 11 in active state
[   84.239446] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 14 in active state
[   84.239447] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 15 in active state
[   84.239449] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 16 in active state
[   84.239450] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 17 in active state
[   84.239452] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 18 in active state
[   84.239453] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 19 in active state
[   84.239454] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 20 in active state
[   84.239456] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 21 in active state
[   84.239457] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 22 in active state
[   84.239459] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 23 in active state
[   84.239460] videobuf2_common: driver bug: stop_streaming operation is 
leaving buffer 24 in active state
[   84.245873] qcom-iris aa00000.video-codec: invalid plane
[  126.573593] qcom-iris aa00000.video-codec: session error received 
0x1000009: unknown
[  126.573638] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.573644] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.573649] qcom-iris aa00000.video-codec: session error received 
0x1000009: unknown
[  126.573654] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.573659] qcom-iris aa00000.video-codec: session error received 
0x1000009: unknown
[  126.573664] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.573668] qcom-iris aa00000.video-codec: session error received 
0x1000009: unknown
[  126.573670] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.582134] qcom-iris aa00000.video-codec: session error received 
0x1000006: unknown
[  126.582142] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.582147] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.582152] qcom-iris aa00000.video-codec: session error received 
0x1000006: unknown
[  126.582156] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.582161] qcom-iris aa00000.video-codec: session error received 
0x1000006: unknown
[  126.582166] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state
[  126.582170] qcom-iris aa00000.video-codec: session error received 
0x1000006: unknown
[  126.582177] qcom-iris aa00000.video-codec: session error received 
0x4000004: invalid operation for current state

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

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-09 14:29 ` Bryan O'Donoghue
@ 2025-04-09 14:37   ` Bryan O'Donoghue
  2025-04-09 16:26   ` Neil Armstrong
  2025-04-10  7:17   ` Dikshita Agarwal
  2 siblings, 0 replies; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-09 14:37 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable, Dan Carpenter

On 09/04/2025 15:29, Bryan O'Donoghue wrote:
> On 08/04/2025 16:54, 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.
>>
>> These patches also address the comments and feedback received from the
>> RFC patches previously sent. I have made the necessary improvements
>> based on the community's suggestions.
>>
>> Changes sinces RFC:
>> - Added additional fixes to address issues identified during further
>> testing.
>> - Moved typo fix to a seperate patch [Neil]
>> - Reordered the patches for better logical flow and clarity [Neil,
>> Dmitry]
>> - Added fixes tag wherever applicable [Neil, Dmitry]
>> - Removed the default case in the switch statement for codecs [Bryan]
>> - Replaced if-else statements with switch-case [Bryan]
>> - Added comments for mbpf [Bryan]
>> - RFC: https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
>>
>> These patches are tested on SM8250 and SM8550 with v4l2-ctl and
>> Gstreamer for HEVC and VP9 decoders, at the same time ensured that
>> the existing H264 decoder functionality remains uneffected.
>>
>> Note: 1 of the fluster compliance test is fixed with firmware [1]
>> [1]: https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u
>>
>> The result of fluster test on SM8550:
>>    131/147 testcases passed while testing JCT-VC-HEVC_V1 with
>>    GStreamer-H.265-V4L2-Gst1.0.
>>    The failing test case:
>>    - 10 testcases failed due to unsupported 10 bit format.
>>      - DBLK_A_MAIN10_VIXS_4
>>      - INITQP_B_Main10_Sony_1
>>      - TSUNEQBD_A_MAIN10_Technicolor_2
>>      - WP_A_MAIN10_Toshiba_3
>>      - WP_MAIN10_B_Toshiba_3
>>      - WPP_A_ericsson_MAIN10_2
>>      - WPP_B_ericsson_MAIN10_2
>>      - WPP_C_ericsson_MAIN10_2
>>      - WPP_E_ericsson_MAIN10_2
>>      - WPP_F_ericsson_MAIN10_2
>>    - 4 testcase failed due to unsupported resolution
>>      - PICSIZE_A_Bossen_1
>>      - PICSIZE_B_Bossen_1
>>      - WPP_D_ericsson_MAIN10_2
>>      - WPP_D_ericsson_MAIN_2
>>    - 1 testcase failed as bitstream is invalid (this fails with reference
>>      as well)
>>      - RAP_B_Bossen_2
>>    - 1 testcase failed due to CRC mismatch
>>      - RAP_A_docomo_6
>>        Analysis - First few frames in this discarded by firmware and are
>>        sent to driver with 0 filled length. Driver send such buffers to
>>        client with timestamp 0 and payload set to 0 and
>>        make buf state to VB2_BUF_STATE_ERROR. Such buffers should be
>>        dropped by GST. But instead, the first frame displayed as green
>>        frame and when a valid buffer is sent to client later with same 0
>>        timestamp, its dropped, leading to CRC mismatch for first frame.
>>
>>    235/305 testcases passed while testing VP9-TEST-VECTORS with
>>    GStreamer-VP9-V4L2-Gst1.0.
>>    The failing test case:
>>    - 64 testcases failed due to unsupported resolution
>>      - vp90-2-02-size-08x08.webm
>>      - vp90-2-02-size-08x10.webm
>>      - vp90-2-02-size-08x16.webm
>>      - vp90-2-02-size-08x18.webm
>>      - vp90-2-02-size-08x32.webm
>>      - vp90-2-02-size-08x34.webm
>>      - vp90-2-02-size-08x64.webm
>>      - vp90-2-02-size-08x66.webm
>>      - vp90-2-02-size-10x08.webm
>>      - vp90-2-02-size-10x10.webm
>>      - vp90-2-02-size-10x16.webm
>>      - vp90-2-02-size-10x18.webm
>>      - vp90-2-02-size-10x32.webm
>>      - vp90-2-02-size-10x34.webm
>>      - vp90-2-02-size-10x64.webm
>>      - vp90-2-02-size-10x66.webm
>>      - vp90-2-02-size-16x08.webm
>>      - vp90-2-02-size-16x10.webm
>>      - vp90-2-02-size-16x16.webm
>>      - vp90-2-02-size-16x18.webm
>>      - vp90-2-02-size-16x32.webm
>>      - vp90-2-02-size-16x34.webm
>>      - vp90-2-02-size-16x64.webm
>>      - vp90-2-02-size-16x66.webm
>>      - vp90-2-02-size-18x08.webm
>>      - vp90-2-02-size-18x10.webm
>>      - vp90-2-02-size-18x16.webm
>>      - vp90-2-02-size-18x18.webm
>>      - vp90-2-02-size-18x32.webm
>>      - vp90-2-02-size-18x34.webm
>>      - vp90-2-02-size-18x64.webm
>>      - vp90-2-02-size-18x66.webm
>>      - vp90-2-02-size-32x08.webm
>>      - vp90-2-02-size-32x10.webm
>>      - vp90-2-02-size-32x16.webm
>>      - vp90-2-02-size-32x18.webm
>>      - vp90-2-02-size-32x32.webm
>>      - vp90-2-02-size-32x34.webm
>>      - vp90-2-02-size-32x64.webm
>>      - vp90-2-02-size-32x66.webm
>>      - vp90-2-02-size-34x08.webm
>>      - vp90-2-02-size-34x10.webm
>>      - vp90-2-02-size-34x16.webm
>>      - vp90-2-02-size-34x18.webm
>>      - vp90-2-02-size-34x32.webm
>>      - vp90-2-02-size-34x34.webm
>>      - vp90-2-02-size-34x64.webm
>>      - vp90-2-02-size-34x66.webm
>>      - vp90-2-02-size-64x08.webm
>>      - vp90-2-02-size-64x10.webm
>>      - vp90-2-02-size-64x16.webm
>>      - vp90-2-02-size-64x18.webm
>>      - vp90-2-02-size-64x32.webm
>>      - vp90-2-02-size-64x34.webm
>>      - vp90-2-02-size-64x64.webm
>>      - vp90-2-02-size-64x66.webm
>>      - vp90-2-02-size-66x08.webm
>>      - vp90-2-02-size-66x10.webm
>>      - vp90-2-02-size-66x16.webm
>>      - vp90-2-02-size-66x18.webm
>>      - vp90-2-02-size-66x32.webm
>>      - vp90-2-02-size-66x34.webm
>>      - vp90-2-02-size-66x64.webm
>>      - vp90-2-02-size-66x66.webm
>>    - 2 testcases failed due to unsupported format
>>      - vp91-2-04-yuv422.webm
>>      - vp91-2-04-yuv444.webm
>>    - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>>      - vp90-2-22-svc_1280x720_3.ivf
>>    - 2 testcase failed due to unsupported resolution after sequence change
>>      - vp90-2-21-resize_inter_320x180_5_1-2.webm
>>      - vp90-2-21-resize_inter_320x180_7_1-2.webm
>>    - 1 testcase failed due to unsupported stream
>>      - vp90-2-16-intra-only.webm
>>    Note: There is a timing issue with the clips having multiple resolution
>>    change. Where firmware returned all the buffers with previous sequence
>>    and has no buffer left to attach the LAST flag to. At the same time,
>>    client is not queueing any further buffers, so there is deadlock where
>>    client is waiting for LAST flag, while firmware doesn't have any
>>    capture buffer to attach LAST flag to.
>>    Ideally client should keep queueing the buffers on capture queue untill
>>    the LAST flag is received.
>>
>> The result of fluster test on SM8250:
>>    132/147 testcases passed while testing JCT-VC-HEVC_V1 with
>>    GStreamer-H.265-V4L2-Gst1.0.
>>    The failing test case:
>>    - 10 testcases failed due to unsupported 10 bit format.
>>      - DBLK_A_MAIN10_VIXS_4
>>      - INITQP_B_Main10_Sony_1
>>      - TSUNEQBD_A_MAIN10_Technicolor_2
>>      - WP_A_MAIN10_Toshiba_3
>>      - WP_MAIN10_B_Toshiba_3
>>      - WPP_A_ericsson_MAIN10_2
>>      - WPP_B_ericsson_MAIN10_2
>>      - WPP_C_ericsson_MAIN10_2
>>      - WPP_E_ericsson_MAIN10_2
>>      - WPP_F_ericsson_MAIN10_2
>>    - 4 testcase failed due to unsupported resolution
>>      - PICSIZE_A_Bossen_1
>>      - PICSIZE_B_Bossen_1
>>      - WPP_D_ericsson_MAIN10_2
>>      - WPP_D_ericsson_MAIN_2
>>    - 1 testcase failed as bitstream is invalid (this fails with reference
>>      as well)
>>      - RAP_B_Bossen_2
>>
>>    232/305 testcases passed while testing VP9-TEST-VECTORS with
>>    GStreamer-VP9-V4L2-Gst1.0.
>>    The failing test case:
>>    - 64 testcases failed due to unsupported resolution
>>      - vp90-2-02-size-08x08.webm
>>      - vp90-2-02-size-08x10.webm
>>      - vp90-2-02-size-08x16.webm
>>      - vp90-2-02-size-08x18.webm
>>      - vp90-2-02-size-08x32.webm
>>      - vp90-2-02-size-08x34.webm
>>      - vp90-2-02-size-08x64.webm
>>      - vp90-2-02-size-08x66.webm
>>      - vp90-2-02-size-10x08.webm
>>      - vp90-2-02-size-10x10.webm
>>      - vp90-2-02-size-10x16.webm
>>      - vp90-2-02-size-10x18.webm
>>      - vp90-2-02-size-10x32.webm
>>      - vp90-2-02-size-10x34.webm
>>      - vp90-2-02-size-10x64.webm
>>      - vp90-2-02-size-10x66.webm
>>      - vp90-2-02-size-16x08.webm
>>      - vp90-2-02-size-16x10.webm
>>      - vp90-2-02-size-16x16.webm
>>      - vp90-2-02-size-16x18.webm
>>      - vp90-2-02-size-16x32.webm
>>      - vp90-2-02-size-16x34.webm
>>      - vp90-2-02-size-16x64.webm
>>      - vp90-2-02-size-16x66.webm
>>      - vp90-2-02-size-18x08.webm
>>      - vp90-2-02-size-18x10.webm
>>      - vp90-2-02-size-18x16.webm
>>      - vp90-2-02-size-18x18.webm
>>      - vp90-2-02-size-18x32.webm
>>      - vp90-2-02-size-18x34.webm
>>      - vp90-2-02-size-18x64.webm
>>      - vp90-2-02-size-18x66.webm
>>      - vp90-2-02-size-32x08.webm
>>      - vp90-2-02-size-32x10.webm
>>      - vp90-2-02-size-32x16.webm
>>      - vp90-2-02-size-32x18.webm
>>      - vp90-2-02-size-32x32.webm
>>      - vp90-2-02-size-32x34.webm
>>      - vp90-2-02-size-32x64.webm
>>      - vp90-2-02-size-32x66.webm
>>      - vp90-2-02-size-34x08.webm
>>      - vp90-2-02-size-34x10.webm
>>      - vp90-2-02-size-34x16.webm
>>      - vp90-2-02-size-34x18.webm
>>      - vp90-2-02-size-34x32.webm
>>      - vp90-2-02-size-34x34.webm
>>      - vp90-2-02-size-34x64.webm
>>      - vp90-2-02-size-34x66.webm
>>      - vp90-2-02-size-64x08.webm
>>      - vp90-2-02-size-64x10.webm
>>      - vp90-2-02-size-64x16.webm
>>      - vp90-2-02-size-64x18.webm
>>      - vp90-2-02-size-64x32.webm
>>      - vp90-2-02-size-64x34.webm
>>      - vp90-2-02-size-64x64.webm
>>      - vp90-2-02-size-64x66.webm
>>      - vp90-2-02-size-66x08.webm
>>      - vp90-2-02-size-66x10.webm
>>      - vp90-2-02-size-66x16.webm
>>      - vp90-2-02-size-66x18.webm
>>      - vp90-2-02-size-66x32.webm
>>      - vp90-2-02-size-66x34.webm
>>      - vp90-2-02-size-66x64.webm
>>      - vp90-2-02-size-66x66.webm
>>    - 2 testcases failed due to unsupported format
>>      - vp91-2-04-yuv422.webm
>>      - vp91-2-04-yuv444.webm
>>    - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>>      - vp90-2-22-svc_1280x720_3.ivf
>>    - 5 testcase failed due to unsupported resolution after sequence change
>>      - vp90-2-21-resize_inter_320x180_5_1-2.webm
>>      - vp90-2-21-resize_inter_320x180_7_1-2.webm
>>      - vp90-2-21-resize_inter_320x240_5_1-2.webm
>>      - vp90-2-21-resize_inter_320x240_7_1-2.webm
>>      - vp90-2-18-resize.ivf
>>    - 1 testcase failed with CRC mismatch
>>      - vp90-2-16-intra-only.webm
>>      Analysis: First few frames are marked by firmware as NO_SHOW frame.
>>      Driver make buf state to VB2_BUF_STATE_ERROR for such frames.
>>      Such buffers should be dropped by GST. But instead, the first frame
>>      is being displayed and when a valid buffer is sent to client later
>>      with same timestamp, its dropped, leading to CRC mismatch for first
>>      frame.
>>    Note: Same timing issue as observed on SM8550 is seen on SM8250 as
>>    well.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>> Dikshita Agarwal (20):
>>         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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>>         media: iris: Add handling for no show frames
>>         media: iris: Improve last flag handling
>>         media: iris: Skip flush on first sequence change
>>         media: iris: Prevent HFI queue writes when core is in deinit state
>>         media: iris: Remove redundant buffer count check in stream off
>>         media: iris: Remove deprecated property setting to firmware
>>         media: iris: Fix missing function pointer initialization
>>         media: iris: Fix NULL pointer dereference
>>         media: iris: Fix typo in depth variable
>>         media: iris: Add a comment to explain usage of MBPS
>>         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: Add codec specific check for VP9 decoder drain handling
>>
>>    drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>>    drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>>    drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>>    .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>>    .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>>    .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>>    .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>>    .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>>    .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>>    drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>>    drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>>    .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>>    .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>>    .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>>    drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>>    drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>>    drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>>    drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>>    drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
>>    drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>>    20 files changed, 948 insertions(+), 153 deletions(-)
>> ---
>> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
>> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
>>
>> Best regards,
> 
> Assuming we merge Neils sm8650 stuff first, which I think we should
> merge first, you'll have a subsequent build error to fix [1]
> 
> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris?ref_type=heads
> 
> Testing your series in isolation. I can confirm vp9 decodes also getting
> some strange prinouts which we need to follow up to see if they exist
> with the baseline driver [2].
> 
> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris-20250408-iris-dec-hevc-vp9-v1-0-acd258778bd6@quicinc.com?ref_type=heads
> 
> [1]
> 
>    CC [M]  drivers/media/platform/qcom/iris/iris_vdec.o
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:432:10:
> error: ‘struct iris_platform_data’ has no member named
> ‘input_config_params’; did you mean ‘output_config_params’?
>     432 |         .input_config_params =
>         |          ^~~~~~~~~~~~~~~~~~~
>         |          output_config_params
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:433:17:
> error: ‘sm8550_vdec_input_config_params’ undeclared here (not in a
> function); did you mean ‘sm8550_vdec_output_config_params’?
>     433 |                 sm8550_vdec_input_config_params,
>         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>         |                 sm8550_vdec_output_config_params
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:434:10:
> error: ‘struct iris_platform_data’ has no member named
> ‘input_config_params_size’; did you mean ‘output_config_params_size’?
>     434 |         .input_config_params_size =
>         |          ^~~~~~~~~~~~~~~~~~~~~~~~
>         |          output_config_params_size
> In file included from
> /home/deckard/Development/linux/include/linux/dev_printk.h:14,
>                    from
> /home/deckard/Development/linux/include/linux/device.h:15,
>                    from
> /home/deckard/Development/linux/include/linux/pm_domain.h:11,
>                    from
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_core.h:10,
>                    from
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:6:
> /home/deckard/Development/linux/include/linux/compiler.h:197:77: error:
> expression in static assertion is not an integer
>     197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct
> {_Static_assert(!(e), msg);}))
>         |             ^
> /home/deckard/Development/linux/include/linux/compiler.h:202:33: note:
> in expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
>     202 | #define __must_be_array(a)
> __BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
>         |                                 ^~~~~~~~~~~~~~~~~~~~~~~
> /home/deckard/Development/linux/include/linux/array_size.h:11:59: note:
> in expansion of macro ‘__must_be_array’
>      11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) +
> __must_be_array(arr))
>         | ^~~~~~~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:435:17:
> note: in expansion of macro ‘ARRAY_SIZE’
>     435 |                 ARRAY_SIZE(sm8550_vdec_input_config_params),
>         |                 ^~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:10:
> error: ‘struct iris_platform_data’ has no member named
> ‘dec_output_prop’; did you mean ‘dec_input_prop’?
>     442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>         |          ^~~~~~~~~~~~~~~
>         |          dec_input_prop
>     CC [M]  drivers/media/platform/qcom/iris/iris_vpu3x.o
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:28:
> error: ‘sm8550_vdec_subscribe_output_properties’ undeclared here (not in
> a function); did you mean ‘sm8550_vdec_subscribe_input_properties’?
>     442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>         |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>         |                            sm8550_vdec_subscribe_input_properties
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:10:
> error: ‘struct iris_platform_data’ has no member named
> ‘dec_output_prop_size’; did you mean ‘dec_input_prop_size’?
>     443 |         .dec_output_prop_size =
> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>         |          ^~~~~~~~~~~~~~~~~~~~
>         |          dec_input_prop_size
> /home/deckard/Development/linux/include/linux/compiler.h:197:77: error:
> expression in static assertion is not an integer
>     197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct
> {_Static_assert(!(e), msg);}))
>         |             ^
> /home/deckard/Development/linux/include/linux/compiler.h:202:33: note:
> in expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
>     202 | #define __must_be_array(a)
> __BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
>         |                                 ^~~~~~~~~~~~~~~~~~~~~~~
> /home/deckard/Development/linux/include/linux/array_size.h:11:59: note:
> in expansion of macro ‘__must_be_array’
>      11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) +
> __must_be_array(arr))
>         | ^~~~~~~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:33:
> note: in expansion of macro ‘ARRAY_SIZE’
>     443 |         .dec_output_prop_size =
> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>         |                                 ^~~~~~~~~~
> make[8]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:203:
> drivers/media/platform/qcom/iris/iris_platform_sm8550.o] Error 1
> make[8]: *** Waiting for unfinished jobs....
> make[7]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform/qcom/iris] Error 2
> make[6]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform/qcom] Error 2
> make[5]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform] Error 2
> make[4]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media] Error 2
> make[3]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461: drivers]
> Error 2
> make[2]: *** [/home/deckard/Development/linux/Makefile:2006: .] Error 2
> make[1]: *** [/home/deckard/Development/linux/Makefile:248: __sub-make]
> Error 2
> make[1]: Leaving directory
> '/home/deckard/Development/linux-tools/qlt-kernel/build/x1e80100-crd_qlt_integration'
> make: *** [Makefile:248: __sub-make] Error 2
> make[1]: Entering directory
> '/home/deckard/Development/linux-tools/qlt-kernel/build/x1e80100-crd_qlt_integration'
>     GEN     Makefile
>     CALL    /home/deckard/Development/linux/scripts/checksyscalls.sh
>     CC [M]  drivers/media/platform/qcom/iris/iris_platform_sm8550.o
>     CC [M]  drivers/media/platform/qcom/iris/iris_vpu_buffer.o
>     CC [M]  drivers/media/platform/qcom/iris/iris_vpu_common.o
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:432:10:
> error: ‘struct iris_platform_data’ has no member named
> ‘input_config_params’; did you mean ‘output_config_params’?
>     432 |         .input_config_params =
>         |          ^~~~~~~~~~~~~~~~~~~
>         |          output_config_params
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:433:17:
> error: ‘sm8550_vdec_input_config_params’ undeclared here (not in a
> function); did you mean ‘sm8550_vdec_output_config_params’?
>     433 |                 sm8550_vdec_input_config_params,
>         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>         |                 sm8550_vdec_output_config_params
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:434:10:
> error: ‘struct iris_platform_data’ has no member named
> ‘input_config_params_size’; did you mean ‘output_config_params_size’?
>     434 |         .input_config_params_size =
>         |          ^~~~~~~~~~~~~~~~~~~~~~~~
>         |          output_config_params_size
> In file included from
> /home/deckard/Development/linux/include/linux/dev_printk.h:14,
>                    from
> /home/deckard/Development/linux/include/linux/device.h:15,
>                    from
> /home/deckard/Development/linux/include/linux/pm_domain.h:11,
>                    from
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_core.h:10,
>                    from
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:6:
> /home/deckard/Development/linux/include/linux/compiler.h:197:77: error:
> expression in static assertion is not an integer
>     197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct
> {_Static_assert(!(e), msg);}))
>         |             ^
> /home/deckard/Development/linux/include/linux/compiler.h:202:33: note:
> in expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
>     202 | #define __must_be_array(a)
> __BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
>         |                                 ^~~~~~~~~~~~~~~~~~~~~~~
> /home/deckard/Development/linux/include/linux/array_size.h:11:59: note:
> in expansion of macro ‘__must_be_array’
>      11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) +
> __must_be_array(arr))
>         | ^~~~~~~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:435:17:
> note: in expansion of macro ‘ARRAY_SIZE’
>     435 |                 ARRAY_SIZE(sm8550_vdec_input_config_params),
>         |                 ^~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:10:
> error: ‘struct iris_platform_data’ has no member named
> ‘dec_output_prop’; did you mean ‘dec_input_prop’?
>     442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>         |          ^~~~~~~~~~~~~~~
>         |          dec_input_prop
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:28:
> error: ‘sm8550_vdec_subscribe_output_properties’ undeclared here (not in
> a function); did you mean ‘sm8550_vdec_subscribe_input_properties’?
>     442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>         |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>         |                            sm8550_vdec_subscribe_input_properties
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:10:
> error: ‘struct iris_platform_data’ has no member named
> ‘dec_output_prop_size’; did you mean ‘dec_input_prop_size’?
>     443 |         .dec_output_prop_size =
> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>         |          ^~~~~~~~~~~~~~~~~~~~
>         |          dec_input_prop_size
> /home/deckard/Development/linux/include/linux/compiler.h:197:77: error:
> expression in static assertion is not an integer
>     197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct
> {_Static_assert(!(e), msg);}))
>         |             ^
> /home/deckard/Development/linux/include/linux/compiler.h:202:33: note:
> in expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
>     202 | #define __must_be_array(a)
> __BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
>         |                                 ^~~~~~~~~~~~~~~~~~~~~~~
> /home/deckard/Development/linux/include/linux/array_size.h:11:59: note:
> in expansion of macro ‘__must_be_array’
>      11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) +
> __must_be_array(arr))
>         | ^~~~~~~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:33:
> note: in expansion of macro ‘ARRAY_SIZE’
>     443 |         .dec_output_prop_size =
> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>         |                                 ^~~~~~~~~~
> make[8]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:203:
> drivers/media/platform/qcom/iris/iris_platform_sm8550.o] Error 1
> make[8]: *** Waiting for unfinished jobs....
> make[7]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform/qcom/iris] Error 2
> make[6]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform/qcom] Error 2
> make[5]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform] Error 2
> make[4]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media] Error 2
> make[3]: ***
> [/home/deckard/Development/linux/scripts/Makefile.build:461: drivers]
> Error 2
> 
> 
> [2]
> 
> [   58.165118] qcom-iris aa00000.video-codec: invalid plane
> [   58.165721] ------------[ cut here ]------------
> [   58.165727] WARNING: CPU: 1 PID: 1209 at
> drivers/media/common/videobuf2/videobuf2-core.c:2222
> __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   58.165749] Modules linked in: rfcomm michael_mic reset_gpio
> snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai
> q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211
> ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common
> btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc
> regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh
> snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss
> snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro
> snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro
> soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode
> snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2
> videobuf2_common v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci
> videodev snd_compress mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm
> qcom_pd_mapper rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd
> pwrseq_core snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
> [   58.165914]  ip_tables x_tables autofs4 ipv6 fuse socinfo
> qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng
> rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100
> pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp
> hid_multitouch i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats
> phy_qcom_snps_eusb2 sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam
> qcom_spmi_temp_alarm industrialio sha3_ce phy_qcom_qmp_combo aux_bridge
> phy_qcom_eusb2_repeater qcom_pon reboot_mode sm3_ce sm3 ucsi_glink
> pmic_glink_altmode typec_ucsi qcom_battmgr aux_hpd_bridge pmic_glink
> pdr_interface qcom_pdr_msg typec msm drm_client_lib drm_exec llcc_qcom
> gpu_sched i2c_hid_of i2c_hid qrtr qcom_q6v5_pas qcom_pil_info
> qcom_common qcom_glink_smem qcom_glink qcom_q6v5 qcom_sysmon mdt_loader
> rpmsg_core qmi_helpers input_leds panel_edp drm_display_helper
> drm_dp_aux_bus drm_kms_helper drm i2c_core mhi libarc4 nvme nvme_core
> usb_storage r8152 mii libphy led_class dm_crypt dm_mod
> [   58.166115] CPU: 1 UID: 1001 PID: 1209 Comm: GstPlay Tainted: G
>    W           6.15.0-rc1 #69 PREEMPT
> [   58.166125] Tainted: [W]=WARN
> [   58.166129] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3,
> BIOS 2.5.0 12/16/2024
> [   58.166133] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS
> BTYPE=--)
> [   58.166140] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   58.166146] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
> [   58.166152] sp : ffff800083f9bb00
> [   58.166155] x29: ffff800083f9bb00 x28: ffff6ad64770c020 x27:
> 0000000000000000
> [   58.166165] x26: 0000000040045613 x25: 0000000000000000 x24:
> ffffac02677a6bc8
> [   58.166174] x23: ffff6ad64770c060 x22: ffff6ad68e60c780 x21:
> ffff6ad679c36428
> [   58.166183] x20: 0000000000000009 x19: ffff6ad679c36428 x18:
> 0000000000000000
> [   58.166192] x17: 0000000000000000 x16: ffffac027ba13408 x15:
> 0000ffff000304b0
> [   58.166200] x14: 0000000000000000 x13: 0000000000000000 x12:
> 0000000000000000
> [   58.166208] x11: 0000000000000000 x10: 0000000000000000 x9 :
> 0000000000000000
> [   58.166216] x8 : ffff800083f9bd48 x7 : ffffac02677a6e28 x6 :
> ffffac02677a6e28
> [   58.166226] x5 : 0000000000000000 x4 : 0000000000000001 x3 :
> 0000000000000000
> [   58.166233] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 :
> 0000000000000008
> [   58.166242] Call trace:
> [   58.166246]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
> [   58.166254]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
> [   58.166260]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
> [   58.166267]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
> [   58.166273]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
> [   58.166279]  v4l_streamoff+0x24/0x30 [videodev]
> [   58.166289]  __video_do_ioctl+0x40c/0x4a0 [videodev]
> [   58.166298]  video_usercopy+0x2bc/0x688 [videodev]
> [   58.166307]  video_ioctl2+0x18/0x38 [videodev]
> [   58.166315]  v4l2_ioctl+0x40/0x60 [videodev]
> [   58.166323]  __arm64_sys_ioctl+0xb4/0xf4
> [   58.166335]  invoke_syscall+0x48/0x104
> [   58.166346]  el0_svc_common.constprop.0+0x40/0xe0
> [   58.166355]  do_el0_svc+0x1c/0x28
> [   58.166363]  el0_svc+0x30/0xcc
> [   58.166373]  el0t_64_sync_handler+0x10c/0x138
> [   58.166381]  el0t_64_sync+0x198/0x19c
> [   58.166386] ---[ end trace 0000000000000000 ]---
> [   58.166390] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 0 in active state
> [   58.166395] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 1 in active state
> [   58.166398] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 2 in active state
> [   58.166401] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 3 in active state
> [   58.166404] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 5 in active state
> [   58.166407] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 6 in active state
> [   58.166410] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 7 in active state
> [   58.166413] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 8 in active state
> [   58.169738] qcom-iris aa00000.video-codec: invalid plane
> [   61.517138] ------------[ cut here ]------------
> [   61.517147] WARNING: CPU: 1 PID: 1209 at
> drivers/media/common/videobuf2/videobuf2-core.c:2222
> __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   61.517157] Modules linked in: rfcomm michael_mic reset_gpio
> snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai
> q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211
> ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common
> btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc
> regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh
> snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss
> snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro
> snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro
> soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode
> snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2
> videobuf2_common v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci
> videodev snd_compress mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm
> qcom_pd_mapper rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd
> pwrseq_core snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
> [   61.517210]  ip_tables x_tables autofs4 ipv6 fuse socinfo
> qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng
> rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100
> pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp
> hid_multitouch i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats
> phy_qcom_snps_eusb2 sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam
> qcom_spmi_temp_alarm industrialio sha3_ce phy_qcom_qmp_combo aux_bridge
> phy_qcom_eusb2_repeater qcom_pon reboot_mode sm3_ce sm3 ucsi_glink
> pmic_glink_altmode typec_ucsi qcom_battmgr aux_hpd_bridge pmic_glink
> pdr_interface qcom_pdr_msg typec msm drm_client_lib drm_exec llcc_qcom
> gpu_sched i2c_hid_of i2c_hid qrtr qcom_q6v5_pas qcom_pil_info
> qcom_common qcom_glink_smem qcom_glink qcom_q6v5 qcom_sysmon mdt_loader
> rpmsg_core qmi_helpers input_leds panel_edp drm_display_helper
> drm_dp_aux_bus drm_kms_helper drm i2c_core mhi libarc4 nvme nvme_core
> usb_storage r8152 mii libphy led_class dm_crypt dm_mod
> [   61.517282] CPU: 1 UID: 1001 PID: 1209 Comm: GstPlay Tainted: G
>    W           6.15.0-rc1 #69 PREEMPT
> [   61.517286] Tainted: [W]=WARN
> [   61.517288] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3,
> BIOS 2.5.0 12/16/2024
> [   61.517289] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS
> BTYPE=--)
> [   61.517291] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   61.517293] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
> [   61.517295] sp : ffff800083f9bb00
> [   61.517296] x29: ffff800083f9bb00 x28: ffff6ad64770c020 x27:
> 0000000000000000
> [   61.517299] x26: 0000000040045613 x25: 0000000000000000 x24:
> ffffac02677a6bc8
> [   61.517301] x23: ffff6ad64770c060 x22: ffff6ad68e60c780 x21:
> ffff6ad679c36428
> [   61.517304] x20: 0000000000000009 x19: ffff6ad679c36428 x18:
> 0000000000000000
> [   61.517306] x17: 0000000000000000 x16: ffffac027ba13408 x15:
> 0000ffff000304b0
> [   61.517309] x14: 0000000000000000 x13: 0000000000000000 x12:
> 0000000000000000
> [   61.517311] x11: 0000000000000000 x10: 0000000000000000 x9 :
> 0000000000000000
> [   61.517314] x8 : ffff800083f9bd48 x7 : ffffac02677a6e28 x6 :
> ffffac02677a6e28
> [   61.517316] x5 : 0000000000000000 x4 : 0000000000000001 x3 :
> 0000000000000000
> [   61.517319] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 :
> 0000000000000008
> [   61.517321] Call trace:
> [   61.517323]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
> [   61.517325]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
> [   61.517327]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
> [   61.517330]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
> [   61.517332]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
> [   61.517334]  v4l_streamoff+0x24/0x30 [videodev]
> [   61.517338]  __video_do_ioctl+0x40c/0x4a0 [videodev]
> [   61.517341]  video_usercopy+0x2bc/0x688 [videodev]
> [   61.517343]  video_ioctl2+0x18/0x38 [videodev]
> [   61.517346]  v4l2_ioctl+0x40/0x60 [videodev]
> [   61.517348]  __arm64_sys_ioctl+0xb4/0xf4
> [   61.517355]  invoke_syscall+0x48/0x104
> [   61.517359]  el0_svc_common.constprop.0+0x40/0xe0
> [   61.517362]  do_el0_svc+0x1c/0x28
> [   61.517364]  el0_svc+0x30/0xcc
> [   61.517368]  el0t_64_sync_handler+0x10c/0x138
> [   61.517371]  el0t_64_sync+0x198/0x19c
> [   61.517372] ---[ end trace 0000000000000000 ]---
> [   61.517375] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 0 in active state
> [   61.517377] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 1 in active state
> [   61.517378] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 2 in active state
> [   61.517379] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 3 in active state
> [   61.517381] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 5 in active state
> [   61.517382] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 6 in active state
> [   61.517383] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 7 in active state
> [   61.517384] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 8 in active state
> [   84.239087] ------------[ cut here ]------------
> [   84.239099] WARNING: CPU: 0 PID: 1283 at
> drivers/media/common/videobuf2/videobuf2-core.c:2222
> __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   84.239110] Modules linked in: rfcomm michael_mic reset_gpio
> snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai
> q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211
> ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common
> btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc
> regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh
> snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss
> snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro
> snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro
> soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode
> snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2
> videobuf2_common v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci
> videodev snd_compress mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm
> qcom_pd_mapper rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd
> pwrseq_core snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
> [   84.239190]  ip_tables x_tables autofs4 ipv6 fuse socinfo
> qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng
> rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100
> pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp
> hid_multitouch i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats
> phy_qcom_snps_eusb2 sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam
> qcom_spmi_temp_alarm industrialio sha3_ce phy_qcom_qmp_combo aux_bridge
> phy_qcom_eusb2_repeater qcom_pon reboot_mode sm3_ce sm3 ucsi_glink
> pmic_glink_altmode typec_ucsi qcom_battmgr aux_hpd_bridge pmic_glink
> pdr_interface qcom_pdr_msg typec msm drm_client_lib drm_exec llcc_qcom
> gpu_sched i2c_hid_of i2c_hid qrtr qcom_q6v5_pas qcom_pil_info
> qcom_common qcom_glink_smem qcom_glink qcom_q6v5 qcom_sysmon mdt_loader
> rpmsg_core qmi_helpers input_leds panel_edp drm_display_helper
> drm_dp_aux_bus drm_kms_helper drm i2c_core mhi libarc4 nvme nvme_core
> usb_storage r8152 mii libphy led_class dm_crypt dm_mod
> [   84.239292] CPU: 0 UID: 1001 PID: 1283 Comm: GstPlay Tainted: G
>    W           6.15.0-rc1 #69 PREEMPT
> [   84.239297] Tainted: [W]=WARN
> [   84.239299] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3,
> BIOS 2.5.0 12/16/2024
> [   84.239301] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS
> BTYPE=--)
> [   84.239304] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   84.239307] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
> [   84.239309] sp : ffff800082333b00
> [   84.239311] x29: ffff800082333b00 x28: ffff6ad65e9d5020 x27:
> 0000000000000000
> [   84.239315] x26: 0000000040045613 x25: 0000000000000000 x24:
> ffffac02677a6bc8
> [   84.239319] x23: ffff6ad65e9d5060 x22: ffff6ad646d64d80 x21:
> ffff6ad65f005028
> [   84.239324] x20: 0000000000000009 x19: ffff6ad65f005028 x18:
> 0000000000000000
> [   84.239328] x17: 0000000000000000 x16: ffffac027ba13408 x15:
> 0000ffff20030410
> [   84.239332] x14: 0000000000000000 x13: 0000000000000000 x12:
> 0000000000000000
> [   84.239335] x11: 0000000000000000 x10: 0000000000000000 x9 :
> 0000000000000000
> [   84.239339] x8 : ffff800082333d48 x7 : ffffac02677a6e28 x6 :
> ffffac02677a6e28
> [   84.239343] x5 : 0000000000000000 x4 : 0000000000000001 x3 :
> 0000000000000000
> [   84.239347] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 :
> 0000000000000016
> [   84.239351] Call trace:
> [   84.239353]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
> [   84.239357]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
> [   84.239360]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
> [   84.239364]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
> [   84.239368]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
> [   84.239370]  v4l_streamoff+0x24/0x30 [videodev]
> [   84.239376]  __video_do_ioctl+0x40c/0x4a0 [videodev]
> [   84.239380]  video_usercopy+0x2bc/0x688 [videodev]
> [   84.239384]  video_ioctl2+0x18/0x38 [videodev]
> [   84.239388]  v4l2_ioctl+0x40/0x60 [videodev]
> [   84.239392]  __arm64_sys_ioctl+0xb4/0xf4
> [   84.239400]  invoke_syscall+0x48/0x104
> [   84.239407]  el0_svc_common.constprop.0+0x40/0xe0
> [   84.239411]  do_el0_svc+0x1c/0x28
> [   84.239415]  el0_svc+0x30/0xcc
> [   84.239421]  el0t_64_sync_handler+0x10c/0x138
> [   84.239425]  el0t_64_sync+0x198/0x19c
> [   84.239428] ---[ end trace 0000000000000000 ]---
> [   84.239430] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 0 in active state
> [   84.239432] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 1 in active state
> [   84.239433] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 2 in active state
> [   84.239435] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 3 in active state
> [   84.239436] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 4 in active state
> [   84.239438] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 5 in active state
> [   84.239439] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 7 in active state
> [   84.239440] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 8 in active state
> [   84.239442] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 9 in active state
> [   84.239443] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 10 in active state
> [   84.239445] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 11 in active state
> [   84.239446] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 14 in active state
> [   84.239447] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 15 in active state
> [   84.239449] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 16 in active state
> [   84.239450] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 17 in active state
> [   84.239452] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 18 in active state
> [   84.239453] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 19 in active state
> [   84.239454] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 20 in active state
> [   84.239456] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 21 in active state
> [   84.239457] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 22 in active state
> [   84.239459] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 23 in active state
> [   84.239460] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 24 in active state
> [   84.245873] qcom-iris aa00000.video-codec: invalid plane
> [  126.573593] qcom-iris aa00000.video-codec: session error received
> 0x1000009: unknown
> [  126.573638] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.573644] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.573649] qcom-iris aa00000.video-codec: session error received
> 0x1000009: unknown
> [  126.573654] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.573659] qcom-iris aa00000.video-codec: session error received
> 0x1000009: unknown
> [  126.573664] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.573668] qcom-iris aa00000.video-codec: session error received
> 0x1000009: unknown
> [  126.573670] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582134] qcom-iris aa00000.video-codec: session error received
> 0x1000006: unknown
> [  126.582142] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582147] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582152] qcom-iris aa00000.video-codec: session error received
> 0x1000006: unknown
> [  126.582156] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582161] qcom-iris aa00000.video-codec: session error received
> 0x1000006: unknown
> [  126.582166] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582170] qcom-iris aa00000.video-codec: session error received
> 0x1000006: unknown
> [  126.582177] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> 

BTW my test case is gnome showtime and the 30 megabyte h264 and vp9 
bunny videos

https://test-videos.co.uk/bigbuckbunny/mp4-h264
https://test-videos.co.uk/bigbuckbunny/webm-vp9

---
bod

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

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-09 14:29 ` Bryan O'Donoghue
  2025-04-09 14:37   ` Bryan O'Donoghue
@ 2025-04-09 16:26   ` Neil Armstrong
  2025-04-09 17:59     ` Vikash Garodia
  2025-04-10  7:17   ` Dikshita Agarwal
  2 siblings, 1 reply; 44+ messages in thread
From: Neil Armstrong @ 2025-04-09 16:26 UTC (permalink / raw)
  To: Bryan O'Donoghue, Dikshita Agarwal, Vikash Garodia,
	Abhinav Kumar, Mauro Carvalho Chehab, Stefan Schmidt,
	Hans Verkuil, Bjorn Andersson, Konrad Dybcio, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Dmitry Baryshkov, linux-media, linux-arm-msm, linux-kernel,
	devicetree, stable, Dan Carpenter

On 09/04/2025 16:29, Bryan O'Donoghue wrote:
> On 08/04/2025 16:54, 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.
>>
>> These patches also address the comments and feedback received from the
>> RFC patches previously sent. I have made the necessary improvements
>> based on the community's suggestions.
>>
>> Changes sinces RFC:
>> - Added additional fixes to address issues identified during further
>> testing.
>> - Moved typo fix to a seperate patch [Neil]
>> - Reordered the patches for better logical flow and clarity [Neil,
>> Dmitry]
>> - Added fixes tag wherever applicable [Neil, Dmitry]
>> - Removed the default case in the switch statement for codecs [Bryan]
>> - Replaced if-else statements with switch-case [Bryan]
>> - Added comments for mbpf [Bryan]
>> - RFC: https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
>>
>> These patches are tested on SM8250 and SM8550 with v4l2-ctl and
>> Gstreamer for HEVC and VP9 decoders, at the same time ensured that
>> the existing H264 decoder functionality remains uneffected.
>>
>> Note: 1 of the fluster compliance test is fixed with firmware [1]
>> [1]: https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u
>>

<snip>

>> ---
>> Dikshita Agarwal (20):
>>        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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>>        media: iris: Add handling for no show frames
>>        media: iris: Improve last flag handling
>>        media: iris: Skip flush on first sequence change
>>        media: iris: Prevent HFI queue writes when core is in deinit state
>>        media: iris: Remove redundant buffer count check in stream off
>>        media: iris: Remove deprecated property setting to firmware
>>        media: iris: Fix missing function pointer initialization
>>        media: iris: Fix NULL pointer dereference
>>        media: iris: Fix typo in depth variable
>>        media: iris: Add a comment to explain usage of MBPS
>>        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: Add codec specific check for VP9 decoder drain handling
>>
>>   drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>>   drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>>   drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>>   .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>>   .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>>   .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>>   .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>>   .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>>   .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>>   drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>>   drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>>   .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>>   .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>>   .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>>   drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>>   drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>>   drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>>   drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>>   drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
>>   drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>>   20 files changed, 948 insertions(+), 153 deletions(-)
>> ---
>> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
>> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
>>
>> Best regards,
> 
> Assuming we merge Neils sm8650 stuff first, which I think we should merge first, you'll have a subsequent build error to fix [1]

I agree, it would be simpler, I prepared a fix to apply on top of this patchset.

> 
> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris?ref_type=heads
> 
> Testing your series in isolation. I can confirm vp9 decodes also getting some strange prinouts which we need to follow up to see if they exist with the baseline driver [2].
> 
> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris-20250408-iris-dec-hevc-vp9-v1-0-acd258778bd6@quicinc.com?ref_type=heads
> 

<snip>

> [  126.582170] qcom-iris aa00000.video-codec: session error received 0x1000006: unknown
> [  126.582177] qcom-iris aa00000.video-codec: session error received 0x4000004: invalid operation for current state

With the following on top of the last SM8650 patchet + this patchset, I have the same HEVC errors on SM8650, but VP9 works fine:
[  115.185745] qcom-iris aa00000.video-codec: session error received 0x4000004: invalid operation for current state
[  115.221058] qcom-iris aa00000.video-codec: session error received 0x1000006: unknown

==========================================><==============================================
diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
index 65f3accc2fb2..7d5116528fca 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
@@ -213,6 +213,22 @@ static void iris_set_sm8550_preset_registers(struct iris_core *core)
  	writel(0x0, core->reg_base + 0xB0088);
  }

+static void iris_set_sm8650_preset_registers(struct iris_core *core)
+{
+	writel(0x0, core->reg_base + 0xB0088);
+	writel(0x33332222, core->reg_base + 0x13030);
+	writel(0x44444444, core->reg_base + 0x13034);
+	writel(0x1022, core->reg_base + 0x13038);
+	writel(0x0, core->reg_base + 0x13040);
+	writel(0xFFFF, core->reg_base + 0x13048);
+	writel(0x33332222, core->reg_base + 0x13430);
+	writel(0x44444444, core->reg_base + 0x13434);
+	writel(0x1022, core->reg_base + 0x13438);
+	writel(0x0, core->reg_base + 0x13440);
+	writel(0xFFFF, core->reg_base + 0x13448);
+	writel(0x99, core->reg_base + 0xA013C);
+}
+
  static const struct icc_info sm8550_icc_table[] = {
  	{ "cpu-cfg",    1000, 1000     },
  	{ "video-mem",  1000, 15000000 },
@@ -390,6 +406,7 @@ struct iris_platform_data sm8550_data = {

  /*
   * Shares most of SM8550 data except:
+ * - set_preset_registers to iris_set_sm8650_preset_registers
   * - vpu_ops to iris_vpu33_ops
   * - clk_rst_tbl to sm8650_clk_reset_table
   * - controller_rst_tbl to sm8650_controller_reset_table
@@ -400,7 +417,7 @@ struct iris_platform_data sm8650_data = {
  	.init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
  	.init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
  	.vpu_ops = &iris_vpu33_ops,
-	.set_preset_registers = iris_set_sm8550_preset_registers,
+	.set_preset_registers = iris_set_sm8650_preset_registers,
  	.icc_tbl = sm8550_icc_table,
  	.icc_tbl_size = ARRAY_SIZE(sm8550_icc_table),
  	.clk_rst_tbl = sm8650_clk_reset_table,
@@ -428,20 +445,34 @@ struct iris_platform_data sm8650_data = {
  	.ubwc_config = &ubwc_config_sm8550,
  	.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),
+	.max_core_mbpf = NUM_MBS_8K * 2,
+	.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,
==========================================><==============================================

Thanks,
Neil

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

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-09 16:26   ` Neil Armstrong
@ 2025-04-09 17:59     ` Vikash Garodia
  2025-04-10  7:20       ` neil.armstrong
  0 siblings, 1 reply; 44+ messages in thread
From: Vikash Garodia @ 2025-04-09 17:59 UTC (permalink / raw)
  To: neil.armstrong, Bryan O'Donoghue, Dikshita Agarwal,
	Abhinav Kumar, Mauro Carvalho Chehab, Stefan Schmidt,
	Hans Verkuil, Bjorn Andersson, Konrad Dybcio, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Dmitry Baryshkov, linux-media, linux-arm-msm, linux-kernel,
	devicetree, stable, Dan Carpenter



On 4/9/2025 9:56 PM, Neil Armstrong wrote:
> On 09/04/2025 16:29, Bryan O'Donoghue wrote:
>> On 08/04/2025 16:54, 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.
>>>
>>> These patches also address the comments and feedback received from the
>>> RFC patches previously sent. I have made the necessary improvements
>>> based on the community's suggestions.
>>>
>>> Changes sinces RFC:
>>> - Added additional fixes to address issues identified during further
>>> testing.
>>> - Moved typo fix to a seperate patch [Neil]
>>> - Reordered the patches for better logical flow and clarity [Neil,
>>> Dmitry]
>>> - Added fixes tag wherever applicable [Neil, Dmitry]
>>> - Removed the default case in the switch statement for codecs [Bryan]
>>> - Replaced if-else statements with switch-case [Bryan]
>>> - Added comments for mbpf [Bryan]
>>> - RFC:
>>> https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
>>>
>>> These patches are tested on SM8250 and SM8550 with v4l2-ctl and
>>> Gstreamer for HEVC and VP9 decoders, at the same time ensured that
>>> the existing H264 decoder functionality remains uneffected.
>>>
>>> Note: 1 of the fluster compliance test is fixed with firmware [1]
>>> [1]:
>>> https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u
>>>
> 
> <snip>
> 
>>> ---
>>> Dikshita Agarwal (20):
>>>        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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>>>        media: iris: Add handling for no show frames
>>>        media: iris: Improve last flag handling
>>>        media: iris: Skip flush on first sequence change
>>>        media: iris: Prevent HFI queue writes when core is in deinit state
>>>        media: iris: Remove redundant buffer count check in stream off
>>>        media: iris: Remove deprecated property setting to firmware
>>>        media: iris: Fix missing function pointer initialization
>>>        media: iris: Fix NULL pointer dereference
>>>        media: iris: Fix typo in depth variable
>>>        media: iris: Add a comment to explain usage of MBPS
>>>        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: Add codec specific check for VP9 decoder drain handling
>>>
>>>   drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>>>   drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>>>   drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>>>   .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>>>   .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>>>   .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>>>   .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>>>   .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>>>   .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>>>   drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>>>   drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>>>   .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>>>   .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>>>   .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>>>   drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>>>   drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>>>   drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>>>   drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>>>   drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
>>>   drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>>>   20 files changed, 948 insertions(+), 153 deletions(-)
>>> ---
>>> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
>>> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
>>>
>>> Best regards,
>>
>> Assuming we merge Neils sm8650 stuff first, which I think we should merge
>> first, you'll have a subsequent build error to fix [1]
> 
> I agree, it would be simpler, I prepared a fix to apply on top of this patchset.
Lets sort out the platform data handling. More so, when i see that the patch you
are adding more of 8650 specific data into 8550 file.
> 
>>
>> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris?ref_type=heads
>>
>> Testing your series in isolation. I can confirm vp9 decodes also getting some
>> strange prinouts which we need to follow up to see if they exist with the
>> baseline driver [2].
>>
>> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris-20250408-iris-dec-hevc-vp9-v1-0-acd258778bd6@quicinc.com?ref_type=heads
>>
> 
> <snip>
> 
>> [  126.582170] qcom-iris aa00000.video-codec: session error received
>> 0x1000006: unknown
>> [  126.582177] qcom-iris aa00000.video-codec: session error received
>> 0x4000004: invalid operation for current state
> 
> With the following on top of the last SM8650 patchet + this patchset, I have the
> same HEVC errors on SM8650, but VP9 works fine:
> [  115.185745] qcom-iris aa00000.video-codec: session error received 0x4000004:
> invalid operation for current state
> [  115.221058] qcom-iris aa00000.video-codec: session error received 0x1000006:
> unknown
> 
> ==========================================><==============================================
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> index 65f3accc2fb2..7d5116528fca 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
> @@ -213,6 +213,22 @@ static void iris_set_sm8550_preset_registers(struct
> iris_core *core)
>      writel(0x0, core->reg_base + 0xB0088);
>  }
> 
> +static void iris_set_sm8650_preset_registers(struct iris_core *core)
> +{
> +    writel(0x0, core->reg_base + 0xB0088);
> +    writel(0x33332222, core->reg_base + 0x13030);
> +    writel(0x44444444, core->reg_base + 0x13034);
> +    writel(0x1022, core->reg_base + 0x13038);
> +    writel(0x0, core->reg_base + 0x13040);
> +    writel(0xFFFF, core->reg_base + 0x13048);
> +    writel(0x33332222, core->reg_base + 0x13430);
> +    writel(0x44444444, core->reg_base + 0x13434);
> +    writel(0x1022, core->reg_base + 0x13438);
> +    writel(0x0, core->reg_base + 0x13440);
> +    writel(0xFFFF, core->reg_base + 0x13448);
> +    writel(0x99, core->reg_base + 0xA013C);
> +}
This is strange, h264 decoder does not need any of those while VP9 needed it to
work. I could see the same set of registers in downstream code, but cannot
recollect now on the need to add those.

Regards,
Vikash
> +
>  static const struct icc_info sm8550_icc_table[] = {
>      { "cpu-cfg",    1000, 1000     },
>      { "video-mem",  1000, 15000000 },
> @@ -390,6 +406,7 @@ struct iris_platform_data sm8550_data = {
> 
>  /*
>   * Shares most of SM8550 data except:
> + * - set_preset_registers to iris_set_sm8650_preset_registers
>   * - vpu_ops to iris_vpu33_ops
>   * - clk_rst_tbl to sm8650_clk_reset_table
>   * - controller_rst_tbl to sm8650_controller_reset_table
> @@ -400,7 +417,7 @@ struct iris_platform_data sm8650_data = {
>      .init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
>      .init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
>      .vpu_ops = &iris_vpu33_ops,
> -    .set_preset_registers = iris_set_sm8550_preset_registers,
> +    .set_preset_registers = iris_set_sm8650_preset_registers,
>      .icc_tbl = sm8550_icc_table,
>      .icc_tbl_size = ARRAY_SIZE(sm8550_icc_table),
>      .clk_rst_tbl = sm8650_clk_reset_table,
> @@ -428,20 +445,34 @@ struct iris_platform_data sm8650_data = {
>      .ubwc_config = &ubwc_config_sm8550,
>      .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),
> +    .max_core_mbpf = NUM_MBS_8K * 2,
> +    .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,
> ==========================================><==============================================
> 
> Thanks,
> Neil

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

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-09 14:29 ` Bryan O'Donoghue
  2025-04-09 14:37   ` Bryan O'Donoghue
  2025-04-09 16:26   ` Neil Armstrong
@ 2025-04-10  7:17   ` Dikshita Agarwal
  2 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-10  7:17 UTC (permalink / raw)
  To: Bryan O'Donoghue, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable, Dan Carpenter



On 4/9/2025 7:59 PM, Bryan O'Donoghue wrote:
> On 08/04/2025 16:54, 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.
>>
>> These patches also address the comments and feedback received from the
>> RFC patches previously sent. I have made the necessary improvements
>> based on the community's suggestions.
>>
>> Changes sinces RFC:
>> - Added additional fixes to address issues identified during further
>> testing.
>> - Moved typo fix to a seperate patch [Neil]
>> - Reordered the patches for better logical flow and clarity [Neil,
>> Dmitry]
>> - Added fixes tag wherever applicable [Neil, Dmitry]
>> - Removed the default case in the switch statement for codecs [Bryan]
>> - Replaced if-else statements with switch-case [Bryan]
>> - Added comments for mbpf [Bryan]
>> - RFC:
>> https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
>>
>> These patches are tested on SM8250 and SM8550 with v4l2-ctl and
>> Gstreamer for HEVC and VP9 decoders, at the same time ensured that
>> the existing H264 decoder functionality remains uneffected.
>>
>> Note: 1 of the fluster compliance test is fixed with firmware [1]
>> [1]:
>> https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u
>>
>> The result of fluster test on SM8550:
>>   131/147 testcases passed while testing JCT-VC-HEVC_V1 with
>>   GStreamer-H.265-V4L2-Gst1.0.
>>   The failing test case:
>>   - 10 testcases failed due to unsupported 10 bit format.
>>     - DBLK_A_MAIN10_VIXS_4
>>     - INITQP_B_Main10_Sony_1
>>     - TSUNEQBD_A_MAIN10_Technicolor_2
>>     - WP_A_MAIN10_Toshiba_3
>>     - WP_MAIN10_B_Toshiba_3
>>     - WPP_A_ericsson_MAIN10_2
>>     - WPP_B_ericsson_MAIN10_2
>>     - WPP_C_ericsson_MAIN10_2
>>     - WPP_E_ericsson_MAIN10_2
>>     - WPP_F_ericsson_MAIN10_2
>>   - 4 testcase failed due to unsupported resolution
>>     - PICSIZE_A_Bossen_1
>>     - PICSIZE_B_Bossen_1
>>     - WPP_D_ericsson_MAIN10_2
>>     - WPP_D_ericsson_MAIN_2
>>   - 1 testcase failed as bitstream is invalid (this fails with reference
>>     as well)
>>     - RAP_B_Bossen_2
>>   - 1 testcase failed due to CRC mismatch
>>     - RAP_A_docomo_6
>>       Analysis - First few frames in this discarded by firmware and are
>>       sent to driver with 0 filled length. Driver send such buffers to
>>       client with timestamp 0 and payload set to 0 and
>>       make buf state to VB2_BUF_STATE_ERROR. Such buffers should be
>>       dropped by GST. But instead, the first frame displayed as green
>>       frame and when a valid buffer is sent to client later with same 0
>>       timestamp, its dropped, leading to CRC mismatch for first frame.
>>
>>   235/305 testcases passed while testing VP9-TEST-VECTORS with
>>   GStreamer-VP9-V4L2-Gst1.0.
>>   The failing test case:
>>   - 64 testcases failed due to unsupported resolution
>>     - vp90-2-02-size-08x08.webm
>>     - vp90-2-02-size-08x10.webm
>>     - vp90-2-02-size-08x16.webm
>>     - vp90-2-02-size-08x18.webm
>>     - vp90-2-02-size-08x32.webm
>>     - vp90-2-02-size-08x34.webm
>>     - vp90-2-02-size-08x64.webm
>>     - vp90-2-02-size-08x66.webm
>>     - vp90-2-02-size-10x08.webm
>>     - vp90-2-02-size-10x10.webm
>>     - vp90-2-02-size-10x16.webm
>>     - vp90-2-02-size-10x18.webm
>>     - vp90-2-02-size-10x32.webm
>>     - vp90-2-02-size-10x34.webm
>>     - vp90-2-02-size-10x64.webm
>>     - vp90-2-02-size-10x66.webm
>>     - vp90-2-02-size-16x08.webm
>>     - vp90-2-02-size-16x10.webm
>>     - vp90-2-02-size-16x16.webm
>>     - vp90-2-02-size-16x18.webm
>>     - vp90-2-02-size-16x32.webm
>>     - vp90-2-02-size-16x34.webm
>>     - vp90-2-02-size-16x64.webm
>>     - vp90-2-02-size-16x66.webm
>>     - vp90-2-02-size-18x08.webm
>>     - vp90-2-02-size-18x10.webm
>>     - vp90-2-02-size-18x16.webm
>>     - vp90-2-02-size-18x18.webm
>>     - vp90-2-02-size-18x32.webm
>>     - vp90-2-02-size-18x34.webm
>>     - vp90-2-02-size-18x64.webm
>>     - vp90-2-02-size-18x66.webm
>>     - vp90-2-02-size-32x08.webm
>>     - vp90-2-02-size-32x10.webm
>>     - vp90-2-02-size-32x16.webm
>>     - vp90-2-02-size-32x18.webm
>>     - vp90-2-02-size-32x32.webm
>>     - vp90-2-02-size-32x34.webm
>>     - vp90-2-02-size-32x64.webm
>>     - vp90-2-02-size-32x66.webm
>>     - vp90-2-02-size-34x08.webm
>>     - vp90-2-02-size-34x10.webm
>>     - vp90-2-02-size-34x16.webm
>>     - vp90-2-02-size-34x18.webm
>>     - vp90-2-02-size-34x32.webm
>>     - vp90-2-02-size-34x34.webm
>>     - vp90-2-02-size-34x64.webm
>>     - vp90-2-02-size-34x66.webm
>>     - vp90-2-02-size-64x08.webm
>>     - vp90-2-02-size-64x10.webm
>>     - vp90-2-02-size-64x16.webm
>>     - vp90-2-02-size-64x18.webm
>>     - vp90-2-02-size-64x32.webm
>>     - vp90-2-02-size-64x34.webm
>>     - vp90-2-02-size-64x64.webm
>>     - vp90-2-02-size-64x66.webm
>>     - vp90-2-02-size-66x08.webm
>>     - vp90-2-02-size-66x10.webm
>>     - vp90-2-02-size-66x16.webm
>>     - vp90-2-02-size-66x18.webm
>>     - vp90-2-02-size-66x32.webm
>>     - vp90-2-02-size-66x34.webm
>>     - vp90-2-02-size-66x64.webm
>>     - vp90-2-02-size-66x66.webm
>>   - 2 testcases failed due to unsupported format
>>     - vp91-2-04-yuv422.webm
>>     - vp91-2-04-yuv444.webm
>>   - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>>     - vp90-2-22-svc_1280x720_3.ivf
>>   - 2 testcase failed due to unsupported resolution after sequence change
>>     - vp90-2-21-resize_inter_320x180_5_1-2.webm
>>     - vp90-2-21-resize_inter_320x180_7_1-2.webm
>>   - 1 testcase failed due to unsupported stream
>>     - vp90-2-16-intra-only.webm
>>   Note: There is a timing issue with the clips having multiple resolution
>>   change. Where firmware returned all the buffers with previous sequence
>>   and has no buffer left to attach the LAST flag to. At the same time,
>>   client is not queueing any further buffers, so there is deadlock where
>>   client is waiting for LAST flag, while firmware doesn't have any
>>   capture buffer to attach LAST flag to.
>>   Ideally client should keep queueing the buffers on capture queue untill
>>   the LAST flag is received.
>>
>> The result of fluster test on SM8250:
>>   132/147 testcases passed while testing JCT-VC-HEVC_V1 with
>>   GStreamer-H.265-V4L2-Gst1.0.
>>   The failing test case:
>>   - 10 testcases failed due to unsupported 10 bit format.
>>     - DBLK_A_MAIN10_VIXS_4
>>     - INITQP_B_Main10_Sony_1
>>     - TSUNEQBD_A_MAIN10_Technicolor_2
>>     - WP_A_MAIN10_Toshiba_3
>>     - WP_MAIN10_B_Toshiba_3
>>     - WPP_A_ericsson_MAIN10_2
>>     - WPP_B_ericsson_MAIN10_2
>>     - WPP_C_ericsson_MAIN10_2
>>     - WPP_E_ericsson_MAIN10_2
>>     - WPP_F_ericsson_MAIN10_2
>>   - 4 testcase failed due to unsupported resolution
>>     - PICSIZE_A_Bossen_1
>>     - PICSIZE_B_Bossen_1
>>     - WPP_D_ericsson_MAIN10_2
>>     - WPP_D_ericsson_MAIN_2
>>   - 1 testcase failed as bitstream is invalid (this fails with reference
>>     as well)
>>     - RAP_B_Bossen_2
>>
>>   232/305 testcases passed while testing VP9-TEST-VECTORS with
>>   GStreamer-VP9-V4L2-Gst1.0.
>>   The failing test case:
>>   - 64 testcases failed due to unsupported resolution
>>     - vp90-2-02-size-08x08.webm
>>     - vp90-2-02-size-08x10.webm
>>     - vp90-2-02-size-08x16.webm
>>     - vp90-2-02-size-08x18.webm
>>     - vp90-2-02-size-08x32.webm
>>     - vp90-2-02-size-08x34.webm
>>     - vp90-2-02-size-08x64.webm
>>     - vp90-2-02-size-08x66.webm
>>     - vp90-2-02-size-10x08.webm
>>     - vp90-2-02-size-10x10.webm
>>     - vp90-2-02-size-10x16.webm
>>     - vp90-2-02-size-10x18.webm
>>     - vp90-2-02-size-10x32.webm
>>     - vp90-2-02-size-10x34.webm
>>     - vp90-2-02-size-10x64.webm
>>     - vp90-2-02-size-10x66.webm
>>     - vp90-2-02-size-16x08.webm
>>     - vp90-2-02-size-16x10.webm
>>     - vp90-2-02-size-16x16.webm
>>     - vp90-2-02-size-16x18.webm
>>     - vp90-2-02-size-16x32.webm
>>     - vp90-2-02-size-16x34.webm
>>     - vp90-2-02-size-16x64.webm
>>     - vp90-2-02-size-16x66.webm
>>     - vp90-2-02-size-18x08.webm
>>     - vp90-2-02-size-18x10.webm
>>     - vp90-2-02-size-18x16.webm
>>     - vp90-2-02-size-18x18.webm
>>     - vp90-2-02-size-18x32.webm
>>     - vp90-2-02-size-18x34.webm
>>     - vp90-2-02-size-18x64.webm
>>     - vp90-2-02-size-18x66.webm
>>     - vp90-2-02-size-32x08.webm
>>     - vp90-2-02-size-32x10.webm
>>     - vp90-2-02-size-32x16.webm
>>     - vp90-2-02-size-32x18.webm
>>     - vp90-2-02-size-32x32.webm
>>     - vp90-2-02-size-32x34.webm
>>     - vp90-2-02-size-32x64.webm
>>     - vp90-2-02-size-32x66.webm
>>     - vp90-2-02-size-34x08.webm
>>     - vp90-2-02-size-34x10.webm
>>     - vp90-2-02-size-34x16.webm
>>     - vp90-2-02-size-34x18.webm
>>     - vp90-2-02-size-34x32.webm
>>     - vp90-2-02-size-34x34.webm
>>     - vp90-2-02-size-34x64.webm
>>     - vp90-2-02-size-34x66.webm
>>     - vp90-2-02-size-64x08.webm
>>     - vp90-2-02-size-64x10.webm
>>     - vp90-2-02-size-64x16.webm
>>     - vp90-2-02-size-64x18.webm
>>     - vp90-2-02-size-64x32.webm
>>     - vp90-2-02-size-64x34.webm
>>     - vp90-2-02-size-64x64.webm
>>     - vp90-2-02-size-64x66.webm
>>     - vp90-2-02-size-66x08.webm
>>     - vp90-2-02-size-66x10.webm
>>     - vp90-2-02-size-66x16.webm
>>     - vp90-2-02-size-66x18.webm
>>     - vp90-2-02-size-66x32.webm
>>     - vp90-2-02-size-66x34.webm
>>     - vp90-2-02-size-66x64.webm
>>     - vp90-2-02-size-66x66.webm
>>   - 2 testcases failed due to unsupported format
>>     - vp91-2-04-yuv422.webm
>>     - vp91-2-04-yuv444.webm
>>   - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>>     - vp90-2-22-svc_1280x720_3.ivf
>>   - 5 testcase failed due to unsupported resolution after sequence change
>>     - vp90-2-21-resize_inter_320x180_5_1-2.webm
>>     - vp90-2-21-resize_inter_320x180_7_1-2.webm
>>     - vp90-2-21-resize_inter_320x240_5_1-2.webm
>>     - vp90-2-21-resize_inter_320x240_7_1-2.webm
>>     - vp90-2-18-resize.ivf
>>   - 1 testcase failed with CRC mismatch
>>     - vp90-2-16-intra-only.webm
>>     Analysis: First few frames are marked by firmware as NO_SHOW frame.
>>     Driver make buf state to VB2_BUF_STATE_ERROR for such frames.
>>     Such buffers should be dropped by GST. But instead, the first frame
>>     is being displayed and when a valid buffer is sent to client later
>>     with same timestamp, its dropped, leading to CRC mismatch for first
>>     frame.
>>   Note: Same timing issue as observed on SM8550 is seen on SM8250 as
>>   well.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>> Dikshita Agarwal (20):
>>        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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled
>> length
>>        media: iris: Add handling for no show frames
>>        media: iris: Improve last flag handling
>>        media: iris: Skip flush on first sequence change
>>        media: iris: Prevent HFI queue writes when core is in deinit state
>>        media: iris: Remove redundant buffer count check in stream off
>>        media: iris: Remove deprecated property setting to firmware
>>        media: iris: Fix missing function pointer initialization
>>        media: iris: Fix NULL pointer dereference
>>        media: iris: Fix typo in depth variable
>>        media: iris: Add a comment to explain usage of MBPS
>>        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: Add codec specific check for VP9 decoder drain handling
>>
>>   drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>>   drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>>   drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>>   .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>>   .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>>   .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>>   .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>>   .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>>   .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>>   drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>>   drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>>   .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>>   .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>>   .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>>   drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>>   drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>>   drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>>   drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>>   drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397
>> ++++++++++++++++++++-
>>   drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>>   20 files changed, 948 insertions(+), 153 deletions(-)
>> ---
>> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
>> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
>>
>> Best regards,
> 
> Assuming we merge Neils sm8650 stuff first, which I think we should merge
> first, you'll have a subsequent build error to fix [1]
> 
I am okay to let Lanai go first (with only h264 enabled) after all open
comments are addressed on the patch series posted.
Currently my changes are not including Lanai changes, so the compilation
errors are obvious if you combine Lanai patches with this series.
once Lanai changes are reviewed/accepted, I am okay to rebase this series
on top of it.
> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris?ref_type=heads
> 
> Testing your series in isolation. I can confirm vp9 decodes also getting
> some strange prinouts which we need to follow up to see if they exist with
> the baseline driver [2].
> 
Sure, I will also take a look at it.

Thanks,
Dikshita
> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris-20250408-iris-dec-hevc-vp9-v1-0-acd258778bd6@quicinc.com?ref_type=heads
> 
> [1]
> 
>  CC [M]  drivers/media/platform/qcom/iris/iris_vdec.o
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:432:10: error: ‘struct iris_platform_data’ has no member named ‘input_config_params’; did you mean ‘output_config_params’?
>   432 |         .input_config_params =
>       |          ^~~~~~~~~~~~~~~~~~~
>       |          output_config_params
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:433:17: error: ‘sm8550_vdec_input_config_params’ undeclared here (not in a function); did you mean ‘sm8550_vdec_output_config_params’?
>   433 |                 sm8550_vdec_input_config_params,
>       |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>       |                 sm8550_vdec_output_config_params
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:434:10: error: ‘struct iris_platform_data’ has no member named ‘input_config_params_size’; did you mean ‘output_config_params_size’?
>   434 |         .input_config_params_size =
>       |          ^~~~~~~~~~~~~~~~~~~~~~~~
>       |          output_config_params_size
> In file included from
> /home/deckard/Development/linux/include/linux/dev_printk.h:14,
>                  from
> /home/deckard/Development/linux/include/linux/device.h:15,
>                  from
> /home/deckard/Development/linux/include/linux/pm_domain.h:11,
>                  from
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_core.h:10,
>                  from
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:6:
> /home/deckard/Development/linux/include/linux/compiler.h:197:77: error:
> expression in static assertion is not an integer
>   197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct
> {_Static_assert(!(e), msg);}))
>       |             ^
> /home/deckard/Development/linux/include/linux/compiler.h:202:33: note: in
> expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
>   202 | #define __must_be_array(a) __BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
>       |                                 ^~~~~~~~~~~~~~~~~~~~~~~
> /home/deckard/Development/linux/include/linux/array_size.h:11:59: note: in
> expansion of macro ‘__must_be_array’
>    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) +
> __must_be_array(arr))
>       | ^~~~~~~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:435:17: note: in expansion of macro ‘ARRAY_SIZE’
>   435 |                 ARRAY_SIZE(sm8550_vdec_input_config_params),
>       |                 ^~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:10: error: ‘struct iris_platform_data’ has no member named ‘dec_output_prop’; did you mean ‘dec_input_prop’?
>   442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>       |          ^~~~~~~~~~~~~~~
>       |          dec_input_prop
>   CC [M]  drivers/media/platform/qcom/iris/iris_vpu3x.o
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:28: error: ‘sm8550_vdec_subscribe_output_properties’ undeclared here (not in a function); did you mean ‘sm8550_vdec_subscribe_input_properties’?
>   442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>       |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>       |                            sm8550_vdec_subscribe_input_properties
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:10: error: ‘struct iris_platform_data’ has no member named ‘dec_output_prop_size’; did you mean ‘dec_input_prop_size’?
>   443 |         .dec_output_prop_size =
> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>       |          ^~~~~~~~~~~~~~~~~~~~
>       |          dec_input_prop_size
> /home/deckard/Development/linux/include/linux/compiler.h:197:77: error:
> expression in static assertion is not an integer
>   197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct
> {_Static_assert(!(e), msg);}))
>       |             ^
> /home/deckard/Development/linux/include/linux/compiler.h:202:33: note: in
> expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
>   202 | #define __must_be_array(a) __BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
>       |                                 ^~~~~~~~~~~~~~~~~~~~~~~
> /home/deckard/Development/linux/include/linux/array_size.h:11:59: note: in
> expansion of macro ‘__must_be_array’
>    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) +
> __must_be_array(arr))
>       | ^~~~~~~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:33: note: in expansion of macro ‘ARRAY_SIZE’
>   443 |         .dec_output_prop_size =
> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>       |                                 ^~~~~~~~~~
> make[8]: *** [/home/deckard/Development/linux/scripts/Makefile.build:203:
> drivers/media/platform/qcom/iris/iris_platform_sm8550.o] Error 1
> make[8]: *** Waiting for unfinished jobs....
> make[7]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform/qcom/iris] Error 2
> make[6]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform/qcom] Error 2
> make[5]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform] Error 2
> make[4]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media] Error 2
> make[3]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers] Error 2
> make[2]: *** [/home/deckard/Development/linux/Makefile:2006: .] Error 2
> make[1]: *** [/home/deckard/Development/linux/Makefile:248: __sub-make]
> Error 2
> make[1]: Leaving directory
> '/home/deckard/Development/linux-tools/qlt-kernel/build/x1e80100-crd_qlt_integration'
> make: *** [Makefile:248: __sub-make] Error 2
> make[1]: Entering directory
> '/home/deckard/Development/linux-tools/qlt-kernel/build/x1e80100-crd_qlt_integration'
>   GEN     Makefile
>   CALL    /home/deckard/Development/linux/scripts/checksyscalls.sh
>   CC [M]  drivers/media/platform/qcom/iris/iris_platform_sm8550.o
>   CC [M]  drivers/media/platform/qcom/iris/iris_vpu_buffer.o
>   CC [M]  drivers/media/platform/qcom/iris/iris_vpu_common.o
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:432:10: error: ‘struct iris_platform_data’ has no member named ‘input_config_params’; did you mean ‘output_config_params’?
>   432 |         .input_config_params =
>       |          ^~~~~~~~~~~~~~~~~~~
>       |          output_config_params
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:433:17: error: ‘sm8550_vdec_input_config_params’ undeclared here (not in a function); did you mean ‘sm8550_vdec_output_config_params’?
>   433 |                 sm8550_vdec_input_config_params,
>       |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>       |                 sm8550_vdec_output_config_params
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:434:10: error: ‘struct iris_platform_data’ has no member named ‘input_config_params_size’; did you mean ‘output_config_params_size’?
>   434 |         .input_config_params_size =
>       |          ^~~~~~~~~~~~~~~~~~~~~~~~
>       |          output_config_params_size
> In file included from
> /home/deckard/Development/linux/include/linux/dev_printk.h:14,
>                  from
> /home/deckard/Development/linux/include/linux/device.h:15,
>                  from
> /home/deckard/Development/linux/include/linux/pm_domain.h:11,
>                  from
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_core.h:10,
>                  from
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:6:
> /home/deckard/Development/linux/include/linux/compiler.h:197:77: error:
> expression in static assertion is not an integer
>   197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct
> {_Static_assert(!(e), msg);}))
>       |             ^
> /home/deckard/Development/linux/include/linux/compiler.h:202:33: note: in
> expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
>   202 | #define __must_be_array(a) __BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
>       |                                 ^~~~~~~~~~~~~~~~~~~~~~~
> /home/deckard/Development/linux/include/linux/array_size.h:11:59: note: in
> expansion of macro ‘__must_be_array’
>    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) +
> __must_be_array(arr))
>       | ^~~~~~~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:435:17: note: in expansion of macro ‘ARRAY_SIZE’
>   435 |                 ARRAY_SIZE(sm8550_vdec_input_config_params),
>       |                 ^~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:10: error: ‘struct iris_platform_data’ has no member named ‘dec_output_prop’; did you mean ‘dec_input_prop’?
>   442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>       |          ^~~~~~~~~~~~~~~
>       |          dec_input_prop
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:442:28: error: ‘sm8550_vdec_subscribe_output_properties’ undeclared here (not in a function); did you mean ‘sm8550_vdec_subscribe_input_properties’?
>   442 |         .dec_output_prop = sm8550_vdec_subscribe_output_properties,
>       |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>       |                            sm8550_vdec_subscribe_input_properties
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:10: error: ‘struct iris_platform_data’ has no member named ‘dec_output_prop_size’; did you mean ‘dec_input_prop_size’?
>   443 |         .dec_output_prop_size =
> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>       |          ^~~~~~~~~~~~~~~~~~~~
>       |          dec_input_prop_size
> /home/deckard/Development/linux/include/linux/compiler.h:197:77: error:
> expression in static assertion is not an integer
>   197 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct
> {_Static_assert(!(e), msg);}))
>       |             ^
> /home/deckard/Development/linux/include/linux/compiler.h:202:33: note: in
> expansion of macro ‘__BUILD_BUG_ON_ZERO_MSG’
>   202 | #define __must_be_array(a) __BUILD_BUG_ON_ZERO_MSG(!__is_array(a), \
>       |                                 ^~~~~~~~~~~~~~~~~~~~~~~
> /home/deckard/Development/linux/include/linux/array_size.h:11:59: note: in
> expansion of macro ‘__must_be_array’
>    11 | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) +
> __must_be_array(arr))
>       | ^~~~~~~~~~~~~~~
> /home/deckard/Development/linux/drivers/media/platform/qcom/iris/iris_platform_sm8550.c:443:33: note: in expansion of macro ‘ARRAY_SIZE’
>   443 |         .dec_output_prop_size =
> ARRAY_SIZE(sm8550_vdec_subscribe_output_properties),
>       |                                 ^~~~~~~~~~
> make[8]: *** [/home/deckard/Development/linux/scripts/Makefile.build:203:
> drivers/media/platform/qcom/iris/iris_platform_sm8550.o] Error 1
> make[8]: *** Waiting for unfinished jobs....
> make[7]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform/qcom/iris] Error 2
> make[6]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform/qcom] Error 2
> make[5]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media/platform] Error 2
> make[4]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers/media] Error 2
> make[3]: *** [/home/deckard/Development/linux/scripts/Makefile.build:461:
> drivers] Error 2
> 
> 
> [2]
> 
> [   58.165118] qcom-iris aa00000.video-codec: invalid plane
> [   58.165721] ------------[ cut here ]------------
> [   58.165727] WARNING: CPU: 1 PID: 1209 at
> drivers/media/common/videobuf2/videobuf2-core.c:2222
> __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   58.165749] Modules linked in: rfcomm michael_mic reset_gpio
> snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai
> q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211
> ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common
> btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc
> regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh
> snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss
> snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro
> snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro
> soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode
> snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2 videobuf2_common
> v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci videodev snd_compress
> mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm qcom_pd_mapper
> rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd pwrseq_core
> snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
> [   58.165914]  ip_tables x_tables autofs4 ipv6 fuse socinfo
> qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng
> rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100
> pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp hid_multitouch
> i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats phy_qcom_snps_eusb2
> sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam qcom_spmi_temp_alarm
> industrialio sha3_ce phy_qcom_qmp_combo aux_bridge phy_qcom_eusb2_repeater
> qcom_pon reboot_mode sm3_ce sm3 ucsi_glink pmic_glink_altmode typec_ucsi
> qcom_battmgr aux_hpd_bridge pmic_glink pdr_interface qcom_pdr_msg typec msm
> drm_client_lib drm_exec llcc_qcom gpu_sched i2c_hid_of i2c_hid qrtr
> qcom_q6v5_pas qcom_pil_info qcom_common qcom_glink_smem qcom_glink
> qcom_q6v5 qcom_sysmon mdt_loader rpmsg_core qmi_helpers input_leds
> panel_edp drm_display_helper drm_dp_aux_bus drm_kms_helper drm i2c_core mhi
> libarc4 nvme nvme_core usb_storage r8152 mii libphy led_class dm_crypt dm_mod
> [   58.166115] CPU: 1 UID: 1001 PID: 1209 Comm: GstPlay Tainted: G
>  W           6.15.0-rc1 #69 PREEMPT
> [   58.166125] Tainted: [W]=WARN
> [   58.166129] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3, BIOS
> 2.5.0 12/16/2024
> [   58.166133] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--)
> [   58.166140] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   58.166146] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
> [   58.166152] sp : ffff800083f9bb00
> [   58.166155] x29: ffff800083f9bb00 x28: ffff6ad64770c020 x27:
> 0000000000000000
> [   58.166165] x26: 0000000040045613 x25: 0000000000000000 x24:
> ffffac02677a6bc8
> [   58.166174] x23: ffff6ad64770c060 x22: ffff6ad68e60c780 x21:
> ffff6ad679c36428
> [   58.166183] x20: 0000000000000009 x19: ffff6ad679c36428 x18:
> 0000000000000000
> [   58.166192] x17: 0000000000000000 x16: ffffac027ba13408 x15:
> 0000ffff000304b0
> [   58.166200] x14: 0000000000000000 x13: 0000000000000000 x12:
> 0000000000000000
> [   58.166208] x11: 0000000000000000 x10: 0000000000000000 x9 :
> 0000000000000000
> [   58.166216] x8 : ffff800083f9bd48 x7 : ffffac02677a6e28 x6 :
> ffffac02677a6e28
> [   58.166226] x5 : 0000000000000000 x4 : 0000000000000001 x3 :
> 0000000000000000
> [   58.166233] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 :
> 0000000000000008
> [   58.166242] Call trace:
> [   58.166246]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
> [   58.166254]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
> [   58.166260]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
> [   58.166267]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
> [   58.166273]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
> [   58.166279]  v4l_streamoff+0x24/0x30 [videodev]
> [   58.166289]  __video_do_ioctl+0x40c/0x4a0 [videodev]
> [   58.166298]  video_usercopy+0x2bc/0x688 [videodev]
> [   58.166307]  video_ioctl2+0x18/0x38 [videodev]
> [   58.166315]  v4l2_ioctl+0x40/0x60 [videodev]
> [   58.166323]  __arm64_sys_ioctl+0xb4/0xf4
> [   58.166335]  invoke_syscall+0x48/0x104
> [   58.166346]  el0_svc_common.constprop.0+0x40/0xe0
> [   58.166355]  do_el0_svc+0x1c/0x28
> [   58.166363]  el0_svc+0x30/0xcc
> [   58.166373]  el0t_64_sync_handler+0x10c/0x138
> [   58.166381]  el0t_64_sync+0x198/0x19c
> [   58.166386] ---[ end trace 0000000000000000 ]---
> [   58.166390] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 0 in active state
> [   58.166395] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 1 in active state
> [   58.166398] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 2 in active state
> [   58.166401] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 3 in active state
> [   58.166404] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 5 in active state
> [   58.166407] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 6 in active state
> [   58.166410] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 7 in active state
> [   58.166413] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 8 in active state
> [   58.169738] qcom-iris aa00000.video-codec: invalid plane
> [   61.517138] ------------[ cut here ]------------
> [   61.517147] WARNING: CPU: 1 PID: 1209 at
> drivers/media/common/videobuf2/videobuf2-core.c:2222
> __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   61.517157] Modules linked in: rfcomm michael_mic reset_gpio
> snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai
> q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211
> ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common
> btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc
> regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh
> snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss
> snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro
> snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro
> soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode
> snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2 videobuf2_common
> v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci videodev snd_compress
> mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm qcom_pd_mapper
> rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd pwrseq_core
> snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
> [   61.517210]  ip_tables x_tables autofs4 ipv6 fuse socinfo
> qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng
> rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100
> pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp hid_multitouch
> i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats phy_qcom_snps_eusb2
> sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam qcom_spmi_temp_alarm
> industrialio sha3_ce phy_qcom_qmp_combo aux_bridge phy_qcom_eusb2_repeater
> qcom_pon reboot_mode sm3_ce sm3 ucsi_glink pmic_glink_altmode typec_ucsi
> qcom_battmgr aux_hpd_bridge pmic_glink pdr_interface qcom_pdr_msg typec msm
> drm_client_lib drm_exec llcc_qcom gpu_sched i2c_hid_of i2c_hid qrtr
> qcom_q6v5_pas qcom_pil_info qcom_common qcom_glink_smem qcom_glink
> qcom_q6v5 qcom_sysmon mdt_loader rpmsg_core qmi_helpers input_leds
> panel_edp drm_display_helper drm_dp_aux_bus drm_kms_helper drm i2c_core mhi
> libarc4 nvme nvme_core usb_storage r8152 mii libphy led_class dm_crypt dm_mod
> [   61.517282] CPU: 1 UID: 1001 PID: 1209 Comm: GstPlay Tainted: G
>  W           6.15.0-rc1 #69 PREEMPT
> [   61.517286] Tainted: [W]=WARN
> [   61.517288] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3, BIOS
> 2.5.0 12/16/2024
> [   61.517289] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--)
> [   61.517291] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   61.517293] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
> [   61.517295] sp : ffff800083f9bb00
> [   61.517296] x29: ffff800083f9bb00 x28: ffff6ad64770c020 x27:
> 0000000000000000
> [   61.517299] x26: 0000000040045613 x25: 0000000000000000 x24:
> ffffac02677a6bc8
> [   61.517301] x23: ffff6ad64770c060 x22: ffff6ad68e60c780 x21:
> ffff6ad679c36428
> [   61.517304] x20: 0000000000000009 x19: ffff6ad679c36428 x18:
> 0000000000000000
> [   61.517306] x17: 0000000000000000 x16: ffffac027ba13408 x15:
> 0000ffff000304b0
> [   61.517309] x14: 0000000000000000 x13: 0000000000000000 x12:
> 0000000000000000
> [   61.517311] x11: 0000000000000000 x10: 0000000000000000 x9 :
> 0000000000000000
> [   61.517314] x8 : ffff800083f9bd48 x7 : ffffac02677a6e28 x6 :
> ffffac02677a6e28
> [   61.517316] x5 : 0000000000000000 x4 : 0000000000000001 x3 :
> 0000000000000000
> [   61.517319] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 :
> 0000000000000008
> [   61.517321] Call trace:
> [   61.517323]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
> [   61.517325]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
> [   61.517327]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
> [   61.517330]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
> [   61.517332]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
> [   61.517334]  v4l_streamoff+0x24/0x30 [videodev]
> [   61.517338]  __video_do_ioctl+0x40c/0x4a0 [videodev]
> [   61.517341]  video_usercopy+0x2bc/0x688 [videodev]
> [   61.517343]  video_ioctl2+0x18/0x38 [videodev]
> [   61.517346]  v4l2_ioctl+0x40/0x60 [videodev]
> [   61.517348]  __arm64_sys_ioctl+0xb4/0xf4
> [   61.517355]  invoke_syscall+0x48/0x104
> [   61.517359]  el0_svc_common.constprop.0+0x40/0xe0
> [   61.517362]  do_el0_svc+0x1c/0x28
> [   61.517364]  el0_svc+0x30/0xcc
> [   61.517368]  el0t_64_sync_handler+0x10c/0x138
> [   61.517371]  el0t_64_sync+0x198/0x19c
> [   61.517372] ---[ end trace 0000000000000000 ]---
> [   61.517375] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 0 in active state
> [   61.517377] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 1 in active state
> [   61.517378] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 2 in active state
> [   61.517379] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 3 in active state
> [   61.517381] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 5 in active state
> [   61.517382] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 6 in active state
> [   61.517383] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 7 in active state
> [   61.517384] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 8 in active state
> [   84.239087] ------------[ cut here ]------------
> [   84.239099] WARNING: CPU: 0 PID: 1283 at
> drivers/media/common/videobuf2/videobuf2-core.c:2222
> __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   84.239110] Modules linked in: rfcomm michael_mic reset_gpio
> snd_soc_wsa884x q6prm_clocks q6apm_lpass_dais snd_q6dsp_common q6apm_dai
> q6prm algif_hash algif_skcipher af_alg qrtr_mhi ntfs3 ath12k mac80211
> ov02e10 v4l2_cci snd_q6apm snd_soc_x1e80100 hci_uart snd_soc_qcom_common
> btqca bluetooth snd_soc_qcom_sdw ps883x ecdh_generic pwrseq_qcom_wcn ecc
> regmap_i2c phy_nxp_ptn3222 rtc_pm8xxx snd_soc_wcd938x snd_soc_wcd_classh
> snd_soc_wcd938x_sdw regmap_sdw qcom_iris videobuf2_dma_contig qcom_camss
> snd_soc_wcd_mbhc v4l2_mem2mem videobuf2_dma_sg snd_soc_lpass_rx_macro
> snd_soc_lpass_tx_macro snd_soc_lpass_va_macro snd_soc_lpass_wsa_macro
> soundwire_qcom snd_soc_hdmi_codec mux_core v4l2_fwnode
> snd_soc_lpass_macro_common videobuf2_memops videobuf2_v4l2 videobuf2_common
> v4l2_async snd_soc_core videocc_sm8550 i2c_qcom_cci videodev snd_compress
> mc phy_qcom_qmp_usb rpmsg_ctrl apr fastrpc snd_pcm qcom_pd_mapper
> rpmsg_char pci_pwrctrl_pwrseq pci_pwrctrl_core qrtr_smd pwrseq_core
> snd_timer cfg80211 snd soundwire_bus rfkill i2c_dev
> [   84.239190]  ip_tables x_tables autofs4 ipv6 fuse socinfo
> qcom_cpucp_mbox icc_bwmon leds_gpio phy_qcom_qmp_pcie arm_smccc_trng
> rng_core gpucc_x1e80100 pcie_qcom crc8 soundcore tcsrcc_x1e80100
> pinctrl_sm8550_lpass_lpi pinctrl_lpass_lpi lpasscc_sc8280xp hid_multitouch
> i2c_qcom_geni dispcc_x1e80100 phy_qcom_edp qcom_stats phy_qcom_snps_eusb2
> sha512_ce sha512_arm64 nvmem_qcom_spmi_sdam qcom_spmi_temp_alarm
> industrialio sha3_ce phy_qcom_qmp_combo aux_bridge phy_qcom_eusb2_repeater
> qcom_pon reboot_mode sm3_ce sm3 ucsi_glink pmic_glink_altmode typec_ucsi
> qcom_battmgr aux_hpd_bridge pmic_glink pdr_interface qcom_pdr_msg typec msm
> drm_client_lib drm_exec llcc_qcom gpu_sched i2c_hid_of i2c_hid qrtr
> qcom_q6v5_pas qcom_pil_info qcom_common qcom_glink_smem qcom_glink
> qcom_q6v5 qcom_sysmon mdt_loader rpmsg_core qmi_helpers input_leds
> panel_edp drm_display_helper drm_dp_aux_bus drm_kms_helper drm i2c_core mhi
> libarc4 nvme nvme_core usb_storage r8152 mii libphy led_class dm_crypt dm_mod
> [   84.239292] CPU: 0 UID: 1001 PID: 1283 Comm: GstPlay Tainted: G
>  W           6.15.0-rc1 #69 PREEMPT
> [   84.239297] Tainted: [W]=WARN
> [   84.239299] Hardware name: Dell Inc. Inspiron 14 Plus 7441/0YWPR3, BIOS
> 2.5.0 12/16/2024
> [   84.239301] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--)
> [   84.239304] pc : __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common]
> [   84.239307] lr : __vb2_queue_cancel+0x2c/0x2d0 [videobuf2_common]
> [   84.239309] sp : ffff800082333b00
> [   84.239311] x29: ffff800082333b00 x28: ffff6ad65e9d5020 x27:
> 0000000000000000
> [   84.239315] x26: 0000000040045613 x25: 0000000000000000 x24:
> ffffac02677a6bc8
> [   84.239319] x23: ffff6ad65e9d5060 x22: ffff6ad646d64d80 x21:
> ffff6ad65f005028
> [   84.239324] x20: 0000000000000009 x19: ffff6ad65f005028 x18:
> 0000000000000000
> [   84.239328] x17: 0000000000000000 x16: ffffac027ba13408 x15:
> 0000ffff20030410
> [   84.239332] x14: 0000000000000000 x13: 0000000000000000 x12:
> 0000000000000000
> [   84.239335] x11: 0000000000000000 x10: 0000000000000000 x9 :
> 0000000000000000
> [   84.239339] x8 : ffff800082333d48 x7 : ffffac02677a6e28 x6 :
> ffffac02677a6e28
> [   84.239343] x5 : 0000000000000000 x4 : 0000000000000001 x3 :
> 0000000000000000
> [   84.239347] x2 : ffffac0267986fb0 x1 : 0000000000000000 x0 :
> 0000000000000016
> [   84.239351] Call trace:
> [   84.239353]  __vb2_queue_cancel+0x238/0x2d0 [videobuf2_common] (P)
> [   84.239357]  vb2_core_streamoff+0x24/0xc8 [videobuf2_common]
> [   84.239360]  vb2_streamoff+0x18/0x64 [videobuf2_v4l2]
> [   84.239364]  v4l2_m2m_streamoff+0x78/0x144 [v4l2_mem2mem]
> [   84.239368]  v4l2_m2m_ioctl_streamoff+0x18/0x24 [v4l2_mem2mem]
> [   84.239370]  v4l_streamoff+0x24/0x30 [videodev]
> [   84.239376]  __video_do_ioctl+0x40c/0x4a0 [videodev]
> [   84.239380]  video_usercopy+0x2bc/0x688 [videodev]
> [   84.239384]  video_ioctl2+0x18/0x38 [videodev]
> [   84.239388]  v4l2_ioctl+0x40/0x60 [videodev]
> [   84.239392]  __arm64_sys_ioctl+0xb4/0xf4
> [   84.239400]  invoke_syscall+0x48/0x104
> [   84.239407]  el0_svc_common.constprop.0+0x40/0xe0
> [   84.239411]  do_el0_svc+0x1c/0x28
> [   84.239415]  el0_svc+0x30/0xcc
> [   84.239421]  el0t_64_sync_handler+0x10c/0x138
> [   84.239425]  el0t_64_sync+0x198/0x19c
> [   84.239428] ---[ end trace 0000000000000000 ]---
> [   84.239430] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 0 in active state
> [   84.239432] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 1 in active state
> [   84.239433] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 2 in active state
> [   84.239435] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 3 in active state
> [   84.239436] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 4 in active state
> [   84.239438] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 5 in active state
> [   84.239439] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 7 in active state
> [   84.239440] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 8 in active state
> [   84.239442] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 9 in active state
> [   84.239443] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 10 in active state
> [   84.239445] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 11 in active state
> [   84.239446] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 14 in active state
> [   84.239447] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 15 in active state
> [   84.239449] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 16 in active state
> [   84.239450] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 17 in active state
> [   84.239452] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 18 in active state
> [   84.239453] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 19 in active state
> [   84.239454] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 20 in active state
> [   84.239456] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 21 in active state
> [   84.239457] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 22 in active state
> [   84.239459] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 23 in active state
> [   84.239460] videobuf2_common: driver bug: stop_streaming operation is
> leaving buffer 24 in active state
> [   84.245873] qcom-iris aa00000.video-codec: invalid plane
> [  126.573593] qcom-iris aa00000.video-codec: session error received
> 0x1000009: unknown
> [  126.573638] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.573644] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.573649] qcom-iris aa00000.video-codec: session error received
> 0x1000009: unknown
> [  126.573654] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.573659] qcom-iris aa00000.video-codec: session error received
> 0x1000009: unknown
> [  126.573664] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.573668] qcom-iris aa00000.video-codec: session error received
> 0x1000009: unknown
> [  126.573670] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582134] qcom-iris aa00000.video-codec: session error received
> 0x1000006: unknown
> [  126.582142] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582147] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582152] qcom-iris aa00000.video-codec: session error received
> 0x1000006: unknown
> [  126.582156] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582161] qcom-iris aa00000.video-codec: session error received
> 0x1000006: unknown
> [  126.582166] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state
> [  126.582170] qcom-iris aa00000.video-codec: session error received
> 0x1000006: unknown
> [  126.582177] qcom-iris aa00000.video-codec: session error received
> 0x4000004: invalid operation for current state

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

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-09 17:59     ` Vikash Garodia
@ 2025-04-10  7:20       ` neil.armstrong
  2025-04-10  7:23         ` Vikash Garodia
  0 siblings, 1 reply; 44+ messages in thread
From: neil.armstrong @ 2025-04-10  7:20 UTC (permalink / raw)
  To: Vikash Garodia, Bryan O'Donoghue, Dikshita Agarwal,
	Abhinav Kumar, Mauro Carvalho Chehab, Stefan Schmidt,
	Hans Verkuil, Bjorn Andersson, Konrad Dybcio, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Dmitry Baryshkov, linux-media, linux-arm-msm, linux-kernel,
	devicetree, stable, Dan Carpenter

On 09/04/2025 19:59, Vikash Garodia wrote:
> 
> 
> On 4/9/2025 9:56 PM, Neil Armstrong wrote:
>> On 09/04/2025 16:29, Bryan O'Donoghue wrote:
>>> On 08/04/2025 16:54, 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.
>>>>
>>>> These patches also address the comments and feedback received from the
>>>> RFC patches previously sent. I have made the necessary improvements
>>>> based on the community's suggestions.
>>>>
>>>> Changes sinces RFC:
>>>> - Added additional fixes to address issues identified during further
>>>> testing.
>>>> - Moved typo fix to a seperate patch [Neil]
>>>> - Reordered the patches for better logical flow and clarity [Neil,
>>>> Dmitry]
>>>> - Added fixes tag wherever applicable [Neil, Dmitry]
>>>> - Removed the default case in the switch statement for codecs [Bryan]
>>>> - Replaced if-else statements with switch-case [Bryan]
>>>> - Added comments for mbpf [Bryan]
>>>> - RFC:
>>>> https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
>>>>
>>>> These patches are tested on SM8250 and SM8550 with v4l2-ctl and
>>>> Gstreamer for HEVC and VP9 decoders, at the same time ensured that
>>>> the existing H264 decoder functionality remains uneffected.
>>>>
>>>> Note: 1 of the fluster compliance test is fixed with firmware [1]
>>>> [1]:
>>>> https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u
>>>>
>>
>> <snip>
>>
>>>> ---
>>>> Dikshita Agarwal (20):
>>>>         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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>>>>         media: iris: Add handling for no show frames
>>>>         media: iris: Improve last flag handling
>>>>         media: iris: Skip flush on first sequence change
>>>>         media: iris: Prevent HFI queue writes when core is in deinit state
>>>>         media: iris: Remove redundant buffer count check in stream off
>>>>         media: iris: Remove deprecated property setting to firmware
>>>>         media: iris: Fix missing function pointer initialization
>>>>         media: iris: Fix NULL pointer dereference
>>>>         media: iris: Fix typo in depth variable
>>>>         media: iris: Add a comment to explain usage of MBPS
>>>>         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: Add codec specific check for VP9 decoder drain handling
>>>>
>>>>    drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>>>>    drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>>>>    drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>>>>    .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>>>>    .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>>>>    .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>>>>    .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>>>>    .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>>>>    .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>>>>    drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>>>>    drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>>>>    .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>>>>    .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>>>>    .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>>>>    drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>>>>    drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>>>>    drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>>>>    drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>>>>    drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
>>>>    drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>>>>    20 files changed, 948 insertions(+), 153 deletions(-)
>>>> ---
>>>> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
>>>> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
>>>>
>>>> Best regards,
>>>
>>> Assuming we merge Neils sm8650 stuff first, which I think we should merge
>>> first, you'll have a subsequent build error to fix [1]
>>
>> I agree, it would be simpler, I prepared a fix to apply on top of this patchset.
> Lets sort out the platform data handling. More so, when i see that the patch you
> are adding more of 8650 specific data into 8550 file.

Not really, I only add iris_set_sm8650_preset_registers()

>>
>>>
>>> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris?ref_type=heads
>>>
>>> Testing your series in isolation. I can confirm vp9 decodes also getting some
>>> strange prinouts which we need to follow up to see if they exist with the
>>> baseline driver [2].
>>>
>>> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris-20250408-iris-dec-hevc-vp9-v1-0-acd258778bd6@quicinc.com?ref_type=heads
>>>
>>
>> <snip>
>>
>>> [  126.582170] qcom-iris aa00000.video-codec: session error received
>>> 0x1000006: unknown
>>> [  126.582177] qcom-iris aa00000.video-codec: session error received
>>> 0x4000004: invalid operation for current state
>>
>> With the following on top of the last SM8650 patchet + this patchset, I have the
>> same HEVC errors on SM8650, but VP9 works fine:
>> [  115.185745] qcom-iris aa00000.video-codec: session error received 0x4000004:
>> invalid operation for current state
>> [  115.221058] qcom-iris aa00000.video-codec: session error received 0x1000006:
>> unknown
>>
>> ==========================================><==============================================
>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> index 65f3accc2fb2..7d5116528fca 100644
>> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>> @@ -213,6 +213,22 @@ static void iris_set_sm8550_preset_registers(struct
>> iris_core *core)
>>       writel(0x0, core->reg_base + 0xB0088);
>>   }
>>
>> +static void iris_set_sm8650_preset_registers(struct iris_core *core)
>> +{
>> +    writel(0x0, core->reg_base + 0xB0088);
>> +    writel(0x33332222, core->reg_base + 0x13030);
>> +    writel(0x44444444, core->reg_base + 0x13034);
>> +    writel(0x1022, core->reg_base + 0x13038);
>> +    writel(0x0, core->reg_base + 0x13040);
>> +    writel(0xFFFF, core->reg_base + 0x13048);
>> +    writel(0x33332222, core->reg_base + 0x13430);
>> +    writel(0x44444444, core->reg_base + 0x13434);
>> +    writel(0x1022, core->reg_base + 0x13438);
>> +    writel(0x0, core->reg_base + 0x13440);
>> +    writel(0xFFFF, core->reg_base + 0x13448);
>> +    writel(0x99, core->reg_base + 0xA013C);
>> +}
> This is strange, h264 decoder does not need any of those while VP9 needed it to
> work. I could see the same set of registers in downstream code, but cannot
> recollect now on the need to add those.

Yes this is why I added it only to enable support for HEVC and VP9, before we were
using the iris_set_sm8550_preset_registers().

> 
> Regards,
> Vikash
>> +
>>   static const struct icc_info sm8550_icc_table[] = {
>>       { "cpu-cfg",    1000, 1000     },
>>       { "video-mem",  1000, 15000000 },
>> @@ -390,6 +406,7 @@ struct iris_platform_data sm8550_data = {
>>
>>   /*
>>    * Shares most of SM8550 data except:
>> + * - set_preset_registers to iris_set_sm8650_preset_registers
>>    * - vpu_ops to iris_vpu33_ops
>>    * - clk_rst_tbl to sm8650_clk_reset_table
>>    * - controller_rst_tbl to sm8650_controller_reset_table
>> @@ -400,7 +417,7 @@ struct iris_platform_data sm8650_data = {
>>       .init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
>>       .init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
>>       .vpu_ops = &iris_vpu33_ops,
>> -    .set_preset_registers = iris_set_sm8550_preset_registers,
>> +    .set_preset_registers = iris_set_sm8650_preset_registers,
>>       .icc_tbl = sm8550_icc_table,
>>       .icc_tbl_size = ARRAY_SIZE(sm8550_icc_table),
>>       .clk_rst_tbl = sm8650_clk_reset_table,
>> @@ -428,20 +445,34 @@ struct iris_platform_data sm8650_data = {
>>       .ubwc_config = &ubwc_config_sm8550,
>>       .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),
>> +    .max_core_mbpf = NUM_MBS_8K * 2,
>> +    .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,
>> ==========================================><==============================================
>>
>> Thanks,
>> Neil


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

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-10  7:20       ` neil.armstrong
@ 2025-04-10  7:23         ` Vikash Garodia
  0 siblings, 0 replies; 44+ messages in thread
From: Vikash Garodia @ 2025-04-10  7:23 UTC (permalink / raw)
  To: neil.armstrong, Bryan O'Donoghue, Dikshita Agarwal,
	Abhinav Kumar, Mauro Carvalho Chehab, Stefan Schmidt,
	Hans Verkuil, Bjorn Andersson, Konrad Dybcio, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Dmitry Baryshkov, linux-media, linux-arm-msm, linux-kernel,
	devicetree, stable, Dan Carpenter


On 4/10/2025 12:50 PM, neil.armstrong@linaro.org wrote:
> On 09/04/2025 19:59, Vikash Garodia wrote:
>>
>>
>> On 4/9/2025 9:56 PM, Neil Armstrong wrote:
>>> On 09/04/2025 16:29, Bryan O'Donoghue wrote:
>>>> On 08/04/2025 16:54, 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.
>>>>>
>>>>> These patches also address the comments and feedback received from the
>>>>> RFC patches previously sent. I have made the necessary improvements
>>>>> based on the community's suggestions.
>>>>>
>>>>> Changes sinces RFC:
>>>>> - Added additional fixes to address issues identified during further
>>>>> testing.
>>>>> - Moved typo fix to a seperate patch [Neil]
>>>>> - Reordered the patches for better logical flow and clarity [Neil,
>>>>> Dmitry]
>>>>> - Added fixes tag wherever applicable [Neil, Dmitry]
>>>>> - Removed the default case in the switch statement for codecs [Bryan]
>>>>> - Replaced if-else statements with switch-case [Bryan]
>>>>> - Added comments for mbpf [Bryan]
>>>>> - RFC:
>>>>> https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
>>>>>
>>>>> These patches are tested on SM8250 and SM8550 with v4l2-ctl and
>>>>> Gstreamer for HEVC and VP9 decoders, at the same time ensured that
>>>>> the existing H264 decoder functionality remains uneffected.
>>>>>
>>>>> Note: 1 of the fluster compliance test is fixed with firmware [1]
>>>>> [1]:
>>>>> https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u
>>>>>
>>>
>>> <snip>
>>>
>>>>> ---
>>>>> Dikshita Agarwal (20):
>>>>>         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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>>>>>         media: iris: Add handling for no show frames
>>>>>         media: iris: Improve last flag handling
>>>>>         media: iris: Skip flush on first sequence change
>>>>>         media: iris: Prevent HFI queue writes when core is in deinit state
>>>>>         media: iris: Remove redundant buffer count check in stream off
>>>>>         media: iris: Remove deprecated property setting to firmware
>>>>>         media: iris: Fix missing function pointer initialization
>>>>>         media: iris: Fix NULL pointer dereference
>>>>>         media: iris: Fix typo in depth variable
>>>>>         media: iris: Add a comment to explain usage of MBPS
>>>>>         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: Add codec specific check for VP9 decoder drain handling
>>>>>
>>>>>    drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>>>>>    drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>>>>>    drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>>>>>    .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>>>>>    .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>>>>>    .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>>>>>    .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>>>>>    .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>>>>>    .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>>>>>    drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>>>>>    drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>>>>>    .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>>>>>    .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>>>>>    .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>>>>>    drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>>>>>    drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>>>>>    drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>>>>>    drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>>>>>    drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397
>>>>> ++++++++++++++++++++-
>>>>>    drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>>>>>    20 files changed, 948 insertions(+), 153 deletions(-)
>>>>> ---
>>>>> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
>>>>> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
>>>>>
>>>>> Best regards,
>>>>
>>>> Assuming we merge Neils sm8650 stuff first, which I think we should merge
>>>> first, you'll have a subsequent build error to fix [1]
>>>
>>> I agree, it would be simpler, I prepared a fix to apply on top of this patchset.
>> Lets sort out the platform data handling. More so, when i see that the patch you
>> are adding more of 8650 specific data into 8550 file.
> 
> Not really, I only add iris_set_sm8650_preset_registers()
You might have added iris_set_sm8650_preset_registers in this patch, but the
list have already grown enough which demand for separate SOC specific platform
data file. Better done now than keeping it for later.

Thanks,
Vikash
> 
>>>
>>>>
>>>> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris?ref_type=heads
>>>>
>>>> Testing your series in isolation. I can confirm vp9 decodes also getting some
>>>> strange prinouts which we need to follow up to see if they exist with the
>>>> baseline driver [2].
>>>>
>>>> https://git.codelinaro.org/bryan.odonoghue/kernel/-/tree/linaro/arm-laptop/wip/x1e80100-6.15-rc1-dell-inspiron14-camss-ov02c10-ov02e10-audio-iris-20250408-iris-dec-hevc-vp9-v1-0-acd258778bd6@quicinc.com?ref_type=heads
>>>>
>>>
>>> <snip>
>>>
>>>> [  126.582170] qcom-iris aa00000.video-codec: session error received
>>>> 0x1000006: unknown
>>>> [  126.582177] qcom-iris aa00000.video-codec: session error received
>>>> 0x4000004: invalid operation for current state
>>>
>>> With the following on top of the last SM8650 patchet + this patchset, I have the
>>> same HEVC errors on SM8650, but VP9 works fine:
>>> [  115.185745] qcom-iris aa00000.video-codec: session error received 0x4000004:
>>> invalid operation for current state
>>> [  115.221058] qcom-iris aa00000.video-codec: session error received 0x1000006:
>>> unknown
>>>
>>> ==========================================><==============================================
>>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>>> b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>>> index 65f3accc2fb2..7d5116528fca 100644
>>> --- a/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>>> +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8550.c
>>> @@ -213,6 +213,22 @@ static void iris_set_sm8550_preset_registers(struct
>>> iris_core *core)
>>>       writel(0x0, core->reg_base + 0xB0088);
>>>   }
>>>
>>> +static void iris_set_sm8650_preset_registers(struct iris_core *core)
>>> +{
>>> +    writel(0x0, core->reg_base + 0xB0088);
>>> +    writel(0x33332222, core->reg_base + 0x13030);
>>> +    writel(0x44444444, core->reg_base + 0x13034);
>>> +    writel(0x1022, core->reg_base + 0x13038);
>>> +    writel(0x0, core->reg_base + 0x13040);
>>> +    writel(0xFFFF, core->reg_base + 0x13048);
>>> +    writel(0x33332222, core->reg_base + 0x13430);
>>> +    writel(0x44444444, core->reg_base + 0x13434);
>>> +    writel(0x1022, core->reg_base + 0x13438);
>>> +    writel(0x0, core->reg_base + 0x13440);
>>> +    writel(0xFFFF, core->reg_base + 0x13448);
>>> +    writel(0x99, core->reg_base + 0xA013C);
>>> +}
>> This is strange, h264 decoder does not need any of those while VP9 needed it to
>> work. I could see the same set of registers in downstream code, but cannot
>> recollect now on the need to add those.
> 
> Yes this is why I added it only to enable support for HEVC and VP9, before we were
> using the iris_set_sm8550_preset_registers().
> 
>>
>> Regards,
>> Vikash
>>> +
>>>   static const struct icc_info sm8550_icc_table[] = {
>>>       { "cpu-cfg",    1000, 1000     },
>>>       { "video-mem",  1000, 15000000 },
>>> @@ -390,6 +406,7 @@ struct iris_platform_data sm8550_data = {
>>>
>>>   /*
>>>    * Shares most of SM8550 data except:
>>> + * - set_preset_registers to iris_set_sm8650_preset_registers
>>>    * - vpu_ops to iris_vpu33_ops
>>>    * - clk_rst_tbl to sm8650_clk_reset_table
>>>    * - controller_rst_tbl to sm8650_controller_reset_table
>>> @@ -400,7 +417,7 @@ struct iris_platform_data sm8650_data = {
>>>       .init_hfi_command_ops = iris_hfi_gen2_command_ops_init,
>>>       .init_hfi_response_ops = iris_hfi_gen2_response_ops_init,
>>>       .vpu_ops = &iris_vpu33_ops,
>>> -    .set_preset_registers = iris_set_sm8550_preset_registers,
>>> +    .set_preset_registers = iris_set_sm8650_preset_registers,
>>>       .icc_tbl = sm8550_icc_table,
>>>       .icc_tbl_size = ARRAY_SIZE(sm8550_icc_table),
>>>       .clk_rst_tbl = sm8650_clk_reset_table,
>>> @@ -428,20 +445,34 @@ struct iris_platform_data sm8650_data = {
>>>       .ubwc_config = &ubwc_config_sm8550,
>>>       .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),
>>> +    .max_core_mbpf = NUM_MBS_8K * 2,
>>> +    .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,
>>> ==========================================><==============================================
>>>
>>> Thanks,
>>> Neil
> 

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

* Re: [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued
  2025-04-08 15:54 ` [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
@ 2025-04-11 12:10   ` Bryan O'Donoghue
  2025-04-14 10:26     ` Bryan O'Donoghue
  0 siblings, 1 reply; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-11 12:10 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable

On 08/04/2025 16:54, 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.
> 
> Cc: stable@vger.kernel.org
> Fixes: 73702f45db81 ("media: iris: allocate, initialize and queue internal buffers")
> 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 e5c5a564fcb8..75fe63cc2327 100644
> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
> @@ -396,6 +396,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;
> 

iris_destroy_internal_buffers() is called from

- iris_vdec_streamon_output
- iris_venc_streamon_output
- iris_close

So if we skip releasing the buffer here, when will the memory be released ?

Particularly the kfree() in iris_destroy_internal_buffer() ?

iris_close -> iris_destroy_internal_buffers ! -> iris_destroy_buffer

Is a leak right ?

---
bod

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

* Re: [PATCH 02/20] media: iris: Update CAPTURE format info based on OUTPUT format
  2025-04-08 15:54 ` [PATCH 02/20] media: iris: Update CAPTURE format info based on OUTPUT format Dikshita Agarwal
@ 2025-04-11 12:46   ` Bryan O'Donoghue
  0 siblings, 0 replies; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-11 12:46 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable

On 08/04/2025 16:54, 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.
> 
> Cc: stable@vger.kernel.org
> Fixes: b530b95de22c ("media: iris: implement s_fmt, g_fmt and try_fmt ioctls")
> 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 4143acedfc57..c5d85936b3ae 100644
> --- a/drivers/media/platform/qcom/iris/iris_vdec.c
> +++ b/drivers/media/platform/qcom/iris/iris_vdec.c
> @@ -171,6 +171,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;
>


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

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

* Re: [PATCH 04/20] media: iris: Avoid updating frame size to firmware during reconfig
  2025-04-08 15:54 ` [PATCH 04/20] media: iris: Avoid updating frame size to firmware during reconfig Dikshita Agarwal
@ 2025-04-11 12:47   ` Bryan O'Donoghue
  2025-04-15  4:33     ` Dikshita Agarwal
  0 siblings, 1 reply; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-11 12:47 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree

On 08/04/2025 16:54, Dikshita Agarwal wrote:
> 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 resolution property during reconfig.
The log implies to me a missing Fixes: tag

---
bod

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

* Re: [PATCH 05/20] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
  2025-04-08 15:54 ` [PATCH 05/20] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length Dikshita Agarwal
@ 2025-04-11 12:51   ` Bryan O'Donoghue
  2025-04-15  4:31     ` Dikshita Agarwal
  0 siblings, 1 reply; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-11 12:51 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree

On 08/04/2025 16:54, Dikshita Agarwal wrote:
> 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.

Any buffer with a zero length must be flagged as LAST, else that buffer 
should be discarded.

Is this another bugfix ? Feels like one, processing redundant packets.

> 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 b75a01641d5d..91c5f04dd926 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;
> +	}
> +

Is this hypothetical or does it happen in real life ?

>   	return 0;
>   }
>   
> 

---
bod

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

* Re: [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued
  2025-04-11 12:10   ` Bryan O'Donoghue
@ 2025-04-14 10:26     ` Bryan O'Donoghue
  2025-04-15  4:58       ` Dikshita Agarwal
  0 siblings, 1 reply; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-14 10:26 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable

On 11/04/2025 13:10, Bryan O'Donoghue wrote:
> On 08/04/2025 16:54, 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.
>>
>> Cc: stable@vger.kernel.org
>> Fixes: 73702f45db81 ("media: iris: allocate, initialize and queue 
>> internal buffers")
>> 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 e5c5a564fcb8..75fe63cc2327 100644
>> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
>> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
>> @@ -396,6 +396,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;
>>
> 
> iris_destroy_internal_buffers() is called from
> 
> - iris_vdec_streamon_output
> - iris_venc_streamon_output
> - iris_close
> 
> So if we skip releasing the buffer here, when will the memory be released ?
> 
> Particularly the kfree() in iris_destroy_internal_buffer() ?
> 
> iris_close -> iris_destroy_internal_buffers ! -> iris_destroy_buffer
> 
> Is a leak right ?
> 
> ---
> bod

Thinking about this some more, I believe we should have some sort of 
reaping routine.

- The firmware fails to release a buffer, it is up to APSS/Linux
   to run some kind of reaping routine.
   We can debate when is the right time to reset.
   Perhaps instead of ignoring the buffer as you have done here
   we schedule work with a timeout and if the timeout expires then
   this triggers a reset/reap routine.

- Since Linux allocates a buffer on the APSS side, you can't have a
   situation where firmware can indefinitely hold memory.

- APSS is in effect the bus master here since it can assert/deassert
   RESET lines to the firmware, can control regulators and clocks.

So we should have some kind of watchdog logic here.

As alluded to above, what exactly do you do if firmware never returns a 
buffer ? Accept memory leak on the APSS side ?

Rather we should agree when it is appropriate to run a watchdog routine to

1. Timeout firmware not returning a buffer
2. Put the iris/venus hardware into reset
3. Reap leaked memory
4. Restart

I see we have IRQ based watchdog logic but, I don't see that it reaps 
memory.

In any case we should have the ability to reset iris and reclaim/reap 
memory in this type of situation.

Perhaps I'm off on a rant here but, this seems like a problem we should 
address with a more comprehensive solution.

---
bod

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

* Re: [PATCH 05/20] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
  2025-04-11 12:51   ` Bryan O'Donoghue
@ 2025-04-15  4:31     ` Dikshita Agarwal
  2025-04-16 13:42       ` Nicolas Dufresne
  0 siblings, 1 reply; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-15  4:31 UTC (permalink / raw)
  To: Bryan O'Donoghue, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree



On 4/11/2025 6:21 PM, Bryan O'Donoghue wrote:
> On 08/04/2025 16:54, Dikshita Agarwal wrote:
>> 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.
> 
> Any buffer with a zero length must be flagged as LAST, else that buffer
> should be discarded.
> 
> Is this another bugfix ? Feels like one, processing redundant packets.
> 
>> 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 b75a01641d5d..91c5f04dd926 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;
>> +    }
>> +
> 
> Is this hypothetical or does it happen in real life ?
Yes, it does. As part of flush, firmware returns the buffers with 0 filled
length but those shouldn't be marked as ERROR, same applies for buffer with
LAST flag.
This conditional check make sure the ERROR flag is associated with only
frames which are supposed to be dropped/discarded.

Thanks,
Dikshita
> 
>>       return 0;
>>   }
>>  
> 
> ---
> bod

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

* Re: [PATCH 04/20] media: iris: Avoid updating frame size to firmware during reconfig
  2025-04-11 12:47   ` Bryan O'Donoghue
@ 2025-04-15  4:33     ` Dikshita Agarwal
  0 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-15  4:33 UTC (permalink / raw)
  To: Bryan O'Donoghue, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree



On 4/11/2025 6:17 PM, Bryan O'Donoghue wrote:
> On 08/04/2025 16:54, Dikshita Agarwal wrote:
>> 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 resolution property during reconfig.
> The log implies to me a missing Fixes: tag
Sure.

Thanks,
Dikshita
> 
> ---
> bod

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

* Re: [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued
  2025-04-14 10:26     ` Bryan O'Donoghue
@ 2025-04-15  4:58       ` Dikshita Agarwal
  2025-04-16 12:10         ` Bryan O'Donoghue
  0 siblings, 1 reply; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-15  4:58 UTC (permalink / raw)
  To: Bryan O'Donoghue, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable



On 4/14/2025 3:56 PM, Bryan O'Donoghue wrote:
> On 11/04/2025 13:10, Bryan O'Donoghue wrote:
>> On 08/04/2025 16:54, 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.
>>>
>>> Cc: stable@vger.kernel.org
>>> Fixes: 73702f45db81 ("media: iris: allocate, initialize and queue
>>> internal buffers")
>>> 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 e5c5a564fcb8..75fe63cc2327 100644
>>> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
>>> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
>>> @@ -396,6 +396,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;
>>>
>>
>> iris_destroy_internal_buffers() is called from
>>
>> - iris_vdec_streamon_output
>> - iris_venc_streamon_output
>> - iris_close
>>
>> So if we skip releasing the buffer here, when will the memory be released ?
>>
>> Particularly the kfree() in iris_destroy_internal_buffer() ?
>>
>> iris_close -> iris_destroy_internal_buffers ! -> iris_destroy_buffer
>>
>> Is a leak right ?
Good catch, Thanks!
>>
>> ---
>> bod
> 
> Thinking about this some more, I believe we should have some sort of
> reaping routine.
> 
> - The firmware fails to release a buffer, it is up to APSS/Linux
>   to run some kind of reaping routine.
>   We can debate when is the right time to reset.
>   Perhaps instead of ignoring the buffer as you have done here
>   we schedule work with a timeout and if the timeout expires then
>   this triggers a reset/reap routine.
> 
> - Since Linux allocates a buffer on the APSS side, you can't have a
>   situation where firmware can indefinitely hold memory.
> 
> - APSS is in effect the bus master here since it can assert/deassert
>   RESET lines to the firmware, can control regulators and clocks.
> 
> So we should have some kind of watchdog logic here.
> 
> As alluded to above, what exactly do you do if firmware never returns a
> buffer ? Accept memory leak on the APSS side ?
> 
> Rather we should agree when it is appropriate to run a watchdog routine to
> 
> 1. Timeout firmware not returning a buffer
> 2. Put the iris/venus hardware into reset
> 3. Reap leaked memory
> 4. Restart
> 
> I see we have IRQ based watchdog logic but, I don't see that it reaps memory.
> 
> In any case we should have the ability to reset iris and reclaim/reap
> memory in this type of situation.
> 
> Perhaps I'm off on a rant here but, this seems like a problem we should
> address with a more comprehensive solution.
> 
That's right, but we don't need to over complicate this.

We need to skip destroying these buffers for a running session so that the
DPB buffers which are still being referenced by firmware are not lost.
But these should be freed during session close which is missing in current
code.
Although firmware makes sure that during session close, all buffers are
returned to driver and driver will release them but still we shouldn't rely
for this on firmware and should handle in driver.
Will fix this in next patch set.

Thanks,
Dikshita
> ---
> bod

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

* Re: [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued
  2025-04-15  4:58       ` Dikshita Agarwal
@ 2025-04-16 12:10         ` Bryan O'Donoghue
  2025-04-16 16:40           ` Dikshita Agarwal
  0 siblings, 1 reply; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-16 12:10 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable

On 15/04/2025 05:58, Dikshita Agarwal wrote:
> Although firmware makes sure that during session close, all buffers are
> returned to driver and driver will release them but still we shouldn't rely
> for this on firmware and should handle in driver.
> Will fix this in next patch set.

Shouldn't we reset iris in this case ?

i.e. its a breaking of the software contract to have failed to have 
returned a buffer by - close.

Its not enough to free the memory on the APSS side as the remote end 
could still assume ownership of a buffer... right ?

---
bod

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

* Re: [PATCH 05/20] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
  2025-04-15  4:31     ` Dikshita Agarwal
@ 2025-04-16 13:42       ` Nicolas Dufresne
  0 siblings, 0 replies; 44+ messages in thread
From: Nicolas Dufresne @ 2025-04-16 13:42 UTC (permalink / raw)
  To: Dikshita Agarwal, Bryan O'Donoghue, Vikash Garodia,
	Abhinav Kumar, Mauro Carvalho Chehab, Stefan Schmidt,
	Hans Verkuil, Bjorn Andersson, Konrad Dybcio, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree

Le mardi 15 avril 2025 à 10:01 +0530, Dikshita Agarwal a écrit :
> 
> 
> On 4/11/2025 6:21 PM, Bryan O'Donoghue wrote:
> > On 08/04/2025 16:54, Dikshita Agarwal wrote:
> > > 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.
> > 
> > Any buffer with a zero length must be flagged as LAST, else that buffer
> > should be discarded.
> > 
> > Is this another bugfix ? Feels like one, processing redundant packets.
> > 
> > > 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 b75a01641d5d..91c5f04dd926 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;
> > > +    }
> > > +
> > 
> > Is this hypothetical or does it happen in real life ?
> Yes, it does. As part of flush, firmware returns the buffers with 0 filled
> length but those shouldn't be marked as ERROR, same applies for buffer with
> LAST flag.
> This conditional check make sure the ERROR flag is associated with only
> frames which are supposed to be dropped/discarded.

informative: Due to legacy behaviour of MFC and Coda, you should never
push a zero-length buffer without one of LAST or ERROR flag. It may be
interpreted as last by some userspace otherwise.

Can you eventually write some doc on the double state machine you have
? Having two state in a state machine makes reading the code quite
harder for reviewers.

Nicolas

> 
> Thanks,
> Dikshita
> > 
> > >       return 0;
> > >   }
> > >  
> > 
> > ---
> > bod

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

* Re: [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued
  2025-04-16 12:10         ` Bryan O'Donoghue
@ 2025-04-16 16:40           ` Dikshita Agarwal
  2025-04-17  8:35             ` Bryan O'Donoghue
  0 siblings, 1 reply; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-16 16:40 UTC (permalink / raw)
  To: Bryan O'Donoghue, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable



On 4/16/2025 5:40 PM, Bryan O'Donoghue wrote:
> On 15/04/2025 05:58, Dikshita Agarwal wrote:
>> Although firmware makes sure that during session close, all buffers are
>> returned to driver and driver will release them but still we shouldn't rely
>> for this on firmware and should handle in driver.
>> Will fix this in next patch set.
> 
> Shouldn't we reset iris in this case ?
> 
Not required.
> i.e. its a breaking of the software contract to have failed to have
> returned a buffer by - close.
> 
> Its not enough to free the memory on the APSS side as the remote end could
> still assume ownership of a buffer... right ?
> 
Before close, Stop will be called to firmware and firmware will return all
the buffers to driver, which will transfer the ownership to driver, so no
issue with freeing these buffers in close.

Thanks,
Dikshita
> ---
> bod

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

* Re: [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued
  2025-04-16 16:40           ` Dikshita Agarwal
@ 2025-04-17  8:35             ` Bryan O'Donoghue
  0 siblings, 0 replies; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-17  8:35 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree, stable

On 16/04/2025 17:40, Dikshita Agarwal wrote:
> 
> On 4/16/2025 5:40 PM, Bryan O'Donoghue wrote:
>> On 15/04/2025 05:58, Dikshita Agarwal wrote:
>>> Although firmware makes sure that during session close, all buffers are
>>> returned to driver and driver will release them but still we shouldn't rely
>>> for this on firmware and should handle in driver.
>>> Will fix this in next patch set.
>> Shouldn't we reset iris in this case ?
>>
> Not required.

OK sure.

Could you at least add an error message on close() if any buffer is not 
released ?

That way we can "trust but verify". What makes me suspicious is that we 
have one instance where a buffer hasn't been released which we expected 
to have been released - that may be reasons for that which we can't 
interrogate from APSS - fine but, then how can we be sure the software 
contract on close() is respected ?

So yes, I accept what you say that its not required but for peace of 
mind we should at the very least be noisy on close() about unreleased 
buffers and if we start to see kernel logs about unreleased bufs we 
should revisit resetting firmware.

---
bod

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

* Re: [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder
  2025-04-08 18:37 ` [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Nicolas Dufresne
@ 2025-04-21 11:05   ` Dikshita Agarwal
  0 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-21 11:05 UTC (permalink / raw)
  To: Nicolas Dufresne, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Bryan O'Donoghue, Dmitry Baryshkov, Neil Armstrong,
	linux-media, linux-arm-msm, linux-kernel, devicetree, stable,
	Dan Carpenter

Hi Nicolas,

On 4/9/2025 12:07 AM, Nicolas Dufresne wrote:
> Hi,
> 
> This is for Bryan and Vikash to review first, but here's some initial feedback on that report.
> 
> Le mardi 08 avril 2025 à 21:24 +0530, Dikshita Agarwal a écrit :
>> 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.
>>
>> These patches also address the comments and feedback received from the 
>> RFC patches previously sent. I have made the necessary improvements 
>> based on the community's suggestions.
>>
>> Changes sinces RFC:
>> - Added additional fixes to address issues identified during further 
>> testing.
>> - Moved typo fix to a seperate patch [Neil]
>> - Reordered the patches for better logical flow and clarity [Neil, 
>> Dmitry]
>> - Added fixes tag wherever applicable [Neil, Dmitry]
>> - Removed the default case in the switch statement for codecs [Bryan]
>> - Replaced if-else statements with switch-case [Bryan]
>> - Added comments for mbpf [Bryan]
>> - RFC: https://lore.kernel.org/linux-media/20250305104335.3629945-1-quic_dikshita@quicinc.com/
>>
>> These patches are tested on SM8250 and SM8550 with v4l2-ctl and 
>> Gstreamer for HEVC and VP9 decoders, at the same time ensured that 
>> the existing H264 decoder functionality remains uneffected.
>>
>> Note: 1 of the fluster compliance test is fixed with firmware [1]
>> [1]: https://lore.kernel.org/linux-firmware/1a511921-446d-cdc4-0203-084c88a5dc1e@quicinc.com/T/#u 
>>
>> The result of fluster test on SM8550:
>>  131/147 testcases passed while testing JCT-VC-HEVC_V1 with 
>>  GStreamer-H.265-V4L2-Gst1.0.
>>  The failing test case:
>>  - 10 testcases failed due to unsupported 10 bit format.
>>    - DBLK_A_MAIN10_VIXS_4
>>    - INITQP_B_Main10_Sony_1
>>    - TSUNEQBD_A_MAIN10_Technicolor_2
>>    - WP_A_MAIN10_Toshiba_3
>>    - WP_MAIN10_B_Toshiba_3
>>    - WPP_A_ericsson_MAIN10_2
>>    - WPP_B_ericsson_MAIN10_2
>>    - WPP_C_ericsson_MAIN10_2
>>    - WPP_E_ericsson_MAIN10_2
>>    - WPP_F_ericsson_MAIN10_2
>>  - 4 testcase failed due to unsupported resolution
>>    - PICSIZE_A_Bossen_1
>>    - PICSIZE_B_Bossen_1
>>    - WPP_D_ericsson_MAIN10_2
>>    - WPP_D_ericsson_MAIN_2 
>>  - 1 testcase failed as bitstream is invalid (this fails with reference 
>>    as well)
>>    - RAP_B_Bossen_2
> 
> I was surprised of this comment, so I ran it myself through the
> official JCT reference decoder.
> 
>    [JCT-VC-HEVC_V1] (JCT-VT-H.265) RAP_B_Bossen_2                  ... Success
> 
> I'm pretty sure this stream is valid. I personally care about these
> reports since otherwise we cannot differentiate HW limitation, FW bugs
> or V4L2 API limitation. The later is really something we want to know
> about, since we can fix it. We cannot fix HW, and its up to the vendor
> to fix their firmware.
> 
> This specific test is very nice test. It changes the coding
> width/height but keeps the conf window the same (416x240).
> 
> Here's the coded size changes I could see:
> 
> Frame  0: 448 x 256
> Frame 25: 416 x 240
> Frame 70: 448 x 256
> 
> Each time, the driver must sent SRC_CHANGE, and if all went well, the
> decoder should reallocate. Note that all this code in GStreamer is
> recent, so it also a possibility, but something we can fix. I haven't
> tried ffmpeg much, but same.
> 
I checked again, we are able to decode this clip.
But this fails with CRC mismatch, and If frames with 0 length and error
flag are dropped, CRC also matches and testcase is passing
>>  - 1 testcase failed due to CRC mismatch
>>    - RAP_A_docomo_6
>>      Analysis - First few frames in this discarded by firmware and are 
>>      sent to driver with 0 filled length. Driver send such buffers to
>>      client with timestamp 0 and payload set to 0 and 
>>      make buf state to VB2_BUF_STATE_ERROR. Such buffers should be 
>>      dropped by GST. But instead, the first frame displayed as green 
>>      frame and when a valid buffer is sent to client later with same 0 
>>      timestamp, its dropped, leading to CRC mismatch for first frame.
> 
> This looks like a firmware bug, even if GStreamer had drop them all,
> the CRC would still miss-match.
> 
I tried to drop the frames with 0 length and ERROR flag and I could confirm
that CRC does match and testcase pass.

> Important question is if this worked on Venus firmware ? If so, it
> sounds like it should be addressed.
> 
Venus firmware has different design than iris, venus fimware doesn't send
these zero length buffer to driver for the discarded frame while iris
firmware does send such frames to driver.
>>
>>  235/305 testcases passed while testing VP9-TEST-VECTORS with 
>>  GStreamer-VP9-V4L2-Gst1.0.
>>  The failing test case:
>>  - 64 testcases failed due to unsupported resolution
>>    - vp90-2-02-size-08x08.webm
>>    - vp90-2-02-size-08x10.webm
>>    - vp90-2-02-size-08x16.webm
>>    - vp90-2-02-size-08x18.webm
>>    - vp90-2-02-size-08x32.webm
>>    - vp90-2-02-size-08x34.webm
>>    - vp90-2-02-size-08x64.webm
>>    - vp90-2-02-size-08x66.webm
>>    - vp90-2-02-size-10x08.webm
>>    - vp90-2-02-size-10x10.webm
>>    - vp90-2-02-size-10x16.webm
>>    - vp90-2-02-size-10x18.webm
>>    - vp90-2-02-size-10x32.webm
>>    - vp90-2-02-size-10x34.webm
>>    - vp90-2-02-size-10x64.webm
>>    - vp90-2-02-size-10x66.webm
>>    - vp90-2-02-size-16x08.webm
>>    - vp90-2-02-size-16x10.webm
>>    - vp90-2-02-size-16x16.webm
>>    - vp90-2-02-size-16x18.webm
>>    - vp90-2-02-size-16x32.webm
>>    - vp90-2-02-size-16x34.webm
>>    - vp90-2-02-size-16x64.webm
>>    - vp90-2-02-size-16x66.webm
>>    - vp90-2-02-size-18x08.webm
>>    - vp90-2-02-size-18x10.webm
>>    - vp90-2-02-size-18x16.webm
>>    - vp90-2-02-size-18x18.webm
>>    - vp90-2-02-size-18x32.webm
>>    - vp90-2-02-size-18x34.webm
>>    - vp90-2-02-size-18x64.webm
>>    - vp90-2-02-size-18x66.webm
>>    - vp90-2-02-size-32x08.webm
>>    - vp90-2-02-size-32x10.webm
>>    - vp90-2-02-size-32x16.webm
>>    - vp90-2-02-size-32x18.webm
>>    - vp90-2-02-size-32x32.webm
>>    - vp90-2-02-size-32x34.webm
>>    - vp90-2-02-size-32x64.webm
>>    - vp90-2-02-size-32x66.webm
>>    - vp90-2-02-size-34x08.webm
>>    - vp90-2-02-size-34x10.webm
>>    - vp90-2-02-size-34x16.webm
>>    - vp90-2-02-size-34x18.webm
>>    - vp90-2-02-size-34x32.webm
>>    - vp90-2-02-size-34x34.webm
>>    - vp90-2-02-size-34x64.webm
>>    - vp90-2-02-size-34x66.webm
>>    - vp90-2-02-size-64x08.webm
>>    - vp90-2-02-size-64x10.webm
>>    - vp90-2-02-size-64x16.webm
>>    - vp90-2-02-size-64x18.webm
>>    - vp90-2-02-size-64x32.webm
>>    - vp90-2-02-size-64x34.webm
>>    - vp90-2-02-size-64x64.webm
>>    - vp90-2-02-size-64x66.webm
>>    - vp90-2-02-size-66x08.webm
>>    - vp90-2-02-size-66x10.webm
>>    - vp90-2-02-size-66x16.webm
>>    - vp90-2-02-size-66x18.webm
>>    - vp90-2-02-size-66x32.webm
>>    - vp90-2-02-size-66x34.webm
>>    - vp90-2-02-size-66x64.webm
>>    - vp90-2-02-size-66x66.webm
>>  - 2 testcases failed due to unsupported format
>>    - vp91-2-04-yuv422.webm
>>    - vp91-2-04-yuv444.webm
>>  - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>>    - vp90-2-22-svc_1280x720_3.ivf
> 
> Not completely true:
> 
> 	[VP9-TEST-VECTORS] (libvpx-VP9) vp90-2-22-svc_1280x720_3.ivf ... Success
> 
> But fails with the GStreamer libvpx integration. Would you mind filling
> an issue please ? There is clearly a GStreamer bug (not a reference
> one), please document it as-such in the next report.
> 
Sure, raised the bug for this
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4371

>>  - 2 testcase failed due to unsupported resolution after sequence change
>>    - vp90-2-21-resize_inter_320x180_5_1-2.webm
>>    - vp90-2-21-resize_inter_320x180_7_1-2.webm
> 
> Just be more precise, inter-frame resolution changes are not currently
> supported in V4L2 stateful decoders. The concept and internals are
> ready though. Basically, userpace would have to progressively re-
> allocate the frames as they get dequeued, before being re-queued. That
> is significant userspace modification, fine to not support it atm.
> 

Sorry for confusion.
What I meant was, there is a source change in the clip from 320,180 to
160,90 -> this is lower than what hardware supports, min supported wxh is 96x96

Which is why client is not able to setup the capture queue and testcase
fails. This is expected behavior for such clips.

>>  - 1 testcase failed due to unsupported stream
>>    - vp90-2-16-intra-only.webm
>>  Note: There is a timing issue with the clips having multiple resolution 
>>  change. Where firmware returned all the buffers with previous sequence 
>>  and has no buffer left to attach the LAST flag to. At the same time,
>>  client is not queueing any further buffers, so there is deadlock where 
>>  client is waiting for LAST flag, while firmware doesn't have any 
>>  capture buffer to attach LAST flag to.
>>  Ideally client should keep queueing the buffers on capture queue untill
>>  the LAST flag is received.
> 
> At least GStreamer do, so I slightly doubt your analyzes (happy to see
> a bug report with relevant demonstration showing that !). I'll read it
> as there is still bug with the resolution change draining process in
> this driver.
> 
Sure, raised the bug with all the details
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4370
>>
>> The result of fluster test on SM8250:
>>  132/147 testcases passed while testing JCT-VC-HEVC_V1 with
>>  GStreamer-H.265-V4L2-Gst1.0.
>>  The failing test case:
>>  - 10 testcases failed due to unsupported 10 bit format.
>>    - DBLK_A_MAIN10_VIXS_4
>>    - INITQP_B_Main10_Sony_1
>>    - TSUNEQBD_A_MAIN10_Technicolor_2
>>    - WP_A_MAIN10_Toshiba_3
>>    - WP_MAIN10_B_Toshiba_3
>>    - WPP_A_ericsson_MAIN10_2
>>    - WPP_B_ericsson_MAIN10_2
>>    - WPP_C_ericsson_MAIN10_2
>>    - WPP_E_ericsson_MAIN10_2
>>    - WPP_F_ericsson_MAIN10_2
>>  - 4 testcase failed due to unsupported resolution
>>    - PICSIZE_A_Bossen_1
>>    - PICSIZE_B_Bossen_1
>>    - WPP_D_ericsson_MAIN10_2
>>    - WPP_D_ericsson_MAIN_2
>>  - 1 testcase failed as bitstream is invalid (this fails with reference
>>    as well)
>>    - RAP_B_Bossen_2
>>
>>  232/305 testcases passed while testing VP9-TEST-VECTORS with
>>  GStreamer-VP9-V4L2-Gst1.0.
>>  The failing test case:
>>  - 64 testcases failed due to unsupported resolution
>>    - vp90-2-02-size-08x08.webm
>>    - vp90-2-02-size-08x10.webm
>>    - vp90-2-02-size-08x16.webm
>>    - vp90-2-02-size-08x18.webm
>>    - vp90-2-02-size-08x32.webm
>>    - vp90-2-02-size-08x34.webm
>>    - vp90-2-02-size-08x64.webm
>>    - vp90-2-02-size-08x66.webm
>>    - vp90-2-02-size-10x08.webm
>>    - vp90-2-02-size-10x10.webm
>>    - vp90-2-02-size-10x16.webm
>>    - vp90-2-02-size-10x18.webm
>>    - vp90-2-02-size-10x32.webm
>>    - vp90-2-02-size-10x34.webm
>>    - vp90-2-02-size-10x64.webm
>>    - vp90-2-02-size-10x66.webm
>>    - vp90-2-02-size-16x08.webm
>>    - vp90-2-02-size-16x10.webm
>>    - vp90-2-02-size-16x16.webm
>>    - vp90-2-02-size-16x18.webm
>>    - vp90-2-02-size-16x32.webm
>>    - vp90-2-02-size-16x34.webm
>>    - vp90-2-02-size-16x64.webm
>>    - vp90-2-02-size-16x66.webm
>>    - vp90-2-02-size-18x08.webm
>>    - vp90-2-02-size-18x10.webm
>>    - vp90-2-02-size-18x16.webm
>>    - vp90-2-02-size-18x18.webm
>>    - vp90-2-02-size-18x32.webm
>>    - vp90-2-02-size-18x34.webm
>>    - vp90-2-02-size-18x64.webm
>>    - vp90-2-02-size-18x66.webm
>>    - vp90-2-02-size-32x08.webm
>>    - vp90-2-02-size-32x10.webm
>>    - vp90-2-02-size-32x16.webm
>>    - vp90-2-02-size-32x18.webm
>>    - vp90-2-02-size-32x32.webm
>>    - vp90-2-02-size-32x34.webm
>>    - vp90-2-02-size-32x64.webm
>>    - vp90-2-02-size-32x66.webm
>>    - vp90-2-02-size-34x08.webm
>>    - vp90-2-02-size-34x10.webm
>>    - vp90-2-02-size-34x16.webm
>>    - vp90-2-02-size-34x18.webm
>>    - vp90-2-02-size-34x32.webm
>>    - vp90-2-02-size-34x34.webm
>>    - vp90-2-02-size-34x64.webm
>>    - vp90-2-02-size-34x66.webm
>>    - vp90-2-02-size-64x08.webm
>>    - vp90-2-02-size-64x10.webm
>>    - vp90-2-02-size-64x16.webm
>>    - vp90-2-02-size-64x18.webm
>>    - vp90-2-02-size-64x32.webm
>>    - vp90-2-02-size-64x34.webm
>>    - vp90-2-02-size-64x64.webm
>>    - vp90-2-02-size-64x66.webm
>>    - vp90-2-02-size-66x08.webm
>>    - vp90-2-02-size-66x10.webm
>>    - vp90-2-02-size-66x16.webm
>>    - vp90-2-02-size-66x18.webm
>>    - vp90-2-02-size-66x32.webm
>>    - vp90-2-02-size-66x34.webm
>>    - vp90-2-02-size-66x64.webm
>>    - vp90-2-02-size-66x66.webm
>>  - 2 testcases failed due to unsupported format
>>    - vp91-2-04-yuv422.webm
>>    - vp91-2-04-yuv444.webm
>>  - 1 testcase failed with CRC mismatch (fails with ref decoder as well)
>>    - vp90-2-22-svc_1280x720_3.ivf
>>  - 5 testcase failed due to unsupported resolution after sequence change
>>    - vp90-2-21-resize_inter_320x180_5_1-2.webm
>>    - vp90-2-21-resize_inter_320x180_7_1-2.webm
>>    - vp90-2-21-resize_inter_320x240_5_1-2.webm
>>    - vp90-2-21-resize_inter_320x240_7_1-2.webm
>>    - vp90-2-18-resize.ivf
>>  - 1 testcase failed with CRC mismatch
>>    - vp90-2-16-intra-only.webm
>>    Analysis: First few frames are marked by firmware as NO_SHOW frame.
>>    Driver make buf state to VB2_BUF_STATE_ERROR for such frames.
>>    Such buffers should be dropped by GST. But instead, the first frame 
>>    is being displayed and when a valid buffer is sent to client later
>>    with same timestamp, its dropped, leading to CRC mismatch for first 
>>    frame.
> 
> I checked this one, 3 first frame are "decode only" indeed. Though, by
> returning these buffer with STATE_ERROR, you loose the ability to show
> these frame later. GStreamer should be fixed to do internal ref frame
> management, not silently drop these though.
> 
> What you can do instead, is leave these frames queued, and only mark
> them done once you hit a matching show_existing_frame. It will fix this
> specific stream (and most usage of show existing frame in the wild),
> but show-existing frame will remain broken. The other solution is to
> keep the reference frame internal, and output copies, but that imply
> some HW design, and also cost quite a lot in bandwidth.
> 
> This test hits the known V4L2 queue limitation that it can only output
> a frame once, and can only input a frame once (you cannot encode twice
> the same frame notably). I open to suggestion how to fix those, but I
> don't have any solutions for now.
> 
I am also checking with firmware team internally on any approach to handle
such use-cases.

Thanks,
Dikshita
> p.s. a third solution is make the firmware stateless :-D
> 
>>  Note: Same timing issue as observed on SM8550 is seen on SM8250 as 
>>  well.
>>
>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
>> ---
>> Dikshita Agarwal (20):
>>       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: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length
>>       media: iris: Add handling for no show frames
>>       media: iris: Improve last flag handling
>>       media: iris: Skip flush on first sequence change
>>       media: iris: Prevent HFI queue writes when core is in deinit state
>>       media: iris: Remove redundant buffer count check in stream off
>>       media: iris: Remove deprecated property setting to firmware
>>       media: iris: Fix missing function pointer initialization
>>       media: iris: Fix NULL pointer dereference
>>       media: iris: Fix typo in depth variable
>>       media: iris: Add a comment to explain usage of MBPS
>>       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: Add codec specific check for VP9 decoder drain handling
>>
>>  drivers/media/platform/qcom/iris/iris_buffer.c     |  22 +-
>>  drivers/media/platform/qcom/iris/iris_ctrls.c      |  35 +-
>>  drivers/media/platform/qcom/iris/iris_hfi_common.h |   1 +
>>  .../platform/qcom/iris/iris_hfi_gen1_command.c     |  44 ++-
>>  .../platform/qcom/iris/iris_hfi_gen1_defines.h     |   5 +-
>>  .../platform/qcom/iris/iris_hfi_gen1_response.c    |  22 +-
>>  .../platform/qcom/iris/iris_hfi_gen2_command.c     | 143 +++++++-
>>  .../platform/qcom/iris/iris_hfi_gen2_defines.h     |   5 +
>>  .../platform/qcom/iris/iris_hfi_gen2_response.c    |  57 ++-
>>  drivers/media/platform/qcom/iris/iris_hfi_queue.c  |   2 +-
>>  drivers/media/platform/qcom/iris/iris_instance.h   |   6 +
>>  .../platform/qcom/iris/iris_platform_common.h      |  28 +-
>>  .../platform/qcom/iris/iris_platform_sm8250.c      |  15 +-
>>  .../platform/qcom/iris/iris_platform_sm8550.c      | 143 +++++++-
>>  drivers/media/platform/qcom/iris/iris_vb2.c        |   3 +-
>>  drivers/media/platform/qcom/iris/iris_vdec.c       | 113 +++---
>>  drivers/media/platform/qcom/iris/iris_vdec.h       |  11 +
>>  drivers/media/platform/qcom/iris/iris_vidc.c       |   3 -
>>  drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 397 ++++++++++++++++++++-
>>  drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  46 ++-
>>  20 files changed, 948 insertions(+), 153 deletions(-)
>> ---
>> base-commit: 7824b91d23e9f255f0e9d2acaa74265c9cac2e9c
>> change-id: 20250402-iris-dec-hevc-vp9-2654a1fc4d0d
>>
>> Best regards,

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

* Re: [PATCH 06/20] media: iris: Add handling for no show frames
  2025-04-08 15:54 ` [PATCH 06/20] media: iris: Add handling for no show frames Dikshita Agarwal
@ 2025-04-22 20:23   ` Bryan O'Donoghue
  2025-04-23  9:03     ` Dikshita Agarwal
  0 siblings, 1 reply; 44+ messages in thread
From: Bryan O'Donoghue @ 2025-04-22 20:23 UTC (permalink / raw)
  To: Dikshita Agarwal, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree

On 08/04/2025 16:54, Dikshita Agarwal wrote:
> @@ -642,9 +644,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;
> -

How is this part of the change related to adding no show frames ?

---
bod

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

* Re: [PATCH 06/20] media: iris: Add handling for no show frames
  2025-04-22 20:23   ` Bryan O'Donoghue
@ 2025-04-23  9:03     ` Dikshita Agarwal
  0 siblings, 0 replies; 44+ messages in thread
From: Dikshita Agarwal @ 2025-04-23  9:03 UTC (permalink / raw)
  To: Bryan O'Donoghue, Vikash Garodia, Abhinav Kumar,
	Mauro Carvalho Chehab, Stefan Schmidt, Hans Verkuil,
	Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley
  Cc: Dmitry Baryshkov, Neil Armstrong, linux-media, linux-arm-msm,
	linux-kernel, devicetree



On 4/23/2025 1:53 AM, Bryan O'Donoghue wrote:
> On 08/04/2025 16:54, Dikshita Agarwal wrote:
>> @@ -642,9 +644,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;
>> -
> 
> How is this part of the change related to adding no show frames ?
> 
Yeah, this is not directly related, I can split these two changes.

Thanks,
Dikshita
> ---
> bod

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

end of thread, other threads:[~2025-04-23  9:04 UTC | newest]

Thread overview: 44+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-08 15:54 [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 01/20] media: iris: Skip destroying internal buffer if not dequeued Dikshita Agarwal
2025-04-11 12:10   ` Bryan O'Donoghue
2025-04-14 10:26     ` Bryan O'Donoghue
2025-04-15  4:58       ` Dikshita Agarwal
2025-04-16 12:10         ` Bryan O'Donoghue
2025-04-16 16:40           ` Dikshita Agarwal
2025-04-17  8:35             ` Bryan O'Donoghue
2025-04-08 15:54 ` [PATCH 02/20] media: iris: Update CAPTURE format info based on OUTPUT format Dikshita Agarwal
2025-04-11 12:46   ` Bryan O'Donoghue
2025-04-08 15:54 ` [PATCH 03/20] media: iris: Add handling for corrupt and drop frames Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 04/20] media: iris: Avoid updating frame size to firmware during reconfig Dikshita Agarwal
2025-04-11 12:47   ` Bryan O'Donoghue
2025-04-15  4:33     ` Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 05/20] media: iris: Send V4L2_BUF_FLAG_ERROR for buffers with 0 filled length Dikshita Agarwal
2025-04-11 12:51   ` Bryan O'Donoghue
2025-04-15  4:31     ` Dikshita Agarwal
2025-04-16 13:42       ` Nicolas Dufresne
2025-04-08 15:54 ` [PATCH 06/20] media: iris: Add handling for no show frames Dikshita Agarwal
2025-04-22 20:23   ` Bryan O'Donoghue
2025-04-23  9:03     ` Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 07/20] media: iris: Improve last flag handling Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 08/20] media: iris: Skip flush on first sequence change Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 09/20] media: iris: Prevent HFI queue writes when core is in deinit state Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 10/20] media: iris: Remove redundant buffer count check in stream off Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 11/20] media: iris: Remove deprecated property setting to firmware Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 12/20] media: iris: Fix missing function pointer initialization Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 13/20] media: iris: Fix NULL pointer dereference Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 14/20] media: iris: Fix typo in depth variable Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 15/20] media: iris: Add a comment to explain usage of MBPS Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 16/20] media: iris: Add HEVC and VP9 formats for decoder Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 17/20] media: iris: Add platform capabilities for HEVC and VP9 decoders Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 18/20] media: iris: Set mandatory properties " Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 19/20] media: iris: Add internal buffer calculation " Dikshita Agarwal
2025-04-08 15:54 ` [PATCH 20/20] media: iris: Add codec specific check for VP9 decoder drain handling Dikshita Agarwal
2025-04-08 18:37 ` [PATCH 00/20] Add support for HEVC and VP9 codecs in decoder Nicolas Dufresne
2025-04-21 11:05   ` Dikshita Agarwal
2025-04-09 14:29 ` Bryan O'Donoghue
2025-04-09 14:37   ` Bryan O'Donoghue
2025-04-09 16:26   ` Neil Armstrong
2025-04-09 17:59     ` Vikash Garodia
2025-04-10  7:20       ` neil.armstrong
2025-04-10  7:23         ` Vikash Garodia
2025-04-10  7:17   ` Dikshita Agarwal

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

all inboxes | Powered by JetHome®