From c747fe61abeba90b96f8ff39e0aa4ba59119a20f Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Thu, 10 Apr 2025 16:34:36 +0800 Subject: [PATCH] media: rockchip: isp: fix w3a with aiisp for isp35 Change-Id: I17fd6a32670a609bac13cc4ccb0df92eff364817 Signed-off-by: Cai YiWei --- .../platform/rockchip/isp/isp_params_v35.c | 100 ++++++++++---- .../platform/rockchip/isp/isp_params_v35.h | 3 + .../platform/rockchip/isp/isp_stats_v35.c | 125 ++++++++++++------ drivers/media/platform/rockchip/isp/procfs.c | 39 ++++-- drivers/media/platform/rockchip/isp/rkisp.c | 45 +++++-- 5 files changed, 227 insertions(+), 85 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v35.c b/drivers/media/platform/rockchip/isp/isp_params_v35.c index 16b484fadd61..9eea2886c186 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v35.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v35.c @@ -918,6 +918,7 @@ static void isp_rawaf_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp35_rawaf_meas_cfg *arg, u32 id) { + struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val; struct rkisp_device *dev = params_vdev->dev; struct v4l2_rect *out_crop = &dev->isp_sdev.out_crop; u32 width = out_crop->width, height = out_crop->height; @@ -1069,6 +1070,11 @@ isp_rawaf_config(struct rkisp_isp_params_vdev *params_vdev, ctrl &= ~(ISP3X_RAWAF_SEL(3) | ISP32L_BNR2AF_SEL); ctrl |= ISP3X_RAWAF_SEL(arg->rawaf_sel) | !!arg->bnr2af_sel << 28; isp3_param_write(params_vdev, ctrl, ISP3X_VI_ISP_PATH, id); + priv->is_af_fe = true; + if (arg->from_ynr || + (arg->bnr2af_sel && arg->bnr_be_sel) || + (!arg->bnr2af_sel && arg->rawaf_sel == 3)) + priv->is_af_fe = false; } static void @@ -1243,6 +1249,7 @@ static void isp_rawawb_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp35_rawawb_meas_cfg *arg, u32 id) { + struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val; struct rkisp_device *dev = params_vdev->dev; struct v4l2_rect *out_crop = &dev->isp_sdev.out_crop; struct isp35_isp_params_cfg *params_rec = params_vdev->isp35_params + id; @@ -1293,8 +1300,6 @@ isp_rawawb_config(struct rkisp_isp_params_vdev *params_vdev, !!arg->blk_measure_xytype << 2 | !!arg->blk_measure_mode << 1 | !!arg->blk_measure_enable; - if (dev->is_aiisp_en) - value |= ISP35_RAWAWB_BNR_BE_SEL; isp3_param_write(params_vdev, value, ISP3X_RAWAWB_BLK_CTRL, id); h_offs = arg->h_offs & ~0x1; @@ -1944,6 +1949,10 @@ isp_rawawb_config(struct rkisp_isp_params_vdev *params_vdev, value |= val; isp3_param_write(params_vdev, value, ISP3X_VI_ISP_PATH, id); } + priv->is_awb_fe = true; + if (arg->drc2awb_sel || + (arg->bnr2awb_sel && arg->bnr_be_sel)) + priv->is_awb_fe = false; } static void @@ -2109,6 +2118,7 @@ static void isp_aiawb_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp35_aiawb_meas_cfg *arg, u32 id) { + struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val; const struct isp2x_bls_fixed_val *pval = &arg->bls3_val; u32 value; @@ -2145,9 +2155,9 @@ isp_aiawb_config(struct rkisp_isp_params_vdev *params_vdev, isp3_param_write(params_vdev, value, ISP3X_BLS_CTRL, id); value = isp3_param_read(params_vdev, ISP39_W3A_CTRL0, id); - if ((!arg->rawout_sel && !(value & ISP35_W3A_RAWLSC_SEL)) || - (arg->rawout_sel && value & ISP35_W3A_RAWLSC_SEL)) { - if (arg->rawout_sel) + if ((!arg->path_sel && !(value & ISP35_W3A_RAWLSC_SEL)) || + (arg->path_sel && value & ISP35_W3A_RAWLSC_SEL)) { + if (arg->path_sel) value &= ~ISP35_W3A_RAWLSC_SEL; else value |= ISP35_W3A_RAWLSC_SEL; @@ -2163,6 +2173,11 @@ isp_aiawb_config(struct rkisp_isp_params_vdev *params_vdev, (arg->path_sel & 0x7) << 8 | (arg->in_shift & 0xf) << 12; isp3_param_write(params_vdev, value, ISP35_AIAWB_CTRL0, id); + priv->is_aiawb_fe = true; + if (arg->path_sel == 2 || arg->path_sel == 3) + priv->is_aiawb_fe = false; + else if (arg->path_sel == 4) + priv->is_aiawb_fe = priv->is_awb_fe; value = arg->exp_thr | (arg->saturation_hthr & 0xfff) << 8 | (arg->saturation_lthr & 0x7ff) << 20 | !!arg->exp1_check_en << 31; @@ -4732,38 +4747,67 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev, struct isp35_isp_params_cfg *new_params, enum rkisp_params_type type, u32 id) { + struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val; struct rkisp_device *dev = params_vdev->dev; u64 module_cfg_update = new_params->module_cfg_update; + bool is_ae0_cfg = !!(module_cfg_update & ISP35_MODULE_RAWAE0); + bool is_hist0_cfg = !!(module_cfg_update & ISP35_MODULE_RAWHIST0); + bool is_ae3_cfg = !!(module_cfg_update & ISP35_MODULE_RAWAE3); + bool is_hist3_cfg = !!(module_cfg_update & ISP35_MODULE_RAWHIST3); + bool is_af_cfg = !!(module_cfg_update & ISP35_MODULE_RAWAF); + bool is_awb_cfg = !!(module_cfg_update & ISP35_MODULE_RAWAWB); + bool is_aiawb_cfg = !!(module_cfg_update & ISP35_MODULE_AIAWB); v4l2_dbg(4, rkisp_debug, &dev->v4l2_dev, "%s id:%d seq:%d type:%d module_cfg_update:0x%llx\n", __func__, id, new_params->frame_id, type, module_cfg_update); - - if (!dev->is_aiisp_en || type != RKISP_PARAMS_LAT) { - if (module_cfg_update & ISP35_MODULE_RAWAE0) - isp_rawae0_config(params_vdev, &new_params->meas.rawae0, id); - if (module_cfg_update & ISP35_MODULE_RAWHIST0) - isp_rawhist0_config(params_vdev, &new_params->meas.rawhist0, id); - if ((module_cfg_update & ISP35_MODULE_RAWAF)) - isp_rawaf_config(params_vdev, &new_params->meas.rawaf, id); - if (dev->is_aiisp_en && type == RKISP_PARAMS_IMD) { - params_vdev->cur_fe_frame_id = new_params->frame_id; - return; + if (dev->is_aiisp_en && type != RKISP_PARAMS_ALL) { + if ((priv->is_ae0_fe && type == RKISP_PARAMS_LAT) || + (!priv->is_ae0_fe && type == RKISP_PARAMS_IMD)) { + is_ae0_cfg = false; + is_hist0_cfg = false; } + if ((priv->is_ae3_fe && type == RKISP_PARAMS_LAT) || + (!priv->is_ae3_fe && type == RKISP_PARAMS_IMD)) { + is_ae3_cfg = false; + is_hist3_cfg = false; + } + if ((priv->is_af_fe && type == RKISP_PARAMS_LAT) || + (!priv->is_af_fe && type == RKISP_PARAMS_IMD)) + is_af_cfg = false; + if ((priv->is_awb_fe && type == RKISP_PARAMS_LAT) || + (!priv->is_awb_fe && type == RKISP_PARAMS_IMD)) + is_awb_cfg = false; + if ((priv->is_aiawb_fe && type == RKISP_PARAMS_LAT) || + (!priv->is_aiawb_fe && type == RKISP_PARAMS_IMD)) + is_aiawb_cfg = false; } + + if (is_ae0_cfg) + isp_rawae0_config(params_vdev, &new_params->meas.rawae0, id); + if (is_hist0_cfg) + isp_rawhist0_config(params_vdev, &new_params->meas.rawhist0, id); + if (is_ae3_cfg) + isp_rawae3_config(params_vdev, &new_params->meas.rawae3, id); + if (is_hist3_cfg) + isp_rawhist3_config(params_vdev, &new_params->meas.rawhist3, id); + if (is_af_cfg) + isp_rawaf_config(params_vdev, &new_params->meas.rawaf, id); + if (is_awb_cfg) + isp_rawawb_config(params_vdev, &new_params->meas.rawawb, id); + if (is_aiawb_cfg) + isp_aiawb_config(params_vdev, &new_params->meas.aiawb, id); + + if (dev->is_aiisp_en && type == RKISP_PARAMS_IMD) { + params_vdev->cur_fe_frame_id = new_params->frame_id; + return; + } + params_vdev->cur_frame_id = new_params->frame_id; params_vdev->exposure = new_params->exposure; - if (module_cfg_update & ISP35_MODULE_RAWAE3) - isp_rawae3_config(params_vdev, &new_params->meas.rawae3, id); - if (module_cfg_update & ISP35_MODULE_RAWHIST3) - isp_rawhist3_config(params_vdev, &new_params->meas.rawhist3, id); - if (module_cfg_update & ISP35_MODULE_AIAWB) - isp_aiawb_config(params_vdev, &new_params->meas.aiawb, id); if (module_cfg_update & ISP35_MODULE_AWBSYNC) isp_awbsync_config(params_vdev, &new_params->meas.awbsync, id); - if (module_cfg_update & ISP35_MODULE_RAWAWB) - isp_rawawb_config(params_vdev, &new_params->meas.rawawb, id); } static __maybe_unused @@ -4867,8 +4911,12 @@ rkisp_params_first_cfg_v35(struct rkisp_isp_params_vdev *params_vdev) spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); if (dev->hw_dev->is_single && (dev->isp_state & ISP_START)) { - rkisp_set_bits(dev, ISP3X_ISP_CTRL0, 0, CIF_ISP_CTRL_ISP_CFG_UPD, true); - rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD); + u32 val = CIF_ISP_CTRL_ISP_CFG_UPD; + + if (dev->is_aiisp_en) + val |= ISP35_ISP_CFG_UPD_FE; + rkisp_set_bits(dev, ISP3X_ISP_CTRL0, 0, val, true); + rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, val); } } diff --git a/drivers/media/platform/rockchip/isp/isp_params_v35.h b/drivers/media/platform/rockchip/isp/isp_params_v35.h index 1863b6f67f9e..79d8feaf0b91 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v35.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v35.h @@ -93,6 +93,9 @@ struct rkisp_isp_params_val_v35 { bool yraw_sel; bool is_ae0_fe; bool is_ae3_fe; + bool is_af_fe; + bool is_awb_fe; + bool is_aiawb_fe; }; #if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V35) diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v35.c b/drivers/media/platform/rockchip/isp/isp_stats_v35.c index 34636d75898f..bfd674f01715 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v35.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v35.c @@ -288,6 +288,10 @@ rkisp_stats_get_aiawb_stats(struct rkisp_isp_stats_vdev *stats_vdev, rkisp_write(dev, ISP35_AIAWB_WR_BASE, val, false); rkisp_write(dev, ISP35_AIAWB_CTRL0, ctrl | ISP35_AIAWB_SELF_UPD, false); priv_val->buf_aiawb_idx = buf_idx; + v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev, + "aiawb idx:%d next(id:%d 0x%x)\n", + pbuf->stat.buf_aiawb_index, buf_idx, + isp3_stats_read(stats_vdev, ISP35_AIAWB_WR_BASE_SHD)); } static void @@ -412,8 +416,7 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev) struct rkisp_buffer *cur_buf = NULL; unsigned long flags = 0; u32 cur_frame_id, size = stats_vdev->vdev_fmt.fmt.meta.buffersize; - u32 val, ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS); - u32 mask = ISP3X_3A_RAWAF; + u32 val, mask = 0, ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS); u64 ns; if (!dev->is_aiisp_en) @@ -422,27 +425,40 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev) mask |= ISP3X_3A_RAWAE_CH0 | ISP3X_3A_RAWHIST_CH0; if (priv->is_ae3_fe) mask |= ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG; + if (priv->is_af_fe) + mask |= ISP3X_3A_RAWAF; + if (priv->is_awb_fe) + mask |= ISP3X_3A_RAWAWB; + if (priv->is_aiawb_fe) + mask |= ISP35_AIAWB_DONE; if (ris & mask) { isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, ris & mask); - val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL); - if (val & ISP35_3A_MEAS_DONE) - isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, val); - if (ris & ISP3X_3A_RAWAE_CH0) { + if (ris & (mask & ISP3X_3A_RAWAWB)) { + val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL); + if (val & ISP35_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, val); + } + if (ris & (mask & ISP3X_3A_RAWAF)) { + val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL); + if (val & ISP35_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, val); + } + if (ris & (mask & ISP3X_3A_RAWAE_CH0)) { val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_BASE); if (val & ISP35_3A_MEAS_DONE) isp3_module_done(stats_vdev, ISP3X_RAWAE_LITE_BASE, val); } - if (ris & ISP3X_3A_RAWHIST_CH0) { + if (ris & (mask & ISP3X_3A_RAWHIST_CH0)) { val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_BASE); if (val & ISP35_3A_MEAS_DONE) isp3_module_done(stats_vdev, ISP3X_RAWHIST_LITE_BASE, val); } - if (ris & ISP3X_3A_RAWAE_BIG) { + if (ris & (mask & ISP3X_3A_RAWAE_BIG)) { val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_BIG1_BASE); if (val & ISP35_3A_MEAS_DONE) isp3_module_done(stats_vdev, ISP3X_RAWAE_BIG1_BASE, val); } - if (ris & ISP3X_3A_RAWHIST_BIG) { + if (ris & (mask & ISP3X_3A_RAWHIST_BIG)) { val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_BIG1_BASE); if (val & ISP35_3A_MEAS_DONE) isp3_module_done(stats_vdev, ISP3X_RAWHIST_BIG1_BASE, val); @@ -476,31 +492,38 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev) stat_buf->stat.buf_gain_index = -1; stat_buf->stat.buf_vpsl_index = -1; } - if (ris & ISP3X_3A_RAWAE_CH0 && stat_buf && stat_tmp_buf) { + if (ris & (mask & ISP3X_3A_RAWAE_CH0) && stat_buf && stat_tmp_buf) { memcpy(&stat_buf->stat.rawae0, &stat_tmp_buf->stat.rawae0, sizeof(struct isp33_rawae_stat)); stat_buf->meas_type |= ISP35_STAT_RAWAE0; } - if (ris & ISP3X_3A_RAWHIST_CH0 && stat_buf && stat_tmp_buf) { + if (ris & (mask & ISP3X_3A_RAWHIST_CH0) && stat_buf && stat_tmp_buf) { memcpy(&stat_buf->stat.rawhist0, &stat_tmp_buf->stat.rawhist0, sizeof(struct isp33_rawhist_stat)); stat_buf->meas_type |= ISP35_STAT_RAWHST0; } - if (ris & ISP3X_3A_RAWAE_BIG && stat_buf && stat_tmp_buf) { + if (ris & (mask & ISP3X_3A_RAWAE_BIG) && stat_buf && stat_tmp_buf) { memcpy(&stat_buf->stat.rawae3, &stat_tmp_buf->stat.rawae3, sizeof(struct isp33_rawae_stat)); stat_buf->meas_type |= ISP35_STAT_RAWAE3; } - if (ris & ISP3X_3A_RAWHIST_BIG && stat_buf && stat_tmp_buf) { + if (ris & (mask & ISP3X_3A_RAWHIST_BIG) && stat_buf && stat_tmp_buf) { memcpy(&stat_buf->stat.rawhist3, &stat_tmp_buf->stat.rawhist3, sizeof(struct isp33_rawhist_stat)); stat_buf->meas_type |= ISP35_STAT_RAWHST3; } - if (ris & ISP3X_3A_RAWAF && stat_buf && stat_tmp_buf) { + if (ris & (mask & ISP3X_3A_RAWAF) && stat_buf && stat_tmp_buf) { memcpy(&stat_buf->stat.rawaf, &stat_tmp_buf->stat.rawaf, sizeof(struct isp39_rawaf_stat)); stat_buf->meas_type |= ISP35_STAT_RAWAF; } + if (ris & (mask & ISP3X_3A_RAWAWB) && stat_buf && stat_tmp_buf) { + memcpy(&stat_buf->stat.rawawb, + &stat_tmp_buf->stat.rawawb, sizeof(struct isp33_rawawb_stat)); + stat_buf->meas_type |= ISP35_STAT_RAWAWB; + } + if (ris & (mask & ISP35_AIAWB_DONE) && stat_buf) + rkisp_stats_get_aiawb_stats(stats_vdev, stat_buf); if (stat_buf) rkisp_stats_get_bay3d_stats(stats_vdev, stat_buf); if (cur_buf) { @@ -510,10 +533,10 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev) vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); } v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev, - "%s seq:%d params_id:%d ris:0x%x buf:%p meas_type:0x%x\n", - __func__, - cur_frame_id, params_vdev->cur_fe_frame_id, ris, - cur_buf, !stat_buf ? 0 : stat_buf->meas_type); + "%s seq:%d params_id:%d ris:0x%x buf:0x%x meas_type:0x%x\n", + __func__, cur_frame_id, params_vdev->cur_fe_frame_id, ris, + !cur_buf ? -1 : cur_buf->buff_addr[0], + !stat_buf ? 0 : stat_buf->meas_type); } static void @@ -530,37 +553,53 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev) bool is_dummy = false; unsigned long flags = 0; - mask = ISP3X_3A_RAWAWB | ISP35_AIAWB_DONE | ISP3X_3A_DDR_DONE; + mask = ISP3X_3A_DDR_DONE; if (!dev->is_aiisp_en) { mask |= ISP3X_3A_RAWAF | ISP3X_3A_RAWAE_CH0 | ISP3X_3A_RAWHIST_CH0 | - ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG; + ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG | ISP3X_3A_RAWAWB | + ISP35_AIAWB_DONE; + } + if (dev->is_aiisp_en) { + if (!priv->is_ae0_fe) + mask |= ISP3X_3A_RAWHIST_CH0 | ISP3X_3A_RAWAE_CH0; + if (!priv->is_ae3_fe) + mask |= ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG; + if (!priv->is_af_fe) + mask |= ISP3X_3A_RAWAF; + if (!priv->is_awb_fe) + mask |= ISP3X_3A_RAWAWB; + if (!priv->is_aiawb_fe) + mask |= ISP35_AIAWB_DONE; } - if (dev->is_aiisp_en && !priv->is_ae0_fe) - mask |= ISP3X_3A_RAWHIST_CH0 | ISP3X_3A_RAWAE_CH0; - if (dev->is_aiisp_en && !priv->is_ae3_fe) - mask |= ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG; if (ris & mask) { isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, ris & mask); if (dev->is_aiisp_en) { - val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL); - if (val & ISP35_3A_MEAS_DONE) - isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, val); - if (ris & ISP3X_3A_RAWAE_CH0) { + if (ris & (mask & ISP3X_3A_RAWAWB)) { + val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL); + if (val & ISP35_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, val); + } + if (ris & (mask & ISP3X_3A_RAWAF)) { + val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL); + if (val & ISP35_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, val); + } + if (ris & (mask & ISP3X_3A_RAWAE_CH0)) { val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_BASE); if (val & ISP35_3A_MEAS_DONE) isp3_module_done(stats_vdev, ISP3X_RAWAE_LITE_BASE, val); } - if (ris & ISP3X_3A_RAWHIST_CH0) { + if (ris & (mask & ISP3X_3A_RAWHIST_CH0)) { val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_BASE); if (val & ISP35_3A_MEAS_DONE) isp3_module_done(stats_vdev, ISP3X_RAWHIST_LITE_BASE, val); } - if (ris & ISP3X_3A_RAWAE_BIG) { + if (ris & (mask & ISP3X_3A_RAWAE_BIG)) { val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_BIG1_BASE); if (val & ISP35_3A_MEAS_DONE) isp3_module_done(stats_vdev, ISP3X_RAWAE_BIG1_BASE, val); } - if (ris & ISP3X_3A_RAWHIST_BIG) { + if (ris & (mask & ISP3X_3A_RAWHIST_BIG)) { val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_BIG1_BASE); if (val & ISP35_3A_MEAS_DONE) isp3_module_done(stats_vdev, ISP3X_RAWHIST_BIG1_BASE, val); @@ -628,8 +667,12 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev) cur_stat_buf->stat.buf_vpsl_index = -1; } - if (ris & (mask & ISP3X_3A_RAWAF) && cur_stat_buf) + if (ris & (mask & ISP3X_3A_RAWAF) && cur_stat_buf) { cur_stat_buf->meas_type |= ISP35_STAT_RAWAF; + if (dev->is_aiisp_en && stat_tmp_buf) + memcpy(&cur_stat_buf->stat.rawaf, + &stat_tmp_buf->stat.rawaf, sizeof(struct isp39_rawaf_stat)); + } if (ris & (mask & ISP3X_3A_RAWAE_CH0) && cur_stat_buf) { cur_stat_buf->meas_type |= ISP35_STAT_RAWAE0; if (dev->is_aiisp_en && stat_tmp_buf) @@ -660,7 +703,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev) memcpy(&cur_stat_buf->stat.rawawb, &stat_tmp_buf->stat.rawawb, sizeof(struct isp33_rawawb_stat)); } - if (ris & ISP35_AIAWB_DONE && cur_stat_buf) + if (ris & (mask & ISP35_AIAWB_DONE) && cur_stat_buf) rkisp_stats_get_aiawb_stats(stats_vdev, cur_stat_buf); if (ris & ISP35_AWBSYNC_DONE && cur_stat_buf) rkisp_stats_get_awbsync_stats(stats_vdev, cur_stat_buf); @@ -698,20 +741,26 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev) vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); } v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev, - "%s seq:%d params_id:%d ris:0x%x buf:0x%x meas_type:0x%x aiawb(idx:%d 0x%x)\n", + "%s seq:%d params_id:%d ris:0x%x buf:0x%x meas_type:0x%x\n", __func__, cur_frame_id, params_vdev->cur_frame_id, ris, !cur_buf ? -1 : cur_buf->buff_addr[0], - !cur_stat_buf ? 0 : cur_stat_buf->meas_type, - !cur_stat_buf ? -1 : cur_stat_buf->stat.buf_aiawb_index, - isp3_stats_read(stats_vdev, ISP35_AIAWB_WR_BASE_SHD)); + !cur_stat_buf ? 0 : cur_stat_buf->meas_type); } static void rkisp_stats_isr_v35(struct rkisp_isp_stats_vdev *stats_vdev, u32 isp_ris, u32 isp3a_ris) { + u32 w3a_ris; + rkisp_pdaf_isr(stats_vdev->dev); + w3a_ris = rkisp_read(stats_vdev->dev, ISP39_W3A_INT_STAT, true); + if (w3a_ris & ISP39_W3A_INT_ERR_MASK) { + v4l2_err(&stats_vdev->dev->v4l2_dev, "w3a error 0x%x\n", w3a_ris); + rkisp_write(stats_vdev->dev, ISP39_W3A_INT_STAT, w3a_ris, true); + } + if (isp_ris & ISP3X_BAY3D_FRM_END) rkisp_stats_send_meas_fe(stats_vdev); if (isp_ris & ISP3X_FRAME) @@ -777,6 +826,8 @@ rkisp_stats_first_ddr_config_v35(struct rkisp_isp_stats_vdev *stats_vdev) val |= ISP39_W3A_EN | ISP39_W3A_FORCE_UPD; if (!dev->is_aiisp_en) val |= ISP39_W3A_AUTO_CLR_EN; + else + val |= ISP35_W3A_FORCE_UPD_F; if (pdaf_vdev && pdaf_vdev->streaming) { val |= ISP39_W3A_PDAF_EN; rkisp_pdaf_update_buf(dev); diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c index f50dd799e230..b0e6fb56d17f 100644 --- a/drivers/media/platform/rockchip/isp/procfs.c +++ b/drivers/media/platform/rockchip/isp/procfs.c @@ -1140,7 +1140,7 @@ static void isp35_show(struct rkisp_device *dev, struct seq_file *p) struct rkisp_isp_params_val_v35 *priv = dev->params_vdev.priv_val; u32 full_range_flg = CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA; static const char * const effect[] = { "OFF", "BLACKWHITE" }; - u32 val, tmp; + u32 val, tmp, isp_path = rkisp_read(dev, ISP3X_VI_ISP_PATH, false); val = rkisp_read(dev, ISP3X_SWS_CFG, false); tmp = rkisp_read(dev, ISP3X_SWS_CFG, true); @@ -1248,21 +1248,42 @@ static void isp35_show(struct rkisp_device *dev, struct seq_file *p) seq_printf(p, "%-10s %s pregdain:0x%x offset:0x%x offset1:%d max:0x%x\n", "OB", val ? "ON" : "OFF", val, tmp & 0x1ff, (tmp >> 16) & 0x1ff, rkisp_read(dev, ISP32_BLS_ISP_OB_MAX, false)); - val = rkisp_read(dev, ISP3X_RAWAE_LITE_CTRL, false); - seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE0", (val & 1) ? "ON" : "OFF", val); - val = rkisp_read(dev, ISP3X_RAWAE_BIG1_BASE, false); - seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE3", (val & 1) ? "ON" : "OFF", val); val = rkisp_read(dev, ISP3X_RAWHIST_LITE_CTRL, false); seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST0", (val & 1) ? "ON" : "OFF", val); val = rkisp_read(dev, ISP3X_RAWHIST_BIG1_BASE, false); seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST3", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP3X_RAWAE_LITE_CTRL, false); + seq_printf(p, "%-10s %s(0x%x) sel[bnr(fe:%d be:%d) swap:%d]\n", + "RAWAE0", (val & 1) ? "ON" : "OFF", val, + !!(isp_path & BIT(30) && !(val & BIT(9))), + !!(isp_path & BIT(30) && val & BIT(9)), + (isp_path >> 22) & 0x3); + val = rkisp_read(dev, ISP3X_RAWAE_BIG1_BASE, false); + seq_printf(p, "%-10s %s(0x%x) sel[bnr(fe:%d be:%d) debayer:%d dpcc:%d]\n", + "RAWAE3", (val & 1) ? "ON" : "OFF", val, + !!(isp_path & BIT(29) && !(val & BIT(9))), + !!(isp_path & BIT(29) && val & BIT(9)), + ((isp_path >> 16) & 0x3) == 3, + ((isp_path >> 16) & 0x3) != 3 ? (isp_path >> 16) & 0x3 : 0); val = rkisp_read(dev, ISP3X_RAWAF_CTRL, false); - seq_printf(p, "%-10s %s(0x%x)\n", "RAWAF", (val & 1) ? "ON" : "OFF", val); + seq_printf(p, "%-10s %s(0x%x) sel[ynr:%d bnr(fe:%d be:%d) debayer:%d dpcc:%d])\n", + "RAWAF", (val & 1) ? "ON" : "OFF", val, + !!(val & BIT(19)), + !!(isp_path & BIT(28) && !(val & BIT(20))), + !!(isp_path & BIT(28) && val & BIT(20)), + ((isp_path >> 18) & 0x3) == 3, + ((isp_path >> 18) & 0x3) != 3 ? (isp_path >> 18) & 0x3 : 0); val = rkisp_read(dev, ISP3X_RAWAWB_CTRL, false); - seq_printf(p, "%-10s %s(0x%x)\n", "RAWAWB", (val & 1) ? "ON" : "OFF", val); + tmp = rkisp_read(dev, ISP3X_RAWAWB_BLK_CTRL, false); + seq_printf(p, "%-10s %s(0x%x) sel[drc:%d bnr(fe:%d be:%d) degamma:%d]\n", + "RAWAWB", (val & 1) ? "ON" : "OFF", val, + !!(isp_path & BIT(27)), + !!(isp_path & BIT(26) && !(tmp & BIT(10))), + !!(isp_path & BIT(26) && tmp & BIT(10)), + (isp_path >> 20) & 0x3); val = rkisp_read(dev, ISP35_AIAWB_CTRL0, false); - seq_printf(p, "%-10s %s(0x%x) idx:%d cnt:%d\n", "AIAWB", (val & 1) ? "ON" : "OFF", - val, priv->buf_aiawb_cnt, priv->buf_aiawb_idx); + seq_printf(p, "%-10s %s(0x%x) sel:%d idx:%d cnt:%d\n", "AIAWB", (val & 1) ? "ON" : "OFF", + val, (val >> 8) & 0x7, priv->buf_aiawb_cnt, priv->buf_aiawb_idx); val = rkisp_read(dev, ISP35_AWBSYNC_CTRL, false); seq_printf(p, "%-10s %s(0x%x)\n", "AWBSYNC", (val & 1) ? "ON" : "OFF", val); val = rkisp_read(dev, ISP3X_ISP_DEBUG1, true); diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 10dce9b38656..a384c24c3ad2 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -697,7 +697,7 @@ static void rkisp_update_list_reg(struct rkisp_device *dev) dev->params_vdev.ops->vpsl_update_regs(&dev->params_vdev); } if (dev->isp_ver >= ISP_V33) { - val = rkisp_read(dev, ISP39_W3A_CTRL0, false); + val = rkisp_read_reg_cache(dev, ISP39_W3A_CTRL0); writel(val, hw->base_addr + ISP39_W3A_CTRL0); } rkisp_unite_write(dev, ISP3X_MI_WR_INIT, CIF_MI_INIT_SOFT_UPD, true); @@ -955,6 +955,8 @@ run_next: if (is_upd) { val = rkisp_read(dev, ISP_CTRL, false); val |= CIF_ISP_CTRL_ISP_CFG_UPD; + if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en) + val |= ISP35_ISP_CFG_UPD_FE; writel(val, hw->base_addr + ISP_CTRL); if (hw->unite == ISP_UNITE_TWO) writel(val, hw->base_next_addr + ISP_CTRL); @@ -1968,7 +1970,7 @@ static int rkisp_config_isp(struct rkisp_device *dev) u32 acq_mult = 0; u32 acq_prop = 0; u32 extend_line = 0; - u32 width, height; + u32 width, height, val; sensor = dev->active_sensor; in_fmt = &dev->isp_sdev.in_fmt; @@ -2061,6 +2063,8 @@ static int rkisp_config_isp(struct rkisp_device *dev) acq_prop |= signal | in_fmt->yuv_seq | CIF_ISP_ACQ_PROP_BAYER_PAT(in_fmt->bayer_pat) | CIF_ISP_ACQ_PROP_FIELD_SEL_ALL; + if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en) + acq_prop |= ISP35_BAYER_PAT_FE(in_fmt->bayer_pat) | ISP35_BAYER_UPD_FE_EN; rkisp_unite_write(dev, CIF_ISP_ACQ_PROP, acq_prop, false); rkisp_unite_write(dev, CIF_ISP_ACQ_NR_FRAMES, 0, true); @@ -2071,19 +2075,31 @@ static int rkisp_config_isp(struct rkisp_device *dev) /* Acquisition Size */ rkisp_unite_write(dev, CIF_ISP_ACQ_H_OFFS, acq_mult * in_crop->left, false); rkisp_unite_write(dev, CIF_ISP_ACQ_V_OFFS, in_crop->top, false); - rkisp_unite_write(dev, CIF_ISP_ACQ_H_SIZE, acq_mult * width, false); + if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en) + val = (acq_mult * width) | (acq_mult * width) << 16; + else + val = acq_mult * width; + rkisp_unite_write(dev, CIF_ISP_ACQ_H_SIZE, val, false); /* ISP Out Area differ with ACQ is only FIFO, so don't crop in this */ rkisp_unite_write(dev, CIF_ISP_OUT_H_OFFS, 0, true); rkisp_unite_write(dev, CIF_ISP_OUT_V_OFFS, 0, true); - rkisp_unite_write(dev, CIF_ISP_OUT_H_SIZE, width, false); + if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en) + val = width | width << 16; + else + val = width; + rkisp_unite_write(dev, CIF_ISP_OUT_H_SIZE, val, false); if (dev->cap_dev.stream[RKISP_STREAM_SP].interlaced) { rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, height / 2, false); rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, height / 2, false); } else { - rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, height + extend_line, false); - rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, height + extend_line, false); + if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en) + val = (height + extend_line) | (height + extend_line) << 16; + else + val = height + extend_line; + rkisp_unite_write(dev, CIF_ISP_ACQ_V_SIZE, val, false); + rkisp_unite_write(dev, CIF_ISP_OUT_V_SIZE, val, false); } /* interrupt mask */ @@ -2335,7 +2351,7 @@ static int rkisp_isp_stop(struct rkisp_device *dev) struct rkisp_hw_dev *hw = dev->hw_dev; void __iomem *base = dev->base_addr; unsigned long old_rate, safe_rate; - u32 val; + u32 val, upd = CIF_ISP_CTRL_ISP_CFG_UPD; u32 i; v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, @@ -2405,10 +2421,11 @@ static int rkisp_isp_stop(struct rkisp_device *dev) readl(base + CIF_ISP_CTRL), readl(base + CIF_ISP_FLAGS_SHD), ISP3X_ISP_OUT_LINE(rkisp_read(dev, ISP3X_ISP_DEBUG2, true))); + if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en) + upd |= ISP35_ISP_CFG_UPD_FE; val = rkisp_read(dev, CIF_ISP_CTRL, true); - val |= CIF_ISP_CTRL_ISP_CFG_UPD; - rkisp_unite_write(dev, CIF_ISP_CTRL, val, true); - rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD); + rkisp_unite_write(dev, CIF_ISP_CTRL, val | upd, true); + rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, upd); if (!in_interrupt()) { /* normal case */ @@ -2473,7 +2490,7 @@ end: static int rkisp_isp_start(struct rkisp_device *dev) { struct rkisp_hw_dev *hw = dev->hw_dev; - u32 val; + u32 val, upd = CIF_ISP_CTRL_ISP_CFG_UPD; v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s refcnt:%d link_num:%d unite_div:%d\n", __func__, @@ -2500,16 +2517,18 @@ static int rkisp_isp_start(struct rkisp_device *dev) } } + if (dev->isp_ver == ISP_V35 && dev->is_aiisp_en) + upd |= ISP35_ISP_CFG_UPD_FE; /* Activate ISP */ val = rkisp_read_reg_cache(dev, CIF_ISP_CTRL); - val |= CIF_ISP_CTRL_ISP_CFG_UPD | CIF_ISP_CTRL_ISP_ENABLE | + val |= upd | CIF_ISP_CTRL_ISP_ENABLE | CIF_ISP_CTRL_ISP_INFORM_ENABLE | CIF_ISP_CTRL_ISP_CFG_UPD_PERMANENT; if (dev->isp_ver == ISP_V20) val |= NOC_HURRY_PRIORITY(2) | NOC_HURRY_W_MODE(2) | NOC_HURRY_R_MODE(1); if (atomic_read(&hw->refcnt) == 1) hw->cur_dev_id = dev->dev_id; rkisp_unite_write(dev, CIF_ISP_CTRL, val, false); - rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD); + rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, upd); dev->isp_err_cnt = 0; dev->isp_isr_cnt = 0;