media: rockchip: isp: fix w3a with aiisp for isp35

Change-Id: I17fd6a32670a609bac13cc4ccb0df92eff364817
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2025-04-10 16:34:36 +08:00
committed by Tao Huang
parent db27b299b7
commit c747fe61ab
5 changed files with 227 additions and 85 deletions

View File

@@ -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(&params_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);
}
}

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;