media: rockchip: isp: support multi-sensor for aiisp

Change-Id: I207420d7a55ff4ad5d5a11ffd1b5f04faa06bc14
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2025-02-27 14:53:51 +08:00
committed by Tao Huang
parent 6fb09131fa
commit 502d08b106
10 changed files with 435 additions and 298 deletions

View File

@@ -308,7 +308,7 @@ static int rkisp_pipeline_open(struct rkisp_pipeline *p,
rkisp_vicap_buf[dev->dev_id] = RKISP_VICAP_BUF_CNT_MAX;
dev->vicap_buf_cnt = rkisp_vicap_buf[dev->dev_id];
dev->is_m_online = rkisp_m_online[dev->dev_id];
if (hw->is_single ||
if (hw->is_single || dev->is_aiisp_en ||
(hw->isp_ver != ISP_V33 && hw->isp_ver != ISP_V35)) {
dev->is_m_online = false;
rkisp_m_online[dev->dev_id] = false;

View File

@@ -315,6 +315,7 @@ struct rkisp_device {
bool is_frm_rd;
bool is_multi_one_sync;
bool is_wait_aiq;
bool is_first_frame;
struct rkisp_vicap_input vicap_in;
struct rkisp_vicap_sof vicap_sof;

View File

@@ -1054,6 +1054,8 @@ void rkisp_soft_reset(struct rkisp_hw_dev *dev, bool is_secure)
rv1106_sdmmc_put_lock();
if (dev->unite == ISP_UNITE_TWO)
writel(0xffff, dev->base_next_addr + CIF_IRCL);
if (dev->isp_ver == ISP_V35)
writel(1, dev->vpsl_base_addr + VPSL_RESET);
udelay(10);
/* refresh iommu after reset */

View File

@@ -415,7 +415,7 @@ isp_bls_config(struct rkisp_isp_params_vdev *params_vdev,
isp3_param_write(params_vdev, arg->isp_ob_predgain, ISP32_BLS_ISP_OB_PREDGAIN, id);
isp3_param_write(params_vdev, arg->isp_ob_max, ISP32_BLS_ISP_OB_MAX, id);
if (dev->is_aiisp_en && !dev->is_aiisp_sync && type != RKISP_PARAMS_ALL)
if (dev->is_aiisp_en && type != RKISP_PARAMS_ALL)
is_lock = true;
if (is_lock) {
spin_lock_irqsave(&dev->hw_dev->reg_lock, lock_flags);
@@ -613,7 +613,7 @@ isp_debayer_config(struct rkisp_isp_params_vdev *params_vdev,
arg->cnr_lo_guide_lpf_coe2, 0);
isp3_param_write(params_vdev, value, ISP39_DEBAYER_C_FILTER_GUIDE_GAUS, id);
value = ISP_PACK_4BYTE(arg->cnr_pre_flt_coe0, arg->cnr_pre_flt_coe1 << 8,
value = ISP_PACK_4BYTE(arg->cnr_pre_flt_coe0, arg->cnr_pre_flt_coe1,
arg->cnr_pre_flt_coe2, 0);
isp3_param_write(params_vdev, value, ISP39_DEBAYER_C_FILTER_CE_GAUS, id);
@@ -674,8 +674,7 @@ isp_awbgain_config(struct rkisp_isp_params_vdev *params_vdev,
return;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync ||
type == RKISP_PARAMS_ALL || type == RKISP_PARAMS_LAT) {
if (!dev->is_aiisp_en || type == RKISP_PARAMS_ALL || type == RKISP_PARAMS_LAT) {
isp3_param_write(params_vdev,
ISP_PACK_2SHORT(arg->awb1_gain_gb, arg->awb1_gain_gr),
ISP32_ISP_AWB1_GAIN_G, id);
@@ -2410,21 +2409,39 @@ isp_hdrdrc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id)
isp3_param_write(params_vdev, value, ISP3X_DRC_CTRL0, id);
}
static void
isp_gic_cfg_noise_curve(struct rkisp_isp_params_vdev *params_vdev,
const struct isp33_gic_cfg *arg, u32 id, bool direct)
{
struct rkisp_device *dev = params_vdev->dev;
u32 i, val;
for (i = 0; i < ISP35_GIC_SIGMA_Y_NUM / 2; i++) {
val = ISP_PACK_2SHORT(arg->bfflt_vsigma_y[i * 2],
arg->bfflt_vsigma_y[i * 2 + 1]);
rkisp_idx_write(dev, ISP33_GIC_SIGMA_Y0 + i * 4, val, id, direct);
}
val = arg->bfflt_vsigma_y[i * 2];
rkisp_idx_write(dev, ISP33_GIC_SIGMA_Y8, val, id, direct);
}
static void
isp_gic_config(struct rkisp_isp_params_vdev *params_vdev,
const struct isp33_gic_cfg *arg, u32 id)
{
u32 value;
struct isp35_isp_params_cfg *params_rec = params_vdev->isp35_params + id;
struct isp33_gic_cfg *arg_rec = &params_rec->others.gic_cfg;
u32 value, ctrl;
s32 i;
value = isp3_param_read(params_vdev, ISP3X_GIC_CONTROL, id);
value &= ISP35_MODULE_EN;
value |= !!arg->bypass_en << 1 |
!!arg->pro_mode << 2 |
!!arg->manualnoisecurve_en << 3 |
!!arg->manualnoisethred_en << 4 |
!!arg->gain_bypass_en << 5;
isp3_param_write(params_vdev, value, ISP3X_GIC_CONTROL, id);
ctrl = isp3_param_read(params_vdev, ISP3X_GIC_CONTROL, id);
ctrl &= ISP35_MODULE_EN;
ctrl |= !!arg->bypass_en << 1 |
!!arg->pro_mode << 2 |
!!arg->manualnoisecurve_en << 3 |
!!arg->manualnoisethred_en << 4 |
!!arg->gain_bypass_en << 5;
isp3_param_write(params_vdev, ctrl, ISP3X_GIC_CONTROL, id);
value = (arg->medflt_minthred & 0xf) |
(arg->medflt_maxthred & 0xf) << 4 | arg->medflt_ratio << 16;
@@ -2447,13 +2464,9 @@ isp_gic_config(struct rkisp_isp_params_vdev *params_vdev,
arg->bfflt_coeff2, 0);
isp3_param_write(params_vdev, value, ISP33_GIC_DISWGT_COEFF, id);
for (i = 0; i < ISP35_GIC_SIGMA_Y_NUM / 2; i++) {
value = ISP_PACK_2SHORT(arg->bfflt_vsigma_y[i * 2],
arg->bfflt_vsigma_y[i * 2 + 1]);
isp3_param_write(params_vdev, value, ISP33_GIC_SIGMA_Y0 + i * 4, id);
}
value = arg->bfflt_vsigma_y[i * 2];
isp3_param_write(params_vdev, value, ISP33_GIC_SIGMA_Y8, id);
if (!(ctrl & ISP35_MODULE_EN) || arg->manualnoisecurve_en)
memcpy(arg_rec->bfflt_vsigma_y, arg->bfflt_vsigma_y, sizeof(arg->bfflt_vsigma_y));
isp_gic_cfg_noise_curve(params_vdev, arg_rec, id, false);
value = (arg->luma_dx[0] & 0xf) | (arg->luma_dx[1] & 0xf) << 4 |
(arg->luma_dx[2] & 0xf) << 8 | (arg->luma_dx[3] & 0xf) << 12 |
@@ -2769,7 +2782,7 @@ isp_hsv_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
return;
ctrl &= ~ISP35_SELF_FORCE_UPD;
ctrl |= ISP35_HSV_FIX_RW_CONFLICT;
ctrl |= ISP35_HSV_FIX_RW_CONFLICT | ISP35_HSV_TBL_CLR;
isp3_param_write_direct(params_vdev, ctrl, ISP3X_3DLUT_CTRL);
for (i = 0; i < ISP35_HSV_2DLUT_ROW; i++) {
for (j = 0; j < ISP35_HSV_2DLUT_COL - 1; j += 2) {
@@ -3290,23 +3303,23 @@ isp_sharp_config(struct rkisp_isp_params_vdev *params_vdev,
const struct isp35_sharp_cfg *arg, u32 id)
{
struct isp35_isp_params_cfg *params_rec = params_vdev->isp35_params + id;
u32 i, value;
struct isp35_sharp_cfg *arg_rec = &params_rec->others.sharp_cfg;
u32 i, value, ctrl;
value = isp3_param_read(params_vdev, ISP3X_SHARP_EN, id);
value &= ISP35_MODULE_EN;
value |= !!arg->bypass << 1 |
!!arg->local_gain_bypass << 2 |
!!arg->tex_est_mode << 3 |
!!arg->max_min_flt_mode << 4 |
!!arg->detail_fusion_wgt_mode << 5 |
!!arg->noise_calc_mode << 6 |
!!arg->radius_step_mode << 7 |
!!arg->noise_curve_mode << 8 |
!!arg->gain_wgt_mode << 9 |
!!arg->detail_lp_en << 10 |
(arg->debug_mode & 0x7) << 12;
isp3_param_write(params_vdev, value, ISP3X_SHARP_EN, id);
ctrl = isp3_param_read(params_vdev, ISP3X_SHARP_EN, id);
ctrl &= ISP35_MODULE_EN;
ctrl |= !!arg->bypass << 1 |
!!arg->local_gain_bypass << 2 |
!!arg->tex_est_mode << 3 |
!!arg->max_min_flt_mode << 4 |
!!arg->detail_fusion_wgt_mode << 5 |
!!arg->noise_calc_mode << 6 |
!!arg->radius_step_mode << 7 |
!!arg->noise_curve_mode << 8 |
!!arg->gain_wgt_mode << 9 |
!!arg->detail_lp_en << 10 |
(arg->debug_mode & 0x7) << 12;
isp3_param_write(params_vdev, ctrl, ISP3X_SHARP_EN, id);
value = ISP_PACK_2SHORT(arg->fst_noise_scale, arg->fst_sigma_scale);
isp3_param_write(params_vdev, value, ISP33_SHARP_TEXTURE0, id);
@@ -3581,8 +3594,12 @@ isp_sharp_config(struct rkisp_isp_params_vdev *params_vdev,
isp3_param_write(params_vdev, value, ISP35_SHARP_SATURATION_STRG2, id);
/* SHARP_NOISE_CURVE read back is not the config value, need to save */
isp_sharp_cfg_noise_curve(params_vdev, arg, id, false);
memcpy(&params_rec->others.sharp_cfg, arg, sizeof(struct isp33_sharp_cfg));
if (!(ctrl & ISP35_MODULE_EN) || arg->noise_curve_mode)
memcpy(arg_rec->noise_curve_ext,
arg->noise_curve_ext, sizeof(arg->noise_curve_ext));
arg_rec->noise_count_thred_ratio = arg->noise_count_thred_ratio;
arg_rec->noise_clip_scale = arg->noise_clip_scale;
isp_sharp_cfg_noise_curve(params_vdev, arg_rec, id, false);
}
static void
@@ -4423,11 +4440,12 @@ isp_ai_config(struct rkisp_isp_params_vdev *params_vdev,
{
struct isp35_isp_params_cfg *params_rec = params_vdev->isp35_params + id;
struct isp35_ai_cfg *arg_rec = &params_rec->others.ai_cfg;
struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val;
u32 i, val;
val = isp3_param_read(params_vdev, ISP35_AI_CTRL, id);
val &= (ISP35_AIISP_EN | ISP35_AIPRE_IIR2DDR_EN | ISP35_AIPRE_GIAN2DDR_EN);
val |= !!arg->aiisp_raw12_msb << 2 |
val |= //!!arg->aiisp_raw12_msb << 2 |
(arg->aiisp_gain_mode & 0x3) << 4 |
!!arg->aiisp_curve_en << 6 |
!!arg->aipre_iir_en << 8 |
@@ -4442,6 +4460,8 @@ isp_ai_config(struct rkisp_isp_params_vdev *params_vdev,
!!arg->aipre_luma2gain_dis << 17;
if (params_vdev->is_hdr)
val |= ISP35_AIISP_HDR_EN;
if (priv->bay3d_iir_rw_fmt == 2)
val |= ISP35_AIISP_RAW12_MSB;
isp3_param_write(params_vdev, val, ISP35_AI_CTRL, id);
for (i = 0; i < ISP35_AI_SIGMA_NUM / 2; i++) {
val = ISP_PACK_2SHORT(arg->aiisp_sigma_y[i * 2], arg->aiisp_sigma_y[i * 2 + 1]);
@@ -4546,7 +4566,7 @@ void __isp_isr_other_config(struct rkisp_isp_params_vdev *params_vdev,
if (module_cfg_update & ISP35_MODULE_BAY3D && type != RKISP_PARAMS_LAT)
isp_bay3d_config(params_vdev, &new_params->others.bay3d_cfg, id);
if (type == RKISP_PARAMS_IMD && dev->is_aiisp_en && !dev->is_aiisp_sync)
if (type == RKISP_PARAMS_IMD && dev->is_aiisp_en)
return;
if (module_cfg_update & ISP35_MODULE_CAC)
@@ -4622,7 +4642,7 @@ void __isp_isr_other_en(struct rkisp_isp_params_vdev *params_vdev,
if (module_en_update & ISP35_MODULE_BAY3D && type != RKISP_PARAMS_LAT)
isp_bay3d_enable(params_vdev, !!(module_ens & ISP35_MODULE_BAY3D), id);
if (type == RKISP_PARAMS_IMD && dev->is_aiisp_en && !dev->is_aiisp_sync)
if (type == RKISP_PARAMS_IMD && dev->is_aiisp_en)
return;
if (module_en_update & ISP35_MODULE_CAC)
@@ -4680,14 +4700,14 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev,
"%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 || dev->is_aiisp_sync || type != RKISP_PARAMS_LAT) {
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 && !dev->is_aiisp_sync && type == RKISP_PARAMS_IMD) {
if (dev->is_aiisp_en && type == RKISP_PARAMS_IMD) {
params_vdev->cur_fe_frame_id = new_params->frame_id;
return;
}
@@ -4744,7 +4764,10 @@ void rkisp_params_cfgsram_v35(struct rkisp_isp_params_vdev *params_vdev, bool is
struct isp35_isp_params_cfg *params = params_vdev->isp35_params + id;
if (is_reset) {
isp3_param_set_bits(params_vdev, ISP3X_ISP_CTRL1,
ISP33_GIC_FST_FRAME | ISP32_SHP_FST_FRAME, id);
isp_sharp_cfg_noise_curve(params_vdev, &params->others.sharp_cfg, id, true);
isp_gic_cfg_noise_curve(params_vdev, &params->others.gic_cfg, id, true);
params->others.enh_cfg.iir_wr = true;
params->others.hist_cfg.iir_wr = true;
}
@@ -5745,22 +5768,22 @@ rkisp_params_cfg_v35(struct rkisp_isp_params_vdev *params_vdev,
/* update en immediately */
if (new_params->module_en_update ||
(new_params->module_cfg_update & ISP35_MODULE_FORCE)) {
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
type = RKISP_PARAMS_ALL;
__isp_isr_meas_config(params_vdev, new_params, type, i);
__isp_isr_other_config(params_vdev, new_params, type, i);
__isp_isr_other_en(params_vdev, new_params, type, i);
__isp_isr_meas_en(params_vdev, new_params, type, i);
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
new_params->module_cfg_update = 0;
}
if ((!dev->is_aiisp_en || dev->is_aiisp_sync) &&
if (!dev->is_aiisp_en &&
(new_params->module_cfg_update &
(ISP35_MODULE_LDCH | ISP35_MODULE_BAY3D)))
module_data_abandon(params_vdev, new_params, i);
new_params++;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
else
list_add_tail(&cur_buf->queue, &params_vdev->params_be);
@@ -5788,17 +5811,16 @@ rkisp_params_cfg_v35(struct rkisp_isp_params_vdev *params_vdev,
params_rec->others.hdrmge_cfg = new_params->others.hdrmge_cfg;
params_rec->module_cfg_update |= ISP35_MODULE_HDRMGE;
}
if (new_params->module_cfg_update & ISP35_MODULE_DRC &&
(!dev->is_aiisp_en || dev->is_aiisp_sync)) {
if (new_params->module_cfg_update & ISP35_MODULE_DRC && !dev->is_aiisp_en) {
params_rec->others.drc_cfg = new_params->others.drc_cfg;
params_rec->module_cfg_update |= ISP35_MODULE_DRC;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
new_params->module_cfg_update = 0;
new_params++;
params_rec++;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
else
list_add_tail(&cur_buf->queue, &params_vdev->params_be);
@@ -5814,10 +5836,9 @@ rkisp_params_clear_fstflg(struct rkisp_isp_params_vdev *params_vdev)
if (params_vdev->dev->hw_dev->is_single)
return;
value &= (ISP3X_YNR_FST_FRAME |
ISP3X_CNR_FST_FRAME | ISP33_GIC_FST_FRAME |
ISP33_ENH_FST_FRAME | ISP33_YHIST_FST_FRAME |
ISP3X_RAW3D_FST_FRAME | ISP32_SHP_FST_FRAME);
value &= (ISP3X_YNR_FST_FRAME | ISP33_YHIST_FST_FRAME |
ISP3X_CNR_FST_FRAME | ISP3X_RAW3D_FST_FRAME |
ISP33_ENH_FST_FRAME);
for (i = 0; i < params_vdev->dev->unite_div && value; i++)
isp3_param_clear_bits(params_vdev, ISP3X_ISP_CTRL1, value, i);
}
@@ -5829,11 +5850,8 @@ rkisp_params_aiisp_update_buf(struct rkisp_isp_params_vdev *params_vdev)
unsigned long lock_flags = 0;
u32 val;
if (params_vdev->dev->is_aiisp_sync)
return;
spin_lock_irqsave(&priv->buf_lock, lock_flags);
val = isp3_param_read_direct(params_vdev, ISP3X_MI_BAY3D_IIR_WR_BASE_SHD);
val = isp3_param_read_cache(params_vdev, ISP3X_MI_BAY3D_IIR_WR_BASE, 0);
isp3_param_write(params_vdev, val, ISP3X_MI_BAY3D_IIR_RD_BASE, 0);
priv->pbuf_bay3d_iir = NULL;
if (!list_empty(&priv->iir_list)) {
@@ -5856,9 +5874,10 @@ rkisp_params_aiisp_update_buf(struct rkisp_isp_params_vdev *params_vdev)
isp3_param_write(params_vdev, val, ISP3X_MI_GAIN_WR_BASE, 0);
priv->gain_cur_idx = priv->pbuf_gain_wr->index;
}
val = ISP3X_BAY3D_IIRSELF_UPD | ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAINSELF_UPD;
isp3_param_set_bits(params_vdev, MI_WR_CTRL2, val, 0);
if (params_vdev->dev->hw_dev->is_single) {
val = ISP3X_BAY3D_IIRSELF_UPD | ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAINSELF_UPD;
isp3_param_set_bits(params_vdev, MI_WR_CTRL2, val, 0);
}
priv->pbuf_aipre_gain = NULL;
if (!list_empty(&priv->aipre_gain_list)) {
priv->pbuf_aipre_gain = list_first_entry(&priv->aipre_gain_list,
@@ -5868,12 +5887,14 @@ rkisp_params_aiisp_update_buf(struct rkisp_isp_params_vdev *params_vdev)
val = priv->pbuf_aipre_gain->dma_addr;
isp3_param_write(params_vdev, val, ISP35_AI_PRE_GAIN_WR_BASE, 0);
val = isp3_param_read(params_vdev, ISP35_AI_CTRL, 0);
val &= ~ISP35_AIISP_ST;
val |= ISP35_AIPRE_ITS_FORCE_UPD;
isp3_param_write(params_vdev, val, ISP35_AI_CTRL, 0);
val &= ~ISP35_AIPRE_ITS_FORCE_UPD;
isp3_param_write(params_vdev, val, ISP35_AI_CTRL, 0);
if (params_vdev->dev->hw_dev->is_single) {
val = isp3_param_read(params_vdev, ISP35_AI_CTRL, 0);
val &= ~ISP35_AIISP_ST;
val |= ISP35_AIPRE_ITS_FORCE_UPD;
isp3_param_write(params_vdev, val, ISP35_AI_CTRL, 0);
val &= ~ISP35_AIPRE_ITS_FORCE_UPD;
isp3_param_write(params_vdev, val, ISP35_AI_CTRL, 0);
}
}
v4l2_dbg(3, rkisp_debug, &params_vdev->dev->v4l2_dev,
@@ -5940,7 +5961,7 @@ rkisp_params_aiisp_event_v35(struct rkisp_isp_params_vdev *params_vdev, u32 irq)
ev_info->aiisp_index = priv->pbuf_aiisp->index;
priv->pbuf_aiisp = NULL;
}
if (priv->pbuf_gain_rd && !dev->is_aiisp_sync) {
if (priv->pbuf_gain_rd) {
list_add_tail(&priv->pbuf_gain_rd->queue, &priv->gain_list);
priv->pbuf_gain_rd = NULL;
}
@@ -6015,13 +6036,17 @@ rkisp_params_aiisp_start_v35(struct rkisp_isp_params_vdev *params_vdev,
struct rkisp_device *dev = params_vdev->dev;
struct rkisp_dummy_buffer *buf, *buf_tmp;
unsigned long lock_flags = 0;
u32 val, seq = st->sequence;
u32 val, aiisp_rd, seq = st->sequence;
if (!dev->is_aiisp_en)
return -EINVAL;
v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
"isp_be input seq:%d idx(iir:%d gain:%d vpsl:%d aipre:%d aiisp:%d)\n",
seq, st->iir_index, st->gain_index, st->vpsl_index,
st->aipre_gain_index, st->aiisp_index);
if (st->gain_index < 0 || st->gain_index >= priv->gain_cnt ||
st->aiisp_index < 0 || st->aiisp_index >= priv->aiisp_cnt ||
st->iir_index < 0 || st->iir_index >= priv->bay3d_iir_cnt ||
st->aiisp_index >= priv->aiisp_cnt ||
st->vpsl_index >= priv->vpsl_cnt ||
st->aipre_gain_index >= priv->aipre_gain_cnt) {
dev_err(dev->dev, "%s seq:%d error, aiisp(%d cnt:%d)\n"
@@ -6032,71 +6057,74 @@ rkisp_params_aiisp_start_v35(struct rkisp_isp_params_vdev *params_vdev,
return -EINVAL;
}
if (!dev->is_aiisp_sync)
rkisp_params_cfg(params_vdev, seq, RKISP_PARAMS_LAT);
rkisp_params_cfg(params_vdev, seq, RKISP_PARAMS_LAT);
spin_lock_irqsave(&priv->buf_lock, lock_flags);
if (!dev->is_aiisp_sync) {
buf = &priv->buf_bay3d_iir[st->iir_index];
list_for_each_entry(buf_tmp, &priv->iir_list, queue) {
buf = &priv->buf_bay3d_iir[st->iir_index];
if (st->aiisp_index >= 0) {
priv->pbuf_aiisp = &priv->buf_aiisp[st->aiisp_index];
aiisp_rd = priv->pbuf_aiisp->dma_addr;
} else {
/* NPU no output, just using iir data */
aiisp_rd = buf->dma_addr;
}
priv->aiisp_cur_idx = st->aiisp_index;
list_for_each_entry(buf_tmp, &priv->iir_list, queue) {
if (buf_tmp == buf) {
dev_err(dev->dev, "iir idx:%d error\n", st->iir_index);
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
return 0;
}
}
list_add_tail(&buf->queue, &priv->iir_list);
if (st->aipre_gain_index >= 0) {
buf = &priv->buf_aipre_gain[st->aipre_gain_index];
list_for_each_entry(buf_tmp, &priv->aipre_gain_list, queue) {
if (buf_tmp == buf) {
dev_err(dev->dev, "iir idx:%d error\n", st->iir_index);
dev_err(dev->dev, "aipre idx:%d error\n", st->aipre_gain_index);
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
return 0;
}
}
list_add_tail(&buf->queue, &priv->iir_list);
list_add_tail(&buf->queue, &priv->aipre_gain_list);
}
if (st->aipre_gain_index >= 0) {
buf = &priv->buf_aipre_gain[st->aipre_gain_index];
list_for_each_entry(buf_tmp, &priv->aipre_gain_list, queue) {
if (buf_tmp == buf) {
dev_err(dev->dev, "aipre idx:%d error\n", st->aipre_gain_index);
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
return 0;
}
if (st->vpsl_index >= 0) {
buf = &priv->buf_vpsl[st->vpsl_index];
list_for_each_entry(buf_tmp, &priv->vpsl_list, queue) {
if (buf_tmp == buf) {
dev_err(dev->dev, "vpsl idx:%d error\n", st->vpsl_index);
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
return 0;
}
list_add_tail(&buf->queue, &priv->aipre_gain_list);
}
if (st->vpsl_index >= 0) {
buf = &priv->buf_vpsl[st->vpsl_index];
list_for_each_entry(buf_tmp, &priv->vpsl_list, queue) {
if (buf_tmp == buf) {
dev_err(dev->dev, "vpsl idx:%d error\n", st->vpsl_index);
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
return 0;
}
}
list_add_tail(&buf->queue, &priv->vpsl_list);
}
list_add_tail(&buf->queue, &priv->vpsl_list);
}
priv->pbuf_gain_rd = &priv->buf_gain[st->gain_index];
priv->pbuf_aiisp = &priv->buf_aiisp[st->aiisp_index];
priv->aiisp_cur_idx = st->aiisp_index;
val = priv->pbuf_aiisp->dma_addr;
rkisp_write(dev, ISP39_AIISP_RD_BASE, val, true);
rkisp_write(dev, ISP39_AIISP_RD_BASE, aiisp_rd, false);
val = priv->pbuf_gain_rd->dma_addr;
if (!params_vdev->is_hdr) {
rkisp_write(dev, ISP3X_MI_RAW0_RD_BASE, val, true);
rkisp_set_bits(dev, ISP3X_CSI2RX_RAW_RD_CTRL, 0, ISP35_RX0_FORCE_UPD, true);
val = ISP3X_DBR_RDSELF_UPD;
rkisp_write(dev, ISP3X_MI_RAW0_RD_BASE, val, false);
if (dev->hw_dev->is_single) {
rkisp_set_bits(dev, ISP3X_CSI2RX_RAW_RD_CTRL, 0, ISP35_RX0_FORCE_UPD, true);
rkisp_set_bits(dev, ISP3X_MI_WR_CTRL2, 0, ISP3X_DBR_RDSELF_UPD, true);
}
} else {
rkisp_write(dev, ISP35_B3DLDCH_RD_BASE, val, true);
val = ISP3X_DBR_RDSELF_UPD | ISP3X_BAY3D_RDSELF_UPD;
rkisp_write(dev, ISP35_B3DLDCH_RD_BASE, val, false);
if (dev->hw_dev->is_single) {
val = ISP3X_DBR_RDSELF_UPD | ISP3X_BAY3D_RDSELF_UPD;
rkisp_set_bits(dev, ISP3X_MI_WR_CTRL2, 0, val, true);
}
}
rkisp_set_bits(dev, ISP3X_MI_WR_CTRL2, 0, val, true);
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
val = params_vdev->is_hdr ? ISP35_B3DLDCH_RD_BASE_SHD : ISP3X_MI_RAW0_RD_BASE_SHD;
v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
"isp_be start seq:%d idx(%d %d) %x %x, %x:%x %x:%x\n",
seq, st->aiisp_index, st->gain_index,
(u32)priv->pbuf_aiisp->dma_addr,
(u32)priv->pbuf_gain_rd->dma_addr,
"isp_be start seq:%d (%x %x | %x:%x %x:%x)\n",
seq, aiisp_rd, (u32)priv->pbuf_gain_rd->dma_addr,
ISP3X_MI_DBR_RD_BASE_SHD, rkisp_read(dev, ISP3X_MI_DBR_RD_BASE_SHD, true),
val, rkisp_read(dev, val, true));
return 0;
@@ -6191,14 +6219,14 @@ rkisp_params_isr_v35(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis)
isp3_param_write(params_vdev, val, ISP3X_MI_BAY3D_CUR_WR_BASE, i);
}
}
for (i = 0; i < dev->unite_div && !dev->is_aiisp_en; i++) {
for (i = 0; i < dev->unite_div; i++) {
if (params_rec->module_cfg_update & ISP35_MODULE_HDRMGE &&
(dev->is_aiisp_en || IS_HDR_RDBK(dev->rd_mode))) {
isp_hdrmge_config(params_vdev, &params_rec->others.hdrmge_cfg, RKISP_PARAMS_SHD, i);
params_rec->module_cfg_update &= ~ISP35_MODULE_HDRMGE;
}
if (params_rec->module_cfg_update & ISP35_MODULE_DRC &&
((!dev->is_aiisp_en && IS_HDR_RDBK(dev->rd_mode)) || dev->is_aiisp_sync)) {
(!dev->is_aiisp_en && IS_HDR_RDBK(dev->rd_mode))) {
isp_hdrdrc_config(params_vdev, &params_rec->others.drc_cfg, RKISP_PARAMS_SHD, i);
params_rec->module_cfg_update &= ~ISP35_MODULE_DRC;
}
@@ -6225,10 +6253,9 @@ rkisp_params_isr_v35(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis)
void rkisp_params_vpsl_mi_isr_v35(struct rkisp_isp_params_vdev *params_vdev, u32 mis_val)
{
struct rkisp_isp_params_val_v35 *priv = params_vdev->priv_val;
struct rkisp_device *dev = params_vdev->dev;
unsigned long lock_flags = 0;
if (params_vdev->dev->is_aiisp_sync)
return;
spin_lock_irqsave(&priv->buf_lock, lock_flags);
if (mis_val & VPSL_MI_YRAW_ALL_END) {
priv->pbuf_vpsl = NULL;
@@ -6238,6 +6265,8 @@ void rkisp_params_vpsl_mi_isr_v35(struct rkisp_isp_params_vdev *params_vdev, u32
list_del(&priv->pbuf_vpsl->queue);
vpsl_update_buf(params_vdev);
}
if (dev->is_aiisp_sync || !priv->yraw_sel)
rkisp_check_idle(dev, ISP_FRAME_VPSL);
}
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
}

View File

@@ -755,8 +755,7 @@ isp_awbgain_config(struct rkisp_isp_params_vdev *params_vdev,
return;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync ||
type == RKISP_PARAMS_ALL || type == RKISP_PARAMS_LAT) {
if (!dev->is_aiisp_en || type == RKISP_PARAMS_ALL || type == RKISP_PARAMS_LAT) {
isp3_param_write(params_vdev,
ISP_PACK_2SHORT(arg->awb1_gain_gb, arg->awb1_gain_gr),
ISP32_ISP_AWB1_GAIN_G, id);
@@ -3837,7 +3836,7 @@ void __isp_isr_other_config(struct rkisp_isp_params_vdev *params_vdev,
if (module_cfg_update & ISP39_MODULE_BAY3D && type != RKISP_PARAMS_LAT)
isp_bay3d_config(params_vdev, &new_params->others.bay3d_cfg, id);
if (type == RKISP_PARAMS_IMD && dev->is_aiisp_en && !dev->is_aiisp_sync)
if (type == RKISP_PARAMS_IMD && dev->is_aiisp_en)
return;
if (module_cfg_update & ISP39_MODULE_CAC)
@@ -3997,14 +3996,14 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev,
"%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 || dev->is_aiisp_sync || type != RKISP_PARAMS_LAT) {
if (!dev->is_aiisp_en || type != RKISP_PARAMS_LAT) {
if (module_cfg_update & ISP39_MODULE_RAWAE0)
isp_rawae0_config(params_vdev, &new_params->meas.rawae0, id);
if (module_cfg_update & ISP39_MODULE_RAWHIST0)
isp_rawhst0_config(params_vdev, &new_params->meas.rawhist0, id);
if ((module_cfg_update & ISP39_MODULE_RAWAF))
isp_rawaf_config(params_vdev, &new_params->meas.rawaf, id);
if (dev->is_aiisp_en && !dev->is_aiisp_sync && type == RKISP_PARAMS_IMD) {
if (dev->is_aiisp_en && type == RKISP_PARAMS_IMD) {
params_vdev->cur_fe_frame_id = new_params->frame_id;
return;
}
@@ -5003,22 +5002,22 @@ rkisp_params_cfg_v39(struct rkisp_isp_params_vdev *params_vdev,
/* update en immediately */
if (new_params->module_en_update ||
(new_params->module_cfg_update & ISP39_MODULE_FORCE)) {
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
type = RKISP_PARAMS_ALL;
__isp_isr_meas_config(params_vdev, new_params, type, i);
__isp_isr_other_config(params_vdev, new_params, type, i);
__isp_isr_other_en(params_vdev, new_params, type, i);
__isp_isr_meas_en(params_vdev, new_params, type, i);
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
new_params->module_cfg_update = 0;
}
if ((!dev->is_aiisp_en || dev->is_aiisp_sync) &&
if (!dev->is_aiisp_en &&
(new_params->module_cfg_update &
(ISP39_MODULE_LDCH | ISP39_MODULE_CAC | ISP39_MODULE_LDCV)))
module_data_abandon(params_vdev, new_params, i);
new_params++;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
else
list_add_tail(&cur_buf->queue, &params_vdev->params_be);
@@ -5042,18 +5041,17 @@ rkisp_params_cfg_v39(struct rkisp_isp_params_vdev *params_vdev,
__isp_isr_other_config(params_vdev, new_params, type, i);
__isp_isr_other_en(params_vdev, new_params, type, i);
__isp_isr_meas_en(params_vdev, new_params, type, i);
if (IS_HDR_RDBK(dev->rd_mode) &&
(!dev->is_aiisp_en || dev->is_aiisp_sync)) {
if (IS_HDR_RDBK(dev->rd_mode) && !dev->is_aiisp_en) {
params_rec->others.hdrmge_cfg = new_params->others.hdrmge_cfg;
params_rec->others.drc_cfg = new_params->others.drc_cfg;
params_rec->module_cfg_update = new_params->module_cfg_update;
params_rec++;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
new_params->module_cfg_update = 0;
new_params++;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
else
list_add_tail(&cur_buf->queue, &params_vdev->params_be);
@@ -5082,12 +5080,9 @@ rkisp_params_aiisp_update_buf(struct rkisp_isp_params_vdev *params_vdev)
unsigned long lock_flags = 0;
u32 val;
if (params_vdev->dev->is_aiisp_sync)
return;
val = isp3_param_read_direct(params_vdev, ISP3X_MI_BAY3D_IIR_WR_BASE_SHD);
isp3_param_write(params_vdev, val, ISP3X_MI_BAY3D_IIR_RD_BASE, 0);
spin_lock_irqsave(&priv->buf_lock, lock_flags);
val = isp3_param_read_cache(params_vdev, ISP3X_MI_BAY3D_IIR_WR_BASE, 0);
isp3_param_write(params_vdev, val, ISP3X_MI_BAY3D_IIR_RD_BASE, 0);
priv->pbuf_bay3d_iir = NULL;
if (!list_empty(&priv->iir_list)) {
priv->pbuf_bay3d_iir = list_first_entry(&priv->iir_list,
@@ -5109,8 +5104,10 @@ rkisp_params_aiisp_update_buf(struct rkisp_isp_params_vdev *params_vdev)
isp3_param_write(params_vdev, val, ISP3X_MI_GAIN_WR_BASE, 0);
priv->gain_cur_idx = priv->pbuf_gain_wr->index;
}
val = ISP3X_BAY3D_IIRSELF_UPD | ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAINSELF_UPD;
isp3_param_set_bits(params_vdev, MI_WR_CTRL2, val, 0);
if (params_vdev->dev->hw_dev->is_single) {
val = ISP3X_BAY3D_IIRSELF_UPD | ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAINSELF_UPD;
isp3_param_set_bits(params_vdev, MI_WR_CTRL2, val, 0);
}
v4l2_dbg(3, rkisp_debug, &params_vdev->dev->v4l2_dev,
"%s %x:%x %x:%x %x:%x, iir:%x gain:%x\n", __func__,
ISP3X_MI_BAY3D_IIR_WR_BASE_SHD,
@@ -5160,7 +5157,7 @@ rkisp_params_aiisp_event_v39(struct rkisp_isp_params_vdev *params_vdev, u32 irq)
ev_info->aiisp_index = priv->pbuf_aiisp->index;
priv->pbuf_aiisp = NULL;
}
if (priv->pbuf_gain_rd && !dev->is_aiisp_sync) {
if (priv->pbuf_gain_rd) {
list_add_tail(&priv->pbuf_gain_rd->queue, &priv->gain_list);
priv->pbuf_gain_rd = NULL;
}
@@ -5195,13 +5192,13 @@ rkisp_params_aiisp_start_v39(struct rkisp_isp_params_vdev *params_vdev,
struct rkisp_device *dev = params_vdev->dev;
struct rkisp_dummy_buffer *buf, *buf_tmp;
unsigned long lock_flags = 0;
u32 val, seq = st->sequence;
u32 val, aiisp_rd, seq = st->sequence;
if (!dev->is_aiisp_en)
return -EINVAL;
if (st->gain_index < 0 || st->gain_index >= priv->gain_cnt ||
st->aiisp_index < 0 || st->aiisp_index >= priv->aiisp_cnt ||
st->aiisp_index < 0 || st->iir_index >= priv->bay3d_iir_cnt) {
st->iir_index < 0 || st->iir_index >= priv->bay3d_iir_cnt ||
st->aiisp_index >= priv->aiisp_cnt) {
dev_err(dev->dev,
"%s seq:%d error, gain idx:%d cnt:%d, iir idx:%d cnt:%d aiisp idx:%d cnt:%d\n",
__func__, seq, st->gain_index, priv->gain_cnt,
@@ -5210,35 +5207,37 @@ rkisp_params_aiisp_start_v39(struct rkisp_isp_params_vdev *params_vdev,
}
spin_lock_irqsave(&priv->buf_lock, lock_flags);
if (!dev->is_aiisp_sync) {
buf = &priv->buf_bay3d_iir[st->iir_index];
list_for_each_entry(buf_tmp, &priv->iir_list, queue) {
if (buf_tmp == buf) {
dev_err(dev->dev, "iir idx:%d error\n", st->iir_index);
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
return 0;
}
}
list_add_tail(&buf->queue, &priv->iir_list);
buf = &priv->buf_bay3d_iir[st->iir_index];
if (st->aiisp_index >= 0) {
priv->pbuf_aiisp = &priv->buf_aiisp[st->aiisp_index];
aiisp_rd = priv->pbuf_aiisp->dma_addr;
} else {
/* NPU no output, just using iir data */
aiisp_rd = buf->dma_addr;
}
priv->pbuf_gain_rd = &priv->buf_gain[st->gain_index];
priv->pbuf_aiisp = &priv->buf_aiisp[st->aiisp_index];
priv->aiisp_cur_idx = st->aiisp_index;
list_for_each_entry(buf_tmp, &priv->iir_list, queue) {
if (buf_tmp == buf) {
dev_err(dev->dev, "iir idx:%d error\n", st->iir_index);
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
return 0;
}
}
list_add_tail(&buf->queue, &priv->iir_list);
priv->pbuf_gain_rd = &priv->buf_gain[st->gain_index];
spin_unlock_irqrestore(&priv->buf_lock, lock_flags);
if (!dev->is_aiisp_sync)
rkisp_params_cfg(&dev->params_vdev, seq, RKISP_PARAMS_LAT);
val = priv->pbuf_aiisp->dma_addr;
rkisp_write(dev, ISP39_AIISP_RD_BASE, val, true);
rkisp_params_cfg(&dev->params_vdev, seq, RKISP_PARAMS_LAT);
rkisp_write(dev, ISP39_AIISP_RD_BASE, aiisp_rd, false);
val = priv->pbuf_gain_rd->dma_addr;
rkisp_write(dev, ISP3X_MI_RAW0_RD_BASE, val, true);
rkisp_set_bits(dev, ISP3X_MI_WR_CTRL2, 0, ISP3X_DBR_RDSELF_UPD, true);
rkisp_set_bits(dev, ISP3X_CSI2RX_RAW_RD_CTRL, 0, ISP3X_RXSELF_FORCE_UPD, true);
rkisp_write(dev, ISP3X_MI_RAW0_RD_BASE, val, false);
if (dev->hw_dev->is_single) {
rkisp_set_bits(dev, ISP3X_MI_WR_CTRL2, 0, ISP3X_DBR_RDSELF_UPD, true);
rkisp_set_bits(dev, ISP3X_CSI2RX_RAW_RD_CTRL, 0, ISP3X_RXSELF_FORCE_UPD, true);
}
v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev,
"isp_be start seq:%d idx(%d %d) %x %x, %x:%x %x:%x\n",
seq, st->aiisp_index, st->gain_index,
(u32)priv->pbuf_aiisp->dma_addr,
seq, st->aiisp_index, st->gain_index, aiisp_rd,
(u32)priv->pbuf_gain_rd->dma_addr,
ISP3X_MI_DBR_RD_BASE_SHD, rkisp_read(dev, ISP3X_MI_DBR_RD_BASE_SHD, true),
ISP3X_MI_RAW0_RD_BASE_SHD, rkisp_read(dev, ISP3X_MI_RAW0_RD_BASE_SHD, true));
@@ -5273,11 +5272,14 @@ rkisp_params_isr_v39(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis)
struct isp39_isp_params_cfg *params = params_vdev->isp39_params;
for (i = 0; i < dev->unite_div; i++) {
if (params->module_cfg_update & ISP39_MODULE_HDRMGE)
if (params->module_cfg_update & ISP39_MODULE_HDRMGE) {
isp_hdrmge_config(params_vdev, &params->others.hdrmge_cfg, RKISP_PARAMS_SHD, i);
if (params->module_cfg_update & ISP39_MODULE_DRC)
params->module_cfg_update &= ~ISP39_MODULE_HDRMGE;
}
if (params->module_cfg_update & ISP39_MODULE_DRC && !dev->is_aiisp_en) {
isp_hdrdrc_config(params_vdev, &params->others.drc_cfg, RKISP_PARAMS_SHD, i);
params->module_cfg_update = 0;
params->module_cfg_update &= ~ISP39_MODULE_DRC;
}
params++;
}
return;

View File

@@ -38,23 +38,41 @@ static int
rkisp_stats_get_sharp_stats(struct rkisp_isp_stats_vdev *stats_vdev,
struct rkisp35_stat_buffer *pbuf)
{
struct isp33_sharp_stat *sharp;
u32 i, val;
struct rkisp_device *dev = stats_vdev->dev;
struct rkisp_isp_params_vdev *params = &dev->params_vdev;
struct isp35_isp_params_cfg *params_rec = params->isp35_params + dev->unite_index;
struct isp35_sharp_cfg *sharp_arg_rec = &params_rec->others.sharp_cfg;
struct isp33_gic_cfg *gic_arg_rec = &params_rec->others.gic_cfg;
struct isp33_sharp_stat *sharp_stat = NULL;
u16 noise_curve[ISP35_SHARP_NOISE_CURVE_NUM];
u32 i, val, size = sizeof(noise_curve);
bool is_sharp_curve_mode, is_gic_curve_mode;
if (!pbuf)
return 0;
if (pbuf)
sharp_stat = &pbuf->stat.sharp;
val = isp3_stats_read(stats_vdev, ISP3X_SHARP_EN);
if (val & 0x1) {
sharp = &pbuf->stat.sharp;
is_sharp_curve_mode = !!(val & BIT(8));
val = isp3_stats_read(stats_vdev, ISP3X_GIC_CONTROL);
is_gic_curve_mode = (!(val & 1) || !!(val & BIT(3)));
/* noise_curve_ext noise_curve and bfflt_vsigma_y are of the same size */
for (i = 0; i < ISP35_SHARP_NOISE_CURVE_NUM / 2; i++) {
val = isp3_stats_read(stats_vdev, ISP33_SHARP_NOISE_CURVE0 + i * 4);
sharp->noise_curve[i * 2] = val & 0x7ff;
sharp->noise_curve[i * 2 + 1] = (val >> 16) & 0x7ff;
noise_curve[i * 2] = val & 0x7ff;
noise_curve[i * 2 + 1] = (val >> 16) & 0x7ff;
}
val = isp3_stats_read(stats_vdev, ISP33_SHARP_NOISE_CURVE8);
sharp->noise_curve[i * 2] = val & 0x7ff;
pbuf->meas_type |= ISP35_STAT_SHARP;
noise_curve[i * 2] = val & 0x7ff;
if (sharp_stat) {
pbuf->meas_type |= ISP35_STAT_SHARP;
memcpy(sharp_stat->noise_curve, noise_curve, size);
}
/* save hardware curve for next frame config if resume or multi-sensor */
if (!is_sharp_curve_mode)
memcpy(sharp_arg_rec->noise_curve_ext, noise_curve, size);
if (!is_gic_curve_mode)
memcpy(gic_arg_rec->bfflt_vsigma_y, noise_curve, size);
}
return 0;
}
@@ -198,7 +216,7 @@ rkisp_stats_update_buf(struct rkisp_isp_stats_vdev *stats_vdev)
u32 val, addr = 0, offset = 0;
int i, ret = 0;
if (!dev->is_aiisp_en || dev->is_aiisp_sync) {
if (!dev->is_aiisp_en) {
spin_lock_irqsave(&stats_vdev->rd_lock, flags);
if (!stats_vdev->nxt_buf && !list_empty(&stats_vdev->stat)) {
buf = list_first_entry(&stats_vdev->stat,
@@ -398,7 +416,7 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev)
u32 mask = ISP3X_3A_RAWAF;
u64 ns;
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
return;
if (priv->is_ae0_fe)
mask |= ISP3X_3A_RAWAE_CH0 | ISP3X_3A_RAWHIST_CH0;
@@ -513,7 +531,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
unsigned long flags = 0;
mask = ISP3X_3A_RAWAWB | ISP35_AIAWB_DONE | ISP3X_3A_DDR_DONE;
if (!dev->is_aiisp_en || dev->is_aiisp_sync) {
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;
}
@@ -523,7 +541,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
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 && !dev->is_aiisp_sync) {
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);
@@ -552,7 +570,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, &ns, !dev->is_aiisp_en);
if (!ns)
ns = ktime_get_ns();
if (dev->is_aiisp_en && !dev->is_aiisp_sync) {
if (dev->is_aiisp_en) {
spin_lock_irqsave(&stats_vdev->rd_lock, flags);
if (!list_empty(&stats_vdev->stat)) {
cur_buf = list_first_entry(&stats_vdev->stat,
@@ -589,7 +607,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
stats_vdev->cur_buf = stats_vdev->nxt_buf;
stats_vdev->nxt_buf = NULL;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
rkisp_stats_update_buf(stats_vdev);
}
} else {
@@ -614,31 +632,31 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
cur_stat_buf->meas_type |= ISP35_STAT_RAWAF;
if (ris & (mask & ISP3X_3A_RAWAE_CH0) && cur_stat_buf) {
cur_stat_buf->meas_type |= ISP35_STAT_RAWAE0;
if (dev->is_aiisp_en && !dev->is_aiisp_sync && stat_tmp_buf)
if (dev->is_aiisp_en && stat_tmp_buf)
memcpy(&cur_stat_buf->stat.rawae0,
&stat_tmp_buf->stat.rawae0, sizeof(struct isp33_rawae_stat));
}
if (ris & (mask & ISP3X_3A_RAWHIST_CH0) && cur_stat_buf) {
cur_stat_buf->meas_type |= ISP35_STAT_RAWHST0;
if (dev->is_aiisp_en && !dev->is_aiisp_sync && stat_tmp_buf)
if (dev->is_aiisp_en && stat_tmp_buf)
memcpy(&cur_stat_buf->stat.rawhist0,
&stat_tmp_buf->stat.rawhist0, sizeof(struct isp33_rawhist_stat));
}
if (ris & (mask & ISP3X_3A_RAWAE_BIG) && cur_stat_buf) {
cur_stat_buf->meas_type |= ISP35_STAT_RAWAE3;
if (dev->is_aiisp_en && !dev->is_aiisp_sync && stat_tmp_buf)
if (dev->is_aiisp_en && stat_tmp_buf)
memcpy(&cur_stat_buf->stat.rawae3,
&stat_tmp_buf->stat.rawae3, sizeof(struct isp33_rawae_stat));
}
if (ris & (mask & ISP3X_3A_RAWHIST_BIG) && cur_stat_buf) {
cur_stat_buf->meas_type |= ISP35_STAT_RAWHST3;
if (dev->is_aiisp_en && !dev->is_aiisp_sync && stat_tmp_buf)
if (dev->is_aiisp_en && stat_tmp_buf)
memcpy(&cur_stat_buf->stat.rawhist3,
&stat_tmp_buf->stat.rawhist3, sizeof(struct isp33_rawhist_stat));
}
if (ris & (mask & ISP3X_3A_RAWAWB) && cur_stat_buf) {
cur_stat_buf->meas_type |= ISP35_STAT_RAWAWB;
if (dev->is_aiisp_en && !dev->is_aiisp_sync && stat_tmp_buf)
if (dev->is_aiisp_en && stat_tmp_buf)
memcpy(&cur_stat_buf->stat.rawawb,
&stat_tmp_buf->stat.rawawb, sizeof(struct isp33_rawawb_stat));
}
@@ -647,7 +665,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
if (ris & ISP35_AWBSYNC_DONE && cur_stat_buf)
rkisp_stats_get_awbsync_stats(stats_vdev, cur_stat_buf);
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
rkisp_stats_get_bay3d_stats(stats_vdev, cur_stat_buf);
rkisp_stats_get_sharp_stats(stats_vdev, cur_stat_buf);
rkisp_stats_get_enh_stats(stats_vdev, cur_stat_buf);
@@ -756,7 +774,7 @@ rkisp_stats_first_ddr_config_v35(struct rkisp_isp_stats_vdev *stats_vdev)
rkisp_unite_set_bits(dev, ISP3X_SWS_CFG, 0, ISP3X_3A_DDR_WRITE_EN, false);
val = rkisp_read(dev, ISP39_W3A_CTRL0, false);
val |= ISP39_W3A_EN | ISP39_W3A_FORCE_UPD;
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
val |= ISP39_W3A_AUTO_CLR_EN;
if (pdaf_vdev && pdaf_vdev->streaming) {
val |= ISP39_W3A_PDAF_EN;
@@ -785,7 +803,7 @@ rkisp_stats_next_ddr_config_v35(struct rkisp_isp_stats_vdev *stats_vdev)
return;
/* pingpong buf */
if (hw->is_single) {
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
rkisp_stats_update_buf(stats_vdev);
if (pdaf_vdev && pdaf_vdev->streaming)
rkisp_pdaf_update_buf(dev);

View File

@@ -123,7 +123,7 @@ rkisp_stats_update_buf(struct rkisp_isp_stats_vdev *stats_vdev)
u32 val, addr = 0, offset = 0;
int i, ret = 0;
if (!dev->is_aiisp_en || dev->is_aiisp_sync) {
if (!dev->is_aiisp_en) {
spin_lock_irqsave(&stats_vdev->rd_lock, flags);
if (!stats_vdev->nxt_buf && !list_empty(&stats_vdev->stat)) {
buf = list_first_entry(&stats_vdev->stat,
@@ -268,7 +268,7 @@ rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev)
u32 mask = ISP3X_3A_RAWAF | ISP3X_3A_RAWHIST_CH0 | ISP3X_3A_RAWAE_CH0;
u64 ns;
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
return;
if (ris & mask) {
@@ -347,11 +347,11 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
u32 mask = ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG | ISP3X_3A_RAWAWB | ISP3X_3A_DDR_DONE;
u64 ns;
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
mask |= ISP3X_3A_RAWAF | ISP3X_3A_RAWHIST_CH0 | ISP3X_3A_RAWAE_CH0;
if (ris & mask) {
isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, ris & mask);
if (dev->is_aiisp_en && !dev->is_aiisp_sync) {
if (dev->is_aiisp_en) {
val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_BIG1_BASE);
if (val & ISP39_3A_MEAS_DONE)
isp3_module_done(stats_vdev, ISP3X_RAWAE_BIG1_BASE, val);
@@ -366,7 +366,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, &ns, !dev->is_aiisp_en);
if (!ns)
ns = ktime_get_ns();
if (dev->is_aiisp_en && !dev->is_aiisp_sync) {
if (dev->is_aiisp_en) {
spin_lock_irqsave(&stats_vdev->rd_lock, flags);
if (!list_empty(&stats_vdev->stat)) {
cur_buf = list_first_entry(&stats_vdev->stat,
@@ -404,7 +404,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
stats_vdev->cur_buf = stats_vdev->nxt_buf;
stats_vdev->nxt_buf = NULL;
}
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
rkisp_stats_update_buf(stats_vdev);
}
} else {
@@ -419,25 +419,25 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev)
cur_stat_buf->meas_type |= ISP39_STAT_RAWHST0;
if (ris & (mask & ISP3X_3A_RAWAE_BIG) && cur_stat_buf) {
cur_stat_buf->meas_type |= ISP39_STAT_RAWAE3;
if (dev->is_aiisp_en && !dev->is_aiisp_sync)
if (dev->is_aiisp_en)
memcpy(&cur_stat_buf->stat.rawae3,
&stat_tmp_buf->stat.rawae3, sizeof(struct isp39_rawae_stat));
}
if (ris & (mask & ISP3X_3A_RAWHIST_BIG) && cur_stat_buf) {
cur_stat_buf->meas_type |= ISP39_STAT_RAWHST3;
if (dev->is_aiisp_en && !dev->is_aiisp_sync)
if (dev->is_aiisp_en)
memcpy(&cur_stat_buf->stat.rawhist3,
&stat_tmp_buf->stat.rawhist3, sizeof(struct isp39_rawhist_stat));
}
if (ris & (mask & ISP3X_3A_RAWAWB) && cur_stat_buf) {
cur_stat_buf->meas_type |= ISP39_STAT_RAWAWB;
if (dev->is_aiisp_en && !dev->is_aiisp_sync)
if (dev->is_aiisp_en)
memcpy(&cur_stat_buf->stat.rawawb,
&stat_tmp_buf->stat.rawawb, sizeof(struct isp39_rawawb_stat));
}
rkisp_stats_get_dhaz_stats(stats_vdev, cur_stat_buf);
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
rkisp_stats_get_bay3d_stats(stats_vdev, cur_stat_buf);
if (cur_buf && cur_stat_buf) {
@@ -500,7 +500,7 @@ rkisp_stats_first_ddr_config_v39(struct rkisp_isp_stats_vdev *stats_vdev)
}
rkisp_unite_set_bits(dev, ISP3X_SWS_CFG, 0, ISP3X_3A_DDR_WRITE_EN, false);
val = ISP39_W3A_EN | ISP39_W3A_FORCE_UPD;
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
val |= ISP39_W3A_AUTO_CLR_EN;
if (pdaf_vdev && pdaf_vdev->streaming) {
val |= ISP39_W3A_PDAF_EN;
@@ -529,7 +529,7 @@ rkisp_stats_next_ddr_config_v39(struct rkisp_isp_stats_vdev *stats_vdev)
return;
/* pingpong buf */
if (hw->is_single) {
if (!dev->is_aiisp_en || dev->is_aiisp_sync)
if (!dev->is_aiisp_en)
rkisp_stats_update_buf(stats_vdev);
if (pdaf_vdev && pdaf_vdev->streaming)
rkisp_pdaf_update_buf(dev);

View File

@@ -1476,12 +1476,34 @@ static int isp_show(struct seq_file *p, void *v)
return 0;
}
static int rkisp_save_file(struct rkisp_device *dev, char *path, void *vaddr, u32 size)
{
struct file *fp;
if (!IS_ENABLED(CONFIG_NO_GKI))
goto err;
if (!path || !vaddr)
goto err;
fp = filp_open(path, O_RDWR | O_CREAT, 0644);
if (IS_ERR(fp)) {
dev_err(dev->dev, "open %s fail\n", path);
goto err;
}
kernel_write(fp, vaddr, size, &fp->f_pos);
filp_close(fp, NULL);
return 0;
err:
return -EINVAL;
}
static void rkisp_proc_dump_mem(struct rkisp_device *dev)
{
const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops;
void *iir_addr = NULL, *cur_addr = NULL, *ds_addr = NULL;
u32 iir_size, cur_size, ds_size;
struct file *fp = NULL;
struct rkisp_dummy_buffer *buf_iir = NULL, *buf_ds = NULL;
struct rkisp_dummy_buffer *buf_cur = NULL, *buf_wgt = NULL;
int size, idx;
void *vaddr;
char file[256];
if (!IS_ENABLED(CONFIG_NO_GKI))
@@ -1495,58 +1517,79 @@ static void rkisp_proc_dump_mem(struct rkisp_device *dev)
if (dev->isp_ver == ISP_V30) {
struct rkisp_isp_params_val_v3x *p = dev->params_vdev.priv_val;
if (p->buf_3dnr_iir.mem_priv) {
if (!p->buf_3dnr_iir.is_need_vaddr)
p->buf_3dnr_iir.vaddr =
g_ops->vaddr(NULL, p->buf_3dnr_iir.mem_priv);
iir_addr = p->buf_3dnr_iir.vaddr;
iir_size = p->buf_3dnr_iir.size;
}
if (p->buf_3dnr_cur.mem_priv) {
if (!p->buf_3dnr_cur.is_need_vaddr)
p->buf_3dnr_cur.vaddr =
g_ops->vaddr(NULL, p->buf_3dnr_cur.mem_priv);
cur_addr = p->buf_3dnr_cur.vaddr;
cur_size = p->buf_3dnr_cur.size;
}
if (p->buf_3dnr_ds.mem_priv) {
if (!p->buf_3dnr_ds.is_need_vaddr)
p->buf_3dnr_ds.vaddr =
g_ops->vaddr(NULL, p->buf_3dnr_ds.mem_priv);
ds_addr = p->buf_3dnr_ds.vaddr;
ds_size = p->buf_3dnr_ds.size;
}
buf_iir = &p->buf_3dnr_iir;
buf_cur = &p->buf_3dnr_cur;
buf_ds = &p->buf_3dnr_ds;
} else if (dev->isp_ver == ISP_V32 || dev->isp_ver == ISP_V32_L) {
struct rkisp_isp_params_val_v32 *p = dev->params_vdev.priv_val;
buf_iir = &p->buf_3dnr_iir;
buf_ds = &p->buf_3dnr_ds;
} else if (dev->isp_ver == ISP_V33) {
struct rkisp_isp_params_val_v33 *p = dev->params_vdev.priv_val;
buf_iir = &p->buf_3dnr_iir;
buf_ds = &p->buf_3dnr_ds;
buf_wgt = &p->buf_3dnr_wgt;
} else if (dev->isp_ver == ISP_V35) {
struct rkisp_isp_params_val_v35 *p = dev->params_vdev.priv_val;
idx = p->bay3d_iir_cur_idx;
if (idx >= 0 && idx < p->bay3d_iir_cnt)
buf_iir = &p->buf_bay3d_iir[idx];
idx = p->bay3d_ds_cur_idx;
if (idx >= 0 && idx < p->bay3d_ds_cnt)
buf_ds = &p->buf_bay3d_ds[idx];
idx = p->bay3d_wgt_cur_idx;
if (idx >= 0 && idx < p->bay3d_wgt_cnt)
buf_wgt = &p->buf_bay3d_wgt[idx];
} else if (dev->isp_ver == ISP_V39) {
struct rkisp_isp_params_val_v39 *p = dev->params_vdev.priv_val;
idx = p->bay3d_iir_cur_idx;
if (idx >= 0 && idx < p->bay3d_iir_cnt)
buf_iir = &p->buf_bay3d_iir[idx];
}
if (iir_addr) {
snprintf(file, sizeof(file), "/tmp/%s_bay3d_iir", dev->name);
fp = filp_open(file, O_RDWR | O_CREAT, 0644);
if (IS_ERR(fp)) {
dev_err(dev->dev, "open %s fail\n", file);
return;
if (buf_iir && buf_iir->mem_priv) {
if (!buf_iir->is_need_vaddr)
buf_iir->vaddr = g_ops->vaddr(NULL, buf_iir->mem_priv);
vaddr = buf_iir->vaddr;
size = buf_iir->size;
if (vaddr) {
snprintf(file, sizeof(file), "/tmp/%s_bay3d_iir", dev->name);
rkisp_save_file(dev, file, vaddr, size);
}
kernel_write(fp, iir_addr, iir_size, &fp->f_pos);
filp_close(fp, NULL);
}
if (cur_addr) {
snprintf(file, sizeof(file), "/tmp/%s_bay3d_cur", dev->name);
fp = filp_open(file, O_RDWR | O_CREAT, 0644);
if (IS_ERR(fp)) {
dev_err(dev->dev, "open %s fail\n", file);
return;
if (buf_ds && buf_ds->mem_priv) {
if (!buf_ds->is_need_vaddr)
buf_ds->vaddr = g_ops->vaddr(NULL, buf_ds->mem_priv);
vaddr = buf_ds->vaddr;
size = buf_ds->size;
if (vaddr) {
snprintf(file, sizeof(file), "/tmp/%s_bay3d_ds", dev->name);
rkisp_save_file(dev, file, vaddr, size);
}
kernel_write(fp, cur_addr, cur_size, &fp->f_pos);
filp_close(fp, NULL);
}
if (ds_addr) {
snprintf(file, sizeof(file), "/tmp/%s_bay3d_ds", dev->name);
fp = filp_open(file, O_RDWR | O_CREAT, 0644);
if (IS_ERR(fp)) {
dev_err(dev->dev, "open %s fail\n", file);
return;
if (buf_cur && buf_cur->mem_priv) {
if (!buf_cur->is_need_vaddr)
buf_cur->vaddr = g_ops->vaddr(NULL, buf_cur->mem_priv);
vaddr = buf_cur->vaddr;
size = buf_cur->size;
if (vaddr) {
snprintf(file, sizeof(file), "/tmp/%s_bay3d_cur", dev->name);
rkisp_save_file(dev, file, vaddr, size);
}
}
if (buf_wgt && buf_wgt->mem_priv) {
if (!buf_wgt->is_need_vaddr)
buf_wgt->vaddr = g_ops->vaddr(NULL, buf_wgt->mem_priv);
vaddr = buf_wgt->vaddr;
size = buf_wgt->size;
if (vaddr) {
snprintf(file, sizeof(file), "/tmp/%s_bay3d_wgt", dev->name);
rkisp_save_file(dev, file, vaddr, size);
}
kernel_write(fp, ds_addr, ds_size, &fp->f_pos);
filp_close(fp, NULL);
}
}

View File

@@ -3267,6 +3267,7 @@
#define ISP35_HSV_FIX_RW_CONFLICT BIT(8)
#define ISP35_HSV_AHB_CFG_LUT_EN BIT(9)
#define ISP35_HSV_TBL_CLR BIT(30)
/* AWBSYNC */
#define ISP35_AWBSYNC_FRM_PROT BIT(1)

View File

@@ -673,6 +673,8 @@ static void rkisp_update_list_reg(struct rkisp_device *dev)
rkisp_write(dev, ISP33_BP_SCALE_UPDATE, ISP32_SCALE_FORCE_UPD, true);
}
if (dev->isp_ver == ISP_V35) {
val = rkisp_read(dev, MI_WR_CTRL2, false);
writel(val, hw->base_addr + MI_WR_CTRL2);
rkisp_update_regs(dev, ISP35_AIAWB_CTRL1, ISP35_AIAWB_WR_BASE_VIR);
val = rkisp_read(dev, ISP35_AIAWB_CTRL0, false);
if (val & ISP35_AIAWB_EN) {
@@ -684,6 +686,14 @@ static void rkisp_update_list_reg(struct rkisp_device *dev)
val |= ISP3X_3A_DDR_WRITE_EN;
writel(val, hw->base_addr + ISP3X_SWS_CFG);
}
val = rkisp_read(dev, ISP35_AI_CTRL, false);
if (val & ISP35_AIISP_EN) {
val &= ~ISP35_AIISP_ST;
val |= ISP35_AIPRE_ITS_FORCE_UPD;
writel(val, hw->base_addr + ISP35_AI_CTRL);
val &= ~ISP35_AIPRE_ITS_FORCE_UPD;
writel(val, hw->base_addr + ISP35_AI_CTRL);
}
dev->params_vdev.ops->vpsl_update_regs(&dev->params_vdev);
}
if (dev->isp_ver >= ISP_V33) {
@@ -823,11 +833,13 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo
rkisp_params_cfg(params_vdev, cur_frame_id, RKISP_PARAMS_IMD);
rkisp_config_cmsk(dev);
rkisp_config_aiisp(dev);
if (!dev->is_aiisp_en)
if (!dev->is_aiisp_en ||
(dev->is_aiisp_sync && !dev->is_first_frame))
rkisp_stream_frame_start(dev, 0);
}
if (!dev->is_aiisp_en)
if (!dev->is_aiisp_en ||
(dev->is_aiisp_sync && !dev->is_first_frame))
rkisp_sditf_sof(dev, 0);
if (!hw->is_single) {
@@ -854,7 +866,9 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo
params_vdev->rdbk_times = dma2frm + 1;
run_next:
if (!dev->sw_rd_cnt)
if (!dev->sw_rd_cnt &&
(!dev->is_aiisp_en ||
(dev->is_aiisp_sync && !dev->is_first_frame)))
rkisp_rockit_frame_start(dev);
rkisp_params_cfgsram(params_vdev, true, false);
stats_vdev->rdbk_drop = false;
@@ -963,7 +977,8 @@ run_next:
if (is_3dlut_upd)
rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 1, true);
if (!dev->is_aiisp_en)
if (!dev->is_aiisp_en ||
(dev->is_aiisp_sync && !dev->is_first_frame))
rkisp_check_mi_ends_mask(dev);
if (hw->is_frm_buf) {
@@ -982,7 +997,8 @@ run_next:
if (hw->isp_ver == ISP_V35) {
val = rkisp_read_reg_cache(dev, ISP3X_CSI2RX_RAW_RD_CTRL);
val |= ISP35_RXS_FORCE_UPD;
if (dev->rd_mode == HDR_RDBK_FRAME2)
if (dev->rd_mode == HDR_RDBK_FRAME2 ||
(dev->rd_mode == HDR_RDBK_FRAME1 && dev->is_aiisp_en))
val |= ISP35_RX0_FORCE_UPD;
writel(val, hw->base_addr + ISP3X_CSI2RX_RAW_RD_CTRL);
}
@@ -995,8 +1011,22 @@ run_next:
v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
"readback frame:%d time:%d 0x%x try:%d\n",
cur_frame_id, dma2frm + 1, val, is_try);
if (!hw->is_shutdown)
if (!hw->is_shutdown) {
rkisp_unite_write(dev, CSI2RX_CTRL0, val, true);
if (dev->is_aiisp_sync && !dev->is_first_frame) {
dev->irq_ends_mask |= ISP_FRAME_END;
if (dev->isp_ver == ISP_V39) {
val = rkisp_read(dev, ISP3X_MI_RD_CTRL2, false);
val |= ISP39_AIISP_ST;
writel(val, hw->base_addr + ISP3X_MI_RD_CTRL2);
} else {
dev->irq_ends_mask |= ISP_FRAME_VPSL;
val = rkisp_read(dev, ISP35_AI_CTRL, false);
val |= ISP35_AIISP_ST;
writel(val, hw->base_addr + ISP35_AI_CTRL);
}
}
}
}
static void rkisp_fast_switch_rx_buf(struct rkisp_device *dev, bool is_current)
@@ -1052,6 +1082,7 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd)
int len[DEV_MAX] = { 0 };
u32 mode = 0;
bool is_try = false;
bool is_aiisp_ready = false;
spin_lock_irqsave(&hw->rdbk_lock, lock_flags);
if (cmd == T_CMD_END) {
@@ -1112,13 +1143,18 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd)
}
}
/* wait 2 frame to start isp for fast */
if (dev->is_rtt_first && max == 1 &&
dev->dmarx_dev.cur_frame.id == -1)
goto end;
if (max) {
isp = hw->isp[id];
/* wait 2 frame to start isp for fast */
if (isp->is_rtt_first && max == 1 && isp->is_first_frame)
goto end;
if (isp->is_aiisp_sync && !isp->is_first_frame) {
rkisp_rdbk_aiisp_event(isp, T_CMD_LEN, &len[id]);
/* wait isp_be frame input */
if (len[id] == 0)
goto end;
is_aiisp_ready = true;
}
v4l2_dbg(2, rkisp_debug, &isp->v4l2_dev,
"trigger fifo len:%d\n", max);
rkisp_rdbk_trigger_event(isp, T_CMD_DEQUEUE, &t);
@@ -1176,8 +1212,11 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd)
}
end:
spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags);
if (times >= 0)
if (times >= 0) {
if (is_aiisp_ready)
rkisp_rdbk_aiisp_event(isp, T_CMD_QUEUE, NULL);
rkisp_trigger_read_back(isp, times, mode, is_try);
}
}
int rkisp_rdbk_trigger_event(struct rkisp_device *dev, u32 cmd, void *arg)
@@ -1415,11 +1454,6 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq)
}
spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags);
if (isp_frame_end) {
if (hw->is_single && !IS_HDR_RDBK(dev->rd_mode))
return;
rkisp_frame_end_idle(dev);
}
if (isp_front_end) {
if (hw->is_single && !IS_HDR_RDBK(dev->rd_mode))
return;
@@ -1427,6 +1461,11 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq)
}
if (isp_back_end)
rkisp_back_end_idle(dev);
if (isp_frame_end) {
if (hw->is_single && !IS_HDR_RDBK(dev->rd_mode))
return;
rkisp_frame_end_idle(dev);
}
}
static void rkisp_set_state(u32 *state, u32 val)
@@ -2394,6 +2433,7 @@ static int rkisp_isp_stop(struct rkisp_device *dev)
hw->is_dvfs = false;
hw->is_runing = false;
hw->is_idle = true;
hw->is_be_idle = true;
hw->is_mi_update = false;
hw->pre_dev_id = -1;
end:
@@ -2472,6 +2512,8 @@ static int rkisp_isp_start(struct rkisp_device *dev)
dev->irq_ends_mask |= ISP_FRAME_END;
if (dev->is_aiisp_en && !dev->is_aiisp_sync)
dev->irq_f_ends_mask |= ISP_FRAME_BNR;
else if (dev->is_aiisp_en)
dev->irq_ends_mask = ISP_FRAME_BNR;
dev->irq_ends = 0;
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
@@ -3203,6 +3245,7 @@ static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on)
}
hw_dev->is_runing = true;
isp_dev->is_first_frame = true;
rkisp_start_3a_run(isp_dev);
memset(&isp_dev->isp_sdev.dbg, 0, sizeof(isp_dev->isp_sdev.dbg));
if (atomic_inc_return(&hw_dev->refcnt) > hw_dev->dev_link_num) {
@@ -3935,15 +3978,16 @@ static void rkisp_aiisp_irq_event(struct rkisp_device *dev, u32 irq)
static int rkisp_rdbk_aiisp_handle(struct rkisp_device *dev, u32 cmd)
{
struct rkisp_hw_dev *hw = dev->hw_dev;
struct rkisp_device *isp = NULL;
struct rkisp_aiisp_st st = { 0 };
unsigned long lock_flags = 0;
int i, max = 0, id = 0, ret = 0;
int len[DEV_MAX] = { 0 };
int len = 0, ret = 0;
spin_lock_irqsave(&hw->rdbk_lock, lock_flags);
if (cmd == T_CMD_END)
if (cmd == T_CMD_END) {
hw->is_be_idle = true;
if (dev->is_aiisp_sync)
goto end;
}
if (hw->is_shutdown)
hw->is_be_idle = false;
if (!hw->is_be_idle)
@@ -3954,33 +3998,22 @@ static int rkisp_rdbk_aiisp_handle(struct rkisp_device *dev, u32 cmd)
goto end;
}
for (i = 0; i < hw->dev_num; i++) {
isp = hw->isp[i];
if (!isp ||
(isp && (!(isp->isp_state & ISP_START) || isp->is_suspend)))
continue;
rkisp_rdbk_aiisp_event(isp, T_CMD_LEN, &len[i]);
if (max < len[i]) {
max = len[i];
id = i;
}
}
if (max) {
isp = hw->isp[id];
v4l2_dbg(2, rkisp_debug, &isp->v4l2_dev,
"aiisp fifo len:%d\n", max);
rkisp_rdbk_aiisp_event(isp, T_CMD_DEQUEUE, &st);
isp->dmarx_dev.cur_be_frame.id = st.sequence;
isp->dmarx_dev.cur_be_frame.timestamp = st.timestamp;
hw->cur_be_dev_id = id;
rkisp_rdbk_aiisp_event(dev, T_CMD_LEN, &len);
if (len) {
v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
"aiisp fifo len:%d\n", len);
rkisp_rdbk_aiisp_event(dev, T_CMD_DEQUEUE, &st);
dev->dmarx_dev.cur_be_frame.id = st.sequence;
dev->dmarx_dev.cur_be_frame.timestamp = st.timestamp;
hw->cur_be_dev_id = dev->dev_id;
hw->is_be_idle = false;
}
end:
spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags);
if (max) {
isp->isp_sdev.dbg.timestamp_be = rkisp_time_get_ns(dev);
ret = rkisp_params_aiisp_start(&isp->params_vdev, &st);
if (ret == 0) {
if (len) {
dev->isp_sdev.dbg.timestamp_be = rkisp_time_get_ns(dev);
ret = rkisp_params_aiisp_start(&dev->params_vdev, &st);
if (ret == 0 && !dev->is_aiisp_sync) {
rkisp_stream_frame_start(dev, 0);
rkisp_dvbm_start_event(dev);
rkisp_rockit_frame_start(dev);
@@ -4030,8 +4063,14 @@ static int rkisp_rdbk_aiisp_event(struct rkisp_device *dev, u32 cmd, void *arg)
}
spin_unlock_irqrestore(&dev->rdbk_lock, lock_flags);
if (dev->is_aiisp_sync && arg && cmd == T_CMD_QUEUE) {
if (dev->hw_dev->is_idle)
rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, NULL);
goto end;
}
if (cmd == T_CMD_QUEUE || cmd == T_CMD_END)
ret = rkisp_rdbk_aiisp_handle(dev, cmd);
end:
return ret;
}
@@ -4973,8 +5012,10 @@ void rkisp_isp_isr(unsigned int isp_mis,
complete(&dev->hw_dev->monitor.cmpl);
}
if (!dev->is_aiisp_en)
if (!dev->is_aiisp_en ||
(dev->is_aiisp_sync && !dev->is_first_frame))
rkisp_dvbm_start_event(dev);
dev->is_first_frame = false;
if (IS_HDR_RDBK(dev->hdr.op_mode)) {
/* disabled frame end to read 3dlut for multi sensor
* 3dlut will update at isp readback