hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/platform/rockchip/isp/isp_stats_v32.c
....@@ -428,6 +428,8 @@
428428 struct rkisp_device *dev = stats_vdev->dev;
429429 struct rkisp_buffer *buf;
430430 unsigned long flags;
431
+ u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize;
432
+ u32 val = 0;
431433
432434 spin_lock_irqsave(&stats_vdev->rd_lock, flags);
433435 if (!stats_vdev->nxt_buf && !list_empty(&stats_vdev->stat)) {
....@@ -439,18 +441,23 @@
439441 spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
440442
441443 if (stats_vdev->nxt_buf) {
442
- rkisp_write(dev, ISP3X_MI_3A_WR_BASE, stats_vdev->nxt_buf->buff_addr[0], false);
444
+ val = stats_vdev->nxt_buf->buff_addr[0];
443445 v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
444446 "%s BASE:0x%x SHD:0x%x\n",
445
- __func__, stats_vdev->nxt_buf->buff_addr[0],
447
+ __func__, val,
446448 isp3_stats_read(stats_vdev, ISP3X_MI_3A_WR_BASE));
447449 if (!dev->hw_dev->is_single) {
448450 stats_vdev->cur_buf = stats_vdev->nxt_buf;
449451 stats_vdev->nxt_buf = NULL;
450452 }
451453 } else if (stats_vdev->stats_buf[0].mem_priv) {
452
- rkisp_write(dev, ISP3X_MI_3A_WR_BASE,
453
- stats_vdev->stats_buf[0].dma_addr, false);
454
+ val = stats_vdev->stats_buf[0].dma_addr;
455
+ }
456
+
457
+ if (val) {
458
+ rkisp_write(dev, ISP3X_MI_3A_WR_BASE, val, false);
459
+ if (dev->hw_dev->unite)
460
+ rkisp_next_write(dev, ISP3X_MI_3A_WR_BASE, val + size / 2, false);
454461 }
455462 }
456463
....@@ -461,7 +468,7 @@
461468 struct rkisp_isp_params_val_v32 *priv_val;
462469 struct rkisp_dummy_buffer *buf;
463470 int idx, buf_fd = -1;
464
- u32 reg = 0, ctrl;
471
+ u32 reg = 0, ctrl, mask;
465472
466473 priv_val = (struct rkisp_isp_params_val_v32 *)dev->params_vdev.priv_val;
467474 if (!priv_val->buf_info_owner && priv_val->buf_info_idx >= 0) {
....@@ -474,9 +481,11 @@
474481 if (priv_val->buf_info_owner == RKISP_INFO2DRR_OWNER_GAIN) {
475482 reg = ISP3X_GAIN_CTRL;
476483 ctrl = ISP3X_GAIN_2DDR_EN;
484
+ mask = ISP3X_GAIN_2DDR_EN;
477485 } else {
478486 reg = ISP3X_RAWAWB_CTRL;
479487 ctrl = ISP32_RAWAWB_2DDR_PATH_EN;
488
+ mask = ISP32_RAWAWB_2DDR_PATH_EN | ISP32_RAWAWB_2DDR_PATH_DS;
480489 }
481490
482491 idx = priv_val->buf_info_idx;
....@@ -503,6 +512,12 @@
503512 } else if (reg == ISP3X_RAWAWB_CTRL &&
504513 rkisp_read(dev, reg, true) & ISP32_RAWAWB_2DDR_PATH_ERR) {
505514 v4l2_warn(&dev->v4l2_dev, "rawawb2ddr path error idx:%d\n", idx);
515
+ } else {
516
+ u32 v0 = rkisp_read(dev, reg, false);
517
+ u32 v1 = rkisp_read_reg_cache(dev, reg);
518
+
519
+ if ((v0 & mask) != (v1 & mask))
520
+ rkisp_write(dev, reg, v0 | (v1 & mask), false);
506521 }
507522
508523 if (buf_fd == -1)
....@@ -533,14 +548,15 @@
533548 rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev,
534549 struct rkisp_isp_readout_work *meas_work)
535550 {
536
- unsigned int cur_frame_id = -1;
551
+ struct rkisp_device *dev = stats_vdev->dev;
552
+ struct rkisp_hw_dev *hw = dev->hw_dev;
553
+ struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev;
537554 struct rkisp_buffer *cur_buf = stats_vdev->cur_buf;
538555 struct rkisp32_isp_stat_buffer *cur_stat_buf = NULL;
539556 struct rkisp_stats_ops_v32 *ops =
540557 (struct rkisp_stats_ops_v32 *)stats_vdev->priv_ops;
541
- struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev;
542
- u32 size = sizeof(struct rkisp32_isp_stat_buffer);
543
- int ret = 0;
558
+ u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize;
559
+ u32 cur_frame_id = meas_work->frame_id;
544560 bool is_dummy = false;
545561 unsigned long flags;
546562
....@@ -548,97 +564,110 @@
548564 if (!cur_buf && stats_vdev->stats_buf[0].mem_priv) {
549565 rkisp_finish_buffer(stats_vdev->dev, &stats_vdev->stats_buf[0]);
550566 cur_stat_buf = stats_vdev->stats_buf[0].vaddr;
551
- cur_stat_buf->frame_id = -1;
567
+ cur_stat_buf->frame_id = cur_frame_id;
568
+ cur_stat_buf->params_id = params_vdev->cur_frame_id;
552569 is_dummy = true;
553570 } else if (cur_buf) {
554571 cur_stat_buf = cur_buf->vaddr[0];
572
+ cur_stat_buf->frame_id = cur_frame_id;
573
+ cur_stat_buf->params_id = params_vdev->cur_frame_id;
555574 }
556
- /* config buf for next frame */
557
- stats_vdev->cur_buf = NULL;
558
- if (stats_vdev->nxt_buf) {
559
- stats_vdev->cur_buf = stats_vdev->nxt_buf;
560
- stats_vdev->nxt_buf = NULL;
561
- }
562
- rkisp_stats_update_buf(stats_vdev);
563575
564
- cur_frame_id = meas_work->frame_id;
576
+ /* buffer done when frame of right handle */
577
+ if (hw->unite == ISP_UNITE_ONE) {
578
+ if (dev->unite_index == ISP_UNITE_LEFT) {
579
+ cur_buf = NULL;
580
+ is_dummy = false;
581
+ } else if (cur_stat_buf) {
582
+ cur_stat_buf = (void *)cur_stat_buf + size / 2;
583
+ cur_stat_buf->frame_id = cur_frame_id;
584
+ cur_stat_buf->params_id = params_vdev->cur_frame_id;
585
+ }
586
+ }
587
+
588
+ if (hw->unite != ISP_UNITE_ONE || dev->unite_index == ISP_UNITE_RIGHT) {
589
+ /* config buf for next frame */
590
+ stats_vdev->cur_buf = NULL;
591
+ if (stats_vdev->nxt_buf) {
592
+ stats_vdev->cur_buf = stats_vdev->nxt_buf;
593
+ stats_vdev->nxt_buf = NULL;
594
+ }
595
+ rkisp_stats_update_buf(stats_vdev);
596
+ }
565597 } else {
566598 cur_buf = NULL;
567599 }
568600
569601 if (meas_work->isp3a_ris & ISP3X_3A_RAWAWB)
570
- ret |= ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
602
+ ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
571603
572604 if (meas_work->isp3a_ris & ISP3X_3A_RAWAF ||
573605 stats_vdev->af_meas_done_next)
574
- ret |= ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
606
+ ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
575607
576608 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_BIG ||
577609 stats_vdev->ae_meas_done_next)
578
- ret |= ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
610
+ ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
579611
580612 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_BIG)
581
- ret |= ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
613
+ ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
582614
583615 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH0)
584
- ret |= ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
616
+ ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
585617
586618 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH1)
587
- ret |= ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
619
+ ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
588620
589621 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH2)
590
- ret |= ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
622
+ ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
591623
592624 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH0)
593
- ret |= ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
625
+ ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
594626
595627 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH1)
596
- ret |= ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
628
+ ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
597629
598630 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH2)
599
- ret |= ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
631
+ ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
600632
601633 if (meas_work->isp_ris & ISP3X_FRAME) {
602
- ret |= ops->get_bls_stats(stats_vdev, cur_stat_buf);
603
- ret |= ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
604
- ret |= ops->get_vsm_stats(stats_vdev, cur_stat_buf);
634
+ ops->get_bls_stats(stats_vdev, cur_stat_buf);
635
+ ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
636
+ ops->get_vsm_stats(stats_vdev, cur_stat_buf);
605637 }
606638
607
- if (ret || (cur_stat_buf && !cur_stat_buf->meas_type)) {
639
+ if (cur_stat_buf && stats_vdev->dev->is_first_double)
640
+ cur_stat_buf->meas_type |= ISP32_STAT_RTT_FST;
641
+
642
+ if (is_dummy) {
643
+ spin_lock_irqsave(&stats_vdev->rd_lock, flags);
644
+ if (!list_empty(&stats_vdev->stat)) {
645
+ cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue);
646
+ list_del(&cur_buf->queue);
647
+ }
648
+ spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
608649 if (cur_buf) {
609
- spin_lock_irqsave(&stats_vdev->rd_lock, flags);
610
- list_add_tail(&cur_buf->queue, &stats_vdev->stat);
611
- spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
612
- }
613
- } else {
614
- if (is_dummy) {
615
- spin_lock_irqsave(&stats_vdev->rd_lock, flags);
616
- if (!list_empty(&stats_vdev->stat)) {
617
- cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue);
618
- list_del(&cur_buf->queue);
619
- } else {
620
- cur_stat_buf->frame_id = cur_frame_id;
621
- cur_stat_buf->params_id = params_vdev->cur_frame_id;
622
- }
623
- spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
624
- if (cur_buf) {
625
- memcpy(cur_buf->vaddr[0], cur_stat_buf, size);
626
- cur_stat_buf = cur_buf->vaddr[0];
627
- }
628
- }
629
- if (cur_buf && cur_stat_buf) {
630
- cur_stat_buf->frame_id = cur_frame_id;
631
- cur_stat_buf->params_id = params_vdev->cur_frame_id;
632
- cur_stat_buf->params.info2ddr.buf_fd = -1;
633
- cur_stat_buf->params.info2ddr.owner = 0;
634
- rkisp_stats_info2ddr(stats_vdev, cur_stat_buf);
635
-
636
- vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size);
637
- cur_buf->vb.sequence = cur_frame_id;
638
- cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
639
- vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
650
+ memcpy(cur_buf->vaddr[0], stats_vdev->stats_buf[0].vaddr, size);
651
+ cur_stat_buf = cur_buf->vaddr[0];
640652 }
641653 }
654
+ if (cur_buf && cur_stat_buf) {
655
+ cur_stat_buf->frame_id = cur_frame_id;
656
+ cur_stat_buf->params_id = params_vdev->cur_frame_id;
657
+ cur_stat_buf->params.info2ddr.buf_fd = -1;
658
+ cur_stat_buf->params.info2ddr.owner = 0;
659
+ rkisp_stats_info2ddr(stats_vdev, cur_stat_buf);
660
+
661
+ vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size);
662
+ cur_buf->vb.sequence = cur_frame_id;
663
+ cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
664
+ vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
665
+ }
666
+ v4l2_dbg(4, rkisp_debug, &dev->v4l2_dev,
667
+ "%s id:%d seq:%d params_id:%d ris:0x%x buf:%p meas_type:0x%x\n",
668
+ __func__, dev->unite_index,
669
+ cur_frame_id, params_vdev->cur_frame_id, meas_work->isp3a_ris,
670
+ cur_buf, !cur_stat_buf ? 0 : cur_stat_buf->meas_type);
642671 }
643672
644673 static int
....@@ -890,12 +919,12 @@
890919 rkisp_stats_send_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev,
891920 struct rkisp_isp_readout_work *meas_work)
892921 {
893
- struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev;
922
+ struct rkisp_device *dev = stats_vdev->dev;
923
+ struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev;
894924 unsigned int cur_frame_id = meas_work->frame_id;
895925 struct rkisp_buffer *cur_buf = NULL;
896926 struct rkisp32_lite_stat_buffer *cur_stat_buf = NULL;
897927 u32 size = sizeof(struct rkisp32_lite_stat_buffer);
898
- int ret = 0;
899928
900929 spin_lock(&stats_vdev->rd_lock);
901930 if (!list_empty(&stats_vdev->stat)) {
....@@ -913,45 +942,42 @@
913942 }
914943
915944 if (meas_work->isp3a_ris & ISP3X_3A_RAWAWB)
916
- ret |= rkisp_stats_get_rawawb_meas_lite(stats_vdev, cur_stat_buf);
945
+ rkisp_stats_get_rawawb_meas_lite(stats_vdev, cur_stat_buf);
917946
918947 if (meas_work->isp3a_ris & ISP3X_3A_RAWAF ||
919948 stats_vdev->af_meas_done_next)
920
- ret |= rkisp_stats_get_rawaf_meas_lite(stats_vdev, cur_stat_buf);
949
+ rkisp_stats_get_rawaf_meas_lite(stats_vdev, cur_stat_buf);
921950
922951 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_BIG ||
923952 stats_vdev->ae_meas_done_next)
924
- ret |= rkisp_stats_get_rawae3_meas_lite(stats_vdev, cur_stat_buf);
953
+ rkisp_stats_get_rawae3_meas_lite(stats_vdev, cur_stat_buf);
925954
926955 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_BIG)
927
- ret |= rkisp_stats_get_rawhst3_meas_lite(stats_vdev, cur_stat_buf);
956
+ rkisp_stats_get_rawhst3_meas_lite(stats_vdev, cur_stat_buf);
928957
929958 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH0)
930
- ret |= rkisp_stats_get_rawaelite_meas_lite(stats_vdev, cur_stat_buf);
959
+ rkisp_stats_get_rawaelite_meas_lite(stats_vdev, cur_stat_buf);
931960
932961 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH0)
933
- ret |= rkisp_stats_get_rawhstlite_meas_lite(stats_vdev, cur_stat_buf);
962
+ rkisp_stats_get_rawhstlite_meas_lite(stats_vdev, cur_stat_buf);
934963
935964 if (meas_work->isp_ris & ISP3X_FRAME) {
936
- ret |= rkisp_stats_get_bls_stats(stats_vdev, cur_stat_buf);
937
- ret |= rkisp_stats_get_dhaz_stats(stats_vdev, cur_stat_buf);
965
+ rkisp_stats_get_bls_stats(stats_vdev, cur_stat_buf);
966
+ rkisp_stats_get_dhaz_stats(stats_vdev, cur_stat_buf);
938967 }
939968
940969 if (cur_buf) {
941
- if (ret || !cur_stat_buf->meas_type) {
942
- unsigned long flags;
943
-
944
- spin_lock_irqsave(&stats_vdev->rd_lock, flags);
945
- list_add_tail(&cur_buf->queue, &stats_vdev->stat);
946
- spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
947
- } else {
948
- rkisp_stats_info2ddr(stats_vdev, cur_stat_buf);
949
- vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size);
950
- cur_buf->vb.sequence = cur_frame_id;
951
- cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
952
- vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
953
- }
970
+ rkisp_stats_info2ddr(stats_vdev, cur_stat_buf);
971
+ vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size);
972
+ cur_buf->vb.sequence = cur_frame_id;
973
+ cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
974
+ vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
954975 }
976
+ v4l2_dbg(4, rkisp_debug, &dev->v4l2_dev,
977
+ "%s seq:%d params_id:%d ris:0x%x buf:%p meas_type:0x%x\n",
978
+ __func__,
979
+ cur_frame_id, params_vdev->cur_frame_id, meas_work->isp_ris,
980
+ cur_buf, !cur_stat_buf ? 0 : cur_stat_buf->meas_type);
955981 }
956982
957983 static void
....@@ -1020,7 +1046,7 @@
10201046 work.frame_id = cur_frame_id;
10211047 work.isp_ris = temp_isp_ris | isp_ris;
10221048 work.isp3a_ris = temp_isp3a_ris;
1023
- work.timestamp = ktime_get_ns();
1049
+ work.timestamp = rkisp_time_get_ns(stats_vdev->dev);
10241050 rkisp_stats_send_meas_v32(stats_vdev, &work);
10251051 }
10261052
....@@ -1048,6 +1074,7 @@
10481074 {
10491075 struct rkisp_device *dev = stats_vdev->dev;
10501076 u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize;
1077
+ u32 div = dev->hw_dev->unite ? 2 : 1;
10511078
10521079 if (dev->isp_sdev.in_fmt.fmt_type == FMT_YUV)
10531080 return;
....@@ -1059,8 +1086,8 @@
10591086 else
10601087 memset(stats_vdev->stats_buf[0].vaddr, 0, size);
10611088 rkisp_stats_update_buf(stats_vdev);
1062
- rkisp_write(dev, ISP3X_MI_DBR_WR_SIZE, size, false);
1063
- rkisp_set_bits(dev, ISP3X_SWS_CFG, 0, ISP3X_3A_DDR_WRITE_EN, false);
1089
+ rkisp_unite_write(dev, ISP3X_MI_DBR_WR_SIZE, size / div, false);
1090
+ rkisp_unite_set_bits(dev, ISP3X_SWS_CFG, 0, ISP3X_3A_DDR_WRITE_EN, false);
10641091 if (stats_vdev->nxt_buf) {
10651092 stats_vdev->cur_buf = stats_vdev->nxt_buf;
10661093 stats_vdev->nxt_buf = NULL;
....@@ -1080,6 +1107,7 @@
10801107
10811108 void rkisp_init_stats_vdev_v32(struct rkisp_isp_stats_vdev *stats_vdev)
10821109 {
1110
+ int mult = stats_vdev->dev->hw_dev->unite ? 2 : 1;
10831111 u32 size;
10841112
10851113 stats_vdev->vdev_fmt.fmt.meta.dataformat =
....@@ -1087,13 +1115,13 @@
10871115 if (stats_vdev->dev->isp_ver == ISP_V32) {
10881116 stats_vdev->priv_ops = &stats_ddr_ops_v32;
10891117 stats_vdev->rd_stats_from_ddr = true;
1090
- size = sizeof(struct rkisp32_isp_stat_buffer);
1118
+ size = ALIGN(sizeof(struct rkisp32_isp_stat_buffer), 16);
10911119 } else {
10921120 stats_vdev->priv_ops = NULL;
10931121 stats_vdev->rd_stats_from_ddr = false;
10941122 size = sizeof(struct rkisp32_lite_stat_buffer);
10951123 }
1096
- stats_vdev->vdev_fmt.fmt.meta.buffersize = size;
1124
+ stats_vdev->vdev_fmt.fmt.meta.buffersize = size * mult;
10971125 stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
10981126 }
10991127