diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v3x.c b/drivers/media/platform/rockchip/isp/isp_stats_v3x.c index c7faaade192a..0f71ec029e26 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v3x.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v3x.c @@ -956,6 +956,76 @@ static struct rkisp_stats_ops_v3x __maybe_unused stats_ddr_ops_v3x = { .get_dhaz_stats = rkisp_stats_get_dhaz_stats, }; +static void +rkisp_merge_dual_dhaz_params(struct rkisp_isp_stats_vdev *stats_vdev, + struct rkisp3x_isp_stat_buffer *left_stat, + struct rkisp3x_isp_stat_buffer *right_stat) +{ + struct rkisp_device *dev = stats_vdev->dev; + struct isp3x_dhaz_cfg *dhaz_cfg; + struct isp3x_dhaz_stat *l_dhaz; + struct isp3x_dhaz_stat *r_dhaz; + u32 i, val, hist_out0, hist_out1, hist_out2, pic_sumh; + u32 num = isp3_stats_read(stats_vdev, ISP3X_DHAZ_IIR0, 0) & 0x1f; + + if (!left_stat || !right_stat || + !(left_stat->meas_type & ISP3X_STAT_DHAZ) || + !(right_stat->meas_type & ISP3X_STAT_DHAZ) || + !(isp3_stats_read(stats_vdev, ISP3X_DHAZ_CTRL, 0) & BIT(25)) || + !(isp3_stats_read(stats_vdev, ISP3X_DHAZ_CTRL, 0) & BIT(4))) + return; + + dhaz_cfg = &dev->params_vdev.isp3x_params->others.dhaz_cfg; + l_dhaz = &left_stat->params.dhaz; + r_dhaz = &right_stat->params.dhaz; + + if (!num || (!l_dhaz->dhaz_pic_sumh && !r_dhaz->dhaz_pic_sumh)) { + v4l2_err(stats_vdev->vnode.vdev.v4l2_dev, + "%s 0 params, num:%d sumh:%d %d\n", __func__, + num, l_dhaz->dhaz_pic_sumh, r_dhaz->dhaz_pic_sumh); + return; + } + + val = ISP_PACK_2SHORT((l_dhaz->dhaz_adp_wt + r_dhaz->dhaz_adp_wt) / 2, + (l_dhaz->dhaz_adp_air_base + r_dhaz->dhaz_adp_air_base) / 2); + isp3_stats_write(stats_vdev, ISP3X_DHAZ_ADT_WR0, val, 0); + isp3_stats_write(stats_vdev, ISP3X_DHAZ_ADT_WR0, val, 1); + + val = ISP_PACK_2SHORT((l_dhaz->dhaz_adp_tmax + r_dhaz->dhaz_adp_tmax) / 2, + (l_dhaz->dhaz_adp_gratio + r_dhaz->dhaz_adp_gratio) / 2); + isp3_stats_write(stats_vdev, ISP3X_DHAZ_ADT_WR1, val, 0); + isp3_stats_write(stats_vdev, ISP3X_DHAZ_ADT_WR1, val, 1); + + num = min_t(u32, num, left_stat->frame_id + 1); + pic_sumh = l_dhaz->dhaz_pic_sumh + r_dhaz->dhaz_pic_sumh; + for (i = 0; i < ISP3X_DHAZ_HIST_WR_NUM / 3; i++) { + hist_out0 = (l_dhaz->h_rgb_iir[i * 3] * l_dhaz->dhaz_pic_sumh + + r_dhaz->h_rgb_iir[i * 3] * r_dhaz->dhaz_pic_sumh) / pic_sumh; + hist_out0 = (dhaz_cfg->hist_wr[i * 3] * (num - 1) + hist_out0) / num; + dhaz_cfg->hist_wr[i * 3] = hist_out0; + + hist_out1 = (l_dhaz->h_rgb_iir[i * 3 + 1] * l_dhaz->dhaz_pic_sumh + + r_dhaz->h_rgb_iir[i * 3 + 1] * r_dhaz->dhaz_pic_sumh) / pic_sumh; + hist_out1 = (dhaz_cfg->hist_wr[i * 3 + 1] * (num - 1) + hist_out1) / num; + dhaz_cfg->hist_wr[i * 3 + 1] = hist_out1; + + hist_out2 = (l_dhaz->h_rgb_iir[i * 3 + 2] * l_dhaz->dhaz_pic_sumh + + r_dhaz->h_rgb_iir[i * 3 + 2] * r_dhaz->dhaz_pic_sumh) / pic_sumh; + hist_out2 = (dhaz_cfg->hist_wr[i * 3 + 2] * (num - 1) + hist_out2) / num; + dhaz_cfg->hist_wr[i * 3 + 2] = hist_out2; + + val = hist_out0 | hist_out1 << 10 | hist_out2 << 20; + isp3_stats_write(stats_vdev, ISP3X_DHAZ_HIST_WR0 + i * 4, val, 0); + isp3_stats_write(stats_vdev, ISP3X_DHAZ_HIST_WR0 + i * 4, val, 1); + } + val = (l_dhaz->h_rgb_iir[i * 3] * l_dhaz->dhaz_pic_sumh + + r_dhaz->h_rgb_iir[i * 3] * r_dhaz->dhaz_pic_sumh) / pic_sumh; + val = (dhaz_cfg->hist_wr[i * 3] * (num - 1) + val) / num; + dhaz_cfg->hist_wr[i * 3] = val; + isp3_stats_write(stats_vdev, ISP3X_DHAZ_HIST_WR0 + i * 4, val, 0); + isp3_stats_write(stats_vdev, ISP3X_DHAZ_HIST_WR0 + i * 4, val, 1); +} + static void rkisp_stats_send_meas_v3x(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp_readout_work *meas_work) @@ -1034,6 +1104,8 @@ rkisp_stats_send_meas_v3x(struct rkisp_isp_stats_vdev *stats_vdev, } if (stats_vdev->dev->hw_dev->is_unite) { + struct rkisp3x_isp_stat_buffer *left_stat = cur_stat_buf; + size *= 2; if (cur_buf) { cur_stat_buf++; @@ -1063,6 +1135,7 @@ rkisp_stats_send_meas_v3x(struct rkisp_isp_stats_vdev *stats_vdev, ret |= ops->get_bls_stats(stats_vdev, cur_stat_buf, 1); ret |= ops->get_dhaz_stats(stats_vdev, cur_stat_buf, 1); } + rkisp_merge_dual_dhaz_params(stats_vdev, left_stat, cur_stat_buf); } if (cur_buf && !ret) {