Re: [PATCH v3 00/26] Enable H.264/H.265 encoder support and fixes in iris driver common code

From: Neil Armstrong
Date: Thu Aug 21 2025 - 09:03:54 EST


On 21/08/2025 09:21, Dikshita Agarwal wrote:


On 8/20/2025 8:29 PM, Neil Armstrong wrote:
Hi,

On 20/08/2025 11:07, Dikshita Agarwal wrote:
Hi All,

This patch series adds support for H.264 and H.265 encoder in iris
driver and includes a few fixes and cleanup in the common code that were
identified during encoder bring-up process.

The changes include:
- Enabling support for H.264 and H.265 encoding.
- Fixes and improvements in shared componenets used by both encoder and
decoder paths.
- Ensuring compatibility and stability with the existing decoder flow.

Changes in v3:
- Fixed the log when destroying the interanl buffers (Jorge)
- Updated commit text with issue details in patch 05/25 (Krzysztof)
- Added a patch to simplify conditional logic in stop handling for hfi
gen1 (Bryan)
- Reduced duplicate code while registering video devices (Bryan)
- Added a fix for try fmt handling in decoder (Self)
- Fixed the value of max core mbps for qcs8300 (Vikash)
- Simplied the frame rate handling in driver by using non q16 format and
converted to q16 when setting to firmware (Vikash)
- Fixed the issue with bitstream resolution setting to firmware (Neil)
- Addressed other review comments (Vikash, Bryan)
- Link to v2:
https://lore.kernel.org/r/20250813-iris-video-encoder-v2-0-c725ff673078@xxxxxxxxxxx

Changes in v2:
- Fixed sparse/coccinnelle issues.
- Fixed the kernel doc warning.
- Removed unsupported PEAK_BITRATE property from SM8250.
- Dropped patch 04/25 to fix quality issue with encoder.
- Enhanced command handling for encoder to allow start/stop commands.
- Expanded rate control condition checks to include additional rate
   control types for HFI Gen2.
- Updated default value to MAX_QP for all caps related to max QP settings.
- Add support for INPUT/OUTPUT_BUF_HOST_MAX_COUNT caps for encoder.
- Link to v1:
https://lore.kernel.org/r/20250704-iris-video-encoder-v1-0-b6ce24e273cf@xxxxxxxxxxx

All patches have been tested with v4l2-compliance, v4l2-ctl and
Gstreamer on SM8250 and SM8550 for encoder, at the same time ensured
that the existing decoder functionality remains uneffected.

Commands used for V4l2-ctl validation:

v4l2-ctl --verbose
--set-fmt-video-out=width=1280,height=720,pixelformat=NV12
--set-selection-output target=crop,top=0,left=0,width=1280,height=720
--set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap
--stream-from=/media/cyclists_1280x720_92frames.yuv
--stream-to=/tmp/cyclists_1280x720_92frames.h264 -d /dev/video1

v4l2-ctl --verbose
--set-fmt-video-out=width=1280,height=720,pixelformat=NV12
--set-selection-output target=crop,top=0,left=0,width=1280,height=720
--set-fmt-video=pixelformat=HEVC --stream-mmap --stream-out-mmap
--stream-from=/media/cyclists_1280x720_92frames.yuv
--stream-to=/tmp/cyclists_1280x720_92frames.hevc -d /dev/video1

- I've tested this serie on SM8650, first I failed to get HEVC working with
the following command:

v4l2-ctl --verbose
--set-fmt-video-out=width=1920,height=1080,pixelformat=NV12
--set-selection-output target=crop,top=0,left=0,width=1920,height=1080
--set-fmt-video=pixelformat=HEVC --stream-mmap --stream-out-mmap
--stream-from=Big_Buck_Bunny_1080_10s.yuv
--stream-to=Big_Buck_Bunny_1080_10s.hevc -d /dev/video1

I got:
qcom-iris aa00000.video-codec: session error received 0x1000005: unknown

I checked the diff with v2, and reverting this make HEVC encoding work again:

This is strange, we don't see any such issue on SM8550.
Could you pls share the full logs.

I tried again with a 720p stream with your exact command line from the cover letter
and it still fails with HEVC:
$ v4l2-ctl --verbose --set-fmt-video-out=width=1280,height=720,pixelformat=NV12 --set-selection-output target=crop,top=0,left=0,width=1280,height=720 --set-fmt-video=pixelformat=HEVC --stream-mmap --stream-out-mmap --stream-from=Big_Buck_Bunny_720_10s.yuv --stream-to=Big_Buck_Bunny_720_10s.hevc -d /dev/video1
VIDIOC_QUERYCAP: ok
VIDIOC_G_FMT: ok
VIDIOC_S_FMT: ok
Format Video Capture Multiplanar:
Width/Height : 320/240
Pixel Format : 'HEVC' (HEVC)
Field : None
Number of planes : 1
Flags :
Colorspace : Default
Transfer Function : Default
YCbCr/HSV Encoding: Default
Quantization : Default
Plane 0 :
Bytes per Line : 0
Size Image : 245760
VIDIOC_G_FMT: ok
VIDIOC_S_FMT: ok
Format Video Output Multiplanar:
Width/Height : 1280/736
Pixel Format : 'NV12' (Y/UV 4:2:0)
Field : None
Number of planes : 1
Flags :
Colorspace : Default
Transfer Function : Default
YCbCr/HSV Encoding: Default
Quantization : Default
Plane 0 :
Bytes per Line : 1280
Size Image : 1413120
VIDIOC_G_SELECTION: ok
VIDIOC_S_SELECTION: ok
VIDIOC_G_FMT returned 0 (Success)
VIDIOC_G_FMT returned 0 (Success)
VIDIOC_G_FMT returned 0 (Success)
VIDIOC_REQBUFS returned 0 (Success)
VIDIOC_QUERYBUF returned 0 (Success)
VIDIOC_QUERYBUF returned 0 (Success)
VIDIOC_QUERYBUF returned 0 (Success)
VIDIOC_QUERYBUF returned 0 (Success)
VIDIOC_G_FMT returned 0 (Success)
VIDIOC_QUERYBUF returned 0 (Success)
VIDIOC_G_FMT returned 0 (Success)
VIDIOC_QBUF returned 0 (Success)
VIDIOC_QUERYBUF returned 0 (Success)
VIDIOC_G_FMT returned 0 (Success)
VIDIOC_QBUF returned 0 (Success)
VIDIOC_QUERYBUF returned 0 (Success)
VIDIOC_G_FMT returned 0 (Success)
VIDIOC_QBUF returned 0 (Success)
VIDIOC_QUERYBUF returned 0 (Success)
VIDIOC_G_FMT returned 0 (Success)
VIDIOC_QBUF returned 0 (Success)
VIDIOC_STREAMON returned 0 (Success)
VIDIOC_G_FMT: ok
VIDIOC_DQBUF: failed: Input/output error
out dqbuf: 0 seq: 0 bytesused: 0 ts: 0.000000 field: Any
VIDIOC_DQBUF: failed: Input/output error

