From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 03 Jan 2024 09:43:39 +0000
Subject: [PATCH] update kernel to 5.10.198

---
 kernel/drivers/media/platform/rockchip/isp/isp_stats.c |   98 ++++++++++++++++++++++++++++++++++++------------
 1 files changed, 73 insertions(+), 25 deletions(-)

diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_stats.c b/kernel/drivers/media/platform/rockchip/isp/isp_stats.c
index 23f6455..d95315e 100644
--- a/kernel/drivers/media/platform/rockchip/isp/isp_stats.c
+++ b/kernel/drivers/media/platform/rockchip/isp/isp_stats.c
@@ -5,12 +5,15 @@
 #include <media/v4l2-common.h>
 #include <media/v4l2-ioctl.h>
 #include <media/videobuf2-core.h>
+#include <media/videobuf2-dma-sg.h>
 #include <media/videobuf2-vmalloc.h>	/* for ISP statistics */
 #include "dev.h"
 #include "isp_stats.h"
 #include "isp_stats_v1x.h"
 #include "isp_stats_v2x.h"
 #include "isp_stats_v21.h"
+#include "isp_stats_v3x.h"
+#include "isp_stats_v32.h"
 
 #define STATS_NAME DRIVER_NAME "-statistics"
 #define RKISP_ISP_STATS_REQ_BUFS_MIN 2
@@ -85,9 +88,12 @@
 	struct rkisp_isp_stats_vdev *stats = video_drvdata(filp);
 	int ret;
 
+	if (!stats->dev->is_probe_end)
+		return -EINVAL;
+
 	ret = v4l2_fh_open(filp);
 	if (!ret) {
-		ret = v4l2_pipeline_pm_use(&stats->vnode.vdev.entity, 1);
+		ret = v4l2_pipeline_pm_get(&stats->vnode.vdev.entity);
 		if (ret < 0)
 			vb2_fop_release(filp);
 	}
@@ -101,12 +107,8 @@
 	int ret;
 
 	ret = vb2_fop_release(file);
-	if (!ret) {
-		ret = v4l2_pipeline_pm_use(&stats->vnode.vdev.entity, 0);
-		if (ret < 0)
-			v4l2_err(&stats->dev->v4l2_dev,
-				 "set pipeline power failed %d\n", ret);
-	}
+	if (!ret)
+		v4l2_pipeline_pm_put(&stats->vnode.vdev.entity);
 	return ret;
 }
 
@@ -131,13 +133,7 @@
 	*num_buffers = clamp_t(u32, *num_buffers, RKISP_ISP_STATS_REQ_BUFS_MIN,
 			       RKISP_ISP_STATS_REQ_BUFS_MAX);
 
-	if (stats_vdev->dev->isp_ver <= ISP_V13)
-		sizes[0] = sizeof(struct rkisp1_stat_buffer);
-	else if (stats_vdev->dev->isp_ver == ISP_V21)
-		sizes[0] = sizeof(struct isp21_stat);
-	else
-		sizes[0] = sizeof(struct isp2x_stat);
-
+	sizes[0] = stats_vdev->vdev_fmt.fmt.meta.buffersize;
 	INIT_LIST_HEAD(&stats_vdev->stat);
 
 	return 0;
@@ -149,11 +145,34 @@
 	struct rkisp_buffer *stats_buf = to_rkisp_buffer(vbuf);
 	struct vb2_queue *vq = vb->vb2_queue;
 	struct rkisp_isp_stats_vdev *stats_dev = vq->drv_priv;
+	u32 size = stats_dev->vdev_fmt.fmt.meta.buffersize;
 	unsigned long flags;
 
 	stats_buf->vaddr[0] = vb2_plane_vaddr(vb, 0);
+	if (stats_dev->dev->isp_ver == ISP_V32) {
+		struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, 0);
 
+		stats_buf->buff_addr[0] = sg_dma_address(sgt->sgl);
+	}
+	if (stats_buf->vaddr[0])
+		memset(stats_buf->vaddr[0], 0, size);
 	spin_lock_irqsave(&stats_dev->rd_lock, flags);
+	if (stats_dev->dev->isp_ver == ISP_V32 && stats_dev->dev->is_pre_on) {
+		struct rkisp32_isp_stat_buffer *buf = stats_dev->stats_buf[0].vaddr;
+
+		if (buf && !buf->frame_id && buf->meas_type && stats_buf->vaddr[0]) {
+			dev_info(stats_dev->dev->dev,
+				 "tb stat seq:%d meas_type:0x%x\n",
+				 buf->frame_id, buf->meas_type);
+			memcpy(stats_buf->vaddr[0], buf, sizeof(struct rkisp32_isp_stat_buffer));
+			buf->meas_type = 0;
+			vb2_set_plane_payload(vb, 0, sizeof(struct rkisp32_isp_stat_buffer));
+			vbuf->sequence = buf->frame_id;
+			spin_unlock_irqrestore(&stats_dev->rd_lock, flags);
+			vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
+			return;
+		}
+	}
 	list_add_tail(&stats_buf->queue, &stats_dev->stat);
 	spin_unlock_irqrestore(&stats_dev->rd_lock, flags);
 }
