hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/platform/rockchip/isp/capture_v21.c
....@@ -1150,7 +1150,8 @@
11501150 if (!ret) {
11511151 denominator = sensor->fi.interval.denominator;
11521152 numerator = sensor->fi.interval.numerator;
1153
- time = numerator * 1000 / denominator * 1000 * 1000;
1153
+ if (denominator)
1154
+ time = numerator * 1000 / denominator * 1000 * 1000;
11541155 if (numerator)
11551156 fps = denominator / numerator;
11561157 }
....@@ -1206,6 +1207,9 @@
12061207 unsigned long lock_flags = 0;
12071208 int i = 0;
12081209
1210
+ if (stream->id == RKISP_STREAM_VIR)
1211
+ return 0;
1212
+
12091213 if (!stream->next_buf && stream->streaming &&
12101214 dev->dmarx_dev.trigger == T_MANUAL &&
12111215 is_rdbk_stream(stream))
....@@ -1218,8 +1222,18 @@
12181222 (!interlaced ||
12191223 (stream->u.sp.field_rec == RKISP_FIELD_ODD &&
12201224 stream->u.sp.field == RKISP_FIELD_EVEN))) {
1225
+ struct rkisp_stream *vir = &dev->cap_dev.stream[RKISP_STREAM_VIR];
12211226 struct vb2_buffer *vb2_buf = &stream->curr_buf->vb.vb2_buf;
12221227 u64 ns = 0;
1228
+
1229
+ if (stream->skip_frame) {
1230
+ spin_lock_irqsave(&stream->vbq_lock, lock_flags);
1231
+ list_add_tail(&stream->curr_buf->queue, &stream->buf_queue);
1232
+ spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
1233
+ if (stream->skip_frame)
1234
+ stream->skip_frame--;
1235
+ goto end;
1236
+ }
12231237
12241238 /* Dequeue a filled buffer */
12251239 for (i = 0; i < isp_fmt->mplanes; i++) {
....@@ -1237,10 +1251,10 @@
12371251 atomic_read(&stream->sequence) - 1;
12381252 }
12391253 if (!ns)
1240
- ns = ktime_get_ns();
1254
+ ns = rkisp_time_get_ns(dev);
12411255 vb2_buf->timestamp = ns;
12421256
1243
- ns = ktime_get_ns();
1257
+ ns = rkisp_time_get_ns(dev);
12441258 stream->dbg.interval = ns - stream->dbg.timestamp;
12451259 stream->dbg.timestamp = ns;
12461260 stream->dbg.id = stream->curr_buf->vb.sequence;
....@@ -1268,12 +1282,22 @@
12681282 rdbk_frame_end(stream);
12691283 }
12701284 } else {
1271
- rkisp_stream_buf_done(stream, stream->curr_buf);
1285
+ if (vir->streaming && vir->conn_id == stream->id) {
1286
+ spin_lock_irqsave(&vir->vbq_lock, lock_flags);
1287
+ list_add_tail(&stream->curr_buf->queue,
1288
+ &dev->cap_dev.vir_cpy.queue);
1289
+ spin_unlock_irqrestore(&vir->vbq_lock, lock_flags);
1290
+ if (!completion_done(&dev->cap_dev.vir_cpy.cmpl))
1291
+ complete(&dev->cap_dev.vir_cpy.cmpl);
1292
+ } else {
1293
+ rkisp_stream_buf_done(stream, stream->curr_buf);
1294
+ }
12721295 }
12731296
12741297 stream->curr_buf = NULL;
12751298 }
12761299
1300
+end:
12771301 if (!interlaced ||
12781302 (stream->curr_buf == stream->next_buf &&
12791303 stream->u.sp.field == RKISP_FIELD_ODD)) {
....@@ -1379,6 +1403,98 @@
13791403 stream->interlaced = false;
13801404 }
13811405
1406
+static void vir_cpy_image(struct work_struct *work)
1407
+{
1408
+ struct rkisp_vir_cpy *cpy =
1409
+ container_of(work, struct rkisp_vir_cpy, work);
1410
+ struct rkisp_stream *vir = cpy->stream;
1411
+ struct rkisp_buffer *src_buf = NULL;
1412
+ unsigned long lock_flags = 0;
1413
+ u32 i;
1414
+
1415
+ v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev,
1416
+ "%s enter\n", __func__);
1417
+
1418
+ vir->streaming = true;
1419
+ spin_lock_irqsave(&vir->vbq_lock, lock_flags);
1420
+ if (!list_empty(&cpy->queue)) {
1421
+ src_buf = list_first_entry(&cpy->queue,
1422
+ struct rkisp_buffer, queue);
1423
+ list_del(&src_buf->queue);
1424
+ }
1425
+ spin_unlock_irqrestore(&vir->vbq_lock, lock_flags);
1426
+
1427
+ while (src_buf || vir->streaming) {
1428
+ if (vir->stopping || !vir->streaming)
1429
+ goto end;
1430
+
1431
+ if (!src_buf)
1432
+ wait_for_completion(&cpy->cmpl);
1433
+
1434
+ vir->frame_end = false;
1435
+ spin_lock_irqsave(&vir->vbq_lock, lock_flags);
1436
+
1437
+ if (!src_buf && !list_empty(&cpy->queue)) {
1438
+ src_buf = list_first_entry(&cpy->queue,
1439
+ struct rkisp_buffer, queue);
1440
+ list_del(&src_buf->queue);
1441
+ }
1442
+
1443
+ if (src_buf && !vir->curr_buf && !list_empty(&vir->buf_queue)) {
1444
+ vir->curr_buf = list_first_entry(&vir->buf_queue,
1445
+ struct rkisp_buffer, queue);
1446
+ list_del(&vir->curr_buf->queue);
1447
+ }
1448
+ spin_unlock_irqrestore(&vir->vbq_lock, lock_flags);
1449
+
1450
+ if (!vir->curr_buf || !src_buf)
1451
+ goto end;
1452
+
1453
+ for (i = 0; i < vir->out_isp_fmt.mplanes; i++) {
1454
+ u32 payload_size = vir->out_fmt.plane_fmt[i].sizeimage;
1455
+ void *src = vb2_plane_vaddr(&src_buf->vb.vb2_buf, i);
1456
+ void *dst = vb2_plane_vaddr(&vir->curr_buf->vb.vb2_buf, i);
1457
+
1458
+ if (!src || !dst)
1459
+ break;
1460
+ vb2_set_plane_payload(&vir->curr_buf->vb.vb2_buf, i, payload_size);
1461
+ memcpy(dst, src, payload_size);
1462
+ }
1463
+
1464
+ vir->curr_buf->vb.sequence = src_buf->vb.sequence;
1465
+ vir->curr_buf->vb.vb2_buf.timestamp = src_buf->vb.vb2_buf.timestamp;
1466
+ vb2_buffer_done(&vir->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1467
+ vir->curr_buf = NULL;
1468
+end:
1469
+ if (src_buf)
1470
+ vb2_buffer_done(&src_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1471
+ src_buf = NULL;
1472
+ spin_lock_irqsave(&vir->vbq_lock, lock_flags);
1473
+
1474
+ if (!list_empty(&cpy->queue)) {
1475
+ src_buf = list_first_entry(&cpy->queue,
1476
+ struct rkisp_buffer, queue);
1477
+ list_del(&src_buf->queue);
1478
+ } else if (vir->stopping) {
1479
+ vir->streaming = false;
1480
+ }
1481
+
1482
+ spin_unlock_irqrestore(&vir->vbq_lock, lock_flags);
1483
+ }
1484
+
1485
+ vir->frame_end = true;
1486
+
1487
+ if (vir->stopping) {
1488
+ vir->stopping = false;
1489
+ vir->streaming = false;
1490
+ wake_up(&vir->done);
1491
+ }
1492
+
1493
+ v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev,
1494
+ "%s exit\n", __func__);
1495
+}
1496
+
1497
+
13821498 /*
13831499 * Most of registers inside rockchip isp1 have shadow register since
13841500 * they must be not changed during processing a frame.
....@@ -1400,7 +1516,7 @@
14001516 if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP)
14011517 hdr_config_dmatx(dev);
14021518 stream->streaming = true;
1403
-
1519
+ stream->skip_frame = 0;
14041520 return 0;
14051521 }
14061522
....@@ -1571,6 +1687,21 @@
15711687 if (!stream->streaming)
15721688 goto end;
15731689
1690
+ if (stream->id == RKISP_STREAM_VIR) {
1691
+ stream->stopping = true;
1692
+ wait_event_timeout(stream->done,
1693
+ stream->frame_end,
1694
+ msecs_to_jiffies(500));
1695
+ stream->streaming = false;
1696
+ stream->stopping = false;
1697
+ destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
1698
+
1699
+ if (!completion_done(&dev->cap_dev.vir_cpy.cmpl))
1700
+ complete(&dev->cap_dev.vir_cpy.cmpl);
1701
+ stream->conn_id = -1;
1702
+ goto end;
1703
+ }
1704
+
15741705 rkisp_stream_stop(stream);
15751706 if (stream->id == RKISP_STREAM_MP ||
15761707 stream->id == RKISP_STREAM_SP) {
....@@ -1650,6 +1781,28 @@
16501781 if (WARN_ON(stream->streaming)) {
16511782 mutex_unlock(&dev->hw_dev->dev_lock);
16521783 return -EBUSY;
1784
+ }
1785
+
1786
+ if (stream->id == RKISP_STREAM_VIR) {
1787
+ struct rkisp_stream *t = &dev->cap_dev.stream[stream->conn_id];
1788
+
1789
+ if (t->streaming) {
1790
+ INIT_WORK(&dev->cap_dev.vir_cpy.work, vir_cpy_image);
1791
+ init_completion(&dev->cap_dev.vir_cpy.cmpl);
1792
+ INIT_LIST_HEAD(&dev->cap_dev.vir_cpy.queue);
1793
+ dev->cap_dev.vir_cpy.stream = stream;
1794
+ schedule_work(&dev->cap_dev.vir_cpy.work);
1795
+ ret = 0;
1796
+ } else {
1797
+ v4l2_err(&dev->v4l2_dev,
1798
+ "no stream enable for iqtool\n");
1799
+ destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED);
1800
+ ret = -EINVAL;
1801
+ }
1802
+
1803
+ mutex_unlock(&dev->hw_dev->dev_lock);
1804
+
1805
+ return ret;
16531806 }
16541807
16551808 memset(&stream->dbg, 0, sizeof(stream->dbg));
....@@ -1787,7 +1940,7 @@
17871940
17881941 switch (id) {
17891942 case RKISP_STREAM_SP:
1790
- strlcpy(vdev->name, SP_VDEV_NAME,
1943
+ strscpy(vdev->name, SP_VDEV_NAME,
17911944 sizeof(vdev->name));
17921945 stream->ops = &rkisp_sp_streams_ops;
17931946 stream->config = &rkisp_sp_stream_config;
....@@ -1795,25 +1948,32 @@
17951948 stream->config->fmt_size = ARRAY_SIZE(sp_fmts);
17961949 break;
17971950 case RKISP_STREAM_DMATX0:
1798
- strlcpy(vdev->name, DMATX0_VDEV_NAME,
1951
+ strscpy(vdev->name, DMATX0_VDEV_NAME,
17991952 sizeof(vdev->name));
18001953 stream->ops = &rkisp2_dmatx0_streams_ops;
18011954 stream->config = &rkisp2_dmatx0_stream_config;
18021955 break;
18031956 case RKISP_STREAM_DMATX2:
1804
- strlcpy(vdev->name, DMATX2_VDEV_NAME,
1957
+ strscpy(vdev->name, DMATX2_VDEV_NAME,
18051958 sizeof(vdev->name));
18061959 stream->ops = &rkisp2_dmatx2_streams_ops;
18071960 stream->config = &rkisp2_dmatx1_stream_config;
18081961 break;
18091962 case RKISP_STREAM_DMATX3:
1810
- strlcpy(vdev->name, DMATX3_VDEV_NAME,
1963
+ strscpy(vdev->name, DMATX3_VDEV_NAME,
18111964 sizeof(vdev->name));
18121965 stream->ops = &rkisp2_dmatx3_streams_ops;
18131966 stream->config = &rkisp2_dmatx3_stream_config;
18141967 break;
1968
+ case RKISP_STREAM_VIR:
1969
+ strscpy(vdev->name, VIR_VDEV_NAME,
1970
+ sizeof(vdev->name));
1971
+ stream->ops = NULL;
1972
+ stream->config = &rkisp_mp_stream_config;
1973
+ stream->conn_id = -1;
1974
+ break;
18151975 default:
1816
- strlcpy(vdev->name, MP_VDEV_NAME,
1976
+ strscpy(vdev->name, MP_VDEV_NAME,
18171977 sizeof(vdev->name));
18181978 stream->ops = &rkisp_mp_streams_ops;
18191979 stream->config = &rkisp_mp_stream_config;
....@@ -1857,8 +2017,13 @@
18572017 ret = rkisp_stream_init(dev, RKISP_STREAM_DMATX3);
18582018 if (ret < 0)
18592019 goto err_free_tx2;
2020
+ ret = rkisp_stream_init(dev, RKISP_STREAM_VIR);
2021
+ if (ret < 0)
2022
+ goto err_free_tx3;
18602023
18612024 return 0;
2025
+err_free_tx3:
2026
+ rkisp_unregister_stream_vdev(&cap_dev->stream[RKISP_STREAM_DMATX3]);
18622027 err_free_tx2:
18632028 rkisp_unregister_stream_vdev(&cap_dev->stream[RKISP_STREAM_DMATX2]);
18642029 err_free_tx0:
....@@ -1886,6 +2051,8 @@
18862051 rkisp_unregister_stream_vdev(stream);
18872052 stream = &cap_dev->stream[RKISP_STREAM_DMATX3];
18882053 rkisp_unregister_stream_vdev(stream);
2054
+ stream = &cap_dev->stream[RKISP_STREAM_VIR];
2055
+ rkisp_unregister_stream_vdev(stream);
18892056 }
18902057
18912058 /**************** Interrupter Handler ****************/
....@@ -1905,7 +2072,7 @@
19052072 for (i = 0; i < RKISP_MAX_STREAM; ++i) {
19062073 stream = &dev->cap_dev.stream[i];
19072074
1908
- if (!(mis_val & CIF_MI_FRAME(stream)))
2075
+ if (!(mis_val & CIF_MI_FRAME(stream)) || stream->id == RKISP_STREAM_VIR)
19092076 continue;
19102077
19112078 if (i == RKISP_STREAM_DMATX0)