DMESG:
[ 370.390568] videobuf2_common: [out-0000000057b84b86] vb2_core_reqbufs: call_qop(queue_setup)
[ 370.390585] qcom-iris aa00000.video-codec: state changed from 1 to 1
[ 370.390591] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_alloc: call_memop(0, alloc)
[ 370.390742] videobuf2_common: [out-0000000057b84b86] __setup_offsets: buffer 0, plane 0 offset 0x00000000
[ 370.390746] videobuf2_common: [out-0000000057b84b86] __vb2_queue_alloc: call_vb_qop(0, buf_init)
[ 370.390749] videobuf2_common: [out-0000000057b84b86] vb2_plane_cookie: call_memop(0, cookie)
[ 370.390752] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_alloc: call_memop(1, alloc)
[ 370.390911] videobuf2_common: [out-0000000057b84b86] __setup_offsets: buffer 1, plane 0 offset 0x00008000
[ 370.390913] videobuf2_common: [out-0000000057b84b86] __vb2_queue_alloc: call_vb_qop(1, buf_init)
[ 370.390915] videobuf2_common: [out-0000000057b84b86] vb2_plane_cookie: call_memop(1, cookie)
[ 370.390918] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_alloc: call_memop(2, alloc)
[ 370.391139] videobuf2_common: [out-0000000057b84b86] __setup_offsets: buffer 2, plane 0 offset 0x00010000
[ 370.391141] videobuf2_common: [out-0000000057b84b86] __vb2_queue_alloc: call_vb_qop(2, buf_init)
[ 370.391143] videobuf2_common: [out-0000000057b84b86] vb2_plane_cookie: call_memop(2, cookie)
[ 370.391145] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_alloc: call_memop(3, alloc)
[ 370.391293] videobuf2_common: [out-0000000057b84b86] __setup_offsets: buffer 3, plane 0 offset 0x00018000
[ 370.391296] videobuf2_common: [out-0000000057b84b86] __vb2_queue_alloc: call_vb_qop(3, buf_init)
[ 370.391297] videobuf2_common: [out-0000000057b84b86] vb2_plane_cookie: call_memop(3, cookie)
[ 370.391299] videobuf2_common: [out-0000000057b84b86] __vb2_queue_alloc: allocated 4 buffers, 1 plane(s) each
[ 370.391363] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(0, num_users)
[ 370.391418] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(1, num_users)
[ 370.391470] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(2, num_users)
[ 370.391522] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(3, num_users)
[ 370.391584] videobuf2_common: [out-0000000057b84b86] vb2_mmap: call_memop(0, mmap)
[ 370.391638] vb2_common_vm_open: 00000000210e3729, refcount: 1, vma: ffff96927000-ffff96a80000
[ 370.391642] vb2_dc_mmap: mapped dma addr 0xdfa00000 at 0xffff96927000, size 1413120
[ 370.391646] videobuf2_common: [out-0000000057b84b86] vb2_mmap: buffer 0, plane 0 successfully mapped
[ 370.391656] videobuf2_common: [out-0000000057b84b86] vb2_mmap: call_memop(1, mmap)
[ 370.391701] vb2_common_vm_open: 0000000076540d0f, refcount: 1, vma: ffff967ce000-ffff96927000
[ 370.391704] vb2_dc_mmap: mapped dma addr 0xdf800000 at 0xffff967ce000, size 1413120
[ 370.391706] videobuf2_common: [out-0000000057b84b86] vb2_mmap: buffer 1, plane 0 successfully mapped
[ 370.391716] videobuf2_common: [out-0000000057b84b86] vb2_mmap: call_memop(2, mmap)
[ 370.391759] vb2_common_vm_open: 00000000fe5c7906, refcount: 1, vma: ffff96675000-ffff967ce000
[ 370.391761] vb2_dc_mmap: mapped dma addr 0xdf600000 at 0xffff96675000, size 1413120
[ 370.391763] videobuf2_common: [out-0000000057b84b86] vb2_mmap: buffer 2, plane 0 successfully mapped
[ 370.391768] videobuf2_common: [out-0000000057b84b86] vb2_mmap: call_memop(3, mmap)
[ 370.391812] vb2_common_vm_open: 000000006a194006, refcount: 1, vma: ffff9651c000-ffff96675000
[ 370.391814] vb2_dc_mmap: mapped dma addr 0xdf400000 at 0xffff9651c000, size 1413120
[ 370.391816] videobuf2_common: [out-0000000057b84b86] vb2_mmap: buffer 3, plane 0 successfully mapped
[ 370.392050] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(0, num_users)
[ 370.393015] videobuf2_common: [out-0000000057b84b86] __buf_prepare: call_vb_qop(0, buf_out_validate)
[ 370.393021] videobuf2_common: [out-0000000057b84b86] __prepare_mmap: call_vb_qop(0, buf_prepare)
[ 370.393024] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_prepare: call_memop(0, prepare)
[ 370.393027] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(0, num_users)
[ 370.393030] videobuf2_common: [out-0000000057b84b86] vb2_core_qbuf: qbuf of buffer 0 succeeded
[ 370.393033] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.393037] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.393039] v4l2_m2m_try_run: No job pending
[ 370.393098] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(1, num_users)
[ 370.393715] videobuf2_common: [out-0000000057b84b86] __buf_prepare: call_vb_qop(1, buf_out_validate)
[ 370.393720] videobuf2_common: [out-0000000057b84b86] __prepare_mmap: call_vb_qop(1, buf_prepare)
[ 370.393723] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_prepare: call_memop(1, prepare)
[ 370.393725] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(1, num_users)
[ 370.393728] videobuf2_common: [out-0000000057b84b86] vb2_core_qbuf: qbuf of buffer 1 succeeded
[ 370.393730] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.393733] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.393735] v4l2_m2m_try_run: No job pending
[ 370.393792] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(2, num_users)
[ 370.394421] videobuf2_common: [out-0000000057b84b86] __buf_prepare: call_vb_qop(2, buf_out_validate)
[ 370.394425] videobuf2_common: [out-0000000057b84b86] __prepare_mmap: call_vb_qop(2, buf_prepare)
[ 370.394427] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_prepare: call_memop(2, prepare)
[ 370.394430] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(2, num_users)
[ 370.394432] videobuf2_common: [out-0000000057b84b86] vb2_core_qbuf: qbuf of buffer 2 succeeded
[ 370.394435] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.394437] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.394439] v4l2_m2m_try_run: No job pending
[ 370.394496] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(3, num_users)
[ 370.395199] videobuf2_common: [out-0000000057b84b86] __buf_prepare: call_vb_qop(3, buf_out_validate)
[ 370.395203] videobuf2_common: [out-0000000057b84b86] __prepare_mmap: call_vb_qop(3, buf_prepare)
[ 370.395205] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_prepare: call_memop(3, prepare)
[ 370.395208] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(3, num_users)
[ 370.395210] videobuf2_common: [out-0000000057b84b86] vb2_core_qbuf: qbuf of buffer 3 succeeded
[ 370.395212] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.395214] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.395216] v4l2_m2m_try_run: No job pending
[ 370.395273] videobuf2_common: [out-0000000057b84b86] vb2_core_streamon: call_qop(prepare_streaming) (nop)
[ 370.395277] videobuf2_common: [out-0000000057b84b86] __enqueue_in_driver: call_vb_qop(0, buf_queue)
[ 370.395280] videobuf2_common: [out-0000000057b84b86] __enqueue_in_driver: call_vb_qop(1, buf_queue)
[ 370.395282] videobuf2_common: [out-0000000057b84b86] __enqueue_in_driver: call_vb_qop(2, buf_queue)
[ 370.395285] videobuf2_common: [out-0000000057b84b86] __enqueue_in_driver: call_vb_qop(3, buf_queue)
[ 370.395287] videobuf2_common: [out-0000000057b84b86] vb2_start_streaming: call_qop(start_streaming)
[ 370.396462] qcom-iris aa00000.video-codec: state changed from 2 to 2
[ 370.396469] videobuf2_common: [out-0000000057b84b86] vb2_core_streamon: successful
[ 370.396473] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.396475] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.396477] v4l2_m2m_try_run: No job pending
[ 370.396583] videobuf2_common: [cap-00000000e59a888f] vb2_core_streamoff: successful
[ 370.396629] videobuf2_common: [cap-00000000e59a888f] vb2_core_reqbufs: call_qop(queue_setup)
[ 370.396633] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_alloc: call_memop(0, alloc)
[ 370.396691] videobuf2_common: [cap-00000000e59a888f] __setup_offsets: buffer 0, plane 0 offset 0x00000000
[ 370.396694] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_alloc: call_vb_qop(0, buf_init)
[ 370.396696] videobuf2_common: [cap-00000000e59a888f] vb2_plane_cookie: call_memop(0, cookie)
[ 370.396699] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_alloc: call_memop(1, alloc)
[ 370.396746] videobuf2_common: [cap-00000000e59a888f] __setup_offsets: buffer 1, plane 0 offset 0x00008000
[ 370.396748] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_alloc: call_vb_qop(1, buf_init)
[ 370.396750] videobuf2_common: [cap-00000000e59a888f] vb2_plane_cookie: call_memop(1, cookie)
[ 370.396752] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_alloc: call_memop(2, alloc)
[ 370.396809] videobuf2_common: [cap-00000000e59a888f] __setup_offsets: buffer 2, plane 0 offset 0x00010000
[ 370.396811] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_alloc: call_vb_qop(2, buf_init)
[ 370.396813] videobuf2_common: [cap-00000000e59a888f] vb2_plane_cookie: call_memop(2, cookie)
[ 370.396814] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_alloc: call_memop(3, alloc)
[ 370.396884] videobuf2_common: [cap-00000000e59a888f] __setup_offsets: buffer 3, plane 0 offset 0x00018000
[ 370.396886] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_alloc: call_vb_qop(3, buf_init)
[ 370.396888] videobuf2_common: [cap-00000000e59a888f] vb2_plane_cookie: call_memop(3, cookie)
[ 370.396889] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_alloc: allocated 4 buffers, 1 plane(s) each
[ 370.396896] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(0, num_users)
[ 370.396899] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(1, num_users)
[ 370.396902] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(2, num_users)
[ 370.396904] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(3, num_users)
[ 370.396919] videobuf2_common: [cap-00000000e59a888f] vb2_mmap: call_memop(0, mmap)
[ 370.396945] vb2_common_vm_open: 0000000095b56358, refcount: 1, vma: ffff9646f000-ffff9651c000
[ 370.396948] vb2_dc_mmap: mapped dma addr 0xdf300000 at 0xffff9646f000, size 708608
[ 370.396951] videobuf2_common: [cap-00000000e59a888f] vb2_mmap: buffer 0, plane 0 successfully mapped
[ 370.396960] videobuf2_common: [cap-00000000e59a888f] vb2_mmap: call_memop(1, mmap)
[ 370.396984] vb2_common_vm_open: 000000005cf693ed, refcount: 1, vma: ffff963c2000-ffff9646f000
[ 370.396987] vb2_dc_mmap: mapped dma addr 0xdf200000 at 0xffff963c2000, size 708608
[ 370.396989] videobuf2_common: [cap-00000000e59a888f] vb2_mmap: buffer 1, plane 0 successfully mapped
[ 370.396994] videobuf2_common: [cap-00000000e59a888f] vb2_mmap: call_memop(2, mmap)
[ 370.397018] vb2_common_vm_open: 000000000fb3f862, refcount: 1, vma: ffff96315000-ffff963c2000
[ 370.397020] vb2_dc_mmap: mapped dma addr 0xdf100000 at 0xffff96315000, size 708608
[ 370.397022] videobuf2_common: [cap-00000000e59a888f] vb2_mmap: buffer 2, plane 0 successfully mapped
[ 370.397027] videobuf2_common: [cap-00000000e59a888f] vb2_mmap: call_memop(3, mmap)
[ 370.397048] vb2_common_vm_open: 00000000112d3450, refcount: 1, vma: ffff96268000-ffff96315000
[ 370.397051] vb2_dc_mmap: mapped dma addr 0xdf000000 at 0xffff96268000, size 708608
[ 370.397053] videobuf2_common: [cap-00000000e59a888f] vb2_mmap: buffer 3, plane 0 successfully mapped
[ 370.397060] videobuf2_common: [cap-00000000e59a888f] __prepare_mmap: call_vb_qop(0, buf_prepare)
[ 370.397062] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_prepare: call_memop(0, prepare)
[ 370.397065] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(0, num_users)
[ 370.397067] videobuf2_common: [cap-00000000e59a888f] vb2_core_qbuf: qbuf of buffer 0 succeeded
[ 370.397069] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.397071] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.397072] v4l2_m2m_try_run: No job pending
[ 370.397075] videobuf2_common: [cap-00000000e59a888f] __prepare_mmap: call_vb_qop(1, buf_prepare)
[ 370.397077] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_prepare: call_memop(1, prepare)
[ 370.397079] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(1, num_users)
[ 370.397080] videobuf2_common: [cap-00000000e59a888f] vb2_core_qbuf: qbuf of buffer 1 succeeded
[ 370.397082] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.397084] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.397085] v4l2_m2m_try_run: No job pending
[ 370.397087] videobuf2_common: [cap-00000000e59a888f] __prepare_mmap: call_vb_qop(2, buf_prepare)
[ 370.397089] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_prepare: call_memop(2, prepare)
[ 370.397090] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(2, num_users)
[ 370.397092] videobuf2_common: [cap-00000000e59a888f] vb2_core_qbuf: qbuf of buffer 2 succeeded
[ 370.397094] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.397095] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.397096] v4l2_m2m_try_run: No job pending
[ 370.397099] videobuf2_common: [cap-00000000e59a888f] __prepare_mmap: call_vb_qop(3, buf_prepare)
[ 370.397100] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_prepare: call_memop(3, prepare)
[ 370.397102] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(3, num_users)
[ 370.397103] videobuf2_common: [cap-00000000e59a888f] vb2_core_qbuf: qbuf of buffer 3 succeeded
[ 370.397105] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.397106] __v4l2_m2m_try_queue: Streaming needs to be on for both queues
[ 370.397108] v4l2_m2m_try_run: No job pending
[ 370.397110] videobuf2_common: [cap-00000000e59a888f] vb2_core_streamon: call_qop(prepare_streaming) (nop)
[ 370.397113] videobuf2_common: [cap-00000000e59a888f] __enqueue_in_driver: call_vb_qop(0, buf_queue)
[ 370.397115] videobuf2_common: [cap-00000000e59a888f] __enqueue_in_driver: call_vb_qop(1, buf_queue)
[ 370.397117] videobuf2_common: [cap-00000000e59a888f] __enqueue_in_driver: call_vb_qop(2, buf_queue)
[ 370.397118] videobuf2_common: [cap-00000000e59a888f] __enqueue_in_driver: call_vb_qop(3, buf_queue)
[ 370.397120] videobuf2_common: [cap-00000000e59a888f] vb2_start_streaming: call_qop(start_streaming)
[ 370.397978] qcom-iris aa00000.video-codec: state changed from 4 to 4
[ 370.397998] videobuf2_common: [cap-00000000e59a888f] vb2_core_streamon: successful
[ 370.398001] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.398003] v4l2_m2m_try_run: Running job on m2m_ctx: 00000000da2be142
[ 370.398609] qcom-iris aa00000.video-codec: session error received 0x1000005: unknown
[ 370.398674] qcom-iris aa00000.video-codec: state changed from 5 to 5
[ 370.398687] videobuf2_common: [cap-00000000e59a888f] __vb2_wait_for_done_vb: Queue in error state, will not wait for buffers
[ 370.398695] qcom-iris aa00000.video-codec: session error received 0x1000005: unknown
[ 370.398716] qcom-iris aa00000.video-codec: session error received 0x1000005: unknown
[ 370.398732] videobuf2_common: [out-0000000057b84b86] __vb2_wait_for_done_vb: Queue in error state, will not wait for buffers
[ 370.398735] qcom-iris aa00000.video-codec: session error received 0x1000005: unknown
[ 370.398763] videobuf2_common: [out-0000000057b84b86] vb2_buffer_done: done processing on buffer 0, state: done
[ 370.398781] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_finish: call_memop(0, finish)
[ 370.398805] videobuf2_common: [out-0000000057b84b86] vb2_buffer_done: done processing on buffer 1, state: done
[ 370.398821] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_finish: call_memop(1, finish)
[ 370.398843] videobuf2_common: [out-0000000057b84b86] vb2_buffer_done: done processing on buffer 2, state: done
[ 370.398857] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_finish: call_memop(2, finish)
[ 370.398875] videobuf2_common: [out-0000000057b84b86] vb2_buffer_done: done processing on buffer 3, state: done
[ 370.398890] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_finish: call_memop(3, finish)
[ 370.398909] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_done: done processing on buffer 0, state: done
[ 370.398923] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_finish: call_memop(0, finish)
[ 370.398929] __v4l2_m2m_try_queue: Trying to schedule a job for m2m_ctx: 00000000da2be142
[ 370.398933] __v4l2_m2m_try_queue: Aborted context
[ 370.398942] v4l2_m2m_cancel_job: m2m_ctx 00000000da2be142 running, will wait to complete
[ 370.398940] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_done: done processing on buffer 1, state: done
[ 370.398946] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_cancel: call_qop(stop_streaming)
[ 370.398954] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_finish: call_memop(1, finish)
[ 370.398979] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_done: done processing on buffer 2, state: done
[ 370.398983] v4l2_m2m_try_run: No job pending
[ 370.398996] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_finish: call_memop(2, finish)
[ 370.399015] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_done: done processing on buffer 3, state: done
[ 370.399029] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_finish: call_memop(3, finish)
[ 370.401090] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_cancel: call_qop(unprepare_streaming) (nop)
[ 370.401094] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_cancel: call_vb_qop(0, buf_finish) (nop)
[ 370.401098] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_cancel: call_vb_qop(1, buf_finish) (nop)
[ 370.401100] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_cancel: call_vb_qop(2, buf_finish) (nop)
[ 370.401103] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_cancel: call_vb_qop(3, buf_finish) (nop)
[ 370.401105] videobuf2_common: [cap-00000000e59a888f] vb2_core_streamoff: successful
[ 370.401110] videobuf2_common: [out-0000000057b84b86] __vb2_queue_cancel: call_qop(stop_streaming)
[ 370.401357] videobuf2_common: [out-0000000057b84b86] __vb2_queue_cancel: call_qop(unprepare_streaming) (nop)
[ 370.401361] videobuf2_common: [out-0000000057b84b86] __vb2_queue_cancel: call_vb_qop(0, buf_finish) (nop)
[ 370.401363] videobuf2_common: [out-0000000057b84b86] __vb2_queue_cancel: call_vb_qop(1, buf_finish) (nop)
[ 370.401367] videobuf2_common: [out-0000000057b84b86] __vb2_queue_cancel: call_vb_qop(2, buf_finish) (nop)
[ 370.401369] videobuf2_common: [out-0000000057b84b86] __vb2_queue_cancel: call_vb_qop(3, buf_finish) (nop)
[ 370.401373] videobuf2_common: [out-0000000057b84b86] vb2_core_streamoff: successful
[ 370.401377] videobuf2_common: [cap-00000000e59a888f] vb2_core_streamoff: successful
[ 370.401418] vb2_common_vm_close: 0000000095b56358, refcount: 2, vma: ffff9646f000-ffff9651c000
[ 370.401455] vb2_common_vm_close: 000000005cf693ed, refcount: 2, vma: ffff963c2000-ffff9646f000
[ 370.401487] vb2_common_vm_close: 000000000fb3f862, refcount: 2, vma: ffff96315000-ffff963c2000
[ 370.401522] vb2_common_vm_close: 00000000112d3450, refcount: 2, vma: ffff96268000-ffff96315000
[ 370.401529] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(0, num_users)
[ 370.401531] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(1, num_users)
[ 370.401534] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(2, num_users)
[ 370.401536] videobuf2_common: [cap-00000000e59a888f] vb2_buffer_in_use: call_memop(3, num_users)
[ 370.401539] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_free: call_vb_qop(0, buf_cleanup) (nop)
[ 370.401542] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_free: call_vb_qop(1, buf_cleanup) (nop)
[ 370.401545] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_free: call_vb_qop(2, buf_cleanup) (nop)
[ 370.401548] videobuf2_common: [cap-00000000e59a888f] __vb2_queue_free: call_vb_qop(3, buf_cleanup) (nop)
[ 370.401551] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_free: call_memop(0, put)
[ 370.401712] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_free: freed plane 0 of buffer 0
[ 370.401715] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_free: call_memop(1, put)
[ 370.401865] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_free: freed plane 0 of buffer 1
[ 370.401867] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_free: call_memop(2, put)
[ 370.402016] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_free: freed plane 0 of buffer 2
[ 370.402019] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_free: call_memop(3, put)
[ 370.402166] videobuf2_common: [cap-00000000e59a888f] __vb2_buf_mem_free: freed plane 0 of buffer 3
[ 370.402172] videobuf2_common: [out-0000000057b84b86] vb2_core_streamoff: successful
[ 370.402230] vb2_common_vm_close: 00000000210e3729, refcount: 2, vma: ffff96927000-ffff96a80000
[ 370.402299] vb2_common_vm_close: 0000000076540d0f, refcount: 2, vma: ffff967ce000-ffff96927000
[ 370.402361] vb2_common_vm_close: 00000000fe5c7906, refcount: 2, vma: ffff96675000-ffff967ce000
[ 370.402428] vb2_common_vm_close: 000000006a194006, refcount: 2, vma: ffff9651c000-ffff96675000
[ 370.402433] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(0, num_users)
[ 370.402436] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(1, num_users)
[ 370.402438] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(2, num_users)
[ 370.402440] videobuf2_common: [out-0000000057b84b86] vb2_buffer_in_use: call_memop(3, num_users)
[ 370.402443] videobuf2_common: [out-0000000057b84b86] __vb2_queue_free: call_vb_qop(0, buf_cleanup) (nop)
[ 370.402445] videobuf2_common: [out-0000000057b84b86] __vb2_queue_free: call_vb_qop(1, buf_cleanup) (nop)
[ 370.402448] videobuf2_common: [out-0000000057b84b86] __vb2_queue_free: call_vb_qop(2, buf_cleanup) (nop)
[ 370.402450] videobuf2_common: [out-0000000057b84b86] __vb2_queue_free: call_vb_qop(3, buf_cleanup) (nop)
[ 370.402452] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_free: call_memop(0, put)
[ 370.402745] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_free: freed plane 0 of buffer 0
[ 370.402748] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_free: call_memop(1, put)
[ 370.403037] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_free: freed plane 0 of buffer 1
[ 370.403039] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_free: call_memop(2, put)
[ 370.403328] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_free: freed plane 0 of buffer 2
[ 370.403330] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_free: call_memop(3, put)
[ 370.403618] videobuf2_common: [out-0000000057b84b86] __vb2_buf_mem_free: freed plane 0 of buffer 3

