From bc6d4938a47f5bf12b896f8da61a1937ddef9b13 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Thu, 25 Nov 2021 17:25:51 +0800 Subject: [PATCH] media: rockchip: isp: fix bigmode for multi device Change-Id: I5debe62ea15fa8d5f01931aea643f2c982c57f6b Signed-off-by: Cai YiWei --- .../platform/rockchip/isp/isp_params_v3x.c | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v3x.c b/drivers/media/platform/rockchip/isp/isp_params_v3x.c index dec1c925b075..6562c24e148a 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v3x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v3x.c @@ -14,6 +14,15 @@ #define ISP3X_REG_WR_MASK BIT(31) //disable write protect #define ISP3X_NOBIG_OVERFLOW_SIZE (2688 * 1536) #define ISP3X_AUTO_BIGMODE_WIDTH 2688 +#define ISP3X_VIR2_NOBIG_OVERFLOW_SIZE (1920 * 1080) +#define ISP3X_VIR2_AUTO_BIGMODE_WIDTH 1920 +#define ISP3X_VIR4_NOBIG_OVERFLOW_SIZE (1280 * 800) +#define ISP3X_VIR4_AUTO_BIGMODE_WIDTH 1280 + +#define ISP3X_VIR2_MAX_WIDTH 3840 +#define ISP3X_VIR2_MAX_SIZE (3840 * 2160) +#define ISP3X_VIR4_MAX_WIDTH 2560 +#define ISP3X_VIR4_MAX_SIZE (2560 * 1536) static inline void isp3_param_write_direct(struct rkisp_isp_params_vdev *params_vdev, @@ -81,15 +90,6 @@ isp3_param_clear_bits(struct rkisp_isp_params_vdev *params_vdev, rkisp_next_clear_bits(params_vdev->dev, reg, bit_mask, false); } -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; -} - static void isp_dpcc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_dpcc_cfg *arg, u32 id) @@ -4042,8 +4042,26 @@ rkisp_params_first_cfg_v3x(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_num > 2) { + bigmode_max_w = ISP3X_VIR4_AUTO_BIGMODE_WIDTH; + bigmode_max_size = ISP3X_VIR4_NOBIG_OVERFLOW_SIZE; + if (width > ISP3X_VIR4_MAX_WIDTH || size > ISP3X_VIR4_MAX_SIZE) + dev_err(dev, "%dx%d > max:2560x1536 for %d virtual isp\n", + width, height, hw->dev_num); + } else if (hw->dev_num > 1) { + bigmode_max_w = ISP3X_VIR2_AUTO_BIGMODE_WIDTH; + bigmode_max_size = ISP3X_VIR2_NOBIG_OVERFLOW_SIZE; + if (width > ISP3X_VIR2_MAX_WIDTH || size > ISP3X_VIR2_MAX_SIZE) + dev_err(dev, "%dx%d > max:3840x2160 for %d virtual isp\n", + width, height, hw->dev_num); + } else { + bigmode_max_w = ISP3X_AUTO_BIGMODE_WIDTH; + bigmode_max_size = ISP3X_NOBIG_OVERFLOW_SIZE; + } rkisp_alloc_bay3d_buf(params_vdev, params_vdev->isp3x_params); spin_lock(¶ms_vdev->config_lock); /* override the default things */ @@ -4061,7 +4079,7 @@ rkisp_params_first_cfg_v3x(struct rkisp_isp_params_vdev *params_vdev) if (hw->is_unite) { width = width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; size = width * out_crop->height; - if (width > ISP3X_AUTO_BIGMODE_WIDTH || size > ISP3X_NOBIG_OVERFLOW_SIZE) { + if (width > bigmode_max_w || size > bigmode_max_size) { priv_val->is_bigmode = true; rkisp_next_set_bits(params_vdev->dev, ISP3X_ISP_CTRL1, 0, ISP3X_BIGMODE_MANUAL | ISP3X_BIGMODE_FORCE_EN, false); @@ -4070,13 +4088,13 @@ rkisp_params_first_cfg_v3x(struct rkisp_isp_params_vdev *params_vdev) __isp_isr_other_en(params_vdev, params_vdev->isp3x_params + 1, RKISP_PARAMS_ALL, 1); __isp_isr_meas_config(params_vdev, params_vdev->isp3x_params + 1, RKISP_PARAMS_ALL, 1); __isp_isr_meas_en(params_vdev, params_vdev->isp3x_params + 1, RKISP_PARAMS_ALL, 1); - if (width > ISP3X_AUTO_BIGMODE_WIDTH || size > ISP3X_NOBIG_OVERFLOW_SIZE) { + if (width > bigmode_max_w || size > bigmode_max_size) { priv_val->is_bigmode = true; rkisp_next_set_bits(params_vdev->dev, ISP3X_ISP_CTRL1, 0, ISP3X_BIGMODE_MANUAL | ISP3X_BIGMODE_FORCE_EN, false); } } - if (width > ISP3X_AUTO_BIGMODE_WIDTH || size > ISP3X_NOBIG_OVERFLOW_SIZE) { + if (width > bigmode_max_w || size > bigmode_max_size) { priv_val->is_bigmode = true; rkisp_set_bits(params_vdev->dev, ISP3X_ISP_CTRL1, 0, ISP3X_BIGMODE_MANUAL | ISP3X_BIGMODE_FORCE_EN, false);