forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
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
....@@ -217,12 +247,17 @@
217247 q->io_modes = VB2_MMAP | VB2_USERPTR;
218248 q->drv_priv = stats_vdev;
219249 q->ops = &rkisp_stats_vb2_ops;
220
- q->mem_ops = &vb2_vmalloc_memops;
250
+ if (stats_vdev->dev->isp_ver == ISP_V32) {
251
+ q->mem_ops = stats_vdev->dev->hw_dev->mem_ops;
252
+ if (stats_vdev->dev->hw_dev->is_dma_contig)
253
+ q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
254
+ } else {
255
+ q->mem_ops = &vb2_vmalloc_memops;
256
+ }
221257 q->buf_struct_size = sizeof(struct rkisp_buffer);
222258 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
223259 q->lock = &stats_vdev->dev->iqlock;
224260 q->dev = stats_vdev->dev->dev;
225
-
226261 return vb2_queue_init(q);
227262 }
228263
....@@ -250,17 +285,16 @@
250285 stats_vdev->wr_buf_idx = 0;
251286 memset(stats_vdev->stats_buf, 0, sizeof(stats_vdev->stats_buf));
252287
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
-
258288 if (stats_vdev->dev->isp_ver <= ISP_V13)
259289 rkisp_init_stats_vdev_v1x(stats_vdev);
260290 else if (stats_vdev->dev->isp_ver == ISP_V21)
261291 rkisp_init_stats_vdev_v21(stats_vdev);
262
- else
292
+ else if (stats_vdev->dev->isp_ver == ISP_V20)
263293 rkisp_init_stats_vdev_v2x(stats_vdev);
294
+ else if (stats_vdev->dev->isp_ver == ISP_V30)
295
+ rkisp_init_stats_vdev_v3x(stats_vdev);
296
+ else
297
+ rkisp_init_stats_vdev_v32(stats_vdev);
264298 }
265299
266300 static void rkisp_uninit_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev)
....@@ -269,8 +303,12 @@
269303 rkisp_uninit_stats_vdev_v1x(stats_vdev);
270304 else if (stats_vdev->dev->isp_ver == ISP_V21)
271305 rkisp_uninit_stats_vdev_v21(stats_vdev);
272
- else
306
+ else if (stats_vdev->dev->isp_ver == ISP_V20)
273307 rkisp_uninit_stats_vdev_v2x(stats_vdev);
308
+ else if (stats_vdev->dev->isp_ver == ISP_V30)
309
+ rkisp_uninit_stats_vdev_v3x(stats_vdev);
310
+ else
311
+ rkisp_uninit_stats_vdev_v32(stats_vdev);
274312 }
275313
276314 void rkisp_stats_rdbk_enable(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
....@@ -284,6 +322,16 @@
284322 rkisp_stats_first_ddr_config_v2x(stats_vdev);
285323 else if (stats_vdev->dev->isp_ver == ISP_V21)
286324 rkisp_stats_first_ddr_config_v21(stats_vdev);
325
+ else if (stats_vdev->dev->isp_ver == ISP_V30)
326
+ rkisp_stats_first_ddr_config_v3x(stats_vdev);
327
+ else if (stats_vdev->dev->isp_ver == ISP_V32)
328
+ rkisp_stats_first_ddr_config_v32(stats_vdev);
329
+}
330
+
331
+void rkisp_stats_next_ddr_config(struct rkisp_isp_stats_vdev *stats_vdev)
332
+{
333
+ if (stats_vdev->dev->isp_ver == ISP_V32)
334
+ rkisp_stats_next_ddr_config_v32(stats_vdev);
287335 }
288336
289337 void rkisp_stats_isr(struct rkisp_isp_stats_vdev *stats_vdev,
....@@ -325,7 +373,7 @@
325373 if (ret < 0)
326374 goto err_release_queue;
327375
328
- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
376
+ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
329377 if (ret < 0) {
330378 dev_err(&vdev->dev,
331379 "could not register Video for Linux device\n");