media: rockchip: isp: adjust rdbk times with mulit dev for isp2.0

Change-Id: I0d15991a0f17ce0498435a296d8b997e30f6fc38
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2021-03-29 11:29:48 +08:00
committed by Tao Huang
parent f4445a70c0
commit 3c8b7fb6a5
6 changed files with 62 additions and 71 deletions

View File

@@ -493,19 +493,8 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode)
u64 iq_feature = hw->iq_feature;
bool is_upd = false, is_3dlut_upd = false;
if (dev->isp_ver == ISP_V21)
dma2frm = 0;
hw->cur_dev_id = dev->dev_id;
rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true);
if (dma2frm > 2)
dma2frm = 2;
if (dma2frm == 2)
csi->frame_cnt_x3++;
else if (dma2frm == 1)
csi->frame_cnt_x2++;
else
csi->frame_cnt_x1++;
csi->frame_cnt++;
val = 0;
if (mode & T_START_X1) {
@@ -560,7 +549,7 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode)
rkisp_params_first_cfg(&dev->params_vdev,
&dev->isp_sdev.in_fmt,
dev->isp_sdev.quantization);
rkisp_params_cfg(params_vdev, cur_frame_id, dma2frm + 1);
rkisp_params_cfg(params_vdev, cur_frame_id);
if (!hw->is_single) {
rkisp_update_regs(dev, CTRL_VI_ISP_PATH, SUPER_IMP_COLOR_CR);
@@ -572,7 +561,11 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode)
rkisp_update_regs(dev, MI_RD_CTRL2, ISP_LSC_CTRL);
rkisp_update_regs(dev, MI_MP_WR_Y_BASE, MI_MP_WR_Y_LLENGTH);
rkisp_update_regs(dev, ISP_LSC_XGRAD_01, ISP_RAWAWB_RAM_DATA);
if (dev->isp_ver == ISP_V21) {
if (dev->isp_ver == ISP_V20 &&
(rkisp_read(dev, ISP_DHAZ_CTRL, false) & ISP_DHAZ_ENMUX ||
rkisp_read(dev, ISP_HDRTMO_CTRL, false) & ISP_HDRTMO_EN)) {
dma2frm += (dma2frm ? 0 : 1);
} else if (dev->isp_ver == ISP_V21) {
val = rkisp_read(dev, MI_WR_CTRL2, false);
rkisp_set_bits(dev, MI_WR_CTRL2, 0, val, true);
rkisp_write(dev, MI_WR_INIT, ISP21_SP_FORCE_UPD | ISP21_MP_FORCE_UPD, true);
@@ -584,8 +577,20 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode)
is_upd = true;
}
if (IS_HDR_RDBK(dev->csi_dev.rd_mode))
rkisp_params_cfgsram(params_vdev);
if (dev->isp_ver == ISP_V21)
dma2frm = 0;
if (dma2frm > 2)
dma2frm = 2;
if (dma2frm == 2)
csi->frame_cnt_x3++;
else if (dma2frm == 1)
csi->frame_cnt_x2++;
else
csi->frame_cnt_x1++;
csi->frame_cnt++;
rkisp_params_cfgsram(params_vdev);
params_vdev->rdbk_times = dma2frm + 1;
/* read 3d lut at frame end */
if (hw->is_single && is_upd &&

View File

@@ -187,6 +187,7 @@ static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq)
/* clean module params */
params_vdev->ops->clear_first_param(params_vdev);
params_vdev->rdbk_times = 0;
}
static int
@@ -298,12 +299,10 @@ static void rkisp_uninit_params_vdev(struct rkisp_isp_params_vdev *params_vdev)
rkisp_uninit_params_vdev_v2x(params_vdev);
}
void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev,
u32 frame_id, u32 rdbk_times)
void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id)
{
if (params_vdev->ops->param_cfg)
params_vdev->ops->param_cfg(params_vdev, frame_id,
rdbk_times, RKISP_PARAMS_IMD);
params_vdev->ops->param_cfg(params_vdev, frame_id, RKISP_PARAMS_IMD);
}
void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev)

