From 502d08b106d484d6427fdf2430c822fd63d4507f Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Thu, 27 Feb 2025 14:53:51 +0800 Subject: [PATCH] media: rockchip: isp: support multi-sensor for aiisp Change-Id: I207420d7a55ff4ad5d5a11ffd1b5f04faa06bc14 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/dev.c | 2 +- drivers/media/platform/rockchip/isp/dev.h | 1 + drivers/media/platform/rockchip/isp/hw.c | 2 + .../platform/rockchip/isp/isp_params_v35.c | 269 ++++++++++-------- .../platform/rockchip/isp/isp_params_v39.c | 100 +++---- .../platform/rockchip/isp/isp_stats_v35.c | 64 +++-- .../platform/rockchip/isp/isp_stats_v39.c | 24 +- drivers/media/platform/rockchip/isp/procfs.c | 139 +++++---- .../media/platform/rockchip/isp/regs_v3x.h | 1 + drivers/media/platform/rockchip/isp/rkisp.c | 131 ++++++--- 10 files changed, 435 insertions(+), 298 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c index 93e419aa967d..0d4ac1afe006 100644 --- a/drivers/media/platform/rockchip/isp/dev.c +++ b/drivers/media/platform/rockchip/isp/dev.c @@ -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; diff --git a/drivers/media/platform/rockchip/isp/dev.h b/drivers/media/platform/rockchip/isp/dev.h index 5ad79c4bd1fd..1dafd16c183d 100644 --- a/drivers/media/platform/rockchip/isp/dev.h +++ b/drivers/media/platform/rockchip/isp/dev.h @@ -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; diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index e0183a655813..d750f4ec2c5d 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -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 */ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v35.c b/drivers/media/platform/rockchip/isp/isp_params_v35.c index 2347785bc33c..9995a76f3df1 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v35.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v35.c @@ -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); } diff --git a/drivers/media/platform/rockchip/isp/isp_params_v39.c b/drivers/media/platform/rockchip/isp/isp_params_v39.c index bb25d7cadfd7..c61316a4cbe8 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v39.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v39.c @@ -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; diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v35.c b/drivers/media/platform/rockchip/isp/isp_stats_v35.c index 70999758dd6a..a3acc8e1d23e 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v35.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v35.c @@ -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); diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v39.c b/drivers/media/platform/rockchip/isp/isp_stats_v39.c index c420645761e4..69672a06cb9b 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v39.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v39.c @@ -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); diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c index 712159cfe95a..f50dd799e230 100644 --- a/drivers/media/platform/rockchip/isp/procfs.c +++ b/drivers/media/platform/rockchip/isp/procfs.c @@ -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); } } diff --git a/drivers/media/platform/rockchip/isp/regs_v3x.h b/drivers/media/platform/rockchip/isp/regs_v3x.h index a8c6be021fff..55a47652e7dc 100644 --- a/drivers/media/platform/rockchip/isp/regs_v3x.h +++ b/drivers/media/platform/rockchip/isp/regs_v3x.h @@ -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) diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 678fac13a543..43031116397d 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -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