.. | .. |
---|
1150 | 1150 | if (!ret) { |
---|
1151 | 1151 | denominator = sensor->fi.interval.denominator; |
---|
1152 | 1152 | numerator = sensor->fi.interval.numerator; |
---|
1153 | | - time = numerator * 1000 / denominator * 1000 * 1000; |
---|
| 1153 | + if (denominator) |
---|
| 1154 | + time = numerator * 1000 / denominator * 1000 * 1000; |
---|
1154 | 1155 | if (numerator) |
---|
1155 | 1156 | fps = denominator / numerator; |
---|
1156 | 1157 | } |
---|
.. | .. |
---|
1206 | 1207 | unsigned long lock_flags = 0; |
---|
1207 | 1208 | int i = 0; |
---|
1208 | 1209 | |
---|
| 1210 | + if (stream->id == RKISP_STREAM_VIR) |
---|
| 1211 | + return 0; |
---|
| 1212 | + |
---|
1209 | 1213 | if (!stream->next_buf && stream->streaming && |
---|
1210 | 1214 | dev->dmarx_dev.trigger == T_MANUAL && |
---|
1211 | 1215 | is_rdbk_stream(stream)) |
---|
.. | .. |
---|
1218 | 1222 | (!interlaced || |
---|
1219 | 1223 | (stream->u.sp.field_rec == RKISP_FIELD_ODD && |
---|
1220 | 1224 | stream->u.sp.field == RKISP_FIELD_EVEN))) { |
---|
| 1225 | + struct rkisp_stream *vir = &dev->cap_dev.stream[RKISP_STREAM_VIR]; |
---|
1221 | 1226 | struct vb2_buffer *vb2_buf = &stream->curr_buf->vb.vb2_buf; |
---|
1222 | 1227 | 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 | + } |
---|
1223 | 1237 | |
---|
1224 | 1238 | /* Dequeue a filled buffer */ |
---|
1225 | 1239 | for (i = 0; i < isp_fmt->mplanes; i++) { |
---|
.. | .. |
---|
1237 | 1251 | atomic_read(&stream->sequence) - 1; |
---|
1238 | 1252 | } |
---|
1239 | 1253 | if (!ns) |
---|
1240 | | - ns = ktime_get_ns(); |
---|
| 1254 | + ns = rkisp_time_get_ns(dev); |
---|
1241 | 1255 | vb2_buf->timestamp = ns; |
---|
1242 | 1256 | |
---|
1243 | | - ns = ktime_get_ns(); |
---|
| 1257 | + ns = rkisp_time_get_ns(dev); |
---|
1244 | 1258 | stream->dbg.interval = ns - stream->dbg.timestamp; |
---|
1245 | 1259 | stream->dbg.timestamp = ns; |
---|
1246 | 1260 | stream->dbg.id = stream->curr_buf->vb.sequence; |
---|
.. | .. |
---|
1268 | 1282 | rdbk_frame_end(stream); |
---|
1269 | 1283 | } |
---|
1270 | 1284 | } 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 | + } |
---|
1272 | 1295 | } |
---|
1273 | 1296 | |
---|
1274 | 1297 | stream->curr_buf = NULL; |
---|
1275 | 1298 | } |
---|
1276 | 1299 | |
---|
| 1300 | +end: |
---|
1277 | 1301 | if (!interlaced || |
---|
1278 | 1302 | (stream->curr_buf == stream->next_buf && |
---|
1279 | 1303 | stream->u.sp.field == RKISP_FIELD_ODD)) { |
---|
.. | .. |
---|
1379 | 1403 | stream->interlaced = false; |
---|
1380 | 1404 | } |
---|
1381 | 1405 | |
---|
| 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 | + |
---|
1382 | 1498 | /* |
---|
1383 | 1499 | * Most of registers inside rockchip isp1 have shadow register since |
---|
1384 | 1500 | * they must be not changed during processing a frame. |
---|
.. | .. |
---|
1400 | 1516 | if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) |
---|
1401 | 1517 | hdr_config_dmatx(dev); |
---|
1402 | 1518 | stream->streaming = true; |
---|
1403 | | - |
---|
| 1519 | + stream->skip_frame = 0; |
---|
1404 | 1520 | return 0; |
---|
1405 | 1521 | } |
---|
1406 | 1522 | |
---|
.. | .. |
---|
1571 | 1687 | if (!stream->streaming) |
---|
1572 | 1688 | goto end; |
---|
1573 | 1689 | |
---|
| 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 | + |
---|
1574 | 1705 | rkisp_stream_stop(stream); |
---|
1575 | 1706 | if (stream->id == RKISP_STREAM_MP || |
---|
1576 | 1707 | stream->id == RKISP_STREAM_SP) { |
---|
.. | .. |
---|
1650 | 1781 | if (WARN_ON(stream->streaming)) { |
---|
1651 | 1782 | mutex_unlock(&dev->hw_dev->dev_lock); |
---|
1652 | 1783 | 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; |
---|
1653 | 1806 | } |
---|
1654 | 1807 | |
---|
1655 | 1808 | memset(&stream->dbg, 0, sizeof(stream->dbg)); |
---|
.. | .. |
---|
1787 | 1940 | |
---|
1788 | 1941 | switch (id) { |
---|
1789 | 1942 | case RKISP_STREAM_SP: |
---|
1790 | | - strlcpy(vdev->name, SP_VDEV_NAME, |
---|
| 1943 | + strscpy(vdev->name, SP_VDEV_NAME, |
---|
1791 | 1944 | sizeof(vdev->name)); |
---|
1792 | 1945 | stream->ops = &rkisp_sp_streams_ops; |
---|
1793 | 1946 | stream->config = &rkisp_sp_stream_config; |
---|
.. | .. |
---|
1795 | 1948 | stream->config->fmt_size = ARRAY_SIZE(sp_fmts); |
---|
1796 | 1949 | break; |
---|
1797 | 1950 | case RKISP_STREAM_DMATX0: |
---|
1798 | | - strlcpy(vdev->name, DMATX0_VDEV_NAME, |
---|
| 1951 | + strscpy(vdev->name, DMATX0_VDEV_NAME, |
---|
1799 | 1952 | sizeof(vdev->name)); |
---|
1800 | 1953 | stream->ops = &rkisp2_dmatx0_streams_ops; |
---|
1801 | 1954 | stream->config = &rkisp2_dmatx0_stream_config; |
---|
1802 | 1955 | break; |
---|
1803 | 1956 | case RKISP_STREAM_DMATX2: |
---|
1804 | | - strlcpy(vdev->name, DMATX2_VDEV_NAME, |
---|
| 1957 | + strscpy(vdev->name, DMATX2_VDEV_NAME, |
---|
1805 | 1958 | sizeof(vdev->name)); |
---|
1806 | 1959 | stream->ops = &rkisp2_dmatx2_streams_ops; |
---|
1807 | 1960 | stream->config = &rkisp2_dmatx1_stream_config; |
---|
1808 | 1961 | break; |
---|
1809 | 1962 | case RKISP_STREAM_DMATX3: |
---|
1810 | | - strlcpy(vdev->name, DMATX3_VDEV_NAME, |
---|
| 1963 | + strscpy(vdev->name, DMATX3_VDEV_NAME, |
---|
1811 | 1964 | sizeof(vdev->name)); |
---|
1812 | 1965 | stream->ops = &rkisp2_dmatx3_streams_ops; |
---|
1813 | 1966 | stream->config = &rkisp2_dmatx3_stream_config; |
---|
1814 | 1967 | 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; |
---|
1815 | 1975 | default: |
---|
1816 | | - strlcpy(vdev->name, MP_VDEV_NAME, |
---|
| 1976 | + strscpy(vdev->name, MP_VDEV_NAME, |
---|
1817 | 1977 | sizeof(vdev->name)); |
---|
1818 | 1978 | stream->ops = &rkisp_mp_streams_ops; |
---|
1819 | 1979 | stream->config = &rkisp_mp_stream_config; |
---|
.. | .. |
---|
1857 | 2017 | ret = rkisp_stream_init(dev, RKISP_STREAM_DMATX3); |
---|
1858 | 2018 | if (ret < 0) |
---|
1859 | 2019 | goto err_free_tx2; |
---|
| 2020 | + ret = rkisp_stream_init(dev, RKISP_STREAM_VIR); |
---|
| 2021 | + if (ret < 0) |
---|
| 2022 | + goto err_free_tx3; |
---|
1860 | 2023 | |
---|
1861 | 2024 | return 0; |
---|
| 2025 | +err_free_tx3: |
---|
| 2026 | + rkisp_unregister_stream_vdev(&cap_dev->stream[RKISP_STREAM_DMATX3]); |
---|
1862 | 2027 | err_free_tx2: |
---|
1863 | 2028 | rkisp_unregister_stream_vdev(&cap_dev->stream[RKISP_STREAM_DMATX2]); |
---|
1864 | 2029 | err_free_tx0: |
---|
.. | .. |
---|
1886 | 2051 | rkisp_unregister_stream_vdev(stream); |
---|
1887 | 2052 | stream = &cap_dev->stream[RKISP_STREAM_DMATX3]; |
---|
1888 | 2053 | rkisp_unregister_stream_vdev(stream); |
---|
| 2054 | + stream = &cap_dev->stream[RKISP_STREAM_VIR]; |
---|
| 2055 | + rkisp_unregister_stream_vdev(stream); |
---|
1889 | 2056 | } |
---|
1890 | 2057 | |
---|
1891 | 2058 | /**************** Interrupter Handler ****************/ |
---|
.. | .. |
---|
1905 | 2072 | for (i = 0; i < RKISP_MAX_STREAM; ++i) { |
---|
1906 | 2073 | stream = &dev->cap_dev.stream[i]; |
---|
1907 | 2074 | |
---|
1908 | | - if (!(mis_val & CIF_MI_FRAME(stream))) |
---|
| 2075 | + if (!(mis_val & CIF_MI_FRAME(stream)) || stream->id == RKISP_STREAM_VIR) |
---|
1909 | 2076 | continue; |
---|
1910 | 2077 | |
---|
1911 | 2078 | if (i == RKISP_STREAM_DMATX0) |
---|