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,68 +692,208 @@
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
611
- memset(dev->filt_state, 0, sizeof(dev->filt_state));
612
- dev->filt_state[RDBK_F_VS] = dma2frm;
828
+ /* if output stream enable, wait it end */
829
+ val = rkisp_read(dev, CIF_MI_CTRL_SHD, true);
830
+ if (val & CIF_MI_CTRL_SHD_MP_OUT_ENABLED)
831
+ dev->irq_ends_mask |= ISP_FRAME_MP;
832
+ else
833
+ dev->irq_ends_mask &= ~ISP_FRAME_MP;
834
+ if (val & CIF_MI_CTRL_SHD_SP_OUT_ENABLED)
835
+ dev->irq_ends_mask |= ISP_FRAME_SP;
836
+ else
837
+ dev->irq_ends_mask &= ~ISP_FRAME_SP;
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;
613852
614853 val = rkisp_read(dev, CSI2RX_CTRL0, true);
615854 val &= ~SW_IBUF_OP_MODE(0xf);
616855 tmp = SW_IBUF_OP_MODE(dev->rd_mode);
617856 val |= tmp | SW_CSI2RX_EN | SW_DMA_2FRM_MODE(dma2frm);
857
+ if (dev->isp_ver > ISP_V20)
858
+ dma2frm = dev->sw_rd_cnt;
618859 v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
619
- "readback frame:%d time:%d 0x%x\n",
620
- cur_frame_id, dma2frm + 1, val);
621
- if (!dma2frm)
622
- 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);
623862 if (!hw->is_shutdown)
624
- 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
+ }
625897 }
626898
627899 static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd)
....@@ -633,20 +905,39 @@
633905 int i, times = -1, max = 0, id = 0;
634906 int len[DEV_MAX] = { 0 };
635907 u32 mode = 0;
908
+ bool is_try = false;
636909
637910 spin_lock_irqsave(&hw->rdbk_lock, lock_flags);
638
- 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
+ }
639925 hw->is_idle = true;
926
+ hw->pre_dev_id = dev->dev_id;
927
+ }
640928 if (hw->is_shutdown)
641929 hw->is_idle = false;
642930 if (!hw->is_idle)
643931 goto end;
644932 if (hw->monitor.state & ISP_MIPI_ERROR && hw->monitor.is_en)
645933 goto end;
934
+ if (!IS_HDR_RDBK(dev->rd_mode))
935
+ goto end;
646936
647937 for (i = 0; i < hw->dev_num; i++) {
648938 isp = hw->isp[i];
649
- if (!(isp->isp_state & ISP_START))
939
+ if (!isp ||
940
+ (isp && !(isp->isp_state & ISP_START)))
650941 continue;
651942 rkisp_rdbk_trigger_event(isp, T_CMD_LEN, &len[i]);
652943 if (max < len[i]) {
....@@ -655,10 +946,14 @@
655946 }
656947 }
657948
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
+
658953 if (max) {
659
- v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
660
- "trigger fifo len:%d\n", max);
661954 isp = hw->isp[id];
955
+ v4l2_dbg(2, rkisp_debug, &isp->v4l2_dev,
956
+ "trigger fifo len:%d\n", max);
662957 rkisp_rdbk_trigger_event(isp, T_CMD_DEQUEUE, &t);
663958 isp->dmarx_dev.pre_frame = isp->dmarx_dev.cur_frame;
664959 if (t.frame_id > isp->dmarx_dev.pre_frame.id &&
....@@ -669,15 +964,50 @@
669964 isp->dmarx_dev.cur_frame.sof_timestamp = t.sof_timestamp;
670965 isp->dmarx_dev.cur_frame.timestamp = t.frame_timestamp;
671966 isp->isp_sdev.frm_timestamp = t.sof_timestamp;
967
+ atomic_set(&isp->isp_sdev.frm_sync_seq, t.frame_id + 1);
672968 mode = t.mode;
673969 times = t.times;
674970 hw->cur_dev_id = id;
675971 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;
6761006 }
6771007 end:
6781008 spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags);
6791009 if (times >= 0)
680
- rkisp_trigger_read_back(isp, times, mode, false);
1010
+ rkisp_trigger_read_back(isp, times, mode, is_try);
6811011 }
6821012
6831013 int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
....@@ -686,9 +1016,6 @@
6861016 struct isp2x_csi_trigger *trigger = NULL;
6871017 unsigned long lock_flags = 0;
6881018 int val, ret = 0;
689
-
690
- if (dev->dmarx_dev.trigger != T_MANUAL)
691
- return 0;
6921019
6931020 spin_lock_irqsave(&dev->rdbk_lock, lock_flags);
6941021 switch (cmd) {
....@@ -721,6 +1048,14 @@
7211048 return ret;
7221049 }
7231050
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
+
7241059 void rkisp_check_idle(struct rkisp_device *dev, u32 irq)
7251060 {
7261061 u32 val = 0;
....@@ -735,13 +1070,37 @@
7351070 if (!completion_done(&dev->hw_dev->monitor.cmpl))
7361071 complete(&dev->hw_dev->monitor.cmpl);
7371072 }
738
- if (dev->irq_ends != dev->irq_ends_mask || !IS_HDR_RDBK(dev->rd_mode))
1073
+ if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask ||
1074
+ !IS_HDR_RDBK(dev->rd_mode))
7391075 return;
7401076
741
- if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC)))
742
- dev->isp_state = ISP_STOP;
1077
+ if (dev->sw_rd_cnt)
1078
+ goto end;
7431079
744
- dev->irq_ends = 0;
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
+
1087
+ /* check output stream is off */
1088
+ val = ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC | ISP_FRAME_BP;
1089
+ if (!(dev->irq_ends_mask & val)) {
1090
+ u32 state = dev->isp_state;
1091
+ struct rkisp_stream *s;
1092
+
1093
+ for (val = 0; val < RKISP_STREAM_VIR; val++) {
1094
+ s = &dev->cap_dev.stream[val];
1095
+ dev->isp_state = ISP_STOP;
1096
+ if (s->streaming) {
1097
+ dev->isp_state = state;
1098
+ break;
1099
+ }
1100
+ }
1101
+ }
1102
+
1103
+ val = 0;
7451104 switch (dev->rd_mode) {
7461105 case HDR_RDBK_FRAME3://for rd1 rd0 rd2
7471106 val |= RAW1_RD_FRAME;
....@@ -754,9 +1113,12 @@
7541113 /* FALLTHROUGH */
7551114 }
7561115 rkisp2_rawrd_isr(val, dev);
757
- if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC)))
758
- dev->isp_state = ISP_STOP;
759
- 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
7601122 rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL);
7611123 if (dev->isp_state == ISP_STOP)
7621124 wake_up(&dev->sync_onoff);
....@@ -779,31 +1141,33 @@
7791141 */
7801142 static void rkisp_config_ism(struct rkisp_device *dev)
7811143 {
782
- void __iomem *base = dev->base_addr;
7831144 struct v4l2_rect *out_crop = &dev->isp_sdev.out_crop;
784
- u32 val;
1145
+ u32 width = out_crop->width, mult = 1;
1146
+ u32 unite = dev->hw_dev->unite;
7851147
7861148 /* isp2.0 no ism */
787
- 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)
7881151 return;
7891152
790
- writel(0, base + CIF_ISP_IS_RECENTER);
791
- writel(0, base + CIF_ISP_IS_MAX_DX);
792
- writel(0, base + CIF_ISP_IS_MAX_DY);
793
- writel(0, base + CIF_ISP_IS_DISPLACE);
794
- writel(out_crop->left, base + CIF_ISP_IS_H_OFFS);
795
- writel(out_crop->top, base + CIF_ISP_IS_V_OFFS);
796
- 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);
7971162 if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced)
798
- writel(out_crop->height / 2, base + CIF_ISP_IS_V_SIZE);
799
- else
800
- 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;
8011168
8021169 /* IS(Image Stabilization) is always on, working as output crop */
803
- writel(1, base + CIF_ISP_IS_CTRL);
804
- val = readl(base + CIF_ISP_CTRL);
805
- val |= CIF_ISP_CTRL_ISP_CFG_UPD;
806
- writel(val, base + CIF_ISP_CTRL);
1170
+ rkisp_write(dev, CIF_ISP_IS_CTRL, 1, false);
8071171 }
8081172
8091173 static int rkisp_reset_handle_v2x(struct rkisp_device *dev)
....@@ -960,7 +1324,7 @@
9601324 !(monitor->state & ISP_MIPI_ERROR))) {
9611325 for (i = 0; i < hw->dev_num; i++) {
9621326 isp = hw->isp[i];
963
- if (!(isp->isp_inp & INP_CSI))
1327
+ if (!isp || (isp && !(isp->isp_inp & INP_CSI)))
9641328 continue;
9651329 if (!(isp->isp_state & ISP_START))
9661330 break;
....@@ -982,6 +1346,8 @@
9821346 }
9831347 for (i = 0; i < hw->dev_num; i++) {
9841348 isp = hw->isp[i];
1349
+ if (!isp)
1350
+ continue;
9851351 if (isp->isp_inp & INP_CSI ||
9861352 isp->isp_inp & INP_DVP ||
9871353 isp->isp_inp & INP_LVDS) {
....@@ -1008,6 +1374,8 @@
10081374
10091375 for (i = 0; i < hw->dev_num; i++) {
10101376 isp = hw->isp[i];
1377
+ if (!isp)
1378
+ continue;
10111379 if (isp->isp_inp & INP_CSI ||
10121380 isp->isp_inp & INP_DVP ||
10131381 isp->isp_inp & INP_LVDS) {
....@@ -1061,6 +1429,8 @@
10611429 */
10621430 static void rkisp_config_color_space(struct rkisp_device *dev)
10631431 {
1432
+ u32 val = 0;
1433
+
10641434 u16 bt601_coeff[] = {
10651435 0x0026, 0x004b, 0x000f,
10661436 0x01ea, 0x01d6, 0x0040,
....@@ -1092,16 +1462,221 @@
10921462 }
10931463
10941464 for (i = 0; i < 9; i++)
1095
- 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);
10961469
10971470 if (dev->isp_sdev.quantization == V4L2_QUANTIZATION_FULL_RANGE)
1098
- rkisp_set_bits(dev, CIF_ISP_CTRL, 0,
1099
- CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1100
- 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);
11011474 else
1102
- rkisp_clear_bits(dev, CIF_ISP_CTRL,
1103
- CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA |
1104
- 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);
11051680 }
11061681
11071682 /*
....@@ -1113,17 +1688,20 @@
11131688 struct ispsd_out_fmt *out_fmt;
11141689 struct v4l2_rect *in_crop;
11151690 struct rkisp_sensor_info *sensor;
1691
+ bool is_unite = !!dev->hw_dev->unite;
11161692 u32 isp_ctrl = 0;
11171693 u32 irq_mask = 0;
11181694 u32 signal = 0;
11191695 u32 acq_mult = 0;
11201696 u32 acq_prop = 0;
11211697 u32 extend_line = 0;
1698
+ u32 width;
11221699
11231700 sensor = dev->active_sensor;
11241701 in_fmt = &dev->isp_sdev.in_fmt;
11251702 out_fmt = &dev->isp_sdev.out_fmt;
11261703 in_crop = &dev->isp_sdev.in_crop;
1704
+ width = in_crop->width;
11271705
11281706 if (in_fmt->fmt_type == FMT_BAYER) {
11291707 acq_mult = 1;
....@@ -1139,21 +1717,21 @@
11391717 if (in_fmt->mbus_code == MEDIA_BUS_FMT_Y8_1X8 ||
11401718 in_fmt->mbus_code == MEDIA_BUS_FMT_Y10_1X10 ||
11411719 in_fmt->mbus_code == MEDIA_BUS_FMT_Y12_1X12) {
1142
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
1143
- 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);
11441722 else
11451723 rkisp_write(dev, CIF_ISP_DEMOSAIC,
1146
- CIF_ISP_DEMOSAIC_BYPASS |
1147
- CIF_ISP_DEMOSAIC_TH(0xc), false);
1724
+ CIF_ISP_DEMOSAIC_BYPASS |
1725
+ CIF_ISP_DEMOSAIC_TH(0xc), false);
11481726 } else {
1149
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
1150
- rkisp_write(dev, ISP_DEBAYER_CONTROL,
1151
- SW_DEBAYER_EN |
1152
- SW_DEBAYER_FILTER_G_EN |
1153
- 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);
11541732 else
11551733 rkisp_write(dev, CIF_ISP_DEMOSAIC,
1156
- CIF_ISP_DEMOSAIC_TH(0xc), false);
1734
+ CIF_ISP_DEMOSAIC_TH(0xc), false);
11571735 }
11581736
11591737 if (sensor && sensor->mbus.type == V4L2_MBUS_BT656)
....@@ -1171,7 +1749,7 @@
11711749 } else if (in_fmt->fmt_type == FMT_YUV) {
11721750 acq_mult = 2;
11731751 if (sensor &&
1174
- (sensor->mbus.type == V4L2_MBUS_CSI2 ||
1752
+ (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY ||
11751753 sensor->mbus.type == V4L2_MBUS_CCP2)) {
11761754 isp_ctrl = CIF_ISP_CTRL_ISP_MODE_ITU601;
11771755 } else {
....@@ -1203,39 +1781,46 @@
12031781 signal |= CIF_ISP_ACQ_PROP_HSYNC_LOW;
12041782 }
12051783
1206
- 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);
12071788 acq_prop |= signal | in_fmt->yuv_seq |
12081789 CIF_ISP_ACQ_PROP_BAYER_PAT(in_fmt->bayer_pat) |
12091790 CIF_ISP_ACQ_PROP_FIELD_SEL_ALL;
1210
- rkisp_write(dev, CIF_ISP_ACQ_PROP, acq_prop, false);
1211
- 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);
12121793
1794
+ if (is_unite)
1795
+ width = width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
12131796 /* Acquisition Size */
1214
- rkisp_write(dev, CIF_ISP_ACQ_H_OFFS, acq_mult * in_crop->left, false);
1215
- rkisp_write(dev, CIF_ISP_ACQ_V_OFFS, in_crop->top, false);
1216
- 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);
12171800
12181801 /* ISP Out Area differ with ACQ is only FIFO, so don't crop in this */
1219
- rkisp_write(dev, CIF_ISP_OUT_H_OFFS, 0, true);
1220
- rkisp_write(dev, CIF_ISP_OUT_V_OFFS, 0, true);
1221
- 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);
12221805
12231806 if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced) {
1224
- rkisp_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height / 2, false);
1225
- 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);
12261809 } else {
1227
- rkisp_write(dev, CIF_ISP_ACQ_V_SIZE, in_crop->height + extend_line, false);
1228
- 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);
12291812 }
12301813
12311814 /* interrupt mask */
1232
- irq_mask |= CIF_ISP_FRAME | CIF_ISP_V_START | CIF_ISP_PIC_SIZE_ERROR |
1233
- CIF_ISP_FRAME_IN;
1234
- 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)
12351817 irq_mask |= ISP2X_LSC_LUT_ERR;
1236
- 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);
12371821
1238
- if ((dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) &&
1822
+ if ((dev->isp_ver == ISP_V20 ||
1823
+ dev->isp_ver == ISP_V21) &&
12391824 IS_HDR_RDBK(dev->hdr.op_mode)) {
12401825 irq_mask = ISP2X_3A_RAWAE_BIG;
12411826 rkisp_write(dev, ISP_ISP3A_IMSC, irq_mask, true);
....@@ -1252,6 +1837,8 @@
12521837 rkisp_update_regs(dev, CIF_ISP_ACQ_H_OFFS, CIF_ISP_ACQ_V_SIZE);
12531838 rkisp_update_regs(dev, CIF_ISP_OUT_H_SIZE, CIF_ISP_OUT_V_SIZE);
12541839 }
1840
+
1841
+ rkisp_config_cmsk(dev);
12551842 return 0;
12561843 }
12571844
....@@ -1355,12 +1942,12 @@
13551942 /* Configure MUX */
13561943 static int rkisp_config_path(struct rkisp_device *dev)
13571944 {
1358
- int ret = 0;
13591945 struct rkisp_sensor_info *sensor = dev->active_sensor;
1360
- u32 dpcl = readl(dev->base_addr + CIF_VI_DPCL);
1946
+ int ret = 0;
1947
+ u32 dpcl = 0;
13611948
13621949 /* isp input interface selects */
1363
- if ((sensor && sensor->mbus.type == V4L2_MBUS_CSI2) ||
1950
+ if ((sensor && sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) ||
13641951 dev->isp_inp & (INP_RAWRD0 | INP_RAWRD1 | INP_RAWRD2 | INP_CIF)) {
13651952 /* mipi sensor->isp or isp read from ddr */
13661953 dpcl |= CIF_VI_DPCL_IF_SEL_MIPI;
....@@ -1382,8 +1969,10 @@
13821969 ret = -EINVAL;
13831970 }
13841971
1385
- writel(dpcl, dev->base_addr + CIF_VI_DPCL);
1972
+ if (dev->isp_ver == ISP_V32)
1973
+ dpcl |= BIT(0);
13861974
1975
+ rkisp_unite_set_bits(dev, CIF_VI_DPCL, 0, dpcl, true);
13871976 return ret;
13881977 }
13891978
....@@ -1455,7 +2044,7 @@
14552044 int ret = 1000;
14562045
14572046 if (!rkisp_is_need_3a(dev) || dev->isp_ver == ISP_V20 ||
1458
- !params_vdev->is_subs_evt)
2047
+ !params_vdev->is_subs_evt || dev->hw_dev->is_shutdown)
14592048 return;
14602049
14612050 v4l2_event_queue(vdev, &ev);
....@@ -1472,6 +2061,7 @@
14722061 /* Mess register operations to stop isp */
14732062 static int rkisp_isp_stop(struct rkisp_device *dev)
14742063 {
2064
+ struct rkisp_hw_dev *hw = dev->hw_dev;
14752065 void __iomem *base = dev->base_addr;
14762066 unsigned long old_rate, safe_rate;
14772067 u32 val;
....@@ -1479,17 +2069,10 @@
14792069
14802070 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
14812071 "%s refcnt:%d\n", __func__,
1482
- atomic_read(&dev->hw_dev->refcnt));
2072
+ atomic_read(&hw->refcnt));
14832073
1484
- if (atomic_read(&dev->hw_dev->refcnt) > 1)
2074
+ if (atomic_read(&hw->refcnt) > 1)
14852075 goto end;
1486
-
1487
- if (dev->hw_dev->monitor.is_en) {
1488
- dev->hw_dev->monitor.is_en = 0;
1489
- dev->hw_dev->monitor.state = ISP_STOP;
1490
- if (!completion_done(&dev->hw_dev->monitor.cmpl))
1491
- complete(&dev->hw_dev->monitor.cmpl);
1492
- }
14932076 /*
14942077 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
14952078 * Stop ISP(isp) ->wait for ISP isp off
....@@ -1502,7 +2085,7 @@
15022085 readl(base + CIF_ISP_CSI0_ERR1);
15032086 readl(base + CIF_ISP_CSI0_ERR2);
15042087 readl(base + CIF_ISP_CSI0_ERR3);
1505
- } else if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
2088
+ } else if (dev->isp_ver >= ISP_V20) {
15062089 writel(0, base + CSI2RX_MASK_PHY);
15072090 writel(0, base + CSI2RX_MASK_PACKET);
15082091 writel(0, base + CSI2RX_MASK_OVERFLOW);
....@@ -1519,7 +2102,7 @@
15192102 writel(0, base + CIF_ISP_IMSC);
15202103 writel(~0, base + CIF_ISP_ICR);
15212104
1522
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
2105
+ if (dev->isp_ver >= ISP_V20) {
15232106 writel(0, base + ISP_ISP3A_IMSC);
15242107 writel(~0, base + ISP_ISP3A_ICR);
15252108 }
....@@ -1535,7 +2118,7 @@
15352118 udelay(20);
15362119 }
15372120 /* stop lsc to avoid lsclut error */
1538
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
2121
+ if (dev->isp_ver >= ISP_V20)
15392122 writel(0, base + ISP_LSC_CTRL);
15402123 /* stop ISP */
15412124 val = readl(base + CIF_ISP_CTRL);
....@@ -1544,6 +2127,9 @@
15442127
15452128 val = readl(base + CIF_ISP_CTRL);
15462129 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);
15472133
15482134 readx_poll_timeout_atomic(readl, base + CIF_ISP_RIS,
15492135 val, val & CIF_ISP_OFF, 20, 100);
....@@ -1551,19 +2137,19 @@
15512137 "MI_CTRL:%x, ISP_CTRL:%x\n",
15522138 readl(base + CIF_MI_CTRL), readl(base + CIF_ISP_CTRL));
15532139
1554
- val = rkisp_read(dev, CTRL_VI_ISP_CLK_CTRL, true);
15552140 if (!in_interrupt()) {
15562141 /* normal case */
15572142 /* check the isp_clk before isp reset operation */
1558
- old_rate = clk_get_rate(dev->hw_dev->clks[0]);
1559
- 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;
15602145 if (old_rate > safe_rate) {
1561
- 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);
15622149 udelay(100);
15632150 }
1564
- rkisp_soft_reset(dev->hw_dev, false);
2151
+ rkisp_soft_reset(hw, false);
15652152 }
1566
- rkisp_write(dev, CTRL_VI_ISP_CLK_CTRL, val, true);
15672153
15682154 if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) {
15692155 writel(0, base + CIF_ISP_CSI0_CSI2_RESETN);
....@@ -1571,19 +2157,28 @@
15712157 writel(0, base + CIF_ISP_CSI0_MASK1);
15722158 writel(0, base + CIF_ISP_CSI0_MASK2);
15732159 writel(0, base + CIF_ISP_CSI0_MASK3);
1574
- } else if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
2160
+ } else if (dev->isp_ver >= ISP_V20) {
15752161 writel(0, base + CSI2RX_CSI2_RESETN);
2162
+ if (hw->unite == ISP_UNITE_TWO)
2163
+ rkisp_next_write(dev, CSI2RX_CSI2_RESETN, 0, true);
15762164 }
15772165
1578
- dev->hw_dev->is_idle = true;
1579
- 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;
15802171 end:
15812172 dev->irq_ends_mask = 0;
15822173 dev->hdr.op_mode = 0;
2174
+ dev->sw_rd_cnt = 0;
2175
+ dev->stats_vdev.rdbk_drop = false;
15832176 rkisp_set_state(&dev->isp_state, ISP_STOP);
15842177
1585
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
2178
+ if (dev->isp_ver >= ISP_V20)
15862179 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));
15872182 if (dev->emd_vc <= CIF_ISP_ADD_DATA_VC_MAX) {
15882183 for (i = 0; i < RKISP_EMDDATA_FIFO_MAX; i++)
15892184 kfifo_free(&dev->emd_data_fifo[i].mipi_kfifo);
....@@ -1601,15 +2196,37 @@
16012196 {
16022197 struct rkisp_sensor_info *sensor = dev->active_sensor;
16032198 void __iomem *base = dev->base_addr;
1604
- u32 val;
16052199 bool is_direct = true;
2200
+ u32 val;
16062201
16072202 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
1608
- "%s refcnt:%d\n", __func__,
1609
- 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
+ }
16102227
16112228 /* Activate MIPI */
1612
- if (sensor && sensor->mbus.type == V4L2_MBUS_CSI2) {
2229
+ if (sensor && sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
16132230 if (dev->isp_ver == ISP_V12 || dev->isp_ver == ISP_V13) {
16142231 /* clear interrupts state */
16152232 readl(base + CIF_ISP_CSI0_ERR1);
....@@ -1624,19 +2241,19 @@
16242241 }
16252242 }
16262243 /* Activate ISP */
1627
- val = rkisp_read(dev, CIF_ISP_CTRL, false);
2244
+ val = rkisp_read_reg_cache(dev, CIF_ISP_CTRL);
16282245 val |= CIF_ISP_CTRL_ISP_CFG_UPD | CIF_ISP_CTRL_ISP_ENABLE |
16292246 CIF_ISP_CTRL_ISP_INFORM_ENABLE | CIF_ISP_CTRL_ISP_CFG_UPD_PERMANENT;
16302247 if (dev->isp_ver == ISP_V20)
16312248 val |= NOC_HURRY_PRIORITY(2) | NOC_HURRY_W_MODE(2) | NOC_HURRY_R_MODE(1);
16322249 if (atomic_read(&dev->hw_dev->refcnt) > 1)
16332250 is_direct = false;
1634
- 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);
16352253
16362254 dev->isp_err_cnt = 0;
16372255 dev->isp_isr_cnt = 0;
1638
- dev->isp_state = ISP_START | ISP_FRAME_END;
1639
- dev->irq_ends_mask |= ISP_FRAME_END | ISP_FRAME_IN;
2256
+ dev->irq_ends_mask |= ISP_FRAME_END;
16402257 dev->irq_ends = 0;
16412258
16422259 /* XXX: Is the 1000us too long?
....@@ -2076,7 +2693,7 @@
20762693 struct rkisp_isp_subdev *isp_sd = sd_to_isp_sd(sd);
20772694 struct rkisp_device *dev = sd_to_isp_dev(sd);
20782695 struct v4l2_rect *crop;
2079
- u32 max_w, max_h;
2696
+ u32 max_w, max_h, max_size;
20802697
20812698 if (!sel)
20822699 goto err;
....@@ -2097,19 +2714,42 @@
20972714 crop->left = 0;
20982715 crop->top = 0;
20992716 if (sel->pad == RKISP_ISP_PAD_SINK) {
2100
- if (dev->isp_ver == ISP_V12) {
2717
+ switch (dev->isp_ver) {
2718
+ case ISP_V12:
21012719 max_w = CIF_ISP_INPUT_W_MAX_V12;
21022720 max_h = CIF_ISP_INPUT_H_MAX_V12;
2103
- } else if (dev->isp_ver == ISP_V13) {
2721
+ break;
2722
+ case ISP_V13:
21042723 max_w = CIF_ISP_INPUT_W_MAX_V13;
21052724 max_h = CIF_ISP_INPUT_H_MAX_V13;
2106
- } else if (dev->isp_ver == ISP_V21) {
2725
+ break;
2726
+ case ISP_V21:
21072727 max_w = CIF_ISP_INPUT_W_MAX_V21;
21082728 max_h = CIF_ISP_INPUT_H_MAX_V21;
2109
- } 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:
21102747 max_w = CIF_ISP_INPUT_W_MAX;
21112748 max_h = CIF_ISP_INPUT_H_MAX;
21122749 }
2750
+ max_size = max_w * max_h;
2751
+ max_h = max_size / isp_sd->in_frm.width;
2752
+
21132753 crop->width = min_t(u32, isp_sd->in_frm.width, max_w);
21142754 crop->height = min_t(u32, isp_sd->in_frm.height, max_h);
21152755 }
....@@ -2125,6 +2765,40 @@
21252765 return 0;
21262766 err:
21272767 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
+ }
21282802 }
21292803
21302804 static int rkisp_isp_sd_set_selection(struct v4l2_subdev *sd,
....@@ -2158,18 +2832,20 @@
21582832
21592833 if (sel->pad == RKISP_ISP_PAD_SINK) {
21602834 isp_sd->in_crop = *crop;
2161
- /* ISP20 don't have out crop */
2162
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) {
2835
+ /* don't have out crop */
2836
+ if (dev->isp_ver >= ISP_V20) {
21632837 isp_sd->out_crop = *crop;
21642838 isp_sd->out_crop.left = 0;
21652839 isp_sd->out_crop.top = 0;
21662840 dev->br_dev.crop = isp_sd->out_crop;
21672841 }
21682842 } else {
2169
- if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
2843
+ if (dev->isp_ver >= ISP_V20)
21702844 *crop = isp_sd->out_crop;
21712845 isp_sd->out_crop = *crop;
21722846 }
2847
+
2848
+ rkisp_check_stream_dcrop(dev, crop);
21732849
21742850 return 0;
21752851 err:
....@@ -2225,53 +2901,296 @@
22252901 struct rkisp_stream *stream;
22262902 int i;
22272903
2904
+ rkisp_stats_first_ddr_config(&dev->stats_vdev);
22282905 if (dev->hw_dev->is_mi_update)
22292906 return;
22302907
2231
- rkisp_stats_first_ddr_config(&dev->stats_vdev);
22322908 rkisp_config_dmatx_valid_buf(dev);
22332909
22342910 force_cfg_update(dev);
22352911
22362912 hdr_update_dmatx_buf(dev);
2237
- if (dev->br_dev.en && dev->isp_ver == ISP_V20) {
2238
- stream = &dev->cap_dev.stream[RKISP_STREAM_SP];
2239
- rkisp_update_spstream_buf(stream);
2240
- }
22412913 if (dev->hw_dev->is_single) {
22422914 for (i = 0; i < RKISP_MAX_STREAM; i++) {
22432915 stream = &dev->cap_dev.stream[i];
2244
- if (stream->streaming)
2245
- 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);
22462921 }
22472922 }
2923
+ rkisp_stats_next_ddr_config(&dev->stats_vdev);
22482924 }
22492925
22502926 static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
22512927 {
22522928 struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
2929
+ struct rkisp_hw_dev *hw_dev = isp_dev->hw_dev;
22532930
22542931 if (!on) {
2255
- rkisp_stop_3a_run(isp_dev);
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
+ }
22562942 wait_event_timeout(isp_dev->sync_onoff,
2257
- isp_dev->irq_ends_mask == (ISP_FRAME_END | ISP_FRAME_IN) &&
2258
- (!IS_HDR_RDBK(isp_dev->rd_mode) ||
2259
- 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));
22602946 rkisp_isp_stop(isp_dev);
2261
- atomic_dec(&isp_dev->hw_dev->refcnt);
2947
+ atomic_dec(&hw_dev->refcnt);
22622948 rkisp_params_stream_stop(&isp_dev->params_vdev);
2949
+ atomic_set(&isp_dev->isp_sdev.frm_sync_seq, 0);
2950
+ rkisp_stop_3a_run(isp_dev);
22632951 return 0;
22642952 }
22652953
2954
+ hw_dev->is_runing = true;
22662955 rkisp_start_3a_run(isp_dev);
22672956 memset(&isp_dev->isp_sdev.dbg, 0, sizeof(isp_dev->isp_sdev.dbg));
2268
- atomic_inc(&isp_dev->hw_dev->refcnt);
2269
- atomic_set(&isp_dev->isp_sdev.frm_sync_seq, 0);
2270
- 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
+
22712963 rkisp_config_cif(isp_dev);
22722964 rkisp_isp_start(isp_dev);
2965
+ rkisp_global_update_mi(isp_dev);
2966
+ isp_dev->isp_state = ISP_START | ISP_FRAME_END;
22732967 rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, NULL);
22742968 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;
22753194 }
22763195
22773196 static int rkisp_isp_sd_s_power(struct v4l2_subdev *sd, int on)
....@@ -2279,14 +3198,11 @@
22793198 struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
22803199 int ret;
22813200
2282
- if (isp_dev->hw_dev->is_thunderboot)
2283
- return 0;
2284
-
22853201 v4l2_dbg(1, rkisp_debug, &isp_dev->v4l2_dev,
22863202 "%s on:%d\n", __func__, on);
22873203
22883204 if (on) {
2289
- if (isp_dev->isp_ver == ISP_V20 || isp_dev->isp_ver == ISP_V21)
3205
+ if (isp_dev->isp_ver >= ISP_V20)
22903206 kfifo_reset(&isp_dev->rdbk_kfifo);
22913207 ret = pm_runtime_get_sync(isp_dev->dev);
22923208 } else {
....@@ -2316,6 +3232,15 @@
23163232 dev = sd_to_isp_dev(sd);
23173233 if (!dev)
23183234 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
+ }
23193244
23203245 if (!strcmp(remote->entity->name, DMA_VDEV_NAME)) {
23213246 stream = &dev->dmarx_dev.stream[RKISP_STREAM_DMARX];
....@@ -2365,6 +3290,18 @@
23653290 } else {
23663291 dev->isp_inp &= ~INP_RAWRD2;
23673292 }
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];
23683305 } else if (!strcmp(remote->entity->name, SP_VDEV_NAME)) {
23693306 stream = &dev->cap_dev.stream[RKISP_STREAM_SP];
23703307 } else if (!strcmp(remote->entity->name, MP_VDEV_NAME)) {
....@@ -2409,11 +3346,31 @@
24093346
24103347 if (stream)
24113348 stream->linked = flags & MEDIA_LNK_FL_ENABLED;
2412
- if (dev->isp_inp & rawrd)
3349
+ if (dev->isp_inp & rawrd) {
24133350 dev->dmarx_dev.trigger = T_MANUAL;
2414
- else
3351
+ dev->is_rdbk_auto = false;
3352
+ } else {
24153353 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;
24163358
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;
24173374 v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
24183375 "isp input:0x%x\n", dev->isp_inp);
24193376 return 0;
....@@ -2461,7 +3418,6 @@
24613418 atomic_inc_return(&isp->frm_sync_seq) - 1,
24623419 };
24633420
2464
- event.timestamp = ns_to_timespec(ktime_get_ns());
24653421 v4l2_event_queue(isp->sd.devnode, &event);
24663422 }
24673423
....@@ -2478,24 +3434,95 @@
24783434 return v4l2_event_subscribe(fh, sub, ISP_V4L2_EVENT_ELEMS, NULL);
24793435 }
24803436
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
+
24813486 static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
24823487 {
24833488 struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
24843489 struct rkisp_thunderboot_resmem *resmem;
3490
+ struct rkisp32_thunderboot_resmem_head *tb_head_v32;
24853491 struct rkisp_thunderboot_resmem_head *head;
24863492 struct rkisp_thunderboot_shmem *shmem;
24873493 struct isp2x_buf_idxfd *idxfd;
3494
+ struct rkisp_rx_buf *dbufs;
24883495 void *resmem_va;
24893496 long ret = 0;
24903497
2491
- 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))
24923501 return -EINVAL;
24933502
24943503 switch (cmd) {
24953504 case RKISP_CMD_TRIGGER_READ_BACK:
24963505 rkisp_rdbk_trigger_event(isp_dev, T_CMD_QUEUE, arg);
24973506 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;
24983521 case RKISP_CMD_GET_SHARED_BUF:
3522
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3523
+ ret = -ENOIOCTLCMD;
3524
+ break;
3525
+ }
24993526 resmem = (struct rkisp_thunderboot_resmem *)arg;
25003527 resmem->resmem_padr = isp_dev->resmem_pa;
25013528 resmem->resmem_size = isp_dev->resmem_size;
....@@ -2525,6 +3552,10 @@
25253552 }
25263553 break;
25273554 case RKISP_CMD_FREE_SHARED_BUF:
3555
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3556
+ ret = -ENOIOCTLCMD;
3557
+ break;
3558
+ }
25283559 if (isp_dev->resmem_pa && isp_dev->resmem_size) {
25293560 dma_unmap_single(isp_dev->dev, isp_dev->resmem_pa,
25303561 sizeof(struct rkisp_thunderboot_resmem_head),
....@@ -2543,15 +3574,38 @@
25433574 break;
25443575 case RKISP_CMD_SET_LDCHBUF_SIZE:
25453576 case RKISP_CMD_SET_MESHBUF_SIZE:
2546
- rkisp_params_set_meshbuf_size(&isp_dev->params_vdev, arg);
3577
+ ret = rkisp_params_set_meshbuf_size(&isp_dev->params_vdev, arg);
25473578 break;
25483579 case RKISP_CMD_GET_SHM_BUFFD:
3580
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3581
+ ret = -ENOIOCTLCMD;
3582
+ break;
3583
+ }
25493584 shmem = (struct rkisp_thunderboot_shmem *)arg;
25503585 ret = rkisp_tb_shm_ioctl(shmem);
25513586 break;
25523587 case RKISP_CMD_GET_FBCBUF_FD:
25533588 idxfd = (struct isp2x_buf_idxfd *)arg;
25543589 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
+ }
25553609 break;
25563610 default:
25573611 ret = -ENOIOCTLCMD;
....@@ -2573,7 +3627,9 @@
25733627 struct rkisp_meshbuf_size meshsize;
25743628 struct rkisp_thunderboot_shmem shmem;
25753629 struct isp2x_buf_idxfd idxfd;
3630
+ struct rkisp_info2ddr info2ddr;
25763631 long ret = 0;
3632
+ u64 module_id;
25773633
25783634 if (!up && cmd != RKISP_CMD_FREE_SHARED_BUF)
25793635 return -EINVAL;
....@@ -2585,11 +3641,19 @@
25853641 ret = rkisp_ioctl(sd, cmd, &trigger);
25863642 break;
25873643 case RKISP_CMD_GET_SHARED_BUF:
3644
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3645
+ ret = -ENOIOCTLCMD;
3646
+ break;
3647
+ }
25883648 ret = rkisp_ioctl(sd, cmd, &resmem);
25893649 if (!ret && copy_to_user(up, &resmem, sizeof(resmem)))
25903650 ret = -EFAULT;
25913651 break;
25923652 case RKISP_CMD_FREE_SHARED_BUF:
3653
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3654
+ ret = -ENOIOCTLCMD;
3655
+ break;
3656
+ }
25933657 ret = rkisp_ioctl(sd, cmd, NULL);
25943658 break;
25953659 case RKISP_CMD_GET_LDCHBUF_INFO:
....@@ -2603,7 +3667,7 @@
26033667 ret = rkisp_ioctl(sd, cmd, &ldchsize);
26043668 break;
26053669 case RKISP_CMD_GET_MESHBUF_INFO:
2606
- if (copy_from_user(&meshsize, up, sizeof(meshsize)))
3670
+ if (copy_from_user(&meshbuf, up, sizeof(meshbuf)))
26073671 return -EFAULT;
26083672 ret = rkisp_ioctl(sd, cmd, &meshbuf);
26093673 if (!ret && copy_to_user(up, &meshbuf, sizeof(meshbuf)))
....@@ -2615,6 +3679,10 @@
26153679 ret = rkisp_ioctl(sd, cmd, &meshsize);
26163680 break;
26173681 case RKISP_CMD_GET_SHM_BUFFD:
3682
+ if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) {
3683
+ ret = -ENOIOCTLCMD;
3684
+ break;
3685
+ }
26183686 if (copy_from_user(&shmem, up, sizeof(shmem)))
26193687 return -EFAULT;
26203688 ret = rkisp_ioctl(sd, cmd, &shmem);
....@@ -2625,6 +3693,21 @@
26253693 ret = rkisp_ioctl(sd, cmd, &idxfd);
26263694 if (!ret && copy_to_user(up, &idxfd, sizeof(idxfd)))
26273695 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);
26283711 break;
26293712 default:
26303713 ret = -ENOIOCTLCMD;
....@@ -2652,6 +3735,7 @@
26523735
26533736 static const struct v4l2_subdev_video_ops rkisp_isp_sd_video_ops = {
26543737 .s_stream = rkisp_isp_sd_s_stream,
3738
+ .s_rx_buffer = rkisp_sd_s_rx_buffer,
26553739 };
26563740
26573741 static const struct v4l2_subdev_core_ops rkisp_isp_core_ops = {
....@@ -2678,7 +3762,7 @@
26783762 struct ispsd_in_fmt *in_fmt = &isp_sd->in_fmt;
26793763 struct ispsd_out_fmt *out_fmt = &isp_sd->out_fmt;
26803764
2681
- *in_fmt = rkisp_isp_input_formats[0];
3765
+ *in_fmt = rkisp_isp_input_formats[8];
26823766 in_frm->width = RKISP_DEFAULT_WIDTH;
26833767 in_frm->height = RKISP_DEFAULT_HEIGHT;
26843768 in_frm->code = in_fmt->mbus_code;
....@@ -2702,6 +3786,8 @@
27023786 struct v4l2_subdev *sd = &isp_sdev->sd;
27033787 int ret;
27043788
3789
+ mutex_init(&isp_dev->buf_lock);
3790
+ spin_lock_init(&isp_dev->cmsk_lock);
27053791 spin_lock_init(&isp_dev->rdbk_lock);
27063792 ret = kfifo_alloc(&isp_dev->rdbk_kfifo,
27073793 16 * sizeof(struct isp2x_csi_trigger), GFP_KERNEL);
....@@ -2739,8 +3825,9 @@
27393825 rkisp_isp_sd_init_default_fmt(isp_sdev);
27403826 isp_dev->hdr.sensor = NULL;
27413827 isp_dev->isp_state = ISP_STOP;
2742
-
3828
+ atomic_set(&isp_sdev->frm_sync_seq, 0);
27433829 rkisp_monitor_init(isp_dev);
3830
+ INIT_WORK(&isp_dev->rdbk_work, rkisp_rdbk_work);
27443831 return 0;
27453832 err_cleanup_media_entity:
27463833 media_entity_cleanup(&sd->entity);
....@@ -2781,55 +3868,119 @@
27813868 })
27823869
27833870 #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
+
27843914 void rkisp_chk_tb_over(struct rkisp_device *isp_dev)
27853915 {
3916
+ struct rkisp_isp_params_vdev *params_vdev = &isp_dev->params_vdev;
3917
+ struct rkisp_hw_dev *hw = isp_dev->hw_dev;
27863918 struct rkisp_thunderboot_resmem_head *head;
27873919 enum rkisp_tb_state tb_state;
27883920 void *resmem_va;
27893921
2790
- if (!isp_dev->hw_dev->is_thunderboot)
3922
+ if (!isp_dev->is_thunderboot)
27913923 return;
27923924
2793
- if (!atomic_read(&isp_dev->hw_dev->tb_ref)) {
2794
- rkisp_tb_set_state(RKISP_TB_NG);
2795
- rkisp_tb_unprotect_clk();
2796
- rkisp_register_irq(isp_dev->hw_dev);
2797
- isp_dev->hw_dev->is_thunderboot = false;
2798
- return;
2799
- }
3925
+ if (isp_dev->isp_ver == ISP_V32 && params_vdev->is_first_cfg)
3926
+ goto end;
28003927
28013928 resmem_va = phys_to_virt(isp_dev->resmem_pa);
28023929 head = (struct rkisp_thunderboot_resmem_head *)resmem_va;
2803
- if (isp_dev->is_thunderboot) {
2804
- shm_head_poll_timeout(isp_dev, !!head->enable, 2000, 200 * USEC_PER_MSEC);
2805
- shm_head_poll_timeout(isp_dev, !!head->complete, 5000, 600 * USEC_PER_MSEC);
2806
- if (head->complete != RKISP_TB_OK)
2807
- v4l2_info(&isp_dev->v4l2_dev,
2808
- "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);
28093933
2810
- v4l2_info(&isp_dev->v4l2_dev,
2811
- "thunderboot info: %d, %d, %d, %d, %d, %d, 0x%x\n",
2812
- head->enable,
2813
- head->complete,
2814
- head->frm_total,
2815
- head->hdr_mode,
2816
- head->width,
2817
- head->height,
2818
- 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;
28193939
2820
- tb_state = RKISP_TB_OK;
2821
- if (head->complete != RKISP_TB_OK) {
2822
- head->frm_total = 0;
2823
- 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
+ }
28243954 }
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);
28253979 rkisp_tb_set_state(tb_state);
28263980 rkisp_tb_unprotect_clk();
2827
- rkisp_register_irq(isp_dev->hw_dev);
2828
- pm_runtime_put(isp_dev->hw_dev->dev);
2829
- isp_dev->hw_dev->is_thunderboot = false;
2830
- isp_dev->is_thunderboot = false;
2831
- atomic_dec(&isp_dev->hw_dev->tb_ref);
3981
+ hw->is_thunderboot = false;
28323982 }
3983
+ isp_dev->is_thunderboot = false;
28333984 }
28343985 #endif
28353986
....@@ -2937,7 +4088,9 @@
29374088 unsigned int isp3a_mis,
29384089 struct rkisp_device *dev)
29394090 {
2940
- 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;
29414094 unsigned int isp_mis_tmp = 0;
29424095 unsigned int isp_err = 0;
29434096 u32 si3a_isr_mask = ISP2X_SIAWB_DONE | ISP2X_SIAF_FIN |
....@@ -2947,7 +4100,7 @@
29474100 ISP2X_3A_RAWHIST_BIG | ISP2X_3A_RAWHIST_CH0 |
29484101 ISP2X_3A_RAWHIST_CH1 | ISP2X_3A_RAWHIST_CH2 |
29494102 ISP2X_3A_RAWAF_SUM | ISP2X_3A_RAWAF_LUM |
2950
- ISP2X_3A_RAWAF | ISP2X_3A_RAWAWB;
4103
+ ISP2X_3A_RAWAWB;
29514104 bool sof_event_later = false;
29524105
29534106 /*
....@@ -2957,40 +4110,51 @@
29574110 if (isp3a_mis & ISP2X_3A_RAWAE_BIG && dev->params_vdev.rdbk_times > 0)
29584111 writel(BIT(31), base + RAWAE_BIG1_BASE + RAWAE_BIG_CTRL);
29594112
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
+ }
29604132 v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
29614133 "isp isr:0x%x, 0x%x\n", isp_mis, isp3a_mis);
29624134 dev->isp_isr_cnt++;
29634135 /* start edge of v_sync */
29644136 if (isp_mis & CIF_ISP_V_START) {
2965
- if (dev->isp_state & ISP_FRAME_END) {
2966
- u64 tmp = dev->isp_sdev.dbg.interval +
2967
- dev->isp_sdev.dbg.timestamp;
2968
-
2969
- dev->isp_sdev.dbg.timestamp = ktime_get_ns();
2970
- /* v-blank: frame_end - frame_start */
2971
- dev->isp_sdev.dbg.delay = dev->isp_sdev.dbg.timestamp - tmp;
2972
- }
2973
- rkisp_set_state(&dev->isp_state, ISP_FRAME_VS);
29744137 if (dev->hw_dev->monitor.is_en) {
29754138 rkisp_set_state(&dev->hw_dev->monitor.state, ISP_FRAME_VS);
29764139 if (!completion_done(&dev->hw_dev->monitor.cmpl))
29774140 complete(&dev->hw_dev->monitor.cmpl);
29784141 }
2979
- /* last vsync to config next buf */
2980
- if (!dev->filt_state[RDBK_F_VS])
2981
- rkisp_bridge_update_mi(dev, isp_mis);
2982
- else
2983
- dev->filt_state[RDBK_F_VS]--;
4142
+
29844143 if (IS_HDR_RDBK(dev->hdr.op_mode)) {
2985
- /* read 3d lut at isp readback */
2986
- if (!dev->hw_dev->is_single)
2987
- 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
+ }
29884152 rkisp_stats_rdbk_enable(&dev->stats_vdev, true);
29894153 goto vs_skip;
29904154 }
29914155 if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced) {
29924156 /* 0 = ODD 1 = EVEN */
2993
- if (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2) {
4157
+ if (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
29944158 void __iomem *addr = NULL;
29954159
29964160 if (dev->isp_ver == ISP_V10 ||
....@@ -3014,6 +4178,7 @@
30144178 if (dev->vs_irq < 0 && !sof_event_later) {
30154179 dev->isp_sdev.frm_timestamp = ktime_get_ns();
30164180 rkisp_isp_queue_event_sof(&dev->isp_sdev);
4181
+ rkisp_stream_frame_start(dev, isp_mis);
30174182 }
30184183 vs_skip:
30194184 writel(CIF_ISP_V_START, base + CIF_ISP_ICR);
....@@ -3057,6 +4222,16 @@
30574222 }
30584223 }
30594224
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
+
30604235 if (isp_mis & ISP2X_LSC_LUT_ERR) {
30614236 writel(ISP2X_LSC_LUT_ERR, base + CIF_ISP_ICR);
30624237
....@@ -3068,21 +4243,22 @@
30684243
30694244 /* sampled input frame is complete */
30704245 if (isp_mis & CIF_ISP_FRAME_IN) {
4246
+ dev->isp_sdev.dbg.interval =
4247
+ ktime_get_ns() - dev->isp_sdev.dbg.timestamp;
30714248 rkisp_set_state(&dev->isp_state, ISP_FRAME_IN);
30724249 writel(CIF_ISP_FRAME_IN, base + CIF_ISP_ICR);
30734250 isp_mis_tmp = readl(base + CIF_ISP_MIS);
30744251 if (isp_mis_tmp & CIF_ISP_FRAME_IN)
30754252 v4l2_err(&dev->v4l2_dev, "isp icr frame_in err: 0x%x\n",
30764253 isp_mis_tmp);
3077
-
3078
- dev->isp_err_cnt = 0;
3079
- dev->isp_state &= ~ISP_ERROR;
30804254 }
30814255
30824256 /* frame was completely put out */
30834257 if (isp_mis & CIF_ISP_FRAME) {
3084
- dev->isp_sdev.dbg.interval =
3085
- 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;
30864262 /* Clear Frame In (ISP) */
30874263 rkisp_set_state(&dev->isp_state, ISP_FRAME_END);
30884264 writel(CIF_ISP_FRAME, base + CIF_ISP_ICR);
....@@ -3092,6 +4268,25 @@
30924268 "isp icr frame end err: 0x%x\n", isp_mis_tmp);
30934269 rkisp_dmarx_get_frame(dev, &dev->isp_sdev.dbg.id, NULL, NULL, true);
30944270 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
+ }
30954290 }
30964291
30974292 if ((isp_mis & (CIF_ISP_FRAME | si3a_isr_mask)) ||
....@@ -3108,6 +4303,21 @@
31084303
31094304 if ((isp_mis & CIF_ISP_FRAME) && dev->stats_vdev.rdbk_mode)
31104305 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
+ }
31114321 }
31124322
31134323 /*
....@@ -3115,16 +4325,30 @@
31154325 * lot of register writes. Do those only one per frame.
31164326 * Do the updates in the order of the processing flow.
31174327 */
3118
- 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);
31194330
31204331 /* cur frame end and next frame start irq togeter */
31214332 if (dev->vs_irq < 0 && sof_event_later) {
31224333 dev->isp_sdev.frm_timestamp = ktime_get_ns();
31234334 rkisp_isp_queue_event_sof(&dev->isp_sdev);
4335
+ rkisp_stream_frame_start(dev, isp_mis);
31244336 }
31254337
3126
- if (isp_mis & CIF_ISP_FRAME_IN)
3127
- 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
+
31284352 if (isp_mis & CIF_ISP_FRAME)
31294353 rkisp_check_idle(dev, ISP_FRAME_END);
31304354 }