Do you need other debug output ?

I'm fine with firmware expecting specific aligments, but I would expect the driver to error
out instead of the firmware.

Neil

===========================><=================================================
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -194,9 +194,8 @@ static int
iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
                inst_hfi_gen2->src_subcr_params.bitstream_resolution =
resolution;
                payload_type = HFI_PAYLOAD_U32;
        } else {
-               codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
-               resolution = ALIGN(inst->fmt_dst->fmt.pix_mp.width,
codec_align) << 16 |
-                       ALIGN(inst->fmt_dst->fmt.pix_mp.height, codec_align);
+               resolution = inst->fmt_dst->fmt.pix_mp.width << 16 |
+                       inst->fmt_dst->fmt.pix_mp.height;
                inst_hfi_gen2->dst_subcr_params.bitstream_resolution =
resolution;
                payload_type = HFI_PAYLOAD_32_PACKED;
        }
===========================><=================================================
Did I pass some wrong parameters ? I don't expect the fw to crash.

- On the 1280x720 output bug, I tried the same commands as v2:
v4l2-ctl --verbose
--set-fmt-video-out=width=1920,height=1080,pixelformat=NV12
--set-selection-output target=crop,top=0,left=0,width=1920,height=1080
--set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap
--stream-from=Big_Buck_Bunny_1080_10s.yuv
--stream-to=Big_Buck_Bunny_1080_10s.h264 -d /dev/video1

