mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 = ¶ms_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 = ¶ms_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(¶ms_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 = ¶ms_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, ¶ms->others.sharp_cfg, id, true);
|
||||
isp_gic_cfg_noise_curve(params_vdev, ¶ms->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, ¶ms_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, ¶ms_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, ¶ms_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, ¶ms_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, ¶ms_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);
|
||||
}
|
||||
|
||||
@@ -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, ¶ms_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, ¶ms_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, ¶ms_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, ¶ms->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, ¶ms->others.drc_cfg, RKISP_PARAMS_SHD, i);
|
||||
params->module_cfg_update = 0;
|
||||
params->module_cfg_update &= ~ISP39_MODULE_DRC;
|
||||
}
|
||||
params++;
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -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 = ¶ms_rec->others.sharp_cfg;
|
||||
struct isp33_gic_cfg *gic_arg_rec = ¶ms_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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user