forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/drivers/media/platform/rockchip/isp/isp_stats.c
....@@ -5,12 +5,15 @@
55 #include <media/v4l2-common.h>
66 #include <media/v4l2-ioctl.h>
77 #include <media/videobuf2-core.h>
8
+#include <media/videobuf2-dma-sg.h>
89 #include <media/videobuf2-vmalloc.h> /* for ISP statistics */
910 #include "dev.h"
1011 #include "isp_stats.h"
1112 #include "isp_stats_v1x.h"
1213 #include "isp_stats_v2x.h"
1314 #include "isp_stats_v21.h"
15
+#include "isp_stats_v3x.h"
16
+#include "isp_stats_v32.h"
1417
1518 #define STATS_NAME DRIVER_NAME "-statistics"
1619 #define RKISP_ISP_STATS_REQ_BUFS_MIN 2
....@@ -85,9 +88,12 @@
8588 struct rkisp_isp_stats_vdev *stats = video_drvdata(filp);
8689 int ret;
8790
91
+ if (!stats->dev->is_probe_end)
92
+ return -EINVAL;
93
+
8894 ret = v4l2_fh_open(filp);
8995 if (!ret) {
90
- ret = v4l2_pipeline_pm_use(&stats->vnode.vdev.entity, 1);
96
+ ret = v4l2_pipeline_pm_get(&stats->vnode.vdev.entity);
9197 if (ret < 0)
9298 vb2_fop_release(filp);
9399 }
....@@ -101,12 +107,8 @@
101107 int ret;
102108
103109 ret = vb2_fop_release(file);
104
- if (!ret) {
105
- ret = v4l2_pipeline_pm_use(&stats->vnode.vdev.entity, 0);
106
- if (ret < 0)
107
- v4l2_err(&stats->dev->v4l2_dev,
108
- "set pipeline power failed %d\n", ret);
109
- }
110
+ if (!ret)
111
+ v4l2_pipeline_pm_put(&stats->vnode.vdev.entity);
110112 return ret;
111113 }
112114
....@@ -131,13 +133,7 @@
131133 *num_buffers = clamp_t(u32, *num_buffers, RKISP_ISP_STATS_REQ_BUFS_MIN,
132134 RKISP_ISP_STATS_REQ_BUFS_MAX);
133135
134
- if (stats_vdev->dev->isp_ver <= ISP_V13)
135
- sizes[0] = sizeof(struct rkisp1_stat_buffer);
136
- else if (stats_vdev->dev->isp_ver == ISP_V21)
137
- sizes[0] = sizeof(struct isp21_stat);
138
- else
139
- sizes[0] = sizeof(struct isp2x_stat);
140
-
136
+ sizes[0] = stats_vdev->vdev_fmt.fmt.meta.buffersize;
141137 INIT_LIST_HEAD(&stats_vdev->stat);
142138
143139 return 0;
....@@ -149,11 +145,34 @@
149145 struct rkisp_buffer *stats_buf = to_rkisp_buffer(vbuf);
150146 struct vb2_queue *vq = vb->vb2_queue;
151147 struct rkisp_isp_stats_vdev *stats_dev = vq->drv_priv;
148
+ u32 size = stats_dev->vdev_fmt.fmt.meta.buffersize;
152149 unsigned long flags;
153150
154151 stats_buf->vaddr[0] = vb2_plane_vaddr(vb, 0);
152
+ if (stats_dev->dev->isp_ver == ISP_V32) {
153
+ struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, 0);
155154
155
+ stats_buf->buff_addr[0] = sg_dma_address(sgt->sgl);
156
+ }
157
+ if (stats_buf->vaddr[0])
158
+ memset(stats_buf->vaddr[0], 0, size);
156159 spin_lock_irqsave(&stats_dev->rd_lock, flags);
160
+ if (stats_dev->dev->isp_ver == ISP_V32 && stats_dev->dev->is_pre_on) {
161
+ struct rkisp32_isp_stat_buffer *buf = stats_dev->stats_buf[0].vaddr;
162
+
163
+ if (buf && !buf->frame_id && buf->meas_type && stats_buf->vaddr[0]) {
164
+ dev_info(stats_dev->dev->dev,
165
+ "tb stat seq:%d meas_type:0x%x\n",
166
+ buf->frame_id, buf->meas_type);
167
+ memcpy(stats_buf->vaddr[0], buf, sizeof(struct rkisp32_isp_stat_buffer));
168
+ buf->meas_type = 0;
169
+ vb2_set_plane_payload(vb, 0, sizeof(struct rkisp32_isp_stat_buffer));
170
+ vbuf->sequence = buf->frame_id;
171
+ spin_unlock_irqrestore(&stats_dev->rd_lock, flags);
172
+ vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
173
+ return;
174
+ }
175
+ }
157176 list_add_tail(&stats_buf->queue, &stats_dev->stat);
158177 spin_unlock_irqrestore(&stats_dev->rd_lock, flags);
159178 }
....@@ -181,9 +200,20 @@
181200 list_del(&buf->queue);
182201 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
183202 }
184
- if (stats_vdev->cur_buf)
203
+ if (stats_vdev->cur_buf) {
185204 vb2_buffer_done(&stats_vdev->cur_buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
205
+ if (stats_vdev->cur_buf == stats_vdev->nxt_buf)
206
+ stats_vdev->nxt_buf = NULL;
207
+ stats_vdev->cur_buf = NULL;
208
+ }
209
+ if (stats_vdev->nxt_buf) {
210
+ vb2_buffer_done(&stats_vdev->nxt_buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
211
+ stats_vdev->nxt_buf = NULL;
212
+ }
186213 spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
214
+
215
+ stats_vdev->ae_meas_done_next = false;
216
+ stats_vdev->af_meas_done_next = false;
187217 }
188218
189219 static int
....@@ -192,6 +222,7 @@
192222 {
193223 struct rkisp_isp_stats_vdev *stats_vdev = queue->drv_priv;
194224
225
+ stats_vdev->rdbk_drop = false;
195226 stats_vdev->cur_buf = NULL;
196227 stats_vdev->ops->rdbk_enable(stats_vdev, false);
197228 stats_vdev->streamon = true;
....@@ -217,12 +248,17 @@
217248 q->io_modes = VB2_MMAP | VB2_USERPTR;
218249 q->drv_priv = stats_vdev;
219250 q->ops = &rkisp_stats_vb2_ops;
220
- q->mem_ops = &vb2_vmalloc_memops;
251
+ if (stats_vdev->dev->isp_ver == ISP_V32) {
252
+ q->mem_ops = stats_vdev->dev->hw_dev->mem_ops;
253
+ if (stats_vdev->dev->hw_dev->is_dma_contig)
254
+ q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
255
+ } else {
256
+ q->mem_ops = &vb2_vmalloc_memops;
257
+ }
221258 q->buf_struct_size = sizeof(struct rkisp_buffer);
222259 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
223260 q->lock = &stats_vdev->dev->iqlock;
224261 q->dev = stats_vdev->dev->dev;
225
-
226262 return vb2_queue_init(q);
227263 }
228264
....@@ -250,17 +286,16 @@
250286 stats_vdev->wr_buf_idx = 0;
251287 memset(stats_vdev->stats_buf, 0, sizeof(stats_vdev->stats_buf));
252288
253
- stats_vdev->vdev_fmt.fmt.meta.dataformat =
254
- V4L2_META_FMT_RK_ISP1_STAT_3A;
255
- stats_vdev->vdev_fmt.fmt.meta.buffersize =
256
- sizeof(struct rkisp1_stat_buffer);
257
-
258289 if (stats_vdev->dev->isp_ver <= ISP_V13)
259290 rkisp_init_stats_vdev_v1x(stats_vdev);
260291 else if (stats_vdev->dev->isp_ver == ISP_V21)
261292 rkisp_init_stats_vdev_v21(stats_vdev);
262
- else
293
+ else if (stats_vdev->dev->isp_ver == ISP_V20)
263294 rkisp_init_stats_vdev_v2x(stats_vdev);
295
+ else if (stats_vdev->dev->isp_ver == ISP_V30)
296
+ rkisp_init_stats_vdev_v3x(stats_vdev);
297
+ else
298
+ rkisp_init_stats_vdev_v32(stats_vdev);
264299 }
265300
266301 static void rkisp_uninit_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev)
....@@ -269,8 +304,12 @@
269304 rkisp_uninit_stats_vdev_v1x(stats_vdev);
270305 else if (stats_vdev->dev->isp_ver == ISP_V21)
271306 rkisp_uninit_stats_vdev_v21(stats_vdev);
272
- else
307
+ else if (stats_vdev->dev->isp_ver == ISP_V20)
273308 rkisp_uninit_stats_vdev_v2x(stats_vdev);
309
+ else if (stats_vdev->dev->isp_ver == ISP_V30)
310
+ rkisp_uninit_stats_vdev_v3x(stats_vdev);
311
+ else
312
+ rkisp_uninit_stats_vdev_v32(stats_vdev);
274313 }
275314
276315 void rkisp_stats_rdbk_enable(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
....@@ -284,6 +323,16 @@
284323 rkisp_stats_first_ddr_config_v2x(stats_vdev);
285324 else if (stats_vdev->dev->isp_ver == ISP_V21)
286325 rkisp_stats_first_ddr_config_v21(stats_vdev);
326
+ else if (stats_vdev->dev->isp_ver == ISP_V30)
327
+ rkisp_stats_first_ddr_config_v3x(stats_vdev);
328
+ else if (stats_vdev->dev->isp_ver == ISP_V32)
329
+ rkisp_stats_first_ddr_config_v32(stats_vdev);
330
+}
331
+
332
+void rkisp_stats_next_ddr_config(struct rkisp_isp_stats_vdev *stats_vdev)
333
+{
334
+ if (stats_vdev->dev->isp_ver == ISP_V32)
335
+ rkisp_stats_next_ddr_config_v32(stats_vdev);
287336 }
288337
289338 void rkisp_stats_isr(struct rkisp_isp_stats_vdev *stats_vdev,
....@@ -325,7 +374,7 @@
325374 if (ret < 0)
326375 goto err_release_queue;
327376
328
- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
377
+ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
329378 if (ret < 0) {
330379 dev_err(&vdev->dev,
331380 "could not register Video for Linux device\n");