From 04928950a5cf971e4ba86b1192a25d5f45b3ef3a Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 21 Feb 2024 15:50:33 +0800 Subject: [PATCH] media: rockchip: isp: aiisp for isp39 Change-Id: Ibcbcfd1865fb8a20f1fe190e09b8bd91133c4b98 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/dev.h | 5 + .../platform/rockchip/isp/isp_params_v39.c | 72 ++++++- .../platform/rockchip/isp/isp_params_v39.h | 1 + .../media/platform/rockchip/isp/regs_v3x.h | 16 ++ drivers/media/platform/rockchip/isp/rkisp.c | 180 +++++++++++++++++- include/uapi/linux/rk-isp2-config.h | 39 +++- 6 files changed, 295 insertions(+), 18 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/dev.h b/drivers/media/platform/rockchip/isp/dev.h index 8ca7e11a9bc4..5c338a047635 100644 --- a/drivers/media/platform/rockchip/isp/dev.h +++ b/drivers/media/platform/rockchip/isp/dev.h @@ -286,7 +286,10 @@ struct rkisp_device { struct mutex buf_lock; spinlock_t cmsk_lock; + spinlock_t aiisp_lock; struct rkisp_cmsk_cfg cmsk_cfg; + struct rkisp_aiisp_cfg aiisp_cfg; + bool is_cmsk_upd; bool is_hw_link; bool is_bigmode; @@ -298,6 +301,8 @@ struct rkisp_device { bool is_suspend; bool suspend_sync; bool is_suspend_one_frame; + bool is_aiisp_en; + bool is_aiisp_upd; struct rkisp_vicap_input vicap_in; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v39.c b/drivers/media/platform/rockchip/isp/isp_params_v39.c index c97a4dbc9e45..a1328e5dce3b 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v39.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v39.c @@ -3245,12 +3245,25 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) value = priv_val->buf_3dnr_iir.dma_addr; isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_WR_BASE); isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_RD_BASE); + isp3_param_write(params_vdev, value, ISP39_AIISP_RD_BASE); + if (priv_val->buf_gain.mem_priv) { + value = priv_val->buf_gain.size; + isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_SIZE); + isp3_param_write(params_vdev, value, ISP32_MI_RAW0_RD_SIZE); + value = priv_val->buf_gain.dma_addr; + isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_BASE); + isp3_param_write(params_vdev, value, ISP3X_MI_RAW0_RD_BASE); + + value = isp3_param_read_cache(params_vdev, ISP3X_GAIN_CTRL); + value |= ISP3X_GAIN_2DDR_MODE(1) | ISP3X_GAIN_2DDR_EN; + isp3_param_write(params_vdev, value, ISP3X_GAIN_CTRL); + } bay3d_ctrl |= ISP39_MODULE_EN; isp3_param_write(params_vdev, bay3d_ctrl, ISP3X_BAY3D_CTRL); value = ISP3X_BAY3D_IIR_WR_AUTO_UPD | ISP3X_BAY3D_IIRSELF_UPD | - ISP3X_BAY3D_RDSELF_UPD; + ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAIN_WR_AUTO_UPD | ISP3X_GAINSELF_UPD; isp3_param_set_bits(params_vdev, MI_WR_CTRL2, value); isp3_param_set_bits(params_vdev, ISP3X_ISP_CTRL1, ISP3X_RAW3D_FST_FRAME); @@ -4077,7 +4090,24 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, ret = rkisp_alloc_buffer(dev, &priv_val->buf_3dnr_iir); if (ret) { dev_err(dev->dev, "alloc bay3d iir buf fail:%d\n", ret); - goto err_3dnr; + goto err_3dnr_iir; + } + } + + val = ALIGN(w * h / 4, 16); + is_alloc = iirsparse_en ? true : false; + if (priv_val->buf_gain.mem_priv) { + if (val > priv_val->buf_gain.size) + rkisp_free_buffer(dev, &priv_val->buf_gain); + else + is_alloc = false; + } + if (is_alloc) { + priv_val->buf_gain.size = val; + 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; } } } @@ -4099,7 +4129,7 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, ret = rkisp_alloc_buffer(dev, &priv_val->buf_3dnr_cur); if (ret) { dev_err(dev->dev, "alloc yuvme cur buf fail:%d\n", ret); - goto free_3dnr; + goto free_gain; } } @@ -4111,13 +4141,17 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, if (ret) { dev->hw_dev->is_frm_buf = false; dev_err(dev->dev, "alloc frm buf fail:%d\n", ret); - goto free_3dnr; + goto free_3dnr_cur; } } return 0; -free_3dnr: +free_3dnr_cur: + rkisp_free_buffer(dev, &priv_val->buf_3dnr_cur); +free_gain: + rkisp_free_buffer(dev, &priv_val->buf_gain); +free_3dnr_iir: rkisp_free_buffer(dev, &priv_val->buf_3dnr_iir); -err_3dnr: +err_3dnr_iir: i = ISP39_3DLUT_BUF_NUM; err_3dlut: for (i -= 1; i >= 0; i--) @@ -4528,8 +4562,8 @@ rkisp_params_info2ddr_cfg_v39(struct rkisp_isp_params_vdev *params_vdev, void *a u32 reg, ctrl, mask, size, val, wsize = 0, vsize = 0; int i, ret; - if (cfg->owner == RKISP_INFO2DRR_OWNER_GAIN) { - dev_err(dev->dev, "%s no support gain for lite\n", __func__); + if (dev->is_aiisp_en) { + dev_err(dev->dev, "%s no support for aiisp enable\n", __func__); return -EINVAL; } priv_val = params_vdev->priv_val; @@ -4637,6 +4671,26 @@ err: return -ENOMEM; } +static void +rkisp_params_get_bay3d_buffd_v39(struct rkisp_isp_params_vdev *params_vdev, + struct rkisp_bay3dbuf_info *bay3dbuf) +{ + struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val; + struct rkisp_dummy_buffer *buf; + + buf = &priv_val->buf_3dnr_iir; + if (rkisp_buf_get_fd(params_vdev->dev, buf, true) < 0) + return; + bay3dbuf->iir_fd = buf->dma_fd; + bay3dbuf->iir_size = buf->size; + + buf = &priv_val->buf_gain; + if (rkisp_buf_get_fd(params_vdev->dev, buf, true) < 0) + return; + bay3dbuf->u.v39.gain_fd = buf->dma_fd; + bay3dbuf->u.v39.gain_size = buf->size; +} + static void rkisp_params_stream_stop_v39(struct rkisp_isp_params_vdev *params_vdev) { @@ -4646,6 +4700,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_3dnr_iir); rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_cur); for (i = 0; i < ISP39_3DLUT_BUF_NUM; i++) @@ -4858,6 +4913,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { .fop_release = rkisp_params_fop_release_v39, .check_bigmode = rkisp_params_check_bigmode_v39, .info2ddr_cfg = rkisp_params_info2ddr_cfg_v39, + .get_bay3d_buffd = rkisp_params_get_bay3d_buffd_v39, }; int rkisp_init_params_vdev_v39(struct rkisp_isp_params_vdev *params_vdev) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v39.h b/drivers/media/platform/rockchip/isp/isp_params_v39.h index 7bd53e53fcc0..cb6edbeee5ae 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v39.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v39.h @@ -142,6 +142,7 @@ struct rkisp_isp_params_val_v39 { u32 buf_info_cnt; int buf_info_idx; + struct rkisp_dummy_buffer buf_gain; struct rkisp_dummy_buffer buf_3dnr_iir; struct rkisp_dummy_buffer buf_3dnr_cur; diff --git a/drivers/media/platform/rockchip/isp/regs_v3x.h b/drivers/media/platform/rockchip/isp/regs_v3x.h index 92586ba51b84..31f023918c2f 100644 --- a/drivers/media/platform/rockchip/isp/regs_v3x.h +++ b/drivers/media/platform/rockchip/isp/regs_v3x.h @@ -186,6 +186,8 @@ #define ISP32_ISP_DEBUG4 (ISP3X_ISP_BASE + 0x00254) #define ISP32_YNR_LUMA_RCTRL (ISP3X_ISP_BASE + 0x00290) #define ISP32_YNR_LUMA_RDATA (ISP3X_ISP_BASE + 0x00294) +#define ISP39_SLICE_ST_CTRL (ISP3X_ISP_BASE + 0x002a4) +#define ISP39_AIISP_LINE_CNT (ISP3X_ISP_BASE + 0x002a8) #define ISP3X_FLASH_BASE 0x00000660 #define ISP3X_FLASH_CMD (ISP3X_FLASH_BASE + 0x00000) @@ -673,6 +675,7 @@ #define ISP3X_MI_DBR_WR_LENGTH (ISP3X_MI_BASE + 0x00568) #define ISP3X_MI_DBR_WR_BASE_SHD (ISP3X_MI_BASE + 0x0056C) #define ISP3X_MI_DBR_RD_BASE (ISP3X_MI_BASE + 0x00570) +#define ISP39_AIISP_RD_BASE (ISP3X_MI_BASE + 0x00570) #define ISP3X_MI_DBR_RD_LENGTH (ISP3X_MI_BASE + 0x00574) #define ISP3X_MI_DBR_RD_BASE_SHD (ISP3X_MI_BASE + 0x00578) #define ISP3X_MI_3A_WR_BASE (ISP3X_MI_BASE + 0x0057C) @@ -2455,6 +2458,7 @@ #define ISP3X_LSC_LUT_ERR BIT(16) #define ISP3X_FLASH_CAP BIT(17) #define ISP3X_EXP_END BIT(18) +#define ISP39_AIISP_LINECNT_DONE BIT(18) #define ISP3X_HDR_DONE BIT(20) #define ISP3X_DHAZ_DONE BIT(21) #define ISP3X_GIAN_ERR BIT(22) @@ -2488,6 +2492,14 @@ #define ISP32_YNR_LUMA_RDBK_OFFS(a) (((a) & 0x3fff) << 16) #define ISP32_YNR_LUMA_RDBK_RDY BIT(31) +#define ISP39_SLICE_ST BIT(0) +#define ISP39_SLICE_EN BIT(1) +#define ISP39_OUT_LINE(a) (((a) >> 16) & 0x3fff) +#define ISP39_SLICE_DONE BIT(31) + +#define ISP39_AIISP_RD_LINECNT(x) ((x) >> 16) +#define ISP39_AIISP_WR_LINECNT(x) ((x) & 0xffff) + /* DUAL CROP */ #define ISP3X_DUAL_CROP_FBC_MODE BIT(8) @@ -2580,6 +2592,10 @@ #define ISP3X_DBR_ST_MODE BIT(30) #define ISP3X_DBR_ST BIT(31) +/* MI_RD_CTRL2 */ +#define ISP39_AIISP_ST BIT(8) +#define ISP39_AIISP_EN BIT(9) + /* WR_OUTPUT_FORMAT */ #define ISP32_MI_OUTPUT_MASK GENMASK(10, 8) #define ISP32_MI_OUTPUT_YUV400 0 diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index a66ec64ec99e..06ccbb1747fe 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -86,6 +86,7 @@ */ static void rkisp_config_cmsk(struct rkisp_device *dev); +static void rkisp_config_aiisp(struct rkisp_device *dev); static inline struct rkisp_device *sd_to_isp_dev(struct v4l2_subdev *sd) { @@ -639,6 +640,7 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo dev->isp_sdev.quantization); rkisp_params_cfg(params_vdev, cur_frame_id); rkisp_config_cmsk(dev); + rkisp_config_aiisp(dev); rkisp_stream_frame_start(dev, 0); } @@ -1795,6 +1797,7 @@ static int rkisp_config_isp(struct rkisp_device *dev) } rkisp_config_cmsk(dev); + rkisp_config_aiisp(dev); return 0; } @@ -3438,13 +3441,10 @@ rkisp_isp_queue_event_sof(struct rkisp_isp_subdev *isp) } static int rkisp_isp_sd_subs_evt(struct v4l2_subdev *sd, struct v4l2_fh *fh, - struct v4l2_event_subscription *sub) + struct v4l2_event_subscription *sub) { - if (sub->type != V4L2_EVENT_FRAME_SYNC) - return -EINVAL; - - /* Line number. For now only zero accepted. */ - if (sub->id != 0) + if (sub->type != V4L2_EVENT_FRAME_SYNC && + sub->type != RKISP_V4L2_EVENT_AIISP_LINECNT) return -EINVAL; return v4l2_event_subscribe(fh, sub, ISP_V4L2_EVENT_ELEMS, NULL); @@ -3553,6 +3553,139 @@ static int rkisp_set_work_mode_by_vicap(struct rkisp_device *isp_dev, return 0; } +static void rkisp_queue_event_aiisp(struct rkisp_device *dev, u32 irq) +{ + struct v4l2_event ev = { 0 }; + struct rkisp_aiisp_ev_info *ev_info; + u32 h = dev->isp_sdev.out_crop.height; + u32 val, wr_line, rd_line; + + if (dev->isp_ver != ISP_V39) + return; + if (sizeof(*ev_info) > sizeof(ev.u)) { + v4l2_err(&dev->v4l2_dev, "aiisp_ev_info too large\n"); + return; + } + ev_info = (struct rkisp_aiisp_ev_info *)ev.u.data; + + val = rkisp_read(dev, ISP39_AIISP_LINE_CNT, false); + if (irq & ISP3X_OUT_FRM_QUARTER) { + rd_line = ISP39_AIISP_RD_LINECNT(val); + ev.id = RKISP_AIISP_RD_LINECNT_ID; + ev_info->height = !rd_line ? h : rd_line; + + if (dev->aiisp_cfg.rd_mode) { + rd_line += dev->aiisp_cfg.rd_linecnt; + if (rd_line > h) + rd_line = h - 1; + rkisp_write(dev, ISP32_ISP_IRQ_CFG0, rd_line, true); + } + } else { + wr_line = ISP39_AIISP_WR_LINECNT(val); + ev.id = RKISP_AIISP_WR_LINECNT_ID; + ev_info->height = !wr_line ? h : wr_line; + + if (dev->aiisp_cfg.wr_mode) { + wr_line += dev->aiisp_cfg.wr_linecnt; + if (wr_line > h) + wr_line = h - 1; + rkisp_write(dev, ISP32_ISP_IRQ_CFG1, wr_line << 16, true); + } + } + rkisp_dmarx_get_frame(dev, &ev_info->sequence, NULL, NULL, true); + ev.type = RKISP_V4L2_EVENT_AIISP_LINECNT; + v4l2_event_queue(dev->isp_sdev.sd.devnode, &ev); + v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, + "%s seq:%d ev.id:%d height:%d\n", __func__, + ev_info->sequence, ev.id, ev_info->height); +} + +static void rkisp_config_aiisp(struct rkisp_device *dev) +{ + unsigned long lock_flags = 0; + u32 wr_line, rd_line, irq, irq_mask, en, en_mask; + + spin_lock_irqsave(&dev->aiisp_lock, lock_flags); + if (!dev->is_aiisp_upd) + goto unlock; + dev->is_aiisp_upd = false; + if (dev->is_aiisp_en) { + en = ISP39_AIISP_EN; + irq = ISP39_AIISP_LINECNT_DONE; + if (dev->aiisp_cfg.rd_linecnt) + irq |= ISP3X_OUT_FRM_QUARTER; + } else { + irq = 0; + en = 0; + } + irq_mask = ISP39_AIISP_LINECNT_DONE | ISP3X_OUT_FRM_QUARTER; + en_mask = ISP39_AIISP_EN; + + rd_line = dev->aiisp_cfg.rd_linecnt; + wr_line = dev->aiisp_cfg.wr_linecnt << 16; + + rkisp_write(dev, ISP32_ISP_IRQ_CFG0, rd_line, false); + rkisp_write(dev, ISP32_ISP_IRQ_CFG1, wr_line, false); + rkisp_write(dev, ISP39_SLICE_ST_CTRL, 0, false); + rkisp_set_bits(dev, CIF_ISP_IMSC, irq_mask, irq, false); + rkisp_set_bits(dev, ISP3X_MI_RD_CTRL2, en_mask, en, false); +unlock: + spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags); +} + +static int rkisp_set_aiisp_linecnt(struct rkisp_device *dev, + struct rkisp_aiisp_cfg *cfg) +{ + unsigned long lock_flags = 0; + bool en = false; + + if (dev->isp_ver != ISP_V39) + return -EINVAL; + 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; + } + memcpy(&dev->aiisp_cfg, cfg, sizeof(*cfg)); + spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags); + return 0; +} + +static int rkisp_get_aiisp_linecnt(struct rkisp_device *dev, + struct rkisp_aiisp_cfg *cfg) +{ + unsigned long lock_flags = 0; + + if (dev->isp_ver != ISP_V39) + return -EINVAL; + + spin_lock_irqsave(&dev->aiisp_lock, lock_flags); + memcpy(cfg, &dev->aiisp_cfg, sizeof(*cfg)); + spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags); + return 0; +} + +static void rkisp_aiisp_rd_start(struct rkisp_device *dev) +{ + u32 val; + + if (!dev->is_aiisp_en) + return; + val = rkisp_read(dev, ISP39_AIISP_LINE_CNT, true); + if (!ISP39_AIISP_RD_LINECNT(val)) { + if (dev->aiisp_cfg.rd_linecnt) + rkisp_write(dev, ISP39_SLICE_ST_CTRL, ISP39_SLICE_EN, true); + rkisp_set_bits(dev, ISP3X_MI_RD_CTRL2, 0, ISP39_AIISP_ST, true); + } else { + val = ISP39_SLICE_EN | ISP39_SLICE_ST; + rkisp_write(dev, ISP39_SLICE_ST_CTRL, val, true); + } + v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, + "%s 0x%x:0x%x\n", __func__, ISP39_AIISP_LINE_CNT, val); +} + static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) { struct rkisp_device *isp_dev = sd_to_isp_dev(sd); @@ -3567,7 +3700,8 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) if (!arg && (cmd != RKISP_CMD_FREE_SHARED_BUF && - cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM)) + cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM && + cmd != RKISP_CMD_AIISP_RD_START)) return -EINVAL; switch (cmd) { @@ -3696,6 +3830,15 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) case RKISP_CMD_GET_BAY3D_BUFFD: rkisp_params_get_bay3d_buffd(&isp_dev->params_vdev, arg); break; + case RKISP_CMD_SET_AIISP_LINECNT: + ret = rkisp_set_aiisp_linecnt(isp_dev, arg); + break; + case RKISP_CMD_GET_AIISP_LINECNT: + ret = rkisp_get_aiisp_linecnt(isp_dev, arg); + break; + case RKISP_CMD_AIISP_RD_START: + rkisp_aiisp_rd_start(isp_dev); + break; default: ret = -ENOIOCTLCMD; } @@ -3715,7 +3858,8 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, if (!up && cmd != RKISP_CMD_FREE_SHARED_BUF && - cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM) + cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM && + cmd != RKISP_CMD_AIISP_RD_START) return -EINVAL; switch (cmd) { @@ -3733,6 +3877,7 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP)) return -ENOIOCTLCMD; case RKISP_CMD_MULTI_DEV_FORCE_ENUM: + case RKISP_CMD_AIISP_RD_START: break; case RKISP_CMD_GET_LDCHBUF_INFO: size = sizeof(struct rkisp_ldchbuf_info); @@ -3775,6 +3920,14 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, size = sizeof(struct rkisp_bay3dbuf_info); cp_t_us = true; break; + case RKISP_CMD_SET_AIISP_LINECNT: + size = sizeof(struct rkisp_aiisp_cfg); + cp_f_us = true; + break; + case RKISP_CMD_GET_AIISP_LINECNT: + size = sizeof(struct rkisp_aiisp_cfg); + cp_t_us = true; + break; default: return -ENOIOCTLCMD; } @@ -3869,6 +4022,7 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev, mutex_init(&isp_dev->buf_lock); spin_lock_init(&isp_dev->cmsk_lock); spin_lock_init(&isp_dev->rdbk_lock); + spin_lock_init(&isp_dev->aiisp_lock); ret = kfifo_alloc(&isp_dev->rdbk_kfifo, 16 * sizeof(struct isp2x_csi_trigger), GFP_KERNEL); if (ret < 0) { @@ -4273,6 +4427,11 @@ vs_skip: isp_mis_tmp); } + if (isp_mis & ISP39_AIISP_LINECNT_DONE && dev->isp_ver == ISP_V39) { + writel(ISP39_AIISP_LINECNT_DONE, base + CIF_ISP_ICR); + rkisp_queue_event_aiisp(dev, isp_mis); + } + if ((isp_mis & (CIF_ISP_DATA_LOSS | CIF_ISP_PIC_SIZE_ERROR))) { if ((isp_mis & CIF_ISP_PIC_SIZE_ERROR)) { /* Clear pic_size_error */ @@ -4389,8 +4548,10 @@ vs_skip: if ((isp_mis & CIF_ISP_FRAME) && dev->stats_vdev.rdbk_mode) rkisp_stats_rdbk_enable(&dev->stats_vdev, false); - if (!IS_HDR_RDBK(dev->hdr.op_mode)) + if (!IS_HDR_RDBK(dev->hdr.op_mode)) { + rkisp_config_aiisp(dev); rkisp_config_cmsk(dev); + } } if (isp_mis & CIF_ISP_FRAME) { @@ -4423,6 +4584,7 @@ vs_skip: if (isp_mis & ISP3X_OUT_FRM_QUARTER) { writel(ISP3X_OUT_FRM_QUARTER, base + CIF_ISP_ICR); + rkisp_queue_event_aiisp(dev, isp_mis); rkisp_dvbm_event(dev, ISP3X_OUT_FRM_QUARTER); } if (isp_mis & ISP3X_OUT_FRM_HALF) { diff --git a/include/uapi/linux/rk-isp2-config.h b/include/uapi/linux/rk-isp2-config.h index 0622b3fc2fc8..653ce187d017 100644 --- a/include/uapi/linux/rk-isp2-config.h +++ b/include/uapi/linux/rk-isp2-config.h @@ -62,6 +62,15 @@ #define RKISP_CMD_GET_BAY3D_BUFFD \ _IOR('V', BASE_VIDIOC_PRIVATE + 15, struct rkisp_bay3dbuf_info) +#define RKISP_CMD_SET_AIISP_LINECNT \ + _IOW('V', BASE_VIDIOC_PRIVATE + 16, struct rkisp_aiisp_cfg) + +#define RKISP_CMD_GET_AIISP_LINECNT \ + _IOR('V', BASE_VIDIOC_PRIVATE + 17, struct rkisp_aiisp_cfg) + +#define RKISP_CMD_AIISP_RD_START \ + _IO('V', BASE_VIDIOC_PRIVATE + 18) + /****************ISP VIDEO IOCTL******************************/ #define RKISP_CMD_GET_CSI_MEMORY_MODE \ @@ -108,8 +117,11 @@ #define RKISP_CMD_SET_EXPANDER \ _IOW('V', BASE_VIDIOC_PRIVATE + 114, struct rkmodule_hdr_cfg) -/*************************************************************/ +/**********************EVENT_PRIVATE***************************/ +#define RKISP_V4L2_EVENT_AIISP_LINECNT (V4L2_EVENT_PRIVATE_START + 1) + +/*************************************************************/ #define ISP2X_ID_DPCC (0) #define ISP2X_ID_BLS (1) #define ISP2X_ID_SDG (2) @@ -325,6 +337,27 @@ struct isp2x_mesh_head { __u32 data_oft; } __attribute__ ((packed)); +#define RKISP_AIISP_WR_LINECNT_ID 0 +#define RKISP_AIISP_RD_LINECNT_ID 1 +struct rkisp_aiisp_ev_info { + int sequence; + int height; +} __attribute__ ((packed)); + +/* struct rkisp_aiisp_cfg + * wr_mode: 0: only one RKISP_AIISP_WR_LINECNT_ID event, else event per wr_linecnt + * rd_mode: 0: only one RKISP_AIISP_RD_LINECNT_ID event, else event per rd_linecnt + * wr_linecnt: aiisp write irq line, 0 isn't RKISP_AIISP_WR_LINECNT_ID event, and aiisp no enable + * rd_linecnt: aiisp read irq line, 0 isn't RKISP_AIISP_RD_LINECNT_ID event + */ +struct rkisp_aiisp_cfg { + char wr_mode; + char rd_mode; + + int wr_linecnt; + int rd_linecnt; +} __attribute__ ((packed)); + struct rkisp_bay3dbuf_info { int iir_fd; int iir_size; @@ -339,6 +372,10 @@ struct rkisp_bay3dbuf_info { int ds_fd; int ds_size; } v32; + struct { + int gain_fd; + int gain_size; + } v39; } u; } __attribute__ ((packed));