@@ -181,9 +200,20 @@
 		list_del(&buf->queue);
 		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
 	}
-	if (stats_vdev->cur_buf)
+	if (stats_vdev->cur_buf) {
 		vb2_buffer_done(&stats_vdev->cur_buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
+		if (stats_vdev->cur_buf == stats_vdev->nxt_buf)
+			stats_vdev->nxt_buf = NULL;
+		stats_vdev->cur_buf = NULL;
+	}
+	if (stats_vdev->nxt_buf) {
+		vb2_buffer_done(&stats_vdev->nxt_buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
+		stats_vdev->nxt_buf = NULL;
+	}
 	spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
+
+	stats_vdev->ae_meas_done_next = false;
+	stats_vdev->af_meas_done_next = false;
 }
 
 static int
@@ -217,12 +247,17 @@
 	q->io_modes = VB2_MMAP | VB2_USERPTR;
 	q->drv_priv = stats_vdev;
 	q->ops = &rkisp_stats_vb2_ops;
-	q->mem_ops = &vb2_vmalloc_memops;
+	if (stats_vdev->dev->isp_ver == ISP_V32) {
+		q->mem_ops = stats_vdev->dev->hw_dev->mem_ops;
+		if (stats_vdev->dev->hw_dev->is_dma_contig)
+			q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
+	} else {
+		q->mem_ops = &vb2_vmalloc_memops;
+	}
 	q->buf_struct_size = sizeof(struct rkisp_buffer);
 	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 	q->lock = &stats_vdev->dev->iqlock;
 	q->dev = stats_vdev->dev->dev;
-
 	return vb2_queue_init(q);
 }
 
@@ -250,17 +285,16 @@
 	stats_vdev->wr_buf_idx = 0;
 	memset(stats_vdev->stats_buf, 0, sizeof(stats_vdev->stats_buf));
 
-	stats_vdev->vdev_fmt.fmt.meta.dataformat =
-		V4L2_META_FMT_RK_ISP1_STAT_3A;
-	stats_vdev->vdev_fmt.fmt.meta.buffersize =
-		sizeof(struct rkisp1_stat_buffer);
-
 	if (stats_vdev->dev->isp_ver <= ISP_V13)
 		rkisp_init_stats_vdev_v1x(stats_vdev);
 	else if (stats_vdev->dev->isp_ver == ISP_V21)
 		rkisp_init_stats_vdev_v21(stats_vdev);
-	else
+	else if (stats_vdev->dev->isp_ver == ISP_V20)
 		rkisp_init_stats_vdev_v2x(stats_vdev);
+	else if (stats_vdev->dev->isp_ver == ISP_V30)
+		rkisp_init_stats_vdev_v3x(stats_vdev);
+	else
+		rkisp_init_stats_vdev_v32(stats_vdev);
 }
 
 static void rkisp_uninit_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev)
@@ -269,8 +303,12 @@
 		rkisp_uninit_stats_vdev_v1x(stats_vdev);
 	else if (stats_vdev->dev->isp_ver == ISP_V21)
 		rkisp_uninit_stats_vdev_v21(stats_vdev);
-	else
+	else if (stats_vdev->dev->isp_ver == ISP_V20)
 		rkisp_uninit_stats_vdev_v2x(stats_vdev);
+	else if (stats_vdev->dev->isp_ver == ISP_V30)
+		rkisp_uninit_stats_vdev_v3x(stats_vdev);
+	else
+		rkisp_uninit_stats_vdev_v32(stats_vdev);
 }
 
 void rkisp_stats_rdbk_enable(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
@@ -284,6 +322,16 @@
 		rkisp_stats_first_ddr_config_v2x(stats_vdev);
 	else if (stats_vdev->dev->isp_ver == ISP_V21)
 		rkisp_stats_first_ddr_config_v21(stats_vdev);
+	else if (stats_vdev->dev->isp_ver == ISP_V30)
+		rkisp_stats_first_ddr_config_v3x(stats_vdev);
+	else if (stats_vdev->dev->isp_ver == ISP_V32)
+		rkisp_stats_first_ddr_config_v32(stats_vdev);
+}
+
+void rkisp_stats_next_ddr_config(struct rkisp_isp_stats_vdev *stats_vdev)
+{
+	if (stats_vdev->dev->isp_ver == ISP_V32)
+		rkisp_stats_next_ddr_config_v32(stats_vdev);
 }
 
 void rkisp_stats_isr(struct rkisp_isp_stats_vdev *stats_vdev,
@@ -325,7 +373,7 @@
 	if (ret < 0)
 		goto err_release_queue;
 
-	ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
+	ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
 	if (ret < 0) {
 		dev_err(&vdev->dev,
 			"could not register Video for Linux device\n");

--
Gitblit v1.6.2