From 55370d45a76aad0f446163ae1ef528015bd1b136 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 24 Jan 2024 09:59:06 +0800 Subject: [PATCH] media: rockchip: isp: add rkisp_buf_dbg buf queue to set u64 data and buf done to check it. Change-Id: If8e2e1d2b2f782a84dbbfb08b70c497ad23fec4b Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture.c | 10 +++++-- .../media/platform/rockchip/isp/capture_v20.c | 7 ++++- .../media/platform/rockchip/isp/capture_v21.c | 7 ++++- .../media/platform/rockchip/isp/capture_v30.c | 7 ++++- .../media/platform/rockchip/isp/capture_v32.c | 4 +++ drivers/media/platform/rockchip/isp/common.h | 3 +- drivers/media/platform/rockchip/isp/dev.c | 4 +++ .../media/platform/rockchip/isp/isp_rockit.c | 28 +++++++++++++++---- 8 files changed, 58 insertions(+), 12 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 6ad7050b4922..99c26528fdfb 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -1597,13 +1597,19 @@ static void rkisp_buf_done_task(unsigned long arg) spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); while (!list_empty(&local_list)) { + u64 *data; + buf = list_first_entry(&local_list, struct rkisp_buffer, queue); list_del(&buf->queue); - + data = buf->vaddr[0]; v4l2_dbg(2, rkisp_debug, &stream->ispdev->v4l2_dev, - "stream:%d seq:%d buf:0x%x done\n", + "stream:%d seq:%d buf done:0x%x\n", stream->id, buf->vb.sequence, buf->buff_addr[0]); + if (rkisp_buf_dbg && data && *data == RKISP_DATA_CHECK) + v4l2_dbg(0, rkisp_debug, &stream->ispdev->v4l2_dev, + "seq:%d data no update:%llx %llx\n", + buf->vb.sequence, *data, *(data + 1)); vb2_buffer_done(&buf->vb.vb2_buf, stream->streaming ? VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR); } diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c index a349bdd3051c..e26109fa73ad 100644 --- a/drivers/media/platform/rockchip/isp/capture_v20.c +++ b/drivers/media/platform/rockchip/isp/capture_v20.c @@ -1638,7 +1638,12 @@ static void rkisp_buf_queue(struct vb2_buffer *vb) memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); for (i = 0; i < isp_fmt->mplanes; i++) { - vb2_plane_vaddr(vb, i); + ispbuf->vaddr[i] = vb2_plane_vaddr(vb, i); + if (rkisp_buf_dbg && ispbuf->vaddr[i]) { + u64 *data = ispbuf->vaddr[i]; + + *data = RKISP_DATA_CHECK; + } if (stream->ispdev->hw_dev->is_dma_sg_ops) { sgt = vb2_dma_sg_plane_desc(vb, i); ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl); diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index 7aeef9797a40..3c10ffe4cc0f 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -1574,7 +1574,12 @@ static void rkisp_buf_queue(struct vb2_buffer *vb) memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); for (i = 0; i < isp_fmt->mplanes; i++) { - vb2_plane_vaddr(vb, i); + ispbuf->vaddr[i] = vb2_plane_vaddr(vb, i); + if (rkisp_buf_dbg && ispbuf->vaddr[i]) { + u64 *data = ispbuf->vaddr[i]; + + *data = RKISP_DATA_CHECK; + } if (stream->ispdev->hw_dev->is_dma_sg_ops) { sgt = vb2_dma_sg_plane_desc(vb, i); ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl); diff --git a/drivers/media/platform/rockchip/isp/capture_v30.c b/drivers/media/platform/rockchip/isp/capture_v30.c index 78b06ec02b85..992378a87e67 100644 --- a/drivers/media/platform/rockchip/isp/capture_v30.c +++ b/drivers/media/platform/rockchip/isp/capture_v30.c @@ -1165,7 +1165,12 @@ static void rkisp_buf_queue(struct vb2_buffer *vb) memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); for (i = 0; i < isp_fmt->mplanes; i++) { - vb2_plane_vaddr(vb, i); + ispbuf->vaddr[i] = vb2_plane_vaddr(vb, i); + if (rkisp_buf_dbg && ispbuf->vaddr[i]) { + u64 *data = ispbuf->vaddr[i]; + + *data = RKISP_DATA_CHECK; + } if (stream->ispdev->hw_dev->is_dma_sg_ops) { sgt = vb2_dma_sg_plane_desc(vb, i); ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl); diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index bbc946105e71..760414ab20fb 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1667,7 +1667,11 @@ static void rkisp_buf_queue(struct vb2_buffer *vb) memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); for (i = 0; i < isp_fmt->mplanes; i++) { ispbuf->vaddr[i] = vb2_plane_vaddr(vb, i); + if (rkisp_buf_dbg && ispbuf->vaddr[i]) { + u64 *data = ispbuf->vaddr[i]; + *data = RKISP_DATA_CHECK; + } if (stream->ispdev->hw_dev->is_dma_sg_ops) { sgt = vb2_dma_sg_plane_desc(vb, i); ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl); diff --git a/drivers/media/platform/rockchip/isp/common.h b/drivers/media/platform/rockchip/isp/common.h index ebd4095bb34e..7f6e41e699b6 100644 --- a/drivers/media/platform/rockchip/isp/common.h +++ b/drivers/media/platform/rockchip/isp/common.h @@ -57,7 +57,7 @@ #define RKISP_PLANE_CR 2 #define RKISP_EMDDATA_FIFO_MAX 4 -#define RKISP_DMATX_CHECK 0xA5A5A5A5 +#define RKISP_DATA_CHECK 0xA5A5A5A5 #define RKISP_MOTION_DECT_TS_SIZE 16 @@ -137,6 +137,7 @@ struct rkisp_dummy_buffer { extern int rkisp_debug; extern bool rkisp_monitor; extern bool rkisp_irq_dbg; +extern bool rkisp_buf_dbg; extern u64 rkisp_debug_reg; extern struct platform_driver rkisp_plat_drv; diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c index a913914439f7..fd10c6898e8b 100644 --- a/drivers/media/platform/rockchip/isp/dev.c +++ b/drivers/media/platform/rockchip/isp/dev.c @@ -67,6 +67,10 @@ bool rkisp_irq_dbg; module_param_named(irq_dbg, rkisp_irq_dbg, bool, 0644); MODULE_PARM_DESC(irq_dbg, "rkisp interrupt runtime"); +bool rkisp_buf_dbg; +module_param_named(buf_dbg, rkisp_buf_dbg, bool, 0644); +MODULE_PARM_DESC(buf_dbg, "rkisp check output buf"); + static bool rkisp_rdbk_auto; module_param_named(rdbk_auto, rkisp_rdbk_auto, bool, 0644); MODULE_PARM_DESC(irq_dbg, "rkisp and vicap auto readback mode"); diff --git a/drivers/media/platform/rockchip/isp/isp_rockit.c b/drivers/media/platform/rockchip/isp/isp_rockit.c index 9c155d0973ef..67e7c615b0b2 100644 --- a/drivers/media/platform/rockchip/isp/isp_rockit.c +++ b/drivers/media/platform/rockchip/isp/isp_rockit.c @@ -20,10 +20,8 @@ struct rkisp_rockit_buffer { void *mpi_buf; struct list_head queue; int buf_id; - union { - u32 buff_addr; - void *vaddr; - }; + u32 buff_addr; + void *vaddr; }; static struct rkisp_stream *rkisp_rockit_get_stream(struct rockit_cfg *input_rockit_cfg) @@ -158,6 +156,14 @@ int rkisp_rockit_buf_queue(struct rockit_cfg *input_rockit_cfg) } else { isprk_buf->buff_addr = *((u32 *)g_ops->cookie(mem)); } + if (rkisp_buf_dbg) { + u64 *data; + + isprk_buf->vaddr = g_ops->vaddr(mem); + data = isprk_buf->vaddr; + if (data) + *data = RKISP_DATA_CHECK; + } get_dma_buf(input_rockit_cfg->buf); isprk_buf->mpi_mem = mem; @@ -232,10 +238,19 @@ int rkisp_rockit_buf_done(struct rkisp_stream *stream, int cmd) rockit_cfg->frame.u32TimeRef = stream->curr_buf->vb.sequence; v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, - "%s stream:%d seq:%d buf:0x%x done\n", - __func__, stream->id, + "stream:%d seq:%d rockit buf done:0x%x\n", + stream->id, stream->curr_buf->vb.sequence, stream->curr_buf->buff_addr[0]); + if (rkisp_buf_dbg) { + u64 *data = isprk_buf->vaddr; + + if (data && *data == RKISP_DATA_CHECK) + v4l2_info(&dev->v4l2_dev, + "rockit seq:%d data no update:%llx %llx\n", + stream->curr_buf->vb.sequence, + *data, *(data + 1)); + } } else { if (stream->ispdev->cap_dev.wrap_line && stream->id == RKISP_STREAM_MP) { @@ -495,6 +510,7 @@ int rkisp_rockit_buf_free(struct rkisp_stream *stream) g_ops->unmap_dmabuf(isprk_buf->mpi_mem); g_ops->detach_dmabuf(isprk_buf->mpi_mem); dma_buf_put(isprk_buf->dmabuf); + isprk_buf->vaddr = NULL; } kfree(stream_cfg->rkisp_buff[i]); stream_cfg->rkisp_buff[i] = NULL;