forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
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);
....@@ -3741,19 +3740,6 @@
37413740 ops->rawaf_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAF));
37423741 }
37433742
3744
-static __maybe_unused
3745
-void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
3746
-{
3747
- struct rkisp_isp_params_v21_ops *ops =
3748
- (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
3749
- struct rkisp_isp_params_val_v21 *priv_val =
3750
- (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
3751
-
3752
- ops->hdrmge_config(params_vdev, &priv_val->last_hdrmge, RKISP_PARAMS_SHD);
3753
-
3754
- ops->hdrdrc_config(params_vdev, &priv_val->last_hdrdrc, RKISP_PARAMS_SHD);
3755
-}
3756
-
37573743 static
37583744 void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev)
37593745 {
....@@ -3794,42 +3780,197 @@
37943780 }
37953781 }
37963782
3783
+static bool
3784
+rkisp_params_check_bigmode_v21(struct rkisp_isp_params_vdev *params_vdev)
3785
+{
3786
+ struct rkisp_device *ispdev = params_vdev->dev;
3787
+ struct device *dev = params_vdev->dev->dev;
3788
+ struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev;
3789
+ struct v4l2_rect *crop = &params_vdev->dev->isp_sdev.in_crop;
3790
+ u32 width = hw->max_in.w, height = hw->max_in.h, size = width * height;
3791
+ u32 bigmode_max_w, bigmode_max_size;
3792
+ int k = 0, idx1[DEV_MAX] = { 0 };
3793
+ int n = 0, idx2[DEV_MAX] = { 0 };
3794
+ int i = 0, j = 0;
3795
+ bool is_bigmode = false;
3796
+
3797
+multi_overflow:
3798
+ if (hw->is_multi_overflow) {
3799
+ ispdev->multi_index = 0;
3800
+ ispdev->multi_mode = 0;
3801
+ bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3802
+ bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3803
+ dev_warn(dev, "over virtual isp max resolution, force to 2 readback\n");
3804
+ goto end;
3805
+ }
3806
+
3807
+ switch (hw->dev_link_num) {
3808
+ case 4:
3809
+ bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3810
+ bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3811
+ ispdev->multi_index = ispdev->dev_id;
3812
+ ispdev->multi_mode = 2;
3813
+ /* internal buf of hw divided to four parts
3814
+ * bigmode nobigmode
3815
+ * _________ max width:1920 max width:960
3816
+ * |_sensor0_| max size:1920*1080 max size:960*540
3817
+ * |_sensor1_| max size:1920*1080 max size:960*540
3818
+ * |_sensor2_| max size:1920*1080 max size:960*540
3819
+ * |_sensor3_| max size:1920*1080 max size:960*540
3820
+ */
3821
+ for (i = 0; i < hw->dev_num; i++) {
3822
+ if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH &&
3823
+ hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE)
3824
+ continue;
3825
+ dev_warn(dev, "isp%d %dx%d over four vir isp max:1920x1080\n",
3826
+ i, hw->isp_size[i].w, hw->isp_size[i].h);
3827
+ hw->is_multi_overflow = true;
3828
+ goto multi_overflow;
3829
+ }
3830
+ break;
3831
+ case 3:
3832
+ bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3833
+ bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3834
+ ispdev->multi_index = ispdev->dev_id;
3835
+ ispdev->multi_mode = 2;
3836
+ /* case0: bigmode nobigmode
3837
+ * _________ max width:1920 max width:960
3838
+ * |_sensor0_| max size:1920*1080 max size:960*540
3839
+ * |_sensor1_| max size:1920*1080 max size:960*540
3840
+ * |_sensor2_| max size:1920*1080 max size:960*540
3841
+ * |_________|
3842
+ *
3843
+ * case1: bigmode special reg cfg
3844
+ * _________ max width:3840
3845
+ * | sensor0 | max size:3840*2160 mode=1 index=0
3846
+ * |_________|
3847
+ * |_sensor1_| max size:1920*1080 mode=2 index=2
3848
+ * |_sensor2_| max size:1920*1080 mode=2 index=3
3849
+ * max width:1920
3850
+ */
3851
+ for (i = 0; i < hw->dev_num; i++) {
3852
+ if (!hw->isp_size[i].size) {
3853
+ if (i < hw->dev_link_num)
3854
+ idx2[n++] = i;
3855
+ continue;
3856
+ }
3857
+ if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH &&
3858
+ hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE)
3859
+ continue;
3860
+ idx1[k++] = i;
3861
+ }
3862
+ if (k) {
3863
+ is_bigmode = true;
3864
+ if (k != 1 ||
3865
+ (hw->isp_size[idx1[0]].size > ISP21_VIR2_MAX_SIZE)) {
3866
+ dev_warn(dev, "isp%d %dx%d over three vir isp max:1920x1080\n",
3867
+ idx1[0], hw->isp_size[idx1[0]].h, hw->isp_size[idx1[0]].w);
3868
+ hw->is_multi_overflow = true;
3869
+ goto multi_overflow;
3870
+ } else {
3871
+ if (idx1[0] == ispdev->dev_id) {
3872
+ ispdev->multi_mode = 1;
3873
+ ispdev->multi_index = 0;
3874
+ } else {
3875
+ ispdev->multi_mode = 2;
3876
+ if (ispdev->multi_index == 0 ||
3877
+ ispdev->multi_index == 1)
3878
+ ispdev->multi_index = 3;
3879
+ }
3880
+ }
3881
+ } else if (ispdev->multi_index >= hw->dev_link_num) {
3882
+ ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num];
3883
+ }
3884
+ break;
3885
+ case 2:
3886
+ bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH;
3887
+ bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE;
3888
+ ispdev->multi_index = ispdev->dev_id;
3889
+ ispdev->multi_mode = 1;
3890
+ /* case0: bigmode nobigmode
3891
+ * _________ max width:3840 max width:1920
3892
+ * | sensor0 | max size:3840*2160 max size:1920*1080
3893
+ * |_________|
3894
+ * | sensor1 | max size:3840*2160 max size:1920*1080
3895
+ * |_________|
3896
+ *
3897
+ * case1: bigmode special reg cfg
3898
+ * _________ max width:4096
3899
+ * | sensor0 | max size: mode=0 index=0
3900
+ * | | 3840*2160+1920*1080
3901
+ * |_________|
3902
+ * |_sensor1_| max size:1920*1080 mode=2 index=3
3903
+ * max width:1920
3904
+ */
3905
+ for (i = 0; i < hw->dev_num; i++) {
3906
+ if (!hw->isp_size[i].size) {
3907
+ if (i < hw->dev_link_num)
3908
+ idx2[n++] = i;
3909
+ continue;
3910
+ }
3911
+ if (hw->isp_size[i].w <= ISP21_VIR2_MAX_WIDTH &&
3912
+ hw->isp_size[i].size <= ISP21_VIR2_MAX_SIZE) {
3913
+ if (hw->isp_size[i].w > ISP21_VIR4_MAX_WIDTH ||
3914
+ hw->isp_size[i].size > ISP21_VIR4_MAX_SIZE)
3915
+ j++;
3916
+ continue;
3917
+ }
3918
+ idx1[k++] = i;
3919
+ }
3920
+ if (k) {
3921
+ is_bigmode = true;
3922
+ if (k == 2 || j ||
3923
+ hw->isp_size[idx1[k - 1]].size > (ISP21_VIR4_MAX_SIZE + ISP21_VIR2_MAX_SIZE)) {
3924
+ dev_warn(dev, "isp%d %dx%d over two vir isp max:3840x2160\n",
3925
+ idx1[k - 1], hw->isp_size[idx1[k - 1]].w, hw->isp_size[idx1[k - 1]].h);
3926
+ hw->is_multi_overflow = true;
3927
+ goto multi_overflow;
3928
+ } else {
3929
+ if (idx1[0] == ispdev->dev_id) {
3930
+ ispdev->multi_mode = 0;
3931
+ ispdev->multi_index = 0;
3932
+ } else {
3933
+ ispdev->multi_mode = 2;
3934
+ ispdev->multi_index = 3;
3935
+ }
3936
+ }
3937
+ } else if (ispdev->multi_index >= hw->dev_link_num) {
3938
+ ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num];
3939
+ }
3940
+ break;
3941
+ default:
3942
+ bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3943
+ bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3944
+ ispdev->multi_mode = 0;
3945
+ ispdev->multi_index = 0;
3946
+ width = crop->width;
3947
+ height = crop->height;
3948
+ size = width * height;
3949
+ break;
3950
+ }
3951
+
3952
+end:
3953
+ if (!is_bigmode &&
3954
+ (width > bigmode_max_w || size > bigmode_max_size))
3955
+ is_bigmode = true;
3956
+
3957
+ return ispdev->is_bigmode = is_bigmode;
3958
+}
3959
+
37973960 /* Not called when the camera active, thus not isr protection. */
37983961 static void
37993962 rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
38003963 {
3801
- struct device *dev = params_vdev->dev->dev;
3964
+ struct rkisp_device *dev = params_vdev->dev;
38023965 struct rkisp_isp_params_val_v21 *priv_val =
38033966 (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
3804
- struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev;
3805
- struct v4l2_rect *out_crop = &params_vdev->dev->isp_sdev.out_crop;
3806
- u32 width = hw->max_in.w ? hw->max_in.w : out_crop->width;
3807
- u32 height = hw->max_in.h ? hw->max_in.h : out_crop->height;
3808
- u32 size = width * height;
3809
- u32 bigmode_max_w, bigmode_max_size;
38103967
3811
- if (hw->dev_num > 2) {
3812
- bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH;
3813
- bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE;
3814
- if (width > ISP21_VIR4_MAX_WIDTH || size > ISP21_VIR4_MAX_SIZE)
3815
- dev_err(dev, "%dx%d > max:3840x2160 for %d virtual isp\n",
3816
- width, height, hw->dev_num);
3817
- } else if (hw->dev_num > 1) {
3818
- bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH;
3819
- bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE;
3820
- if (width > ISP21_VIR2_MAX_WIDTH || size > ISP21_VIR2_MAX_SIZE)
3821
- dev_err(dev, "%dx%d > max:1920x1080 for %d virtual isp\n",
3822
- width, height, hw->dev_num);
3823
- } else {
3824
- bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH;
3825
- bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE;
3826
- }
3827
-
3968
+ dev->is_bigmode = rkisp_params_check_bigmode_v21(params_vdev);
38283969 spin_lock(&params_vdev->config_lock);
38293970 /* override the default things */
38303971 if (!params_vdev->isp21_params->module_cfg_update &&
38313972 !params_vdev->isp21_params->module_en_update)
3832
- dev_warn(dev, "can not get first iq setting in stream on\n");
3973
+ dev_warn(dev->dev, "can not get first iq setting in stream on\n");
38333974
38343975 priv_val->dhaz_en = 0;
38353976 priv_val->wdr_en = 0;
....@@ -3840,16 +3981,10 @@
38403981 __isp_isr_other_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
38413982 __isp_isr_other_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
38423983 __isp_isr_meas_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
3843
- if (width > bigmode_max_w || size > bigmode_max_size) {
3984
+ if (dev->is_bigmode)
38443985 rkisp_set_bits(params_vdev->dev, ISP_CTRL1,
38453986 ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN,
38463987 ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, false);
3847
- }
3848
-
3849
- priv_val->cur_hdrmge = params_vdev->isp21_params->others.hdrmge_cfg;
3850
- priv_val->cur_hdrdrc = params_vdev->isp21_params->others.drc_cfg;
3851
- priv_val->last_hdrmge = priv_val->cur_hdrmge;
3852
- priv_val->last_hdrdrc = priv_val->cur_hdrdrc;
38533988 spin_unlock(&params_vdev->config_lock);
38543989 }
38553990
....@@ -3958,14 +4093,21 @@
39584093 }
39594094 }
39604095
3961
-static void
4096
+static int
39624097 rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev,
39634098 void *size)
39644099 {
39654100 struct rkisp_ldchbuf_size *ldchsize = size;
39664101
39674102 rkisp_deinit_ldch_buf(params_vdev);
3968
- rkisp_init_ldch_buf(params_vdev, ldchsize);
4103
+ return rkisp_init_ldch_buf(params_vdev, ldchsize);
4104
+}
4105
+
4106
+static void
4107
+rkisp_params_free_meshbuf_v21(struct rkisp_isp_params_vdev *params_vdev,
4108
+ u64 module_id)
4109
+{
4110
+ rkisp_deinit_ldch_buf(params_vdev);
39694111 }
39704112
39714113 static void
....@@ -4050,8 +4192,6 @@
40504192 {
40514193 struct isp21_isp_params_cfg *new_params = NULL;
40524194 struct rkisp_buffer *cur_buf = params_vdev->cur_buf;
4053
- struct rkisp_device *dev = params_vdev->dev;
4054
- struct rkisp_hw_dev *hw_dev = dev->hw_dev;
40554195
40564196 spin_lock(&params_vdev->config_lock);
40574197 if (!params_vdev->streamon)
....@@ -4067,10 +4207,14 @@
40674207 list_del(&cur_buf->queue);
40684208 if (list_empty(&params_vdev->params))
40694209 break;
4070
- else if (new_params->module_en_update) {
4210
+ else if (new_params->module_en_update ||
4211
+ (new_params->module_cfg_update & ISP2X_MODULE_FORCE)) {
40714212 /* update en immediately */
4213
+ __isp_isr_meas_config(params_vdev, new_params, type);
4214
+ __isp_isr_other_config(params_vdev, new_params, type);
40724215 __isp_isr_other_en(params_vdev, new_params, type);
40734216 __isp_isr_meas_en(params_vdev, new_params, type);
4217
+ new_params->module_cfg_update = 0;
40744218 }
40754219 if (new_params->module_cfg_update & ISP2X_MODULE_LDCH)
40764220 ldch_data_abandon(params_vdev, new_params);
....@@ -4093,17 +4237,9 @@
40934237 __isp_isr_other_config(params_vdev, new_params, type);
40944238 __isp_isr_other_en(params_vdev, new_params, type);
40954239 __isp_isr_meas_en(params_vdev, new_params, type);
4096
- if (!hw_dev->is_single && type != RKISP_PARAMS_SHD)
4097
- __isp_config_hdrshd(params_vdev);
40984240
40994241 if (type != RKISP_PARAMS_IMD) {
4100
- struct rkisp_isp_params_val_v21 *priv_val =
4101
- (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
4102
-
4103
- priv_val->last_hdrmge = priv_val->cur_hdrmge;
4104
- priv_val->last_hdrdrc = priv_val->cur_hdrdrc;
4105
- priv_val->cur_hdrmge = new_params->others.hdrmge_cfg;
4106
- priv_val->cur_hdrdrc = new_params->others.drc_cfg;
4242
+ new_params->module_cfg_update = 0;
41074243 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
41084244 cur_buf = NULL;
41094245 }
....@@ -4174,8 +4310,10 @@
41744310 .param_cfgsram = rkisp_params_cfgsram_v21,
41754311 .get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x,
41764312 .set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x,
4313
+ .free_meshbuf = rkisp_params_free_meshbuf_v21,
41774314 .stream_stop = rkisp_params_stream_stop_v2x,
41784315 .fop_release = rkisp_params_fop_release_v2x,
4316
+ .check_bigmode = rkisp_params_check_bigmode_v21,
41794317 };
41804318
41814319 int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev)