]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: iris: Add codec specific check for VP9 decoder drain handling
authorDikshita Agarwal <quic_dikshita@quicinc.com>
Fri, 9 May 2025 08:39:12 +0000 (14:09 +0530)
committerHans Verkuil <hverkuil@xs4all.nl>
Thu, 3 Jul 2025 09:02:44 +0000 (11:02 +0200)
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.

Acked-by: Vikash Garodia <quic_vgarodia@quicinc.com>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-HDK
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-QRD
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Tested-by: Vikash Garodia <quic_vgarodia@quicinc.com> # on sa8775p-ride
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c
drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c

index 2e3f5a6b2ff11f273aecc4bae28399c260229af0..5fc30d54af4dc34616cfd08813940aa0b7044a20 100644 (file)
@@ -401,6 +401,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);
 }
index 926acee1f48cc4fa8a4ebb3d83f51a45549b59a0..8d1ce8a19a45ebb2b29457e0fef7d72c1c0d9785 100644 (file)
@@ -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) {