media: rockchip: isp: awb or gain debug info to ddr for isp32

Change-Id: Id4de69cc2f33e52133fecec0ac5960db5733910f
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2022-04-01 10:35:02 +08:00
committed by Tao Huang
parent c3c0f230b0
commit 548280a5d8
9 changed files with 304 additions and 11 deletions

View File

@@ -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)

View File

@@ -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 */

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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));