And I still get a 1280x720 h264 video, did I miss something ?

The above chnage which you reverted is needed to resolve this bug,
basically if you don't set the resolution aligned with 16 (for H264) and 32
(for HEVC) firmware will reject the property and encode to some default
resolution which is 720p in this case.


- Finally I tested the firmware you sent today
(https://gitlab.com/kernel-firmware/linux-firmware/-/merge_requests/654),
first thanks a lot for that !

But then I was unable to encode with this firmware (v2 or v3 patchset), I
got around all the firmwares
I got and here's the results:
| QC_IMAGE_VERSION_STRING                                     | BUILD_DATE
| Release                         | decoding | encoding v2 | encoding v3 |
|-------------------------------------------------------------|-------------|---------------------------------|----------|-------------|-------------|
| video-firmware.3.4-245082a0a3cc5e740f6340c295000ab4bcfc367d | Aug 24 2023
| VIDEO.LA.4.0.r2-02400-lanai.0-1 | OK       | OK          | KO HEVC     |
| video-firmware.3.4-457429862ac40592d143de942b04d80fd9987e56 | Jan 29 2024
| VIDEO.LA.4.0.r2-03800-lanai.0-1 | OK       | OK          | KO HEVC     |
| video-firmware.3.4-0d8a914b010672616a0d0613e22866c0b639a807 | Aug 14 2024
| VIDEO.LA.4.0.r2-05900-lanai.0-1 | OK       | KO          | KO          |
| video-firmware.3.4-75ad4eb9657cf50ee663b05f78c01d6ceccd5632 | Jan 29 2025
| VIDEO.LA.4.0.r2-05900-lanai.0-1 | OK       | KO          | KO          |
| video-firmware.3.4-e299f99ffcd086b43a2ccc7c3279ce5df404d693 | Aug 14 2025
| VIDEO.VPU.3.4-0054              | OK       | KO          | KO          |
------------------------------------------------------------------------------------------------------------------------------------------------------

The change occurs around Aug 14 2024, So I checked the downstream driver
and I found that fixes the encoding:
===========================><=================================================
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
@@ -863,9 +863,18 @@ static inline
 u32 size_vpss_line_buf(u32 num_vpp_pipes_enc, u32 frame_height_coded,
                       u32 frame_width_coded)
 {
-       return ALIGN(((((((8192) >> 2) << 5) * (num_vpp_pipes_enc)) + 64) +
-                     (((((max_t(u32, (frame_width_coded),
-                                (frame_height_coded)) + 3) >> 2) << 5) +
256) * 16)), 256);
+       u32 vpss_4tap_top = 0, vpss_4tap_left = 0, vpss_div2_top = 0,
vpss_div2_left = 0, vpss_top_lb = 0, vpss_left_lb = 0, size_left = 0,
size_top = 0;
+
+       vpss_4tap_top = ((((max_t(u32, frame_width_coded,
frame_height_coded) * 2) + 3) >> 2) << 4) + 256;
+       vpss_4tap_left = (((8192 + 3) >> 2) << 5) + 64;
+       vpss_div2_top = (((max_t(u32,frame_width_coded, frame_height_coded)
+ 3) >> 2) << 4) + 256;
+       vpss_div2_left = ((((max_t(u32, frame_width_coded,
frame_height_coded)* 2) + 3) >> 2) << 5) + 64;
+       vpss_top_lb = (frame_width_coded + 1) << 3;
+       vpss_left_lb = (frame_height_coded << 3) * num_vpp_pipes_enc;
+       size_left = (vpss_4tap_left + vpss_div2_left) * 2 * num_vpp_pipes_enc;
+       size_top = (vpss_4tap_top + vpss_div2_top) * 2;
+
+       return ALIGN(size_left + size_top + vpss_top_lb + vpss_left_lb,
DMA_ALIGNMENT);
 }

Seems this calculation is different for iris3 and iris33, hence you see
this issue on SM8650.

Updating this calculation in common code will increase the buffer size with
from ~400KB to ~2.2 MBs (for 640x480) and even more for higher resolution.

@vikash, pls comment if we should update in common code or have this
implemented specific for iris33 separately using some ops.

Thanks,
Dikshita


 static inline
===========================><=================================================

And I checked and encoding still works with the "old" firmwares.

With both changes, I can get H264 & HEVC encoding working on any firmware.

Neil



Commands used for GST validation:

gst-launch-1.0 -v filesrc location=/media/cyclists_1280x720_92frames.yuv !
rawvideoparse format=nv12 width=1280 height=720 framerate=30/1 ! v4l2h264enc
capture-io-mode=4 output-io-mode=4 ! filesink sync=true
location=/tmp/gst_cyclists_1280x720_92frames.h264

gst-launch-1.0 -v filesrc location=/media/cyclists_1280x720_92frames.yuv !
rawvideoparse format=nv12 width=1280 height=720 framerate=30/1 ! v4l2h265enc
capture-io-mode=4 output-io-mode=4 ! filesink sync=true
location=/tmp/gst_cyclists_1280x720_92frames.hevc

The result of v4l2-compliance on SM8550:
v4l2-compliance 1.29.0-5270, 64 bits, 64-bit time_t
v4l2-compliance SHA: dc947661089e 2024-11-11 10:25:38

Compliance test for iris_driver device /dev/video1:

Driver Info:
         Driver name      : iris_driver
         Card type        : Iris Encoder
         Bus info         : platform:aa00000.video-codec
         Driver version   : 6.16.0
         Capabilities     : 0x84204000
                 Video Memory-to-Memory Multiplanar
                 Streaming
                 Extended Pix Format
                 Device Capabilities
         Device Caps      : 0x04204000
                 Video Memory-to-Memory Multiplanar
                 Streaming
                 Extended Pix Format
         Detected Stateful Encoder

Required ioctls:
         test VIDIOC_QUERYCAP: OK
         test invalid ioctls: OK

Allow for multiple opens:
         test second /dev/video1 open: OK
         test VIDIOC_QUERYCAP: OK
         test VIDIOC_G/S_PRIORITY: OK
         test for unlimited opens: OK

Debug ioctls:
         test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
         test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
         test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
         test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
         test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
         test VIDIOC_ENUMAUDIO: OK (Not Supported)
         test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
         test VIDIOC_G/S_AUDIO: OK (Not Supported)
         Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
         test VIDIOC_G/S_MODULATOR: OK (Not Supported)
         test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
         test VIDIOC_ENUMAUDOUT: OK (Not Supported)
         test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
         test VIDIOC_G/S_AUDOUT: OK (Not Supported)
         Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
         test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
         test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
         test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
         test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls:
         test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
         test VIDIOC_QUERYCTRL: OK
         test VIDIOC_G/S_CTRL: OK
         test VIDIOC_G/S/TRY_EXT_CTRLS: OK
         test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
         test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
         Standard Controls: 37 Private Controls: 0

Format ioctls:
         test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
         test VIDIOC_G/S_PARM: OK
         test VIDIOC_G_FBUF: OK (Not Supported)
         test VIDIOC_G_FMT: OK
         test VIDIOC_TRY_FMT: OK
         test VIDIOC_S_FMT: OK
         test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
         test Cropping: OK
         test Composing: OK (Not Supported)
         test Scaling: OK (Not Supported)

Codec ioctls:
         test VIDIOC_(TRY_)ENCODER_CMD: OK
         test VIDIOC_G_ENC_INDEX: OK (Not Supported)
         test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
         test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
         test CREATE_BUFS maximum buffers: OK
         test VIDIOC_REMOVE_BUFS: OK
         test VIDIOC_EXPBUF: OK
         test Requests: OK (Not Supported)
         test blocking wait: OK

Test input 0:

Streaming ioctls:
         test read/write: OK (Not Supported)
         Video Capture Multiplanar: Captured 61 buffers
         test MMAP (select, REQBUFS): OK
         Video Capture Multiplanar: Captured 61 buffers
         test MMAP (epoll, REQBUFS): OK
         Video Capture Multiplanar: Captured 61 buffers
         test MMAP (select, CREATE_BUFS): OK
         Video Capture Multiplanar: Captured 61 buffers
         test MMAP (epoll, CREATE_BUFS): OK
         test USERPTR (select): OK (Not Supported)
         test DMABUF: Cannot test, specify --expbuf-device

Total for iris_driver device /dev/video1: 54, Succeeded: 54, Failed: 0,
Warnings: 0

The result of v4l2-compliance on SM8250:
v4l2-compliance 1.29.0-5270, 64 bits, 64-bit time_t
v4l2-compliance SHA: dc947661089e 2024-11-11 10:25:38

Compliance test for iris_driver device /dev/video1:

Driver Info:
         Driver name      : iris_driver
         Card type        : Iris Encoder
         Bus info         : platform:aa00000.video-codec
         Driver version   : 6.16.0
         Capabilities     : 0x84204000
                 Video Memory-to-Memory Multiplanar
                 Streaming
                 Extended Pix Format
                 Device Capabilities
         Device Caps      : 0x04204000
                 Video Memory-to-Memory Multiplanar
                 Streaming
                 Extended Pix Format
         Detected Stateful Encoder

Required ioctls:
         test VIDIOC_QUERYCAP: OK
         test invalid ioctls: OK

Allow for multiple opens:
         test second /dev/video1 open: OK
         test VIDIOC_QUERYCAP: OK
         test VIDIOC_G/S_PRIORITY: OK
         test for unlimited opens: OK

Debug ioctls:
         test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
         test VIDIOC_LOG_STATUS: OK (Not Supported)

Input ioctls:
         test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
         test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
         test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
         test VIDIOC_ENUMAUDIO: OK (Not Supported)
         test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
         test VIDIOC_G/S_AUDIO: OK (Not Supported)
         Inputs: 0 Audio Inputs: 0 Tuners: 0

Output ioctls:
         test VIDIOC_G/S_MODULATOR: OK (Not Supported)
         test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
         test VIDIOC_ENUMAUDOUT: OK (Not Supported)
         test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
         test VIDIOC_G/S_AUDOUT: OK (Not Supported)
         Outputs: 0 Audio Outputs: 0 Modulators: 0

Input/Output configuration ioctls:
         test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
         test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
         test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
         test VIDIOC_G/S_EDID: OK (Not Supported)

Control ioctls:
         test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
         test VIDIOC_QUERYCTRL: OK
         test VIDIOC_G/S_CTRL: OK
         test VIDIOC_G/S/TRY_EXT_CTRLS: OK
         test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
         test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
         Standard Controls: 19 Private Controls: 0

Format ioctls:
         test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
         test VIDIOC_G/S_PARM: OK
         test VIDIOC_G_FBUF: OK (Not Supported)
         test VIDIOC_G_FMT: OK
         test VIDIOC_TRY_FMT: OK
         test VIDIOC_S_FMT: OK
         test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
         test Cropping: OK
         test Composing: OK (Not Supported)
         test Scaling: OK (Not Supported)

Codec ioctls:
         test VIDIOC_(TRY_)ENCODER_CMD: OK
         test VIDIOC_G_ENC_INDEX: OK (Not Supported)
         test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)

