.. | .. |
---|
5 | 5 | #include <media/v4l2-common.h> |
---|
6 | 6 | #include <media/v4l2-ioctl.h> |
---|
7 | 7 | #include <media/videobuf2-core.h> |
---|
| 8 | +#include <media/videobuf2-dma-sg.h> |
---|
8 | 9 | #include <media/videobuf2-vmalloc.h> /* for ISP statistics */ |
---|
9 | 10 | #include "dev.h" |
---|
10 | 11 | #include "isp_stats.h" |
---|
11 | 12 | #include "isp_stats_v1x.h" |
---|
12 | 13 | #include "isp_stats_v2x.h" |
---|
13 | 14 | #include "isp_stats_v21.h" |
---|
| 15 | +#include "isp_stats_v3x.h" |
---|
| 16 | +#include "isp_stats_v32.h" |
---|
14 | 17 | |
---|
15 | 18 | #define STATS_NAME DRIVER_NAME "-statistics" |
---|
16 | 19 | #define RKISP_ISP_STATS_REQ_BUFS_MIN 2 |
---|
.. | .. |
---|
85 | 88 | struct rkisp_isp_stats_vdev *stats = video_drvdata(filp); |
---|
86 | 89 | int ret; |
---|
87 | 90 | |
---|
| 91 | + if (!stats->dev->is_probe_end) |
---|
| 92 | + return -EINVAL; |
---|
| 93 | + |
---|
88 | 94 | ret = v4l2_fh_open(filp); |
---|
89 | 95 | if (!ret) { |
---|
90 | | - ret = v4l2_pipeline_pm_use(&stats->vnode.vdev.entity, 1); |
---|
| 96 | + ret = v4l2_pipeline_pm_get(&stats->vnode.vdev.entity); |
---|
91 | 97 | if (ret < 0) |
---|
92 | 98 | vb2_fop_release(filp); |
---|
93 | 99 | } |
---|
.. | .. |
---|
101 | 107 | int ret; |
---|
102 | 108 | |
---|
103 | 109 | 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); |
---|
110 | 112 | return ret; |
---|
111 | 113 | } |
---|
112 | 114 | |
---|
.. | .. |
---|
131 | 133 | *num_buffers = clamp_t(u32, *num_buffers, RKISP_ISP_STATS_REQ_BUFS_MIN, |
---|
132 | 134 | RKISP_ISP_STATS_REQ_BUFS_MAX); |
---|
133 | 135 | |
---|
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; |
---|
141 | 137 | INIT_LIST_HEAD(&stats_vdev->stat); |
---|
142 | 138 | |
---|
143 | 139 | return 0; |
---|
.. | .. |
---|
149 | 145 | struct rkisp_buffer *stats_buf = to_rkisp_buffer(vbuf); |
---|
150 | 146 | struct vb2_queue *vq = vb->vb2_queue; |
---|
151 | 147 | struct rkisp_isp_stats_vdev *stats_dev = vq->drv_priv; |
---|
| 148 | + u32 size = stats_dev->vdev_fmt.fmt.meta.buffersize; |
---|
152 | 149 | unsigned long flags; |
---|
153 | 150 | |
---|
154 | 151 | 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); |
---|
155 | 154 | |
---|
| 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); |
---|
156 | 159 | 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 | + } |
---|
157 | 176 | list_add_tail(&stats_buf->queue, &stats_dev->stat); |
---|
158 | 177 | spin_unlock_irqrestore(&stats_dev->rd_lock, flags); |
---|
159 | 178 | } |
---|
.. | .. |
---|
181 | 200 | list_del(&buf->queue); |
---|
182 | 201 | vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); |
---|
183 | 202 | } |
---|
184 | | - if (stats_vdev->cur_buf) |
---|
| 203 | + if (stats_vdev->cur_buf) { |
---|
185 | 204 | 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 | + } |
---|
186 | 213 | 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; |
---|
187 | 217 | } |
---|
188 | 218 | |
---|
189 | 219 | static int |
---|
.. | .. |
---|
217 | 247 | q->io_modes = VB2_MMAP | VB2_USERPTR; |
---|
218 | 248 | q->drv_priv = stats_vdev; |
---|
219 | 249 | 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 | + } |
---|
221 | 257 | q->buf_struct_size = sizeof(struct rkisp_buffer); |
---|
222 | 258 | q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; |
---|
223 | 259 | q->lock = &stats_vdev->dev->iqlock; |
---|
224 | 260 | q->dev = stats_vdev->dev->dev; |
---|
225 | | - |
---|
226 | 261 | return vb2_queue_init(q); |
---|
227 | 262 | } |
---|
228 | 263 | |
---|
.. | .. |
---|
250 | 285 | stats_vdev->wr_buf_idx = 0; |
---|
251 | 286 | memset(stats_vdev->stats_buf, 0, sizeof(stats_vdev->stats_buf)); |
---|
252 | 287 | |
---|
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 | | - |
---|
258 | 288 | if (stats_vdev->dev->isp_ver <= ISP_V13) |
---|
259 | 289 | rkisp_init_stats_vdev_v1x(stats_vdev); |
---|
260 | 290 | else if (stats_vdev->dev->isp_ver == ISP_V21) |
---|
261 | 291 | rkisp_init_stats_vdev_v21(stats_vdev); |
---|
262 | | - else |
---|
| 292 | + else if (stats_vdev->dev->isp_ver == ISP_V20) |
---|
263 | 293 | 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); |
---|
264 | 298 | } |
---|
265 | 299 | |
---|
266 | 300 | static void rkisp_uninit_stats_vdev(struct rkisp_isp_stats_vdev *stats_vdev) |
---|
.. | .. |
---|
269 | 303 | rkisp_uninit_stats_vdev_v1x(stats_vdev); |
---|
270 | 304 | else if (stats_vdev->dev->isp_ver == ISP_V21) |
---|
271 | 305 | rkisp_uninit_stats_vdev_v21(stats_vdev); |
---|
272 | | - else |
---|
| 306 | + else if (stats_vdev->dev->isp_ver == ISP_V20) |
---|
273 | 307 | 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); |
---|
274 | 312 | } |
---|
275 | 313 | |
---|
276 | 314 | void rkisp_stats_rdbk_enable(struct rkisp_isp_stats_vdev *stats_vdev, bool en) |
---|
.. | .. |
---|
284 | 322 | rkisp_stats_first_ddr_config_v2x(stats_vdev); |
---|
285 | 323 | else if (stats_vdev->dev->isp_ver == ISP_V21) |
---|
286 | 324 | 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); |
---|
287 | 335 | } |
---|
288 | 336 | |
---|
289 | 337 | void rkisp_stats_isr(struct rkisp_isp_stats_vdev *stats_vdev, |
---|
.. | .. |
---|
325 | 373 | if (ret < 0) |
---|
326 | 374 | goto err_release_queue; |
---|
327 | 375 | |
---|
328 | | - ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); |
---|
| 376 | + ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); |
---|
329 | 377 | if (ret < 0) { |
---|
330 | 378 | dev_err(&vdev->dev, |
---|
331 | 379 | "could not register Video for Linux device\n"); |
---|