From c4c4ef6660ee87673918162000a9cf4c148f5874 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Sat, 19 Feb 2022 11:25:58 +0800 Subject: [PATCH] media: rockchip: isp: fix bigmode for multi device for isp21 Change-Id: If9b82e58081c1c09f0a0d387e7cafeed86d25f05 Signed-off-by: Cai YiWei --- .../platform/rockchip/isp/isp_params_v21.c | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index 64a5fb49064c..0df89d694bad 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -20,17 +20,17 @@ (((a) & 0xFFFF) << 0 | ((b) & 0xFFFF) << 16) #define ISP2X_REG_WR_MASK BIT(31) //disable write protect -#define ISP2X_NOBIG_OVERFLOW_SIZE (2688 * 1536) -#define ISP2X_AUTO_BIGMODE_WIDTH 2688 +#define ISP21_NOBIG_OVERFLOW_SIZE (2688 * 1536) +#define ISP21_AUTO_BIGMODE_WIDTH 2688 +#define ISP21_VIR2_NOBIG_OVERFLOW_SIZE (1920 * 1080) +#define ISP21_VIR2_AUTO_BIGMODE_WIDTH 1920 +#define ISP21_VIR4_NOBIG_OVERFLOW_SIZE (960 * 540) +#define ISP21_VIR4_AUTO_BIGMODE_WIDTH 960 -static inline size_t -isp_param_get_insize(struct rkisp_isp_params_vdev *params_vdev) -{ - struct rkisp_device *dev = params_vdev->dev; - struct rkisp_isp_subdev *isp_sdev = &dev->isp_sdev; - - return isp_sdev->in_crop.width * isp_sdev->in_crop.height; -} +#define ISP21_VIR2_MAX_WIDTH 3840 +#define ISP21_VIR2_MAX_SIZE (3840 * 2160) +#define ISP21_VIR4_MAX_WIDTH 1920 +#define ISP21_VIR4_MAX_SIZE (1920 * 1080) static void isp_dpcc_config(struct rkisp_isp_params_vdev *params_vdev, @@ -3819,7 +3819,26 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) struct rkisp_hw_dev *hw = params_vdev->dev->hw_dev; struct v4l2_rect *out_crop = ¶ms_vdev->dev->isp_sdev.out_crop; u32 width = hw->max_in.w ? hw->max_in.w : out_crop->width; - u32 size = hw->max_in.w ? hw->max_in.w * hw->max_in.h : isp_param_get_insize(params_vdev); + u32 height = hw->max_in.h ? hw->max_in.h : out_crop->height; + u32 size = width * height; + u32 bigmode_max_w, bigmode_max_size; + + if (hw->dev_link_num > 2) { + bigmode_max_w = ISP21_VIR4_AUTO_BIGMODE_WIDTH; + bigmode_max_size = ISP21_VIR4_NOBIG_OVERFLOW_SIZE; + if (width > ISP21_VIR4_MAX_WIDTH || size > ISP21_VIR4_MAX_SIZE) + dev_err(dev, "%dx%d > max:3840x2160 for %d virtual isp\n", + width, height, hw->dev_link_num); + } else if (hw->dev_link_num > 1) { + bigmode_max_w = ISP21_VIR2_AUTO_BIGMODE_WIDTH; + bigmode_max_size = ISP21_VIR2_NOBIG_OVERFLOW_SIZE; + if (width > ISP21_VIR2_MAX_WIDTH || size > ISP21_VIR2_MAX_SIZE) + dev_err(dev, "%dx%d > max:1920x1080 for %d virtual isp\n", + width, height, hw->dev_link_num); + } else { + bigmode_max_w = ISP21_AUTO_BIGMODE_WIDTH; + bigmode_max_size = ISP21_NOBIG_OVERFLOW_SIZE; + } rkisp_alloc_internal_buf(params_vdev, params_vdev->isp21_params); spin_lock(¶ms_vdev->config_lock); @@ -3837,7 +3856,7 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) __isp_isr_other_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); __isp_isr_other_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); __isp_isr_meas_en(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL); - if (width <= ISP2X_AUTO_BIGMODE_WIDTH && size > ISP2X_NOBIG_OVERFLOW_SIZE) { + if (width > bigmode_max_w || size > bigmode_max_size) { rkisp_set_bits(params_vdev->dev, ISP_CTRL1, ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, false);