.. | .. |
---|
460 | 460 | { |
---|
461 | 461 | int i, j; |
---|
462 | 462 | unsigned int sram_addr; |
---|
463 | | - unsigned int data; |
---|
| 463 | + unsigned int data = rkisp_ioread32(params_vdev, ISP_LSC_CTRL); |
---|
464 | 464 | |
---|
465 | | - if (is_check && |
---|
466 | | - !(rkisp_ioread32(params_vdev, ISP_LSC_CTRL) & ISP_LSC_EN)) |
---|
| 465 | + if (is_check && (data & ISP_LSC_LUT_EN || !(data & ISP_LSC_EN))) |
---|
467 | 466 | return; |
---|
468 | 467 | |
---|
469 | 468 | /* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */ |
---|
.. | .. |
---|
603 | 602 | * readback mode lsc lut AHB config to sram, once for single device, |
---|
604 | 603 | * need record to switch for multi-device. |
---|
605 | 604 | */ |
---|
606 | | - if (!IS_HDR_RDBK(dev->rd_mode)) |
---|
| 605 | + if (!IS_HDR_RDBK(dev->rd_mode)) { |
---|
607 | 606 | isp_lsc_matrix_cfg_ddr(params_vdev, arg); |
---|
608 | | - else if (dev->hw_dev->is_single) |
---|
609 | | - isp_lsc_matrix_cfg_sram(params_vdev, arg, false); |
---|
610 | | - else |
---|
| 607 | + } else { |
---|
| 608 | + if (dev->hw_dev->is_single) |
---|
| 609 | + isp_lsc_matrix_cfg_sram(params_vdev, arg, false); |
---|
611 | 610 | params_rec->others.lsc_cfg = *arg; |
---|
| 611 | + } |
---|
612 | 612 | |
---|
613 | 613 | for (i = 0; i < 4; i++) { |
---|
614 | 614 | /* program x size tables */ |
---|
.. | .. |
---|
1178 | 1178 | ISP2X_REG_WR_MASK); |
---|
1179 | 1179 | |
---|
1180 | 1180 | wnd_num_idx = arg->wnd_num; |
---|
| 1181 | + if (wnd_num_idx >= ARRAY_SIZE(ae_wnd_num)) { |
---|
| 1182 | + wnd_num_idx = ARRAY_SIZE(ae_wnd_num) - 1; |
---|
| 1183 | + dev_err(params_vdev->dev->dev, |
---|
| 1184 | + "%s invalid wnd_num:%d, set to %d\n", |
---|
| 1185 | + __func__, arg->wnd_num, wnd_num_idx); |
---|
| 1186 | + } |
---|
1181 | 1187 | value |= ISP2X_RAWAEBIG_WNDNUM_SET(wnd_num_idx); |
---|
1182 | 1188 | |
---|
1183 | 1189 | if (arg->subwin_en[0]) |
---|
.. | .. |
---|
1327 | 1333 | (arg->sw_rawawb_wp_blk_wei_w[5 * i + 1] & 0x3f) << 6 | |
---|
1328 | 1334 | (arg->sw_rawawb_wp_blk_wei_w[5 * i + 2] & 0x3f) << 12 | |
---|
1329 | 1335 | (arg->sw_rawawb_wp_blk_wei_w[5 * i + 3] & 0x3f) << 18 | |
---|
1330 | | - (arg->sw_rawawb_wp_blk_wei_w[5 * i + 4] & 0x3f) << 24, |
---|
1331 | | - rkisp_iowrite32(params_vdev, val, ISP21_RAWAWB_WRAM_DATA_BASE); |
---|
| 1336 | + (arg->sw_rawawb_wp_blk_wei_w[5 * i + 4] & 0x3f) << 24; |
---|
| 1337 | + rkisp_write(params_vdev->dev, ISP21_RAWAWB_WRAM_DATA_BASE, val, true); |
---|
1332 | 1338 | } |
---|
1333 | 1339 | } |
---|
1334 | 1340 | |
---|
.. | .. |
---|
2143 | 2149 | |
---|
2144 | 2150 | if (params_vdev->dev->hw_dev->is_single) |
---|
2145 | 2151 | isp_rawawb_cfg_sram(params_vdev, arg, false); |
---|
2146 | | - else |
---|
2147 | | - memcpy(arg_rec->sw_rawawb_wp_blk_wei_w, |
---|
2148 | | - arg->sw_rawawb_wp_blk_wei_w, |
---|
2149 | | - ISP21_RAWAWB_WEIGHT_NUM); |
---|
| 2152 | + memcpy(arg_rec->sw_rawawb_wp_blk_wei_w, |
---|
| 2153 | + arg->sw_rawawb_wp_blk_wei_w, |
---|
| 2154 | + ISP21_RAWAWB_WEIGHT_NUM); |
---|
2150 | 2155 | |
---|
2151 | 2156 | /* avoid to override the old enable value */ |
---|
2152 | 2157 | value = rkisp_ioread32(params_vdev, ISP21_RAWAWB_CTRL); |
---|
.. | .. |
---|
2292 | 2297 | return; |
---|
2293 | 2298 | |
---|
2294 | 2299 | wnd_num_idx = arg->wnd_num; |
---|
| 2300 | + if (wnd_num_idx >= ARRAY_SIZE(hist_wnd_num)) { |
---|
| 2301 | + wnd_num_idx = ARRAY_SIZE(hist_wnd_num) - 1; |
---|
| 2302 | + dev_err(params_vdev->dev->dev, |
---|
| 2303 | + "%s invalid wnd_num:%d, set to %d\n", |
---|
| 2304 | + __func__, arg->wnd_num, wnd_num_idx); |
---|
| 2305 | + } |
---|
2295 | 2306 | memset(weight15x15, 0, sizeof(weight15x15)); |
---|
2296 | 2307 | for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) { |
---|
2297 | 2308 | for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) { |
---|
.. | .. |
---|
2339 | 2350 | } |
---|
2340 | 2351 | |
---|
2341 | 2352 | wnd_num_idx = arg->wnd_num; |
---|
| 2353 | + if (wnd_num_idx >= ARRAY_SIZE(hist_wnd_num)) { |
---|
| 2354 | + wnd_num_idx = ARRAY_SIZE(hist_wnd_num) - 1; |
---|
| 2355 | + dev_err(params_vdev->dev->dev, |
---|
| 2356 | + "%s invalid wnd_num:%d, set to %d\n", |
---|
| 2357 | + __func__, arg->wnd_num, wnd_num_idx); |
---|
| 2358 | + } |
---|
2342 | 2359 | /* avoid to override the old enable value */ |
---|
2343 | 2360 | hist_ctrl = rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL); |
---|
2344 | 2361 | hist_ctrl &= ISP2X_RAWHSTBIG_CTRL_EN_MASK; |
---|
.. | .. |
---|
2370 | 2387 | |
---|
2371 | 2388 | if (dev->hw_dev->is_single) |
---|
2372 | 2389 | isp_rawhstbig_cfg_sram(params_vdev, arg, blk_no, false); |
---|
2373 | | - else |
---|
2374 | | - *arg_rec = *arg; |
---|
| 2390 | + *arg_rec = *arg; |
---|
2375 | 2391 | } |
---|
2376 | 2392 | |
---|
2377 | 2393 | static void |
---|
.. | .. |
---|
3324 | 3340 | isp_csm_config(struct rkisp_isp_params_vdev *params_vdev, |
---|
3325 | 3341 | const struct isp21_csm_cfg *arg) |
---|
3326 | 3342 | { |
---|
3327 | | - u32 i, val, eff_ctrl, cproc_ctrl; |
---|
| 3343 | + u32 i, val; |
---|
3328 | 3344 | |
---|
3329 | 3345 | for (i = 0; i < ISP21_CSM_COEFF_NUM; i++) { |
---|
3330 | 3346 | if (i == 0) |
---|
.. | .. |
---|
3337 | 3353 | } |
---|
3338 | 3354 | |
---|
3339 | 3355 | 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 | | - } |
---|
| 3356 | + isp_param_set_bits(params_vdev, ISP_CTRL, val); |
---|
3366 | 3357 | } |
---|
3367 | 3358 | |
---|
3368 | 3359 | static void |
---|
.. | .. |
---|
3370 | 3361 | const struct isp21_cgc_cfg *arg) |
---|
3371 | 3362 | { |
---|
3372 | 3363 | u32 val = rkisp_ioread32(params_vdev, ISP_CTRL); |
---|
| 3364 | + u32 eff_ctrl, cproc_ctrl; |
---|
3373 | 3365 | |
---|
| 3366 | + params_vdev->quantization = V4L2_QUANTIZATION_FULL_RANGE; |
---|
3374 | 3367 | val &= ~(ISP21_CGC_YUV_LIMIT | ISP21_CGC_RATIO_EN); |
---|
3375 | | - if (arg->yuv_limit) |
---|
| 3368 | + if (arg->yuv_limit) { |
---|
3376 | 3369 | val |= ISP21_CGC_YUV_LIMIT; |
---|
| 3370 | + params_vdev->quantization = V4L2_QUANTIZATION_LIM_RANGE; |
---|
| 3371 | + } |
---|
3377 | 3372 | if (arg->ratio_en) |
---|
3378 | 3373 | val |= ISP21_CGC_RATIO_EN; |
---|
3379 | 3374 | rkisp_iowrite32(params_vdev, val, ISP_CTRL); |
---|
| 3375 | + |
---|
| 3376 | + cproc_ctrl = rkisp_ioread32(params_vdev, CPROC_CTRL); |
---|
| 3377 | + if (cproc_ctrl & CIF_C_PROC_CTR_ENABLE) { |
---|
| 3378 | + val = CIF_C_PROC_YOUT_FULL | CIF_C_PROC_YIN_FULL | CIF_C_PROC_COUT_FULL; |
---|
| 3379 | + if (arg->yuv_limit) |
---|
| 3380 | + cproc_ctrl &= ~val; |
---|
| 3381 | + else |
---|
| 3382 | + cproc_ctrl |= val; |
---|
| 3383 | + rkisp_iowrite32(params_vdev, cproc_ctrl, CPROC_CTRL); |
---|
| 3384 | + } |
---|
| 3385 | + |
---|
| 3386 | + eff_ctrl = rkisp_ioread32(params_vdev, CIF_IMG_EFF_CTRL); |
---|
| 3387 | + if (eff_ctrl & CIF_IMG_EFF_CTRL_ENABLE) { |
---|
| 3388 | + if (arg->yuv_limit) |
---|
| 3389 | + eff_ctrl &= ~CIF_IMG_EFF_CTRL_YCBCR_FULL; |
---|
| 3390 | + else |
---|
| 3391 | + eff_ctrl |= CIF_IMG_EFF_CTRL_YCBCR_FULL; |
---|
| 3392 | + rkisp_iowrite32(params_vdev, eff_ctrl, CIF_IMG_EFF_CTRL); |
---|
| 3393 | + } |
---|
3380 | 3394 | } |
---|
3381 | 3395 | |
---|
3382 | 3396 | struct rkisp_isp_params_v21_ops rkisp_v21_isp_params_ops = { |
---|
.. | .. |
---|
3488 | 3502 | if ((module_cfg_update & ISP2X_MODULE_GOC)) |
---|
3489 | 3503 | ops->goc_config(params_vdev, &new_params->others.gammaout_cfg); |
---|
3490 | 3504 | |
---|
3491 | | - if ((module_cfg_update & ISP2X_MODULE_CGC)) |
---|
3492 | | - ops->cgc_config(params_vdev, &new_params->others.cgc_cfg); |
---|
3493 | | - |
---|
| 3505 | + /* range csm->cgc->cproc->ie */ |
---|
3494 | 3506 | if ((module_cfg_update & ISP2X_MODULE_CSM)) |
---|
3495 | 3507 | ops->csm_config(params_vdev, &new_params->others.csm_cfg); |
---|
| 3508 | + |
---|
| 3509 | + if ((module_cfg_update & ISP2X_MODULE_CGC)) |
---|
| 3510 | + ops->cgc_config(params_vdev, &new_params->others.cgc_cfg); |
---|
3496 | 3511 | |
---|
3497 | 3512 | if ((module_cfg_update & ISP2X_MODULE_CPROC)) |
---|
3498 | 3513 | ops->cproc_config(params_vdev, &new_params->others.cproc_cfg); |
---|
.. | .. |
---|
3649 | 3664 | (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops; |
---|
3650 | 3665 | u64 module_cfg_update = new_params->module_cfg_update; |
---|
3651 | 3666 | |
---|
| 3667 | + params_vdev->cur_frame_id = new_params->frame_id; |
---|
3652 | 3668 | if (type == RKISP_PARAMS_SHD) |
---|
3653 | 3669 | return; |
---|
3654 | 3670 | |
---|
.. | .. |
---|
3740 | 3756 | ops->rawaf_enable(params_vdev, !!(module_ens & ISP2X_MODULE_RAWAF)); |
---|
3741 | 3757 | } |
---|
3742 | 3758 | |
---|
3743 | | -static __maybe_unused |
---|
3744 | | -void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev) |
---|
3745 | | -{ |
---|
3746 | | - struct rkisp_isp_params_v21_ops *ops = |
---|
3747 | | - (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops; |
---|
3748 | | - struct rkisp_isp_params_val_v21 *priv_val = |
---|
3749 | | - (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; |
---|
3750 | | - |
---|
3751 | | - ops->hdrmge_config(params_vdev, &priv_val->last_hdrmge, RKISP_PARAMS_SHD); |
---|
3752 | | - |
---|
3753 | | - ops->hdrdrc_config(params_vdev, &priv_val->last_hdrdrc, RKISP_PARAMS_SHD); |
---|
3754 | | -} |
---|
3755 | | - |
---|
3756 | 3759 | static |
---|
3757 | 3760 | void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev) |
---|
3758 | 3761 | { |
---|
.. | .. |
---|
3793 | 3796 | } |
---|
3794 | 3797 | } |
---|
3795 | 3798 | |
---|
| 3799 | +static bool |
---|
| 3800 | +rkisp_params_check_bigmode_v21(struct rkisp_isp_params_vdev *params_vdev) |
---|
| 3801 | +{ |
---|
| 3802 | + struct rkisp_device *ispdev = params_vdev->dev; |
---|
| 3803 | + struct device *dev = params_vdev->dev->dev; |
---|
| 3804 | + struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev; |
---|
| 3805 | + struct v4l2_rect *crop = ¶ms_vdev->dev->isp_sdev.in_crop; |
---|
| 3806 | + u32 width = hw->max_in.w, height = hw->max_in.h, size = width * height; |
---|
| 3807 | + u32 bigmode_max_w, bigmode_max_size; |
---|
| 3808 | + int k = 0, idx1[DEV_MAX] = { 0 }; |
---|
| 3809 | + int n = 0, idx2[DEV_MAX] = { 0 }; |
---|
| 3810 | + int i = 0, j = 0; |
---|
| 3811 | + bool is_bigmode = false; |
---|
| 3812 | + |
---|
| 3813 | +multi_overflow: |
---|
| 3814 | + if (hw->is_multi_overflow) { |
---|
| 3815 | + ispdev->multi_index = 0; |
---|
| 3816 | + ispdev->multi_mode = 0; |
---|
| 3817 | + bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH; |
---|
| 3818 | + bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE; |
---|
| 3819 | + dev_warn(dev, "over virtual isp max resolution, force to 2 readback\n"); |
---|
| 3820 | + goto end; |
---|
| 3821 | + } |
---|
| 3822 | + |
---|
| 3823 | + switch (hw->dev_link_num) { |
---|
| 3824 | + case 4: |
---|
| 3825 | + bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH; |
---|
| 3826 | + bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE; |
---|
| 3827 | + ispdev->multi_index = ispdev->dev_id; |
---|
| 3828 | + ispdev->multi_mode = 2; |
---|
| 3829 | + /* internal buf of hw divided to four parts |
---|
| 3830 | + * bigmode nobigmode |
---|
| 3831 | + * _________ max width:1920 max width:960 |
---|
| 3832 | + * |_sensor0_| max size:1920*1080 max size:960*540 |
---|
| 3833 | + * |_sensor1_| max size:1920*1080 max size:960*540 |
---|
| 3834 | + * |_sensor2_| max size:1920*1080 max size:960*540 |
---|
| 3835 | + * |_sensor3_| max size:1920*1080 max size:960*540 |
---|
| 3836 | + */ |
---|
| 3837 | + for (i = 0; i < hw->dev_num; i++) { |
---|
| 3838 | + if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH && |
---|
| 3839 | + hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE) |
---|
| 3840 | + continue; |
---|
| 3841 | + dev_warn(dev, "isp%d %dx%d over four vir isp max:1920x1080\n", |
---|
| 3842 | + i, hw->isp_size[i].w, hw->isp_size[i].h); |
---|
| 3843 | + hw->is_multi_overflow = true; |
---|
| 3844 | + goto multi_overflow; |
---|
| 3845 | + } |
---|
| 3846 | + break; |
---|
| 3847 | + case 3: |
---|
| 3848 | + bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH; |
---|
| 3849 | + bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE; |
---|
| 3850 | + ispdev->multi_index = ispdev->dev_id; |
---|
| 3851 | + ispdev->multi_mode = 2; |
---|
| 3852 | + /* case0: bigmode nobigmode |
---|
| 3853 | + * _________ max width:1920 max width:960 |
---|
| 3854 | + * |_sensor0_| max size:1920*1080 max size:960*540 |
---|
| 3855 | + * |_sensor1_| max size:1920*1080 max size:960*540 |
---|
| 3856 | + * |_sensor2_| max size:1920*1080 max size:960*540 |
---|
| 3857 | + * |_________| |
---|
| 3858 | + * |
---|
| 3859 | + * case1: bigmode special reg cfg |
---|
| 3860 | + * _________ max width:3840 |
---|
| 3861 | + * | sensor0 | max size:3840*2160 mode=1 index=0 |
---|
| 3862 | + * |_________| |
---|
| 3863 | + * |_sensor1_| max size:1920*1080 mode=2 index=2 |
---|
| 3864 | + * |_sensor2_| max size:1920*1080 mode=2 index=3 |
---|
| 3865 | + * max width:1920 |
---|
| 3866 | + */ |
---|
| 3867 | + for (i = 0; i < hw->dev_num; i++) { |
---|
| 3868 | + if (!hw->isp_size[i].size) { |
---|
| 3869 | + if (i < hw->dev_link_num) |
---|
| 3870 | + idx2[n++] = i; |
---|
| 3871 | + continue; |
---|
| 3872 | + } |
---|
| 3873 | + if (hw->isp_size[i].w <= ISP21_VIR4_MAX_WIDTH && |
---|
| 3874 | + hw->isp_size[i].size <= ISP21_VIR4_MAX_SIZE) |
---|
| 3875 | + continue; |
---|
| 3876 | + idx1[k++] = i; |
---|
| 3877 | + } |
---|
| 3878 | + if (k) { |
---|
| 3879 | + is_bigmode = true; |
---|
| 3880 | + if (k != 1 || |
---|
| 3881 | + (hw->isp_size[idx1[0]].size > ISP21_VIR2_MAX_SIZE)) { |
---|
| 3882 | + dev_warn(dev, "isp%d %dx%d over three vir isp max:1920x1080\n", |
---|
| 3883 | + idx1[0], hw->isp_size[idx1[0]].h, hw->isp_size[idx1[0]].w); |
---|
| 3884 | + hw->is_multi_overflow = true; |
---|
| 3885 | + goto multi_overflow; |
---|
| 3886 | + } else { |
---|
| 3887 | + if (idx1[0] == ispdev->dev_id) { |
---|
| 3888 | + ispdev->multi_mode = 1; |
---|
| 3889 | + ispdev->multi_index = 0; |
---|
| 3890 | + } else { |
---|
| 3891 | + ispdev->multi_mode = 2; |
---|
| 3892 | + if (ispdev->multi_index == 0 || |
---|
| 3893 | + ispdev->multi_index == 1) |
---|
| 3894 | + ispdev->multi_index = 3; |
---|
| 3895 | + } |
---|
| 3896 | + } |
---|
| 3897 | + } else if (ispdev->multi_index >= hw->dev_link_num) { |
---|
| 3898 | + ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num]; |
---|
| 3899 | + } |
---|
| 3900 | + break; |
---|
| 3901 | + case 2: |
---|
| 3902 | + bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH; |
---|
| 3903 | + bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE; |
---|
| 3904 | + ispdev->multi_index = ispdev->dev_id; |
---|
| 3905 | + ispdev->multi_mode = 1; |
---|
| 3906 | + /* case0: bigmode nobigmode |
---|
| 3907 | + * _________ max width:3840 max width:1920 |
---|
| 3908 | + * | sensor0 | max size:3840*2160 max size:1920*1080 |
---|
| 3909 | + * |_________| |
---|
| 3910 | + * | sensor1 | max size:3840*2160 max size:1920*1080 |
---|
| 3911 | + * |_________| |
---|
| 3912 | + * |
---|
| 3913 | + * case1: bigmode special reg cfg |
---|
| 3914 | + * _________ max width:4096 |
---|
| 3915 | + * | sensor0 | max size: mode=0 index=0 |
---|
| 3916 | + * | | 3840*2160+1920*1080 |
---|
| 3917 | + * |_________| |
---|
| 3918 | + * |_sensor1_| max size:1920*1080 mode=2 index=3 |
---|
| 3919 | + * max width:1920 |
---|
| 3920 | + */ |
---|
| 3921 | + for (i = 0; i < hw->dev_num; i++) { |
---|
| 3922 | + if (!hw->isp_size[i].size) { |
---|
| 3923 | + if (i < hw->dev_link_num) |
---|
| 3924 | + idx2[n++] = i; |
---|
| 3925 | + continue; |
---|
| 3926 | + } |
---|
| 3927 | + if (hw->isp_size[i].w <= ISP21_VIR2_MAX_WIDTH && |
---|
| 3928 | + hw->isp_size[i].size <= ISP21_VIR2_MAX_SIZE) { |
---|
| 3929 | + if (hw->isp_size[i].w > ISP21_VIR4_MAX_WIDTH || |
---|
| 3930 | + hw->isp_size[i].size > ISP21_VIR4_MAX_SIZE) |
---|
| 3931 | + j++; |
---|
| 3932 | + continue; |
---|
| 3933 | + } |
---|
| 3934 | + idx1[k++] = i; |
---|
| 3935 | + } |
---|
| 3936 | + if (k) { |
---|
| 3937 | + is_bigmode = true; |
---|
| 3938 | + if (k == 2 || j || |
---|
| 3939 | + hw->isp_size[idx1[k - 1]].size > (ISP21_VIR4_MAX_SIZE + ISP21_VIR2_MAX_SIZE)) { |
---|
| 3940 | + dev_warn(dev, "isp%d %dx%d over two vir isp max:3840x2160\n", |
---|
| 3941 | + idx1[k - 1], hw->isp_size[idx1[k - 1]].w, hw->isp_size[idx1[k - 1]].h); |
---|
| 3942 | + hw->is_multi_overflow = true; |
---|
| 3943 | + goto multi_overflow; |
---|
| 3944 | + } else { |
---|
| 3945 | + if (idx1[0] == ispdev->dev_id) { |
---|
| 3946 | + ispdev->multi_mode = 0; |
---|
| 3947 | + ispdev->multi_index = 0; |
---|
| 3948 | + } else { |
---|
| 3949 | + ispdev->multi_mode = 2; |
---|
| 3950 | + ispdev->multi_index = 3; |
---|
| 3951 | + } |
---|
| 3952 | + } |
---|
| 3953 | + } else if (ispdev->multi_index >= hw->dev_link_num) { |
---|
| 3954 | + ispdev->multi_index = idx2[ispdev->multi_index - hw->dev_link_num]; |
---|
| 3955 | + } |
---|
| 3956 | + break; |
---|
| 3957 | + default: |
---|
| 3958 | + bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH; |
---|
| 3959 | + bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE; |
---|
| 3960 | + ispdev->multi_mode = 0; |
---|
| 3961 | + ispdev->multi_index = 0; |
---|
| 3962 | + width = crop->width; |
---|
| 3963 | + height = crop->height; |
---|
| 3964 | + size = width * height; |
---|
| 3965 | + break; |
---|
| 3966 | + } |
---|
| 3967 | + |
---|
| 3968 | +end: |
---|
| 3969 | + if (!is_bigmode && |
---|
| 3970 | + (width > bigmode_max_w || size > bigmode_max_size)) |
---|
| 3971 | + is_bigmode = true; |
---|
| 3972 | + |
---|
| 3973 | + return ispdev->is_bigmode = is_bigmode; |
---|
| 3974 | +} |
---|
| 3975 | + |
---|
3796 | 3976 | /* Not called when the camera active, thus not isr protection. */ |
---|
3797 | 3977 | static void |
---|
3798 | 3978 | rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) |
---|
3799 | 3979 | { |
---|
3800 | | - struct device *dev = params_vdev->dev->dev; |
---|
| 3980 | + struct rkisp_device *dev = params_vdev->dev; |
---|
3801 | 3981 | struct rkisp_isp_params_val_v21 *priv_val = |
---|
3802 | 3982 | (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 = ¶ms_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; |
---|
3809 | 3983 | |
---|
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 | | - |
---|
| 3984 | + dev->is_bigmode = rkisp_params_check_bigmode_v21(params_vdev); |
---|
3827 | 3985 | spin_lock(¶ms_vdev->config_lock); |
---|
3828 | 3986 | /* override the default things */ |
---|
3829 | 3987 | if (!params_vdev->isp21_params->module_cfg_update && |
---|
3830 | 3988 | !params_vdev->isp21_params->module_en_update) |
---|
3831 | | - dev_warn(dev, "can not get first iq setting in stream on\n"); |
---|
| 3989 | + dev_warn(dev->dev, "can not get first iq setting in stream on\n"); |
---|
3832 | 3990 | |
---|
3833 | 3991 | priv_val->dhaz_en = 0; |
---|
3834 | 3992 | priv_val->wdr_en = 0; |
---|
.. | .. |
---|
3839 | 3997 | __isp_isr_other_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); |
---|
3840 | 3998 | __isp_isr_other_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); |
---|
3841 | 3999 | __isp_isr_meas_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); |
---|
3842 | | - if (width > bigmode_max_w || size > bigmode_max_size) { |
---|
| 4000 | + if (dev->is_bigmode) |
---|
3843 | 4001 | rkisp_set_bits(params_vdev->dev, ISP_CTRL1, |
---|
3844 | 4002 | ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, |
---|
3845 | 4003 | ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, false); |
---|
3846 | | - } |
---|
3847 | | - |
---|
3848 | | - priv_val->cur_hdrmge = params_vdev->isp21_params->others.hdrmge_cfg; |
---|
3849 | | - priv_val->cur_hdrdrc = params_vdev->isp21_params->others.drc_cfg; |
---|
3850 | | - priv_val->last_hdrmge = priv_val->cur_hdrmge; |
---|
3851 | | - priv_val->last_hdrdrc = priv_val->cur_hdrdrc; |
---|
3852 | 4004 | spin_unlock(¶ms_vdev->config_lock); |
---|
3853 | 4005 | } |
---|
3854 | 4006 | |
---|
.. | .. |
---|
3957 | 4109 | } |
---|
3958 | 4110 | } |
---|
3959 | 4111 | |
---|
3960 | | -static void |
---|
| 4112 | +static int |
---|
3961 | 4113 | rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev, |
---|
3962 | 4114 | void *size) |
---|
3963 | 4115 | { |
---|
3964 | 4116 | struct rkisp_ldchbuf_size *ldchsize = size; |
---|
3965 | 4117 | |
---|
3966 | 4118 | rkisp_deinit_ldch_buf(params_vdev); |
---|
3967 | | - rkisp_init_ldch_buf(params_vdev, ldchsize); |
---|
| 4119 | + return rkisp_init_ldch_buf(params_vdev, ldchsize); |
---|
| 4120 | +} |
---|
| 4121 | + |
---|
| 4122 | +static void |
---|
| 4123 | +rkisp_params_free_meshbuf_v21(struct rkisp_isp_params_vdev *params_vdev, |
---|
| 4124 | + u64 module_id) |
---|
| 4125 | +{ |
---|
| 4126 | + rkisp_deinit_ldch_buf(params_vdev); |
---|
3968 | 4127 | } |
---|
3969 | 4128 | |
---|
3970 | 4129 | static void |
---|
.. | .. |
---|
4049 | 4208 | { |
---|
4050 | 4209 | struct isp21_isp_params_cfg *new_params = NULL; |
---|
4051 | 4210 | struct rkisp_buffer *cur_buf = params_vdev->cur_buf; |
---|
4052 | | - struct rkisp_device *dev = params_vdev->dev; |
---|
4053 | | - struct rkisp_hw_dev *hw_dev = dev->hw_dev; |
---|
4054 | 4211 | |
---|
4055 | 4212 | spin_lock(¶ms_vdev->config_lock); |
---|
4056 | 4213 | if (!params_vdev->streamon) |
---|
.. | .. |
---|
4066 | 4223 | list_del(&cur_buf->queue); |
---|
4067 | 4224 | if (list_empty(¶ms_vdev->params)) |
---|
4068 | 4225 | break; |
---|
4069 | | - else if (new_params->module_en_update) { |
---|
| 4226 | + else if (new_params->module_en_update || |
---|
| 4227 | + (new_params->module_cfg_update & ISP2X_MODULE_FORCE)) { |
---|
4070 | 4228 | /* update en immediately */ |
---|
| 4229 | + __isp_isr_meas_config(params_vdev, new_params, type); |
---|
| 4230 | + __isp_isr_other_config(params_vdev, new_params, type); |
---|
4071 | 4231 | __isp_isr_other_en(params_vdev, new_params, type); |
---|
4072 | 4232 | __isp_isr_meas_en(params_vdev, new_params, type); |
---|
| 4233 | + new_params->module_cfg_update = 0; |
---|
4073 | 4234 | } |
---|
4074 | 4235 | if (new_params->module_cfg_update & ISP2X_MODULE_LDCH) |
---|
4075 | 4236 | ldch_data_abandon(params_vdev, new_params); |
---|
.. | .. |
---|
4092 | 4253 | __isp_isr_other_config(params_vdev, new_params, type); |
---|
4093 | 4254 | __isp_isr_other_en(params_vdev, new_params, type); |
---|
4094 | 4255 | __isp_isr_meas_en(params_vdev, new_params, type); |
---|
4095 | | - if (!hw_dev->is_single && type != RKISP_PARAMS_SHD) |
---|
4096 | | - __isp_config_hdrshd(params_vdev); |
---|
4097 | 4256 | |
---|
4098 | 4257 | if (type != RKISP_PARAMS_IMD) { |
---|
4099 | | - struct rkisp_isp_params_val_v21 *priv_val = |
---|
4100 | | - (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; |
---|
4101 | | - |
---|
4102 | | - priv_val->last_hdrmge = priv_val->cur_hdrmge; |
---|
4103 | | - priv_val->last_hdrdrc = priv_val->cur_hdrdrc; |
---|
4104 | | - priv_val->cur_hdrmge = new_params->others.hdrmge_cfg; |
---|
4105 | | - priv_val->cur_hdrdrc = new_params->others.drc_cfg; |
---|
| 4258 | + new_params->module_cfg_update = 0; |
---|
4106 | 4259 | vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); |
---|
4107 | 4260 | cur_buf = NULL; |
---|
4108 | 4261 | } |
---|
.. | .. |
---|
4173 | 4326 | .param_cfgsram = rkisp_params_cfgsram_v21, |
---|
4174 | 4327 | .get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x, |
---|
4175 | 4328 | .set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x, |
---|
| 4329 | + .free_meshbuf = rkisp_params_free_meshbuf_v21, |
---|
4176 | 4330 | .stream_stop = rkisp_params_stream_stop_v2x, |
---|
4177 | 4331 | .fop_release = rkisp_params_fop_release_v2x, |
---|
| 4332 | + .check_bigmode = rkisp_params_check_bigmode_v21, |
---|
4178 | 4333 | }; |
---|
4179 | 4334 | |
---|
4180 | 4335 | int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev) |
---|
.. | .. |
---|
4200 | 4355 | ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]); |
---|
4201 | 4356 | if (ret) { |
---|
4202 | 4357 | dev_err(dev, "can not alloc buffer\n"); |
---|
4203 | | - goto err; |
---|
| 4358 | + goto err_3dlut; |
---|
4204 | 4359 | } |
---|
4205 | 4360 | } |
---|
4206 | 4361 | |
---|
.. | .. |
---|
4211 | 4366 | ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); |
---|
4212 | 4367 | if (ret) { |
---|
4213 | 4368 | dev_err(dev, "can not alloc buffer\n"); |
---|
4214 | | - goto err; |
---|
| 4369 | + goto err_lsclut; |
---|
4215 | 4370 | } |
---|
4216 | 4371 | } |
---|
4217 | 4372 | |
---|
.. | .. |
---|
4220 | 4375 | params_vdev->priv_ops = &rkisp_v21_isp_params_ops; |
---|
4221 | 4376 | rkisp_clear_first_param_v2x(params_vdev); |
---|
4222 | 4377 | return 0; |
---|
4223 | | - |
---|
4224 | | -err: |
---|
4225 | | - for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) |
---|
| 4378 | +err_lsclut: |
---|
| 4379 | + for (i -= 1; i >= 0; i--) |
---|
| 4380 | + rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); |
---|
| 4381 | + i = RKISP_PARAM_3DLUT_BUF_NUM; |
---|
| 4382 | +err_3dlut: |
---|
| 4383 | + for (i -= 1; i >= 0; i--) |
---|
4226 | 4384 | rkisp_free_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]); |
---|
4227 | 4385 | |
---|
4228 | | - for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) |
---|
4229 | | - rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]); |
---|
4230 | 4386 | vfree(params_vdev->isp21_params); |
---|
4231 | | - |
---|
| 4387 | + kfree(priv_val); |
---|
4232 | 4388 | return ret; |
---|
4233 | 4389 | } |
---|
4234 | 4390 | |
---|