diff --git a/drivers/media/platform/rockchip/isp/isp_params_v39.c b/drivers/media/platform/rockchip/isp/isp_params_v39.c index 4e24fe41de6b..efbe070eeff6 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v39.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v39.c @@ -3346,7 +3346,10 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) value = priv_val->buf_3dnr_iir.dma_addr + value * id; isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_WR_BASE, id); isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_RD_BASE, id); - isp3_param_write(params_vdev, value, ISP39_AIISP_RD_BASE, id); + if (priv_val->buf_aiisp.mem_priv) { + value = priv_val->buf_aiisp.dma_addr + value * id; + isp3_param_write(params_vdev, value, ISP39_AIISP_RD_BASE, id); + } if (priv_val->buf_gain.mem_priv) { value = priv_val->gain_size; isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_SIZE, id); @@ -4177,6 +4180,22 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, } } + is_alloc = dev->is_aiisp_en ? true : false; + if (priv_val->buf_aiisp.mem_priv) { + if (val > priv_val->buf_aiisp.size) + rkisp_free_buffer(dev, &priv_val->buf_aiisp); + else + is_alloc = false; + } + if (is_alloc) { + priv_val->buf_aiisp.size = val; + ret = rkisp_alloc_buffer(dev, &priv_val->buf_aiisp); + if (ret) { + dev_err(dev->dev, "alloc aiisp buf fail:%d\n", ret); + goto free_3dnr_iir; + } + } + val = ALIGN(w * h / 4, 16); priv_val->gain_size = val; if (dev->unite_div > ISP_UNITE_DIV1) @@ -4193,7 +4212,7 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, ret = rkisp_alloc_buffer(dev, &priv_val->buf_gain); if (ret) { dev_err(dev->dev, "alloc gain buf fail:%d\n", ret); - goto free_3dnr_iir; + goto free_aiisp; } } } @@ -4260,6 +4279,8 @@ free_3dnr_cur: rkisp_free_buffer(dev, &priv_val->buf_3dnr_cur); free_gain: rkisp_free_buffer(dev, &priv_val->buf_gain); +free_aiisp: + rkisp_free_buffer(dev, &priv_val->buf_aiisp); free_3dnr_iir: rkisp_free_buffer(dev, &priv_val->buf_3dnr_iir); err_3dnr_iir: @@ -4821,6 +4842,12 @@ rkisp_params_get_bay3d_buffd_v39(struct rkisp_isp_params_vdev *params_vdev, return; bay3dbuf->u.v39.gain_fd = buf->dma_fd; bay3dbuf->u.v39.gain_size = buf->size; + + buf = &priv_val->buf_aiisp; + if (rkisp_buf_get_fd(params_vdev->dev, buf, true) < 0) + return; + bay3dbuf->u.v39.aiisp_fd = buf->dma_fd; + bay3dbuf->u.v39.aiisp_size = buf->size; } static void @@ -4833,6 +4860,7 @@ rkisp_params_stream_stop_v39(struct rkisp_isp_params_vdev *params_vdev) priv_val = (struct rkisp_isp_params_val_v39 *)params_vdev->priv_val; rkisp_free_buffer(ispdev, &priv_val->buf_frm); rkisp_free_buffer(ispdev, &priv_val->buf_gain); + rkisp_free_buffer(ispdev, &priv_val->buf_aiisp); rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_iir); rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_cur); for (i = 0; i < ISP39_LSC_LUT_BUF_NUM; i++) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v39.h b/drivers/media/platform/rockchip/isp/isp_params_v39.h index ddd6abe927e9..8506a32d1a63 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v39.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v39.h @@ -178,6 +178,7 @@ struct rkisp_isp_params_val_v39 { u32 bay3d_iir_size; u32 bay3d_cur_size; struct rkisp_dummy_buffer buf_gain; + struct rkisp_dummy_buffer buf_aiisp; struct rkisp_dummy_buffer buf_3dnr_iir; struct rkisp_dummy_buffer buf_3dnr_cur; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index ad1e031093fd..0a82e3505a16 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -3651,10 +3651,8 @@ static int rkisp_set_aiisp_linecnt(struct rkisp_device *dev, spin_lock_irqsave(&dev->aiisp_lock, lock_flags); if (cfg->wr_linecnt) en = true; - if (en != dev->is_aiisp_en) { - dev->is_aiisp_en = en; - dev->is_aiisp_upd = true; - } + dev->is_aiisp_en = en; + dev->is_aiisp_upd = true; memcpy(&dev->aiisp_cfg, cfg, sizeof(*cfg)); spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags); return 0; diff --git a/include/uapi/linux/rk-isp2-config.h b/include/uapi/linux/rk-isp2-config.h index 653ce187d017..c411bfde131d 100644 --- a/include/uapi/linux/rk-isp2-config.h +++ b/include/uapi/linux/rk-isp2-config.h @@ -375,6 +375,8 @@ struct rkisp_bay3dbuf_info { struct { int gain_fd; int gain_size; + int aiisp_fd; + int aiisp_size; } v39; } u; } __attribute__ ((packed));