Buffer ioctls:
         test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
         test CREATE_BUFS maximum buffers: OK
         test VIDIOC_REMOVE_BUFS: OK
         test VIDIOC_EXPBUF: OK
         test Requests: OK (Not Supported)
         test blocking wait: OK

Test input 0:

Streaming ioctls:
         test read/write: OK (Not Supported)
         Video Capture Multiplanar: Captured 61 buffers
         test MMAP (select, REQBUFS): OK
         Video Capture Multiplanar: Captured 61 buffers
         test MMAP (epoll, REQBUFS): OK
         Video Capture Multiplanar: Captured 61 buffers
         test MMAP (select, CREATE_BUFS): OK
         Video Capture Multiplanar: Captured 61 buffers
         test MMAP (epoll, CREATE_BUFS): OK
         test USERPTR (select): OK (Not Supported)
         test DMABUF: Cannot test, specify --expbuf-device

Total for iris_driver device /dev/video1: 54, Succeeded: 54, Failed: 0,
Warnings: 0

Looking forward to your review and feedback.

Thanks,
Dikshita

Signed-off-by: Dikshita Agarwal <quic_dikshita@xxxxxxxxxxx>
---
Dikshita Agarwal (26):
       media: iris: Fix buffer count reporting in internal buffer check
       media: iris: Report unreleased PERSIST buffers on session close
       media: iris: Fix memory leak by freeing untracked persist buffer
       media: iris: Fix port streaming handling
       media: iris: Allow substate transition to load resources during
