media: rockchip: isp: dynamic memory alloc for params and stats function

Change-Id: Iecc3391295e264ac6569c2ace257a023bfa3ed9e
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2021-11-27 17:15:55 +08:00
committed by Tao Huang
parent 043ff868f8
commit 57bacabe6e
2 changed files with 69 additions and 70 deletions

View File

@@ -3712,32 +3712,68 @@ void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev)
isp_rawhstbig_cfg_sram(params_vdev, &params->meas.rawhist3, 0, true);
}
static void
rkisp_alloc_bay3d_buf(struct rkisp_isp_params_vdev *params_vdev,
const struct isp21_isp_params_cfg *new_params)
static int
rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev,
const struct isp21_isp_params_cfg *new_params)
{
struct rkisp_device *ispdev = params_vdev->dev;
struct rkisp_isp_subdev *isp_sdev = &ispdev->isp_sdev;
struct rkisp_isp_params_val_v21 *priv_val;
u64 module_en_update, module_ens;
u32 w, h, size;
int ret;
int ret, i;
priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
module_en_update = new_params->module_en_update;
module_ens = new_params->module_ens;
priv_val->buf_3dlut_idx = 0;
for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) {
priv_val->buf_3dlut[i].is_need_vaddr = true;
priv_val->buf_3dlut[i].size = RKISP_PARAM_3DLUT_BUF_SIZE;
ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_3dlut[i]);
if (ret) {
dev_err(ispdev->dev, "can not alloc buffer\n");
goto err_3dlut;
}
}
priv_val->buf_lsclut_idx = 0;
for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) {
priv_val->buf_lsclut[i].is_need_vaddr = true;
priv_val->buf_lsclut[i].size = RKISP_PARAM_LSC_LUT_BUF_SIZE;
ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_lsclut[i]);
if (ret) {
dev_err(ispdev->dev, "can not alloc buffer\n");
goto err_lsclut;
}
}
if ((module_en_update & ISP2X_MODULE_BAY3D) &&
(module_ens & ISP2X_MODULE_BAY3D)) {
w = isp_sdev->in_crop.width;
h = isp_sdev->in_crop.height;
size = 2 * ALIGN((ALIGN(w, 16) + (w + 15) / 8) * h, 16);
priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr);
priv_val->buf_3dnr.size = size;
ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_3dnr);
if (ret)
if (ret) {
dev_err(ispdev->dev, "can not alloc bay3d buffer\n");
goto err_bay3d;
}
}
return 0;
err_bay3d:
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr);
i = RKISP_PARAM_LSC_LUT_BUF_NUM;
err_lsclut:
for (i -= 1; i >= 0; i--)
rkisp_free_buffer(ispdev, &priv_val->buf_lsclut[i]);
i = RKISP_PARAM_3DLUT_BUF_NUM;
err_3dlut:
for (i -= 1; i >= 0; i--)
rkisp_free_buffer(ispdev, &priv_val->buf_3dlut[i]);
return ret;
}
/* Not called when the camera active, thus not isr protection. */
@@ -3752,7 +3788,7 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
u32 width = hw->max_in.w ? hw->max_in.w : out_crop->width;
u32 size = hw->max_in.w ? hw->max_in.w * hw->max_in.h : isp_param_get_insize(params_vdev);
rkisp_alloc_bay3d_buf(params_vdev, params_vdev->isp21_params);
rkisp_alloc_internal_buf(params_vdev, params_vdev->isp21_params);
spin_lock(&params_vdev->config_lock);
/* override the default things */
if (!params_vdev->isp21_params->module_cfg_update &&
@@ -3900,9 +3936,16 @@ rkisp_params_stream_stop_v2x(struct rkisp_isp_params_vdev *params_vdev)
{
struct rkisp_device *ispdev = params_vdev->dev;
struct rkisp_isp_params_val_v21 *priv_val;
int i;
priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr);
for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++)
rkisp_free_buffer(ispdev, &priv_val->buf_3dlut[i]);
for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++)
rkisp_free_buffer(ispdev, &priv_val->buf_lsclut[i]);
for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++)
rkisp_free_buffer(ispdev, &ispdev->stats_vdev.stats_buf[i]);
}
static void
@@ -4107,9 +4150,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev)
{
struct device *dev = params_vdev->dev->dev;
struct rkisp_isp_params_val_v21 *priv_val;
int i, ret;
priv_val = kzalloc(sizeof(*priv_val), GFP_KERNEL);
if (!priv_val)
@@ -4121,62 +4162,18 @@ int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev)
return -ENOMEM;
}
priv_val->buf_3dlut_idx = 0;
for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++) {
priv_val->buf_3dlut[i].is_need_vaddr = true;
priv_val->buf_3dlut[i].size = RKISP_PARAM_3DLUT_BUF_SIZE;
ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]);
if (ret) {
dev_err(dev, "can not alloc buffer\n");
goto err;
}
}
priv_val->buf_lsclut_idx = 0;
for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++) {
priv_val->buf_lsclut[i].is_need_vaddr = true;
priv_val->buf_lsclut[i].size = RKISP_PARAM_LSC_LUT_BUF_SIZE;
ret = rkisp_alloc_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]);
if (ret) {
dev_err(dev, "can not alloc buffer\n");
goto err;
}
}
params_vdev->priv_val = (void *)priv_val;
params_vdev->ops = &rkisp_isp_params_ops_tbl;
params_vdev->priv_ops = &rkisp_v21_isp_params_ops;
rkisp_clear_first_param_v2x(params_vdev);
return 0;
err:
for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++)
rkisp_free_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]);
for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++)
rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]);
vfree(params_vdev->isp21_params);
return ret;
}
void rkisp_uninit_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev)
{
struct rkisp_isp_params_val_v21 *priv_val;
int i;
priv_val = params_vdev->priv_val;
if (!priv_val)
return;
rkisp_deinit_ldch_buf(params_vdev);
for (i = 0; i < RKISP_PARAM_3DLUT_BUF_NUM; i++)
rkisp_free_buffer(params_vdev->dev, &priv_val->buf_3dlut[i]);
for (i = 0; i < RKISP_PARAM_LSC_LUT_BUF_NUM; i++)
rkisp_free_buffer(params_vdev->dev, &priv_val->buf_lsclut[i]);
vfree(params_vdev->isp21_params);
kfree(priv_val);
if (params_vdev->isp21_params)
vfree(params_vdev->isp21_params);
kfree(params_vdev->priv_val);
params_vdev->priv_val = NULL;
}

View File

@@ -1118,11 +1118,19 @@ static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev)
{
int i;
stats_vdev->rd_stats_from_ddr = false;
stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21;
if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode) &&
stats_vdev->stats_buf[0].mem_priv) {
if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode)) {
for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
stats_vdev->stats_buf[i].is_need_vaddr = true;
stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
if (rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]))
goto err;
}
stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v21;
stats_vdev->rd_stats_from_ddr = true;
stats_vdev->rd_buf_idx = 0;
@@ -1135,12 +1143,15 @@ void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev)
rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
SW_3A_DDR_WRITE_EN, false);
}
return;
err:
for (i -= 1; i >= 0; i--)
rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
dev_err(stats_vdev->dev->dev, "alloc stats ddr buf fail\n");
}
void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
{
int i;
stats_vdev->vdev_fmt.fmt.meta.dataformat =
V4L2_META_FMT_RK_ISP1_STAT_3A;
stats_vdev->vdev_fmt.fmt.meta.buffersize =
@@ -1149,19 +1160,10 @@ void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21;
stats_vdev->rd_stats_from_ddr = false;
for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
stats_vdev->stats_buf[i].is_need_vaddr = true;
stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
}
}
void rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
{
int i;
for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++)
rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
}