media: rockchip: aiisp: delete one temp buffer to reduce memory

Signed-off-by: hkj <william.hu@rock-chips.com>
Change-Id: I70ac6a2dbd3f0b07244480b9d4e3925a083e009a
This commit is contained in:
hkj
2025-06-18 17:41:38 +08:00
committed by Tao Huang
parent 34aa1c493f
commit 2e3bcaae97
2 changed files with 48 additions and 21 deletions

View File

@@ -397,8 +397,7 @@ static void rkaiisp_free_aiynr_ybuf(struct rkaiisp_device *aidev)
static void rkaiisp_free_tempbuf(struct rkaiisp_device *aidev)
{
rkaiisp_free_buffer(aidev, &aidev->temp_buf[0]);
rkaiisp_free_buffer(aidev, &aidev->temp_buf[1]);
rkaiisp_free_buffer(aidev, &aidev->temp_buf);
}
static int rkaiisp_free_pool(struct rkaiisp_device *aidev)
@@ -548,6 +547,37 @@ static void rkaiisp_calc_outbuf_size(struct rkaiisp_device *aidev, u32 raw_hgt,
}
}
static void rkaiisp_set_lastout_buf(struct rkaiisp_device *aidev)
{
int buffer_index;
if (aidev->model_mode == REMOSAIC_MODE) {
aidev->lastout_buf[0] = &aidev->temp_buf;
aidev->lastout_buf[1] = &aidev->temp_buf;
return;
}
if (aidev->model_runcnt % 2 == 0) {
aidev->lastout_buf[0] = &aidev->temp_buf;
if (aidev->model_mode == AIYNR_MODE) {
buffer_index = aidev->curr_idxbuf.aibnr_st.y_dest_index;
aidev->lastout_buf[1] = &aidev->ynroutbuf[buffer_index];
} else {
buffer_index = aidev->curr_idxbuf.aibnr_st.aiisp_index;
aidev->lastout_buf[1] = &aidev->aiispbuf[buffer_index];
}
} else {
aidev->lastout_buf[1] = &aidev->temp_buf;
if (aidev->model_mode == AIYNR_MODE) {
buffer_index = aidev->curr_idxbuf.aibnr_st.y_dest_index;
aidev->lastout_buf[0] = &aidev->ynroutbuf[buffer_index];
} else {
buffer_index = aidev->curr_idxbuf.aibnr_st.aiisp_index;
aidev->lastout_buf[0] = &aidev->aiispbuf[buffer_index];
}
}
}
static int rkaiisp_init_pool(struct rkaiisp_device *aidev, struct rkaiisp_ispbuf_info *ispbuf)
{
int i, ret = 0;
@@ -611,16 +641,11 @@ static int rkaiisp_init_pool(struct rkaiisp_device *aidev, struct rkaiisp_ispbuf
stride = ((ispbuf->iir_width + 1) / 2 * 15 * 11 + 7) >> 3;
size = stride * (ispbuf->iir_height + 1) / 2;
}
aidev->temp_buf[0].size = size;
aidev->temp_buf[1].size = aidev->temp_buf[0].size;
aidev->temp_buf[0].is_need_vaddr = false;
aidev->temp_buf[0].is_need_dbuf = false;
aidev->temp_buf[0].is_need_dmafd = false;
aidev->temp_buf[1].is_need_vaddr = false;
aidev->temp_buf[1].is_need_dbuf = false;
aidev->temp_buf[1].is_need_dmafd = false;
ret = rkaiisp_allow_buffer(aidev, &aidev->temp_buf[0]);
ret |= rkaiisp_allow_buffer(aidev, &aidev->temp_buf[1]);
aidev->temp_buf.size = size;
aidev->temp_buf.is_need_vaddr = false;
aidev->temp_buf.is_need_dbuf = false;
aidev->temp_buf.is_need_dmafd = false;
ret = rkaiisp_allow_buffer(aidev, &aidev->temp_buf);
if (ret)
rkaiisp_free_pool(aidev);
@@ -1211,7 +1236,7 @@ static u32 rkaiisp_config_rdchannel(struct rkaiisp_device *aidev,
width = aidev->outbuf_size[aidev->model_runcnt-run_idx].width;
height = aidev->outbuf_size[aidev->model_runcnt-run_idx].height;
}
dma_addr = aidev->temp_buf[aidev->outbuf_idx].dma_addr;
dma_addr = aidev->lastout_buf[aidev->outbuf_idx]->dma_addr;
break;
case VICAP_BAYER_RAW:
width = rmsbuf->image_width;
@@ -1298,7 +1323,7 @@ static void rkaiisp_run_cfg(struct rkaiisp_device *aidev, u32 run_idx)
outbuf_idx = 0;
aidev->outbuf_idx = outbuf_idx;
rkaiisp_write(aidev, AIISP_MI_CHN0_WR_BASE,
aidev->temp_buf[outbuf_idx].dma_addr, false);
aidev->lastout_buf[outbuf_idx]->dma_addr, false);
rkaiisp_gen_slice_param(aidev, model_cfg, sig_width);
rkaiisp_determine_size(aidev, model_cfg);
@@ -1311,7 +1336,7 @@ static void rkaiisp_run_cfg(struct rkaiisp_device *aidev, u32 run_idx)
outbuf_idx = (outbuf_idx + 1) % 2;
aidev->outbuf_idx = outbuf_idx;
rkaiisp_write(aidev, AIISP_MI_CHN0_WR_BASE,
aidev->temp_buf[outbuf_idx].dma_addr, false);
aidev->lastout_buf[outbuf_idx]->dma_addr, false);
} else {
sig_width = rkaiisp_config_rdchannel(aidev, model_cfg, run_idx);
@@ -1337,7 +1362,7 @@ static void rkaiisp_run_cfg(struct rkaiisp_device *aidev, u32 run_idx)
outbuf_idx = 0;
aidev->outbuf_idx = outbuf_idx;
rkaiisp_write(aidev, AIISP_MI_CHN0_WR_BASE,
aidev->temp_buf[outbuf_idx].dma_addr, false);
aidev->lastout_buf[outbuf_idx]->dma_addr, false);
rkaiisp_gen_slice_param(aidev, model_cfg, sig_width);
rkaiisp_determine_size(aidev, model_cfg);
@@ -1350,7 +1375,7 @@ static void rkaiisp_run_cfg(struct rkaiisp_device *aidev, u32 run_idx)
outbuf_idx = (outbuf_idx + 1) % 2;
aidev->outbuf_idx = outbuf_idx;
rkaiisp_write(aidev, AIISP_MI_CHN0_WR_BASE,
aidev->temp_buf[outbuf_idx].dma_addr, false);
aidev->lastout_buf[outbuf_idx]->dma_addr, false);
} else {
sig_width = rkaiisp_config_rdchannel(aidev, model_cfg, run_idx);
@@ -1373,7 +1398,7 @@ static void rkaiisp_run_cfg(struct rkaiisp_device *aidev, u32 run_idx)
outbuf_idx = 0;
aidev->outbuf_idx = outbuf_idx;
rkaiisp_write(aidev, AIISP_MI_CHN0_WR_BASE,
aidev->temp_buf[outbuf_idx].dma_addr, false);
aidev->lastout_buf[outbuf_idx]->dma_addr, false);
rkaiisp_gen_slice_param(aidev, model_cfg, ispbuf->sig_width[3]);
rkaiisp_determine_size(aidev, model_cfg);
@@ -1389,7 +1414,7 @@ static void rkaiisp_run_cfg(struct rkaiisp_device *aidev, u32 run_idx)
outbuf_idx = (outbuf_idx + 1) % 2;
aidev->outbuf_idx = outbuf_idx;
rkaiisp_write(aidev, AIISP_MI_CHN0_WR_BASE,
aidev->temp_buf[outbuf_idx].dma_addr, false);
aidev->lastout_buf[outbuf_idx]->dma_addr, false);
} else {
rkaiisp_config_rdchannel(aidev, model_cfg, run_idx);
@@ -1573,6 +1598,7 @@ void rkaiisp_trigger(struct rkaiisp_device *aidev)
aidev->frm_st = ktime_get_ns();
rkaiisp_get_new_iqparam(aidev);
rkaiisp_calc_outbuf_size(aidev, ispbuf->iir_height, ispbuf->iir_width);
rkaiisp_set_lastout_buf(aidev);
rkaiisp_run_cfg(aidev, aidev->run_idx);
aidev->hwstate = HW_RUNNING;
rkaiisp_run_start(aidev);

View File

@@ -31,7 +31,7 @@
#define RKAIISP_V4L2_EVENT_ELEMS 4
#define RKAIISP_MAX_CHANNEL 7
#define RKAIISP_TMP_BUF_CNT 2
#define RKAIISP_LASTOUT_BUF_CNT 2
#define RKAIISP_DEFAULT_MAXRUNCNT 8
#define RKAIISP_DEFAULT_PARASIZE (16 * 1024)
#define RKAIISP_SW_REG_SIZE 0x3000
@@ -117,7 +117,8 @@ struct rkaiisp_device {
struct rkaiisp_dummy_buffer vpslbuf[RKISP_BUFFER_MAX];
struct rkaiisp_dummy_buffer aiispbuf[RKISP_BUFFER_MAX];
struct rkaiisp_dummy_buffer ynrinbuf[RKISP_BUFFER_MAX];
struct rkaiisp_dummy_buffer temp_buf[RKAIISP_TMP_BUF_CNT];
struct rkaiisp_dummy_buffer temp_buf;
struct rkaiisp_dummy_buffer *lastout_buf[RKAIISP_LASTOUT_BUF_CNT];
u32 outbuf_idx;
struct rkaiisp_rmsbuf_info rmsbuf;