View File

@@ -23,7 +23,7 @@ struct rkisp_isp_params_ops {
void (*disable_isp)(struct rkisp_isp_params_vdev *params_vdev);
void (*isr_hdl)(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis);
void (*param_cfg)(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id,
u32 rdbk_times, enum rkisp_params_type type);
enum rkisp_params_type type);
void (*param_cfgsram)(struct rkisp_isp_params_vdev *params_vdev);
void (*get_ldchbuf_inf)(struct rkisp_isp_params_vdev *params_vdev,
struct rkisp_ldchbuf_info *ldchbuf);
@@ -94,8 +94,7 @@ void rkisp_unregister_params_vdev(struct rkisp_isp_params_vdev *params_vdev);
void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis);
void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev,
u32 frame_id, u32 rdbk_times);
void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id);
void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev);
void rkisp_params_get_ldchbuf_inf(struct rkisp_isp_params_vdev *params_vdev,

View File

@@ -4118,7 +4118,7 @@ rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev)
static void
rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
u32 frame_id, u32 rdbk_times, enum rkisp_params_type type)
u32 frame_id, enum rkisp_params_type type)
{
struct isp21_isp_params_cfg *new_params = NULL;
struct rkisp_buffer *cur_buf = params_vdev->cur_buf;
@@ -4169,8 +4169,6 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
params_vdev->cur_hdrdrc = new_params->others.drc_cfg;
vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
cur_buf = NULL;
} else {
params_vdev->rdbk_times = rdbk_times;
}
unlock:
@@ -4210,12 +4208,13 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true);
if (isp_mis & CIF_ISP_V_START) {
if (params_vdev->rdbk_times)
params_vdev->rdbk_times--;
if (!params_vdev->cur_buf)
return;
params_vdev->rdbk_times--;
if (IS_HDR_RDBK(dev->csi_dev.rd_mode) && !params_vdev->rdbk_times) {
rkisp_params_cfg_v2x(params_vdev, cur_frame_id, 0, RKISP_PARAMS_SHD);
rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_SHD);
return;
}
}
@@ -4224,7 +4223,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
rkisp_params_clear_fstflg(params_vdev);
if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->csi_dev.rd_mode))
rkisp_params_cfg_v2x(params_vdev, cur_frame_id, 0, RKISP_PARAMS_ALL);
rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_ALL);
}
static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {

View File

@@ -3118,7 +3118,7 @@ static void isp_hdrtmo_wait_first_line(struct rkisp_isp_params_vdev *params_vdev
rkisp_dmarx_get_frame(params_vdev->dev, &frame_id, NULL, NULL, true);
do {
value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_RO5);
value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_RO5, true);
line_cnt = value & 0x1fff;
if (frame_id != 0 && (line_cnt < 1 || line_cnt >= out_crop->height))
@@ -3137,7 +3137,7 @@ isp_hdrtmo_config(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_hdrtmo_cfg *arg, enum rkisp_params_type type)
{
u8 big_en, nobig_en;
u32 value, irq_mask = 0x0;
u32 value;
if (type == RKISP_PARAMS_SHD || type == RKISP_PARAMS_ALL) {
value = rkisp_ioread32(params_vdev, ISP_HDRTMO_CTRL_CFG);
@@ -3149,7 +3149,8 @@ isp_hdrtmo_config(struct rkisp_isp_params_vdev *params_vdev,
value = ISP2X_PACK_2SHORT(arg->lgscl, arg->lgscl_inv);
rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_SCL);
isp_hdrtmo_wait_first_line(params_vdev);
if (type == RKISP_PARAMS_SHD)
isp_hdrtmo_wait_first_line(params_vdev);
value = ISP2X_PACK_2SHORT(arg->set_palpha, arg->set_gainoff);
rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG0);
@@ -3175,12 +3176,6 @@ isp_hdrtmo_config(struct rkisp_isp_params_vdev *params_vdev,
nobig_en = 0;
}
irq_mask = rkisp_ioread32(params_vdev, CIF_ISP_IMSC);
if (arg->cnt_mode & 0x01 && !(irq_mask & ISP2X_HDR_DONE)) {
irq_mask |= ISP2X_HDR_DONE;
rkisp_write(params_vdev->dev, CIF_ISP_IMSC, irq_mask, true);
}
value = rkisp_ioread32(params_vdev, ISP_HDRTMO_CTRL);
value &= ISP_HDRTMO_EN;
value |= (arg->cnt_vsize & 0x1FFF) << 16 |
@@ -4212,9 +4207,9 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
(struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops;
ops->hdrmge_config(params_vdev,
&params_vdev->last_hdrmge, RKISP_PARAMS_SHD);
&params_vdev->last_hdrmge, RKISP_PARAMS_ALL);
ops->hdrtmo_config(params_vdev,
&params_vdev->last_hdrtmo, RKISP_PARAMS_SHD);
&params_vdev->last_hdrtmo, RKISP_PARAMS_ALL);
}
static __maybe_unused
@@ -4435,7 +4430,7 @@ rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev)
static void
rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
u32 frame_id, u32 rdbk_times, enum rkisp_params_type type)
u32 frame_id, enum rkisp_params_type type)
{
struct isp2x_isp_params_cfg *new_params = NULL;
struct rkisp_buffer *cur_buf = params_vdev->cur_buf;
@@ -4486,11 +4481,9 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev,
params_vdev->cur_hdrmge = new_params->others.hdrmge_cfg;
vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
cur_buf = NULL;
} else {
params_vdev->rdbk_times = rdbk_times;
}
params_vdev->exposure = new_params->exposure;
params_vdev->exposure = new_params->exposure;
unlock:
params_vdev->cur_buf = cur_buf;
spin_unlock(&params_vdev->config_lock);
@@ -4513,13 +4506,12 @@ static void isp_hdrtmo_palhpa_reconfig(struct rkisp_isp_params_vdev *params_vdev
rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true);
value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_CFG0) & 0xfffffc00;
value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG0, true) & 0xfffffc00;
value |= palpha;
rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG0);
rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG0, value, true);
v4l2_dbg(5, rkisp_debug, &params_vdev->dev->v4l2_dev,
"frame(%d), palpha(%d)\n",
cur_frame_id, palpha);
"frame(%d), palpha(%d)\n", cur_frame_id, palpha);
}
static void isp_hdrtmo_lgavgmax_reconfig(struct rkisp_isp_params_vdev *params_vdev,
@@ -4541,17 +4533,15 @@ static void isp_hdrtmo_lgavgmax_reconfig(struct rkisp_isp_params_vdev *params_vd
lgavgmax = min(lgavgmax / 256, lgrange1);
}
value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_CFG4) & 0xffff0000;
value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG4, true) & 0xffff0000;
value |= lgavgmax;
rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG4);
rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG4, value, true);
rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true);
v4l2_dbg(5, rkisp_debug, &params_vdev->dev->v4l2_dev,
"frame(%d), global_tmo(%d), lgavgmax(%d)\n",
cur_frame_id,
params_vdev->cur_hdrtmo.predict.global_tmo,
lgavgmax);
"frame(%d), global_tmo(%d), lgavgmax(%d)\n",
cur_frame_id, params_vdev->cur_hdrtmo.predict.global_tmo, lgavgmax);
}
static void isp_hdrtmo_lgrange1_reconfig(struct rkisp_isp_params_vdev *params_vdev,
@@ -4562,17 +4552,15 @@ static void isp_hdrtmo_lgrange1_reconfig(struct rkisp_isp_params_vdev *params_vd
u32 cur_frame_id, value;
lgrange1 = lgmean;
value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_CFG3) & 0xffff;
value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG3, true) & 0xffff;
value |= lgrange1 << 16;
rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG3);
rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG3, value, true);
rkisp_dmarx_get_frame(params_vdev->dev, &cur_frame_id, NULL, NULL, true);
v4l2_dbg(5, rkisp_debug, &params_vdev->dev->v4l2_dev,
"frame(%d), global_tmo(%d), lgrange1(%d)\n",
cur_frame_id,
params_vdev->cur_hdrtmo.predict.global_tmo,
lgrange1);
"frame(%d), global_tmo(%d), lgrange1(%d)\n",
cur_frame_id, params_vdev->cur_hdrtmo.predict.global_tmo, lgrange1);
}
}
@@ -4590,7 +4578,7 @@ static u16 isp_hdrtmo_lgmean_reconfig(struct rkisp_isp_params_vdev *params_vdev)
s32 iir = 0;
s32 global_tmo_strength = params_vdev->cur_hdrtmo.predict.global_tmo_strength;
value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_RO2);
value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_RO2, true);
ro_lgmean = value & 0xffff;
iir = min(cur_frame_id + 1, params_vdev->cur_hdrtmo.predict.iir);
@@ -4609,19 +4597,17 @@ static u16 isp_hdrtmo_lgmean_reconfig(struct rkisp_isp_params_vdev *params_vdev)
}
}
value = rkisp_ioread32(params_vdev, ISP_HDRTMO_LG_CFG2) & 0xffff0000;
value = rkisp_read(params_vdev->dev, ISP_HDRTMO_LG_CFG2, true) & 0xffff0000;
value |= lgmean;
rkisp_iowrite32(params_vdev, value, ISP_HDRTMO_LG_CFG2);
rkisp_write(params_vdev->dev, ISP_HDRTMO_LG_CFG2, value, true);
prev_lgmean = lgmean;
v4l2_dbg(5, rkisp_debug, &params_vdev->dev->v4l2_dev,
"frame(%d), scene_stable(%d), k_rolgmean(%d), iir(%d), lgmean(%d)\n",
cur_frame_id,
params_vdev->cur_hdrtmo.predict.scene_stable,
params_vdev->cur_hdrtmo.predict.k_rolgmean,
params_vdev->cur_hdrtmo.predict.iir,
lgmean);
"frame(%d), scene_stable(%d), k_rolgmean(%d), iir(%d), lgmean(%d)\n",
cur_frame_id, params_vdev->cur_hdrtmo.predict.scene_stable,
params_vdev->cur_hdrtmo.predict.k_rolgmean,
params_vdev->cur_hdrtmo.predict.iir, lgmean);
return lgmean;
}
@@ -4635,10 +4621,11 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true);
if (isp_mis & CIF_ISP_V_START) {
if (params_vdev->rdbk_times)
params_vdev->rdbk_times--;
if (!params_vdev->cur_buf)
return;
params_vdev->rdbk_times--;
if (IS_HDR_RDBK(dev->csi_dev.rd_mode) && !params_vdev->rdbk_times) {
struct rkisp_isp_params_val_v2x *priv_val =
(struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
@@ -4651,7 +4638,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
priv_val->delay_en_ldch = false;
}
rkisp_params_cfg_v2x(params_vdev, cur_frame_id, 0, RKISP_PARAMS_SHD);
rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_SHD);
return;
}
}
@@ -4668,7 +4655,7 @@ rkisp_params_isr_v2x(struct rkisp_isp_params_vdev *params_vdev,
}
if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->csi_dev.rd_mode))
rkisp_params_cfg_v2x(params_vdev, cur_frame_id, 0, RKISP_PARAMS_ALL);
rkisp_params_cfg_v2x(params_vdev, cur_frame_id, RKISP_PARAMS_ALL);
}
static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {

View File

@@ -653,6 +653,8 @@ static int rkisp_config_isp(struct rkisp_device *dev)
CIF_ISP_FRAME_IN;
if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21)
irq_mask |= ISP2X_LSC_LUT_ERR;
if (dev->isp_ver == ISP_V20)
irq_mask |= ISP2X_HDR_DONE;
rkisp_write(dev, CIF_ISP_IMSC, irq_mask, true);
if ((dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) &&