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

Reviewed-by: Vikash Garodia <quic_vgarodia@quicinc.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
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_buffer.c
drivers/media/platform/qcom/iris/iris_hfi_gen1_response.c
drivers/media/platform/qcom/iris/iris_instance.h
drivers/media/platform/qcom/iris/iris_vb2.c
drivers/media/platform/qcom/iris/iris_vdec.c

index 018334512baed23f72aad7c2f36b61c50751ca97..7dbac74b1a8de0f5bc09d0ea5307e86d8cbab101 100644 (file)
@@ -636,6 +636,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;
index 14d8bef62b606acaee514d986eba2f213d1d8c9a..926acee1f48cc4fa8a4ebb3d83f51a45549b59a0 100644 (file)
@@ -457,7 +457,12 @@ 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 (iris_drc_pending(inst)) {
+                               flags |= V4L2_BUF_FLAG_LAST;
+                               inst->last_buffer_dequeued = true;
+                       }
+               }
        }
        buf->timestamp = timestamp_us;
 
index 06a7f1174ad55e8028096b103b1a2c66f49c3aa7..5ec6368b2af711fd0b78854ddbf18ae58e3dcdc6 100644 (file)
@@ -43,6 +43,7 @@
  * @sequence_out: a sequence counter for output queue
  * @tss: timestamp metadata
  * @metadata_idx: index for metadata buffer
+ * @last_buffer_dequeued: a flag to indicate that last buffer is sent by driver
  */
 
 struct iris_inst {
@@ -74,6 +75,7 @@ struct iris_inst {
        u32                             sequence_out;
        struct iris_ts_metadata         tss[VIDEO_MAX_FRAME];
        u32                             metadata_idx;
+       bool                            last_buffer_dequeued;
 };
 
 #endif
index b3bde10eb6d2f05696e14fe0e7c44de013bec39e..8b17c7c3948798326ed4732ca50ebd98b833401f 100644 (file)
@@ -305,7 +305,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 &&
@@ -319,6 +319,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;
                }
        }
index d342f733feb995cef5e541dda1aa18fc86996465..de4e3fe8ed5ac7a905071362d32d9a87a52b6731 100644 (file)
@@ -487,6 +487,8 @@ static int iris_vdec_process_streamon_output(struct iris_inst *inst)
        if (ret)
                return ret;
 
+       inst->last_buffer_dequeued = false;
+
        return iris_inst_change_sub_state(inst, clear_sub_state, 0);
 }