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,8 @@
443491 list_del(&stream->curr_buf->queue);
444492 }
445493
446
- stream->ops->update_mi(stream);
494
+ if (stream->curr_buf)
495
+ stream->ops->update_mi(stream);
447496 spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
448497 return 0;
449498 }
....@@ -457,10 +506,11 @@
457506 int ret = 0;
458507
459508 stream->stopping = true;
460
- 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) {
461511 ret = wait_event_timeout(stream->done,
462512 !stream->streaming,
463
- msecs_to_jiffies(100));
513
+ msecs_to_jiffies(300));
464514 if (!ret)
465515 v4l2_warn(v4l2_dev,
466516 "dmarx:%d waiting on event return error %d\n",
....@@ -512,8 +562,8 @@
512562 }
513563
514564 rkisp_chk_tb_over(dev);
515
- v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s count %d, size %d\n",
516
- 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]);
517567
518568 return 0;
519569 }
....@@ -534,6 +584,7 @@
534584 struct sg_table *sgt;
535585 int i;
536586
587
+ ispbuf->other = NULL;
537588 memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr));
538589 for (i = 0; i < isp_fmt->mplanes; i++) {
539590 void *vaddr = vb2_plane_vaddr(vb, i);
....@@ -601,15 +652,15 @@
601652 unsigned long lock_flags = 0;
602653
603654 spin_lock_irqsave(&stream->vbq_lock, lock_flags);
604
- if (stream->curr_buf) {
655
+ if (stream->curr_buf && !stream->curr_buf->other)
605656 list_add_tail(&stream->curr_buf->queue, &stream->buf_queue);
606
- stream->curr_buf = NULL;
607
- }
657
+ stream->curr_buf = NULL;
608658 while (!list_empty(&stream->buf_queue)) {
609659 buf = list_first_entry(&stream->buf_queue,
610660 struct rkisp_buffer, queue);
611661 list_del(&buf->queue);
612
- vb2_buffer_done(&buf->vb.vb2_buf, state);
662
+ if (!buf->other)
663
+ vb2_buffer_done(&buf->vb.vb2_buf, state);
613664 }
614665 spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
615666 }
....@@ -617,6 +668,10 @@
617668 static void dmarx_stop_streaming(struct vb2_queue *queue)
618669 {
619670 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);
620675
621676 if (!stream->streaming)
622677 return;
....@@ -625,7 +680,7 @@
625680 destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
626681
627682 if (stream->id == RKISP_STREAM_RAWRD2 &&
628
- (stream->ispdev->isp_ver == ISP_V20 || stream->ispdev->isp_ver == ISP_V21))
683
+ stream->ispdev->isp_ver >= ISP_V20)
629684 kfifo_reset(&stream->ispdev->rdbk_kfifo);
630685 }
631686
....@@ -637,19 +692,20 @@
637692 struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
638693 int ret = -1;
639694
695
+ v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n",
696
+ __func__, stream->vnode.vdev.name, stream->id);
697
+
640698 if (WARN_ON(stream->streaming))
641699 return -EBUSY;
642700
643701 if (!stream->linked) {
644
- v4l2_err(v4l2_dev, "check video link\n");
702
+ v4l2_err(v4l2_dev, "check %s link\n", stream->vnode.vdev.name);
645703 goto free_buf_queue;
646704 }
647705
648706 ret = dmarx_start(stream);
649707 if (ret < 0) {
650
- v4l2_err(v4l2_dev,
651
- "start dmarx stream:%d failed\n",
652
- stream->id);
708
+ v4l2_err(v4l2_dev, "start %s failed\n", stream->vnode.vdev.name);
653709 goto free_buf_queue;
654710 }
655711 return 0;
....@@ -684,6 +740,8 @@
684740 q->allow_cache_hints = 1;
685741 q->bidirectional = 1;
686742 q->gfp_flags = GFP_DMA32;
743
+ if (stream->ispdev->hw_dev->is_dma_contig)
744
+ q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
687745 return vb2_queue_init(q);
688746 }
689747
....@@ -735,15 +793,17 @@
735793 fmt->fmt_type == FMT_BAYER)
736794 height += RKMODULE_EXTEND_LINE;
737795
738
- if ((stream->ispdev->isp_ver == ISP_V20 ||
739
- stream->ispdev->isp_ver == ISP_V21) &&
796
+ if (stream->ispdev->isp_ver >= ISP_V20 &&
740797 fmt->fmt_type == FMT_BAYER &&
741798 !stream->memory &&
742799 stream->id != RKISP_STREAM_DMARX)
743800 bytesperline = ALIGN(width * fmt->bpp[i] / 8, 256);
744801 else
745802 bytesperline = width * DIV_ROUND_UP(fmt->bpp[i], 8);
746
- /* 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
+
747807 if (i != 0 ||
748808 plane_fmt->bytesperline < bytesperline)
749809 plane_fmt->bytesperline = bytesperline;
....@@ -769,7 +829,7 @@
769829 DIV_ROUND_UP(fmt->bpp[0], 8);
770830
771831 v4l2_dbg(1, rkisp_debug, &stream->ispdev->v4l2_dev,
772
- "%s: stream: %d req(%d, %d) out(%d, %d)\n", __func__,
832
+ "%s: rx:%d req(%d, %d) out(%d, %d)\n", __func__,
773833 stream->id, pixm->width, pixm->height,
774834 stream->out_fmt.width, stream->out_fmt.height);
775835 }
....@@ -822,7 +882,8 @@
822882 struct rkisp_device *dev = stream->ispdev;
823883
824884 if (vb2_is_busy(&node->buf_queue)) {
825
- 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);
826887 return -EBUSY;
827888 }
828889
....@@ -906,7 +967,7 @@
906967 .vidioc_streamon = vb2_ioctl_streamon,
907968 .vidioc_streamoff = vb2_ioctl_streamoff,
908969 .vidioc_try_fmt_vid_out_mplane = rkisp_try_fmt_vid_out_mplane,
909
- .vidioc_enum_fmt_vid_out_mplane = rkisp_enum_fmt_vid_out_mplane,
970
+ .vidioc_enum_fmt_vid_out = rkisp_enum_fmt_vid_out_mplane,
910971 .vidioc_s_fmt_vid_out_mplane = rkisp_s_fmt_vid_out_mplane,
911972 .vidioc_g_fmt_vid_out_mplane = rkisp_g_fmt_vid_out_mplane,
912973 .vidioc_querycap = rkisp_querycap,
....@@ -947,7 +1008,7 @@
9471008 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
9481009 vdev->queue = &node->buf_queue;
9491010
950
- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1011
+ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
9511012 if (ret < 0) {
9521013 v4l2_err(v4l2_dev,
9531014 "%s failed with error %d\n", __func__, ret);
....@@ -1074,6 +1135,8 @@
10741135 {
10751136 struct rkisp_isp_subdev *sdev = &dev->isp_sdev;
10761137 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;
10771140
10781141 /* rx height should equal to isp height + offset for read back mode */
10791142 height = sdev->in_crop.top + sdev->in_crop.height;
....@@ -1085,7 +1148,8 @@
10851148 dev->rd_mode == HDR_RDBK_FRAME1)
10861149 height += RKMODULE_EXTEND_LINE;
10871150
1088
- 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);
10891153 }
10901154
10911155 void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id,
....@@ -1096,7 +1160,7 @@
10961160 u64 sof_time = 0, frame_timestamp = 0;
10971161 u32 frame_id = 0;
10981162
1099
- if (!dev->dmarx_dev.trigger && id) {
1163
+ if (!IS_HDR_RDBK(dev->rd_mode) && id) {
11001164 *id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1;
11011165 return;
11021166 }
....@@ -1133,7 +1197,7 @@
11331197 if (ret < 0)
11341198 goto err;
11351199 #endif
1136
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
1200
+ if (dev->isp_ver >= ISP_V20) {
11371201 ret = dmarx_init(dev, RKISP_STREAM_RAWRD0);
11381202 if (ret < 0)
11391203 goto err_free_dmarx;
....@@ -1141,7 +1205,7 @@
11411205 if (ret < 0)
11421206 goto err_free_dmarx0;
11431207 }
1144
- if (dev->isp_ver == ISP_V20) {
1208
+ if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) {
11451209 ret = dmarx_init(dev, RKISP_STREAM_RAWRD1);
11461210 if (ret < 0)
11471211 goto err_free_dmarx2;
....@@ -1170,14 +1234,14 @@
11701234 rkisp_unregister_dmarx_video(stream);
11711235 #endif
11721236
1173
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
1237
+ if (dev->isp_ver >= ISP_V20) {
11741238 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD0];
11751239 rkisp_unregister_dmarx_video(stream);
11761240
11771241 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD2];
11781242 rkisp_unregister_dmarx_video(stream);
11791243 }
1180
- if (dev->isp_ver == ISP_V20) {
1244
+ if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) {
11811245 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD1];
11821246 rkisp_unregister_dmarx_video(stream);
11831247 }