hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c
....@@ -3324,7 +3324,7 @@
33243324 isp_csm_config(struct rkisp_isp_params_vdev *params_vdev,
33253325 const struct isp21_csm_cfg *arg)
33263326 {
3327
- u32 i, val, eff_ctrl, cproc_ctrl;
3327
+ u32 i, val;
33283328
33293329 for (i = 0; i < ISP21_CSM_COEFF_NUM; i++) {
33303330 if (i == 0)
....@@ -3337,32 +3337,7 @@
33373337 }
33383338
33393339 val = CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA;
3340
- if (arg->csm_full_range) {
3341
- params_vdev->quantization = V4L2_QUANTIZATION_FULL_RANGE;
3342
- isp_param_set_bits(params_vdev, ISP_CTRL, val);
3343
- } else {
3344
- params_vdev->quantization = V4L2_QUANTIZATION_LIM_RANGE;
3345
- isp_param_clear_bits(params_vdev, ISP_CTRL, val);
3346
- }
3347
-
3348
- eff_ctrl = rkisp_ioread32(params_vdev, CIF_IMG_EFF_CTRL);
3349
- if (eff_ctrl & CIF_IMG_EFF_CTRL_ENABLE) {
3350
- if (arg->csm_full_range)
3351
- eff_ctrl |= CIF_IMG_EFF_CTRL_YCBCR_FULL;
3352
- else
3353
- eff_ctrl &= ~CIF_IMG_EFF_CTRL_YCBCR_FULL;
3354
- rkisp_iowrite32(params_vdev, eff_ctrl, CIF_IMG_EFF_CTRL);
3355
- }
3356
-
3357
- cproc_ctrl = rkisp_ioread32(params_vdev, CPROC_CTRL);
3358
- if (cproc_ctrl & CIF_C_PROC_CTR_ENABLE) {
3359
- val = CIF_C_PROC_YOUT_FULL | CIF_C_PROC_YIN_FULL | CIF_C_PROC_COUT_FULL;
3360
- if (eff_ctrl & CIF_IMG_EFF_CTRL_ENABLE || !arg->csm_full_range)
3361
- cproc_ctrl &= ~val;
3362
- else
3363
- cproc_ctrl |= val;
3364
- rkisp_iowrite32(params_vdev, cproc_ctrl, CPROC_CTRL);
3365
- }
3340
+ isp_param_set_bits(params_vdev, ISP_CTRL, val);
33663341 }
33673342
33683343 static void
....@@ -3370,13 +3345,36 @@
33703345 const struct isp21_cgc_cfg *arg)
33713346 {
33723347 u32 val = rkisp_ioread32(params_vdev, ISP_CTRL);
3348
+ u32 eff_ctrl, cproc_ctrl;
33733349
3350
+ params_vdev->quantization = V4L2_QUANTIZATION_FULL_RANGE;
33743351 val &= ~(ISP21_CGC_YUV_LIMIT | ISP21_CGC_RATIO_EN);
3375
- if (arg->yuv_limit)
3352
+ if (arg->yuv_limit) {
33763353 val |= ISP21_CGC_YUV_LIMIT;
3354
+ params_vdev->quantization = V4L2_QUANTIZATION_LIM_RANGE;
3355
+ }
33773356 if (arg->ratio_en)
33783357 val |= ISP21_CGC_RATIO_EN;
33793358 rkisp_iowrite32(params_vdev, val, ISP_CTRL);
3359
+
3360
+ cproc_ctrl = rkisp_ioread32(params_vdev, CPROC_CTRL);
3361
+ if (cproc_ctrl & CIF_C_PROC_CTR_ENABLE) {
3362
+ val = CIF_C_PROC_YOUT_FULL | CIF_C_PROC_YIN_FULL | CIF_C_PROC_COUT_FULL;
3363
+ if (arg->yuv_limit)
3364
+ cproc_ctrl &= ~val;
3365
+ else
3366
+ cproc_ctrl |= val;
3367
+ rkisp_iowrite32(params_vdev, cproc_ctrl, CPROC_CTRL);
3368
+ }
3369
+
3370
+ eff_ctrl = rkisp_ioread32(params_vdev, CIF_IMG_EFF_CTRL);
3371
+ if (eff_ctrl & CIF_IMG_EFF_CTRL_ENABLE) {
3372
+ if (arg->yuv_limit)
3373
+ eff_ctrl &= ~CIF_IMG_EFF_CTRL_YCBCR_FULL;
3374
+ else
3375
+ eff_ctrl |= CIF_IMG_EFF_CTRL_YCBCR_FULL;
3376
+ rkisp_iowrite32(params_vdev, eff_ctrl, CIF_IMG_EFF_CTRL);
3377
+ }
33803378 }
33813379
33823380 struct rkisp_isp_params_v21_ops rkisp_v21_isp_params_ops = {
....@@ -3488,11 +3486,12 @@
34883486 if ((module_cfg_update & ISP2X_MODULE_GOC))
34893487 ops->goc_config(params_vdev, &new_params->others.gammaout_cfg);
34903488
3491
- if ((module_cfg_update & ISP2X_MODULE_CGC))
3492
- ops->cgc_config(params_vdev, &new_params->others.cgc_cfg);
3493
-
3489
+ /* range csm->cgc->cproc->ie */
34943490 if ((module_cfg_update & ISP2X_MODULE_CSM))
34953491 ops->csm_config(params_vdev, &new_params->others.csm_cfg);
3492
+
3493
+ if ((module_cfg_update & ISP2X_MODULE_CGC))
3494
+ ops->cgc_config(params_vdev, &new_params->others.cgc_cfg);
34963495
34973496 if ((module_cfg_update & ISP2X_MODULE_CPROC))
34983497 ops->cproc_config(params_vdev, &new_params->others.cproc_cfg);
....@@ -3649,6 +3648,7 @@
36493648 (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
36503649 u64 module_cfg_update = new_params->module_cfg_update;
36513650
3651
+ params_vdev->cur_frame_id = new_params->frame_id;
36523652 if (type == RKISP_PARAMS_SHD)
36533653 return;
36543654
....@@ -3793,42 +3793,197 @@
37933793 }
37943794 }
37953795
3796
+static bool
3797
+rkisp_params_check_bigmode_v21(struct rkisp_isp_params_vdev *params_vdev)
3798
+{
3799
+ struct rkisp_device *ispdev = params_vdev->dev;
3800
+ struct device *dev = params_vdev->dev->dev;
3801
+ struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev;
3802
+ struct v4l2_rect *crop = &params_vdev->dev->isp_sdev.in_crop;
3803
+ u32 width = hw->max_in.w, height = hw->max_in.h, size = width * height;
3804
+ u32 bigmode_max_w, bigmode_max_size;
3805
+ int k = 0, idx1[DEV_MAX] = { 0 };
3806
+ int n = 0, idx2[DEV_MAX] = { 0 };
3807
+ int i = 0, j = 0;
3808
+ bool is_bigmode = false;
3809
+
3810
+multi_overflow:
3811
+ if (hw->is_multi_overflow) {
3812
+ ispdev->multi_index = 0;
3813
+ ispdev->multi_mode = 0;
3814
+ bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3815
+ bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3816
+ dev_warn(dev, "over virtual isp max resolution, force to 2 readback\n");
3817
+ goto end;
3818
+ }
3819
+
3820
+ switch (hw->dev_link_num) {
3821
+ case 4:
3822
+ bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3823
+ bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3824
+ ispdev->multi_index = ispdev->dev_id;
3825
+ ispdev->multi_mode = 2;
3826
+ /* internal buf of hw divided to four parts
3827
+ * bigmode nobigmode
3828
+ * _________ max width:1920 max width:960
3829
+ * |_sensor0_| max size:1920*1080 max size:960*540
3830
+ * |_sensor1_| max size:1920*1080 max size:960*540
3831
+ * |_sensor2_| max size:1920*1080 max size:960*540
3832
+ * |_sensor3_| max size:1920*1080 max size:960*540
3833
+ */
3834
+ for (i = 0; i < hw->dev_num; i++) {
3835
+ if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH &&
3836
+ hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE)
3837
+ continue;
3838
+ dev_warn(dev, "isp%d %dx%d over four vir isp max:1920x1080\n",
3839
+ i, hw->isp_size[i].w, hw->isp_size[i].h);
3840
+ hw->is_multi_overflow = true;
3841
+ goto multi_overflow;
3842
+ }
3843
+ break;
3844
+ case 3:
3845
+ bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3846
+ bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3847
+ ispdev->multi_index = ispdev->dev_id;
3848
+ ispdev->multi_mode = 2;
3849
+ /* case0: bigmode nobigmode
3850
+ * _________ max width:1920 max width:960
3851
+ * |_sensor0_| max size:1920*1080 max size:960*540
3852
+ * |_sensor1_| max size:1920*1080 max size:960*540
3853
+ * |_sensor2_| max size:1920*1080 max size:960*540
3854
+ * |_________|
3855
+ *
3856
+ * case1: bigmode special reg cfg
3857
+ * _________ max width:3840
3858
+ * | sensor0 | max size:3840*2160 mode=1 index=0
3859
+ * |_________|
3860
+ * |_sensor1_| max size:1920*1080 mode=2 index=2
3861
+ * |_sensor2_| max size:1920*1080 mode=2 index=3
3862
+ * max width:1920
3863
+ */
3864
+ for (i = 0; i < hw->dev_num; i++) {
3865
+ if (!hw->isp_size[i].size) {
3866
+ if (i < hw->dev_link_num)
3867
+ idx2[n++] = i;
3868
+ continue;
3869
+ }
3870
+ if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH &&
3871
+ hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE)
3872
+ continue;
3873
+ idx1[k++] = i;
3874
+ }
3875
+ if (k) {
3876
+ is_bigmode = true;
3877
+ if (k != 1 ||
3878
+ (hw->isp_size[idx1[0]].size > ISP21_VIR2_MAX_SIZE)) {
3879
+ dev_warn(dev, "isp%d %dx%d over three vir isp max:1920x1080\n",
3880
+ idx1[0], hw->isp_size[idx1[0]].h, hw->isp_size[idx1[0]].w);
3881
+ hw->is_multi_overflow = true;
3882
+ goto multi_overflow;
3883
+ } else {
3884
+ if (idx1[0] == ispdev->dev_id) {
3885
+ ispdev->multi_mode = 1;
3886
+ ispdev->multi_index = 0;
3887
+ } else {
3888
+ ispdev->multi_mode = 2;
3889
+ if (ispdev->multi_index == 0 ||
3890
+ ispdev->multi_index == 1)
3891
+ ispdev->multi_index = 3;
3892
+ }
3893
+ }
3894
+ } else if (ispdev->multi_index >= hw->dev_link_num) {
3895
+ ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num];
3896
+ }
3897
+ break;
3898
+ case 2:
3899
+ bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH;
3900
+ bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE;
3901
+ ispdev->multi_index = ispdev->dev_id;
3902
+ ispdev->multi_mode = 1;
3903
+ /* case0: bigmode nobigmode
3904
+ * _________ max width:3840 max width:1920
3905
+ * | sensor0 | max size:3840*2160 max size:1920*1080
3906
+ * |_________|
3907
+ * | sensor1 | max size:3840*2160 max size:1920*1080
3908
+ * |_________|
3909
+ *
3910
+ * case1: bigmode special reg cfg
3911
+ * _________ max width:4096
3912
+ * | sensor0 | max size: mode=0 index=0
3913
+ * | | 3840*2160+1920*1080
3914
+ * |_________|
3915
+ * |_sensor1_| max size:1920*1080 mode=2 index=3
3916
+ * max width:1920
3917
+ */
3918
+ for (i = 0; i < hw->dev_num; i++) {
3919
+ if (!hw->isp_size[i].size) {
3920
+ if (i < hw->dev_link_num)
3921
+ idx2[n++] = i;
3922
+ continue;
3923
+ }
3924
+ if (hw->isp_size[i].w <= ISP21_VIR2_MAX_WIDTH &&
3925
+ hw->isp_size[i].size <= ISP21_VIR2_MAX_SIZE) {
3926
+ if (hw->isp_size[i].w > ISP21_VIR4_MAX_WIDTH ||
3927
+ hw->isp_size[i].size > ISP21_VIR4_MAX_SIZE)
3928
+ j++;
3929
+ continue;
3930
+ }
3931
+ idx1[k++] = i;
3932
+ }
3933
+ if (k) {
3934
+ is_bigmode = true;
3935
+ if (k == 2 || j ||
3936
+ hw->isp_size[idx1[k - 1]].size > (ISP21_VIR4_MAX_SIZE + ISP21_VIR2_MAX_SIZE)) {
3937
+ dev_warn(dev, "isp%d %dx%d over two vir isp max:3840x2160\n",
3938
+ idx1[k - 1], hw->isp_size[idx1[k - 1]].w, hw->isp_size[idx1[k - 1]].h);
3939
+ hw->is_multi_overflow = true;
3940
+ goto multi_overflow;
3941
+ } else {
3942
+ if (idx1[0] == ispdev->dev_id) {
3943
+ ispdev->multi_mode = 0;
3944
+ ispdev->multi_index = 0;
3945
+ } else {
3946
+ ispdev->multi_mode = 2;
3947
+ ispdev->multi_index = 3;
3948
+ }
3949
+ }
3950
+ } else if (ispdev->multi_index >= hw->dev_link_num) {
3951
+ ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num];
3952
+ }
3953
+ break;
3954
+ default:
3955
+ bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3956
+ bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3957
+ ispdev->multi_mode = 0;
3958
+ ispdev->multi_index = 0;
3959
+ width = crop->width;
3960
+ height = crop->height;
3961
+ size = width * height;
3962
+ break;
3963
+ }
3964
+
3965
+end:
3966
+ if (!is_bigmode &&
3967
+ (width > bigmode_max_w || size > bigmode_max_size))
3968
+ is_bigmode = true;
3969
+
3970
+ return ispdev->is_bigmode = is_bigmode;
3971
+}
3972
+
37963973 /* Not called when the camera active, thus not isr protection. */
37973974 static void
37983975 rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
37993976 {
3800
- struct device *dev = params_vdev->dev->dev;
3977
+ struct rkisp_device *dev = params_vdev->dev;
38013978 struct rkisp_isp_params_val_v21 *priv_val =
38023979 (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
3803
- struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev;
3804
- struct v4l2_rect *out_crop = &params_vdev->dev->isp_sdev.out_crop;
3805
- u32 width = hw->max_in.w ? hw->max_in.w : out_crop->width;
3806
- u32 height = hw->max_in.h ? hw->max_in.h : out_crop->height;
3807
- u32 size = width * height;
3808
- u32 bigmode_max_w, bigmode_max_size;
38093980
3810
- if (hw->dev_num > 2) {
3811
- bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3812
- bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3813
- if (width > ISP21_VIR4_MAX_WIDTH || size > ISP21_VIR4_MAX_SIZE)
3814
- dev_err(dev, "%dx%d > max:3840x2160 for %d virtual isp\n",
3815
- width, height, hw->dev_num);
3816
- } else if (hw->dev_num > 1) {
3817
- bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH;
3818
- bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE;
3819
- if (width > ISP21_VIR2_MAX_WIDTH || size > ISP21_VIR2_MAX_SIZE)
3820
- dev_err(dev, "%dx%d > max:1920x1080 for %d virtual isp\n",
3821
- width, height, hw->dev_num);
3822
- } else {
3823
- bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3824
- bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3825
- }
3826
-
3981
+ dev->is_bigmode = rkisp_params_check_bigmode_v21(params_vdev);
38273982 spin_lock(&params_vdev->config_lock);
38283983 /* override the default things */
38293984 if (!params_vdev->isp21_params->module_cfg_update &&
38303985 !params_vdev->isp21_params->module_en_update)
3831
- dev_warn(dev, "can not get first iq setting in stream on\n");
3986
+ dev_warn(dev->dev, "can not get first iq setting in stream on\n");
38323987
38333988 priv_val->dhaz_en = 0;
38343989 priv_val->wdr_en = 0;
....@@ -3839,11 +3994,10 @@
38393994 __isp_isr_other_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
38403995 __isp_isr_other_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
38413996 __isp_isr_meas_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
3842
- if (width > bigmode_max_w || size > bigmode_max_size) {
3997
+ if (dev->is_bigmode)
38433998 rkisp_set_bits(params_vdev->dev, ISP_CTRL1,
38443999 ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN,
38454000 ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, false);
3846
- }
38474001
38484002 priv_val->cur_hdrmge = params_vdev->isp21_params->others.hdrmge_cfg;
38494003 priv_val->cur_hdrdrc = params_vdev->isp21_params->others.drc_cfg;
....@@ -3957,14 +4111,21 @@
39574111 }
39584112 }
39594113
3960
-static void
4114
+static int
39614115 rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev,
39624116 void *size)
39634117 {
39644118 struct rkisp_ldchbuf_size *ldchsize = size;
39654119
39664120 rkisp_deinit_ldch_buf(params_vdev);
3967
- rkisp_init_ldch_buf(params_vdev, ldchsize);
4121
+ return rkisp_init_ldch_buf(params_vdev, ldchsize);
4122
+}
4123
+
4124
+static void
4125
+rkisp_params_free_meshbuf_v21(struct rkisp_isp_params_vdev *params_vdev,
4126
+ u64 module_id)
4127
+{
4128
+ rkisp_deinit_ldch_buf(params_vdev);
39684129 }
39694130
39704131 static void
....@@ -4066,10 +4227,14 @@
40664227 list_del(&cur_buf->queue);
40674228 if (list_empty(&params_vdev->params))
40684229 break;
4069
- else if (new_params->module_en_update) {
4230
+ else if (new_params->module_en_update ||
4231
+ (new_params->module_cfg_update & ISP2X_MODULE_FORCE)) {
40704232 /* update en immediately */
4233
+ __isp_isr_meas_config(params_vdev, new_params, type);
4234
+ __isp_isr_other_config(params_vdev, new_params, type);
40714235 __isp_isr_other_en(params_vdev, new_params, type);
40724236 __isp_isr_meas_en(params_vdev, new_params, type);
4237
+ new_params->module_cfg_update = 0;
40734238 }
40744239 if (new_params->module_cfg_update & ISP2X_MODULE_LDCH)
40754240 ldch_data_abandon(params_vdev, new_params);
....@@ -4103,6 +4268,7 @@
41034268 priv_val->last_hdrdrc = priv_val->cur_hdrdrc;
41044269 priv_val->cur_hdrmge = new_params->others.hdrmge_cfg;
41054270 priv_val->cur_hdrdrc = new_params->others.drc_cfg;
4271
+ new_params->module_cfg_update = 0;
41064272 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
41074273 cur_buf = NULL;
41084274 }
....@@ -4173,8 +4339,10 @@
41734339 .param_cfgsram = rkisp_params_cfgsram_v21,
41744340 .get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x,
41754341 .set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x,
4342
+ .free_meshbuf = rkisp_params_free_meshbuf_v21,
41764343 .stream_stop = rkisp_params_stream_stop_v2x,
41774344 .fop_release = rkisp_params_fop_release_v2x,
4345
+ .check_bigmode = rkisp_params_check_bigmode_v21,
41784346 };
41794347
41804348 int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev)