[PATCH 04/25] media: iris: Fix buffer timestamp handling

Dikshita Agarwal posted 25 patches 3 months ago
There is a newer version of this series
[PATCH 04/25] media: iris: Fix buffer timestamp handling
Posted by Dikshita Agarwal 3 months ago
The internal driver logic operates with timestamps in microseconds
while the buffer timestamp received by vb2 is in nanosecond, this
mismatch in units causing issue in buffer handling.
Update the timestamp handling logic by converting the buffer timestamp
to microseconds before using it internally in driver for all the
timestamp assignments, comparisons, and metadata handling.

Fixes: 17f2a485ca67 ("media: iris: implement vb2 ops for buf_queue and firmware response")
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
---
 drivers/media/platform/qcom/iris/iris_buffer.c | 6 +++---
 drivers/media/platform/qcom/iris/iris_vdec.c   | 1 +
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
index 9f664c241149362d44d3a8fa65e2266f9c2e80e0..809ce77744f996c23dc07ef9ecb3e8e92b709850 100644
--- a/drivers/media/platform/qcom/iris/iris_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_buffer.c
@@ -579,14 +579,14 @@ iris_helper_find_buf(struct iris_inst *inst, u32 type, u32 idx)
 		return v4l2_m2m_dst_buf_remove_by_idx(m2m_ctx, idx);
 }
 
-static void iris_get_ts_metadata(struct iris_inst *inst, u64 timestamp_ns,
+static void iris_get_ts_metadata(struct iris_inst *inst, u64 timestamp_us,
 				 struct vb2_v4l2_buffer *vbuf)
 {
 	u32 mask = V4L2_BUF_FLAG_TIMECODE | V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
 	u32 i;
 
 	for (i = 0; i < ARRAY_SIZE(inst->tss); ++i) {
-		if (inst->tss[i].ts_ns != timestamp_ns)
+		if (inst->tss[i].ts_us != timestamp_us)
 			continue;
 
 		vbuf->flags &= ~mask;
@@ -653,7 +653,7 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
 	}
 
 	state = VB2_BUF_STATE_DONE;
-	vb2->timestamp = buf->timestamp;
+	vb2->timestamp = buf->timestamp * NSEC_PER_USEC;
 	v4l2_m2m_buf_done(vbuf, state);
 
 	return 0;
diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
index d670b51c5839d1fad54d34f373cf71d5f3973a96..05340e201e6538b9599387cdd57814005b904e76 100644
--- a/drivers/media/platform/qcom/iris/iris_vdec.c
+++ b/drivers/media/platform/qcom/iris/iris_vdec.c
@@ -561,6 +561,7 @@ iris_vdec_vb2_buffer_to_driver(struct vb2_buffer *vb2, struct iris_buffer *buf)
 	buf->data_size = vb2->planes[0].bytesused - vb2->planes[0].data_offset;
 	buf->flags = vbuf->flags;
 	buf->timestamp = vb2->timestamp;
+	do_div(buf->timestamp, NSEC_PER_USEC);
 	buf->attr = 0;
 
 	return 0;

-- 
2.34.1
Re: [PATCH 04/25] media: iris: Fix buffer timestamp handling
Posted by Vikash Garodia 2 months, 3 weeks ago
On 7/4/2025 1:23 PM, Dikshita Agarwal wrote:
> The internal driver logic operates with timestamps in microseconds
> while the buffer timestamp received by vb2 is in nanosecond, this
> mismatch in units causing issue in buffer handling.
> Update the timestamp handling logic by converting the buffer timestamp
> to microseconds before using it internally in driver for all the
> timestamp assignments, comparisons, and metadata handling.
> 
> Fixes: 17f2a485ca67 ("media: iris: implement vb2 ops for buf_queue and firmware response")
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
>  drivers/media/platform/qcom/iris/iris_buffer.c | 6 +++---
>  drivers/media/platform/qcom/iris/iris_vdec.c   | 1 +
>  2 files changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media/platform/qcom/iris/iris_buffer.c
> index 9f664c241149362d44d3a8fa65e2266f9c2e80e0..809ce77744f996c23dc07ef9ecb3e8e92b709850 100644
> --- a/drivers/media/platform/qcom/iris/iris_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_buffer.c
> @@ -579,14 +579,14 @@ iris_helper_find_buf(struct iris_inst *inst, u32 type, u32 idx)
>  		return v4l2_m2m_dst_buf_remove_by_idx(m2m_ctx, idx);
>  }
>  
> -static void iris_get_ts_metadata(struct iris_inst *inst, u64 timestamp_ns,
> +static void iris_get_ts_metadata(struct iris_inst *inst, u64 timestamp_us,
>  				 struct vb2_v4l2_buffer *vbuf)
>  {
>  	u32 mask = V4L2_BUF_FLAG_TIMECODE | V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
>  	u32 i;
>  
>  	for (i = 0; i < ARRAY_SIZE(inst->tss); ++i) {
> -		if (inst->tss[i].ts_ns != timestamp_ns)
> +		if (inst->tss[i].ts_us != timestamp_us)
>  			continue;
>  
>  		vbuf->flags &= ~mask;
> @@ -653,7 +653,7 @@ int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf)
>  	}
>  
>  	state = VB2_BUF_STATE_DONE;
> -	vb2->timestamp = buf->timestamp;
> +	vb2->timestamp = buf->timestamp * NSEC_PER_USEC;
>  	v4l2_m2m_buf_done(vbuf, state);
>  
>  	return 0;
> diff --git a/drivers/media/platform/qcom/iris/iris_vdec.c b/drivers/media/platform/qcom/iris/iris_vdec.c
> index d670b51c5839d1fad54d34f373cf71d5f3973a96..05340e201e6538b9599387cdd57814005b904e76 100644
> --- a/drivers/media/platform/qcom/iris/iris_vdec.c
> +++ b/drivers/media/platform/qcom/iris/iris_vdec.c
> @@ -561,6 +561,7 @@ iris_vdec_vb2_buffer_to_driver(struct vb2_buffer *vb2, struct iris_buffer *buf)
>  	buf->data_size = vb2->planes[0].bytesused - vb2->planes[0].data_offset;
>  	buf->flags = vbuf->flags;
>  	buf->timestamp = vb2->timestamp;
> +	do_div(buf->timestamp, NSEC_PER_USEC);
>  	buf->attr = 0;
>  
>  	return 0;
> 

Reviewed-by: Vikash Garodia <quic_vgarodia@quicinc.com>