forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
kernel/drivers/media/platform/rockchip/isp/rkisp.c
....@@ -33,6 +33,7 @@
3333 */
3434
3535 #include <linux/clk.h>
36
+#include <linux/compat.h>
3637 #include <linux/iopoll.h>
3738 #include <linux/pm_runtime.h>
3839 #include <linux/regmap.h>
....@@ -42,12 +43,13 @@
4243 #include <linux/kfifo.h>
4344 #include <linux/interrupt.h>
4445 #include <linux/rk-preisp.h>
45
-#include <linux/rkisp21-config.h>
46
+#include <linux/rk-isp21-config.h>
4647 #include <linux/iommu.h>
4748 #include <media/v4l2-event.h>
4849 #include <media/media-entity.h>
4950
5051 #include "common.h"
52
+#include "isp_external.h"
5153 #include "regs.h"
5254 #include "rkisp_tb_helper.h"
5355
....@@ -82,6 +84,8 @@
8284 * | +---------------------------------------------------+ |
8385 * +---------------------------------------------------------+
8486 */
87
+
88
+static void rkisp_config_cmsk(struct rkisp_device *dev);
8589
8690 struct backup_reg {
8791 const u32 base;
....@@ -188,41 +192,50 @@
188192 u32 code = dev->isp_sdev.in_frm.code;
189193 u32 src_w = dev->isp_sdev.in_frm.width;
190194 u32 src_h = dev->isp_sdev.in_frm.height;
191
- u32 dest_w, dest_h, w, h;
195
+ u32 dest_w, dest_h, w, h, max_size, max_h, max_w;
192196 int ret = 0;
193197
194198 if (!crop)
195199 return -EINVAL;
196200
197
- if (dev->isp_ver == ISP_V12) {
198
- w = clamp_t(u32, src_w,
199
- CIF_ISP_INPUT_W_MIN,
200
- CIF_ISP_INPUT_W_MAX_V12);
201
- h = clamp_t(u32, src_h,
202
- CIF_ISP_INPUT_H_MIN,
203
- CIF_ISP_INPUT_H_MAX_V12);
204
- } else if (dev->isp_ver == ISP_V13) {
205
- w = clamp_t(u32, src_w,
206
- CIF_ISP_INPUT_W_MIN,
207
- CIF_ISP_INPUT_W_MAX_V13);
208
- h = clamp_t(u32, src_h,
209
- CIF_ISP_INPUT_H_MIN,
210
- CIF_ISP_INPUT_H_MAX_V13);
211
- } else if (dev->isp_ver == ISP_V21) {
212
- w = clamp_t(u32, src_w,
213
- CIF_ISP_INPUT_W_MIN,
214
- CIF_ISP_INPUT_W_MAX_V21);
215
- h = clamp_t(u32, src_h,
216
- CIF_ISP_INPUT_H_MIN,
217
- CIF_ISP_INPUT_H_MAX_V21);
218
- } else {
219
- w = clamp_t(u32, src_w,
220
- CIF_ISP_INPUT_W_MIN,
221
- CIF_ISP_INPUT_W_MAX);
222
- h = clamp_t(u32, src_h,
223
- CIF_ISP_INPUT_H_MIN,
224
- CIF_ISP_INPUT_H_MAX);
201
+ memset(&sel, 0, sizeof(sel));
202
+ switch (dev->isp_ver) {
203
+ case ISP_V12:
204
+ max_w = CIF_ISP_INPUT_W_MAX_V12;
205
+ max_h = CIF_ISP_INPUT_H_MAX_V12;
206
+ break;
207
+ case ISP_V13:
208
+ max_w = CIF_ISP_INPUT_W_MAX_V13;
209
+ max_h = CIF_ISP_INPUT_H_MAX_V13;
210
+ break;
211
+ case ISP_V21:
212
+ max_w = CIF_ISP_INPUT_W_MAX_V21;
213
+ max_h = CIF_ISP_INPUT_H_MAX_V21;
214
+ break;
215
+ case ISP_V30:
216
+ max_w = dev->hw_dev->unite ?
217
+ CIF_ISP_INPUT_W_MAX_V30_UNITE : CIF_ISP_INPUT_W_MAX_V30;
218
+ max_h = dev->hw_dev->unite ?
219
+ CIF_ISP_INPUT_H_MAX_V30_UNITE : CIF_ISP_INPUT_H_MAX_V30;
220
+ break;
221
+ case ISP_V32:
222
+ max_w = dev->hw_dev->unite ?
223
+ CIF_ISP_INPUT_W_MAX_V32_UNITE : CIF_ISP_INPUT_W_MAX_V32;
224
+ max_h = dev->hw_dev->unite ?
225
+ CIF_ISP_INPUT_H_MAX_V32_UNITE : CIF_ISP_INPUT_H_MAX_V32;
226
+ break;
227
+ case ISP_V32_L:
228
+ max_w = CIF_ISP_INPUT_W_MAX_V32_L;
229
+ max_h = CIF_ISP_INPUT_H_MAX_V32_L;
230
+ break;
231
+ default:
232
+ max_w = CIF_ISP_INPUT_W_MAX;
233
+ max_h = CIF_ISP_INPUT_H_MAX;
225234 }
235
+ max_size = max_w * max_h;
236
+ w = clamp_t(u32, src_w, CIF_ISP_INPUT_W_MIN, max_w);
237
+ max_h = max_size / w;
238
+ h = clamp_t(u32, src_h, CIF_ISP_INPUT_H_MIN, max_h);
226239
227240 if (dev->active_sensor)
228241 sensor = dev->active_sensor->sd;
....@@ -343,35 +356,51 @@
343356 return -ENODEV;
344357
345358 sensor = sd_to_sensor(dev, sensor_sd);
346
- ret = v4l2_subdev_call(sensor->sd, video, g_mbus_config,
347
- &sensor->mbus);
359
+ if (!sensor)
360
+ return -ENODEV;
361
+ ret = v4l2_subdev_call(sensor->sd, pad, get_mbus_config,
362
+ 0, &sensor->mbus);
348363 if (ret && ret != -ENOIOCTLCMD)
349364 return ret;
350365
351
- if (sensor->mbus.type == V4L2_MBUS_CSI2) {
366
+ sensor->fmt[0].pad = 0;
367
+ sensor->fmt[0].which = V4L2_SUBDEV_FORMAT_ACTIVE;
368
+ ret = v4l2_subdev_call(sensor->sd, pad, get_fmt,
369
+ &sensor->cfg, &sensor->fmt[0]);
370
+ if (ret && ret != -ENOIOCTLCMD)
371
+ return ret;
372
+
373
+ if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY &&
374
+ dev->isp_ver < ISP_V30) {
352375 u8 vc = 0;
353376
354
- memset(dev->csi_dev.mipi_di, 0,
355
- sizeof(dev->csi_dev.mipi_di));
356
- memset(sensor->fmt, 0, sizeof(sensor->fmt));
377
+ sensor_sd = get_remote_sensor(sensor->sd);
378
+ if (!sensor_sd)
379
+ return -ENODEV;
380
+ memset(dev->csi_dev.mipi_di, 0, sizeof(dev->csi_dev.mipi_di));
357381 for (i = 0; i < dev->csi_dev.max_pad - 1; i++) {
382
+ struct rkmodule_channel_info ch = { 0 };
383
+
358384 fmt = &sensor->fmt[i];
359
- fmt->pad = i;
360
- fmt->which = V4L2_SUBDEV_FORMAT_ACTIVE;
361
- ret = v4l2_subdev_call(sensor->sd, pad, get_fmt,
362
- &sensor->cfg, fmt);
363
- if (ret && ret != -ENOIOCTLCMD)
364
- return ret;
385
+ ch.index = i;
386
+ ret = v4l2_subdev_call(sensor_sd, core, ioctl,
387
+ RKMODULE_GET_CHANNEL_INFO, &ch);
388
+ if (ret) {
389
+ if (i)
390
+ *fmt = sensor->fmt[0];
391
+ } else {
392
+ fmt->format.width = ch.width;
393
+ fmt->format.height = ch.height;
394
+ fmt->format.code = ch.bus_fmt;
395
+ }
365396 ret = mbus_pixelcode_to_mipi_dt(fmt->format.code);
366397 if (ret < 0) {
367398 v4l2_err(&dev->v4l2_dev,
368399 "Invalid mipi data type\n");
369400 return ret;
370401 }
371
- /* v4l2_subdev_format reserved[0]
372
- * using as mipi virtual channel
373
- */
374
- switch (fmt->reserved[0]) {
402
+
403
+ switch (ch.vc) {
375404 case V4L2_MBUS_CSI2_CHANNEL_3:
376405 vc = 3;
377406 break;
....@@ -393,18 +422,14 @@
393422 fmt->format.width,
394423 fmt->format.height);
395424 }
396
- } else {
397
- sensor->fmt[0].pad = 0;
398
- sensor->fmt[0].which = V4L2_SUBDEV_FORMAT_ACTIVE;
399
- ret = v4l2_subdev_call(sensor->sd, pad, get_fmt,
400
- &sensor->cfg, &sensor->fmt[0]);
401
- if (ret && ret != -ENOIOCTLCMD)
402
- return ret;
403425 }
404426
405427 v4l2_subdev_call(sensor->sd, video, g_frame_interval, &sensor->fi);
406428 dev->active_sensor = sensor;
407
-
429
+ i = dev->dev_id;
430
+ if (sensor->fi.interval.numerator)
431
+ dev->hw_dev->isp_size[i].fps =
432
+ sensor->fi.interval.denominator / sensor->fi.interval.numerator;
408433 return ret;
409434 }
410435
....@@ -471,6 +496,86 @@
471496 return pixelformat;
472497 }
473498
499
+static void rkisp_dvfs(struct rkisp_device *dev)
500
+{
501
+ struct rkisp_hw_dev *hw = dev->hw_dev;
502
+ u64 data_rate = 0;
503
+ int i, fps, num = 0;
504
+
505
+ if (!hw->is_dvfs)
506
+ return;
507
+ hw->is_dvfs = false;
508
+ for (i = 0; i < hw->dev_num; i++) {
509
+ if (!hw->isp_size[i].is_on)
510
+ continue;
511
+ fps = hw->isp_size[i].fps;
512
+ if (!fps)
513
+ fps = 30;
514
+ data_rate += (fps * hw->isp_size[i].size);
515
+ num++;
516
+ }
517
+ do_div(data_rate, 1000 * 1000);
518
+ /* increase margin: 25% * num */
519
+ data_rate += (data_rate >> 2) * num;
520
+ /* one frame two-run, data double */
521
+ if (hw->is_multi_overflow && num > 1)
522
+ data_rate *= 2;
523
+ /* compare with isp clock adjustment table */
524
+ for (i = 0; i < hw->num_clk_rate_tbl; i++)
525
+ if (data_rate <= hw->clk_rate_tbl[i].clk_rate)
526
+ break;
527
+ if (i == hw->num_clk_rate_tbl)
528
+ i--;
529
+
530
+ /* set isp clock rate */
531
+ rkisp_set_clk_rate(hw->clks[0], hw->clk_rate_tbl[i].clk_rate * 1000000UL);
532
+ if (hw->unite == ISP_UNITE_TWO)
533
+ rkisp_set_clk_rate(hw->clks[5], hw->clk_rate_tbl[i].clk_rate * 1000000UL);
534
+ /* aclk equal to core clk */
535
+ if (dev->isp_ver == ISP_V32)
536
+ rkisp_set_clk_rate(hw->clks[1], hw->clk_rate_tbl[i].clk_rate * 1000000UL);
537
+ dev_info(hw->dev, "set isp clk = %luHz\n", clk_get_rate(hw->clks[0]));
538
+}
539
+
540
+static void rkisp_multi_overflow_hdl(struct rkisp_device *dev, bool on)
541
+{
542
+ struct rkisp_hw_dev *hw = dev->hw_dev;
543
+
544
+ if (on) {
545
+ /* enable mi */
546
+ rkisp_update_regs(dev, ISP3X_MI_WR_CTRL, ISP3X_MI_WR_CTRL);
547
+ rkisp_update_regs(dev, ISP3X_ISP_CTRL1, ISP3X_ISP_CTRL1);
548
+ if (dev->isp_ver == ISP_V30) {
549
+ rkisp_update_regs(dev, ISP3X_MPFBC_CTRL, ISP3X_MPFBC_CTRL);
550
+ rkisp_update_regs(dev, ISP3X_MI_BP_WR_CTRL, ISP3X_MI_BP_WR_CTRL);
551
+ rkisp_update_regs(dev, ISP3X_SWS_CFG, ISP3X_SWS_CFG);
552
+ } else if (dev->isp_ver == ISP_V32) {
553
+ rkisp_update_regs(dev, ISP3X_MI_BP_WR_CTRL, ISP3X_MI_BP_WR_CTRL);
554
+ rkisp_update_regs(dev, ISP32_MI_BPDS_WR_CTRL, ISP32_MI_BPDS_WR_CTRL);
555
+ rkisp_update_regs(dev, ISP32_MI_MPDS_WR_CTRL, ISP32_MI_MPDS_WR_CTRL);
556
+ }
557
+ } else {
558
+ /* disabled mi. rv1106 sdmmc workaround, 3a_wr no close */
559
+ writel(CIF_MI_CTRL_INIT_OFFSET_EN | CIF_MI_CTRL_INIT_BASE_EN,
560
+ hw->base_addr + ISP3X_MI_WR_CTRL);
561
+ if (dev->isp_ver == ISP_V30) {
562
+ writel(0, hw->base_addr + ISP3X_MPFBC_CTRL);
563
+ writel(0, hw->base_addr + ISP3X_MI_BP_WR_CTRL);
564
+ writel(0xc, hw->base_addr + ISP3X_SWS_CFG);
565
+ if (hw->unite == ISP_UNITE_TWO) {
566
+ writel(0, hw->base_next_addr + ISP3X_MI_WR_CTRL);
567
+ writel(0, hw->base_next_addr + ISP3X_MPFBC_CTRL);
568
+ writel(0, hw->base_next_addr + ISP3X_MI_BP_WR_CTRL);
569
+ writel(0xc, hw->base_next_addr + ISP3X_SWS_CFG);
570
+ }
571
+ } else if (dev->isp_ver == ISP_V32) {
572
+ writel(0, hw->base_addr + ISP3X_MI_BP_WR_CTRL);
573
+ writel(0, hw->base_addr + ISP32_MI_BPDS_WR_CTRL);
574
+ writel(0, hw->base_addr + ISP32_MI_MPDS_WR_CTRL);
575
+ }
576
+ }
577
+ rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true);
578
+}
474579
475580 /*
476581 * for hdr read back mode, rawrd read back data
....@@ -479,6 +584,7 @@
479584 void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, bool is_try)
480585 {
481586 struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev;
587
+ struct rkisp_isp_stats_vdev *stats_vdev = &dev->stats_vdev;
482588 struct rkisp_hw_dev *hw = dev->hw_dev;
483589 u32 val, cur_frame_id, tmp, rd_mode;
484590 u64 iq_feature = hw->iq_feature;
....@@ -488,8 +594,12 @@
488594 hw->cur_dev_id = dev->dev_id;
489595 rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true);
490596
597
+ /* isp process the same frame */
598
+ if (is_try)
599
+ goto run_next;
600
+
491601 val = 0;
492
- if (mode & T_START_X1) {
602
+ if (mode & (T_START_X1 | T_START_C)) {
493603 rd_mode = HDR_RDBK_FRAME1;
494604 } else if (mode & T_START_X2) {
495605 rd_mode = HDR_RDBK_FRAME2;
....@@ -502,6 +612,11 @@
502612 val = rkisp_read(dev, ISP_HDRMGE_BASE, false) & 0xf;
503613 }
504614
615
+ if (mode & T_START_C)
616
+ rkisp_expander_config(dev, NULL, true);
617
+ else
618
+ rkisp_expander_config(dev, NULL, false);
619
+
505620 if (is_feature_on) {
506621 if ((ISP2X_MODULE_HDRMGE & ~iq_feature) && (val & SW_HDRMGE_EN)) {
507622 v4l2_err(&dev->v4l2_dev, "hdrmge is not supported\n");
....@@ -509,24 +624,22 @@
509624 }
510625 }
511626
512
- tmp = rkisp_read(dev, ISP_HDRMGE_BASE, false) & 0xf;
513
- if (val != tmp) {
514
- rkisp_write(dev, ISP_HDRMGE_BASE, val, false);
627
+ if (rd_mode != dev->rd_mode) {
628
+ rkisp_unite_set_bits(dev, ISP_HDRMGE_BASE, ISP_HDRMGE_MODE_MASK, val, false);
515629 dev->skip_frame = 2;
516630 is_upd = true;
517631 }
518632
519
- if (dev->isp_ver == ISP_V20 && dev->dmarx_dev.trigger == T_MANUAL && !is_try) {
520
- if (dev->rd_mode != rd_mode && RKMODULE_EXTEND_LINE != 0) {
633
+ if (dev->isp_ver == ISP_V20 && dev->dmarx_dev.trigger == T_MANUAL) {
634
+ if (dev->rd_mode != rd_mode && dev->br_dev.en) {
521635 tmp = dev->isp_sdev.in_crop.height;
522636 val = rkisp_read(dev, CIF_DUAL_CROP_CTRL, false);
523637 if (rd_mode == HDR_RDBK_FRAME1) {
524
- val |= CIF_DUAL_CROP_MP_MODE_YUV | CIF_DUAL_CROP_SP_MODE_YUV;
638
+ val |= CIF_DUAL_CROP_MP_MODE_YUV;
525639 tmp += RKMODULE_EXTEND_LINE;
526640 } else {
527
- val &= ~(CIF_DUAL_CROP_MP_MODE_YUV | CIF_DUAL_CROP_SP_MODE_YUV);
641
+ val &= ~CIF_DUAL_CROP_MP_MODE_YUV;
528642 }
529
- val |= CIF_DUAL_CROP_CFG_UPD;
530643 rkisp_write(dev, CIF_DUAL_CROP_CTRL, val, false);
531644 rkisp_write(dev, CIF_ISP_ACQ_V_SIZE, tmp, false);
532645 rkisp_write(dev, CIF_ISP_OUT_V_SIZE, tmp, false);
....@@ -538,19 +651,38 @@
538651 }
539652 dev->rd_mode = rd_mode;
540653
541
- rkisp_params_first_cfg(&dev->params_vdev, &dev->isp_sdev.in_fmt,
542
- dev->isp_sdev.quantization);
543
- rkisp_params_cfg(params_vdev, cur_frame_id);
654
+ if (hw->unite != ISP_UNITE_ONE || dev->unite_index == ISP_UNITE_LEFT) {
655
+ rkisp_params_first_cfg(&dev->params_vdev, &dev->isp_sdev.in_fmt,
656
+ dev->isp_sdev.quantization);
657
+ rkisp_params_cfg(params_vdev, cur_frame_id);
658
+ rkisp_config_cmsk(dev);
659
+ rkisp_stream_frame_start(dev, 0);
660
+ }
544661
545
- if (!hw->is_single && !is_try) {
662
+ if (!hw->is_single) {
663
+ /* multi sensor need to reset isp resize mode if scale up */
664
+ val = 0;
665
+ if (rkisp_read(dev, ISP3X_MAIN_RESIZE_CTRL, true) & 0xf0)
666
+ val |= BIT(3);
667
+ if (dev->isp_ver != ISP_V32_L &&
668
+ rkisp_read(dev, ISP3X_SELF_RESIZE_CTRL, true) & 0xf0)
669
+ val |= BIT(4);
670
+ if (rkisp_read(dev, ISP32_BP_RESIZE_CTRL, true) & 0xf0)
671
+ val |= BIT(12);
672
+ if (val) {
673
+ writel(val, hw->base_addr + CIF_IRCL);
674
+ writel(0, hw->base_addr + CIF_IRCL);
675
+ }
676
+
546677 rkisp_update_regs(dev, CTRL_VI_ISP_PATH, SUPER_IMP_COLOR_CR);
547
- rkisp_update_regs(dev, DUAL_CROP_M_H_OFFS, DUAL_CROP_S_V_SIZE);
548
- rkisp_update_regs(dev, ISP_ACQ_PROP, DUAL_CROP_CTRL);
549
- rkisp_update_regs(dev, MAIN_RESIZE_SCALE_HY, MI_WR_CTRL);
550
- rkisp_update_regs(dev, SELF_RESIZE_SCALE_HY, MAIN_RESIZE_CTRL);
551
- rkisp_update_regs(dev, ISP_GAMMA_OUT_CTRL, SELF_RESIZE_CTRL);
678
+ rkisp_update_regs(dev, DUAL_CROP_M_H_OFFS, ISP3X_DUAL_CROP_FBC_V_SIZE);
679
+ rkisp_update_regs(dev, ISP_ACQ_H_OFFS, DUAL_CROP_CTRL);
680
+ rkisp_update_regs(dev, SELF_RESIZE_SCALE_HY, MI_WR_CTRL);
681
+ rkisp_update_regs(dev, ISP32_BP_RESIZE_SCALE_HY, SELF_RESIZE_CTRL);
682
+ rkisp_update_regs(dev, MAIN_RESIZE_SCALE_HY, ISP32_BP_RESIZE_CTRL);
683
+ rkisp_update_regs(dev, ISP_GAMMA_OUT_CTRL, MAIN_RESIZE_CTRL);
552684 rkisp_update_regs(dev, MI_RD_CTRL2, ISP_LSC_CTRL);
553
- rkisp_update_regs(dev, MI_MP_WR_Y_BASE, MI_MP_WR_Y_LLENGTH);
685
+ rkisp_update_regs(dev, MI_MP_WR_Y_BASE, MI_WR_CTRL2 - 4);
554686 rkisp_update_regs(dev, ISP_LSC_XGRAD_01, ISP_RAWAWB_RAM_DATA);
555687 if (dev->isp_ver == ISP_V20 &&
556688 (rkisp_read(dev, ISP_DHAZ_CTRL, false) & ISP_DHAZ_ENMUX ||
....@@ -560,53 +692,138 @@
560692 val = rkisp_read(dev, MI_WR_CTRL2, false);
561693 rkisp_set_bits(dev, MI_WR_CTRL2, 0, val, true);
562694 rkisp_write(dev, MI_WR_INIT, ISP21_SP_FORCE_UPD | ISP21_MP_FORCE_UPD, true);
563
- /* sensor mode & index */
695
+ } else {
696
+ if (dev->isp_ver == ISP_V32_L)
697
+ rkisp_write(dev, ISP32_SELF_SCALE_UPDATE, ISP32_SCALE_FORCE_UPD, true);
698
+ rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true);
699
+ }
700
+ /* sensor mode & index */
701
+ if (dev->isp_ver >= ISP_V21) {
564702 val = rkisp_read_reg_cache(dev, ISP_ACQ_H_OFFS);
565
- val |= ISP21_SENSOR_MODE(hw->dev_num >= 3 ? 2 : hw->dev_num - 1) |
566
- ISP21_SENSOR_INDEX(dev->dev_id);
703
+ val |= ISP21_SENSOR_INDEX(dev->multi_index);
704
+ if (dev->isp_ver == ISP_V32_L)
705
+ val |= ISP32L_SENSOR_MODE(dev->multi_mode);
706
+ else
707
+ val |= ISP21_SENSOR_MODE(dev->multi_mode);
567708 writel(val, hw->base_addr + ISP_ACQ_H_OFFS);
709
+ if (hw->unite == ISP_UNITE_TWO)
710
+ writel(val, hw->base_next_addr + ISP_ACQ_H_OFFS);
711
+ v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
712
+ "sensor mode:%d index:%d | 0x%x\n",
713
+ dev->multi_mode, dev->multi_index, val);
568714 }
569715 is_upd = true;
570716 }
571717
572
- if (dev->isp_ver == ISP_V21)
718
+ if (dev->isp_ver > ISP_V20)
573719 dma2frm = 0;
574720 if (dma2frm > 2)
575721 dma2frm = 2;
576722 if (dma2frm == 2)
577723 dev->rdbk_cnt_x3++;
578
- else if (dma2frm == 1)
724
+ else if (dma2frm == 1 || dev->sw_rd_cnt)
579725 dev->rdbk_cnt_x2++;
580726 else
581727 dev->rdbk_cnt_x1++;
582728 dev->rdbk_cnt++;
729
+ if (dev->isp_ver == ISP_V20)
730
+ params_vdev->rdbk_times = dma2frm + 1;
583731
732
+run_next:
584733 rkisp_params_cfgsram(params_vdev);
585
- params_vdev->rdbk_times = dma2frm + 1;
734
+ stats_vdev->rdbk_drop = false;
735
+ if (dev->is_frame_double) {
736
+ is_upd = true;
737
+ if (is_try) {
738
+ /* the frame second running to on mi */
739
+ rkisp_multi_overflow_hdl(dev, true);
740
+ rkisp_update_regs(dev, ISP_LDCH_BASE, ISP_LDCH_BASE);
586741
587
- /* read 3d lut at frame end */
742
+ val = ISP3X_YNR_FST_FRAME | ISP3X_DHAZ_FST_FRAME | ISP3X_CNR_FST_FRAME;
743
+ if (dev->isp_ver == ISP_V32)
744
+ val |= ISP32_SHP_FST_FRAME;
745
+ else
746
+ val |= ISP3X_CNR_FST_FRAME;
747
+ rkisp_unite_clear_bits(dev, ISP3X_ISP_CTRL1, val, false);
748
+ val = rkisp_read_reg_cache(dev, ISP3X_DRC_IIRWG_GAIN);
749
+ writel(val, hw->base_addr + ISP3X_DRC_IIRWG_GAIN);
750
+ if (hw->unite == ISP_UNITE_TWO)
751
+ writel(val, hw->base_next_addr + ISP3X_DRC_IIRWG_GAIN);
752
+ val = rkisp_read_reg_cache(dev, ISP3X_DRC_EXPLRATIO);
753
+ writel(val, hw->base_addr + ISP3X_DRC_EXPLRATIO);
754
+ if (hw->unite == ISP_UNITE_TWO)
755
+ writel(val, hw->base_next_addr + ISP3X_DRC_EXPLRATIO);
756
+ } else {
757
+ /* the frame first running to off mi to save bandwidth */
758
+ rkisp_multi_overflow_hdl(dev, false);
759
+
760
+ /* FST_FRAME no to read sram thumb */
761
+ val = ISP3X_YNR_FST_FRAME | ISP3X_DHAZ_FST_FRAME;
762
+ if (dev->isp_ver == ISP_V32)
763
+ val |= ISP32_SHP_FST_FRAME;
764
+ else
765
+ val |= ISP3X_CNR_FST_FRAME;
766
+ rkisp_unite_set_bits(dev, ISP3X_ISP_CTRL1, 0, val, false);
767
+ /* ADRC low iir thumb weight for first sensor switch */
768
+ val = rkisp_read_reg_cache(dev, ISP3X_DRC_IIRWG_GAIN);
769
+ val &= ~ISP3X_DRC_IIR_WEIGHT_MASK;
770
+ writel(val, hw->base_addr + ISP3X_DRC_IIRWG_GAIN);
771
+ if (hw->unite == ISP_UNITE_TWO)
772
+ writel(val, hw->base_next_addr + ISP3X_DRC_IIRWG_GAIN);
773
+ /* ADRC iir5x5 and cur3x3 weight */
774
+ val = rkisp_read_reg_cache(dev, ISP3X_DRC_EXPLRATIO);
775
+ val &= ~ISP3X_DRC_WEIPRE_FRAME_MASK;
776
+ writel(val, hw->base_addr + ISP3X_DRC_EXPLRATIO);
777
+ if (hw->unite == ISP_UNITE_TWO)
778
+ writel(val, hw->base_next_addr + ISP3X_DRC_EXPLRATIO);
779
+ /* YNR_THUMB_MIX_CUR_EN for thumb read addr to 0 */
780
+ val = rkisp_read_reg_cache(dev, ISP3X_YNR_GLOBAL_CTRL);
781
+ val |= ISP3X_YNR_THUMB_MIX_CUR_EN;
782
+ writel(val, hw->base_addr + ISP3X_YNR_GLOBAL_CTRL);
783
+ if (hw->unite == ISP_UNITE_TWO)
784
+ writel(val, hw->base_next_addr + ISP3X_YNR_GLOBAL_CTRL);
785
+ if (dev->isp_ver == ISP_V21 || dev->isp_ver == ISP_V30) {
786
+ /* CNR_THUMB_MIX_CUR_EN for thumb read addr to 0 */
787
+ val = rkisp_read_reg_cache(dev, ISP3X_CNR_CTRL);
788
+ val |= ISP3X_CNR_THUMB_MIX_CUR_EN;
789
+ writel(val, hw->base_addr + ISP3X_CNR_CTRL);
790
+ if (hw->unite == ISP_UNITE_TWO)
791
+ writel(val, hw->base_next_addr + ISP3X_CNR_CTRL);
792
+ }
793
+ stats_vdev->rdbk_drop = true;
794
+ }
795
+ }
796
+
797
+ /* disable isp force update to read 3dlut
798
+ * 3dlut auto update at frame end for single sensor
799
+ */
588800 if (hw->is_single && is_upd &&
589801 rkisp_read_reg_cache(dev, ISP_3DLUT_UPDATE) & 0x1) {
590
- rkisp_write(dev, ISP_3DLUT_UPDATE, 0, true);
802
+ rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 0, true);
591803 is_3dlut_upd = true;
592804 }
593805 if (is_upd) {
594806 val = rkisp_read(dev, ISP_CTRL, false);
595807 val |= CIF_ISP_CTRL_ISP_CFG_UPD;
596
- rkisp_write(dev, ISP_CTRL, val, true);
808
+ rkisp_unite_write(dev, ISP_CTRL, val, true);
809
+ /* bayer pat after ISP_CFG_UPD for multi sensor to read lsc r/g/b table */
810
+ rkisp_update_regs(dev, ISP3X_ISP_CTRL1, ISP3X_ISP_CTRL1);
597811 /* fix ldch multi sensor case:
598812 * ldch will pre-read data when en and isp force upd or frame end,
599813 * udelay for ldch pre-read data.
600814 * ldch en=0 before start for frame end to stop ldch read data.
601815 */
602
- if (!hw->is_single &&
603
- (rkisp_read(dev, ISP_LDCH_BASE, true) & 0x1)) {
816
+ val = rkisp_read(dev, ISP_LDCH_BASE, true);
817
+ if (!hw->is_single && val & BIT(0)) {
604818 udelay(50);
605
- writel(0, hw->base_addr + ISP_LDCH_BASE);
819
+ val &= ~(BIT(0) | BIT(31));
820
+ writel(val, hw->base_addr + ISP_LDCH_BASE);
821
+ if (hw->unite == ISP_UNITE_TWO)
822
+ writel(val, hw->base_next_addr + ISP_LDCH_BASE);
606823 }
607824 }
608825 if (is_3dlut_upd)
609
- rkisp_write(dev, ISP_3DLUT_UPDATE, 1, true);
826
+ rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 1, true);
610827
611828 /* if output stream enable, wait it end */
612829 val = rkisp_read(dev, CIF_MI_CTRL_SHD, true);
....@@ -618,21 +835,65 @@
618835 dev->irq_ends_mask |= ISP_FRAME_SP;
619836 else
620837 dev->irq_ends_mask &= ~ISP_FRAME_SP;
621
-
622
- memset(dev->filt_state, 0, sizeof(dev->filt_state));
623
- dev->filt_state[RDBK_F_VS] = dma2frm;
838
+ if ((dev->isp_ver == ISP_V20 &&
839
+ rkisp_read(dev, ISP_MPFBC_CTRL, true) & SW_MPFBC_EN) ||
840
+ (dev->isp_ver == ISP_V30 &&
841
+ rkisp_read(dev, ISP3X_MPFBC_CTRL, true) & ISP3X_MPFBC_EN_SHD))
842
+ dev->irq_ends_mask |= ISP_FRAME_MPFBC;
843
+ else
844
+ dev->irq_ends_mask &= ~ISP_FRAME_MPFBC;
845
+ if ((dev->isp_ver == ISP_V30 &&
846
+ rkisp_read(dev, ISP3X_MI_BP_WR_CTRL, true) & ISP3X_BP_ENABLE) ||
847
+ (dev->isp_ver == ISP_V32 &&
848
+ rkisp_read(dev, ISP32_MI_WR_CTRL2_SHD, true) & ISP32_BP_EN_OUT_SHD))
849
+ dev->irq_ends_mask |= ISP_FRAME_BP;
850
+ else
851
+ dev->irq_ends_mask &= ~ISP_FRAME_BP;
624852
625853 val = rkisp_read(dev, CSI2RX_CTRL0, true);
626854 val &= ~SW_IBUF_OP_MODE(0xf);
627855 tmp = SW_IBUF_OP_MODE(dev->rd_mode);
628856 val |= tmp | SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm);
857
+ if (dev->isp_ver > ISP_V20)
858
+ dma2frm = dev->sw_rd_cnt;
629859 v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
630
- "readback frame:%d time:%d 0x%x\n",
631
- cur_frame_id, dma2frm + 1, val);
632
- if (!dma2frm)
633
- rkisp_bridge_update_mi(dev, 0);
860
+ "readback frame:%d time:%d 0x%x try:%d\n",
861
+ cur_frame_id, dma2frm + 1, val, is_try);
634862 if (!hw->is_shutdown)
635
- rkisp_write(dev, CSI2RX_CTRL0, val, true);
863
+ rkisp_unite_write(dev, CSI2RX_CTRL0, val, true);
864
+}
865
+
866
+static void rkisp_fast_switch_rx_buf(struct rkisp_device *dev, bool is_current)
867
+{
868
+ struct rkisp_stream *stream;
869
+ struct rkisp_buffer *buf;
870
+ u32 i, val;
871
+
872
+ for (i = RKISP_STREAM_RAWRD0; i < RKISP_MAX_DMARX_STREAM; i++) {
873
+ stream = &dev->dmarx_dev.stream[i];
874
+ if (!stream->ops)
875
+ continue;
876
+ buf = NULL;
877
+ if (is_current)
878
+ buf = stream->curr_buf;
879
+ else if (!list_empty(&stream->buf_queue))
880
+ buf = list_first_entry(&stream->buf_queue,
881
+ struct rkisp_buffer, queue);
882
+ if (!buf)
883
+ continue;
884
+ val = buf->buff_addr[RKISP_PLANE_Y];
885
+ /* f1 -> f0 -> f1 for normal
886
+ * L:f1 L:f1 -> L:f0 S:f0 -> L:f1 S:f1 for hdr2
887
+ */
888
+ if (dev->rd_mode == HDR_RDBK_FRAME2 && !is_current &&
889
+ rkisp_read_reg_cache(dev, ISP3X_HDRMGE_GAIN0) == 0xfff0040) {
890
+ if (i == RKISP_STREAM_RAWRD2)
891
+ continue;
892
+ else
893
+ rkisp_write(dev, ISP3X_MI_RAWS_RD_BASE, val, false);
894
+ }
895
+ rkisp_write(dev, stream->config->mi.y_base_ad_init, val, false);
896
+ }
636897 }
637898
638899 static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd)
....@@ -644,20 +905,39 @@
644905 int i, times = -1, max = 0, id = 0;
645906 int len[DEV_MAX] = { 0 };
646907 u32 mode = 0;
908
+ bool is_try = false;
647909
648910 spin_lock_irqsave(&hw->rdbk_lock, lock_flags);
649
- if (cmd == T_CMD_END)
911
+ if (cmd == T_CMD_END) {
912
+ if (dev->sw_rd_cnt) {
913
+ dev->sw_rd_cnt--;
914
+ isp = dev;
915
+ is_try = true;
916
+ times = 0;
917
+ if (hw->unite == ISP_UNITE_ONE) {
918
+ if (dev->sw_rd_cnt < 2)
919
+ isp->unite_index = ISP_UNITE_RIGHT;
920
+ if (!hw->is_multi_overflow || (dev->sw_rd_cnt & 0x1))
921
+ is_try = false;
922
+ }
923
+ goto end;
924
+ }
650925 hw->is_idle = true;
926
+ hw->pre_dev_id = dev->dev_id;
927
+ }
651928 if (hw->is_shutdown)
652929 hw->is_idle = false;
653930 if (!hw->is_idle)
654931 goto end;
655932 if (hw->monitor.state & ISP_MIPI_ERROR && hw->monitor.is_en)
656933 goto end;
934
+ if (!IS_HDR_RDBK(dev->rd_mode))
935
+ goto end;
657936
658937 for (i = 0; i < hw->dev_num; i++) {
659938 isp = hw->isp[i];
660
- if (!(isp->isp_state & ISP_START))
939
+ if (!isp ||
940
+ (isp && !(isp->isp_state & ISP_START)))
661941 continue;
662942 rkisp_rdbk_trigger_event(isp, T_CMD_LEN, &len[i]);
663943 if (max < len[i]) {
....@@ -666,10 +946,14 @@
666946 }
667947 }
668948
949
+ /* wait 2 frame to start isp for fast */
950
+ if (dev->is_pre_on && max == 1 && !atomic_read(&dev->isp_sdev.frm_sync_seq))
951
+ goto end;
952
+
669953 if (max) {
670
- v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
671
- "trigger fifo len:%d\n", max);
672954 isp = hw->isp[id];
955
+ v4l2_dbg(2, rkisp_debug, &isp->v4l2_dev,
956
+ "trigger fifo len:%d\n", max);
673957 rkisp_rdbk_trigger_event(isp, T_CMD_DEQUEUE, &t);
674958 isp->dmarx_dev.pre_frame = isp->dmarx_dev.cur_frame;
675959 if (t.frame_id > isp->dmarx_dev.pre_frame.id &&
....@@ -680,15 +964,50 @@
680964 isp->dmarx_dev.cur_frame.sof_timestamp = t.sof_timestamp;
681965 isp->dmarx_dev.cur_frame.timestamp = t.frame_timestamp;
682966 isp->isp_sdev.frm_timestamp = t.sof_timestamp;
967
+ atomic_set(&isp->isp_sdev.frm_sync_seq, t.frame_id + 1);
683968 mode = t.mode;
684969 times = t.times;
685970 hw->cur_dev_id = id;
686971 hw->is_idle = false;
972
+ /* this frame will read count by isp */
973
+ isp->sw_rd_cnt = 0;
974
+ /* frame double for multi camera resolution out of hardware limit
975
+ * first for HW save this camera information, and second to output image
976
+ */
977
+ isp->is_frame_double = false;
978
+ if (hw->is_multi_overflow &&
979
+ (hw->unite == ISP_UNITE_ONE ||
980
+ (hw->pre_dev_id != -1 && hw->pre_dev_id != id))) {
981
+ isp->is_frame_double = true;
982
+ isp->sw_rd_cnt = 1;
983
+ times = 0;
984
+ }
985
+ /* resolution out of hardware limit
986
+ * frame is vertically divided into left and right
987
+ */
988
+ isp->unite_index = ISP_UNITE_LEFT;
989
+ if (hw->unite == ISP_UNITE_ONE) {
990
+ isp->sw_rd_cnt *= 2;
991
+ isp->sw_rd_cnt += 1;
992
+ }
993
+ /* first frame handle twice for thunderboot
994
+ * first output stats to AIQ and wait new params to run second
995
+ */
996
+ if (isp->is_pre_on && t.frame_id == 0) {
997
+ isp->is_first_double = true;
998
+ isp->skip_frame = 1;
999
+ if (hw->unite != ISP_UNITE_ONE) {
1000
+ isp->sw_rd_cnt = 0;
1001
+ isp->is_frame_double = false;
1002
+ }
1003
+ rkisp_fast_switch_rx_buf(isp, false);
1004
+ }
1005
+ isp->params_vdev.rdbk_times = isp->sw_rd_cnt + 1;
6871006 }
6881007 end:
6891008 spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags);
6901009 if (times >= 0)
691
- rkisp_trigger_read_back(isp, times, mode, false);
1010
+ rkisp_trigger_read_back(isp, times, mode, is_try);
6921011 }
6931012
6941013 int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
....@@ -697,9 +1016,6 @@
6971016 struct isp2x_csi_trigger *trigger = NULL;
6981017 unsigned long lock_flags = 0;
6991018 int val, ret = 0;
700
-
701
- if (dev->dmarx_dev.trigger != T_MANUAL)
702
- return 0;
7031019
7041020 spin_lock_irqsave(&dev->rdbk_lock, lock_flags);
7051021 switch (cmd) {
....@@ -732,6 +1048,14 @@
7321048 return ret;
7331049 }
7341050
1051
+static void rkisp_rdbk_work(struct work_struct *work)
1052
+{
1053
+ struct rkisp_device *dev = container_of(work, struct rkisp_device, rdbk_work);
1054
+
1055
+ rkisp_dvfs(dev);
1056
+ rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL);
1057
+}
1058
+
7351059 void rkisp_check_idle(struct rkisp_device *dev, u32 irq)
7361060 {
7371061 u32 val = 0;
....@@ -750,13 +1074,23 @@
7501074 !IS_HDR_RDBK(dev->rd_mode))
7511075 return;
7521076
1077
+ if (dev->sw_rd_cnt)
1078
+ goto end;
1079
+
1080
+ if (dev->is_first_double) {
1081
+ rkisp_fast_switch_rx_buf(dev, true);
1082
+ dev->skip_frame = 0;
1083
+ dev->irq_ends = 0;
1084
+ return;
1085
+ }
1086
+
7531087 /* check output stream is off */
754
- val = ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC;
1088
+ val = ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC | ISP_FRAME_BP;
7551089 if (!(dev->irq_ends_mask & val)) {
7561090 u32 state = dev->isp_state;
7571091 struct rkisp_stream *s;
7581092
759
- for (val = 0; val <= RKISP_STREAM_SP; val++) {
1093
+ for (val = 0; val < RKISP_STREAM_VIR; val++) {
7601094 s = &dev->cap_dev.stream[val];
7611095 dev->isp_state = ISP_STOP;
7621096 if (s->streaming) {
....@@ -767,7 +1101,6 @@
7671101 }
7681102
7691103 val = 0;
770
- dev->irq_ends = 0;
7711104 switch (dev->rd_mode) {
7721105 case HDR_RDBK_FRAME3://for rd1 rd0 rd2
7731106 val |= RAW1_RD_FRAME;
....@@ -780,7 +1113,12 @@
7801113 /* FALLTHROUGH */
7811114 }
7821115 rkisp2_rawrd_isr(val, dev);
783
- if (dev->dmarx_dev.trigger == T_MANUAL)
1116
+
1117
+end:
1118
+ dev->irq_ends = 0;
1119
+ if (dev->hw_dev->is_dvfs)
1120
+ schedule_work(&dev->rdbk_work);
1121
+ else
7841122 rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL);
7851123 if (dev->isp_state == ISP_STOP)
7861124 wake_up(&dev->sync_onoff);
....@@ -803,31 +1141,33 @@
8031141 */
8041142 static void rkisp_config_ism(struct rkisp_device *dev)
8051143 {
806
- void __iomem *base = dev->base_addr;
8071144 struct v4l2_rect *out_crop = &dev->isp_sdev.out_crop;
808
- u32 val;
1145
+ u32 width = out_crop->width, mult = 1;
1146
+ u32 unite = dev->hw_dev->unite;
8091147
8101148 /* isp2.0 no ism */
811
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
1149
+ if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21 ||
1150
+ dev->isp_ver == ISP_V32_L)
8121151 return;
8131152
814
- writel(0, base + CIF_ISP_IS_RECENTER);
815
- writel(0, base + CIF_ISP_IS_MAX_DX);
816
- writel(0, base + CIF_ISP_IS_MAX_DY);
817
- writel(0, base + CIF_ISP_IS_DISPLACE);
818
- writel(out_crop->left, base + CIF_ISP_IS_H_OFFS);
819
- writel(out_crop->top, base + CIF_ISP_IS_V_OFFS);
820
- writel(out_crop->width, base + CIF_ISP_IS_H_SIZE);
1153
+ if (unite)
1154
+ width = width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
1155
+ rkisp_unite_write(dev, CIF_ISP_IS_RECENTER, 0, false);
1156
+ rkisp_unite_write(dev, CIF_ISP_IS_MAX_DX, 0, false);
1157
+ rkisp_unite_write(dev, CIF_ISP_IS_MAX_DY, 0, false);
1158
+ rkisp_unite_write(dev, CIF_ISP_IS_DISPLACE, 0, false);
1159
+ rkisp_unite_write(dev, CIF_ISP_IS_H_OFFS, out_crop->left, false);
1160
+ rkisp_unite_write(dev, CIF_ISP_IS_V_OFFS, out_crop->top, false);
1161
+ rkisp_unite_write(dev, CIF_ISP_IS_H_SIZE, width, false);
8211162 if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced)
822
- writel(out_crop->height / 2, base + CIF_ISP_IS_V_SIZE);
823
- else
824
- writel(out_crop->height, base + CIF_ISP_IS_V_SIZE);
1163
+ mult = 2;
1164
+ rkisp_unite_write(dev, CIF_ISP_IS_V_SIZE, out_crop->height / mult, false);
1165
+
1166
+ if (dev->isp_ver == ISP_V30 || dev->isp_ver == ISP_V32)
1167
+ return;
8251168
8261169 /* IS(Image Stabilization) is always on, working as output crop */
827
- writel(1, base + CIF_ISP_IS_CTRL);
828
- val = readl(base + CIF_ISP_CTRL);
829
- val |= CIF_ISP_CTRL_ISP_CFG_UPD;
830
- writel(val, base + CIF_ISP_CTRL);
1170
+ rkisp_write(dev, CIF_ISP_IS_CTRL, 1, false);
8311171 }
8321172
8331173 static int rkisp_reset_handle_v2x(struct rkisp_device *dev)
....@@ -984,7 +1324,7 @@
9841324 !(monitor->state & ISP_MIPI_ERROR))) {
9851325 for (i = 0; i < hw->dev_num; i++) {
9861326 isp = hw->isp[i];
987
- if (!(isp->isp_inp & INP_CSI))
1327
+ if (!isp || (isp && !(isp->isp_inp & INP_CSI)))
9881328 continue;
9891329 if (!(isp->isp_state & ISP_START))
9901330 break;
....@@ -1006,6 +1346,8 @@
10061346 }
10071347 for (i = 0; i < hw->dev_num; i++) {
10081348 isp = hw->isp[i];
1349
+ if (!isp)
1350
+ continue;
10091351 if (isp->isp_inp & INP_CSI ||
10101352 isp->isp_inp & INP_DVP ||
10111353 isp->isp_inp & INP_LVDS) {
....@@ -1032,6 +1374,8 @@
10321374
10331375 for (i = 0; i < hw->dev_num; i++) {
10341376 isp = hw->isp[i];
1377
+ if (!isp)
1378
+ continue;
10351379 if (isp->isp_inp & INP_CSI ||
10361380 isp->isp_inp & INP_DVP ||
10371381 isp->isp_inp & INP_LVDS) {
....@@ -1085,6 +1429,8 @@
10851429 */
10861430 static void rkisp_config_color_space(struct rkisp_device *dev)
10871431 {
1432
+ u32 val = 0;
1433
+
10881434 u16 bt601_coeff[] = {
10891435 0x0026, 0x004b, 0x000f,
10901436 0x01ea, 0x01d6, 0x0040,
....@@ -1116,16 +1462,221 @@
11161462 }
11171463
11181464 for (i = 0; i < 9; i++)
1119
- rkisp_write(dev, CIF_ISP_CC_COEFF_0 + i * 4, *(coeff + i), false);
1465
+ rkisp_unite_write(dev, CIF_ISP_CC_COEFF_0 + i * 4,
1466
+ *(coeff + i), false);
1467
+
1468
+ val = rkisp_read_reg_cache(dev, CIF_ISP_CTRL);
11201469
11211470 if (dev->isp_sdev.quantization == V4L2_QUANTIZATION_FULL_RANGE)
1122
- rkisp_set_bits(dev, CIF_ISP_CTRL, 0,
1123
- CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1124
- CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA, false);
1471
+ rkisp_unite_write(dev, CIF_ISP_CTRL, val |
1472
+ CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1473
+ CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA, false);
11251474 else
1126
- rkisp_clear_bits(dev, CIF_ISP_CTRL,
1127
- CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1128
- CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA, false);
1475
+ rkisp_unite_write(dev, CIF_ISP_CTRL, val &
1476
+ ~(CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1477
+ CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA), false);
1478
+}
1479
+
1480
+static void rkisp_config_cmsk_single(struct rkisp_device *dev,
1481
+ struct rkisp_cmsk_cfg *cfg)
1482
+{
1483
+ u32 i, val, ctrl = 0;
1484
+ u32 mp_en = cfg->win[0].win_en;
1485
+ u32 sp_en = cfg->win[1].win_en;
1486
+ u32 bp_en = cfg->win[2].win_en;
1487
+ u32 win_max = (dev->isp_ver == ISP_V30) ?
1488
+ RKISP_CMSK_WIN_MAX_V30 : RKISP_CMSK_WIN_MAX;
1489
+
1490
+ if (mp_en) {
1491
+ ctrl |= ISP3X_SW_CMSK_EN_MP;
1492
+ rkisp_write(dev, ISP3X_CMSK_CTRL1, mp_en, false);
1493
+ val = cfg->win[0].mode;
1494
+ rkisp_write(dev, ISP3X_CMSK_CTRL4, val, false);
1495
+ }
1496
+
1497
+ if (sp_en) {
1498
+ ctrl |= ISP3X_SW_CMSK_EN_SP;
1499
+ rkisp_write(dev, ISP3X_CMSK_CTRL2, sp_en, false);
1500
+ val = cfg->win[1].mode;
1501
+ rkisp_write(dev, ISP3X_CMSK_CTRL5, val, false);
1502
+ }
1503
+
1504
+ if (bp_en) {
1505
+ ctrl |= ISP3X_SW_CMSK_EN_BP;
1506
+ rkisp_write(dev, ISP3X_CMSK_CTRL3, bp_en, false);
1507
+ val = cfg->win[2].mode;
1508
+ rkisp_write(dev, ISP3X_CMSK_CTRL6, val, false);
1509
+ }
1510
+
1511
+ for (i = 0; i < win_max; i++) {
1512
+ if (!(mp_en & BIT(i)) && !(sp_en & BIT(i)) && !(bp_en & BIT(i)))
1513
+ continue;
1514
+
1515
+ val = ISP3X_SW_CMSK_YUV(cfg->win[i].cover_color_y,
1516
+ cfg->win[i].cover_color_u,
1517
+ cfg->win[i].cover_color_v);
1518
+ rkisp_write(dev, ISP3X_CMSK_YUV0 + i * 4, val, false);
1519
+
1520
+ val = ISP_PACK_2SHORT(cfg->win[i].h_offs, cfg->win[i].v_offs);
1521
+ rkisp_write(dev, ISP3X_CMSK_OFFS0 + i * 8, val, false);
1522
+
1523
+ val = ISP_PACK_2SHORT(cfg->win[i].h_size, cfg->win[i].v_size);
1524
+ rkisp_write(dev, ISP3X_CMSK_SIZE0 + i * 8, val, false);
1525
+ }
1526
+
1527
+ if (ctrl) {
1528
+ val = ISP_PACK_2SHORT(dev->isp_sdev.out_crop.width,
1529
+ dev->isp_sdev.out_crop.height);
1530
+ rkisp_write(dev, ISP3X_CMSK_PIC_SIZE, val, false);
1531
+ ctrl |= ISP3X_SW_CMSK_EN | ISP3X_SW_CMSK_ORDER_MODE;
1532
+ ctrl |= ISP3X_SW_CMSK_BLKSIZE(cfg->mosaic_block);
1533
+ }
1534
+ rkisp_write(dev, ISP3X_CMSK_CTRL0, ctrl, false);
1535
+
1536
+ val = rkisp_read(dev, ISP3X_CMSK_CTRL0, true);
1537
+ if (dev->hw_dev->is_single &&
1538
+ ((val & ISP32_SW_CMSK_EN_PATH) != (val & ISP32_SW_CMSK_EN_PATH_SHD)))
1539
+ rkisp_write(dev, ISP3X_CMSK_CTRL0, val | ISP3X_SW_CMSK_FORCE_UPD, true);
1540
+}
1541
+
1542
+static void rkisp_config_cmsk_dual(struct rkisp_device *dev,
1543
+ struct rkisp_cmsk_cfg *cfg)
1544
+{
1545
+ struct rkisp_cmsk_cfg left = *cfg;
1546
+ struct rkisp_cmsk_cfg right = *cfg;
1547
+ u32 width = dev->isp_sdev.out_crop.width;
1548
+ u32 height = dev->isp_sdev.out_crop.height;
1549
+ u32 w = width / 2;
1550
+ u32 i, val, h_offs, h_size, ctrl;
1551
+ u8 mp_en = cfg->win[0].win_en;
1552
+ u8 sp_en = cfg->win[1].win_en;
1553
+ u8 bp_en = cfg->win[2].win_en;
1554
+ u32 win_max = (dev->isp_ver == ISP_V30) ?
1555
+ RKISP_CMSK_WIN_MAX_V30 : RKISP_CMSK_WIN_MAX;
1556
+
1557
+ for (i = 0; i < win_max; i++) {
1558
+ if (!(mp_en & BIT(i)) && !(sp_en & BIT(i)) && !(bp_en & BIT(i)))
1559
+ continue;
1560
+
1561
+ h_offs = cfg->win[i].h_offs;
1562
+ h_size = cfg->win[i].h_size;
1563
+ if (h_offs + h_size <= w) {
1564
+ /* cmsk window at left isp */
1565
+ right.win[0].win_en &= ~BIT(i);
1566
+ right.win[1].win_en &= ~BIT(i);
1567
+ right.win[2].win_en &= ~BIT(i);
1568
+ } else if (h_offs >= w) {
1569
+ /* cmsk window at right isp */
1570
+ left.win[0].win_en &= ~BIT(i);
1571
+ left.win[1].win_en &= ~BIT(i);
1572
+ left.win[2].win_en &= ~BIT(i);
1573
+ } else {
1574
+ /* cmsk window at dual isp */
1575
+ left.win[i].h_size = ALIGN(w - h_offs, 8);
1576
+
1577
+ right.win[i].h_offs = RKMOUDLE_UNITE_EXTEND_PIXEL;
1578
+ val = h_offs + h_size - w;
1579
+ right.win[i].h_size = ALIGN(val, 8);
1580
+ right.win[i].h_offs -= right.win[i].h_size - val;
1581
+ }
1582
+
1583
+ val = ISP3X_SW_CMSK_YUV(left.win[i].cover_color_y,
1584
+ left.win[i].cover_color_u,
1585
+ left.win[i].cover_color_v);
1586
+ rkisp_write(dev, ISP3X_CMSK_YUV0 + i * 4, val, false);
1587
+ rkisp_next_write(dev, ISP3X_CMSK_YUV0 + i * 4, val, false);
1588
+
1589
+ val = ISP_PACK_2SHORT(left.win[i].h_offs, left.win[i].v_offs);
1590
+ rkisp_write(dev, ISP3X_CMSK_OFFS0 + i * 8, val, false);
1591
+ val = ISP_PACK_2SHORT(left.win[i].h_size, left.win[i].v_size);
1592
+ rkisp_write(dev, ISP3X_CMSK_SIZE0 + i * 8, val, false);
1593
+
1594
+ val = ISP_PACK_2SHORT(right.win[i].h_offs, right.win[i].v_offs);
1595
+ rkisp_next_write(dev, ISP3X_CMSK_OFFS0 + i * 8, val, false);
1596
+ val = ISP_PACK_2SHORT(right.win[i].h_size, right.win[i].v_size);
1597
+ rkisp_next_write(dev, ISP3X_CMSK_SIZE0 + i * 8, val, false);
1598
+ }
1599
+
1600
+ w += RKMOUDLE_UNITE_EXTEND_PIXEL;
1601
+ ctrl = 0;
1602
+ if (left.win[0].win_en) {
1603
+ ctrl |= ISP3X_SW_CMSK_EN_MP;
1604
+ rkisp_write(dev, ISP3X_CMSK_CTRL1, left.win[0].win_en, false);
1605
+ val = left.win[0].mode;
1606
+ rkisp_write(dev, ISP3X_CMSK_CTRL4, val, false);
1607
+ }
1608
+ if (left.win[1].win_en) {
1609
+ ctrl |= ISP3X_SW_CMSK_EN_SP;
1610
+ rkisp_write(dev, ISP3X_CMSK_CTRL2, left.win[1].win_en, false);
1611
+ val = left.win[1].mode;
1612
+ rkisp_write(dev, ISP3X_CMSK_CTRL5, val, false);
1613
+ }
1614
+ if (left.win[2].win_en) {
1615
+ ctrl |= ISP3X_SW_CMSK_EN_BP;
1616
+ rkisp_write(dev, ISP3X_CMSK_CTRL3, left.win[2].win_en, false);
1617
+ val = left.win[2].mode;
1618
+ rkisp_write(dev, ISP3X_CMSK_CTRL6, val, false);
1619
+ }
1620
+ if (ctrl) {
1621
+ val = ISP_PACK_2SHORT(w, height);
1622
+ rkisp_write(dev, ISP3X_CMSK_PIC_SIZE, val, false);
1623
+ ctrl |= ISP3X_SW_CMSK_EN | ISP3X_SW_CMSK_ORDER_MODE;
1624
+ }
1625
+ rkisp_write(dev, ISP3X_CMSK_CTRL0, ctrl, false);
1626
+
1627
+ ctrl = 0;
1628
+ if (right.win[0].win_en) {
1629
+ ctrl |= ISP3X_SW_CMSK_EN_MP;
1630
+ rkisp_next_write(dev, ISP3X_CMSK_CTRL1, right.win[0].win_en, false);
1631
+ val = right.win[0].mode;
1632
+ rkisp_next_write(dev, ISP3X_CMSK_CTRL4, val, false);
1633
+ }
1634
+ if (right.win[1].win_en) {
1635
+ ctrl |= ISP3X_SW_CMSK_EN_SP;
1636
+ rkisp_next_write(dev, ISP3X_CMSK_CTRL2, right.win[1].win_en, false);
1637
+ val = right.win[1].mode;
1638
+ rkisp_next_write(dev, ISP3X_CMSK_CTRL5, val, false);
1639
+ }
1640
+ if (right.win[2].win_en) {
1641
+ ctrl |= ISP3X_SW_CMSK_EN_BP;
1642
+ rkisp_next_write(dev, ISP3X_CMSK_CTRL3, right.win[2].win_en, false);
1643
+ val = right.win[2].mode;
1644
+ rkisp_next_write(dev, ISP3X_CMSK_CTRL6, val, false);
1645
+ }
1646
+ if (ctrl) {
1647
+ val = ISP_PACK_2SHORT(w, height);
1648
+ rkisp_next_write(dev, ISP3X_CMSK_PIC_SIZE, val, false);
1649
+ ctrl |= ISP3X_SW_CMSK_EN | ISP3X_SW_CMSK_ORDER_MODE;
1650
+ }
1651
+ rkisp_next_write(dev, ISP3X_CMSK_CTRL0, ctrl, false);
1652
+
1653
+ val = rkisp_next_read(dev, ISP3X_CMSK_CTRL0, true);
1654
+ if (dev->hw_dev->is_single &&
1655
+ ((val & ISP32_SW_CMSK_EN_PATH) != (val & ISP32_SW_CMSK_EN_PATH_SHD)))
1656
+ rkisp_next_write(dev, ISP3X_CMSK_CTRL0, val | ISP3X_SW_CMSK_FORCE_UPD, false);
1657
+}
1658
+
1659
+static void rkisp_config_cmsk(struct rkisp_device *dev)
1660
+{
1661
+ unsigned long lock_flags = 0;
1662
+ struct rkisp_cmsk_cfg cfg;
1663
+
1664
+ if (dev->isp_ver != ISP_V30 && dev->isp_ver != ISP_V32)
1665
+ return;
1666
+
1667
+ spin_lock_irqsave(&dev->cmsk_lock, lock_flags);
1668
+ if (!dev->is_cmsk_upd) {
1669
+ spin_unlock_irqrestore(&dev->cmsk_lock, lock_flags);
1670
+ return;
1671
+ }
1672
+ dev->is_cmsk_upd = false;
1673
+ cfg = dev->cmsk_cfg;
1674
+ spin_unlock_irqrestore(&dev->cmsk_lock, lock_flags);
1675
+
1676
+ if (!dev->hw_dev->unite)
1677
+ rkisp_config_cmsk_single(dev, &cfg);
1678
+ else
1679
+ rkisp_config_cmsk_dual(dev, &cfg);
11291680 }
11301681
11311682 /*
....@@ -1137,17 +1688,20 @@
11371688 struct ispsd_out_fmt *out_fmt;
11381689 struct v4l2_rect *in_crop;
11391690 struct rkisp_sensor_info *sensor;
1691
+ bool is_unite = !!dev->hw_dev->unite;
11401692 u32 isp_ctrl = 0;
11411693 u32 irq_mask = 0;
11421694 u32 signal = 0;
11431695 u32 acq_mult = 0;
11441696 u32 acq_prop = 0;
11451697 u32 extend_line = 0;
1698
+ u32 width;
11461699
11471700 sensor = dev->active_sensor;
11481701 in_fmt = &dev->isp_sdev.in_fmt;
11491702 out_fmt = &dev->isp_sdev.out_fmt;
11501703 in_crop = &dev->isp_sdev.in_crop;
1704
+ width = in_crop->width;
11511705
11521706 if (in_fmt->fmt_type == FMT_BAYER) {
11531707 acq_mult = 1;
....@@ -1163,21 +1717,21 @@
11631717 if (in_fmt->mbus_code == MEDIA_BUS_FMT_Y8_1X8 ||
11641718 in_fmt->mbus_code == MEDIA_BUS_FMT_Y10_1X10 ||
11651719 in_fmt->mbus_code == MEDIA_BUS_FMT_Y12_1X12) {
1166
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
1167
- rkisp_write(dev, ISP_DEBAYER_CONTROL, 0, false);
1720
+ if (dev->isp_ver >= ISP_V20)
1721
+ rkisp_unite_write(dev, ISP_DEBAYER_CONTROL, 0, false);
11681722 else
11691723 rkisp_write(dev, CIF_ISP_DEMOSAIC,
1170
- CIF_ISP_DEMOSAIC_BYPASS |
1171
- CIF_ISP_DEMOSAIC_TH(0xc), false);
1724
+ CIF_ISP_DEMOSAIC_BYPASS |
1725
+ CIF_ISP_DEMOSAIC_TH(0xc), false);
11721726 } else {
1173
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
1174
- rkisp_write(dev, ISP_DEBAYER_CONTROL,
1175
- SW_DEBAYER_EN |
1176
- SW_DEBAYER_FILTER_G_EN |
1177
- SW_DEBAYER_FILTER_C_EN, false);
1727
+ if (dev->isp_ver >= ISP_V20)
1728
+ rkisp_unite_write(dev, ISP_DEBAYER_CONTROL,
1729
+ SW_DEBAYER_EN |
1730
+ SW_DEBAYER_FILTER_G_EN |
1731
+ SW_DEBAYER_FILTER_C_EN, false);
11781732 else
11791733 rkisp_write(dev, CIF_ISP_DEMOSAIC,
1180
- CIF_ISP_DEMOSAIC_TH(0xc), false);
1734
+ CIF_ISP_DEMOSAIC_TH(0xc), false);
11811735 }
11821736
11831737 if (sensor && sensor->mbus.type == V4L2_MBUS_BT656)
....@@ -1195,7 +1749,7 @@
11951749 } else if (in_fmt->fmt_type == FMT_YUV) {
11961750 acq_mult = 2;
11971751 if (sensor &&
1198
- (sensor->mbus.type == V4L2_MBUS_CSI2 ||
1752
+ (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY ||
11991753 sensor->mbus.type == V4L2_MBUS_CCP2)) {
12001754 isp_ctrl = CIF_ISP_CTRL_ISP_MODE_ITU601;
12011755 } else {
....@@ -1227,39 +1781,46 @@
12271781 signal |= CIF_ISP_ACQ_PROP_HSYNC_LOW;
12281782 }
12291783
1230
- rkisp_write(dev, CIF_ISP_CTRL, isp_ctrl, false);
1784
+ if (rkisp_read_reg_cache(dev, CIF_ISP_CTRL) & ISP32_MIR_ENABLE)
1785
+ isp_ctrl |= ISP32_MIR_ENABLE;
1786
+
1787
+ rkisp_unite_write(dev, CIF_ISP_CTRL, isp_ctrl, false);
12311788 acq_prop |= signal | in_fmt->yuv_seq |
12321789 CIF_ISP_ACQ_PROP_BAYER_PAT(in_fmt->bayer_pat) |
12331790 CIF_ISP_ACQ_PROP_FIELD_SEL_ALL;
1234
- rkisp_write(dev, CIF_ISP_ACQ_PROP, acq_prop, false);
1235
- rkisp_write(dev, CIF_ISP_ACQ_NR_FRAMES, 0, true);
1791
+ rkisp_unite_write(dev, CIF_ISP_ACQ_PROP, acq_prop, false);
1792
+ rkisp_unite_write(dev, CIF_ISP_ACQ_NR_FRAMES, 0, true);
12361793
1794
+ if (is_unite)
1795
+ width = width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
12371796 /* Acquisition Size */
1238
- rkisp_write(dev, CIF_ISP_ACQ_H_OFFS, acq_mult * in_crop->left, false);
1239
- rkisp_write(dev, CIF_ISP_ACQ_V_OFFS, in_crop->top, false);
1240
- rkisp_write(dev, CIF_ISP_ACQ_H_SIZE, acq_mult * in_crop->width, false);
1797
+ rkisp_unite_write(dev, CIF_ISP_ACQ_H_OFFS, acq_mult * in_crop->left, false);
1798
+ rkisp_unite_write(dev, CIF_ISP_ACQ_V_OFFS, in_crop->top, false);
1799
+ rkisp_unite_write(dev, CIF_ISP_ACQ_H_SIZE, acq_mult * width, false);
12411800
12421801 /* ISP Out Area differ with ACQ is only FIFO, so don't crop in this */
1243
- rkisp_write(dev, CIF_ISP_OUT_H_OFFS, 0, true);
1244
- rkisp_write(dev, CIF_ISP_OUT_V_OFFS, 0, true);
1245
- rkisp_write(dev, CIF_ISP_OUT_H_SIZE, in_crop->width, false);
1802
+ rkisp_unite_write(dev, CIF_ISP_OUT_H_OFFS, 0, true);
1803
+ rkisp_unite_write(dev, CIF_ISP_OUT_V_OFFS, 0, true);
1804
+ rkisp_unite_write(dev, CIF_ISP_OUT_H_SIZE, width, false);
12461805
12471806 if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced) {
1248
- rkisp_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height / 2, false);
1249
- rkisp_write(dev, CIF_ISP_OUT_V_SIZE, in_crop->height / 2, false);
1807
+ rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height / 2, false);
1808
+ rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, in_crop->height / 2, false);
12501809 } else {
1251
- rkisp_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height + extend_line, false);
1252
- rkisp_write(dev, CIF_ISP_OUT_V_SIZE, in_crop->height + extend_line, false);
1810
+ rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height + extend_line, false);
1811
+ rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, in_crop->height + extend_line, false);
12531812 }
12541813
12551814 /* interrupt mask */
1256
- irq_mask |= CIF_ISP_FRAME | CIF_ISP_V_START | CIF_ISP_PIC_SIZE_ERROR |
1257
- CIF_ISP_FRAME_IN;
1258
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
1815
+ irq_mask |= CIF_ISP_FRAME | CIF_ISP_V_START | CIF_ISP_PIC_SIZE_ERROR;
1816
+ if (dev->isp_ver >= ISP_V20)
12591817 irq_mask |= ISP2X_LSC_LUT_ERR;
1260
- rkisp_write(dev, CIF_ISP_IMSC, irq_mask, true);
1818
+ if (dev->is_pre_on)
1819
+ irq_mask |= CIF_ISP_FRAME_IN;
1820
+ rkisp_unite_write(dev, CIF_ISP_IMSC, irq_mask, true);
12611821
1262
- if ((dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) &&
1822
+ if ((dev->isp_ver == ISP_V20 ||
1823
+ dev->isp_ver == ISP_V21) &&
12631824 IS_HDR_RDBK(dev->hdr.op_mode)) {
12641825 irq_mask = ISP2X_3A_RAWAE_BIG;
12651826 rkisp_write(dev, ISP_ISP3A_IMSC, irq_mask, true);
....@@ -1276,6 +1837,8 @@
12761837 rkisp_update_regs(dev, CIF_ISP_ACQ_H_OFFS, CIF_ISP_ACQ_V_SIZE);
12771838 rkisp_update_regs(dev, CIF_ISP_OUT_H_SIZE, CIF_ISP_OUT_V_SIZE);
12781839 }
1840
+
1841
+ rkisp_config_cmsk(dev);
12791842 return 0;
12801843 }
12811844
....@@ -1379,12 +1942,12 @@
13791942 /* Configure MUX */
13801943 static int rkisp_config_path(struct rkisp_device *dev)
13811944 {
1382
- int ret = 0;
13831945 struct rkisp_sensor_info *sensor = dev->active_sensor;
1384
- u32 dpcl = readl(dev->base_addr + CIF_VI_DPCL);
1946
+ int ret = 0;
1947
+ u32 dpcl = 0;
13851948
13861949 /* isp input interface selects */
1387
- if ((sensor && sensor->mbus.type == V4L2_MBUS_CSI2) ||
1950
+ if ((sensor && sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) ||
13881951 dev->isp_inp & (INP_RAWRD0 | INP_RAWRD1 | INP_RAWRD2 | INP_CIF)) {
13891952 /* mipi sensor->isp or isp read from ddr */
13901953 dpcl |= CIF_VI_DPCL_IF_SEL_MIPI;
....@@ -1406,12 +1969,10 @@
14061969 ret = -EINVAL;
14071970 }
14081971
1409
- /* fix 3a_wr no output with selfpath */
1410
- if (dev->isp_ver == ISP_V21)
1411
- dpcl |= CIF_VI_DPCL_CHAN_MODE_MP | CIF_VI_DPCL_MP_MUX_MRSZ_MI;
1972
+ if (dev->isp_ver == ISP_V32)
1973
+ dpcl |= BIT(0);
14121974
1413
- writel(dpcl, dev->base_addr + CIF_VI_DPCL);
1414
-
1975
+ rkisp_unite_set_bits(dev, CIF_VI_DPCL, 0, dpcl, true);
14151976 return ret;
14161977 }
14171978
....@@ -1483,7 +2044,7 @@
14832044 int ret = 1000;
14842045
14852046 if (!rkisp_is_need_3a(dev) || dev->isp_ver == ISP_V20 ||
1486
- !params_vdev->is_subs_evt)
2047
+ !params_vdev->is_subs_evt || dev->hw_dev->is_shutdown)
14872048 return;
14882049
14892050 v4l2_event_queue(vdev, &ev);
....@@ -1500,6 +2061,7 @@
15002061 /* Mess register operations to stop isp */
15012062 static int rkisp_isp_stop(struct rkisp_device *dev)
15022063 {
2064
+ struct rkisp_hw_dev *hw = dev->hw_dev;
15032065 void __iomem *base = dev->base_addr;
15042066 unsigned long old_rate, safe_rate;
15052067 u32 val;
....@@ -1507,9 +2069,9 @@
15072069
15082070 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
15092071 "%s refcnt:%d\n", __func__,
1510
- atomic_read(&dev->hw_dev->refcnt));
2072
+ atomic_read(&hw->refcnt));
15112073
1512
- if (atomic_read(&dev->hw_dev->refcnt) > 1)
2074
+ if (atomic_read(&hw->refcnt) > 1)
15132075 goto end;
15142076 /*
15152077 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
....@@ -1523,7 +2085,7 @@
15232085 readl(base + CIF_ISP_CSI0_ERR1);
15242086 readl(base + CIF_ISP_CSI0_ERR2);
15252087 readl(base + CIF_ISP_CSI0_ERR3);
1526
- } else if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
2088
+ } else if (dev->isp_ver >= ISP_V20) {
15272089 writel(0, base + CSI2RX_MASK_PHY);
15282090 writel(0, base + CSI2RX_MASK_PACKET);
15292091 writel(0, base + CSI2RX_MASK_OVERFLOW);
....@@ -1540,7 +2102,7 @@
15402102 writel(0, base + CIF_ISP_IMSC);
15412103 writel(~0, base + CIF_ISP_ICR);
15422104
1543
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
2105
+ if (dev->isp_ver >= ISP_V20) {
15442106 writel(0, base + ISP_ISP3A_IMSC);
15452107 writel(~0, base + ISP_ISP3A_ICR);
15462108 }
....@@ -1556,7 +2118,7 @@
15562118 udelay(20);
15572119 }
15582120 /* stop lsc to avoid lsclut error */
1559
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
2121
+ if (dev->isp_ver >= ISP_V20)
15602122 writel(0, base + ISP_LSC_CTRL);
15612123 /* stop ISP */
15622124 val = readl(base + CIF_ISP_CTRL);
....@@ -1565,6 +2127,9 @@
15652127
15662128 val = readl(base + CIF_ISP_CTRL);
15672129 writel(val | CIF_ISP_CTRL_ISP_CFG_UPD, base + CIF_ISP_CTRL);
2130
+ if (hw->unite == ISP_UNITE_TWO)
2131
+ rkisp_next_write(dev, CIF_ISP_CTRL,
2132
+ val | CIF_ISP_CTRL_ISP_CFG_UPD, true);
15682133
15692134 readx_poll_timeout_atomic(readl, base + CIF_ISP_RIS,
15702135 val, val & CIF_ISP_OFF, 20, 100);
....@@ -1572,19 +2137,19 @@
15722137 "MI_CTRL:%x, ISP_CTRL:%x\n",
15732138 readl(base + CIF_MI_CTRL), readl(base + CIF_ISP_CTRL));
15742139
1575
- val = rkisp_read(dev, CTRL_VI_ISP_CLK_CTRL, true);
15762140 if (!in_interrupt()) {
15772141 /* normal case */
15782142 /* check the isp_clk before isp reset operation */
1579
- old_rate = clk_get_rate(dev->hw_dev->clks[0]);
1580
- safe_rate = dev->hw_dev->clk_rate_tbl[0].clk_rate * 1000000UL;
2143
+ old_rate = clk_get_rate(hw->clks[0]);
2144
+ safe_rate = hw->clk_rate_tbl[0].clk_rate * 1000000UL;
15812145 if (old_rate > safe_rate) {
1582
- rkisp_set_clk_rate(dev->hw_dev->clks[0], safe_rate);
2146
+ rkisp_set_clk_rate(hw->clks[0], safe_rate);
2147
+ if (hw->unite == ISP_UNITE_TWO)
2148
+ rkisp_set_clk_rate(hw->clks[5], safe_rate);
15832149 udelay(100);
15842150 }
1585
- rkisp_soft_reset(dev->hw_dev, false);
2151
+ rkisp_soft_reset(hw, false);
15862152 }
1587
- rkisp_write(dev, CTRL_VI_ISP_CLK_CTRL, val, true);
15882153
15892154 if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) {
15902155 writel(0, base + CIF_ISP_CSI0_CSI2_RESETN);
....@@ -1592,19 +2157,28 @@
15922157 writel(0, base + CIF_ISP_CSI0_MASK1);
15932158 writel(0, base + CIF_ISP_CSI0_MASK2);
15942159 writel(0, base + CIF_ISP_CSI0_MASK3);
1595
- } else if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
2160
+ } else if (dev->isp_ver >= ISP_V20) {
15962161 writel(0, base + CSI2RX_CSI2_RESETN);
2162
+ if (hw->unite == ISP_UNITE_TWO)
2163
+ rkisp_next_write(dev, CSI2RX_CSI2_RESETN, 0, true);
15972164 }
15982165
1599
- dev->hw_dev->is_idle = true;
1600
- dev->hw_dev->is_mi_update = false;
2166
+ hw->is_dvfs = false;
2167
+ hw->is_runing = false;
2168
+ hw->is_idle = true;
2169
+ hw->is_mi_update = false;
2170
+ hw->pre_dev_id = -1;
16012171 end:
16022172 dev->irq_ends_mask = 0;
16032173 dev->hdr.op_mode = 0;
2174
+ dev->sw_rd_cnt = 0;
2175
+ dev->stats_vdev.rdbk_drop = false;
16042176 rkisp_set_state(&dev->isp_state, ISP_STOP);
16052177
1606
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
2178
+ if (dev->isp_ver >= ISP_V20)
16072179 kfifo_reset(&dev->rdbk_kfifo);
2180
+ if (dev->isp_ver == ISP_V30 || dev->isp_ver == ISP_V32)
2181
+ memset(&dev->cmsk_cfg, 0, sizeof(dev->cmsk_cfg));
16082182 if (dev->emd_vc <= CIF_ISP_ADD_DATA_VC_MAX) {
16092183 for (i = 0; i < RKISP_EMDDATA_FIFO_MAX; i++)
16102184 kfifo_free(&dev->emd_data_fifo[i].mipi_kfifo);
....@@ -1622,15 +2196,37 @@
16222196 {
16232197 struct rkisp_sensor_info *sensor = dev->active_sensor;
16242198 void __iomem *base = dev->base_addr;
1625
- u32 val;
16262199 bool is_direct = true;
2200
+ u32 val;
16272201
16282202 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
1629
- "%s refcnt:%d\n", __func__,
1630
- atomic_read(&dev->hw_dev->refcnt));
2203
+ "%s refcnt:%d link_num:%d\n", __func__,
2204
+ atomic_read(&dev->hw_dev->refcnt),
2205
+ dev->hw_dev->dev_link_num);
2206
+
2207
+ dev->cap_dev.is_done_early = false;
2208
+ if (dev->cap_dev.wait_line >= dev->isp_sdev.out_crop.height)
2209
+ dev->cap_dev.wait_line = 0;
2210
+ if (dev->cap_dev.wait_line) {
2211
+ dev->cap_dev.is_done_early = true;
2212
+ if (dev->isp_ver >= ISP_V32) {
2213
+ val = dev->cap_dev.wait_line;
2214
+ rkisp_write(dev, ISP32_ISP_IRQ_CFG0, val << 16, false);
2215
+ rkisp_set_bits(dev, CIF_ISP_IMSC, 0, ISP3X_OUT_FRM_HALF, false);
2216
+ } else {
2217
+ /* using AF 15x15 block */
2218
+ val = dev->isp_sdev.out_crop.height / 15;
2219
+ val = dev->cap_dev.wait_line / val;
2220
+ val = ISP3X_RAWAF_INELINE0(val) | ISP3X_RAWAF_INTLINE0_EN;
2221
+ rkisp_unite_write(dev, ISP3X_RAWAF_INT_LINE, val, false);
2222
+ rkisp_unite_set_bits(dev, ISP_ISP3A_IMSC, 0, ISP2X_3A_RAWAF, false);
2223
+ rkisp_unite_clear_bits(dev, CIF_ISP_IMSC, ISP2X_LSC_LUT_ERR, false);
2224
+ dev->rawaf_irq_cnt = 0;
2225
+ }
2226
+ }
16312227
16322228 /* Activate MIPI */
1633
- if (sensor && sensor->mbus.type == V4L2_MBUS_CSI2) {
2229
+ if (sensor && sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
16342230 if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) {
16352231 /* clear interrupts state */
16362232 readl(base + CIF_ISP_CSI0_ERR1);
....@@ -1645,19 +2241,19 @@
16452241 }
16462242 }
16472243 /* Activate ISP */
1648
- val = rkisp_read(dev, CIF_ISP_CTRL, false);
2244
+ val = rkisp_read_reg_cache(dev, CIF_ISP_CTRL);
16492245 val |= CIF_ISP_CTRL_ISP_CFG_UPD | CIF_ISP_CTRL_ISP_ENABLE |
16502246 CIF_ISP_CTRL_ISP_INFORM_ENABLE | CIF_ISP_CTRL_ISP_CFG_UPD_PERMANENT;
16512247 if (dev->isp_ver == ISP_V20)
16522248 val |= NOC_HURRY_PRIORITY(2) | NOC_HURRY_W_MODE(2) | NOC_HURRY_R_MODE(1);
16532249 if (atomic_read(&dev->hw_dev->refcnt) > 1)
16542250 is_direct = false;
1655
- rkisp_write(dev, CIF_ISP_CTRL, val, is_direct);
2251
+ rkisp_unite_write(dev, CIF_ISP_CTRL, val, is_direct);
2252
+ rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD);
16562253
16572254 dev->isp_err_cnt = 0;
16582255 dev->isp_isr_cnt = 0;
1659
- dev->isp_state = ISP_START | ISP_FRAME_END;
1660
- dev->irq_ends_mask |= ISP_FRAME_END | ISP_FRAME_IN;
2256
+ dev->irq_ends_mask |= ISP_FRAME_END;
16612257 dev->irq_ends = 0;
16622258
16632259 /* XXX: Is the 1000us too long?
....@@ -2097,7 +2693,7 @@
20972693 struct rkisp_isp_subdev *isp_sd = sd_to_isp_sd(sd);
20982694 struct rkisp_device *dev = sd_to_isp_dev(sd);
20992695 struct v4l2_rect *crop;
2100
- u32 max_w, max_h;
2696
+ u32 max_w, max_h, max_size;
21012697
21022698 if (!sel)
21032699 goto err;
....@@ -2118,19 +2714,42 @@
21182714 crop->left = 0;
21192715 crop->top = 0;
21202716 if (sel->pad == RKISP_ISP_PAD_SINK) {
2121
- if (dev->isp_ver == ISP_V12) {
2717
+ switch (dev->isp_ver) {
2718
+ case ISP_V12:
21222719 max_w = CIF_ISP_INPUT_W_MAX_V12;
21232720 max_h = CIF_ISP_INPUT_H_MAX_V12;
2124
- } else if (dev->isp_ver == ISP_V13) {
2721
+ break;
2722
+ case ISP_V13:
21252723 max_w = CIF_ISP_INPUT_W_MAX_V13;
21262724 max_h = CIF_ISP_INPUT_H_MAX_V13;
2127
- } else if (dev->isp_ver == ISP_V21) {
2725
+ break;
2726
+ case ISP_V21:
21282727 max_w = CIF_ISP_INPUT_W_MAX_V21;
21292728 max_h = CIF_ISP_INPUT_H_MAX_V21;
2130
- } else {
2729
+ break;
2730
+ case ISP_V30:
2731
+ max_w = dev->hw_dev->unite ?
2732
+ CIF_ISP_INPUT_W_MAX_V30_UNITE : CIF_ISP_INPUT_W_MAX_V30;
2733
+ max_h = dev->hw_dev->unite ?
2734
+ CIF_ISP_INPUT_H_MAX_V30_UNITE : CIF_ISP_INPUT_H_MAX_V30;
2735
+ break;
2736
+ case ISP_V32:
2737
+ max_w = dev->hw_dev->unite ?
2738
+ CIF_ISP_INPUT_W_MAX_V32_UNITE : CIF_ISP_INPUT_W_MAX_V32;
2739
+ max_h = dev->hw_dev->unite ?
2740
+ CIF_ISP_INPUT_H_MAX_V32_UNITE : CIF_ISP_INPUT_H_MAX_V32;
2741
+ break;
2742
+ case ISP_V32_L:
2743
+ max_w = CIF_ISP_INPUT_W_MAX_V32_L;
2744
+ max_h = CIF_ISP_INPUT_H_MAX_V32_L;
2745
+ break;
2746
+ default:
21312747 max_w = CIF_ISP_INPUT_W_MAX;
21322748 max_h = CIF_ISP_INPUT_H_MAX;
21332749 }
2750
+ max_size = max_w * max_h;
2751
+ max_h = max_size / isp_sd->in_frm.width;
2752
+
21342753 crop->width = min_t(u32, isp_sd->in_frm.width, max_w);
21352754 crop->height = min_t(u32, isp_sd->in_frm.height, max_h);
21362755 }
....@@ -2146,6 +2765,40 @@
21462765 return 0;
21472766 err:
21482767 return -EINVAL;
2768
+}
2769
+
2770
+static void rkisp_check_stream_dcrop(struct rkisp_device *dev,
2771
+ struct v4l2_rect *crop)
2772
+{
2773
+ struct rkisp_stream *stream;
2774
+ struct v4l2_rect *dcrop;
2775
+ u32 i;
2776
+
2777
+ for (i = 0; i < RKISP_MAX_STREAM; i++) {
2778
+ if (i != RKISP_STREAM_MP && i != RKISP_STREAM_SP &&
2779
+ i != RKISP_STREAM_FBC && i != RKISP_STREAM_BP)
2780
+ continue;
2781
+ stream = &dev->cap_dev.stream[i];
2782
+ dcrop = &stream->dcrop;
2783
+ v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
2784
+ "%s id:%d %dx%d(%d %d) from %dx%d(%d %d)\n",
2785
+ __func__, i,
2786
+ dcrop->width, dcrop->height, dcrop->left, dcrop->top,
2787
+ crop->width, crop->height, crop->left, crop->top);
2788
+ /* make sure dcrop window in isp output window */
2789
+ if (dcrop->width > crop->width) {
2790
+ dcrop->width = crop->width;
2791
+ dcrop->left = 0;
2792
+ } else if ((dcrop->left + dcrop->width) > crop->width) {
2793
+ dcrop->left = crop->width - dcrop->width;
2794
+ }
2795
+ if (dcrop->height > crop->height) {
2796
+ dcrop->height = crop->height;
2797
+ dcrop->top = 0;
2798
+ } else if ((dcrop->top + dcrop->height) > crop->height) {
2799
+ dcrop->top = crop->height - dcrop->height;
2800
+ }
2801
+ }
21492802 }
21502803
21512804 static int rkisp_isp_sd_set_selection(struct v4l2_subdev *sd,
....@@ -2179,18 +2832,20 @@
21792832
21802833 if (sel->pad == RKISP_ISP_PAD_SINK) {
21812834 isp_sd->in_crop = *crop;
2182
- /* ISP20 don't have out crop */
2183
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
2835
+ /* don't have out crop */
2836
+ if (dev->isp_ver >= ISP_V20) {
21842837 isp_sd->out_crop = *crop;
21852838 isp_sd->out_crop.left = 0;
21862839 isp_sd->out_crop.top = 0;
21872840 dev->br_dev.crop = isp_sd->out_crop;
21882841 }
21892842 } else {
2190
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
2843
+ if (dev->isp_ver >= ISP_V20)
21912844 *crop = isp_sd->out_crop;
21922845 isp_sd->out_crop = *crop;
21932846 }
2847
+
2848
+ rkisp_check_stream_dcrop(dev, crop);
21942849
21952850 return 0;
21962851 err:
....@@ -2246,53 +2901,296 @@
22462901 struct rkisp_stream *stream;
22472902 int i;
22482903
2904
+ rkisp_stats_first_ddr_config(&dev->stats_vdev);
22492905 if (dev->hw_dev->is_mi_update)
22502906 return;
22512907
2252
- rkisp_stats_first_ddr_config(&dev->stats_vdev);
22532908 rkisp_config_dmatx_valid_buf(dev);
22542909
22552910 force_cfg_update(dev);
22562911
22572912 hdr_update_dmatx_buf(dev);
2258
- if (dev->br_dev.en && dev->isp_ver == ISP_V20) {
2259
- stream = &dev->cap_dev.stream[RKISP_STREAM_SP];
2260
- rkisp_update_spstream_buf(stream);
2261
- }
22622913 if (dev->hw_dev->is_single) {
22632914 for (i = 0; i < RKISP_MAX_STREAM; i++) {
22642915 stream = &dev->cap_dev.stream[i];
2265
- if (stream->streaming && !stream->next_buf)
2266
- stream->ops->frame_end(stream);
2916
+ if (stream->id == RKISP_STREAM_VIR ||
2917
+ stream->id == RKISP_STREAM_LUMA)
2918
+ continue;
2919
+ if (stream->streaming && !stream->curr_buf)
2920
+ stream->ops->frame_end(stream, FRAME_INIT);
22672921 }
22682922 }
2923
+ rkisp_stats_next_ddr_config(&dev->stats_vdev);
22692924 }
22702925
22712926 static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
22722927 {
22732928 struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
2929
+ struct rkisp_hw_dev *hw_dev = isp_dev->hw_dev;
22742930
22752931 if (!on) {
2932
+ if (IS_HDR_RDBK(isp_dev->rd_mode)) {
2933
+ struct rkisp_stream *s;
2934
+ int i;
2935
+
2936
+ for (i = RKISP_STREAM_RAWRD0; i <= RKISP_STREAM_RAWRD2; i++) {
2937
+ s = &isp_dev->dmarx_dev.stream[i];
2938
+ if (s->stopping)
2939
+ wake_up(&s->done);
2940
+ }
2941
+ }
22762942 wait_event_timeout(isp_dev->sync_onoff,
2277
- isp_dev->irq_ends_mask == (ISP_FRAME_END | ISP_FRAME_IN) &&
2278
- (!IS_HDR_RDBK(isp_dev->rd_mode) ||
2279
- isp_dev->isp_state & ISP_STOP), msecs_to_jiffies(5));
2943
+ isp_dev->isp_state & ISP_STOP ||
2944
+ !IS_HDR_RDBK(isp_dev->rd_mode),
2945
+ msecs_to_jiffies(50));
22802946 rkisp_isp_stop(isp_dev);
2281
- atomic_dec(&isp_dev->hw_dev->refcnt);
2947
+ atomic_dec(&hw_dev->refcnt);
22822948 rkisp_params_stream_stop(&isp_dev->params_vdev);
2949
+ atomic_set(&isp_dev->isp_sdev.frm_sync_seq, 0);
22832950 rkisp_stop_3a_run(isp_dev);
22842951 return 0;
22852952 }
22862953
2954
+ hw_dev->is_runing = true;
22872955 rkisp_start_3a_run(isp_dev);
22882956 memset(&isp_dev->isp_sdev.dbg, 0, sizeof(isp_dev->isp_sdev.dbg));
2289
- atomic_inc(&isp_dev->hw_dev->refcnt);
2290
- atomic_set(&isp_dev->isp_sdev.frm_sync_seq, 0);
2291
- rkisp_global_update_mi(isp_dev);
2957
+ if (atomic_inc_return(&hw_dev->refcnt) > hw_dev->dev_link_num) {
2958
+ dev_err(isp_dev->dev, "%s fail: input link before hw start\n", __func__);
2959
+ atomic_dec(&hw_dev->refcnt);
2960
+ return -EINVAL;
2961
+ }
2962
+
22922963 rkisp_config_cif(isp_dev);
22932964 rkisp_isp_start(isp_dev);
2965
+ rkisp_global_update_mi(isp_dev);
2966
+ isp_dev->isp_state = ISP_START | ISP_FRAME_END;
22942967 rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, NULL);
22952968 return 0;
2969
+}
2970
+
2971
+static void rkisp_rx_buf_free(struct rkisp_device *dev, struct rkisp_rx_buf *dbufs)
2972
+{
2973
+ const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
2974
+ struct rkisp_rx_buf_pool *pool;
2975
+ int i = 0;
2976
+
2977
+ if (!dbufs)
2978
+ return;
2979
+
2980
+ for (i = 0; i < RKISP_RX_BUF_POOL_MAX; i++) {
2981
+ pool = &dev->pv_pool[i];
2982
+ if (dbufs == pool->dbufs) {
2983
+ if (pool->mem_priv) {
2984
+ g_ops->unmap_dmabuf(pool->mem_priv);
2985
+ g_ops->detach_dmabuf(pool->mem_priv);
2986
+ dma_buf_put(pool->dbufs->dbuf);
2987
+ pool->mem_priv = NULL;
2988
+ }
2989
+ pool->dbufs = NULL;
2990
+ break;
2991
+ }
2992
+ }
2993
+}
2994
+
2995
+static void rkisp_rx_qbuf_online(struct rkisp_stream *stream,
2996
+ struct rkisp_rx_buf_pool *pool)
2997
+{
2998
+ struct rkisp_device *dev = stream->ispdev;
2999
+ u32 val = pool->buf.buff_addr[RKISP_PLANE_Y];
3000
+
3001
+ rkisp_write(dev, stream->config->mi.y_base_ad_init, val, false);
3002
+ if (dev->hw_dev->unite == ISP_UNITE_TWO) {
3003
+ u32 offs = stream->out_fmt.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL;
3004
+
3005
+ if (stream->memory)
3006
+ offs *= DIV_ROUND_UP(stream->out_isp_fmt.bpp[0], 8);
3007
+ else
3008
+ offs = offs * stream->out_isp_fmt.bpp[0] / 8;
3009
+ val += offs;
3010
+ rkisp_next_write(dev, stream->config->mi.y_base_ad_init, val, false);
3011
+ }
3012
+}
3013
+
3014
+static void rkisp_rx_qbuf_rdbk(struct rkisp_stream *stream,
3015
+ struct rkisp_rx_buf_pool *pool)
3016
+{
3017
+ struct rkisp_device *dev = stream->ispdev;
3018
+ unsigned long lock_flags = 0;
3019
+ struct rkisp_buffer *ispbuf = &pool->buf;
3020
+ struct isp2x_csi_trigger trigger = {
3021
+ .frame_timestamp = ispbuf->vb.vb2_buf.timestamp,
3022
+ .sof_timestamp = ispbuf->vb.vb2_buf.timestamp,
3023
+ .frame_id = ispbuf->vb.sequence,
3024
+ .mode = 0,
3025
+ .times = 0,
3026
+ };
3027
+ spin_lock_irqsave(&stream->vbq_lock, lock_flags);
3028
+ if (list_empty(&stream->buf_queue) && !stream->curr_buf) {
3029
+ stream->curr_buf = ispbuf;
3030
+ stream->ops->update_mi(stream);
3031
+ } else {
3032
+ list_add_tail(&ispbuf->queue, &stream->buf_queue);
3033
+ }
3034
+ spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
3035
+ if (stream->id == RKISP_STREAM_RAWRD2)
3036
+ rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, &trigger);
3037
+}
3038
+
3039
+static int rkisp_rx_qbuf(struct rkisp_device *dev,
3040
+ struct rkisp_rx_buf *dbufs)
3041
+{
3042
+ struct rkisp_stream *stream;
3043
+ struct rkisp_rx_buf_pool *pool;
3044
+ int i;
3045
+
3046
+ for (i = 0; i < RKISP_RX_BUF_POOL_MAX; i++) {
3047
+ pool = &dev->pv_pool[i];
3048
+ if (dbufs == pool->dbufs)
3049
+ break;
3050
+ }
3051
+
3052
+ if (pool->dbufs == NULL || pool->dbufs != dbufs)
3053
+ return -EINVAL;
3054
+ switch (dbufs->type) {
3055
+ case BUF_SHORT:
3056
+ stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2];
3057
+ break;
3058
+ case BUF_MIDDLE:
3059
+ stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD0];
3060
+ break;
3061
+ case BUF_LONG:
3062
+ default:
3063
+ stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD1];
3064
+ }
3065
+
3066
+ v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
3067
+ "%s rd_mode:%d seq:%d dma:0x%x\n",
3068
+ __func__, dev->rd_mode, dbufs->sequence,
3069
+ pool->buf.buff_addr[RKISP_PLANE_Y]);
3070
+
3071
+ if (!IS_HDR_RDBK(dev->rd_mode)) {
3072
+ rkisp_rx_qbuf_online(stream, pool);
3073
+ } else {
3074
+ pool->buf.vb.vb2_buf.timestamp = dbufs->timestamp;
3075
+ pool->buf.vb.sequence = dbufs->sequence;
3076
+ rkisp_rx_qbuf_rdbk(stream, pool);
3077
+ }
3078
+ return 0;
3079
+}
3080
+
3081
+void rkisp_rx_buf_pool_free(struct rkisp_device *dev)
3082
+{
3083
+ const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
3084
+ struct rkisp_rx_buf_pool *pool;
3085
+ int i;
3086
+
3087
+ for (i = 0; i < RKISP_RX_BUF_POOL_MAX; i++) {
3088
+ pool = &dev->pv_pool[i];
3089
+ if (!pool->dbufs)
3090
+ break;
3091
+ if (pool->mem_priv) {
3092
+ g_ops->unmap_dmabuf(pool->mem_priv);
3093
+ g_ops->detach_dmabuf(pool->mem_priv);
3094
+ dma_buf_put(pool->dbufs->dbuf);
3095
+ pool->mem_priv = NULL;
3096
+ }
3097
+ pool->dbufs = NULL;
3098
+ }
3099
+}
3100
+
3101
+static int rkisp_rx_buf_pool_init(struct rkisp_device *dev,
3102
+ struct rkisp_rx_buf *dbufs)
3103
+{
3104
+ const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
3105
+ struct rkisp_stream *stream;
3106
+ struct rkisp_rx_buf_pool *pool;
3107
+ struct sg_table *sg_tbl;
3108
+ dma_addr_t dma;
3109
+ int i, ret;
3110
+ void *mem, *vaddr = NULL;
3111
+
3112
+ for (i = 0; i < RKISP_RX_BUF_POOL_MAX; i++) {
3113
+ pool = &dev->pv_pool[i];
3114
+ if (!pool->dbufs)
3115
+ break;
3116
+ }
3117
+
3118
+ pool->dbufs = dbufs;
3119
+ v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
3120
+ "%s type:0x%x dbufs[%d]:%p", __func__, dbufs->type, i, dbufs);
3121
+
3122
+ if (dbufs->is_resmem) {
3123
+ dma = dbufs->dma;
3124
+ goto end;
3125
+ }
3126
+ mem = g_ops->attach_dmabuf(dev->hw_dev->dev, dbufs->dbuf,
3127
+ dbufs->dbuf->size, DMA_BIDIRECTIONAL);
3128
+ if (IS_ERR(mem)) {
3129
+ ret = PTR_ERR(mem);
3130
+ goto err;
3131
+ }
3132
+ pool->mem_priv = mem;
3133
+ ret = g_ops->map_dmabuf(mem);
3134
+ if (ret)
3135
+ goto err;
3136
+ if (dev->hw_dev->is_dma_sg_ops) {
3137
+ sg_tbl = (struct sg_table *)g_ops->cookie(mem);
3138
+ dma = sg_dma_address(sg_tbl->sgl);
3139
+ } else {
3140
+ dma = *((dma_addr_t *)g_ops->cookie(mem));
3141
+ }
3142
+ get_dma_buf(dbufs->dbuf);
3143
+ vaddr = g_ops->vaddr(mem);
3144
+end:
3145
+ dbufs->is_init = true;
3146
+ pool->buf.other = dbufs;
3147
+ pool->buf.buff_addr[RKISP_PLANE_Y] = dma;
3148
+ pool->buf.vaddr[RKISP_PLANE_Y] = vaddr;
3149
+
3150
+ switch (dbufs->type) {
3151
+ case BUF_SHORT:
3152
+ stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2];
3153
+ break;
3154
+ case BUF_MIDDLE:
3155
+ stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD0];
3156
+ break;
3157
+ case BUF_LONG:
3158
+ default:
3159
+ stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD1];
3160
+ }
3161
+ if (dbufs->is_first) {
3162
+ stream->memory = 0;
3163
+ if (dbufs->is_uncompact)
3164
+ stream->memory = SW_CSI_RAW_WR_SIMG_MODE;
3165
+ rkisp_dmarx_set_fmt(stream, stream->out_fmt);
3166
+ stream->ops->config_mi(stream);
3167
+ dbufs->is_first = false;
3168
+ }
3169
+ v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
3170
+ "%s dma:0x%x vaddr:%p", __func__, (u32)dma, vaddr);
3171
+ return 0;
3172
+err:
3173
+ rkisp_rx_buf_pool_free(dev);
3174
+ return ret;
3175
+}
3176
+
3177
+static int rkisp_sd_s_rx_buffer(struct v4l2_subdev *sd,
3178
+ void *buf, unsigned int *size)
3179
+{
3180
+ struct rkisp_device *dev = sd_to_isp_dev(sd);
3181
+ struct rkisp_rx_buf *dbufs;
3182
+ int ret = 0;
3183
+
3184
+ if (!buf)
3185
+ return -EINVAL;
3186
+
3187
+ dbufs = buf;
3188
+ if (!dbufs->is_init)
3189
+ ret = rkisp_rx_buf_pool_init(dev, dbufs);
3190
+ if (!ret)
3191
+ ret = rkisp_rx_qbuf(dev, dbufs);
3192
+
3193
+ return ret;
22963194 }
22973195
22983196 static int rkisp_isp_sd_s_power(struct v4l2_subdev *sd, int on)
....@@ -2300,14 +3198,11 @@
23003198 struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
23013199 int ret;
23023200
2303
- if (isp_dev->hw_dev->is_thunderboot)
2304
- return 0;
2305
-
23063201 v4l2_dbg(1, rkisp_debug, &isp_dev->v4l2_dev,
23073202 "%s on:%d\n", __func__, on);
23083203
23093204 if (on) {
2310
- if (isp_dev->isp_ver == ISP_V20 || isp_dev->isp_ver == ISP_V21)
3205
+ if (isp_dev->isp_ver >= ISP_V20)
23113206 kfifo_reset(&isp_dev->rdbk_kfifo);
23123207 ret = pm_runtime_get_sync(isp_dev->dev);
23133208 } else {
....@@ -2337,6 +3232,15 @@
23373232 dev = sd_to_isp_dev(sd);
23383233 if (!dev)
23393234 return -ENODEV;
3235
+
3236
+ if (dev->hw_dev->is_runing &&
3237
+ (!dev->isp_inp ||
3238
+ !(dev->isp_inp & ~rawrd) ||
3239
+ !strcmp(remote->entity->name, CSI_DEV_NAME) ||
3240
+ strstr(remote->entity->name, "rkcif"))) {
3241
+ v4l2_err(sd, "no support link for isp hw working\n");
3242
+ return -EINVAL;
3243
+ }
23403244
23413245 if (!strcmp(remote->entity->name, DMA_VDEV_NAME)) {
23423246 stream = &dev->dmarx_dev.stream[RKISP_STREAM_DMARX];
....@@ -2386,6 +3290,18 @@
23863290 } else {
23873291 dev->isp_inp &= ~INP_RAWRD2;
23883292 }
3293
+ } else if (!strcmp(remote->entity->name, FBC_VDEV_NAME)) {
3294
+ stream = &dev->cap_dev.stream[RKISP_STREAM_FBC];
3295
+ } else if (!strcmp(remote->entity->name, BP_VDEV_NAME)) {
3296
+ stream = &dev->cap_dev.stream[RKISP_STREAM_BP];
3297
+ } else if (!strcmp(remote->entity->name, MPDS_VDEV_NAME)) {
3298
+ stream = &dev->cap_dev.stream[RKISP_STREAM_MPDS];
3299
+ } else if (!strcmp(remote->entity->name, BPDS_VDEV_NAME)) {
3300
+ stream = &dev->cap_dev.stream[RKISP_STREAM_BPDS];
3301
+ } else if (!strcmp(remote->entity->name, LUMA_VDEV_NAME)) {
3302
+ stream = &dev->cap_dev.stream[RKISP_STREAM_LUMA];
3303
+ } else if (!strcmp(remote->entity->name, VIR_VDEV_NAME)) {
3304
+ stream = &dev->cap_dev.stream[RKISP_STREAM_VIR];
23893305 } else if (!strcmp(remote->entity->name, SP_VDEV_NAME)) {
23903306 stream = &dev->cap_dev.stream[RKISP_STREAM_SP];
23913307 } else if (!strcmp(remote->entity->name, MP_VDEV_NAME)) {
....@@ -2430,11 +3346,31 @@
24303346
24313347 if (stream)
24323348 stream->linked = flags & MEDIA_LNK_FL_ENABLED;
2433
- if (dev->isp_inp & rawrd)
3349
+ if (dev->isp_inp & rawrd) {
24343350 dev->dmarx_dev.trigger = T_MANUAL;
2435
- else
3351
+ dev->is_rdbk_auto = false;
3352
+ } else {
24363353 dev->dmarx_dev.trigger = T_AUTO;
3354
+ }
3355
+ if (dev->isp_inp & INP_CIF) {
3356
+ struct v4l2_subdev *remote = get_remote_sensor(sd);
3357
+ struct rkisp_vicap_mode mode;
24373358
3359
+ memset(&mode, 0, sizeof(mode));
3360
+ mode.name = dev->name;
3361
+ mode.rdbk_mode = !!(dev->isp_inp & rawrd);
3362
+ /* read back mode only */
3363
+ if (dev->isp_ver < ISP_V30 || !dev->hw_dev->is_single)
3364
+ mode.rdbk_mode = RKISP_VICAP_RDBK_AIQ;
3365
+ v4l2_subdev_call(remote, core, ioctl,
3366
+ RKISP_VICAP_CMD_MODE, &mode);
3367
+ dev->vicap_in = mode.input;
3368
+ }
3369
+
3370
+ if (!dev->isp_inp)
3371
+ dev->is_hw_link = false;
3372
+ else
3373
+ dev->is_hw_link = true;
24383374 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
24393375 "isp input:0x%x\n", dev->isp_inp);
24403376 return 0;
....@@ -2482,7 +3418,6 @@
24823418 atomic_inc_return(&isp->frm_sync_seq) - 1,
24833419 };
24843420
2485
- event.timestamp = ns_to_timespec(ktime_get_ns());
24863421 v4l2_event_queue(isp->sd.devnode, &event);
24873422 }
24883423
....@@ -2499,24 +3434,95 @@
24993434 return v4l2_event_subscribe(fh, sub, ISP_V4L2_EVENT_ELEMS, NULL);
25003435 }
25013436
3437
+static int rkisp_get_info(struct rkisp_device *dev, struct rkisp_isp_info *info)
3438
+{
3439
+ struct v4l2_rect *in_crop = &dev->isp_sdev.in_crop;
3440
+ u32 rd_mode, mode = 0, bit = 0;
3441
+ int ret;
3442
+
3443
+ if (!(dev->isp_state & ISP_START)) {
3444
+ struct rkmodule_hdr_cfg cfg;
3445
+
3446
+ ret = rkisp_csi_get_hdr_cfg(dev, &cfg);
3447
+ if (ret)
3448
+ return ret;
3449
+ rd_mode = cfg.hdr_mode;
3450
+ if (rd_mode == HDR_COMPR)
3451
+ bit = cfg.compr.bit > 20 ? 20 : cfg.compr.bit;
3452
+ } else {
3453
+ rd_mode = dev->rd_mode;
3454
+ bit = dev->hdr.compr_bit;
3455
+ }
3456
+
3457
+ switch (rd_mode) {
3458
+ case HDR_RDBK_FRAME2:
3459
+ case HDR_FRAMEX2_DDR:
3460
+ case HDR_LINEX2_DDR:
3461
+ mode = RKISP_ISP_HDR2;
3462
+ break;
3463
+ case HDR_RDBK_FRAME3:
3464
+ case HDR_FRAMEX3_DDR:
3465
+ case HDR_LINEX3_DDR:
3466
+ mode = RKISP_ISP_HDR3;
3467
+ break;
3468
+ default:
3469
+ mode = RKISP_ISP_NORMAL;
3470
+ }
3471
+ if (bit)
3472
+ mode = RKISP_ISP_COMPR;
3473
+ info->compr_bit = bit;
3474
+
3475
+ if (dev->is_bigmode)
3476
+ mode |= RKISP_ISP_BIGMODE;
3477
+ info->mode = mode;
3478
+ if (dev->hw_dev->unite)
3479
+ info->act_width = in_crop->width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
3480
+ else
3481
+ info->act_width = in_crop->width;
3482
+ info->act_height = in_crop->height;
3483
+ return 0;
3484
+}
3485
+
25023486 static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
25033487 {
25043488 struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
25053489 struct rkisp_thunderboot_resmem *resmem;
3490
+ struct rkisp32_thunderboot_resmem_head *tb_head_v32;
25063491 struct rkisp_thunderboot_resmem_head *head;
25073492 struct rkisp_thunderboot_shmem *shmem;
25083493 struct isp2x_buf_idxfd *idxfd;
3494
+ struct rkisp_rx_buf *dbufs;
25093495 void *resmem_va;
25103496 long ret = 0;
25113497
2512
- if (!arg && cmd != RKISP_CMD_FREE_SHARED_BUF)
3498
+ if (!arg &&
3499
+ (cmd != RKISP_CMD_FREE_SHARED_BUF &&
3500
+ cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM))
25133501 return -EINVAL;
25143502
25153503 switch (cmd) {
25163504 case RKISP_CMD_TRIGGER_READ_BACK:
25173505 rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, arg);
25183506 break;
3507
+ case RKISP_CMD_GET_ISP_INFO:
3508
+ rkisp_get_info(isp_dev, arg);
3509
+ break;
3510
+ case RKISP_CMD_GET_TB_HEAD_V32:
3511
+ if (isp_dev->tb_head.complete != RKISP_TB_OK || !isp_dev->is_pre_on) {
3512
+ ret = -EINVAL;
3513
+ break;
3514
+ }
3515
+ tb_head_v32 = arg;
3516
+ memcpy(tb_head_v32, &isp_dev->tb_head,
3517
+ sizeof(struct rkisp_thunderboot_resmem_head));
3518
+ memcpy(&tb_head_v32->cfg, isp_dev->params_vdev.isp32_params,
3519
+ sizeof(struct isp32_isp_params_cfg));
3520
+ break;
25193521 case RKISP_CMD_GET_SHARED_BUF:
3522
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3523
+ ret = -ENOIOCTLCMD;
3524
+ break;
3525
+ }
25203526 resmem = (struct rkisp_thunderboot_resmem *)arg;
25213527 resmem->resmem_padr = isp_dev->resmem_pa;
25223528 resmem->resmem_size = isp_dev->resmem_size;
....@@ -2546,6 +3552,10 @@
25463552 }
25473553 break;
25483554 case RKISP_CMD_FREE_SHARED_BUF:
3555
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3556
+ ret = -ENOIOCTLCMD;
3557
+ break;
3558
+ }
25493559 if (isp_dev->resmem_pa && isp_dev->resmem_size) {
25503560 dma_unmap_single(isp_dev->dev, isp_dev->resmem_pa,
25513561 sizeof(struct rkisp_thunderboot_resmem_head),
....@@ -2564,15 +3574,38 @@
25643574 break;
25653575 case RKISP_CMD_SET_LDCHBUF_SIZE:
25663576 case RKISP_CMD_SET_MESHBUF_SIZE:
2567
- rkisp_params_set_meshbuf_size(&isp_dev->params_vdev, arg);
3577
+ ret = rkisp_params_set_meshbuf_size(&isp_dev->params_vdev, arg);
25683578 break;
25693579 case RKISP_CMD_GET_SHM_BUFFD:
3580
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3581
+ ret = -ENOIOCTLCMD;
3582
+ break;
3583
+ }
25703584 shmem = (struct rkisp_thunderboot_shmem *)arg;
25713585 ret = rkisp_tb_shm_ioctl(shmem);
25723586 break;
25733587 case RKISP_CMD_GET_FBCBUF_FD:
25743588 idxfd = (struct isp2x_buf_idxfd *)arg;
25753589 ret = rkisp_bridge_get_fbcbuf_fd(isp_dev, idxfd);
3590
+ break;
3591
+ case RKISP_CMD_INFO2DDR:
3592
+ ret = rkisp_params_info2ddr_cfg(&isp_dev->params_vdev, arg);
3593
+ break;
3594
+ case RKISP_CMD_MESHBUF_FREE:
3595
+ rkisp_params_meshbuf_free(&isp_dev->params_vdev, *(u64 *)arg);
3596
+ break;
3597
+ case RKISP_VICAP_CMD_RX_BUFFER_FREE:
3598
+ dbufs = (struct rkisp_rx_buf *)arg;
3599
+ rkisp_rx_buf_free(isp_dev, dbufs);
3600
+ break;
3601
+ case RKISP_CMD_MULTI_DEV_FORCE_ENUM:
3602
+ if (isp_dev->hw_dev->is_runing) {
3603
+ ret = -EINVAL;
3604
+ } else {
3605
+ isp_dev->hw_dev->is_single = true;
3606
+ isp_dev->hw_dev->is_multi_overflow = false;
3607
+ rkisp_hw_enum_isp_size(isp_dev->hw_dev);
3608
+ }
25763609 break;
25773610 default:
25783611 ret = -ENOIOCTLCMD;
....@@ -2594,7 +3627,9 @@
25943627 struct rkisp_meshbuf_size meshsize;
25953628 struct rkisp_thunderboot_shmem shmem;
25963629 struct isp2x_buf_idxfd idxfd;
3630
+ struct rkisp_info2ddr info2ddr;
25973631 long ret = 0;
3632
+ u64 module_id;
25983633
25993634 if (!up && cmd != RKISP_CMD_FREE_SHARED_BUF)
26003635 return -EINVAL;
....@@ -2606,11 +3641,19 @@
26063641 ret = rkisp_ioctl(sd, cmd, &trigger);
26073642 break;
26083643 case RKISP_CMD_GET_SHARED_BUF:
3644
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3645
+ ret = -ENOIOCTLCMD;
3646
+ break;
3647
+ }
26093648 ret = rkisp_ioctl(sd, cmd, &resmem);
26103649 if (!ret && copy_to_user(up, &resmem, sizeof(resmem)))
26113650 ret = -EFAULT;
26123651 break;
26133652 case RKISP_CMD_FREE_SHARED_BUF:
3653
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3654
+ ret = -ENOIOCTLCMD;
3655
+ break;
3656
+ }
26143657 ret = rkisp_ioctl(sd, cmd, NULL);
26153658 break;
26163659 case RKISP_CMD_GET_LDCHBUF_INFO:
....@@ -2624,7 +3667,7 @@
26243667 ret = rkisp_ioctl(sd, cmd, &ldchsize);
26253668 break;
26263669 case RKISP_CMD_GET_MESHBUF_INFO:
2627
- if (copy_from_user(&meshsize, up, sizeof(meshsize)))
3670
+ if (copy_from_user(&meshbuf, up, sizeof(meshbuf)))
26283671 return -EFAULT;
26293672 ret = rkisp_ioctl(sd, cmd, &meshbuf);
26303673 if (!ret && copy_to_user(up, &meshbuf, sizeof(meshbuf)))
....@@ -2636,6 +3679,10 @@
26363679 ret = rkisp_ioctl(sd, cmd, &meshsize);
26373680 break;
26383681 case RKISP_CMD_GET_SHM_BUFFD:
3682
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3683
+ ret = -ENOIOCTLCMD;
3684
+ break;
3685
+ }
26393686 if (copy_from_user(&shmem, up, sizeof(shmem)))
26403687 return -EFAULT;
26413688 ret = rkisp_ioctl(sd, cmd, &shmem);
....@@ -2646,6 +3693,21 @@
26463693 ret = rkisp_ioctl(sd, cmd, &idxfd);
26473694 if (!ret && copy_to_user(up, &idxfd, sizeof(idxfd)))
26483695 ret = -EFAULT;
3696
+ break;
3697
+ case RKISP_CMD_INFO2DDR:
3698
+ if (copy_from_user(&info2ddr, up, sizeof(info2ddr)))
3699
+ return -EFAULT;
3700
+ ret = rkisp_ioctl(sd, cmd, &info2ddr);
3701
+ if (!ret && copy_to_user(up, &info2ddr, sizeof(info2ddr)))
3702
+ ret = -EFAULT;
3703
+ break;
3704
+ case RKISP_CMD_MESHBUF_FREE:
3705
+ if (copy_from_user(&module_id, up, sizeof(module_id)))
3706
+ return -EFAULT;
3707
+ ret = rkisp_ioctl(sd, cmd, &module_id);
3708
+ break;
3709
+ case RKISP_CMD_MULTI_DEV_FORCE_ENUM:
3710
+ ret = rkisp_ioctl(sd, cmd, NULL);
26493711 break;
26503712 default:
26513713 ret = -ENOIOCTLCMD;
....@@ -2673,6 +3735,7 @@
26733735
26743736 static const struct v4l2_subdev_video_ops rkisp_isp_sd_video_ops = {
26753737 .s_stream = rkisp_isp_sd_s_stream,
3738
+ .s_rx_buffer = rkisp_sd_s_rx_buffer,
26763739 };
26773740
26783741 static const struct v4l2_subdev_core_ops rkisp_isp_core_ops = {
....@@ -2699,7 +3762,7 @@
26993762 struct ispsd_in_fmt *in_fmt = &isp_sd->in_fmt;
27003763 struct ispsd_out_fmt *out_fmt = &isp_sd->out_fmt;
27013764
2702
- *in_fmt = rkisp_isp_input_formats[0];
3765
+ *in_fmt = rkisp_isp_input_formats[8];
27033766 in_frm->width = RKISP_DEFAULT_WIDTH;
27043767 in_frm->height = RKISP_DEFAULT_HEIGHT;
27053768 in_frm->code = in_fmt->mbus_code;
....@@ -2723,6 +3786,8 @@
27233786 struct v4l2_subdev *sd = &isp_sdev->sd;
27243787 int ret;
27253788
3789
+ mutex_init(&isp_dev->buf_lock);
3790
+ spin_lock_init(&isp_dev->cmsk_lock);
27263791 spin_lock_init(&isp_dev->rdbk_lock);
27273792 ret = kfifo_alloc(&isp_dev->rdbk_kfifo,
27283793 16 * sizeof(struct isp2x_csi_trigger), GFP_KERNEL);
....@@ -2760,8 +3825,9 @@
27603825 rkisp_isp_sd_init_default_fmt(isp_sdev);
27613826 isp_dev->hdr.sensor = NULL;
27623827 isp_dev->isp_state = ISP_STOP;
2763
-
3828
+ atomic_set(&isp_sdev->frm_sync_seq, 0);
27643829 rkisp_monitor_init(isp_dev);
3830
+ INIT_WORK(&isp_dev->rdbk_work, rkisp_rdbk_work);
27653831 return 0;
27663832 err_cleanup_media_entity:
27673833 media_entity_cleanup(&sd->entity);
....@@ -2802,55 +3868,119 @@
28023868 })
28033869
28043870 #ifdef CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP
3871
+static void rkisp_save_tb_info(struct rkisp_device *isp_dev)
3872
+{
3873
+ struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev;
3874
+ void *resmem_va = phys_to_virt(isp_dev->resmem_pa);
3875
+ struct rkisp_thunderboot_resmem_head *head = resmem_va;
3876
+ int size = 0, offset = 0;
3877
+ void *param = NULL;
3878
+
3879
+ switch (isp_dev->isp_ver) {
3880
+ case ISP_V32:
3881
+ size = sizeof(struct rkisp32_thunderboot_resmem_head);
3882
+ offset = size * isp_dev->dev_id;
3883
+ break;
3884
+ default:
3885
+ break;
3886
+ }
3887
+
3888
+ if (size && size < isp_dev->resmem_size) {
3889
+ dma_sync_single_for_cpu(isp_dev->dev, isp_dev->resmem_addr + offset,
3890
+ size, DMA_FROM_DEVICE);
3891
+ params_vdev->is_first_cfg = true;
3892
+ if (isp_dev->isp_ver == ISP_V32) {
3893
+ struct rkisp32_thunderboot_resmem_head *tmp = resmem_va + offset;
3894
+
3895
+ param = &tmp->cfg;
3896
+ head = &tmp->head;
3897
+ v4l2_info(&isp_dev->v4l2_dev,
3898
+ "tb param module en:0x%llx upd:0x%llx cfg upd:0x%llx\n",
3899
+ tmp->cfg.module_en_update,
3900
+ tmp->cfg.module_ens,
3901
+ tmp->cfg.module_cfg_update);
3902
+ }
3903
+ if (param)
3904
+ params_vdev->ops->save_first_param(params_vdev, param);
3905
+ } else if (size > isp_dev->resmem_size) {
3906
+ v4l2_err(&isp_dev->v4l2_dev,
3907
+ "resmem size:%zu no enough for head:%d\n",
3908
+ isp_dev->resmem_size, size);
3909
+ head->complete = RKISP_TB_NG;
3910
+ }
3911
+ memcpy(&isp_dev->tb_head, head, sizeof(*head));
3912
+}
3913
+
28053914 void rkisp_chk_tb_over(struct rkisp_device *isp_dev)
28063915 {
3916
+ struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev;
3917
+ struct rkisp_hw_dev *hw = isp_dev->hw_dev;
28073918 struct rkisp_thunderboot_resmem_head *head;
28083919 enum rkisp_tb_state tb_state;
28093920 void *resmem_va;
28103921
2811
- if (!isp_dev->hw_dev->is_thunderboot)
3922
+ if (!isp_dev->is_thunderboot)
28123923 return;
28133924
2814
- if (!atomic_read(&isp_dev->hw_dev->tb_ref)) {
2815
- rkisp_tb_set_state(RKISP_TB_NG);
2816
- rkisp_tb_unprotect_clk();
2817
- rkisp_register_irq(isp_dev->hw_dev);
2818
- isp_dev->hw_dev->is_thunderboot = false;
2819
- return;
2820
- }
3925
+ if (isp_dev->isp_ver == ISP_V32 && params_vdev->is_first_cfg)
3926
+ goto end;
28213927
28223928 resmem_va = phys_to_virt(isp_dev->resmem_pa);
28233929 head = (struct rkisp_thunderboot_resmem_head *)resmem_va;
2824
- if (isp_dev->is_thunderboot) {
2825
- shm_head_poll_timeout(isp_dev, !!head->enable, 2000, 200 * USEC_PER_MSEC);
2826
- shm_head_poll_timeout(isp_dev, !!head->complete, 5000, 600 * USEC_PER_MSEC);
2827
- if (head->complete != RKISP_TB_OK)
2828
- v4l2_info(&isp_dev->v4l2_dev,
2829
- "wait thunderboot over timeout\n");
3930
+ dma_sync_single_for_cpu(isp_dev->dev, isp_dev->resmem_addr,
3931
+ sizeof(struct rkisp_thunderboot_resmem_head),
3932
+ DMA_FROM_DEVICE);
28303933
2831
- v4l2_info(&isp_dev->v4l2_dev,
2832
- "thunderboot info: %d, %d, %d, %d, %d, %d, 0x%x\n",
2833
- head->enable,
2834
- head->complete,
2835
- head->frm_total,
2836
- head->hdr_mode,
2837
- head->width,
2838
- head->height,
2839
- head->bus_fmt);
3934
+ shm_head_poll_timeout(isp_dev, !!head->complete, 5000, 400 * USEC_PER_MSEC);
3935
+ if (head->complete != RKISP_TB_OK) {
3936
+ v4l2_err(&isp_dev->v4l2_dev, "wait thunderboot over timeout\n");
3937
+ } else {
3938
+ int i, timeout = 50;
28403939
2841
- tb_state = RKISP_TB_OK;
2842
- if (head->complete != RKISP_TB_OK) {
2843
- head->frm_total = 0;
2844
- tb_state = RKISP_TB_NG;
3940
+ /* wait for all isp dev to register */
3941
+ if (head->camera_num > 1) {
3942
+ while (timeout--) {
3943
+ if (hw->dev_num >= head->camera_num &&
3944
+ hw->isp[hw->dev_num - 1]->is_probe_end)
3945
+ break;
3946
+ usleep_range(200, 210);
3947
+ }
3948
+ if (head->camera_num > hw->dev_num) {
3949
+ v4l2_err(&isp_dev->v4l2_dev,
3950
+ "thunderboot invalid camera num:%d, dev num:%d\n",
3951
+ head->camera_num, hw->dev_num);
3952
+ goto end;
3953
+ }
28453954 }
3955
+ for (i = 0; i < head->camera_num; i++)
3956
+ rkisp_save_tb_info(hw->isp[i]);
3957
+ }
3958
+end:
3959
+ head = &isp_dev->tb_head;
3960
+ v4l2_info(&isp_dev->v4l2_dev,
3961
+ "thunderboot info: %d, %d, %d, %d, %d, %d | %d %d\n",
3962
+ head->enable,
3963
+ head->complete,
3964
+ head->frm_total,
3965
+ head->hdr_mode,
3966
+ head->width,
3967
+ head->height,
3968
+ head->camera_num,
3969
+ head->camera_index);
3970
+
3971
+ tb_state = RKISP_TB_OK;
3972
+ if (head->complete != RKISP_TB_OK) {
3973
+ head->frm_total = 0;
3974
+ tb_state = RKISP_TB_NG;
3975
+ }
3976
+
3977
+ if (hw->is_thunderboot) {
3978
+ rkisp_register_irq(hw);
28463979 rkisp_tb_set_state(tb_state);
28473980 rkisp_tb_unprotect_clk();
2848
- rkisp_register_irq(isp_dev->hw_dev);
2849
- pm_runtime_put(isp_dev->hw_dev->dev);
2850
- isp_dev->hw_dev->is_thunderboot = false;
2851
- isp_dev->is_thunderboot = false;
2852
- atomic_dec(&isp_dev->hw_dev->tb_ref);
3981
+ hw->is_thunderboot = false;
28533982 }
3983
+ isp_dev->is_thunderboot = false;
28543984 }
28553985 #endif
28563986
....@@ -2958,7 +4088,9 @@
29584088 unsigned int isp3a_mis,
29594089 struct rkisp_device *dev)
29604090 {
2961
- void __iomem *base = dev->base_addr;
4091
+ struct rkisp_hw_dev *hw = dev->hw_dev;
4092
+ void __iomem *base = hw->unite != ISP_UNITE_TWO ?
4093
+ hw->base_addr : hw->base_next_addr;
29624094 unsigned int isp_mis_tmp = 0;
29634095 unsigned int isp_err = 0;
29644096 u32 si3a_isr_mask = ISP2X_SIAWB_DONE | ISP2X_SIAF_FIN |
....@@ -2968,7 +4100,7 @@
29684100 ISP2X_3A_RAWHIST_BIG | ISP2X_3A_RAWHIST_CH0 |
29694101 ISP2X_3A_RAWHIST_CH1 | ISP2X_3A_RAWHIST_CH2 |
29704102 ISP2X_3A_RAWAF_SUM | ISP2X_3A_RAWAF_LUM |
2971
- ISP2X_3A_RAWAF | ISP2X_3A_RAWAWB;
4103
+ ISP2X_3A_RAWAWB;
29724104 bool sof_event_later = false;
29734105
29744106 /*
....@@ -2978,40 +4110,51 @@
29784110 if (isp3a_mis & ISP2X_3A_RAWAE_BIG && dev->params_vdev.rdbk_times > 0)
29794111 writel(BIT(31), base + RAWAE_BIG1_BASE + RAWAE_BIG_CTRL);
29804112
4113
+ if (hw->unite == ISP_UNITE_TWO) {
4114
+ u32 val = rkisp_read(dev, ISP3X_ISP_RIS, true);
4115
+
4116
+ if (val) {
4117
+ rkisp_write(dev, ISP3X_ISP_ICR, val, true);
4118
+ v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
4119
+ "left isp isr:0x%x\n", val);
4120
+ if (isp_mis & CIF_ISP_FRAME && !(val & CIF_ISP_FRAME)) {
4121
+ /* wait isp0 frame end */
4122
+ int timeout = read_poll_timeout_atomic(rkisp_read,
4123
+ val, val & CIF_ISP_FRAME, 20, 20 * 50, true, dev, ISP3X_ISP_RIS, true);
4124
+
4125
+ if (val)
4126
+ rkisp_write(dev, ISP3X_ISP_ICR, val, true);
4127
+ if (timeout)
4128
+ dev_err(dev->dev, "wait isp end timeout\n");
4129
+ }
4130
+ }
4131
+ }
29814132 v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
29824133 "isp isr:0x%x, 0x%x\n", isp_mis, isp3a_mis);
29834134 dev->isp_isr_cnt++;
29844135 /* start edge of v_sync */
29854136 if (isp_mis & CIF_ISP_V_START) {
2986
- if (dev->isp_state & ISP_FRAME_END) {
2987
- u64 tmp = dev->isp_sdev.dbg.interval +
2988
- dev->isp_sdev.dbg.timestamp;
2989
-
2990
- dev->isp_sdev.dbg.timestamp = ktime_get_ns();
2991
- /* v-blank: frame_end - frame_start */
2992
- dev->isp_sdev.dbg.delay = dev->isp_sdev.dbg.timestamp - tmp;
2993
- }
2994
- rkisp_set_state(&dev->isp_state, ISP_FRAME_VS);
29954137 if (dev->hw_dev->monitor.is_en) {
29964138 rkisp_set_state(&dev->hw_dev->monitor.state, ISP_FRAME_VS);
29974139 if (!completion_done(&dev->hw_dev->monitor.cmpl))
29984140 complete(&dev->hw_dev->monitor.cmpl);
29994141 }
3000
- /* last vsync to config next buf */
3001
- if (!dev->filt_state[RDBK_F_VS])
3002
- rkisp_bridge_update_mi(dev, isp_mis);
3003
- else
3004
- dev->filt_state[RDBK_F_VS]--;
4142
+
30054143 if (IS_HDR_RDBK(dev->hdr.op_mode)) {
3006
- /* read 3d lut at isp readback */
3007
- if (!dev->hw_dev->is_single)
3008
- rkisp_write(dev, ISP_3DLUT_UPDATE, 0, true);
4144
+ /* disabled frame end to read 3dlut for multi sensor
4145
+ * 3dlut will update at isp readback
4146
+ */
4147
+ if (!dev->hw_dev->is_single) {
4148
+ writel(0, hw->base_addr + ISP_3DLUT_UPDATE);
4149
+ if (hw->unite == ISP_UNITE_TWO)
4150
+ writel(0, hw->base_next_addr + ISP_3DLUT_UPDATE);
4151
+ }
30094152 rkisp_stats_rdbk_enable(&dev->stats_vdev, true);
30104153 goto vs_skip;
30114154 }
30124155 if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced) {
30134156 /* 0 = ODD 1 = EVEN */
3014
- if (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2) {
4157
+ if (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
30154158 void __iomem *addr = NULL;
30164159
30174160 if (dev->isp_ver == ISP_V10 ||
....@@ -3035,6 +4178,7 @@
30354178 if (dev->vs_irq < 0 && !sof_event_later) {
30364179 dev->isp_sdev.frm_timestamp = ktime_get_ns();
30374180 rkisp_isp_queue_event_sof(&dev->isp_sdev);
4181
+ rkisp_stream_frame_start(dev, isp_mis);
30384182 }
30394183 vs_skip:
30404184 writel(CIF_ISP_V_START, base + CIF_ISP_ICR);
....@@ -3078,6 +4222,16 @@
30784222 }
30794223 }
30804224
4225
+ if (isp3a_mis & ISP2X_3A_RAWAF) {
4226
+ writel(ISP3X_3A_RAWAF, base + ISP3X_ISP_3A_ICR);
4227
+ /* 3a irq will with lsc_lut_err irq if isp version below isp32 */
4228
+ if (isp_mis & ISP2X_LSC_LUT_ERR)
4229
+ isp_mis &= ~ISP2X_LSC_LUT_ERR;
4230
+ if (dev->rawaf_irq_cnt == 0)
4231
+ rkisp_stream_buf_done_early(dev);
4232
+ dev->rawaf_irq_cnt++;
4233
+ }
4234
+
30814235 if (isp_mis & ISP2X_LSC_LUT_ERR) {
30824236 writel(ISP2X_LSC_LUT_ERR, base + CIF_ISP_ICR);
30834237
....@@ -3089,21 +4243,22 @@
30894243
30904244 /* sampled input frame is complete */
30914245 if (isp_mis & CIF_ISP_FRAME_IN) {
4246
+ dev->isp_sdev.dbg.interval =
4247
+ ktime_get_ns() - dev->isp_sdev.dbg.timestamp;
30924248 rkisp_set_state(&dev->isp_state, ISP_FRAME_IN);
30934249 writel(CIF_ISP_FRAME_IN, base + CIF_ISP_ICR);
30944250 isp_mis_tmp = readl(base + CIF_ISP_MIS);
30954251 if (isp_mis_tmp & CIF_ISP_FRAME_IN)
30964252 v4l2_err(&dev->v4l2_dev, "isp icr frame_in err: 0x%x\n",
30974253 isp_mis_tmp);
3098
-
3099
- dev->isp_err_cnt = 0;
3100
- dev->isp_state &= ~ISP_ERROR;
31014254 }
31024255
31034256 /* frame was completely put out */
31044257 if (isp_mis & CIF_ISP_FRAME) {
3105
- dev->isp_sdev.dbg.interval =
3106
- ktime_get_ns() - dev->isp_sdev.dbg.timestamp;
4258
+ dev->rawaf_irq_cnt = 0;
4259
+ if (!dev->is_pre_on || !IS_HDR_RDBK(dev->rd_mode))
4260
+ dev->isp_sdev.dbg.interval =
4261
+ ktime_get_ns() - dev->isp_sdev.dbg.timestamp;
31074262 /* Clear Frame In (ISP) */
31084263 rkisp_set_state(&dev->isp_state, ISP_FRAME_END);
31094264 writel(CIF_ISP_FRAME, base + CIF_ISP_ICR);
....@@ -3113,6 +4268,25 @@
31134268 "isp icr frame end err: 0x%x\n", isp_mis_tmp);
31144269 rkisp_dmarx_get_frame(dev, &dev->isp_sdev.dbg.id, NULL, NULL, true);
31154270 rkisp_isp_read_add_fifo_data(dev);
4271
+
4272
+ dev->isp_err_cnt = 0;
4273
+ dev->isp_state &= ~ISP_ERROR;
4274
+ }
4275
+
4276
+ if (isp_mis & CIF_ISP_V_START) {
4277
+ if (dev->isp_state & ISP_FRAME_END) {
4278
+ u64 tmp = dev->isp_sdev.dbg.interval +
4279
+ dev->isp_sdev.dbg.timestamp;
4280
+
4281
+ dev->isp_sdev.dbg.timestamp = ktime_get_ns();
4282
+ /* v-blank: frame(N)start - frame(N-1)end */
4283
+ dev->isp_sdev.dbg.delay = dev->isp_sdev.dbg.timestamp - tmp;
4284
+ }
4285
+ rkisp_set_state(&dev->isp_state, ISP_FRAME_VS);
4286
+ if (dev->procfs.is_fs_wait) {
4287
+ dev->procfs.is_fs_wait = false;
4288
+ wake_up(&dev->procfs.fs_wait);
4289
+ }
31164290 }
31174291
31184292 if ((isp_mis & (CIF_ISP_FRAME | si3a_isr_mask)) ||
....@@ -3129,6 +4303,21 @@
31294303
31304304 if ((isp_mis & CIF_ISP_FRAME) && dev->stats_vdev.rdbk_mode)
31314305 rkisp_stats_rdbk_enable(&dev->stats_vdev, false);
4306
+
4307
+ if (!IS_HDR_RDBK(dev->hdr.op_mode))
4308
+ rkisp_config_cmsk(dev);
4309
+ }
4310
+
4311
+ if (isp_mis & CIF_ISP_FRAME) {
4312
+ if (dev->hw_dev->isp_ver == ISP_V32) {
4313
+ struct rkisp_stream *s = &dev->cap_dev.stream[RKISP_STREAM_LUMA];
4314
+
4315
+ s->ops->frame_end(s, FRAME_IRQ);
4316
+ }
4317
+ if (dev->procfs.is_fe_wait) {
4318
+ dev->procfs.is_fe_wait = false;
4319
+ wake_up(&dev->procfs.fe_wait);
4320
+ }
31324321 }
31334322
31344323 /*
....@@ -3136,16 +4325,30 @@
31364325 * lot of register writes. Do those only one per frame.
31374326 * Do the updates in the order of the processing flow.
31384327 */
3139
- rkisp_params_isr(&dev->params_vdev, isp_mis);
4328
+ if (isp_mis & (CIF_ISP_V_START | CIF_ISP_FRAME))
4329
+ rkisp_params_isr(&dev->params_vdev, isp_mis);
31404330
31414331 /* cur frame end and next frame start irq togeter */
31424332 if (dev->vs_irq < 0 && sof_event_later) {
31434333 dev->isp_sdev.frm_timestamp = ktime_get_ns();
31444334 rkisp_isp_queue_event_sof(&dev->isp_sdev);
4335
+ rkisp_stream_frame_start(dev, isp_mis);
31454336 }
31464337
3147
- if (isp_mis & CIF_ISP_FRAME_IN)
3148
- rkisp_check_idle(dev, ISP_FRAME_IN);
4338
+ if (isp_mis & ISP3X_OUT_FRM_QUARTER) {
4339
+ writel(ISP3X_OUT_FRM_QUARTER, base + CIF_ISP_ICR);
4340
+ rkisp_dvbm_event(dev, ISP3X_OUT_FRM_QUARTER);
4341
+ }
4342
+ if (isp_mis & ISP3X_OUT_FRM_HALF) {
4343
+ writel(ISP3X_OUT_FRM_HALF, base + CIF_ISP_ICR);
4344
+ rkisp_dvbm_event(dev, ISP3X_OUT_FRM_HALF);
4345
+ rkisp_stream_buf_done_early(dev);
4346
+ }
4347
+ if (isp_mis & ISP3X_OUT_FRM_END) {
4348
+ writel(ISP3X_OUT_FRM_END, base + CIF_ISP_ICR);
4349
+ rkisp_dvbm_event(dev, ISP3X_OUT_FRM_END);
4350
+ }
4351
+
31494352 if (isp_mis & CIF_ISP_FRAME)
31504353 rkisp_check_idle(dev, ISP_FRAME_END);
31514354 }