output streaming
       media: iris: Always destroy internal buffers on firmware release
response
       media: iris: Update vbuf flags before v4l2_m2m_buf_done
       media: iris: Simplify session stop logic by relying on vb2 checks
       media: iris: Allow stop on firmware only if start was issued.
       media: iris: Send dummy buffer address for all codecs during drain
       media: iris: Fix missing LAST flag handling during drain
       media: iris: Fix format check for CAPTURE plane in try_fmt
       media: iris: Add support for video encoder device
       media: iris: Initialize and deinitialize encoder instance structure
       media: iris: Add support for ENUM_FMT, S/G/TRY_FMT encoder
       media: iris: Add support for ENUM_FRAMESIZES/FRAMEINTERVALS for
encoder
       media: iris: Add support for VIDIOC_QUERYCAP for encoder video device
       media: iris: Add encoder support for V4L2 event subscription
       media: iris: Add support for G/S_SELECTION for encoder video device
       media: iris: Add support for G/S_PARM for encoder video device
       media: iris: Add platform-specific capabilities for encoder video
device
       media: iris: Add V4L2 streaming support for encoder video device
       media: iris: Set platform capabilities to firmware for encoder
video device
       media: iris: Allocate and queue internal buffers for encoder video
device
       media: iris: Add support for buffer management ioctls for encoder
