.. | .. |
---|
318 | 318 | static int rawrd_config_mi(struct rkisp_stream *stream) |
---|
319 | 319 | { |
---|
320 | 320 | struct rkisp_device *dev = stream->ispdev; |
---|
| 321 | + bool is_unite = dev->hw_dev->is_unite; |
---|
321 | 322 | u32 val; |
---|
322 | 323 | |
---|
323 | 324 | val = rkisp_read(dev, CSI2RX_DATA_IDS_1, true); |
---|
.. | .. |
---|
346 | 347 | default: |
---|
347 | 348 | val |= CIF_CSI2_DT_RAW12; |
---|
348 | 349 | } |
---|
349 | | - rkisp_write(dev, CSI2RX_RAW_RD_CTRL, |
---|
350 | | - stream->memory << 2, false); |
---|
351 | | - rkisp_write(dev, CSI2RX_DATA_IDS_1, val, false); |
---|
| 350 | + rkisp_unite_write(dev, CSI2RX_RAW_RD_CTRL, |
---|
| 351 | + stream->memory << 2, false, is_unite); |
---|
| 352 | + rkisp_unite_write(dev, CSI2RX_DATA_IDS_1, val, false, is_unite); |
---|
352 | 353 | rkisp_rawrd_set_pic_size(dev, stream->out_fmt.width, |
---|
353 | 354 | stream->out_fmt.height); |
---|
354 | 355 | mi_raw_length(stream); |
---|
.. | .. |
---|
364 | 365 | { |
---|
365 | 366 | struct rkisp_device *dev = stream->ispdev; |
---|
366 | 367 | void __iomem *base = dev->base_addr; |
---|
| 368 | + struct capture_fmt *fmt = &stream->out_isp_fmt; |
---|
| 369 | + u32 val = 0; |
---|
367 | 370 | |
---|
368 | 371 | if (stream->curr_buf) { |
---|
369 | | - rkisp_write(dev, stream->config->mi.y_base_ad_init, |
---|
370 | | - stream->curr_buf->buff_addr[RKISP_PLANE_Y], |
---|
371 | | - false); |
---|
| 372 | + if (dev->vicap_in.merge_num > 1) { |
---|
| 373 | + val = stream->out_fmt.plane_fmt[0].bytesperline; |
---|
| 374 | + val /= dev->vicap_in.merge_num; |
---|
| 375 | + val *= dev->vicap_in.index; |
---|
| 376 | + } |
---|
| 377 | + val += stream->curr_buf->buff_addr[RKISP_PLANE_Y]; |
---|
| 378 | + rkisp_write(dev, stream->config->mi.y_base_ad_init, val, false); |
---|
| 379 | + if (dev->hw_dev->is_unite) { |
---|
| 380 | + u32 offs = stream->out_fmt.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL; |
---|
| 381 | + |
---|
| 382 | + if (stream->memory) |
---|
| 383 | + offs *= DIV_ROUND_UP(fmt->bpp[0], 8); |
---|
| 384 | + else |
---|
| 385 | + offs = offs * fmt->bpp[0] / 8; |
---|
| 386 | + val += offs; |
---|
| 387 | + rkisp_next_write(dev, stream->config->mi.y_base_ad_init, val, false); |
---|
| 388 | + } |
---|
372 | 389 | stream->frame_end = false; |
---|
373 | | - if (stream->id == RKISP_STREAM_RAWRD2 && |
---|
374 | | - stream->out_isp_fmt.fmt_type == FMT_YUV) { |
---|
| 390 | + if (stream->id == RKISP_STREAM_RAWRD2 && stream->out_isp_fmt.fmt_type == FMT_YUV) { |
---|
375 | 391 | struct vb2_v4l2_buffer *vbuf = &stream->curr_buf->vb; |
---|
376 | 392 | struct isp2x_csi_trigger trigger = { |
---|
377 | 393 | .frame_timestamp = vbuf->vb2_buf.timestamp, |
---|
378 | 394 | .sof_timestamp = vbuf->vb2_buf.timestamp, |
---|
379 | 395 | .frame_id = vbuf->sequence, |
---|
380 | | - .mode = T_START_X1, |
---|
| 396 | + .mode = 0, |
---|
381 | 397 | .times = 0, |
---|
382 | 398 | }; |
---|
383 | 399 | |
---|
384 | 400 | if (!vbuf->sequence) |
---|
385 | | - trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq); |
---|
| 401 | + trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq) - 1; |
---|
386 | 402 | rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, &trigger); |
---|
387 | 403 | } |
---|
388 | 404 | } else if (dev->dmarx_dev.trigger == T_AUTO) { |
---|
.. | .. |
---|
430 | 446 | |
---|
431 | 447 | spin_lock_irqsave(&stream->vbq_lock, lock_flags); |
---|
432 | 448 | if (stream->curr_buf) { |
---|
433 | | - vb2_buffer_done(&stream->curr_buf->vb.vb2_buf, |
---|
434 | | - VB2_BUF_STATE_DONE); |
---|
| 449 | + if (stream->curr_buf->other) { |
---|
| 450 | + struct rkisp_device *dev = stream->ispdev; |
---|
| 451 | + struct v4l2_subdev *sd = dev->active_sensor->sd; |
---|
| 452 | + struct rkisp_rx_buf *rx_buf = stream->curr_buf->other; |
---|
| 453 | + |
---|
| 454 | + if (rx_buf->is_switch && stream->id == RKISP_STREAM_RAWRD2) { |
---|
| 455 | + switch (dev->rd_mode) { |
---|
| 456 | + case HDR_RDBK_FRAME3: |
---|
| 457 | + dev->rd_mode = HDR_LINEX3_DDR; |
---|
| 458 | + break; |
---|
| 459 | + case HDR_RDBK_FRAME2: |
---|
| 460 | + dev->rd_mode = HDR_LINEX2_DDR; |
---|
| 461 | + break; |
---|
| 462 | + default: |
---|
| 463 | + dev->rd_mode = HDR_NORMAL; |
---|
| 464 | + } |
---|
| 465 | + dev->hdr.op_mode = dev->rd_mode; |
---|
| 466 | + rkisp_unite_write(dev, CSI2RX_CTRL0, |
---|
| 467 | + SW_IBUF_OP_MODE(dev->hdr.op_mode), |
---|
| 468 | + true, dev->hw_dev->is_unite); |
---|
| 469 | + rkisp_unite_set_bits(dev, CSI2RX_MASK_STAT, |
---|
| 470 | + 0, ISP21_MIPI_DROP_FRM, |
---|
| 471 | + true, dev->hw_dev->is_unite); |
---|
| 472 | + rkisp_unite_clear_bits(dev, CIF_ISP_IMSC, CIF_ISP_FRAME_IN, |
---|
| 473 | + true, dev->hw_dev->is_unite); |
---|
| 474 | + dev_info(dev->dev, |
---|
| 475 | + "switch online seq:%d mode:0x%x\n", |
---|
| 476 | + rx_buf->sequence, dev->rd_mode); |
---|
| 477 | + } |
---|
| 478 | + rx_buf->runtime_us = dev->isp_sdev.dbg.interval / 1000; |
---|
| 479 | + v4l2_subdev_call(sd, video, s_rx_buffer, rx_buf, NULL); |
---|
| 480 | + } else { |
---|
| 481 | + vb2_buffer_done(&stream->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); |
---|
| 482 | + } |
---|
435 | 483 | stream->curr_buf = NULL; |
---|
436 | 484 | } |
---|
437 | 485 | |
---|
.. | .. |
---|
443 | 491 | list_del(&stream->curr_buf->queue); |
---|
444 | 492 | } |
---|
445 | 493 | |
---|
446 | | - if (stream->streaming) |
---|
| 494 | + if (stream->curr_buf) |
---|
447 | 495 | stream->ops->update_mi(stream); |
---|
448 | 496 | spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); |
---|
449 | 497 | return 0; |
---|
.. | .. |
---|
458 | 506 | int ret = 0; |
---|
459 | 507 | |
---|
460 | 508 | stream->stopping = true; |
---|
461 | | - if ((dev->isp_state & ISP_START) && !stream->frame_end) { |
---|
| 509 | + if ((dev->isp_state & ISP_START) && !stream->frame_end && |
---|
| 510 | + !dev->hw_dev->is_shutdown) { |
---|
462 | 511 | ret = wait_event_timeout(stream->done, |
---|
463 | 512 | !stream->streaming, |
---|
464 | | - msecs_to_jiffies(100)); |
---|
| 513 | + msecs_to_jiffies(300)); |
---|
465 | 514 | if (!ret) |
---|
466 | 515 | v4l2_warn(v4l2_dev, |
---|
467 | 516 | "dmarx:%d waiting on event return error %d\n", |
---|
.. | .. |
---|
513 | 562 | } |
---|
514 | 563 | |
---|
515 | 564 | rkisp_chk_tb_over(dev); |
---|
516 | | - v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s count %d, size %d\n", |
---|
517 | | - v4l2_type_names[queue->type], *num_buffers, sizes[0]); |
---|
| 565 | + v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s %s count %d, size %d\n", |
---|
| 566 | + stream->vnode.vdev.name, v4l2_type_names[queue->type], *num_buffers, sizes[0]); |
---|
518 | 567 | |
---|
519 | 568 | return 0; |
---|
520 | 569 | } |
---|
.. | .. |
---|
535 | 584 | struct sg_table *sgt; |
---|
536 | 585 | int i; |
---|
537 | 586 | |
---|
| 587 | + ispbuf->other = NULL; |
---|
538 | 588 | memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); |
---|
539 | 589 | for (i = 0; i < isp_fmt->mplanes; i++) { |
---|
540 | 590 | void *vaddr = vb2_plane_vaddr(vb, i); |
---|
.. | .. |
---|
602 | 652 | unsigned long lock_flags = 0; |
---|
603 | 653 | |
---|
604 | 654 | spin_lock_irqsave(&stream->vbq_lock, lock_flags); |
---|
605 | | - if (stream->curr_buf) { |
---|
| 655 | + if (stream->curr_buf && !stream->curr_buf->other) |
---|
606 | 656 | list_add_tail(&stream->curr_buf->queue, &stream->buf_queue); |
---|
607 | | - stream->curr_buf = NULL; |
---|
608 | | - } |
---|
| 657 | + stream->curr_buf = NULL; |
---|
609 | 658 | while (!list_empty(&stream->buf_queue)) { |
---|
610 | 659 | buf = list_first_entry(&stream->buf_queue, |
---|
611 | 660 | struct rkisp_buffer, queue); |
---|
612 | 661 | list_del(&buf->queue); |
---|
613 | | - vb2_buffer_done(&buf->vb.vb2_buf, state); |
---|
| 662 | + if (!buf->other) |
---|
| 663 | + vb2_buffer_done(&buf->vb.vb2_buf, state); |
---|
614 | 664 | } |
---|
615 | 665 | spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); |
---|
616 | 666 | } |
---|
.. | .. |
---|
618 | 668 | static void dmarx_stop_streaming(struct vb2_queue *queue) |
---|
619 | 669 | { |
---|
620 | 670 | struct rkisp_stream *stream = queue->drv_priv; |
---|
| 671 | + struct v4l2_device *v4l2_dev = &stream->ispdev->v4l2_dev; |
---|
| 672 | + |
---|
| 673 | + v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n", |
---|
| 674 | + __func__, stream->vnode.vdev.name, stream->id); |
---|
621 | 675 | |
---|
622 | 676 | if (!stream->streaming) |
---|
623 | 677 | return; |
---|
.. | .. |
---|
626 | 680 | destroy_buf_queue(stream, VB2_BUF_STATE_ERROR); |
---|
627 | 681 | |
---|
628 | 682 | if (stream->id == RKISP_STREAM_RAWRD2 && |
---|
629 | | - (stream->ispdev->isp_ver == ISP_V20 || stream->ispdev->isp_ver == ISP_V21)) |
---|
| 683 | + stream->ispdev->isp_ver >= ISP_V20) |
---|
630 | 684 | kfifo_reset(&stream->ispdev->rdbk_kfifo); |
---|
631 | 685 | } |
---|
632 | 686 | |
---|
.. | .. |
---|
638 | 692 | struct v4l2_device *v4l2_dev = &dev->v4l2_dev; |
---|
639 | 693 | int ret = -1; |
---|
640 | 694 | |
---|
| 695 | + v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n", |
---|
| 696 | + __func__, stream->vnode.vdev.name, stream->id); |
---|
| 697 | + |
---|
641 | 698 | if (WARN_ON(stream->streaming)) |
---|
642 | 699 | return -EBUSY; |
---|
643 | 700 | |
---|
644 | 701 | if (!stream->linked) { |
---|
645 | | - v4l2_err(v4l2_dev, "check video link\n"); |
---|
| 702 | + v4l2_err(v4l2_dev, "check %s link\n", stream->vnode.vdev.name); |
---|
646 | 703 | goto free_buf_queue; |
---|
647 | 704 | } |
---|
648 | 705 | |
---|
649 | 706 | ret = dmarx_start(stream); |
---|
650 | 707 | if (ret < 0) { |
---|
651 | | - v4l2_err(v4l2_dev, |
---|
652 | | - "start dmarx stream:%d failed\n", |
---|
653 | | - stream->id); |
---|
| 708 | + v4l2_err(v4l2_dev, "start %s failed\n", stream->vnode.vdev.name); |
---|
654 | 709 | goto free_buf_queue; |
---|
655 | 710 | } |
---|
656 | 711 | return 0; |
---|
.. | .. |
---|
685 | 740 | q->allow_cache_hints = 1; |
---|
686 | 741 | q->bidirectional = 1; |
---|
687 | 742 | q->gfp_flags = GFP_DMA32; |
---|
| 743 | + if (stream->ispdev->hw_dev->is_dma_contig) |
---|
| 744 | + q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS; |
---|
688 | 745 | return vb2_queue_init(q); |
---|
689 | 746 | } |
---|
690 | 747 | |
---|
.. | .. |
---|
736 | 793 | fmt->fmt_type == FMT_BAYER) |
---|
737 | 794 | height += RKMODULE_EXTEND_LINE; |
---|
738 | 795 | |
---|
739 | | - if ((stream->ispdev->isp_ver == ISP_V20 || |
---|
740 | | - stream->ispdev->isp_ver == ISP_V21) && |
---|
| 796 | + if (stream->ispdev->isp_ver >= ISP_V20 && |
---|
741 | 797 | fmt->fmt_type == FMT_BAYER && |
---|
742 | 798 | !stream->memory && |
---|
743 | 799 | stream->id != RKISP_STREAM_DMARX) |
---|
744 | 800 | bytesperline = ALIGN(width * fmt->bpp[i] / 8, 256); |
---|
745 | 801 | else |
---|
746 | 802 | bytesperline = width * DIV_ROUND_UP(fmt->bpp[i], 8); |
---|
747 | | - /* stride is only available for sp stream and y plane */ |
---|
| 803 | + |
---|
| 804 | + if (stream->ispdev->vicap_in.merge_num > 1) |
---|
| 805 | + bytesperline *= stream->ispdev->vicap_in.merge_num; |
---|
| 806 | + |
---|
748 | 807 | if (i != 0 || |
---|
749 | 808 | plane_fmt->bytesperline < bytesperline) |
---|
750 | 809 | plane_fmt->bytesperline = bytesperline; |
---|
.. | .. |
---|
770 | 829 | DIV_ROUND_UP(fmt->bpp[0], 8); |
---|
771 | 830 | |
---|
772 | 831 | v4l2_dbg(1, rkisp_debug, &stream->ispdev->v4l2_dev, |
---|
773 | | - "%s: stream: %d req(%d, %d) out(%d, %d)\n", __func__, |
---|
| 832 | + "%s: rx:%d req(%d, %d) out(%d, %d)\n", __func__, |
---|
774 | 833 | stream->id, pixm->width, pixm->height, |
---|
775 | 834 | stream->out_fmt.width, stream->out_fmt.height); |
---|
776 | 835 | } |
---|
.. | .. |
---|
786 | 845 | .unlocked_ioctl = video_ioctl2, |
---|
787 | 846 | .poll = vb2_fop_poll, |
---|
788 | 847 | .mmap = vb2_fop_mmap, |
---|
| 848 | +#ifdef CONFIG_COMPAT |
---|
| 849 | + .compat_ioctl32 = video_ioctl2, |
---|
| 850 | +#endif |
---|
789 | 851 | }; |
---|
790 | 852 | |
---|
791 | 853 | static int rkisp_try_fmt_vid_out_mplane(struct file *file, void *fh, |
---|
.. | .. |
---|
820 | 882 | struct rkisp_device *dev = stream->ispdev; |
---|
821 | 883 | |
---|
822 | 884 | if (vb2_is_busy(&node->buf_queue)) { |
---|
823 | | - v4l2_err(&dev->v4l2_dev, "%s queue busy\n", __func__); |
---|
| 885 | + v4l2_err(&dev->v4l2_dev, "%s rx:%d queue busy\n", |
---|
| 886 | + __func__, stream->id); |
---|
824 | 887 | return -EBUSY; |
---|
825 | 888 | } |
---|
826 | 889 | |
---|
.. | .. |
---|
904 | 967 | .vidioc_streamon = vb2_ioctl_streamon, |
---|
905 | 968 | .vidioc_streamoff = vb2_ioctl_streamoff, |
---|
906 | 969 | .vidioc_try_fmt_vid_out_mplane = rkisp_try_fmt_vid_out_mplane, |
---|
907 | | - .vidioc_enum_fmt_vid_out_mplane = rkisp_enum_fmt_vid_out_mplane, |
---|
| 970 | + .vidioc_enum_fmt_vid_out = rkisp_enum_fmt_vid_out_mplane, |
---|
908 | 971 | .vidioc_s_fmt_vid_out_mplane = rkisp_s_fmt_vid_out_mplane, |
---|
909 | 972 | .vidioc_g_fmt_vid_out_mplane = rkisp_g_fmt_vid_out_mplane, |
---|
910 | 973 | .vidioc_querycap = rkisp_querycap, |
---|
.. | .. |
---|
945 | 1008 | V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); |
---|
946 | 1009 | vdev->queue = &node->buf_queue; |
---|
947 | 1010 | |
---|
948 | | - ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); |
---|
| 1011 | + ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); |
---|
949 | 1012 | if (ret < 0) { |
---|
950 | 1013 | v4l2_err(v4l2_dev, |
---|
951 | 1014 | "%s failed with error %d\n", __func__, ret); |
---|
.. | .. |
---|
1072 | 1135 | { |
---|
1073 | 1136 | struct rkisp_isp_subdev *sdev = &dev->isp_sdev; |
---|
1074 | 1137 | u8 mult = sdev->in_fmt.fmt_type == FMT_YUV ? 2 : 1; |
---|
| 1138 | + bool is_unite = dev->hw_dev->is_unite; |
---|
| 1139 | + u32 w = !is_unite ? width : width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; |
---|
1075 | 1140 | |
---|
1076 | 1141 | /* rx height should equal to isp height + offset for read back mode */ |
---|
1077 | 1142 | height = sdev->in_crop.top + sdev->in_crop.height; |
---|
.. | .. |
---|
1083 | 1148 | dev->rd_mode == HDR_RDBK_FRAME1) |
---|
1084 | 1149 | height += RKMODULE_EXTEND_LINE; |
---|
1085 | 1150 | |
---|
1086 | | - rkisp_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | width * mult, false); |
---|
| 1151 | + w *= mult; |
---|
| 1152 | + rkisp_unite_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | w, false, is_unite); |
---|
1087 | 1153 | } |
---|
1088 | 1154 | |
---|
1089 | 1155 | void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id, |
---|
.. | .. |
---|
1094 | 1160 | u64 sof_time = 0, frame_timestamp = 0; |
---|
1095 | 1161 | u32 frame_id = 0; |
---|
1096 | 1162 | |
---|
1097 | | - if (!dev->dmarx_dev.trigger && id) { |
---|
| 1163 | + if (!IS_HDR_RDBK(dev->rd_mode) && id) { |
---|
1098 | 1164 | *id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1; |
---|
1099 | 1165 | return; |
---|
1100 | 1166 | } |
---|
.. | .. |
---|
1131 | 1197 | if (ret < 0) |
---|
1132 | 1198 | goto err; |
---|
1133 | 1199 | #endif |
---|
1134 | | - if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) { |
---|
| 1200 | + if (dev->isp_ver >= ISP_V20) { |
---|
1135 | 1201 | ret = dmarx_init(dev, RKISP_STREAM_RAWRD0); |
---|
1136 | 1202 | if (ret < 0) |
---|
1137 | 1203 | goto err_free_dmarx; |
---|
.. | .. |
---|
1139 | 1205 | if (ret < 0) |
---|
1140 | 1206 | goto err_free_dmarx0; |
---|
1141 | 1207 | } |
---|
1142 | | - if (dev->isp_ver == ISP_V20) { |
---|
| 1208 | + if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) { |
---|
1143 | 1209 | ret = dmarx_init(dev, RKISP_STREAM_RAWRD1); |
---|
1144 | 1210 | if (ret < 0) |
---|
1145 | 1211 | goto err_free_dmarx2; |
---|
.. | .. |
---|
1168 | 1234 | rkisp_unregister_dmarx_video(stream); |
---|
1169 | 1235 | #endif |
---|
1170 | 1236 | |
---|
1171 | | - if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) { |
---|
| 1237 | + if (dev->isp_ver >= ISP_V20) { |
---|
1172 | 1238 | stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD0]; |
---|
1173 | 1239 | rkisp_unregister_dmarx_video(stream); |
---|
1174 | 1240 | |
---|
1175 | 1241 | stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD2]; |
---|
1176 | 1242 | rkisp_unregister_dmarx_video(stream); |
---|
1177 | 1243 | } |
---|
1178 | | - if (dev->isp_ver == ISP_V20) { |
---|
| 1244 | + if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) { |
---|
1179 | 1245 | stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD1]; |
---|
1180 | 1246 | rkisp_unregister_dmarx_video(stream); |
---|
1181 | 1247 | } |
---|