hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/platform/rockchip/isp/dmarx.c
....@@ -346,9 +346,9 @@
346346 default:
347347 val |= CIF_CSI2_DT_RAW12;
348348 }
349
- rkisp_write(dev, CSI2RX_RAW_RD_CTRL,
350
- stream->memory << 2, false);
351
- rkisp_write(dev, CSI2RX_DATA_IDS_1, val, false);
349
+ rkisp_unite_write(dev, CSI2RX_RAW_RD_CTRL,
350
+ stream->memory << 2, false);
351
+ rkisp_unite_write(dev, CSI2RX_DATA_IDS_1, val, false);
352352 rkisp_rawrd_set_pic_size(dev, stream->out_fmt.width,
353353 stream->out_fmt.height);
354354 mi_raw_length(stream);
....@@ -364,25 +364,40 @@
364364 {
365365 struct rkisp_device *dev = stream->ispdev;
366366 void __iomem *base = dev->base_addr;
367
+ struct capture_fmt *fmt = &stream->out_isp_fmt;
368
+ u32 val = 0;
367369
368370 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);
371
+ if (dev->vicap_in.merge_num > 1) {
372
+ val = stream->out_fmt.plane_fmt[0].bytesperline;
373
+ val /= dev->vicap_in.merge_num;
374
+ val *= dev->vicap_in.index;
375
+ }
376
+ val += stream->curr_buf->buff_addr[RKISP_PLANE_Y];
377
+ rkisp_write(dev, stream->config->mi.y_base_ad_init, val, false);
378
+ if (dev->hw_dev->unite) {
379
+ u32 offs = stream->out_fmt.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL;
380
+
381
+ if (stream->memory)
382
+ offs *= DIV_ROUND_UP(fmt->bpp[0], 8);
383
+ else
384
+ offs = offs * fmt->bpp[0] / 8;
385
+ val += offs;
386
+ rkisp_next_write(dev, stream->config->mi.y_base_ad_init, val, false);
387
+ }
372388 stream->frame_end = false;
373
- if (stream->id == RKISP_STREAM_RAWRD2 &&
374
- stream->out_isp_fmt.fmt_type == FMT_YUV) {
389
+ if (stream->id == RKISP_STREAM_RAWRD2 && stream->out_isp_fmt.fmt_type == FMT_YUV) {
375390 struct vb2_v4l2_buffer *vbuf = &stream->curr_buf->vb;
376391 struct isp2x_csi_trigger trigger = {
377392 .frame_timestamp = vbuf->vb2_buf.timestamp,
378393 .sof_timestamp = vbuf->vb2_buf.timestamp,
379394 .frame_id = vbuf->sequence,
380
- .mode = T_START_X1,
395
+ .mode = 0,
381396 .times = 0,
382397 };
383398
384399 if (!vbuf->sequence)
385
- trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq);
400
+ trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq) - 1;
386401 rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, &trigger);
387402 }
388403 } else if (dev->dmarx_dev.trigger == T_AUTO) {
....@@ -430,8 +445,37 @@
430445
431446 spin_lock_irqsave(&stream->vbq_lock, lock_flags);
432447 if (stream->curr_buf) {
433
- vb2_buffer_done(&stream->curr_buf->vb.vb2_buf,
434
- VB2_BUF_STATE_DONE);
448
+ if (stream->curr_buf->other) {
449
+ struct rkisp_device *dev = stream->ispdev;
450
+ struct v4l2_subdev *sd = dev->active_sensor->sd;
451
+ struct rkisp_rx_buf *rx_buf = stream->curr_buf->other;
452
+
453
+ if (rx_buf->is_switch && stream->id == RKISP_STREAM_RAWRD2) {
454
+ switch (dev->rd_mode) {
455
+ case HDR_RDBK_FRAME3:
456
+ dev->rd_mode = HDR_LINEX3_DDR;
457
+ break;
458
+ case HDR_RDBK_FRAME2:
459
+ dev->rd_mode = HDR_LINEX2_DDR;
460
+ break;
461
+ default:
462
+ dev->rd_mode = HDR_NORMAL;
463
+ }
464
+ dev->hdr.op_mode = dev->rd_mode;
465
+ rkisp_unite_write(dev, CSI2RX_CTRL0,
466
+ SW_IBUF_OP_MODE(dev->hdr.op_mode), true);
467
+ rkisp_unite_set_bits(dev, CSI2RX_MASK_STAT,
468
+ 0, ISP21_MIPI_DROP_FRM, true);
469
+ rkisp_unite_clear_bits(dev, CIF_ISP_IMSC, CIF_ISP_FRAME_IN, true);
470
+ dev_info(dev->dev,
471
+ "switch online seq:%d mode:0x%x\n",
472
+ rx_buf->sequence, dev->rd_mode);
473
+ }
474
+ rx_buf->runtime_us = dev->isp_sdev.dbg.interval / 1000;
475
+ v4l2_subdev_call(sd, video, s_rx_buffer, rx_buf, NULL);
476
+ } else {
477
+ vb2_buffer_done(&stream->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
478
+ }
435479 stream->curr_buf = NULL;
436480 }
437481
....@@ -443,7 +487,8 @@
443487 list_del(&stream->curr_buf->queue);
444488 }
445489
446
- stream->ops->update_mi(stream);
490
+ if (stream->curr_buf)
491
+ stream->ops->update_mi(stream);
447492 spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
448493 return 0;
449494 }
....@@ -457,10 +502,11 @@
457502 int ret = 0;
458503
459504 stream->stopping = true;
460
- if ((dev->isp_state & ISP_START) && !stream->frame_end) {
505
+ if ((dev->isp_state & ISP_START) && !stream->frame_end &&
506
+ !dev->hw_dev->is_shutdown) {
461507 ret = wait_event_timeout(stream->done,
462508 !stream->streaming,
463
- msecs_to_jiffies(100));
509
+ msecs_to_jiffies(300));
464510 if (!ret)
465511 v4l2_warn(v4l2_dev,
466512 "dmarx:%d waiting on event return error %d\n",
....@@ -512,8 +558,8 @@
512558 }
513559
514560 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]);
561
+ v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s %s count %d, size %d\n",
562
+ stream->vnode.vdev.name, v4l2_type_names[queue->type], *num_buffers, sizes[0]);
517563
518564 return 0;
519565 }
....@@ -534,6 +580,7 @@
534580 struct sg_table *sgt;
535581 int i;
536582
583
+ ispbuf->other = NULL;
537584 memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr));
538585 for (i = 0; i < isp_fmt->mplanes; i++) {
539586 void *vaddr = vb2_plane_vaddr(vb, i);
....@@ -601,15 +648,15 @@
601648 unsigned long lock_flags = 0;
602649
603650 spin_lock_irqsave(&stream->vbq_lock, lock_flags);
604
- if (stream->curr_buf) {
651
+ if (stream->curr_buf && !stream->curr_buf->other)
605652 list_add_tail(&stream->curr_buf->queue, &stream->buf_queue);
606
- stream->curr_buf = NULL;
607
- }
653
+ stream->curr_buf = NULL;
608654 while (!list_empty(&stream->buf_queue)) {
609655 buf = list_first_entry(&stream->buf_queue,
610656 struct rkisp_buffer, queue);
611657 list_del(&buf->queue);
612
- vb2_buffer_done(&buf->vb.vb2_buf, state);
658
+ if (!buf->other)
659
+ vb2_buffer_done(&buf->vb.vb2_buf, state);
613660 }
614661 spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
615662 }
....@@ -617,6 +664,10 @@
617664 static void dmarx_stop_streaming(struct vb2_queue *queue)
618665 {
619666 struct rkisp_stream *stream = queue->drv_priv;
667
+ struct v4l2_device *v4l2_dev = &stream->ispdev->v4l2_dev;
668
+
669
+ v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n",
670
+ __func__, stream->vnode.vdev.name, stream->id);
620671
621672 if (!stream->streaming)
622673 return;
....@@ -625,7 +676,7 @@
625676 destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
626677
627678 if (stream->id == RKISP_STREAM_RAWRD2 &&
628
- (stream->ispdev->isp_ver == ISP_V20 || stream->ispdev->isp_ver == ISP_V21))
679
+ stream->ispdev->isp_ver >= ISP_V20)
629680 kfifo_reset(&stream->ispdev->rdbk_kfifo);
630681 }
631682
....@@ -637,19 +688,20 @@
637688 struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
638689 int ret = -1;
639690
691
+ v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n",
692
+ __func__, stream->vnode.vdev.name, stream->id);
693
+
640694 if (WARN_ON(stream->streaming))
641695 return -EBUSY;
642696
643697 if (!stream->linked) {
644
- v4l2_err(v4l2_dev, "check video link\n");
698
+ v4l2_err(v4l2_dev, "check %s link\n", stream->vnode.vdev.name);
645699 goto free_buf_queue;
646700 }
647701
648702 ret = dmarx_start(stream);
649703 if (ret < 0) {
650
- v4l2_err(v4l2_dev,
651
- "start dmarx stream:%d failed\n",
652
- stream->id);
704
+ v4l2_err(v4l2_dev, "start %s failed\n", stream->vnode.vdev.name);
653705 goto free_buf_queue;
654706 }
655707 return 0;
....@@ -684,6 +736,8 @@
684736 q->allow_cache_hints = 1;
685737 q->bidirectional = 1;
686738 q->gfp_flags = GFP_DMA32;
739
+ if (stream->ispdev->hw_dev->is_dma_contig)
740
+ q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
687741 return vb2_queue_init(q);
688742 }
689743
....@@ -735,15 +789,17 @@
735789 fmt->fmt_type == FMT_BAYER)
736790 height += RKMODULE_EXTEND_LINE;
737791
738
- if ((stream->ispdev->isp_ver == ISP_V20 ||
739
- stream->ispdev->isp_ver == ISP_V21) &&
792
+ if (stream->ispdev->isp_ver >= ISP_V20 &&
740793 fmt->fmt_type == FMT_BAYER &&
741794 !stream->memory &&
742795 stream->id != RKISP_STREAM_DMARX)
743796 bytesperline = ALIGN(width * fmt->bpp[i] / 8, 256);
744797 else
745798 bytesperline = width * DIV_ROUND_UP(fmt->bpp[i], 8);
746
- /* stride is only available for sp stream and y plane */
799
+
800
+ if (stream->ispdev->vicap_in.merge_num > 1)
801
+ bytesperline *= stream->ispdev->vicap_in.merge_num;
802
+
747803 if (i != 0 ||
748804 plane_fmt->bytesperline < bytesperline)
749805 plane_fmt->bytesperline = bytesperline;
....@@ -769,7 +825,7 @@
769825 DIV_ROUND_UP(fmt->bpp[0], 8);
770826
771827 v4l2_dbg(1, rkisp_debug, &stream->ispdev->v4l2_dev,
772
- "%s: stream: %d req(%d, %d) out(%d, %d)\n", __func__,
828
+ "%s: rx:%d req(%d, %d) out(%d, %d)\n", __func__,
773829 stream->id, pixm->width, pixm->height,
774830 stream->out_fmt.width, stream->out_fmt.height);
775831 }
....@@ -822,7 +878,8 @@
822878 struct rkisp_device *dev = stream->ispdev;
823879
824880 if (vb2_is_busy(&node->buf_queue)) {
825
- v4l2_err(&dev->v4l2_dev, "%s queue busy\n", __func__);
881
+ v4l2_err(&dev->v4l2_dev, "%s rx:%d queue busy\n",
882
+ __func__, stream->id);
826883 return -EBUSY;
827884 }
828885
....@@ -906,7 +963,7 @@
906963 .vidioc_streamon = vb2_ioctl_streamon,
907964 .vidioc_streamoff = vb2_ioctl_streamoff,
908965 .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,
966
+ .vidioc_enum_fmt_vid_out = rkisp_enum_fmt_vid_out_mplane,
910967 .vidioc_s_fmt_vid_out_mplane = rkisp_s_fmt_vid_out_mplane,
911968 .vidioc_g_fmt_vid_out_mplane = rkisp_g_fmt_vid_out_mplane,
912969 .vidioc_querycap = rkisp_querycap,
....@@ -947,7 +1004,7 @@
9471004 V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
9481005 vdev->queue = &node->buf_queue;
9491006
950
- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1007
+ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
9511008 if (ret < 0) {
9521009 v4l2_err(v4l2_dev,
9531010 "%s failed with error %d\n", __func__, ret);
....@@ -1074,6 +1131,8 @@
10741131 {
10751132 struct rkisp_isp_subdev *sdev = &dev->isp_sdev;
10761133 u8 mult = sdev->in_fmt.fmt_type == FMT_YUV ? 2 : 1;
1134
+ bool is_unite = !!dev->hw_dev->unite;
1135
+ u32 w = !is_unite ? width : width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
10771136
10781137 /* rx height should equal to isp height + offset for read back mode */
10791138 height = sdev->in_crop.top + sdev->in_crop.height;
....@@ -1085,7 +1144,8 @@
10851144 dev->rd_mode == HDR_RDBK_FRAME1)
10861145 height += RKMODULE_EXTEND_LINE;
10871146
1088
- rkisp_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | width * mult, false);
1147
+ w *= mult;
1148
+ rkisp_unite_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | w, false);
10891149 }
10901150
10911151 void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id,
....@@ -1096,9 +1156,10 @@
10961156 u64 sof_time = 0, frame_timestamp = 0;
10971157 u32 frame_id = 0;
10981158
1099
- if (!dev->dmarx_dev.trigger && id) {
1100
- *id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1;
1101
- return;
1159
+ if (!IS_HDR_RDBK(dev->rd_mode)) {
1160
+ frame_id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1;
1161
+ frame_timestamp = dev->isp_sdev.frm_timestamp;
1162
+ goto end;
11021163 }
11031164
11041165 spin_lock_irqsave(&dev->rdbk_lock, flag);
....@@ -1112,6 +1173,7 @@
11121173 frame_timestamp = dev->dmarx_dev.pre_frame.timestamp;
11131174 }
11141175 spin_unlock_irqrestore(&dev->rdbk_lock, flag);
1176
+end:
11151177 if (id)
11161178 *id = frame_id;
11171179 if (sof_timestamp)
....@@ -1133,7 +1195,7 @@
11331195 if (ret < 0)
11341196 goto err;
11351197 #endif
1136
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
1198
+ if (dev->isp_ver >= ISP_V20) {
11371199 ret = dmarx_init(dev, RKISP_STREAM_RAWRD0);
11381200 if (ret < 0)
11391201 goto err_free_dmarx;
....@@ -1141,7 +1203,7 @@
11411203 if (ret < 0)
11421204 goto err_free_dmarx0;
11431205 }
1144
- if (dev->isp_ver == ISP_V20) {
1206
+ if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) {
11451207 ret = dmarx_init(dev, RKISP_STREAM_RAWRD1);
11461208 if (ret < 0)
11471209 goto err_free_dmarx2;
....@@ -1170,14 +1232,14 @@
11701232 rkisp_unregister_dmarx_video(stream);
11711233 #endif
11721234
1173
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
1235
+ if (dev->isp_ver >= ISP_V20) {
11741236 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD0];
11751237 rkisp_unregister_dmarx_video(stream);
11761238
11771239 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD2];
11781240 rkisp_unregister_dmarx_video(stream);
11791241 }
1180
- if (dev->isp_ver == ISP_V20) {
1242
+ if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) {
11811243 stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD1];
11821244 rkisp_unregister_dmarx_video(stream);
11831245 }