device
       media: iris: Add support for drain sequence in encoder video device

  drivers/media/platform/qcom/iris/Makefile          |   5 +-
  drivers/media/platform/qcom/iris/iris_buffer.c     | 220 ++++--
  drivers/media/platform/qcom/iris/iris_buffer.h     |   7 +-
  drivers/media/platform/qcom/iris/iris_common.c     | 232 ++++++
  drivers/media/platform/qcom/iris/iris_common.h     |  18 +
  drivers/media/platform/qcom/iris/iris_core.h       |  20 +-
  drivers/media/platform/qcom/iris/iris_ctrls.c      | 675 +++++++++++++++-
  drivers/media/platform/qcom/iris/iris_ctrls.h      |  15 +
  drivers/media/platform/qcom/iris/iris_hfi_common.h |   2 +-
  .../platform/qcom/iris/iris_hfi_gen1_command.c     | 480 +++++++++---
  .../platform/qcom/iris/iris_hfi_gen1_defines.h     | 112 ++-
  .../platform/qcom/iris/iris_hfi_gen1_response.c    |  60 +-
  .../platform/qcom/iris/iris_hfi_gen2_command.c     | 359 ++++++---
  .../platform/qcom/iris/iris_hfi_gen2_defines.h     |  44 +-
  .../platform/qcom/iris/iris_hfi_gen2_response.c    |  46 +-
  drivers/media/platform/qcom/iris/iris_instance.h   |  24 +
  .../platform/qcom/iris/iris_platform_common.h      |  74 +-
  .../media/platform/qcom/iris/iris_platform_gen2.c  | 522 ++++++++++++-
  .../platform/qcom/iris/iris_platform_qcs8300.h     | 352 ++++++++-
  .../platform/qcom/iris/iris_platform_sm8250.c      | 234 +++++-
  drivers/media/platform/qcom/iris/iris_probe.c      |  33 +-
  drivers/media/platform/qcom/iris/iris_state.c      |   9 +-
  drivers/media/platform/qcom/iris/iris_state.h      |   1 +
  drivers/media/platform/qcom/iris/iris_utils.c      |  36 +
  drivers/media/platform/qcom/iris/iris_utils.h      |   2 +
  drivers/media/platform/qcom/iris/iris_vb2.c        |  58 +-
  drivers/media/platform/qcom/iris/iris_vdec.c       | 251 +-----
  drivers/media/platform/qcom/iris/iris_vdec.h       |  13 +-
  drivers/media/platform/qcom/iris/iris_venc.c       | 579 ++++++++++++++
  drivers/media/platform/qcom/iris/iris_venc.h       |  27 +
  drivers/media/platform/qcom/iris/iris_vidc.c       | 299 +++++++-
  drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 847
++++++++++++++++++++-
  drivers/media/platform/qcom/iris/iris_vpu_buffer.h |  20 +
  33 files changed, 4964 insertions(+), 712 deletions(-)
---
base-commit: a75b8d198c55e9eb5feb6f6e155496305caba2dc
change-id: 20250704-iris-video-encoder-b193350b487a

Best regards,