hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/platform/rockchip/isp/dmarx.c
....@@ -318,6 +318,7 @@
318318 static int rawrd_config_mi(struct rkisp_stream *stream)
319319 {
320320 struct rkisp_device *dev = stream->ispdev;
321
+ bool is_unite = dev->hw_dev->is_unite;
321322 u32 val;
322323
323324 val = rkisp_read(dev, CSI2RX_DATA_IDS_1, true);
....@@ -346,9 +347,9 @@
346347 default:
347348 val |= CIF_CSI2_DT_RAW12;
348349 }
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);
352353 rkisp_rawrd_set_pic_size(dev, stream->out_fmt.width,
353354 stream->out_fmt.height);
354355 mi_raw_length(stream);
....@@ -364,25 +365,40 @@
364365 {
365366 struct rkisp_device *dev = stream->ispdev;
366367 void __iomem *base = dev->base_addr;
368
+ struct capture_fmt *fmt = &stream->out_isp_fmt;
369
+ u32 val = 0;
367370
368371 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
+ }
372389 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) {
375391 struct vb2_v4l2_buffer *vbuf = &stream->curr_buf->vb;
376392 struct isp2x_csi_trigger trigger = {
377393 .frame_timestamp = vbuf->vb2_buf.timestamp,
378394 .sof_timestamp = vbuf->vb2_buf.timestamp,
379395 .frame_id = vbuf->sequence,
380
- .mode = T_START_X1,
396
+ .mode = 0,
381397 .times = 0,
382398 };
383399
384400 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;
386402 rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, &trigger);
387403 }
388404 } else if (dev->dmarx_dev.trigger == T_AUTO) {
....@@ -430,8 +446,40 @@
430446
431447 spin_lock_irqsave(&stream->vbq_lock, lock_flags);
432448 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
+ }
435483 stream->curr_buf = NULL;
436484 }
437485
....@@ -443,7 +491,7 @@
443491 list_del(&stream->curr_buf->queue);
444492 }
445493
446
- if (stream->streaming)
494
+ if (stream->curr_buf)
447495 stream->ops->update_mi(stream);
448496 spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
449497 return 0;
....@@ -458,10 +506,11 @@
458506 int ret = 0;
459507
460508 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) {
462511 ret = wait_event_timeout(stream->done,
463512 !stream->streaming,
464
- msecs_to_jiffies(100));
513
+ msecs_to_jiffies(300));
465514 if (!ret)
466515 v4l2_warn(v4l2_dev,
467516 "dmarx:%d waiting on event return error %d\n",
....@@ -513,8 +562,8 @@
513562 }
514563
515564 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]);
518567
519568 return 0;
520569 }
....@@ -535,6 +584,7 @@
535584 struct sg_table *sgt;
536585 int i;
537586
587
+ ispbuf->other = NULL;
538588 memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr));
539589 for (i = 0; i < isp_fmt->mplanes; i++) {
540590 void *vaddr = vb2_plane_vaddr(vb, i);
....@@ -602,15 +652,15 @@
602652 unsigned long lock_flags = 0;
603653
604654 spin_lock_irqsave(&stream->vbq_lock, lock_flags);
605
- if (stream->curr_buf) {
655
+ if (stream->curr_buf && !stream->curr_buf->other)
606656 list_add_tail(&stream->curr_buf->queue, &stream->buf_queue);
607
- stream->curr_buf = NULL;
608
- }
657
+ stream->curr_buf = NULL;
609658 while (!list_empty(&stream->buf_queue)) {
610659 buf = list_first_entry(&stream->buf_queue,
611660 struct rkisp_buffer, queue);
612661 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);
614664 }
615665 spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
616666 }
....@@ -618,6 +668,10 @@
618668 static void dmarx_stop_streaming(struct vb2_queue *queue)
619669 {
620670 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);
621675
622676 if (!stream->streaming)
623677 return;
....@@ -626,7 +680,7 @@
626680 destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
627681
628682 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)
630684 kfifo_reset(&stream->ispdev->rdbk_kfifo);
631685 }
632686
....@@ -638,19 +692,20 @@
638692 struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
639693 int ret = -1;
640694
695
+ v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n",
696
+ __func__, stream->vnode.vdev.name, stream->id);
697
+
641698 if (WARN_ON(stream->streaming))
642699 return -EBUSY;
643700
644701 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);
646703 goto free_buf_queue;
647704 }
648705
649706 ret = dmarx_start(stream);
650707 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);
654709 goto free_buf_queue;
655710 }
656711 return 0;
....@@ -685,6 +740,8 @@
685740 q->allow_cache_hints = 1;
686741 q->bidirectional = 1;
687742 q->gfp_flags = GFP_DMA32;
743
+ if (stream->ispdev->hw_dev->is_dma_contig)
744
+ q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
688745 return vb2_queue_init(q);
689746 }
690747
....@@ -736,15 +793,17 @@
736793 fmt->fmt_type == FMT_BAYER)
737794 height += RKMODULE_EXTEND_LINE;
738795
739
- if ((stream->ispdev->isp_ver == ISP_V20 ||
740
- stream->ispdev->isp_ver == ISP_V21) &&
796
+ if (stream->ispdev->isp_ver >= ISP_V20 &&
741797 fmt->fmt_type == FMT_BAYER &&
742798 !stream->memory &&
743799 stream->id != RKISP_STREAM_DMARX)
744800 bytesperline = ALIGN(width * fmt->bpp[i] / 8, 256);
745801 else
746802 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
+
748807 if (i != 0 ||
749808 plane_fmt->bytesperline < bytesperline)
750809 plane_fmt->bytesperline = bytesperline;
....@@ -770,7 +829,7 @@
770829 DIV_ROUND_UP(fmt->bpp[0], 8);
771830
772831 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__,
774833 stream->id, pixm->width, pixm->height,
775834 stream->out_fmt.width, stream->out_fmt.height);
776835 }
....@@ -786,6 +845,9 @@
786845 .unlocked_ioctl = video_ioctl2,
787846 .poll = vb2_fop_poll,
788847 .mmap = vb2_fop_mmap,
848
+#ifdef CONFIG_COMPAT
849
+ .compat_ioctl32 = video_ioctl2,
850
+#endif
789851 };
790852
791853 static int rkisp_try_fmt_vid_out_mplane(struct file *file, void *fh,
....@@ -820,7 +882,8 @@
820882 struct rkisp_device *dev = stream->ispdev;
821883
822884 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);
824887 return -EBUSY;
825888 }
826889
....@@ -904,7 +967,7 @@
904967 .vidioc_streamon = vb2_ioctl_streamon,
905968 .vidioc_streamoff = vb2_ioctl_streamoff,
906969 .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,
908971 .vidioc_s_fmt_vid_out_mplane = rkisp_s_fmt_vid_out_mplane,
909972 .vidioc_g_fmt_vid_out_mplane = rkisp_g_fmt_vid_out_mplane,
910973 .vidioc_querycap = rkisp_querycap,
....@@ -945,7 +1008,7 @@
9451008 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
9461009 vdev->queue = &node->buf_queue;
9471010
948
- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1011
+ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
9491012 if (ret < 0) {
9501013 v4l2_err(v4l2_dev,
9511014 "%s failed with error %d\n", __func__, ret);
....@@ -1072,6 +1135,8 @@
10721135 {
10731136 struct rkisp_isp_subdev *sdev = &dev->isp_sdev;
10741137 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;
10751140
10761141 /* rx height should equal to isp height + offset for read back mode */
10771142 height = sdev->in_crop.top + sdev->in_crop.height;
....@@ -1083,7 +1148,8 @@
10831148 dev->rd_mode == HDR_RDBK_FRAME1)
10841149 height += RKMODULE_EXTEND_LINE;
10851150
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);
10871153 }
10881154
10891155 void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id,
....@@ -1094,7 +1160,7 @@
10941160 u64 sof_time = 0, frame_timestamp = 0;
10951161 u32 frame_id = 0;
10961162
1097
- if (!dev->dmarx_dev.trigger && id) {
1163
+ if (!IS_HDR_RDBK(dev->rd_mode) && id) {
10981164 *id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1;
10991165 return;
11001166 }
....@@ -1131,7 +1197,7 @@
11311197 if (ret < 0)
11321198 goto err;
11331199 #endif
1134
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
1200
+ if (dev->isp_ver >= ISP_V20) {
11351201 ret = dmarx_init(dev, RKISP_STREAM_RAWRD0);
11361202 if (ret < 0)
11371203 goto err_free_dmarx;
....@@ -1139,7 +1205,7 @@
11391205 if (ret < 0)
11401206 goto err_free_dmarx0;
11411207 }
1142
- if (dev->isp_ver == ISP_V20) {
1208
+ if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) {
11431209 ret = dmarx_init(dev, RKISP_STREAM_RAWRD1);
11441210 if (ret < 0)
11451211 goto err_free_dmarx2;
....@@ -1168,14 +1234,14 @@
11681234 rkisp_unregister_dmarx_video(stream);
11691235 #endif
11701236
1171
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
1237
+ if (dev->isp_ver >= ISP_V20) {
11721238 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD0];
11731239 rkisp_unregister_dmarx_video(stream);
11741240
11751241 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD2];
11761242 rkisp_unregister_dmarx_video(stream);
11771243 }
1178
- if (dev->isp_ver == ISP_V20) {
1244
+ if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) {
11791245 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD1];
11801246 rkisp_unregister_dmarx_video(stream);
11811247 }