From 548280a5d8c98bc2e507d2a099efa8e6ec7822a0 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 1 Apr 2022 10:35:02 +0800 Subject: [PATCH] media: rockchip: isp: awb or gain debug info to ddr for isp32 Change-Id: Id4de69cc2f33e52133fecec0ac5960db5733910f Signed-off-by: Cai YiWei --- .../media/platform/rockchip/isp/isp_params.c | 11 ++ .../media/platform/rockchip/isp/isp_params.h | 3 + .../platform/rockchip/isp/isp_params_v32.c | 154 +++++++++++++++++- .../platform/rockchip/isp/isp_params_v32.h | 5 + .../platform/rockchip/isp/isp_stats_v32.c | 68 ++++++++ .../media/platform/rockchip/isp/regs_v3x.h | 9 + drivers/media/platform/rockchip/isp/rkisp.c | 11 ++ include/uapi/linux/rkisp2-config.h | 43 +++++ include/uapi/linux/rkisp32-config.h | 11 +- 9 files changed, 304 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index eb427fa82474..7b2d49ef2a94 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -396,6 +396,17 @@ bool rkisp_params_check_bigmode(struct rkisp_isp_params_vdev *params_vdev) return 0; } +int rkisp_params_info2ddr_cfg(struct rkisp_isp_params_vdev *params_vdev, + void *arg) +{ + int ret = -EINVAL; + + if (params_vdev->ops->info2ddr_cfg) + ret = params_vdev->ops->info2ddr_cfg(params_vdev, arg); + + return ret; +} + int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev, struct v4l2_device *v4l2_dev, struct rkisp_device *dev) diff --git a/drivers/media/platform/rockchip/isp/isp_params.h b/drivers/media/platform/rockchip/isp/isp_params.h index dc3ac316dfc2..e56d1a9c8da8 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -42,6 +42,8 @@ struct rkisp_isp_params_ops { void (*stream_stop)(struct rkisp_isp_params_vdev *params_vdev); void (*fop_release)(struct rkisp_isp_params_vdev *params_vdev); bool (*check_bigmode)(struct rkisp_isp_params_vdev *params_vdev); + int (*info2ddr_cfg)(struct rkisp_isp_params_vdev *params_vdev, + void *arg); }; /* @@ -147,4 +149,5 @@ void rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev *params_vdev, void *meshsize); void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev); bool rkisp_params_check_bigmode(struct rkisp_isp_params_vdev *params_vdev); +int rkisp_params_info2ddr_cfg(struct rkisp_isp_params_vdev *params_vdev, void *arg); #endif /* _RKISP_ISP_PARAM_H */ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v32.c b/drivers/media/platform/rockchip/isp/isp_params_v32.c index c54e7afff0ea..0a64961ec20a 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v32.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v32.c @@ -2044,14 +2044,14 @@ isp_rawawb_config(struct rkisp_isp_params_vdev *params_vdev, ISP32_RAWAWB_WEIGHT_NUM); /* avoid to override the old enable value */ - value = isp3_param_read(params_vdev, ISP3X_RAWAWB_CTRL); - value &= ISP32_MODULE_EN; + value = isp3_param_read_cache(params_vdev, ISP3X_RAWAWB_CTRL); + value &= (ISP32_MODULE_EN | + ISP32_RAWAWB_2DDR_PATH_EN | + ISP32_RAWAWB_2DDR_PATH_DS); value |= !!arg->low12bit_val << 28 | - //!!arg->ddr_path_sel << 27 | !!arg->yuv3d_en1 << 26 | !!arg->xy_en1 << 25 | !!arg->uv_en1 << 24 | - //!!(arg->ddr_path_en << 23 | (arg->light_num & 0x7) << 20 | !!arg->rawlsc_bypass_en << 19 | !!arg->wind_size << 18 | @@ -2078,7 +2078,7 @@ isp_rawawb_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) { u32 awb_ctrl; - awb_ctrl = isp3_param_read(params_vdev, ISP3X_RAWAWB_CTRL); + awb_ctrl = isp3_param_read_cache(params_vdev, ISP3X_RAWAWB_CTRL); awb_ctrl &= ~ISP32_REG_WR_MASK; if (en) awb_ctrl |= ISP32_MODULE_EN; @@ -3397,7 +3397,7 @@ isp_gain_enable(struct rkisp_isp_params_vdev *params_vdev, bool en) if (val & ISP32_MODULE_EN && en) return; - val = 0; + val = isp3_param_read_cache(params_vdev, ISP3X_GAIN_CTRL); if (en) { val |= priv_val->lut3d_en << 20 | priv_val->dhaz_en << 16 | @@ -3880,7 +3880,9 @@ void __isp_isr_other_en(struct rkisp_isp_params_vdev *params_vdev, if (module_en_update & ISP32_MODULE_CAC) ops->cac_enable(params_vdev, !!(module_ens & ISP32_MODULE_CAC)); - if (module_en_update & ISP32_MODULE_GAIN) + if (module_en_update & ISP32_MODULE_GAIN || + ((priv_val->buf_info_owner == RKISP_INFO2DRR_OWNER_GAIN) && + !(isp3_param_read(params_vdev, ISP3X_GAIN_CTRL) & ISP3X_GAIN_2DDR_EN))) ops->gain_enable(params_vdev, !!(module_ens & ISP32_MODULE_GAIN)); if (module_en_update & ISP32_MODULE_VSM) @@ -3904,6 +3906,8 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev, { struct rkisp_isp_params_ops_v32 *ops = (struct rkisp_isp_params_ops_v32 *)params_vdev->priv_ops; + struct rkisp_isp_params_val_v32 *priv_val = + (struct rkisp_isp_params_val_v32 *)params_vdev->priv_val; u64 module_cfg_update = new_params->module_cfg_update; if (type == RKISP_PARAMS_SHD) @@ -3940,7 +3944,9 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev, if ((module_cfg_update & ISP32_MODULE_RAWHIST3)) ops->rawhst3_config(params_vdev, &new_params->meas.rawhist3); - if ((module_cfg_update & ISP32_MODULE_RAWAWB)) + if ((module_cfg_update & ISP32_MODULE_RAWAWB) || + ((priv_val->buf_info_owner == RKISP_INFO2DRR_OWNER_AWB) && + !(isp3_param_read(params_vdev, ISP3X_RAWAWB_CTRL) & ISP32_RAWAWB_2DDR_PATH_EN))) ops->rawawb_config(params_vdev, &new_params->meas.rawawb); } @@ -4359,6 +4365,128 @@ rkisp_params_set_meshbuf_size_v32(struct rkisp_isp_params_vdev *params_vdev, rkisp_init_mesh_buf(params_vdev, meshsize); } +static int +rkisp_params_info2ddr_cfg_v32(struct rkisp_isp_params_vdev *params_vdev, void *arg) +{ + struct rkisp_device *dev = params_vdev->dev; + struct rkisp_isp_params_val_v32 *priv_val; + struct rkisp_info2ddr *cfg = arg; + struct rkisp_dummy_buffer *buf; + u32 reg, ctrl, mask, size, val, wsize = 0, vsize = 0; + int i, ret; + + priv_val = params_vdev->priv_val; + + if (cfg->buf_cnt > RKISP_INFO2DDR_BUF_MAX) + cfg->buf_cnt = RKISP_INFO2DDR_BUF_MAX; + else if (cfg->buf_cnt == 0) + cfg->buf_cnt = 1; + for (val = 0; val < cfg->buf_cnt; val++) + cfg->buf_fd[val] = -1; + + switch (cfg->owner) { + case RKISP_INFO2DRR_OWNER_NULL: + rkisp_clear_reg_cache_bits(dev, ISP3X_RAWAWB_CTRL, + ISP32_RAWAWB_2DDR_PATH_EN); + rkisp_clear_reg_cache_bits(dev, ISP3X_GAIN_CTRL, + ISP3X_GAIN_2DDR_EN); + priv_val->buf_info_owner = cfg->owner; + return 0; + case RKISP_INFO2DRR_OWNER_GAIN: + ctrl = ISP3X_GAIN_2DDR_mode(cfg->u.gain.gain2ddr_mode); + ctrl |= ISP3X_GAIN_2DDR_EN; + mask = ISP3X_GAIN_2DDR_mode(3); + reg = ISP3X_GAIN_CTRL; + + if (cfg->wsize) + wsize = (cfg->wsize + 7) / 8; + else + wsize = (dev->isp_sdev.in_crop.width + 7) / 8; + /* 0 or 3: 4x8mode, 1: 2x8 mode, 2: 1x8mode */ + val = cfg->u.gain.gain2ddr_mode; + val = (val == 1) ? 2 : ((val == 2) ? 1 : 4); + if (cfg->vsize) + vsize = cfg->vsize; + else + vsize = dev->isp_sdev.in_crop.height / val; + break; + case RKISP_INFO2DRR_OWNER_AWB: + ctrl = cfg->u.awb.awb2ddr_sel ? ISP32_RAWAWB_2DDR_PATH_DS : 0; + ctrl |= ISP32_RAWAWB_2DDR_PATH_EN; + mask = ISP32_RAWAWB_2DDR_PATH_DS; + reg = ISP3X_RAWAWB_CTRL; + + val = cfg->u.awb.awb2ddr_sel ? 8 : 1; + if (cfg->wsize) + wsize = cfg->wsize; + else + wsize = dev->isp_sdev.in_crop.width * 4 / val; + if (cfg->vsize) + vsize = cfg->vsize; + else + vsize = dev->isp_sdev.in_crop.height / val; + break; + default: + dev_err(dev->dev, "%s no support owner:%d\n", __func__, cfg->owner); + return -EINVAL; + } + + if (!wsize || !vsize) { + dev_err(dev->dev, "%s inval wsize:%d vsize:%d\n", __func__, wsize, vsize); + return -EINVAL; + } + + wsize = ALIGN(wsize, 16); + size = wsize * vsize; + for (i = 0; i < cfg->buf_cnt; i++) { + buf = &priv_val->buf_info[i]; + if (buf->mem_priv) { + if (buf->size < size) { + rkisp_free_buffer(dev, buf); + } else { + *(u32 *)buf->vaddr = RKISP_INFO2DDR_BUF_INIT; + cfg->buf_fd[i] = buf->dma_fd; + continue; + } + } + buf->size = size; + buf->is_need_dbuf = true; + buf->is_need_dmafd = true; + buf->is_need_vaddr = true; + ret = rkisp_alloc_buffer(dev, buf); + if (ret) { + dev_err(dev->dev, "%s alloc buf failed\n", __func__); + goto err; + } + *(u32 *)buf->vaddr = RKISP_INFO2DDR_BUF_INIT; + cfg->buf_fd[i] = buf->dma_fd; + } + buf = &priv_val->buf_info[0]; + isp3_param_write(params_vdev, buf->dma_addr, ISP3X_MI_GAIN_WR_BASE); + isp3_param_write(params_vdev, buf->size, ISP3X_MI_GAIN_WR_SIZE); + isp3_param_write(params_vdev, wsize, ISP3X_MI_GAIN_WR_LENGTH); + if (dev->hw_dev->is_single) + rkisp_write(dev, ISP3X_MI_WR_CTRL2, ISP3X_GAINSELF_UPD, true); + rkisp_set_reg_cache_bits(dev, reg, mask, ctrl); + + priv_val->buf_info_idx = 0; + priv_val->buf_info_cnt = cfg->buf_cnt; + priv_val->buf_info_owner = cfg->owner; + + cfg->wsize = wsize; + cfg->vsize = vsize; + return 0; +err: + for (i -= 1; i >= 0; i--) { + buf = &priv_val->buf_info[i]; + rkisp_free_buffer(dev, buf); + cfg->buf_fd[i] = -1; + } + cfg->owner = RKISP_INFO2DRR_OWNER_NULL; + cfg->buf_cnt = 0; + return -ENOMEM; +} + static void rkisp_params_stream_stop_v32(struct rkisp_isp_params_vdev *params_vdev) { @@ -4375,6 +4503,12 @@ rkisp_params_stream_stop_v32(struct rkisp_isp_params_vdev *params_vdev) rkisp_free_buffer(ispdev, &priv_val->buf_3dlut[i]); for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) rkisp_free_buffer(ispdev, &ispdev->stats_vdev.stats_buf[i]); + priv_val->buf_info_owner = 0; + priv_val->buf_info_cnt = 0; + priv_val->buf_info_idx = -1; + for (i = 0; i < priv_val->buf_info_cnt; i++) + rkisp_free_buffer(ispdev, &priv_val->buf_info[i]); + } static void @@ -4555,6 +4689,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { .stream_stop = rkisp_params_stream_stop_v32, .fop_release = rkisp_params_fop_release_v32, .check_bigmode = rkisp_params_check_bigmode_v32, + .info2ddr_cfg = rkisp_params_info2ddr_cfg_v32, }; int rkisp_init_params_vdev_v32(struct rkisp_isp_params_vdev *params_vdev) @@ -4581,6 +4716,9 @@ int rkisp_init_params_vdev_v32(struct rkisp_isp_params_vdev *params_vdev) isp_lsc_cfg_sram_task, (unsigned long)params_vdev); tasklet_disable(&priv_val->lsc_tasklet); + priv_val->buf_info_owner = 0; + priv_val->buf_info_cnt = 0; + priv_val->buf_info_idx = -1; return 0; } diff --git a/drivers/media/platform/rockchip/isp/isp_params_v32.h b/drivers/media/platform/rockchip/isp/isp_params_v32.h index 0a4e29675fbf..7a3c4d1a15db 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v32.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v32.h @@ -180,6 +180,11 @@ struct rkisp_isp_params_val_v32 { struct rkisp_dummy_buffer buf_cac[ISP3X_MESH_BUF_NUM]; u32 buf_cac_idx; + struct rkisp_dummy_buffer buf_info[RKISP_INFO2DDR_BUF_MAX]; + u32 buf_info_owner; + u32 buf_info_cnt; + int buf_info_idx; + struct rkisp_dummy_buffer buf_3dnr_iir; struct rkisp_dummy_buffer buf_3dnr_cur; struct rkisp_dummy_buffer buf_3dnr_ds; diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v32.c b/drivers/media/platform/rockchip/isp/isp_stats_v32.c index 03520f1c67ea..f093c4acdeb5 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v32.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v32.c @@ -12,6 +12,7 @@ #include "common.h" #include "isp_stats.h" #include "isp_stats_v32.h" +#include "isp_params_v32.h" #define ISP32_3A_MEAS_DONE BIT(31) @@ -470,6 +471,70 @@ rkisp_stats_update_buf(struct rkisp_isp_stats_vdev *stats_vdev) } } +static void +rkisp_stats_info2ddr(struct rkisp_isp_stats_vdev *stats_vdev, + struct rkisp32_isp_stat_buffer *pbuf) +{ + struct rkisp_device *dev = stats_vdev->dev; + struct rkisp_isp_params_val_v32 *priv_val; + + priv_val = (struct rkisp_isp_params_val_v32 *)dev->params_vdev.priv_val; + if (priv_val->buf_info_owner && pbuf) { + int idx = priv_val->buf_info_idx; + struct rkisp_dummy_buffer *buf; + u32 reg = 0, ctrl; + + if (priv_val->buf_info_owner == RKISP_INFO2DRR_OWNER_GAIN) { + reg = ISP3X_GAIN_CTRL; + ctrl = ISP3X_GAIN_2DDR_EN; + } else { + reg = ISP3X_RAWAWB_CTRL; + ctrl = ISP32_RAWAWB_2DDR_PATH_EN; + } + if (idx >= 0) { + buf = &priv_val->buf_info[idx]; + rkisp_finish_buffer(dev, buf); + if (*(u32 *)buf->vaddr != RKISP_INFO2DDR_BUF_INIT && + (reg != ISP3X_RAWAWB_CTRL || + !(rkisp_read(dev, reg, true) & ISP32_RAWAWB_2DDR_PATH_ERR))) { + pbuf->params.info2ddr.buf_fd = buf->dma_fd; + pbuf->params.info2ddr.owner = priv_val->buf_info_owner; + pbuf->meas_type |= ISP32_STAT_INFO2DDR; + } else if (reg == ISP3X_RAWAWB_CTRL && + rkisp_read(dev, reg, true) & ISP32_RAWAWB_2DDR_PATH_ERR) { + v4l2_warn(&dev->v4l2_dev, + "rawawb2ddr path error idx:%d\n", idx); + } + + if (pbuf->params.info2ddr.buf_fd == -1) + return; + } + /* get next unused buf to hw */ + for (idx = 0; idx < priv_val->buf_info_cnt; idx++) { + buf = &priv_val->buf_info[idx]; + if (*(u32 *)buf->vaddr == RKISP_INFO2DDR_BUF_INIT) + break; + } + + if (idx == priv_val->buf_info_cnt) { + rkisp_clear_bits(dev, reg, ctrl, false); + priv_val->buf_info_idx = -1; + } else { + buf = &priv_val->buf_info[idx]; + rkisp_write(dev, ISP3X_MI_GAIN_WR_BASE, buf->dma_addr, false); + if (dev->hw_dev->is_single) + rkisp_write(dev, ISP3X_MI_WR_CTRL2, ISP3X_GAINSELF_UPD, true); + if (priv_val->buf_info_idx < 0) + rkisp_set_bits(dev, reg, 0, ctrl, false); + priv_val->buf_info_idx = idx; + } + } else if (priv_val->buf_info_idx >= 0) { + priv_val->buf_info_idx = -1; + rkisp_clear_bits(dev, ISP3X_GAIN_CTRL, ISP3X_GAIN_2DDR_EN, false); + rkisp_clear_bits(dev, ISP3X_RAWAWB_CTRL, ISP32_RAWAWB_2DDR_PATH_EN, false); + } +} + static void rkisp_stats_send_meas_v32(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp_readout_work *meas_work) @@ -496,6 +561,8 @@ rkisp_stats_send_meas_v32(struct rkisp_isp_stats_vdev *stats_vdev, cur_stat_buf = (struct rkisp32_isp_stat_buffer *)(cur_buf->vaddr[0]); cur_stat_buf->frame_id = cur_frame_id; + cur_stat_buf->params.info2ddr.buf_fd = -1; + cur_stat_buf->params.info2ddr.owner = 0; } if (meas_work->isp_ris & ISP3X_AFM_SUM_OF) @@ -554,6 +621,7 @@ rkisp_stats_send_meas_v32(struct rkisp_isp_stats_vdev *stats_vdev, list_add_tail(&cur_buf->queue, &stats_vdev->stat); spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); } else { + rkisp_stats_info2ddr(stats_vdev, cur_stat_buf); vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size); cur_buf->vb.sequence = cur_frame_id; cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp; diff --git a/drivers/media/platform/rockchip/isp/regs_v3x.h b/drivers/media/platform/rockchip/isp/regs_v3x.h index bbfd89b42b4d..2584deb0e1b6 100644 --- a/drivers/media/platform/rockchip/isp/regs_v3x.h +++ b/drivers/media/platform/rockchip/isp/regs_v3x.h @@ -2111,6 +2111,10 @@ #define ISP32_EXPD_DATA(a, b) ((a) | (b) << 16) +/* GAIN */ +#define ISP3X_GAIN_2DDR_EN BIT(24) +#define ISP3X_GAIN_2DDR_mode(a) (((a) & 0x3) << 25) + /* DPCC */ /* CCM */ @@ -2170,4 +2174,9 @@ #define ISP3X_RAWAF_INELINE0(x) ((x) & 0xf) #define ISP3X_RAWAF_INTLINE0_EN BIT(27) +/* RAWAWB */ +#define ISP32_RAWAWB_2DDR_PATH_EN BIT(23) +#define ISP32_RAWAWB_2DDR_PATH_DS BIT(27) +#define ISP32_RAWAWB_2DDR_PATH_ERR BIT(29) + #endif /* _RKISP_REGS_V3X_H */ diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index a7f3a1953a0d..0e451ffad125 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -3140,6 +3140,9 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) idxfd = (struct isp2x_buf_idxfd *)arg; ret = rkisp_bridge_get_fbcbuf_fd(isp_dev, idxfd); break; + case RKISP_CMD_INFO2DDR: + ret = rkisp_params_info2ddr_cfg(&isp_dev->params_vdev, arg); + break; default: ret = -ENOIOCTLCMD; } @@ -3160,6 +3163,7 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, struct rkisp_meshbuf_size meshsize; struct rkisp_thunderboot_shmem shmem; struct isp2x_buf_idxfd idxfd; + struct rkisp_info2ddr info2ddr; long ret = 0; if (!up && cmd != RKISP_CMD_FREE_SHARED_BUF) @@ -3225,6 +3229,13 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, if (!ret && copy_to_user(up, &idxfd, sizeof(idxfd))) ret = -EFAULT; break; + case RKISP_CMD_INFO2DDR: + if (copy_from_user(&info2ddr, up, sizeof(info2ddr))) + return -EFAULT; + ret = rkisp_ioctl(sd, cmd, &info2ddr); + if (!ret && copy_to_user(up, &info2ddr, sizeof(info2ddr))) + ret = -EFAULT; + break; default: ret = -ENOIOCTLCMD; } diff --git a/include/uapi/linux/rkisp2-config.h b/include/uapi/linux/rkisp2-config.h index 1b073655575e..2953998d8d8f 100644 --- a/include/uapi/linux/rkisp2-config.h +++ b/include/uapi/linux/rkisp2-config.h @@ -44,6 +44,9 @@ #define RKISP_CMD_SET_MESHBUF_SIZE \ _IOW('V', BASE_VIDIOC_PRIVATE + 9, struct rkisp_meshbuf_size) +#define RKISP_CMD_INFO2DDR \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 10, struct rkisp_info2ddr) + /****************ISP VIDEO IOCTL******************************/ #define RKISP_CMD_GET_CSI_MEMORY_MODE \ @@ -404,6 +407,46 @@ enum isp_csi_memory { CSI_MEM_WORD_BIG_ALIGN = 2, }; +#define RKISP_INFO2DDR_BUF_MAX 4 +/* 32bit flag for user set to memory after buf used */ +#define RKISP_INFO2DDR_BUF_INIT 0x5AA5 + +enum rkisp_info2ddr_owner { + RKISP_INFO2DRR_OWNER_NULL, + RKISP_INFO2DRR_OWNER_GAIN, + RKISP_INFO2DRR_OWNER_AWB, +}; + +/* struct rkisp_info2ddr + * awb and gain debug info write to ddr + * + * owner: 0: off, 1: gain, 2: awb. + * u: gain or awb mode parameters. + * buf_cnt: buf num to request. return actual result. + * buf_fd: fd of memory alloc result. + * wsize: data width to request. if useless to 0. return actual result. + * vsize: data height to request. if useless to 0. return actual result. + */ +struct rkisp_info2ddr { + enum rkisp_info2ddr_owner owner; + + union { + struct { + u8 gain2ddr_mode; + } gain; + + struct { + u8 awb2ddr_sel; + } awb; + } u; + + u8 buf_cnt; + s32 buf_fd[RKISP_INFO2DDR_BUF_MAX]; + + u32 wsize; + u32 vsize; +} __attribute__ ((packed)); + struct isp2x_ispgain_buf { u32 gain_dmaidx; u32 mfbc_dmaidx; diff --git a/include/uapi/linux/rkisp32-config.h b/include/uapi/linux/rkisp32-config.h index 45af13818daa..663ced612d45 100644 --- a/include/uapi/linux/rkisp32-config.h +++ b/include/uapi/linux/rkisp32-config.h @@ -64,6 +64,7 @@ #define ISP32_STAT_BLS ISP3X_STAT_BLS #define ISP32_STAT_DHAZ ISP3X_STAT_DHAZ #define ISP32_STAT_VSM BIT(18) +#define ISP32_STAT_INFO2DDR BIT(19) #define ISP32_MESH_BUF_NUM ISP3X_MESH_BUF_NUM @@ -750,11 +751,9 @@ struct isp32_rawawb_meas_cfg { u8 wind_size; u8 rawlsc_bypass_en; u8 light_num; - u8 ddr_path_en; u8 uv_en1; u8 xy_en1; u8 yuv3d_en1; - u8 ddr_path_sel; u8 low12bit_val; /* RAWAWB_WEIGHT_CURVE_CTRL */ u8 wp_luma_wei_en0; @@ -1306,7 +1305,7 @@ struct isp32_rawaf_stat { u32 afm_sum_b; u32 afm_lum_b; u32 highlit_cnt_winb; - u32 reserved[20]; + u32 reserved[18]; } __attribute__ ((packed)); struct isp32_rawawb_ramdata { @@ -1348,6 +1347,11 @@ struct isp32_vsm_stat { u16 delta_v; } __attribute__ ((packed)); +struct isp32_info2ddr_stat { + u32 owner; + s32 buf_fd; +} __attribute__ ((packed)); + struct isp32_isp_params_cfg { u64 module_en_update; u64 module_ens; @@ -1374,6 +1378,7 @@ struct isp32_stat { struct isp32_rawaf_stat rawaf; //offset 0x1c00 struct isp3x_dhaz_stat dhaz; struct isp32_vsm_stat vsm; + struct isp32_info2ddr_stat info2ddr; struct isp32_rawawb_meas_stat rawawb; //offset 0x2b00 } __attribute__ ((packed));