From 8e24c177fa330e2f997b706298e0854137bfff5c Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Mon, 6 Jan 2025 10:21:38 +0800 Subject: [PATCH] media: rockchip: isp: optimize aiisp for isp39 Change-Id: I79d975e39bca68b0b14ed5bdebf361c11749493e Signed-off-by: Cai YiWei --- .../media/platform/rockchip/isp/capture_v20.c | 2 +- .../media/platform/rockchip/isp/capture_v21.c | 2 +- .../media/platform/rockchip/isp/capture_v30.c | 2 +- .../media/platform/rockchip/isp/capture_v32.c | 8 +- .../media/platform/rockchip/isp/capture_v33.c | 8 +- .../media/platform/rockchip/isp/capture_v39.c | 10 +- drivers/media/platform/rockchip/isp/common.c | 1 + drivers/media/platform/rockchip/isp/common.h | 1 + drivers/media/platform/rockchip/isp/csi.c | 2 +- drivers/media/platform/rockchip/isp/dev.c | 31 +- drivers/media/platform/rockchip/isp/dev.h | 6 +- drivers/media/platform/rockchip/isp/dmarx.c | 23 +- drivers/media/platform/rockchip/isp/dmarx.h | 6 +- drivers/media/platform/rockchip/isp/hw.c | 3 + drivers/media/platform/rockchip/isp/hw.h | 2 + .../media/platform/rockchip/isp/isp_ispp.h | 2 + .../media/platform/rockchip/isp/isp_params.c | 63 +- .../media/platform/rockchip/isp/isp_params.h | 18 +- .../platform/rockchip/isp/isp_params_v1x.c | 10 +- .../platform/rockchip/isp/isp_params_v21.c | 13 +- .../platform/rockchip/isp/isp_params_v2x.c | 13 +- .../platform/rockchip/isp/isp_params_v32.c | 10 +- .../platform/rockchip/isp/isp_params_v33.c | 10 +- .../platform/rockchip/isp/isp_params_v39.c | 1054 ++++++++++------- .../platform/rockchip/isp/isp_params_v39.h | 154 +-- .../platform/rockchip/isp/isp_params_v3x.c | 10 +- .../media/platform/rockchip/isp/isp_stats.c | 26 +- .../platform/rockchip/isp/isp_stats_v1x.c | 13 +- .../platform/rockchip/isp/isp_stats_v21.c | 13 +- .../platform/rockchip/isp/isp_stats_v2x.c | 13 +- .../platform/rockchip/isp/isp_stats_v32.c | 14 +- .../platform/rockchip/isp/isp_stats_v33.c | 4 +- .../platform/rockchip/isp/isp_stats_v39.c | 245 ++-- .../platform/rockchip/isp/isp_stats_v3x.c | 10 +- drivers/media/platform/rockchip/isp/procfs.c | 36 +- .../media/platform/rockchip/isp/regs_v3x.h | 1 + drivers/media/platform/rockchip/isp/rkisp.c | 541 +++++---- drivers/media/platform/rockchip/isp/rkisp.h | 3 +- include/uapi/linux/rk-isp2-config.h | 57 +- include/uapi/linux/rk-isp39-config.h | 1 + 40 files changed, 1415 insertions(+), 1026 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c index 7147379a4517..620c3239d159 100644 --- a/drivers/media/platform/rockchip/isp/capture_v20.c +++ b/drivers/media/platform/rockchip/isp/capture_v20.c @@ -1400,7 +1400,7 @@ static int mi_frame_end(struct rkisp_stream *stream, u32 state) stream->dbg.timestamp = ns; stream->dbg.id = stream->curr_buf->vb.sequence; if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) - stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; + stream->dbg.delay = ns - vb2_buf->timestamp; if (!stream->streaming) { vb2_buffer_done(vb2_buf, VB2_BUF_STATE_ERROR); diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index cb394befd7ab..5337624fb439 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -1260,7 +1260,7 @@ static int mi_frame_end(struct rkisp_stream *stream, u32 state) stream->dbg.timestamp = ns; stream->dbg.id = stream->curr_buf->vb.sequence; if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) - stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; + stream->dbg.delay = ns - vb2_buf->timestamp; if (!stream->streaming) { vb2_buffer_done(vb2_buf, VB2_BUF_STATE_ERROR); diff --git a/drivers/media/platform/rockchip/isp/capture_v30.c b/drivers/media/platform/rockchip/isp/capture_v30.c index 4e35b2e85bcf..137473716db9 100644 --- a/drivers/media/platform/rockchip/isp/capture_v30.c +++ b/drivers/media/platform/rockchip/isp/capture_v30.c @@ -1036,7 +1036,7 @@ static int mi_frame_end(struct rkisp_stream *stream, u32 state) stream->dbg.interval = ns - stream->dbg.timestamp; stream->dbg.timestamp = ns; stream->dbg.id = buf->vb.sequence; - stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; + stream->dbg.delay = ns - vb2_buf->timestamp; if (vir->streaming && vir->conn_id == stream->id) { spin_lock_irqsave(&vir->vbq_lock, lock_flags); diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index 8d9bd68fcf1f..28f0e20073b8 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1581,10 +1581,10 @@ static int mi_frame_end(struct rkisp_stream *stream, u32 state) if (!ns) ns = rkisp_time_get_ns(dev); buf->vb.sequence = i; - buf->vb.vb2_buf.timestamp = ns; + vb2_buf->timestamp = ns; ns = rkisp_time_get_ns(dev); stream->dbg.interval = ns - stream->dbg.timestamp; - stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; + stream->dbg.delay = ns - vb2_buf->timestamp; stream->dbg.timestamp = ns; stream->dbg.id = i; @@ -2361,10 +2361,10 @@ void rkisp_mi_v32_isr(u32 mis_val, struct rkisp_device *dev) } } else if (stream->id == RKISP_STREAM_MP && dev->cap_dev.wrap_line) { ns = rkisp_time_get_ns(dev); - rkisp_dmarx_get_frame(dev, &seq, NULL, NULL, true); stream->dbg.interval = ns - stream->dbg.timestamp; - stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; stream->dbg.timestamp = ns; + rkisp_dmarx_get_frame(dev, &seq, NULL, &ns, true); + stream->dbg.delay = stream->dbg.timestamp - ns; stream->dbg.id = seq; set_mirror_flip(stream); } else { diff --git a/drivers/media/platform/rockchip/isp/capture_v33.c b/drivers/media/platform/rockchip/isp/capture_v33.c index 2a3c3100360f..5095587b807d 100644 --- a/drivers/media/platform/rockchip/isp/capture_v33.c +++ b/drivers/media/platform/rockchip/isp/capture_v33.c @@ -1245,10 +1245,10 @@ static int mi_frame_end(struct rkisp_stream *stream, u32 state) if (!ns) ns = rkisp_time_get_ns(dev); buf->vb.sequence = i; - buf->vb.vb2_buf.timestamp = ns; + vb2_buf->timestamp = ns; ns = rkisp_time_get_ns(dev); stream->dbg.interval = ns - stream->dbg.timestamp; - stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; + stream->dbg.delay = ns - vb2_buf->timestamp; stream->dbg.timestamp = ns; stream->dbg.id = i; @@ -1940,10 +1940,10 @@ void rkisp_mi_v33_isr(u32 mis_val, struct rkisp_device *dev) } } else if (stream->id == RKISP_STREAM_MP && dev->cap_dev.wrap_line) { ns = rkisp_time_get_ns(dev); - rkisp_dmarx_get_frame(dev, &seq, NULL, NULL, true); stream->dbg.interval = ns - stream->dbg.timestamp; - stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; stream->dbg.timestamp = ns; + rkisp_dmarx_get_frame(dev, &seq, NULL, &ns, true); + stream->dbg.delay = stream->dbg.timestamp - ns; stream->dbg.id = seq; set_mirror_flip(stream); } else { diff --git a/drivers/media/platform/rockchip/isp/capture_v39.c b/drivers/media/platform/rockchip/isp/capture_v39.c index 0242e065c488..322b55acd80d 100644 --- a/drivers/media/platform/rockchip/isp/capture_v39.c +++ b/drivers/media/platform/rockchip/isp/capture_v39.c @@ -1081,7 +1081,7 @@ static int mi_frame_end(struct rkisp_stream *stream, u32 state) goto end; } - rkisp_dmarx_get_frame(dev, &seq, NULL, &ns, true); + rkisp_dmarx_get_frame(dev, &seq, NULL, &ns, !dev->is_aiisp_en); if (!ns) ns = ktime_get_ns(); @@ -1120,10 +1120,10 @@ static int mi_frame_end(struct rkisp_stream *stream, u32 state) } } buf->vb.sequence = seq; - buf->vb.vb2_buf.timestamp = ns; + vb2_buf->timestamp = ns; ns = ktime_get_ns(); stream->dbg.interval = ns - stream->dbg.timestamp; - stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; + stream->dbg.delay = ns - vb2_buf->timestamp; stream->dbg.timestamp = ns; stream->dbg.id = seq; @@ -1176,7 +1176,9 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) stream->ops->disable_mi(stream); if (IS_HDR_RDBK(dev->rd_mode)) { spin_lock_irqsave(&dev->hw_dev->rdbk_lock, lock_flags); - if (dev->hw_dev->cur_dev_id != dev->dev_id || dev->hw_dev->is_idle) { + if (dev->hw_dev->cur_dev_id != dev->dev_id || + (!dev->is_aiisp_en && dev->hw_dev->is_idle) || + (dev->is_aiisp_en && dev->hw_dev->is_be_idle)) { is_wait = false; if (stream->ops->disable_mi) stream->ops->disable_mi(stream); diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c index 681093868f3d..4ef7250dc48e 100644 --- a/drivers/media/platform/rockchip/isp/common.c +++ b/drivers/media/platform/rockchip/isp/common.c @@ -338,6 +338,7 @@ void rkisp_free_buffer(struct rkisp_device *dev, dma_buf_put(buf->dbuf); g_ops->put(buf->mem_priv); buf->size = 0; + buf->index = -1; buf->dbuf = NULL; buf->vaddr = NULL; buf->mem_priv = NULL; diff --git a/drivers/media/platform/rockchip/isp/common.h b/drivers/media/platform/rockchip/isp/common.h index f77364e922ed..eb5bfe9ee317 100644 --- a/drivers/media/platform/rockchip/isp/common.h +++ b/drivers/media/platform/rockchip/isp/common.h @@ -135,6 +135,7 @@ struct rkisp_dummy_buffer { void *vaddr; u32 size; int dma_fd; + int index; bool is_need_vaddr; bool is_need_dbuf; bool is_need_dmafd; diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index ab460664a423..e296e196d475 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -717,7 +717,7 @@ void rkisp_csi_sof(struct rkisp_device *dev, u8 id) return; } - rkisp_isp_queue_event_sof(&dev->isp_sdev); + rkisp_isp_queue_event_sof(dev); } int rkisp_register_csi_subdev(struct rkisp_device *dev, diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c index 2435749c9cb1..5bafd453da9b 100644 --- a/drivers/media/platform/rockchip/isp/dev.c +++ b/drivers/media/platform/rockchip/isp/dev.c @@ -302,7 +302,7 @@ static int rkisp_pipeline_open(struct rkisp_pipeline *p, rkisp_clk_dbg = true; if (!(dev->isp_inp & (INP_RAWRD0 | INP_RAWRD2))) { dev->is_rdbk_auto = rkisp_rdbk_auto; - if (dev->is_aiisp_en) + if (dev->is_aiisp_en && !hw->is_single) dev->is_rdbk_auto = true; if (rkisp_vicap_buf[dev->dev_id] > RKISP_VICAP_BUF_CNT_MAX) rkisp_vicap_buf[dev->dev_id] = RKISP_VICAP_BUF_CNT_MAX; @@ -348,6 +348,10 @@ static int rkisp_pipeline_open(struct rkisp_pipeline *p, if (dev->isp_inp & (INP_CSI | INP_RAWRD0 | INP_RAWRD1 | INP_RAWRD2 | INP_CIF)) rkisp_csi_config_patch(dev, false); + dev->is_aiisp_sync = false; + if (dev->is_aiisp_en && + (dev->isp_inp & (INP_RAWRD0 | INP_RAWRD2) || dev->is_rdbk_auto)) + dev->is_aiisp_sync = true; return 0; err: atomic_dec(&p->power_cnt); @@ -377,6 +381,7 @@ static int rkisp_pipeline_close(struct rkisp_pipeline *p) static int rkisp_pipeline_set_stream(struct rkisp_pipeline *p, bool on) { struct rkisp_device *dev = container_of(p, struct rkisp_device, pipe); + struct rkisp_hw_dev *hw = dev->hw_dev; int i, ret, open_num = 0; if ((on && atomic_inc_return(&p->stream_cnt) > 1) || @@ -391,7 +396,7 @@ static int rkisp_pipeline_set_stream(struct rkisp_pipeline *p, bool on) if (ret < 0) goto err; if (dev->is_m_online && !dev->is_pre_on && - atomic_read(&dev->hw_dev->refcnt) == 1) { + atomic_read(&hw->refcnt) == 1) { i = 1; v4l2_subdev_call(p->subdevs[0], core, ioctl, RKISP_VICAP_CMD_HW_LINK, &i); } @@ -407,15 +412,23 @@ static int rkisp_pipeline_set_stream(struct rkisp_pipeline *p, bool on) goto err_stream_off; } } else { - for (i = 0; i < dev->hw_dev->dev_num; i++) { - if (dev->hw_dev->isp_size[i].is_on) + dev->isp_state = ISP_STOP; + for (i = 0; i < hw->dev_num; i++) { + if (hw->isp_size[i].is_on) open_num++; } - if (dev->hw_dev->monitor.is_en && open_num == 1) { - dev->hw_dev->monitor.is_en = 0; - dev->hw_dev->monitor.state = ISP_STOP; - if (!completion_done(&dev->hw_dev->monitor.cmpl)) - complete(&dev->hw_dev->monitor.cmpl); + if (hw->monitor.is_en && open_num == 1) { + hw->monitor.is_en = 0; + hw->monitor.state = ISP_STOP; + if (!completion_done(&hw->monitor.cmpl)) + complete(&hw->monitor.cmpl); + } + if (IS_HDR_RDBK(dev->rd_mode) && + !hw->is_idle && dev->dev_id == hw->cur_dev_id) { + ret = wait_event_timeout(dev->sync_onoff, hw->is_idle, msecs_to_jiffies(200)); + if (!ret) + v4l2_warn(&dev->v4l2_dev, "%s timeout, id:%d idle:%d state:0x%x\n", + __func__, hw->cur_dev_id, hw->is_idle, dev->isp_state); } /* sensor -> phy */ for (i = p->num_subdevs - 1; i >= 0; --i) { diff --git a/drivers/media/platform/rockchip/isp/dev.h b/drivers/media/platform/rockchip/isp/dev.h index 14e6a5627a34..be4e668cf780 100644 --- a/drivers/media/platform/rockchip/isp/dev.h +++ b/drivers/media/platform/rockchip/isp/dev.h @@ -72,7 +72,7 @@ enum rkisp_isp_state { ISP_FRAME_END = BIT(0), - ISP_FRAME_IN = BIT(1), + ISP_FRAME_BNR = BIT(1), ISP_FRAME_VS = BIT(2), ISP_FRAME_MP = BIT(3), ISP_FRAME_SP = BIT(4), @@ -266,6 +266,8 @@ struct rkisp_device { unsigned int skip_frame; unsigned int irq_ends; unsigned int irq_ends_mask; + unsigned int irq_f_ends; + unsigned int irq_f_ends_mask; bool send_fbcgain; struct rkisp_ispp_buf *cur_fbcgain; struct rkisp_buffer *cur_spbuf; @@ -274,6 +276,7 @@ struct rkisp_device { struct work_struct rdbk_work; struct kfifo rdbk_kfifo; + struct kfifo rdbk_be_kfifo; spinlock_t rdbk_lock; int rdbk_cnt; int rdbk_cnt_x1; @@ -306,6 +309,7 @@ struct rkisp_device { bool is_suspend_one_frame; bool is_aiisp_en; bool is_aiisp_upd; + bool is_aiisp_sync; bool is_frm_rd; bool is_multi_one_sync; bool is_wait_aiq; diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c index 1d82d0717fec..eba6f71e08e8 100644 --- a/drivers/media/platform/rockchip/isp/dmarx.c +++ b/drivers/media/platform/rockchip/isp/dmarx.c @@ -436,7 +436,7 @@ static void update_rawrd(struct rkisp_stream *stream) }; if (!vbuf->sequence) - trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq) - 1; + trigger.frame_id = ++dev->dmarx_dev.cur_frame.id; rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, &trigger); } } else if (dev->dmarx_dev.trigger == T_AUTO) { @@ -1232,30 +1232,24 @@ void rkisp_rawrd_set_pic_size(struct rkisp_device *dev, void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id, u64 *sof_timestamp, u64 *timestamp, - bool sync) + bool is_cur_frame) { unsigned long flag = 0; u64 sof_time = 0, frame_timestamp = 0; u32 frame_id = 0; - if (!IS_HDR_RDBK(dev->rd_mode)) { - frame_id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1; - frame_timestamp = dev->isp_sdev.frm_timestamp; - goto end; - } - spin_lock_irqsave(&dev->rdbk_lock, flag); - if (sync) { + if (is_cur_frame) { frame_id = dev->dmarx_dev.cur_frame.id; sof_time = dev->dmarx_dev.cur_frame.sof_timestamp; frame_timestamp = dev->dmarx_dev.cur_frame.timestamp; } else { - frame_id = dev->dmarx_dev.pre_frame.id; - sof_time = dev->dmarx_dev.pre_frame.sof_timestamp; - frame_timestamp = dev->dmarx_dev.pre_frame.timestamp; + frame_id = dev->dmarx_dev.cur_be_frame.id; + sof_time = dev->dmarx_dev.cur_be_frame.sof_timestamp; + frame_timestamp = dev->dmarx_dev.cur_be_frame.timestamp; } spin_unlock_irqrestore(&dev->rdbk_lock, flag); -end: + if (id) *id = frame_id; if (sof_timestamp) @@ -1290,7 +1284,8 @@ int rkisp_register_dmarx_vdev(struct rkisp_device *dev) if (ret < 0) goto err_free_dmarx2; } - + dmarx_dev->cur_be_frame.id = -1; + dmarx_dev->cur_frame.id = -1; return 0; err_free_dmarx2: rkisp_unregister_dmarx_video(&dmarx_dev->stream[RKISP_STREAM_RAWRD2]); diff --git a/drivers/media/platform/rockchip/isp/dmarx.h b/drivers/media/platform/rockchip/isp/dmarx.h index f8d8f230268b..da407f9e2dbd 100644 --- a/drivers/media/platform/rockchip/isp/dmarx.h +++ b/drivers/media/platform/rockchip/isp/dmarx.h @@ -50,15 +50,17 @@ struct rkisp_rx_buf_pool { /* * struct rkisp_dmarx_device * trigger: read back mode - * cur_frame: current frame id and timestamp in ns * pre_frame: previous frame id and timestamp in ns + * cur_frame: current frame (front end BNR) id and timestamp in ns + * cur_be_frame: current back end BNR frame id and timestamp in ns */ struct rkisp_dmarx_device { struct rkisp_device *ispdev; struct rkisp_stream stream[RKISP_MAX_DMARX_STREAM]; enum rkisp_dmarx_trigger trigger; - struct rkisp_dmarx_frame cur_frame; struct rkisp_dmarx_frame pre_frame; + struct rkisp_dmarx_frame cur_frame; + struct rkisp_dmarx_frame cur_be_frame; }; void rkisp_dmarx_isr(u32 mis_val, struct rkisp_device *dev); diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index f9a1877518b6..137abacb7707 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -1387,6 +1387,7 @@ static int rkisp_hw_probe(struct platform_device *pdev) hw_dev->dev_num = 0; hw_dev->dev_link_num = 0; hw_dev->cur_dev_id = 0; + hw_dev->cur_be_dev_id = 0; hw_dev->mipi_dev_id = 0; hw_dev->pre_dev_id = -1; hw_dev->is_multi_overflow = false; @@ -1398,6 +1399,7 @@ static int rkisp_hw_probe(struct platform_device *pdev) INIT_LIST_HEAD(&hw_dev->rpt_list); hw_dev->buf_init_cnt = 0; hw_dev->is_idle = true; + hw_dev->is_be_idle = true; hw_dev->is_single = true; hw_dev->is_mi_update = false; hw_dev->is_dma_contig = true; @@ -1451,6 +1453,7 @@ static int __maybe_unused rkisp_runtime_suspend(struct device *dev) int i; hw_dev->is_idle = true; + hw_dev->is_be_idle = true; if (dev->power.runtime_status) { hw_dev->dev_link_num = 0; hw_dev->is_single = true; diff --git a/drivers/media/platform/rockchip/isp/hw.h b/drivers/media/platform/rockchip/isp/hw.h index 657c77c0f937..20fbc19f0cb8 100644 --- a/drivers/media/platform/rockchip/isp/hw.h +++ b/drivers/media/platform/rockchip/isp/hw.h @@ -67,6 +67,7 @@ struct rkisp_hw_dev { int dev_num; int dev_link_num; int cur_dev_id; + int cur_be_dev_id; int pre_dev_id; int mipi_dev_id; struct max_input max_in; @@ -95,6 +96,7 @@ struct rkisp_hw_dev { bool is_dma_sg_ops; bool is_mmu; bool is_idle; + bool is_be_idle; bool is_single; bool is_mi_update; bool is_thunderboot; diff --git a/drivers/media/platform/rockchip/isp/isp_ispp.h b/drivers/media/platform/rockchip/isp/isp_ispp.h index f284a34cbf79..d8c389ff36e1 100644 --- a/drivers/media/platform/rockchip/isp/isp_ispp.h +++ b/drivers/media/platform/rockchip/isp/isp_ispp.h @@ -72,7 +72,9 @@ enum rkisp_ispp_reg_stat { struct frame_debug_info { u64 timestamp; + u64 timestamp_be; u32 interval; + u32 interval_be; u32 delay; u32 id; u32 frameloss; diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index 26282466b640..2bdd87dd2c17 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -163,6 +163,7 @@ static int rkisp_params_vb2_queue_setup(struct vb2_queue *vq, params_vdev->ops->get_param_size(params_vdev, sizes); INIT_LIST_HEAD(¶ms_vdev->params); + INIT_LIST_HEAD(¶ms_vdev->params_be); if (params_vdev->first_cfg_params) { params_vdev->first_cfg_params = false; @@ -182,15 +183,12 @@ static void rkisp_params_vb2_buf_queue(struct vb2_buffer *vb) struct rkisp_isp_params_vdev *params_vdev = vq->drv_priv; struct rkisp_device *dev = params_vdev->dev; void *first_param; - unsigned long flags; - unsigned int cur_frame_id = -1; + unsigned long flags = 0; - cur_frame_id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1; if (params_vdev->first_params) { first_param = vb2_plane_vaddr(vb, 0); params_vdev->ops->save_first_param(params_vdev, first_param); params_vdev->is_first_cfg = true; - vbuf->sequence = cur_frame_id; vb2_buffer_done(¶ms_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); params_vdev->first_params = false; wake_up(¶ms_vdev->dev->sync_onoff); @@ -269,7 +267,9 @@ static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq) struct rkisp_isp_params_vdev *params_vdev = vq->drv_priv; struct rkisp_device *dev = params_vdev->dev; struct rkisp_buffer *buf; - unsigned long flags; + unsigned long flags = 0; + LIST_HEAD(local_list); + LIST_HEAD(local_list_be); v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s state:0x%x\n", __func__, dev->isp_state); @@ -277,18 +277,24 @@ static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq) spin_lock_irqsave(¶ms_vdev->config_lock, flags); params_vdev->streamon = false; wake_up(&dev->sync_onoff); - while (!list_empty(¶ms_vdev->params)) { - buf = list_first_entry(¶ms_vdev->params, - struct rkisp_buffer, queue); + if (params_vdev->cur_buf) { + buf = params_vdev->cur_buf; + list_add_tail(&buf->queue, ¶ms_vdev->params); + params_vdev->cur_buf = NULL; + } + list_replace_init(¶ms_vdev->params, &local_list); + list_replace_init(¶ms_vdev->params_be, &local_list_be); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); + while (!list_empty(&local_list)) { + buf = list_first_entry(&local_list, struct rkisp_buffer, queue); list_del(&buf->queue); vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); } - if (params_vdev->cur_buf) { - buf = params_vdev->cur_buf; + while (!list_empty(&local_list_be)) { + buf = list_first_entry(&local_list_be, struct rkisp_buffer, queue); + list_del(&buf->queue); vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); - params_vdev->cur_buf = NULL; } - spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); if (dev->is_pre_on) { params_vdev->first_cfg_params = true; @@ -313,7 +319,7 @@ static int rkisp_params_vb2_start_streaming(struct vb2_queue *queue, unsigned int count) { struct rkisp_isp_params_vdev *params_vdev = queue->drv_priv; - unsigned long flags; + unsigned long flags = 0; v4l2_dbg(1, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, "%s cnt:%d\n", __func__, count); @@ -458,10 +464,11 @@ static void rkisp_uninit_params_vdev(struct rkisp_isp_params_vdev *params_vdev) rkisp_uninit_params_vdev_v33(params_vdev); } -void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id) +void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, + u32 frame_id, enum rkisp_params_type type) { if (params_vdev->ops->param_cfg) - params_vdev->ops->param_cfg(params_vdev, frame_id, RKISP_PARAMS_IMD); + params_vdev->ops->param_cfg(params_vdev, frame_id, type); } void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev, @@ -581,6 +588,32 @@ void rkisp_params_get_bay3d_buffd(struct rkisp_isp_params_vdev *params_vdev, params_vdev->ops->get_bay3d_buffd(params_vdev, bay3dbuf); } +int rkisp_params_init_bnr_buf(struct rkisp_isp_params_vdev *params_vdev, + struct rkisp_bnr_buf_info *bnrbuf) +{ + int ret = -EINVAL; + + if (params_vdev->ops->init_bnr_buf) + ret = params_vdev->ops->init_bnr_buf(params_vdev, bnrbuf); + return ret; +} + +void rkisp_params_aiisp_event(struct rkisp_isp_params_vdev *params_vdev, u32 irq) +{ + if (params_vdev->ops->aiisp_event) + params_vdev->ops->aiisp_event(params_vdev, irq); +} + +int rkisp_params_aiisp_start(struct rkisp_isp_params_vdev *params_vdev, + struct rkisp_aiisp_st *st) +{ + int ret = -EINVAL; + + if (params_vdev->ops->aiisp_start) + ret = params_vdev->ops->aiisp_start(params_vdev, st); + 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 94990abb4afe..403cecc23bee 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -20,10 +20,16 @@ #define ISP_PACK_2SHORT(a, b) \ (((a) & 0xFFFF) << 0 | ((b) & 0xFFFF) << 16) +/* RKISP_PARAMS_ALL: config all params + * RKISP_PARAMS_IMD: frame start to config params immediately + * RKISP_PARAMS_SHD: vs irq to config hdrmge and drc shadow reg + * RKISP_PARAMS_LAT: config bay3d latter params, using in aiisp case + */ enum rkisp_params_type { RKISP_PARAMS_ALL, RKISP_PARAMS_IMD, RKISP_PARAMS_SHD, + RKISP_PARAMS_LAT, }; struct rkisp_isp_params_vdev; @@ -46,6 +52,10 @@ struct rkisp_isp_params_ops { int (*info2ddr_cfg)(struct rkisp_isp_params_vdev *params_vdev, void *arg); void (*get_bay3d_buffd)(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_bay3dbuf_info *bay3dbuf); + int (*init_bnr_buf)(struct rkisp_isp_params_vdev *params_vdev, + struct rkisp_bnr_buf_info *bnrbuf); + void (*aiisp_event)(struct rkisp_isp_params_vdev *params_vdev, u32 irq); + int (*aiisp_start)(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_aiisp_st *st); }; /* @@ -60,6 +70,7 @@ struct rkisp_isp_params_vdev { spinlock_t config_lock; struct list_head params; + struct list_head params_be; union { struct rkisp1_isp_params_cfg *isp1x_params; struct isp2x_isp_params_cfg *isp2x_params; @@ -80,6 +91,7 @@ struct rkisp_isp_params_vdev { enum rkisp_fmt_raw_pat_type raw_type; u32 in_mbus_code; u32 cur_frame_id; + u32 cur_fe_frame_id; struct preisp_hdrae_para_s hdrae_para; struct rkisp_isp_params_ops *ops; @@ -146,7 +158,7 @@ void rkisp_unregister_params_vdev(struct rkisp_isp_params_vdev *params_vdev); void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis); -void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id); +void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id, enum rkisp_params_type type); void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev, bool is_check, bool is_reset); void rkisp_params_get_meshbuf_inf(struct rkisp_isp_params_vdev *params_vdev, void *meshbuf); @@ -157,4 +169,8 @@ 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); void rkisp_params_get_bay3d_buffd(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_bay3dbuf_info *bay3dbuf); +int rkisp_params_init_bnr_buf(struct rkisp_isp_params_vdev *params_vdev, + struct rkisp_bnr_buf_info *bnrbuf); +void rkisp_params_aiisp_event(struct rkisp_isp_params_vdev *params_vdev, u32 irq); +int rkisp_params_aiisp_start(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_aiisp_st *st); #endif /* _RKISP_ISP_PARAM_H */ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v1x.c b/drivers/media/platform/rockchip/isp/isp_params_v1x.c index 98972a15fe2d..af3f7e96a5ac 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v1x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v1x.c @@ -2163,9 +2163,10 @@ static void rkisp1_params_first_cfg_v1x(struct rkisp_isp_params_vdev *params_vde (struct rkisp_isp_params_v1x_ops *)params_vdev->priv_ops; struct cifisp_hst_config hst = hst_params_default_config; struct device *dev = params_vdev->dev->dev; + unsigned long flags = 0; int i; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); ops->awb_meas_config(params_vdev, &awb_params_default_config); ops->awb_meas_enable(params_vdev, &awb_params_default_config, true); @@ -2218,7 +2219,7 @@ static void rkisp1_params_first_cfg_v1x(struct rkisp_isp_params_vdev *params_vde __isp_isr_meas_config(params_vdev, params_vdev->isp1x_params); __preisp_isr_update_hdrae_para(params_vdev, params_vdev->isp1x_params); - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void rkisp1_save_first_param_v1x(struct rkisp_isp_params_vdev *params_vdev, void *param) @@ -2280,8 +2281,9 @@ static void rkisp1_params_isr_v1x(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_buffer *cur_buf = NULL; unsigned int cur_frame_id = atomic_read(¶ms_vdev->dev->isp_sdev.frm_sync_seq) - 1; + unsigned long flags = 0; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); if (!params_vdev->streamon) goto unlock; @@ -2313,7 +2315,7 @@ static void rkisp1_params_isr_v1x(struct rkisp_isp_params_vdev *params_vdev, vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); } unlock: - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index 805a6e0bc7bc..3c68632ca370 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -3991,11 +3991,11 @@ static void rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) { struct rkisp_device *dev = params_vdev->dev; - struct rkisp_isp_params_val_v21 *priv_val = - (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; + struct rkisp_isp_params_val_v21 *priv_val = params_vdev->priv_val; + unsigned long flags = 0; dev->is_bigmode = rkisp_params_check_bigmode_v21(params_vdev); - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); /* override the default things */ if (!params_vdev->isp21_params->module_cfg_update && !params_vdev->isp21_params->module_en_update) @@ -4014,7 +4014,7 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) rkisp_set_bits(params_vdev->dev, ISP_CTRL1, ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, false); - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void rkisp_save_first_param_v2x(struct rkisp_isp_params_vdev *params_vdev, void *param) @@ -4222,8 +4222,9 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, { struct isp21_isp_params_cfg *new_params = NULL; struct rkisp_buffer *cur_buf = params_vdev->cur_buf; + unsigned long flags = 0; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); if (!params_vdev->streamon) goto unlock; @@ -4276,7 +4277,7 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, unlock: params_vdev->cur_buf = cur_buf; - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index abe6516dee19..48738771f8cd 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -4076,10 +4076,10 @@ static void rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) { struct device *dev = params_vdev->dev->dev; - struct rkisp_isp_params_val_v2x *priv_val = - (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + struct rkisp_isp_params_val_v2x *priv_val = params_vdev->priv_val; + unsigned long flags = 0; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); /* override the default things */ if (!params_vdev->isp2x_params->module_cfg_update && !params_vdev->isp2x_params->module_en_update) @@ -4102,7 +4102,7 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) priv_val->cur_hdrmge = params_vdev->isp2x_params->others.hdrmge_cfg; priv_val->last_hdrtmo = priv_val->cur_hdrtmo; priv_val->last_hdrmge = priv_val->cur_hdrmge; - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void rkisp_save_first_param_v2x(struct rkisp_isp_params_vdev *params_vdev, void *param) @@ -4306,8 +4306,9 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_buffer *cur_buf = params_vdev->cur_buf; struct rkisp_device *dev = params_vdev->dev; struct rkisp_hw_dev *hw_dev = dev->hw_dev; + unsigned long flags = 0; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); if (!params_vdev->streamon) goto unlock; @@ -4365,7 +4366,7 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, params_vdev->exposure = new_params->exposure; unlock: params_vdev->cur_buf = cur_buf; - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_params_v32.c b/drivers/media/platform/rockchip/isp/isp_params_v32.c index 3dc134c30fac..1237ae27cfa4 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v32.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v32.c @@ -4940,10 +4940,11 @@ rkisp_params_first_cfg_v32(struct rkisp_isp_params_vdev *params_vdev) struct rkisp_device *dev = params_vdev->dev; struct rkisp_isp_params_val_v32 *priv_val = params_vdev->priv_val; struct isp32_isp_params_cfg *params = params_vdev->isp32_params; + unsigned long flags = 0; int i; rkisp_params_check_bigmode_v32(params_vdev); - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); /* override the default things */ if (!params->module_cfg_update && !params->module_en_update) dev_warn(dev->dev, "can not get first iq setting in stream on\n"); @@ -4963,7 +4964,7 @@ rkisp_params_first_cfg_v32(struct rkisp_isp_params_vdev *params_vdev) __isp_isr_other_en(params_vdev, params + i, RKISP_PARAMS_ALL, i); __isp_isr_meas_en(params_vdev, params + i, RKISP_PARAMS_ALL, i); } - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); if (dev->hw_dev->is_frm_buf && priv_val->buf_frm.mem_priv) { u32 size = priv_val->buf_frm.size; @@ -5410,9 +5411,10 @@ rkisp_params_cfg_v32(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_device *dev = params_vdev->dev; struct isp32_isp_params_cfg *new_params = NULL; struct rkisp_buffer *cur_buf = params_vdev->cur_buf; + unsigned long flags = 0; int i; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); if (!params_vdev->streamon) goto unlock; @@ -5476,7 +5478,7 @@ rkisp_params_cfg_v32(struct rkisp_isp_params_vdev *params_vdev, unlock: params_vdev->cur_buf = cur_buf; - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_params_v33.c b/drivers/media/platform/rockchip/isp/isp_params_v33.c index 8523bc03023d..2560fe4b3cf9 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v33.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v33.c @@ -3956,10 +3956,11 @@ rkisp_params_first_cfg_v33(struct rkisp_isp_params_vdev *params_vdev) { struct isp33_isp_params_cfg *params = params_vdev->isp33_params; struct rkisp_device *dev = params_vdev->dev; + unsigned long flags = 0; int i; rkisp_params_check_bigmode_v33(params_vdev); - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); for (i = 0; i < dev->unite_div; i++) { u64 module_cfg_update = params->module_cfg_update; u64 module_en_update = params->module_en_update; @@ -3975,7 +3976,7 @@ rkisp_params_first_cfg_v33(struct rkisp_isp_params_vdev *params_vdev) __isp_isr_other_en(params_vdev, params + i, RKISP_PARAMS_ALL, i); __isp_isr_meas_en(params_vdev, params + i, RKISP_PARAMS_ALL, i); } - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); if (dev->hw_dev->is_single && (dev->isp_state & ISP_START)) { rkisp_set_bits(dev, ISP3X_ISP_CTRL0, 0, CIF_ISP_CTRL_ISP_CFG_UPD, true); @@ -4378,9 +4379,10 @@ rkisp_params_cfg_v33(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_device *dev = params_vdev->dev; struct isp33_isp_params_cfg *new_params = NULL; struct rkisp_buffer *cur_buf = params_vdev->cur_buf; + unsigned long flags = 0; int i; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); if (!params_vdev->streamon) goto unlock; @@ -4443,7 +4445,7 @@ rkisp_params_cfg_v33(struct rkisp_isp_params_vdev *params_vdev, unlock: params_vdev->cur_buf = cur_buf; - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_params_v39.c b/drivers/media/platform/rockchip/isp/isp_params_v39.c index 53b4209f62e3..bb25d7cadfd7 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v39.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v39.c @@ -2,6 +2,7 @@ /* Copyright (c) 2023 Rockchip Electronics Co., Ltd. */ #include +#include #include #include #include /* for ISP params */ @@ -303,44 +304,50 @@ isp_dpcc_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) static void isp_bls_config(struct rkisp_isp_params_vdev *params_vdev, - const struct isp32_bls_cfg *arg, u32 id) + const struct isp32_bls_cfg *arg, + enum rkisp_params_type type, u32 id) { const struct isp2x_bls_fixed_val *pval; u32 new_control, value; + if (!params_vdev->dev->is_aiisp_en || + type == RKISP_PARAMS_LAT || type == RKISP_PARAMS_ALL) { + pval = &arg->bls1_val; + switch (params_vdev->raw_type) { + case RAW_BGGR: + isp3_param_write(params_vdev, pval->r, ISP3X_BLS1_D_FIXED, id); + isp3_param_write(params_vdev, pval->gr, ISP3X_BLS1_C_FIXED, id); + isp3_param_write(params_vdev, pval->gb, ISP3X_BLS1_B_FIXED, id); + isp3_param_write(params_vdev, pval->b, ISP3X_BLS1_A_FIXED, id); + break; + case RAW_GBRG: + isp3_param_write(params_vdev, pval->r, ISP3X_BLS1_C_FIXED, id); + isp3_param_write(params_vdev, pval->gr, ISP3X_BLS1_D_FIXED, id); + isp3_param_write(params_vdev, pval->gb, ISP3X_BLS1_A_FIXED, id); + isp3_param_write(params_vdev, pval->b, ISP3X_BLS1_B_FIXED, id); + break; + case RAW_GRBG: + isp3_param_write(params_vdev, pval->r, ISP3X_BLS1_B_FIXED, id); + isp3_param_write(params_vdev, pval->gr, ISP3X_BLS1_A_FIXED, id); + isp3_param_write(params_vdev, pval->gb, ISP3X_BLS1_D_FIXED, id); + isp3_param_write(params_vdev, pval->b, ISP3X_BLS1_C_FIXED, id); + break; + case RAW_RGGB: + default: + isp3_param_write(params_vdev, pval->r, ISP3X_BLS1_A_FIXED, id); + isp3_param_write(params_vdev, pval->gr, ISP3X_BLS1_B_FIXED, id); + isp3_param_write(params_vdev, pval->gb, ISP3X_BLS1_C_FIXED, id); + isp3_param_write(params_vdev, pval->b, ISP3X_BLS1_D_FIXED, id); + break; + } + if (type == RKISP_PARAMS_LAT) + return; + } + new_control = isp3_param_read(params_vdev, ISP3X_BLS_CTRL, id); new_control &= (ISP_BLS_ENA | ISP32_BLS_BLS2_EN); - - pval = &arg->bls1_val; if (arg->bls1_en) new_control |= ISP_BLS_BLS1_EN; - switch (params_vdev->raw_type) { - case RAW_BGGR: - isp3_param_write(params_vdev, pval->r, ISP3X_BLS1_D_FIXED, id); - isp3_param_write(params_vdev, pval->gr, ISP3X_BLS1_C_FIXED, id); - isp3_param_write(params_vdev, pval->gb, ISP3X_BLS1_B_FIXED, id); - isp3_param_write(params_vdev, pval->b, ISP3X_BLS1_A_FIXED, id); - break; - case RAW_GBRG: - isp3_param_write(params_vdev, pval->r, ISP3X_BLS1_C_FIXED, id); - isp3_param_write(params_vdev, pval->gr, ISP3X_BLS1_D_FIXED, id); - isp3_param_write(params_vdev, pval->gb, ISP3X_BLS1_A_FIXED, id); - isp3_param_write(params_vdev, pval->b, ISP3X_BLS1_B_FIXED, id); - break; - case RAW_GRBG: - isp3_param_write(params_vdev, pval->r, ISP3X_BLS1_B_FIXED, id); - isp3_param_write(params_vdev, pval->gr, ISP3X_BLS1_A_FIXED, id); - isp3_param_write(params_vdev, pval->gb, ISP3X_BLS1_D_FIXED, id); - isp3_param_write(params_vdev, pval->b, ISP3X_BLS1_C_FIXED, id); - break; - case RAW_RGGB: - default: - isp3_param_write(params_vdev, pval->r, ISP3X_BLS1_A_FIXED, id); - isp3_param_write(params_vdev, pval->gr, ISP3X_BLS1_B_FIXED, id); - isp3_param_write(params_vdev, pval->gb, ISP3X_BLS1_C_FIXED, id); - isp3_param_write(params_vdev, pval->b, ISP3X_BLS1_D_FIXED, id); - break; - } /* fixed subtraction values */ pval = &arg->fixed_val; @@ -733,7 +740,8 @@ isp_debayer_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) static void isp_awbgain_config(struct rkisp_isp_params_vdev *params_vdev, - const struct isp32_awb_gain_cfg *arg, u32 id) + const struct isp32_awb_gain_cfg *arg, + enum rkisp_params_type type, u32 id) { struct rkisp_device *dev = params_vdev->dev; @@ -747,6 +755,18 @@ isp_awbgain_config(struct rkisp_isp_params_vdev *params_vdev, return; } + if (!dev->is_aiisp_en || dev->is_aiisp_sync || + type == RKISP_PARAMS_ALL || type == RKISP_PARAMS_LAT) { + isp3_param_write(params_vdev, + ISP_PACK_2SHORT(arg->awb1_gain_gb, arg->awb1_gain_gr), + ISP32_ISP_AWB1_GAIN_G, id); + isp3_param_write(params_vdev, + ISP_PACK_2SHORT(arg->awb1_gain_b, arg->awb1_gain_r), + ISP32_ISP_AWB1_GAIN_RB, id); + if (type == RKISP_PARAMS_LAT) + return; + } + isp3_param_write(params_vdev, ISP_PACK_2SHORT(arg->gain0_green_b, arg->gain0_green_r), ISP3X_ISP_AWB_GAIN0_G, id); @@ -767,13 +787,6 @@ isp_awbgain_config(struct rkisp_isp_params_vdev *params_vdev, isp3_param_write(params_vdev, ISP_PACK_2SHORT(arg->gain2_blue, arg->gain2_red), ISP3X_ISP_AWB_GAIN2_RB, id); - - isp3_param_write(params_vdev, - ISP_PACK_2SHORT(arg->awb1_gain_gb, arg->awb1_gain_gr), - ISP32_ISP_AWB1_GAIN_G, id); - isp3_param_write(params_vdev, - ISP_PACK_2SHORT(arg->awb1_gain_b, arg->awb1_gain_r), - ISP32_ISP_AWB1_GAIN_RB, id); } static void @@ -3363,25 +3376,29 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) return; if (en) { - if (!priv_val->buf_3dnr_iir.mem_priv) { + if (!priv_val->buf_bay3d_iir[0].mem_priv) { dev_err(ispdev->dev, "no bay3d buffer available\n"); return; } + priv_val->bay3d_iir_idx = 0; + priv_val->bay3d_iir_cur_idx = 0; value = priv_val->bay3d_iir_size; isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_WR_SIZE, id); - value = priv_val->buf_3dnr_iir.dma_addr + value * id; + value = priv_val->buf_bay3d_iir[0].dma_addr + value * id; isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_WR_BASE, id); isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_RD_BASE, id); - if (priv_val->buf_aiisp.mem_priv) { - value = priv_val->buf_aiisp.dma_addr + value * id; + if (priv_val->buf_aiisp[0].mem_priv) { + priv_val->aiisp_cur_idx = 0; + value = priv_val->buf_aiisp[0].dma_addr + value * id; isp3_param_write(params_vdev, value, ISP39_AIISP_RD_BASE, id); } - if (priv_val->buf_gain.mem_priv) { + if (priv_val->buf_gain[0].mem_priv) { + priv_val->gain_cur_idx = 0; value = priv_val->gain_size; isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_SIZE, id); isp3_param_write(params_vdev, value, ISP32_MI_RAW0_RD_SIZE, id); - value = priv_val->buf_gain.dma_addr + value * id; + value = priv_val->buf_gain[0].dma_addr + value * id; isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_BASE, id); isp3_param_write(params_vdev, value, ISP3X_MI_RAW0_RD_BASE, id); } @@ -3391,7 +3408,7 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) value = ISP3X_BAY3D_IIR_WR_AUTO_UPD | ISP3X_BAY3D_IIRSELF_UPD | ISP3X_BAY3D_RDSELF_UPD; - if (priv_val->buf_gain.mem_priv) + if (priv_val->buf_gain[0].mem_priv) value |= ISP3X_GAIN_WR_AUTO_UPD | ISP3X_GAINSELF_UPD; isp3_param_set_bits(params_vdev, MI_WR_CTRL2, value, id); @@ -3640,14 +3657,14 @@ isp_yuvme_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) dev_err(ispdev->dev, "yuvme need bay3d enable together\n"); return; } - if (!priv_val->buf_3dnr_cur.mem_priv) { + if (!priv_val->buf_bay3d_cur.mem_priv) { dev_err(ispdev->dev, "no yuvme cur buffer available\n"); return; } value = priv_val->bay3d_cur_size; isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_CUR_WR_SIZE, id); isp3_param_write(params_vdev, value, ISP32_MI_BAY3D_CUR_RD_SIZE, id); - value = priv_val->buf_3dnr_cur.dma_addr + value * id; + value = priv_val->buf_bay3d_cur.dma_addr + value * id; isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_CUR_WR_BASE, id); isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_CUR_RD_BASE, id); @@ -3791,171 +3808,75 @@ isp_rgbir_enable(struct rkisp_isp_params_vdev *params_vdev, bool en, u32 id) isp3_param_write(params_vdev, value, ISP39_RGBIR_CTRL, id); } -struct rkisp_isp_params_ops_v39 isp_params_ops_v39 = { - .dpcc_config = isp_dpcc_config, - .dpcc_enable = isp_dpcc_enable, - .bls_config = isp_bls_config, - .bls_enable = isp_bls_enable, - .sdg_config = isp_sdg_config, - .sdg_enable = isp_sdg_enable, - .lsc_config = isp_lsc_config, - .lsc_enable = isp_lsc_enable, - .awbgain_config = isp_awbgain_config, - .awbgain_enable = isp_awbgain_enable, - .debayer_config = isp_debayer_config, - .debayer_enable = isp_debayer_enable, - .ccm_config = isp_ccm_config, - .ccm_enable = isp_ccm_enable, - .goc_config = isp_goc_config, - .goc_enable = isp_goc_enable, - .csm_config = isp_csm_config, - .cproc_config = isp_cproc_config, - .cproc_enable = isp_cproc_enable, - .rawaf_config = isp_rawaf_config, - .rawaf_enable = isp_rawaf_enable, - .rawae0_config = isp_rawae0_config, - .rawae0_enable = isp_rawae0_enable, - .rawae3_config = isp_rawae3_config, - .rawae3_enable = isp_rawae3_enable, - .rawawb_config = isp_rawawb_config, - .rawawb_enable = isp_rawawb_enable, - .rawhst0_config = isp_rawhst0_config, - .rawhst0_enable = isp_rawhst0_enable, - .rawhst3_config = isp_rawhst3_config, - .rawhst3_enable = isp_rawhst3_enable, - .hdrmge_config = isp_hdrmge_config, - .hdrmge_enable = isp_hdrmge_enable, - .hdrdrc_config = isp_hdrdrc_config, - .hdrdrc_enable = isp_hdrdrc_enable, - .gic_config = isp_gic_config, - .gic_enable = isp_gic_enable, - .dhaz_config = isp_dhaz_config, - .dhaz_enable = isp_dhaz_enable, - .isp3dlut_config = isp_3dlut_config, - .isp3dlut_enable = isp_3dlut_enable, - .ldch_config = isp_ldch_config, - .ldch_enable = isp_ldch_enable, - .ynr_config = isp_ynr_config, - .ynr_enable = isp_ynr_enable, - .cnr_config = isp_cnr_config, - .cnr_enable = isp_cnr_enable, - .sharp_config = isp_sharp_config, - .sharp_enable = isp_sharp_enable, - .bay3d_config = isp_bay3d_config, - .bay3d_enable = isp_bay3d_enable, - .gain_config = isp_gain_config, - .gain_enable = isp_gain_enable, - .cac_config = isp_cac_config, - .cac_enable = isp_cac_enable, - .cgc_config = isp_cgc_config, - .ie_enable = isp_ie_enable, - .yuvme_config = isp_yuvme_config, - .yuvme_enable = isp_yuvme_enable, - .ldcv_config = isp_ldcv_config, - .ldcv_enable = isp_ldcv_enable, - .rgbir_config = isp_rgbir_config, - .rgbir_enable = isp_rgbir_enable, -}; - static __maybe_unused void __isp_isr_other_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp39_isp_params_cfg *new_params, enum rkisp_params_type type, u32 id) { - struct rkisp_isp_params_ops_v39 *ops = params_vdev->priv_ops; + struct rkisp_device *dev = params_vdev->dev; u64 module_cfg_update = new_params->module_cfg_update; - if (type == RKISP_PARAMS_SHD) { - if ((module_cfg_update & ISP39_MODULE_HDRMGE)) - ops->hdrmge_config(params_vdev, &new_params->others.hdrmge_cfg, type, id); - - if ((module_cfg_update & ISP39_MODULE_DRC)) - ops->hdrdrc_config(params_vdev, &new_params->others.drc_cfg, type, id); - return; - } - - v4l2_dbg(4, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, - "%s id:%d seq:%d module_cfg_update:0x%llx\n", - __func__, id, new_params->frame_id, module_cfg_update); - - if (module_cfg_update & ISP39_MODULE_LSC) - ops->lsc_config(params_vdev, &new_params->others.lsc_cfg, id); - - if (module_cfg_update & ISP39_MODULE_DPCC) - ops->dpcc_config(params_vdev, &new_params->others.dpcc_cfg, id); + v4l2_dbg(4, rkisp_debug, &dev->v4l2_dev, + "%s id:%d seq:%d type:%d module_cfg_update:0x%llx\n", + __func__, id, new_params->frame_id, type, module_cfg_update); + if (module_cfg_update & ISP39_MODULE_RGBIR && type != RKISP_PARAMS_LAT) + isp_rgbir_config(params_vdev, &new_params->others.rgbir_cfg, id); + if (module_cfg_update & ISP39_MODULE_SDG && type != RKISP_PARAMS_LAT) + isp_sdg_config(params_vdev, &new_params->others.sdg_cfg, id); if (module_cfg_update & ISP39_MODULE_BLS) - ops->bls_config(params_vdev, &new_params->others.bls_cfg, id); - - if (module_cfg_update & ISP39_MODULE_SDG) - ops->sdg_config(params_vdev, &new_params->others.sdg_cfg, id); - + isp_bls_config(params_vdev, &new_params->others.bls_cfg, type, id); if (module_cfg_update & ISP39_MODULE_AWB_GAIN) - ops->awbgain_config(params_vdev, &new_params->others.awb_gain_cfg, id); + isp_awbgain_config(params_vdev, &new_params->others.awb_gain_cfg, type, id); + if (module_cfg_update & ISP39_MODULE_DPCC && type != RKISP_PARAMS_LAT) + isp_dpcc_config(params_vdev, &new_params->others.dpcc_cfg, id); + if (module_cfg_update & ISP39_MODULE_HDRMGE && type != RKISP_PARAMS_LAT) + isp_hdrmge_config(params_vdev, &new_params->others.hdrmge_cfg, type, id); + if (module_cfg_update & ISP39_MODULE_GAIN && type != RKISP_PARAMS_LAT) + isp_gain_config(params_vdev, &new_params->others.gain_cfg, id); + if (module_cfg_update & ISP39_MODULE_BAY3D && type != RKISP_PARAMS_LAT) + isp_bay3d_config(params_vdev, &new_params->others.bay3d_cfg, id); - if (module_cfg_update & ISP39_MODULE_DEBAYER) - ops->debayer_config(params_vdev, &new_params->others.debayer_cfg, id); - - if (module_cfg_update & ISP39_MODULE_CCM) - ops->ccm_config(params_vdev, &new_params->others.ccm_cfg, id); - - if (module_cfg_update & ISP39_MODULE_GOC) - ops->goc_config(params_vdev, &new_params->others.gammaout_cfg, id); - - /* range csm->cgc->cproc->ie */ - if (module_cfg_update & ISP39_MODULE_CSM) - ops->csm_config(params_vdev, &new_params->others.csm_cfg, id); - - if (module_cfg_update & ISP39_MODULE_CGC) - ops->cgc_config(params_vdev, &new_params->others.cgc_cfg, id); - - if (module_cfg_update & ISP39_MODULE_CPROC) - ops->cproc_config(params_vdev, &new_params->others.cproc_cfg, id); - - if (module_cfg_update & ISP39_MODULE_HDRMGE) - ops->hdrmge_config(params_vdev, &new_params->others.hdrmge_cfg, type, id); - - if (module_cfg_update & ISP39_MODULE_DRC) - ops->hdrdrc_config(params_vdev, &new_params->others.drc_cfg, type, id); - - if (module_cfg_update & ISP39_MODULE_GIC) - ops->gic_config(params_vdev, &new_params->others.gic_cfg, id); - - if (module_cfg_update & ISP39_MODULE_DHAZ) - ops->dhaz_config(params_vdev, &new_params->others.dhaz_cfg, id); - - if (module_cfg_update & ISP39_MODULE_3DLUT) - ops->isp3dlut_config(params_vdev, &new_params->others.isp3dlut_cfg, id); - - if (module_cfg_update & ISP39_MODULE_LDCH) - ops->ldch_config(params_vdev, &new_params->others.ldch_cfg, id); - - if (module_cfg_update & ISP39_MODULE_LDCV) - ops->ldcv_config(params_vdev, &new_params->others.ldcv_cfg, id); - - if (module_cfg_update & ISP39_MODULE_YNR) - ops->ynr_config(params_vdev, &new_params->others.ynr_cfg, id); - - if (module_cfg_update & ISP39_MODULE_CNR) - ops->cnr_config(params_vdev, &new_params->others.cnr_cfg, id); - - if (module_cfg_update & ISP39_MODULE_SHARP) - ops->sharp_config(params_vdev, &new_params->others.sharp_cfg, id); - - if (module_cfg_update & ISP39_MODULE_BAY3D) - ops->bay3d_config(params_vdev, &new_params->others.bay3d_cfg, id); - - if (module_cfg_update & ISP39_MODULE_YUVME) - ops->yuvme_config(params_vdev, &new_params->others.yuvme_cfg, id); - - if (module_cfg_update & ISP39_MODULE_RGBIR) - ops->rgbir_config(params_vdev, &new_params->others.rgbir_cfg, id); + if (type == RKISP_PARAMS_IMD && dev->is_aiisp_en && !dev->is_aiisp_sync) + return; if (module_cfg_update & ISP39_MODULE_CAC) - ops->cac_config(params_vdev, &new_params->others.cac_cfg, id); - - if (module_cfg_update & ISP39_MODULE_GAIN) - ops->gain_config(params_vdev, &new_params->others.gain_cfg, id); + isp_cac_config(params_vdev, &new_params->others.cac_cfg, id); + if (module_cfg_update & ISP39_MODULE_LSC) + isp_lsc_config(params_vdev, &new_params->others.lsc_cfg, id); + if (module_cfg_update & ISP39_MODULE_DEBAYER) + isp_debayer_config(params_vdev, &new_params->others.debayer_cfg, id); + if (module_cfg_update & ISP39_MODULE_DRC) + isp_hdrdrc_config(params_vdev, &new_params->others.drc_cfg, type, id); + if (module_cfg_update & ISP39_MODULE_CCM) + isp_ccm_config(params_vdev, &new_params->others.ccm_cfg, id); + if (module_cfg_update & ISP39_MODULE_GOC) + isp_goc_config(params_vdev, &new_params->others.gammaout_cfg, id); + if (module_cfg_update & ISP39_MODULE_3DLUT) + isp_3dlut_config(params_vdev, &new_params->others.isp3dlut_cfg, id); + /* range csm->cgc->cproc->ie */ + if (module_cfg_update & ISP39_MODULE_CSM) + isp_csm_config(params_vdev, &new_params->others.csm_cfg, id); + if (module_cfg_update & ISP39_MODULE_CGC) + isp_cgc_config(params_vdev, &new_params->others.cgc_cfg, id); + if (module_cfg_update & ISP39_MODULE_CPROC) + isp_cproc_config(params_vdev, &new_params->others.cproc_cfg, id); + if (module_cfg_update & ISP39_MODULE_GIC) + isp_gic_config(params_vdev, &new_params->others.gic_cfg, id); + if (module_cfg_update & ISP39_MODULE_DHAZ) + isp_dhaz_config(params_vdev, &new_params->others.dhaz_cfg, id); + if (module_cfg_update & ISP39_MODULE_LDCH) + isp_ldch_config(params_vdev, &new_params->others.ldch_cfg, id); + if (module_cfg_update & ISP39_MODULE_LDCV) + isp_ldcv_config(params_vdev, &new_params->others.ldcv_cfg, id); + if (module_cfg_update & ISP39_MODULE_YNR) + isp_ynr_config(params_vdev, &new_params->others.ynr_cfg, id); + if (module_cfg_update & ISP39_MODULE_CNR) + isp_cnr_config(params_vdev, &new_params->others.cnr_cfg, id); + if (module_cfg_update & ISP39_MODULE_SHARP) + isp_sharp_config(params_vdev, &new_params->others.sharp_cfg, id); + if (module_cfg_update & ISP39_MODULE_YUVME) + isp_yuvme_config(params_vdev, &new_params->others.yuvme_cfg, id); } static __maybe_unused @@ -3963,16 +3884,12 @@ void __isp_isr_other_en(struct rkisp_isp_params_vdev *params_vdev, const struct isp39_isp_params_cfg *new_params, enum rkisp_params_type type, u32 id) { - struct rkisp_isp_params_ops_v39 *ops = params_vdev->priv_ops; struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val; u64 module_en_update = new_params->module_en_update; u64 module_ens = new_params->module_ens; u64 mask; u32 gain_ctrl, cnr_ctrl, val; - if (type == RKISP_PARAMS_SHD) - return; - mask = ISP39_MODULE_YNR | ISP39_MODULE_CNR | ISP39_MODULE_SHARP; if ((module_ens & mask) && ((module_ens & mask) != mask)) dev_err(params_vdev->dev->dev, "ynr cnr sharp no enable together\n"); @@ -3981,81 +3898,81 @@ void __isp_isr_other_en(struct rkisp_isp_params_vdev *params_vdev, __func__, id, new_params->frame_id, module_en_update, module_ens); if (module_en_update & ISP39_MODULE_DPCC) - ops->dpcc_enable(params_vdev, !!(module_ens & ISP39_MODULE_DPCC), id); + isp_dpcc_enable(params_vdev, !!(module_ens & ISP39_MODULE_DPCC), id); if (module_en_update & ISP39_MODULE_BLS) - ops->bls_enable(params_vdev, !!(module_ens & ISP39_MODULE_BLS), id); + isp_bls_enable(params_vdev, !!(module_ens & ISP39_MODULE_BLS), id); if (module_en_update & ISP39_MODULE_SDG) - ops->sdg_enable(params_vdev, !!(module_ens & ISP39_MODULE_SDG), id); + isp_sdg_enable(params_vdev, !!(module_ens & ISP39_MODULE_SDG), id); if (module_en_update & ISP39_MODULE_LSC) - ops->lsc_enable(params_vdev, !!(module_ens & ISP39_MODULE_LSC), id); + isp_lsc_enable(params_vdev, !!(module_ens & ISP39_MODULE_LSC), id); if (module_en_update & ISP39_MODULE_AWB_GAIN) - ops->awbgain_enable(params_vdev, !!(module_ens & ISP39_MODULE_AWB_GAIN), id); + isp_awbgain_enable(params_vdev, !!(module_ens & ISP39_MODULE_AWB_GAIN), id); if (module_en_update & ISP39_MODULE_DEBAYER) - ops->debayer_enable(params_vdev, !!(module_ens & ISP39_MODULE_DEBAYER), id); + isp_debayer_enable(params_vdev, !!(module_ens & ISP39_MODULE_DEBAYER), id); if (module_en_update & ISP39_MODULE_CCM) - ops->ccm_enable(params_vdev, !!(module_ens & ISP39_MODULE_CCM), id); + isp_ccm_enable(params_vdev, !!(module_ens & ISP39_MODULE_CCM), id); if (module_en_update & ISP39_MODULE_GOC) - ops->goc_enable(params_vdev, !!(module_ens & ISP39_MODULE_GOC), id); + isp_goc_enable(params_vdev, !!(module_ens & ISP39_MODULE_GOC), id); if (module_en_update & ISP39_MODULE_CPROC) - ops->cproc_enable(params_vdev, !!(module_ens & ISP39_MODULE_CPROC), id); + isp_cproc_enable(params_vdev, !!(module_ens & ISP39_MODULE_CPROC), id); if (module_en_update & ISP39_MODULE_IE) - ops->ie_enable(params_vdev, !!(module_ens & ISP39_MODULE_IE), id); + isp_ie_enable(params_vdev, !!(module_ens & ISP39_MODULE_IE), id); if (module_en_update & ISP39_MODULE_HDRMGE) - ops->hdrmge_enable(params_vdev, !!(module_ens & ISP39_MODULE_HDRMGE), id); + isp_hdrmge_enable(params_vdev, !!(module_ens & ISP39_MODULE_HDRMGE), id); if (module_en_update & ISP39_MODULE_DRC) - ops->hdrdrc_enable(params_vdev, !!(module_ens & ISP39_MODULE_DRC), id); + isp_hdrdrc_enable(params_vdev, !!(module_ens & ISP39_MODULE_DRC), id); if (module_en_update & ISP39_MODULE_GIC) - ops->gic_enable(params_vdev, !!(module_ens & ISP39_MODULE_GIC), id); + isp_gic_enable(params_vdev, !!(module_ens & ISP39_MODULE_GIC), id); if (module_en_update & ISP39_MODULE_DHAZ) - ops->dhaz_enable(params_vdev, !!(module_ens & ISP39_MODULE_DHAZ), id); + isp_dhaz_enable(params_vdev, !!(module_ens & ISP39_MODULE_DHAZ), id); if (module_en_update & ISP39_MODULE_3DLUT) - ops->isp3dlut_enable(params_vdev, !!(module_ens & ISP39_MODULE_3DLUT), id); + isp_3dlut_enable(params_vdev, !!(module_ens & ISP39_MODULE_3DLUT), id); if (module_en_update & ISP39_MODULE_LDCH) - ops->ldch_enable(params_vdev, !!(module_ens & ISP39_MODULE_LDCH), id); + isp_ldch_enable(params_vdev, !!(module_ens & ISP39_MODULE_LDCH), id); if (module_en_update & ISP39_MODULE_LDCV) - ops->ldcv_enable(params_vdev, !!(module_ens & ISP39_MODULE_LDCV), id); + isp_ldcv_enable(params_vdev, !!(module_ens & ISP39_MODULE_LDCV), id); if (module_en_update & ISP39_MODULE_YNR) - ops->ynr_enable(params_vdev, !!(module_ens & ISP39_MODULE_YNR), id); + isp_ynr_enable(params_vdev, !!(module_ens & ISP39_MODULE_YNR), id); if (module_en_update & ISP39_MODULE_CNR) - ops->cnr_enable(params_vdev, !!(module_ens & ISP39_MODULE_CNR), id); + isp_cnr_enable(params_vdev, !!(module_ens & ISP39_MODULE_CNR), id); if (module_en_update & ISP39_MODULE_SHARP) - ops->sharp_enable(params_vdev, !!(module_ens & ISP39_MODULE_SHARP), id); + isp_sharp_enable(params_vdev, !!(module_ens & ISP39_MODULE_SHARP), id); if (module_en_update & ISP39_MODULE_BAY3D) - ops->bay3d_enable(params_vdev, !!(module_ens & ISP39_MODULE_BAY3D), id); + isp_bay3d_enable(params_vdev, !!(module_ens & ISP39_MODULE_BAY3D), id); if (module_en_update & ISP39_MODULE_YUVME) - ops->yuvme_enable(params_vdev, !!(module_ens & ISP39_MODULE_YUVME), id); + isp_yuvme_enable(params_vdev, !!(module_ens & ISP39_MODULE_YUVME), id); if (module_en_update & ISP39_MODULE_RGBIR) - ops->rgbir_enable(params_vdev, !!(module_ens & ISP39_MODULE_RGBIR), id); + isp_rgbir_enable(params_vdev, !!(module_ens & ISP39_MODULE_RGBIR), id); if (module_en_update & ISP39_MODULE_CAC) - ops->cac_enable(params_vdev, !!(module_ens & ISP39_MODULE_CAC), id); + isp_cac_enable(params_vdev, !!(module_ens & ISP39_MODULE_CAC), id); if (module_en_update & ISP39_MODULE_GAIN || ((priv_val->buf_info_owner == RKISP_INFO2DRR_OWNER_GAIN) && !(isp3_param_read(params_vdev, ISP3X_GAIN_CTRL, id) & ISP3X_GAIN_2DDR_EN))) - ops->gain_enable(params_vdev, !!(module_ens & ISP39_MODULE_GAIN), id); + isp_gain_enable(params_vdev, !!(module_ens & ISP39_MODULE_GAIN), id); /* gain disable, using global gain for cnr */ gain_ctrl = isp3_param_read_cache(params_vdev, ISP3X_GAIN_CTRL, id); @@ -4073,35 +3990,33 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev, struct isp39_isp_params_cfg *new_params, enum rkisp_params_type type, u32 id) { - struct rkisp_isp_params_ops_v39 *ops = params_vdev->priv_ops; + struct rkisp_device *dev = params_vdev->dev; u64 module_cfg_update = new_params->module_cfg_update; - if (type == RKISP_PARAMS_SHD) - return; + v4l2_dbg(4, rkisp_debug, &dev->v4l2_dev, + "%s id:%d seq:%d type:%d module_cfg_update:0x%llx\n", + __func__, id, new_params->frame_id, type, module_cfg_update); + if (!dev->is_aiisp_en || dev->is_aiisp_sync || type != RKISP_PARAMS_LAT) { + if (module_cfg_update & ISP39_MODULE_RAWAE0) + isp_rawae0_config(params_vdev, &new_params->meas.rawae0, id); + if (module_cfg_update & ISP39_MODULE_RAWHIST0) + isp_rawhst0_config(params_vdev, &new_params->meas.rawhist0, id); + if ((module_cfg_update & ISP39_MODULE_RAWAF)) + isp_rawaf_config(params_vdev, &new_params->meas.rawaf, id); + if (dev->is_aiisp_en && !dev->is_aiisp_sync && type == RKISP_PARAMS_IMD) { + params_vdev->cur_fe_frame_id = new_params->frame_id; + return; + } + } params_vdev->cur_frame_id = new_params->frame_id; params_vdev->exposure = new_params->exposure; - v4l2_dbg(4, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, - "%s id:%d seq:%d module_cfg_update:0x%llx\n", - __func__, id, new_params->frame_id, module_cfg_update); - - if ((module_cfg_update & ISP39_MODULE_RAWAF)) - ops->rawaf_config(params_vdev, &new_params->meas.rawaf, id); - - if (module_cfg_update & ISP39_MODULE_RAWAE0) - ops->rawae0_config(params_vdev, &new_params->meas.rawae0, id); - if (module_cfg_update & ISP39_MODULE_RAWAE3) - ops->rawae3_config(params_vdev, &new_params->meas.rawae3, id); - - if (module_cfg_update & ISP39_MODULE_RAWHIST0) - ops->rawhst0_config(params_vdev, &new_params->meas.rawhist0, id); - + isp_rawae3_config(params_vdev, &new_params->meas.rawae3, id); if (module_cfg_update & ISP39_MODULE_RAWHIST3) - ops->rawhst3_config(params_vdev, &new_params->meas.rawhist3, id); - + isp_rawhst3_config(params_vdev, &new_params->meas.rawhist3, id); if (module_cfg_update & ISP39_MODULE_RAWAWB) - ops->rawawb_config(params_vdev, &new_params->meas.rawawb, id); + isp_rawawb_config(params_vdev, &new_params->meas.rawawb, id); } static __maybe_unused @@ -4109,34 +4024,30 @@ void __isp_isr_meas_en(struct rkisp_isp_params_vdev *params_vdev, struct isp39_isp_params_cfg *new_params, enum rkisp_params_type type, u32 id) { - struct rkisp_isp_params_ops_v39 *ops = params_vdev->priv_ops; u64 module_en_update = new_params->module_en_update; u64 module_ens = new_params->module_ens; - if (type == RKISP_PARAMS_SHD) - return; - v4l2_dbg(4, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, "%s id:%d seq:%d module_en_update:0x%llx module_ens:0x%llx\n", __func__, id, new_params->frame_id, module_en_update, module_ens); if (module_en_update & ISP39_MODULE_RAWAF) - ops->rawaf_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWAF), id); + isp_rawaf_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWAF), id); if (module_en_update & ISP39_MODULE_RAWAE0) - ops->rawae0_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWAE0), id); + isp_rawae0_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWAE0), id); if (module_en_update & ISP39_MODULE_RAWAE3) - ops->rawae3_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWAE3), id); + isp_rawae3_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWAE3), id); if (module_en_update & ISP39_MODULE_RAWHIST0) - ops->rawhst0_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWHIST0), id); + isp_rawhst0_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWHIST0), id); if (module_en_update & ISP39_MODULE_RAWHIST3) - ops->rawhst3_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWHIST3), id); + isp_rawhst3_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWHIST3), id); if (module_en_update & ISP39_MODULE_RAWAWB) - ops->rawawb_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWAWB), id); + isp_rawawb_enable(params_vdev, !!(module_ens & ISP39_MODULE_RAWAWB), id); } static @@ -4163,16 +4074,10 @@ static int rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, const struct isp39_isp_params_cfg *new_params) { + struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val; struct rkisp_device *dev = params_vdev->dev; - struct rkisp_isp_subdev *isp_sdev = &dev->isp_sdev; - struct rkisp_isp_params_val_v39 *priv_val; - u64 module_en_update, module_ens; int ret, i, id; - priv_val = (struct rkisp_isp_params_val_v39 *)params_vdev->priv_val; - module_en_update = new_params->module_en_update; - module_ens = new_params->module_ens; - for (id = 0; id < dev->unite_div; id++) { priv_val->buf_3dlut_idx[id] = 0; for (i = 0; i < ISP39_3DLUT_BUF_NUM; i++) { @@ -4187,108 +4092,6 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev, } } } - if ((module_en_update & ISP39_MODULE_BAY3D) && (module_ens & ISP39_MODULE_BAY3D)) { - bool iirsparse_en = !!new_params->others.bay3d_cfg.iirsparse_en; - u32 w = ALIGN(isp_sdev->in_crop.width, 16); - u32 h = isp_sdev->in_crop.height, val; - bool is_alloc; - - if (dev->unite_div > ISP_UNITE_DIV1) - w = ALIGN(isp_sdev->in_crop.width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL, 16); - if (dev->unite_div == ISP_UNITE_DIV4) - h = ALIGN(isp_sdev->in_crop.height / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL, 16); - - if (!iirsparse_en) { - w = w * 3 / 2 + w / 4; - h /= 2; - } - val = ALIGN(w * h * 2, 16); - priv_val->bay3d_iir_size = val; - if (dev->unite_div > ISP_UNITE_DIV1) - val *= dev->unite_div; - is_alloc = true; - if (priv_val->buf_3dnr_iir.mem_priv) { - if (val > priv_val->buf_3dnr_iir.size) - rkisp_free_buffer(dev, &priv_val->buf_3dnr_iir); - else - is_alloc = false; - } - if (is_alloc) { - priv_val->buf_3dnr_iir.size = val; - 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_iir; - } - } - - is_alloc = dev->is_aiisp_en ? true : false; - if (priv_val->buf_aiisp.mem_priv) { - if (val > priv_val->buf_aiisp.size) - rkisp_free_buffer(dev, &priv_val->buf_aiisp); - else - is_alloc = false; - } - if (is_alloc) { - priv_val->buf_aiisp.size = val; - ret = rkisp_alloc_buffer(dev, &priv_val->buf_aiisp); - if (ret) { - dev_err(dev->dev, "alloc aiisp buf fail:%d\n", ret); - goto free_3dnr_iir; - } - } - - val = ALIGN(w * h / 4, 16); - priv_val->gain_size = val; - if (dev->unite_div > ISP_UNITE_DIV1) - val *= dev->unite_div; - is_alloc = dev->is_aiisp_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_aiisp; - } - } - } - - if ((module_en_update & ISP39_MODULE_YUVME) && (module_ens & ISP39_MODULE_YUVME)) { - u32 w = isp_sdev->in_crop.width; - u32 h = isp_sdev->in_crop.height; - u32 size; - bool is_alloc = true; - - if (dev->unite_div > ISP_UNITE_DIV1) - w = w / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; - if (dev->unite_div == ISP_UNITE_DIV4) - h = h / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; - size = (w / 2 * 80 + (w + 7) / 8 * 9 + 31) / 32 * ((h + 7) / 8) * 4; - priv_val->bay3d_cur_size = size; - if (dev->unite_div > ISP_UNITE_DIV1) - size *= dev->unite_div; - if (priv_val->buf_3dnr_cur.mem_priv) { - if (size > priv_val->buf_3dnr_cur.size) - rkisp_free_buffer(dev, &priv_val->buf_3dnr_cur); - else - is_alloc = false; - } - if (is_alloc) { - priv_val->buf_3dnr_cur.size = size; - 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_gain; - } - } - - } if (dev->hw_dev->is_frm_buf && !priv_val->buf_frm.mem_priv) { priv_val->buf_frm.size = ISP39_FRM_BUF_SIZE; @@ -4297,7 +4100,7 @@ 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_cur; + goto err_frm_buf; } } @@ -4317,15 +4120,7 @@ err_lsc: rkisp_free_buffer(dev, &priv_val->buf_frm); for (i -= 1; i >= 0; i--) rkisp_free_buffer(dev, &priv_val->buf_lsclut[i]); -free_3dnr_cur: - rkisp_free_buffer(dev, &priv_val->buf_3dnr_cur); -free_gain: - rkisp_free_buffer(dev, &priv_val->buf_gain); -free_aiisp: - rkisp_free_buffer(dev, &priv_val->buf_aiisp); -free_3dnr_iir: - rkisp_free_buffer(dev, &priv_val->buf_3dnr_iir); -err_3dnr_iir: +err_frm_buf: id = dev->unite_div - 1; i = ISP39_3DLUT_BUF_NUM; err_3dlut: @@ -4502,10 +4297,11 @@ rkisp_params_first_cfg_v39(struct rkisp_isp_params_vdev *params_vdev) struct rkisp_stream *stream = &dev->cap_dev.stream[RKISP_STREAM_LDC]; struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val; struct isp39_isp_params_cfg *params = params_vdev->isp39_params; + unsigned long flags = 0; int i; rkisp_params_check_bigmode_v39(params_vdev); - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); if (dev->is_bigmode) rkisp_unite_set_bits(dev, ISP3X_ISP_CTRL1, 0, ISP3X_BIGMODE_MANUAL | ISP3X_BIGMODE_FORCE_EN, false); @@ -4534,7 +4330,7 @@ rkisp_params_first_cfg_v39(struct rkisp_isp_params_vdev *params_vdev) __isp_isr_meas_en(params_vdev, params, RKISP_PARAMS_ALL, i); params++; } - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); if (dev->hw_dev->is_frm_buf && priv_val->buf_frm.mem_priv) { u32 size = priv_val->buf_frm.size; @@ -4868,30 +4664,135 @@ err: return -ENOMEM; } -static void -rkisp_params_get_bay3d_buffd_v39(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_bay3dbuf_info *bay3dbuf) +static int +rkisp_params_init_bnr_buf_v39(struct rkisp_isp_params_vdev *params_vdev, + struct rkisp_bnr_buf_info *bnrbuf) { struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val; + struct rkisp_device *dev = params_vdev->dev; + struct rkisp_isp_subdev *isp_sdev = &dev->isp_sdev; struct rkisp_dummy_buffer *buf; + bool iirsparse_en = !!bnrbuf->u.v39.iirsparse_en; + u32 w = ALIGN(isp_sdev->in_crop.width, 16); + u32 h = isp_sdev->in_crop.height; + int ret, i, cnt, size; - 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; + INIT_LIST_HEAD(&priv_val->iir_list); + INIT_LIST_HEAD(&priv_val->gain_list); + if (dev->unite_div > ISP_UNITE_DIV1) + w = ALIGN(isp_sdev->in_crop.width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL, 16); + if (dev->unite_div == ISP_UNITE_DIV4) + h = ALIGN(isp_sdev->in_crop.height / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL, 16); + if (!iirsparse_en) { + w = w * 3 / 2 + w / 4; + h /= 2; + } + size = ALIGN(w * h * 2, 16); + priv_val->bay3d_iir_size = size; + if (dev->unite_div > ISP_UNITE_DIV1) + size *= dev->unite_div; + cnt = bnrbuf->iir.buf_cnt; + if (cnt >= RKISP_BUFFER_MAX) + cnt = RKISP_BUFFER_MAX - 1; + for (i = 0; i < cnt; i++) { + buf = &priv_val->buf_bay3d_iir[i]; + buf->size = size; + buf->is_need_dbuf = true; + buf->is_need_dmafd = true; + ret = rkisp_alloc_buffer(dev, buf); + if (ret) { + dev_err(dev->dev, "alloc bay3d iir buf%d fail:%d\n", i, ret); + goto err_iir; + } + if (!i) + priv_val->pbuf_bay3d_iir = buf; + else + list_add_tail(&buf->queue, &priv_val->iir_list); + buf->index = i; + bnrbuf->iir.buf_fd[i] = buf->dma_fd; + } + priv_val->bay3d_iir_cnt = cnt; + bnrbuf->iir.buf_cnt = cnt; + bnrbuf->iir.buf_size = 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; + cnt = bnrbuf->u.v39.aiisp.buf_cnt; + if (cnt >= RKISP_BUFFER_MAX) + cnt = RKISP_BUFFER_MAX - 1; + for (i = 0; i < cnt; i++) { + buf = &priv_val->buf_aiisp[i]; + buf->size = size; + buf->is_need_dbuf = true; + buf->is_need_dmafd = true; + ret = rkisp_alloc_buffer(dev, buf); + if (ret) { + dev_err(dev->dev, "alloc aiisp buf%d fail:%d\n", i, ret); + goto err_aiisp; + } + buf->index = i; + bnrbuf->u.v39.aiisp.buf_fd[i] = buf->dma_fd; + } + priv_val->aiisp_cnt = cnt; + bnrbuf->u.v39.aiisp.buf_cnt = cnt; + bnrbuf->u.v39.aiisp.buf_size = size; - buf = &priv_val->buf_aiisp; - if (rkisp_buf_get_fd(params_vdev->dev, buf, true) < 0) - return; - bay3dbuf->u.v39.aiisp_fd = buf->dma_fd; - bay3dbuf->u.v39.aiisp_size = buf->size; + size = ALIGN(w * h / 4, 16); + priv_val->gain_size = size; + if (dev->unite_div > ISP_UNITE_DIV1) + size *= dev->unite_div; + cnt = bnrbuf->u.v39.gain.buf_cnt; + if (cnt >= RKISP_BUFFER_MAX) + cnt = RKISP_BUFFER_MAX - 1; + for (i = 0; i < cnt; i++) { + buf = &priv_val->buf_gain[i]; + buf->size = size; + buf->is_need_dbuf = true; + buf->is_need_dmafd = true; + ret = rkisp_alloc_buffer(dev, buf); + if (ret) { + dev_err(dev->dev, "alloc gain buf%d fail:%d\n", i, ret); + goto err_gain; + } + if (!i) + priv_val->pbuf_gain_wr = buf; + else + list_add_tail(&buf->queue, &priv_val->gain_list); + buf->index = i; + bnrbuf->u.v39.gain.buf_fd[i] = buf->dma_fd; + } + priv_val->gain_cnt = cnt; + bnrbuf->u.v39.gain.buf_cnt = cnt; + bnrbuf->u.v39.gain.buf_size = size; + + return 0; +err_gain: + for (i -= 1; i >= 0; i--) { + buf = &priv_val->buf_gain[i]; + rkisp_free_buffer(dev, buf); + } + priv_val->gain_cnt = 0; + bnrbuf->u.v39.gain.buf_cnt = 0; + bnrbuf->u.v39.gain.buf_size = 0; + + i = priv_val->aiisp_cnt; +err_aiisp: + for (i -= 1; i >= 0; i--) { + buf = &priv_val->buf_aiisp[i]; + rkisp_free_buffer(dev, buf); + } + priv_val->aiisp_cnt = 0; + bnrbuf->u.v39.aiisp.buf_cnt = 0; + bnrbuf->u.v39.aiisp.buf_size = 0; + + i = priv_val->bay3d_iir_cnt; +err_iir: + for (i -= 1; i >= 0; i--) { + buf = &priv_val->buf_bay3d_iir[i]; + rkisp_free_buffer(dev, buf); + } + priv_val->bay3d_iir_cnt = 0; + bnrbuf->iir.buf_cnt = 0; + bnrbuf->iir.buf_size = 0; + return ret; } static void @@ -4903,10 +4804,19 @@ 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_aiisp); - rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_iir); - rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_cur); + for (i = 0; i < priv_val->gain_cnt; i++) + rkisp_free_buffer(ispdev, &priv_val->buf_gain[i]); + priv_val->gain_cnt = 0; + priv_val->gain_cur_idx = -1; + for (i = 0; i < priv_val->aiisp_cnt; i++) + rkisp_free_buffer(ispdev, &priv_val->buf_aiisp[i]); + priv_val->aiisp_cnt = 0; + priv_val->aiisp_cur_idx = -1; + for (i = 0; i < priv_val->bay3d_iir_cnt; i++) + rkisp_free_buffer(ispdev, &priv_val->buf_bay3d_iir[i]); + priv_val->bay3d_iir_cnt = 0; + priv_val->bay3d_iir_idx = -1; + priv_val->bay3d_iir_cur_idx = -1; for (i = 0; i < ISP39_LSC_LUT_BUF_NUM; i++) rkisp_free_buffer(ispdev, &priv_val->buf_lsclut[i]); for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) @@ -4999,40 +4909,36 @@ module_data_abandon(struct rkisp_isp_params_vdev *params_vdev, } static void -rkisp_params_cfg_v39(struct rkisp_isp_params_vdev *params_vdev, - u32 frame_id, enum rkisp_params_type type) +rkisp_params_cfg_latter_v39(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id) { struct rkisp_device *dev = params_vdev->dev; struct isp39_isp_params_cfg *new_params = NULL; - struct rkisp_buffer *cur_buf = params_vdev->cur_buf; + struct rkisp_buffer *cur_buf = NULL; + unsigned long flags = 0; int i; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); if (!params_vdev->streamon) goto unlock; /* get buffer by frame_id */ - while (!list_empty(¶ms_vdev->params) && !cur_buf) { - cur_buf = list_first_entry(¶ms_vdev->params, - struct rkisp_buffer, queue); - - new_params = (struct isp39_isp_params_cfg *)(cur_buf->vaddr[0]); + while (!list_empty(¶ms_vdev->params_be)) { + cur_buf = list_first_entry(¶ms_vdev->params_be, struct rkisp_buffer, queue); + new_params = cur_buf->vaddr[0]; if (new_params->frame_id < frame_id) { list_del(&cur_buf->queue); - if (list_empty(¶ms_vdev->params)) - break; for (i = 0; i < dev->unite_div; i++) { /* update en immediately */ if (new_params->module_en_update || (new_params->module_cfg_update & ISP39_MODULE_FORCE)) { __isp_isr_meas_config(params_vdev, - new_params, RKISP_PARAMS_ALL, i); + new_params, RKISP_PARAMS_LAT, i); __isp_isr_other_config(params_vdev, - new_params, RKISP_PARAMS_ALL, i); + new_params, RKISP_PARAMS_LAT, i); __isp_isr_other_en(params_vdev, - new_params, RKISP_PARAMS_ALL, i); + new_params, RKISP_PARAMS_LAT, i); __isp_isr_meas_en(params_vdev, - new_params, RKISP_PARAMS_ALL, i); + new_params, RKISP_PARAMS_LAT, i); new_params->module_cfg_update = 0; } if (new_params->module_cfg_update & @@ -5054,24 +4960,105 @@ rkisp_params_cfg_v39(struct rkisp_isp_params_vdev *params_vdev, if (!cur_buf) goto unlock; - new_params = (struct isp39_isp_params_cfg *)(cur_buf->vaddr[0]); + new_params = cur_buf->vaddr[0]; + for (i = 0; i < dev->unite_div; i++) { + __isp_isr_meas_config(params_vdev, new_params, RKISP_PARAMS_LAT, i); + __isp_isr_other_config(params_vdev, new_params, RKISP_PARAMS_LAT, i); + __isp_isr_other_en(params_vdev, new_params, RKISP_PARAMS_LAT, i); + __isp_isr_meas_en(params_vdev, new_params, RKISP_PARAMS_LAT, i); + new_params->module_cfg_update = 0; + new_params++; + } + vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); +unlock: + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); +} + +static void +rkisp_params_cfg_v39(struct rkisp_isp_params_vdev *params_vdev, + u32 frame_id, enum rkisp_params_type type) +{ + struct rkisp_device *dev = params_vdev->dev; + struct isp39_isp_params_cfg *params_rec, *new_params = NULL; + struct rkisp_buffer *cur_buf = NULL; + unsigned long flags = 0; + int i; + + if (type == RKISP_PARAMS_LAT) { + rkisp_params_cfg_latter_v39(params_vdev, frame_id); + return; + } + + spin_lock_irqsave(¶ms_vdev->config_lock, flags); + if (!params_vdev->streamon) + goto unlock; + + /* get buffer by frame_id */ + while (!list_empty(¶ms_vdev->params)) { + cur_buf = list_first_entry(¶ms_vdev->params, struct rkisp_buffer, queue); + new_params = cur_buf->vaddr[0]; + if (new_params->frame_id < frame_id) { + list_del(&cur_buf->queue); + for (i = 0; i < dev->unite_div; i++) { + /* update en immediately */ + if (new_params->module_en_update || + (new_params->module_cfg_update & ISP39_MODULE_FORCE)) { + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + type = RKISP_PARAMS_ALL; + __isp_isr_meas_config(params_vdev, new_params, type, i); + __isp_isr_other_config(params_vdev, new_params, type, i); + __isp_isr_other_en(params_vdev, new_params, type, i); + __isp_isr_meas_en(params_vdev, new_params, type, i); + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + new_params->module_cfg_update = 0; + } + if ((!dev->is_aiisp_en || dev->is_aiisp_sync) && + (new_params->module_cfg_update & + (ISP39_MODULE_LDCH | ISP39_MODULE_CAC | ISP39_MODULE_LDCV))) + module_data_abandon(params_vdev, new_params, i); + new_params++; + } + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); + else + list_add_tail(&cur_buf->queue, ¶ms_vdev->params_be); + cur_buf = NULL; + continue; + } else if (new_params->frame_id == frame_id) { + list_del(&cur_buf->queue); + } else { + cur_buf = NULL; + } + break; + } + + if (!cur_buf) + goto unlock; + + params_rec = params_vdev->isp39_params; + new_params = cur_buf->vaddr[0]; for (i = 0; i < dev->unite_div; i++) { __isp_isr_meas_config(params_vdev, new_params, type, i); __isp_isr_other_config(params_vdev, new_params, type, i); __isp_isr_other_en(params_vdev, new_params, type, i); __isp_isr_meas_en(params_vdev, new_params, type, i); - if (type != RKISP_PARAMS_IMD) + if (IS_HDR_RDBK(dev->rd_mode) && + (!dev->is_aiisp_en || dev->is_aiisp_sync)) { + params_rec->others.hdrmge_cfg = new_params->others.hdrmge_cfg; + params_rec->others.drc_cfg = new_params->others.drc_cfg; + params_rec->module_cfg_update = new_params->module_cfg_update; + params_rec++; + } + if (!dev->is_aiisp_en || dev->is_aiisp_sync) new_params->module_cfg_update = 0; new_params++; } - if (type != RKISP_PARAMS_IMD) { + if (!dev->is_aiisp_en || dev->is_aiisp_sync) vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - cur_buf = NULL; - } - + else + list_add_tail(&cur_buf->queue, ¶ms_vdev->params_be); unlock: - params_vdev->cur_buf = cur_buf; - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void @@ -5088,21 +5075,211 @@ rkisp_params_clear_fstflg(struct rkisp_isp_params_vdev *params_vdev) isp3_param_clear_bits(params_vdev, ISP3X_ISP_CTRL1, value, i); } +static void +rkisp_params_aiisp_update_buf(struct rkisp_isp_params_vdev *params_vdev) +{ + struct rkisp_isp_params_val_v39 *priv = params_vdev->priv_val; + unsigned long lock_flags = 0; + u32 val; + + if (params_vdev->dev->is_aiisp_sync) + return; + + val = isp3_param_read_direct(params_vdev, ISP3X_MI_BAY3D_IIR_WR_BASE_SHD); + isp3_param_write(params_vdev, val, ISP3X_MI_BAY3D_IIR_RD_BASE, 0); + spin_lock_irqsave(&priv->buf_lock, lock_flags); + priv->pbuf_bay3d_iir = NULL; + if (!list_empty(&priv->iir_list)) { + priv->pbuf_bay3d_iir = list_first_entry(&priv->iir_list, + struct rkisp_dummy_buffer, queue); + list_del(&priv->pbuf_bay3d_iir->queue); + + val = priv->pbuf_bay3d_iir->dma_addr; + isp3_param_write(params_vdev, val, ISP3X_MI_BAY3D_IIR_WR_BASE, 0); + priv->bay3d_iir_cur_idx = priv->pbuf_bay3d_iir->index; + } + + priv->pbuf_gain_wr = NULL; + if (!list_empty(&priv->gain_list) && priv->pbuf_bay3d_iir) { + priv->pbuf_gain_wr = list_first_entry(&priv->gain_list, + struct rkisp_dummy_buffer, queue); + list_del(&priv->pbuf_gain_wr->queue); + + val = priv->pbuf_gain_wr->dma_addr; + isp3_param_write(params_vdev, val, ISP3X_MI_GAIN_WR_BASE, 0); + priv->gain_cur_idx = priv->pbuf_gain_wr->index; + } + val = ISP3X_BAY3D_IIRSELF_UPD | ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAINSELF_UPD; + isp3_param_set_bits(params_vdev, MI_WR_CTRL2, val, 0); + v4l2_dbg(3, rkisp_debug, ¶ms_vdev->dev->v4l2_dev, + "%s %x:%x %x:%x %x:%x, iir:%x gain:%x\n", __func__, + ISP3X_MI_BAY3D_IIR_WR_BASE_SHD, + isp3_param_read_direct(params_vdev, ISP3X_MI_BAY3D_IIR_WR_BASE_SHD), + ISP3X_MI_BAY3D_IIR_RD_BASE_SHD, + isp3_param_read_direct(params_vdev, ISP3X_MI_BAY3D_IIR_RD_BASE_SHD), + ISP3X_MI_GAIN_WR_BASE_SHD, + isp3_param_read_direct(params_vdev, ISP3X_MI_GAIN_WR_BASE_SHD), + priv->pbuf_bay3d_iir ? (u32)priv->pbuf_bay3d_iir->dma_addr : 0, + priv->pbuf_gain_wr ? (u32)priv->pbuf_gain_wr->dma_addr : 0); + if (!priv->pbuf_gain_wr && priv->pbuf_bay3d_iir) { + list_add_tail(&priv->pbuf_bay3d_iir->queue, &priv->iir_list); + priv->pbuf_bay3d_iir = NULL; + } + spin_unlock_irqrestore(&priv->buf_lock, lock_flags); +} + +static void +rkisp_params_aiisp_event_v39(struct rkisp_isp_params_vdev *params_vdev, u32 irq) +{ + struct rkisp_isp_params_val_v39 *priv = params_vdev->priv_val; + struct rkisp_device *dev = params_vdev->dev; + struct rkisp_dummy_buffer *buf = NULL; + struct v4l2_event ev = { 0 }; + struct rkisp_aiisp_ev_info *ev_info; + unsigned long lock_flags = 0; + u32 h = dev->isp_sdev.out_crop.height; + u32 val, wr_line, rd_line; + + if (sizeof(*ev_info) > sizeof(ev.u)) { + v4l2_err(&dev->v4l2_dev, "aiisp_ev_info too large\n"); + return; + } + ev.type = RKISP_V4L2_EVENT_AIISP_LINECNT; + ev_info = (struct rkisp_aiisp_ev_info *)ev.u.data; + ev_info->iir_index = -1; + ev_info->gain_index = -1; + ev_info->aiisp_index = -1; + 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; + rkisp_dmarx_get_frame(dev, &ev_info->sequence, NULL, &ev_info->timestamp, false); + spin_lock_irqsave(&priv->buf_lock, lock_flags); + if (priv->pbuf_aiisp) { + ev_info->aiisp_index = priv->pbuf_aiisp->index; + priv->pbuf_aiisp = NULL; + } + if (priv->pbuf_gain_rd && !dev->is_aiisp_sync) { + list_add_tail(&priv->pbuf_gain_rd->queue, &priv->gain_list); + priv->pbuf_gain_rd = NULL; + } + spin_unlock_irqrestore(&priv->buf_lock, lock_flags); + v4l2_event_queue(dev->isp_sdev.sd.devnode, &ev); + } else { + wr_line = ISP39_AIISP_WR_LINECNT(val); + ev.id = RKISP_AIISP_WR_LINECNT_ID; + ev_info->height = !wr_line ? h : wr_line; + rkisp_dmarx_get_frame(dev, &ev_info->sequence, NULL, &ev_info->timestamp, true); + + buf = priv->pbuf_bay3d_iir; + if (buf) + ev_info->iir_index = buf->index; + buf = priv->pbuf_gain_wr; + if (buf) { + ev_info->gain_index = buf->index; + v4l2_event_queue(dev->isp_sdev.sd.devnode, &ev); + } + } + v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev, + "%s seq:%d height:%d idx(iir:%d gain:%d aiisp:%d)\n", + ev.id ? "isp_be" : "isp_fe", ev_info->sequence, ev_info->height, + ev_info->iir_index, ev_info->gain_index, ev_info->aiisp_index); +} + +static int +rkisp_params_aiisp_start_v39(struct rkisp_isp_params_vdev *params_vdev, + struct rkisp_aiisp_st *st) +{ + struct rkisp_isp_params_val_v39 *priv = params_vdev->priv_val; + struct rkisp_device *dev = params_vdev->dev; + struct rkisp_dummy_buffer *buf, *buf_tmp; + unsigned long lock_flags = 0; + u32 val, seq = st->sequence; + + if (!dev->is_aiisp_en) + return -EINVAL; + if (st->gain_index < 0 || st->gain_index >= priv->gain_cnt || + st->aiisp_index < 0 || st->aiisp_index >= priv->aiisp_cnt || + st->aiisp_index < 0 || st->iir_index >= priv->bay3d_iir_cnt) { + dev_err(dev->dev, + "%s seq:%d error, gain idx:%d cnt:%d, iir idx:%d cnt:%d aiisp idx:%d cnt:%d\n", + __func__, seq, st->gain_index, priv->gain_cnt, + st->aiisp_index, priv->aiisp_cnt, st->iir_index, priv->bay3d_iir_cnt); + return -EINVAL; + } + + spin_lock_irqsave(&priv->buf_lock, lock_flags); + if (!dev->is_aiisp_sync) { + buf = &priv->buf_bay3d_iir[st->iir_index]; + list_for_each_entry(buf_tmp, &priv->iir_list, queue) { + if (buf_tmp == buf) { + dev_err(dev->dev, "iir idx:%d error\n", st->iir_index); + spin_unlock_irqrestore(&priv->buf_lock, lock_flags); + return 0; + } + } + list_add_tail(&buf->queue, &priv->iir_list); + } + priv->pbuf_gain_rd = &priv->buf_gain[st->gain_index]; + priv->pbuf_aiisp = &priv->buf_aiisp[st->aiisp_index]; + priv->aiisp_cur_idx = st->aiisp_index; + spin_unlock_irqrestore(&priv->buf_lock, lock_flags); + + if (!dev->is_aiisp_sync) + rkisp_params_cfg(&dev->params_vdev, seq, RKISP_PARAMS_LAT); + val = priv->pbuf_aiisp->dma_addr; + rkisp_write(dev, ISP39_AIISP_RD_BASE, val, true); + val = priv->pbuf_gain_rd->dma_addr; + rkisp_write(dev, ISP3X_MI_RAW0_RD_BASE, val, true); + rkisp_set_bits(dev, ISP3X_MI_WR_CTRL2, 0, ISP3X_DBR_RDSELF_UPD, true); + rkisp_set_bits(dev, ISP3X_CSI2RX_RAW_RD_CTRL, 0, ISP3X_RXSELF_FORCE_UPD, true); + + v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev, + "isp_be start seq:%d idx(%d %d) %x %x, %x:%x %x:%x\n", + seq, st->aiisp_index, st->gain_index, + (u32)priv->pbuf_aiisp->dma_addr, + (u32)priv->pbuf_gain_rd->dma_addr, + ISP3X_MI_DBR_RD_BASE_SHD, rkisp_read(dev, ISP3X_MI_DBR_RD_BASE_SHD, true), + ISP3X_MI_RAW0_RD_BASE_SHD, rkisp_read(dev, ISP3X_MI_RAW0_RD_BASE_SHD, true)); + return 0; +} + static void rkisp_params_isr_v39(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis) { + struct rkisp_isp_params_val_v39 *priv = params_vdev->priv_val; struct rkisp_device *dev = params_vdev->dev; - u32 cur_frame_id; + u32 i, val; - rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, NULL, true); if (isp_mis & CIF_ISP_V_START) { if (params_vdev->rdbk_times) params_vdev->rdbk_times--; - if (!params_vdev->cur_buf) - return; + if (!dev->is_aiisp_en && priv->bay3d_iir_cnt > 1 && + (!IS_HDR_RDBK(dev->rd_mode) || !params_vdev->rdbk_times)) { + priv->bay3d_iir_cur_idx = priv->bay3d_iir_idx; + i = (priv->bay3d_iir_idx + 1) % priv->bay3d_iir_cnt; + priv->bay3d_iir_idx = i; + for (i = 0; i < dev->unite_div; i++) { + val = isp3_param_read_cache(params_vdev, ISP3X_MI_BAY3D_IIR_WR_BASE, i); + isp3_param_write(params_vdev, val, ISP3X_MI_BAY3D_IIR_RD_BASE, i); + val = priv->buf_bay3d_iir[priv->bay3d_iir_idx].dma_addr; + val += i * priv->bay3d_iir_size; + isp3_param_write(params_vdev, val, ISP3X_MI_BAY3D_IIR_WR_BASE, i); + } + } if (IS_HDR_RDBK(dev->rd_mode) && !params_vdev->rdbk_times) { - rkisp_params_cfg_v39(params_vdev, cur_frame_id, RKISP_PARAMS_SHD); + struct isp39_isp_params_cfg *params = params_vdev->isp39_params; + + for (i = 0; i < dev->unite_div; i++) { + if (params->module_cfg_update & ISP39_MODULE_HDRMGE) + isp_hdrmge_config(params_vdev, ¶ms->others.hdrmge_cfg, RKISP_PARAMS_SHD, i); + if (params->module_cfg_update & ISP39_MODULE_DRC) + isp_hdrdrc_config(params_vdev, ¶ms->others.drc_cfg, RKISP_PARAMS_SHD, i); + params->module_cfg_update = 0; + params++; + } return; } } @@ -5110,8 +5287,15 @@ rkisp_params_isr_v39(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis) if ((isp_mis & CIF_ISP_FRAME) && !params_vdev->rdbk_times && !dev->hw_dev->is_single) rkisp_params_clear_fstflg(params_vdev); - if ((isp_mis & CIF_ISP_FRAME) && !IS_HDR_RDBK(dev->rd_mode)) - rkisp_params_cfg_v39(params_vdev, cur_frame_id + 1, RKISP_PARAMS_ALL); + rkisp_dmarx_get_frame(dev, &i, NULL, NULL, true); + if (isp_mis & ISP3X_BAY3D_FRM_END && dev->is_aiisp_en) { + rkisp_params_aiisp_update_buf(params_vdev); + if (!IS_HDR_RDBK(dev->rd_mode)) + rkisp_params_cfg_v39(params_vdev, i + 1, RKISP_PARAMS_IMD); + } else if (isp_mis & CIF_ISP_FRAME && + !IS_HDR_RDBK(dev->rd_mode) && !dev->is_aiisp_en) { + rkisp_params_cfg_v39(params_vdev, i + 1, RKISP_PARAMS_ALL); + } } static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { @@ -5130,7 +5314,9 @@ 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, + .init_bnr_buf = rkisp_params_init_bnr_buf_v39, + .aiisp_event = rkisp_params_aiisp_event_v39, + .aiisp_start = rkisp_params_aiisp_start_v39, }; int rkisp_init_params_vdev_v39(struct rkisp_isp_params_vdev *params_vdev) @@ -5151,9 +5337,9 @@ int rkisp_init_params_vdev_v39(struct rkisp_isp_params_vdev *params_vdev) return -ENOMEM; } + spin_lock_init(&priv_val->buf_lock); params_vdev->priv_val = (void *)priv_val; params_vdev->ops = &rkisp_isp_params_ops_tbl; - params_vdev->priv_ops = &isp_params_ops_v39; rkisp_clear_first_param_v39(params_vdev); priv_val->buf_info_owner = 0; priv_val->buf_info_cnt = 0; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v39.h b/drivers/media/platform/rockchip/isp/isp_params_v39.h index cbc68e77198b..0ceeb9ee01ce 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v39.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v39.h @@ -20,137 +20,6 @@ (ISP39_RAWHISTBIG_ROW_NUM * ISP39_RAWHISTBIG_COLUMN_NUM) struct rkisp_isp_params_vdev; -struct rkisp_isp_params_ops_v39 { - void (*dpcc_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_dpcc_cfg *arg, u32 id); - void (*dpcc_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*bls_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp32_bls_cfg *arg, u32 id); - void (*bls_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*sdg_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_sdg_cfg *arg, u32 id); - void (*sdg_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*lsc_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp3x_lsc_cfg *arg, u32 id); - void (*lsc_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*awbgain_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp32_awb_gain_cfg *arg, u32 id); - void (*awbgain_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*debayer_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_debayer_cfg *arg, u32 id); - void (*debayer_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*ccm_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_ccm_cfg *arg, u32 id); - void (*ccm_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*goc_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp3x_gammaout_cfg *arg, u32 id); - void (*goc_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*cproc_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_cproc_cfg *arg, u32 id); - void (*cproc_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*rawaf_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_rawaf_meas_cfg *arg, u32 id); - void (*rawaf_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*rawae0_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_rawaebig_meas_cfg *arg, u32 id); - void (*rawae0_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*rawae3_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_rawaebig_meas_cfg *arg, u32 id); - void (*rawae3_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*rawawb_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_rawawb_meas_cfg *arg, u32 id); - void (*rawawb_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*rawhst0_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_rawhistbig_cfg *arg, u32 id); - void (*rawhst0_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*rawhst3_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_rawhistbig_cfg *arg, u32 id); - void (*rawhst3_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*hdrdrc_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_drc_cfg *arg, - enum rkisp_params_type type, u32 id); - void (*hdrdrc_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*hdrmge_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp32_hdrmge_cfg *arg, - enum rkisp_params_type type, u32 id); - void (*hdrmge_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*gic_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_gic_cfg *arg, u32 id); - void (*gic_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*dhaz_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_dhaz_cfg *arg, u32 id); - void (*dhaz_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*isp3dlut_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp2x_3dlut_cfg *arg, u32 id); - void (*isp3dlut_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*ldch_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_ldch_cfg *arg, u32 id); - void (*ldch_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*ynr_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_ynr_cfg *arg, u32 id); - void (*ynr_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*cnr_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_cnr_cfg *arg, u32 id); - void (*cnr_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*sharp_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_sharp_cfg *arg, u32 id); - void (*sharp_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*bay3d_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_bay3d_cfg *arg, u32 id); - void (*bay3d_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*gain_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp3x_gain_cfg *arg, u32 id); - void (*gain_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*cac_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp32_cac_cfg *arg, u32 id); - void (*cac_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*csm_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp21_csm_cfg *arg, u32 id); - void (*cgc_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp21_cgc_cfg *arg, u32 id); - void (*ie_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*yuvme_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_yuvme_cfg *arg, u32 id); - void (*yuvme_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*ldcv_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_ldcv_cfg *arg, u32 id); - void (*ldcv_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); - void (*rgbir_config)(struct rkisp_isp_params_vdev *params_vdev, - const struct isp39_rgbir_cfg *arg, u32 id); - void (*rgbir_enable)(struct rkisp_isp_params_vdev *params_vdev, - bool en, u32 id); -}; - struct rkisp_isp_params_val_v39 { struct rkisp_dummy_buffer buf_3dlut[ISP_UNITE_MAX][ISP39_3DLUT_BUF_NUM]; u32 buf_3dlut_idx[ISP_UNITE_MAX]; @@ -175,12 +44,27 @@ struct rkisp_isp_params_val_v39 { int buf_info_idx; u32 gain_size; + int gain_cnt; + int gain_cur_idx; + int aiisp_cnt; + int aiisp_cur_idx; u32 bay3d_iir_size; + int bay3d_iir_cnt; + int bay3d_iir_idx; + int bay3d_iir_cur_idx; u32 bay3d_cur_size; - struct rkisp_dummy_buffer buf_gain; - struct rkisp_dummy_buffer buf_aiisp; - struct rkisp_dummy_buffer buf_3dnr_iir; - struct rkisp_dummy_buffer buf_3dnr_cur; + struct rkisp_dummy_buffer buf_gain[RKISP_BUFFER_MAX]; + struct rkisp_dummy_buffer buf_aiisp[RKISP_BUFFER_MAX]; + struct rkisp_dummy_buffer buf_bay3d_iir[RKISP_BUFFER_MAX]; + struct rkisp_dummy_buffer buf_bay3d_cur; + + spinlock_t buf_lock; + struct list_head iir_list; + struct list_head gain_list; + struct rkisp_dummy_buffer *pbuf_bay3d_iir; + struct rkisp_dummy_buffer *pbuf_gain_wr; + struct rkisp_dummy_buffer *pbuf_gain_rd; + struct rkisp_dummy_buffer *pbuf_aiisp; struct rkisp_dummy_buffer buf_frm; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v3x.c b/drivers/media/platform/rockchip/isp/isp_params_v3x.c index 5c6d3f88883f..ba1a572cf873 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v3x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v3x.c @@ -4414,10 +4414,11 @@ rkisp_params_first_cfg_v3x(struct rkisp_isp_params_vdev *params_vdev) struct rkisp_device *dev = params_vdev->dev; struct rkisp_isp_params_val_v3x *priv_val = params_vdev->priv_val; struct isp3x_isp_params_cfg *params = params_vdev->isp3x_params; + unsigned long flags = 0; int i; dev->is_bigmode = rkisp_params_check_bigmode_v3x(params_vdev); - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); /* override the default things */ if (!params->module_cfg_update && !params->module_en_update) dev_warn(dev->dev, "can not get first iq setting in stream on\n"); @@ -4437,7 +4438,7 @@ rkisp_params_first_cfg_v3x(struct rkisp_isp_params_vdev *params_vdev) __isp_isr_other_en(params_vdev, params + i, RKISP_PARAMS_ALL, i); __isp_isr_meas_en(params_vdev, params + i, RKISP_PARAMS_ALL, i); } - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void rkisp_save_first_param_v3x(struct rkisp_isp_params_vdev *params_vdev, void *param) @@ -4703,8 +4704,9 @@ rkisp_params_cfg_v3x(struct rkisp_isp_params_vdev *params_vdev, struct rkisp_buffer *cur_buf = params_vdev->cur_buf; struct rkisp_device *dev = params_vdev->dev; struct rkisp_hw_dev *hw_dev = dev->hw_dev; + unsigned long flags = 0; - spin_lock(¶ms_vdev->config_lock); + spin_lock_irqsave(¶ms_vdev->config_lock, flags); if (!params_vdev->streamon) goto unlock; @@ -4778,7 +4780,7 @@ rkisp_params_cfg_v3x(struct rkisp_isp_params_vdev *params_vdev, unlock: params_vdev->cur_buf = cur_buf; - spin_unlock(¶ms_vdev->config_lock); + spin_unlock_irqrestore(¶ms_vdev->config_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_stats.c b/drivers/media/platform/rockchip/isp/isp_stats.c index bffdd992afb5..c110fd672e83 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats.c +++ b/drivers/media/platform/rockchip/isp/isp_stats.c @@ -152,7 +152,7 @@ static void rkisp_stats_vb2_buf_queue(struct vb2_buffer *vb) struct rkisp_isp_stats_vdev *stats_dev = vq->drv_priv; struct rkisp_device *dev = stats_dev->dev; u32 size = stats_dev->vdev_fmt.fmt.meta.buffersize; - unsigned long flags; + unsigned long flags = 0; stats_buf->vaddr[0] = vb2_plane_vaddr(vb, 0); if (dev->isp_ver == ISP_V32 || dev->isp_ver == ISP_V39 || dev->isp_ver == ISP_V33) { @@ -208,8 +208,8 @@ static void rkisp_stats_vb2_stop_streaming(struct vb2_queue *vq) struct rkisp_isp_stats_vdev *stats_vdev = vq->drv_priv; struct rkisp_device *dev = stats_vdev->dev; struct rkisp_buffer *buf; - unsigned long flags; - int i; + unsigned long flags = 0; + LIST_HEAD(local_list); v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s state:0x%x\n", __func__, dev->isp_state); @@ -221,25 +221,25 @@ static void rkisp_stats_vb2_stop_streaming(struct vb2_queue *vq) tasklet_disable(&stats_vdev->rd_tasklet); spin_lock_irqsave(&stats_vdev->rd_lock, flags); - for (i = 0; i < RKISP_ISP_STATS_REQ_BUFS_MAX; i++) { - if (list_empty(&stats_vdev->stat)) - break; - buf = list_first_entry(&stats_vdev->stat, - struct rkisp_buffer, queue); - list_del(&buf->queue); - vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); - } if (stats_vdev->cur_buf) { - vb2_buffer_done(&stats_vdev->cur_buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); + buf = stats_vdev->cur_buf; + list_add_tail(&buf->queue, &stats_vdev->stat); if (stats_vdev->cur_buf == stats_vdev->nxt_buf) stats_vdev->nxt_buf = NULL; stats_vdev->cur_buf = NULL; } if (stats_vdev->nxt_buf) { - vb2_buffer_done(&stats_vdev->nxt_buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); + buf = stats_vdev->nxt_buf; + list_add_tail(&buf->queue, &stats_vdev->stat); stats_vdev->nxt_buf = NULL; } + list_replace_init(&stats_vdev->stat, &local_list); spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); + while (!list_empty(&local_list)) { + buf = list_first_entry(&local_list, struct rkisp_buffer, queue); + list_del(&buf->queue); + vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); + } stats_vdev->ae_meas_done_next = false; stats_vdev->af_meas_done_next = false; diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v1x.c b/drivers/media/platform/rockchip/isp/isp_stats_v1x.c index 3829156cd4b8..123a4a6d66da 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v1x.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v1x.c @@ -261,8 +261,8 @@ rkisp1_stats_send_meas_v1x(struct rkisp_isp_stats_vdev *stats_vdev, unsigned int cur_frame_id = -1; struct rkisp1_stat_buffer *cur_stat_buf; struct rkisp_buffer *cur_buf = NULL; - struct rkisp_stats_v1x_ops *ops = - (struct rkisp_stats_v1x_ops *)stats_vdev->priv_ops; + struct rkisp_stats_v1x_ops *ops = stats_vdev->priv_ops; + unsigned long flags = 0; cur_frame_id = atomic_read(&stats_vdev->dev->isp_sdev.frm_sync_seq) - 1; if (cur_frame_id != meas_work->frame_id) { @@ -272,14 +272,14 @@ rkisp1_stats_send_meas_v1x(struct rkisp_isp_stats_vdev *stats_vdev, cur_frame_id = meas_work->frame_id; } - spin_lock(&stats_vdev->rd_lock); + spin_lock_irqsave(&stats_vdev->rd_lock, flags); /* get one empty buffer */ if (!list_empty(&stats_vdev->stat)) { cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue); list_del(&cur_buf->queue); } - spin_unlock(&stats_vdev->rd_lock); + spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); if (!cur_buf) return; @@ -328,11 +328,12 @@ rkisp1_stats_isr_v1x(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_isp_readout_work work; unsigned int cur_frame_id = atomic_read(&stats_vdev->dev->isp_sdev.frm_sync_seq) - 1; + unsigned long flags = 0; #ifdef LOG_ISR_EXE_TIME ktime_t in_t = ktime_get(); #endif - spin_lock(&stats_vdev->irq_lock); + spin_lock_irqsave(&stats_vdev->irq_lock, flags); isp_mis_tmp = isp_ris & (CIF_ISP_AWB_DONE | CIF_ISP_AFM_FIN | CIF_ISP_EXP_END | CIF_ISP_HIST_MEASURE_RDY); @@ -382,7 +383,7 @@ rkisp1_stats_isr_v1x(struct rkisp_isp_stats_vdev *stats_vdev, #endif unlock: - spin_unlock(&stats_vdev->irq_lock); + spin_unlock_irqrestore(&stats_vdev->irq_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v21.c b/drivers/media/platform/rockchip/isp/isp_stats_v21.c index 8c55387df960..343e0da58a52 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v21.c @@ -946,12 +946,12 @@ rkisp_stats_send_meas_v21(struct rkisp_isp_stats_vdev *stats_vdev, unsigned int cur_frame_id = -1; struct rkisp_buffer *cur_buf = stats_vdev->cur_buf; struct rkisp_isp21_stat_buffer *cur_stat_buf = NULL; - struct rkisp_stats_v21_ops *ops = - (struct rkisp_stats_v21_ops *)stats_vdev->priv_ops; + struct rkisp_stats_v21_ops *ops = stats_vdev->priv_ops; struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev; + unsigned long flags = 0; cur_frame_id = meas_work->frame_id; - spin_lock(&stats_vdev->rd_lock); + spin_lock_irqsave(&stats_vdev->rd_lock, flags); /* get one empty buffer */ if (!cur_buf) { if (!list_empty(&stats_vdev->stat)) { @@ -960,7 +960,7 @@ rkisp_stats_send_meas_v21(struct rkisp_isp_stats_vdev *stats_vdev, list_del(&cur_buf->queue); } } - spin_unlock(&stats_vdev->rd_lock); + spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); if (cur_buf) { cur_stat_buf = @@ -1049,13 +1049,14 @@ rkisp_stats_isr_v21(struct rkisp_isp_stats_vdev *stats_vdev, ISP2X_YUVAE_END | ISP2X_SIHST_RDY | ISP2X_AFM_SUM_OF | ISP2X_AFM_LUM_OF; u32 cur_frame_id, isp_mis_tmp = 0, iq_3a_mask = 0; u32 wr_buf_idx, temp_isp_ris, temp_isp3a_ris; + unsigned long flags = 0; rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true); if (IS_HDR_RDBK(dev->hdr.op_mode)) iq_3a_mask = ISP2X_3A_RAWAE_BIG; - spin_lock(&stats_vdev->irq_lock); + spin_lock_irqsave(&stats_vdev->irq_lock, flags); temp_isp_ris = rkisp_read(stats_vdev->dev, ISP_ISP_RIS, true); temp_isp3a_ris = rkisp_read(stats_vdev->dev, ISP_ISP3A_RIS, true); @@ -1110,7 +1111,7 @@ rkisp_stats_isr_v21(struct rkisp_isp_stats_vdev *stats_vdev, } unlock: - spin_unlock(&stats_vdev->irq_lock); + spin_unlock_irqrestore(&stats_vdev->irq_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c index 0c73712eb87e..408aa2950f20 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v2x.c @@ -1130,18 +1130,18 @@ rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev, unsigned int cur_frame_id = -1; struct rkisp_isp2x_stat_buffer *cur_stat_buf = NULL; struct rkisp_buffer *cur_buf = NULL; - struct rkisp_stats_v2x_ops *ops = - (struct rkisp_stats_v2x_ops *)stats_vdev->priv_ops; + struct rkisp_stats_v2x_ops *ops = stats_vdev->priv_ops; + unsigned long flags = 0; cur_frame_id = meas_work->frame_id; - spin_lock(&stats_vdev->rd_lock); + spin_lock_irqsave(&stats_vdev->rd_lock, flags); /* get one empty buffer */ if (!list_empty(&stats_vdev->stat)) { cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue); list_del(&cur_buf->queue); } - spin_unlock(&stats_vdev->rd_lock); + spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); if (cur_buf) { cur_stat_buf = @@ -1340,6 +1340,7 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev, u32 hdl_ris, hdl_3aris, unhdl_ris, unhdl_3aris; u32 wr_buf_idx; u32 temp_isp_ris, temp_isp3a_ris; + unsigned long flags = 0; rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true); #ifdef LOG_ISR_EXE_TIME @@ -1347,7 +1348,7 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev, #endif if (IS_HDR_RDBK(dev->hdr.op_mode)) iq_3a_mask = ISP2X_3A_RAWAE_BIG; - spin_lock(&stats_vdev->irq_lock); + spin_lock_irqsave(&stats_vdev->irq_lock, flags); temp_isp_ris = rkisp_read(stats_vdev->dev, ISP_ISP_RIS, true); temp_isp3a_ris = rkisp_read(stats_vdev->dev, ISP_ISP3A_RIS, true); @@ -1444,7 +1445,7 @@ rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev, #endif unlock: - spin_unlock(&stats_vdev->irq_lock); + spin_unlock_irqrestore(&stats_vdev->irq_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v32.c b/drivers/media/platform/rockchip/isp/isp_stats_v32.c index e1633147afcf..d373c7156cee 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v32.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v32.c @@ -427,7 +427,7 @@ rkisp_stats_update_buf(struct rkisp_isp_stats_vdev *stats_vdev) { struct rkisp_device *dev = stats_vdev->dev; struct rkisp_buffer *buf; - unsigned long flags; + unsigned long flags = 0; u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize; u32 val = 0; int i; @@ -556,7 +556,7 @@ rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev, u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize; u32 cur_frame_id = meas_work->frame_id; bool is_dummy = false; - unsigned long flags; + unsigned long flags = 0; if (!stats_vdev->rdbk_drop) { if (!cur_buf && stats_vdev->stats_buf[0].mem_priv) { @@ -924,15 +924,16 @@ rkisp_stats_send_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_buffer *cur_buf = stats_vdev->cur_buf; struct rkisp32_lite_stat_buffer *cur_stat_buf = NULL; u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize; + unsigned long flags = 0; if (hw->unite != ISP_UNITE_ONE || dev->unite_index == ISP_UNITE_LEFT) { - spin_lock(&stats_vdev->rd_lock); + spin_lock_irqsave(&stats_vdev->rd_lock, flags); if (!list_empty(&stats_vdev->stat)) { cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue); list_del(&cur_buf->queue); stats_vdev->cur_buf = cur_buf; } - spin_unlock(&stats_vdev->rd_lock); + spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); } if (cur_buf) { @@ -1019,10 +1020,11 @@ rkisp_stats_isr_v32(struct rkisp_isp_stats_vdev *stats_vdev, ISP3X_EXP_END | ISP3X_SIHST_RDY | ISP3X_AFM_SUM_OF | ISP3X_AFM_LUM_OF; u32 cur_frame_id, isp_mis_tmp = 0; u32 temp_isp_ris, temp_isp3a_ris; + unsigned long flags = 0; rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true); - spin_lock(&stats_vdev->irq_lock); + spin_lock_irqsave(&stats_vdev->irq_lock, flags); temp_isp_ris = isp3_stats_read(stats_vdev, ISP3X_ISP_RIS); temp_isp3a_ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS); @@ -1058,7 +1060,7 @@ rkisp_stats_isr_v32(struct rkisp_isp_stats_vdev *stats_vdev, rkisp_stats_send_meas_v32(stats_vdev, &work); } - spin_unlock(&stats_vdev->irq_lock); + spin_unlock_irqrestore(&stats_vdev->irq_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v33.c b/drivers/media/platform/rockchip/isp/isp_stats_v33.c index 15dc07cdb7fe..19ff836b064b 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v33.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v33.c @@ -187,7 +187,7 @@ rkisp_stats_update_buf(struct rkisp_isp_stats_vdev *stats_vdev) { struct rkisp_device *dev = stats_vdev->dev; struct rkisp_buffer *buf; - unsigned long flags; + unsigned long flags = 0; u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize / dev->unite_div; u32 val, addr = 0, offset = 0; int i, ret = 0; @@ -328,7 +328,7 @@ rkisp_stats_send_meas_v33(struct rkisp_isp_stats_vdev *stats_vdev, u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize; u32 val, w3a_int, cur_frame_id = meas_work->frame_id; bool is_dummy = false; - unsigned long flags; + unsigned long flags = 0; w3a_int = isp3_stats_read(stats_vdev, ISP39_W3A_INT_STAT); if (w3a_int) diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v39.c b/drivers/media/platform/rockchip/isp/isp_stats_v39.c index cb42a3c5a736..058be1da53a2 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v39.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v39.c @@ -14,6 +14,15 @@ #include "isp_stats_v39.h" #include "isp_params_v39.h" +#define ISP39_3A_MEAS_DONE BIT(31) + +static void isp3_module_done(struct rkisp_isp_stats_vdev *stats_vdev, u32 reg, u32 value) +{ + void __iomem *base = stats_vdev->dev->hw_dev->base_addr; + + writel(value, base + reg); +} + static u32 isp3_stats_read(struct rkisp_isp_stats_vdev *stats_vdev, u32 addr) { return rkisp_read(stats_vdev->dev, addr, true); @@ -82,6 +91,7 @@ static int rkisp_stats_get_bay3d_stats(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp39_stat_buffer *pbuf) { + struct rkisp_isp_params_val_v39 *priv = stats_vdev->dev->params_vdev.priv_val; struct isp39_bay3d_stat *bay3d; u32 i, value; @@ -97,6 +107,7 @@ rkisp_stats_get_bay3d_stats(struct rkisp_isp_stats_vdev *stats_vdev, bay3d->tnr_auto_sigma_calc[i * 2] = value & 0xfff; bay3d->tnr_auto_sigma_calc[i * 2 + 1] = (value >> 16) & 0xfff; } + pbuf->stat.buf_bay3d_iir_index = priv->bay3d_iir_cur_idx; pbuf->meas_type |= ISP39_STAT_BAY3D; } return 0; @@ -107,19 +118,21 @@ rkisp_stats_update_buf(struct rkisp_isp_stats_vdev *stats_vdev) { struct rkisp_device *dev = stats_vdev->dev; struct rkisp_buffer *buf; - unsigned long flags; + unsigned long flags = 0; u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize / dev->unite_div; u32 val, addr = 0, offset = 0; int i, ret = 0; - spin_lock_irqsave(&stats_vdev->rd_lock, flags); - if (!stats_vdev->nxt_buf && !list_empty(&stats_vdev->stat)) { - buf = list_first_entry(&stats_vdev->stat, - struct rkisp_buffer, queue); - list_del(&buf->queue); - stats_vdev->nxt_buf = buf; + if (!dev->is_aiisp_en || dev->is_aiisp_sync) { + spin_lock_irqsave(&stats_vdev->rd_lock, flags); + if (!stats_vdev->nxt_buf && !list_empty(&stats_vdev->stat)) { + buf = list_first_entry(&stats_vdev->stat, + struct rkisp_buffer, queue); + list_del(&buf->queue); + stats_vdev->nxt_buf = buf; + } + spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); } - spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); if (stats_vdev->nxt_buf) { addr = stats_vdev->nxt_buf->buff_addr[0]; @@ -243,21 +256,135 @@ rkisp_stats_info2ddr(struct rkisp_isp_stats_vdev *stats_vdev, } static void -rkisp_stats_send_meas_v39(struct rkisp_isp_stats_vdev *stats_vdev, - struct rkisp_isp_readout_work *meas_work) +rkisp_stats_send_meas_fe(struct rkisp_isp_stats_vdev *stats_vdev) +{ + struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev; + struct rkisp_device *dev = stats_vdev->dev; + struct rkisp39_stat_buffer *stat_tmp_buf, *stat_buf = NULL; + struct rkisp_buffer *cur_buf = NULL; + unsigned long flags = 0; + u32 cur_frame_id, size = stats_vdev->vdev_fmt.fmt.meta.buffersize; + u32 val, ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS); + u32 mask = ISP3X_3A_RAWAF | ISP3X_3A_RAWHIST_CH0 | ISP3X_3A_RAWAE_CH0; + u64 ns; + + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + return; + + if (ris & mask) { + isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, ris & mask); + val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_BASE); + if (val & ISP39_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWAE_LITE_BASE, val); + val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_BASE); + if (val & ISP39_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWHIST_LITE_BASE, val); + val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL); + if (val & ISP39_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, val); + } + rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, &ns, true); + if (!ns) + ns = ktime_get_ns(); + spin_lock_irqsave(&stats_vdev->rd_lock, flags); + if (!list_empty(&stats_vdev->stat)) { + cur_buf = list_first_entry(&stats_vdev->stat, + struct rkisp_buffer, queue); + list_del(&cur_buf->queue); + } + spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); + + if (cur_buf) { + stat_buf = cur_buf->vaddr[0]; + stat_tmp_buf = stats_vdev->stats_buf[0].vaddr; + rkisp_finish_buffer(dev, &stats_vdev->stats_buf[0]); + stat_buf->frame_id = cur_frame_id; + stat_buf->params_id = params_vdev->cur_fe_frame_id; + stat_buf->stat.info2ddr.buf_fd = -1; + stat_buf->stat.info2ddr.owner = 0; + stat_buf->stat.buf_bay3d_iir_index = -1; + } + if (ris & ISP3X_3A_RAWAE_CH0 && stat_buf) { + memcpy(&stat_buf->stat.rawae0, + &stat_tmp_buf->stat.rawae0, sizeof(struct isp39_rawae_stat)); + stat_buf->meas_type |= ISP39_STAT_RAWAE0; + } + if (ris & ISP3X_3A_RAWHIST_CH0 && stat_buf) { + memcpy(&stat_buf->stat.rawhist0, + &stat_tmp_buf->stat.rawhist0, sizeof(struct isp39_rawhist_stat)); + stat_buf->meas_type |= ISP39_STAT_RAWHST0; + } + if (ris & ISP3X_3A_RAWAF && stat_buf) { + memcpy(&stat_buf->stat.rawaf, + &stat_tmp_buf->stat.rawaf, sizeof(struct isp39_rawaf_stat)); + stat_buf->meas_type |= ISP39_STAT_RAWAF; + } + if (stat_buf) + rkisp_stats_get_bay3d_stats(stats_vdev, stat_buf); + if (cur_buf) { + cur_buf->vb.sequence = cur_frame_id; + cur_buf->vb.vb2_buf.timestamp = ns; + vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size); + vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); + } + v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev, + "%s seq:%d params_id:%d ris:0x%x buf:%p meas_type:0x%x\n", + __func__, + cur_frame_id, params_vdev->cur_fe_frame_id, ris, + cur_buf, !stat_buf ? 0 : stat_buf->meas_type); +} + +static void +rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev) { struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev; struct rkisp_device *dev = stats_vdev->dev; struct rkisp_buffer *cur_buf = stats_vdev->cur_buf; - struct rkisp39_stat_buffer *cur_stat_buf = NULL; - u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize; - u32 cur_frame_id = meas_work->frame_id; + struct rkisp39_stat_buffer *stat_tmp_buf, *cur_stat_buf = NULL; + unsigned long flags = 0; + u32 cur_frame_id, size = stats_vdev->vdev_fmt.fmt.meta.buffersize; + u32 val, ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS); + u32 mask = ISP3X_3A_RAWAE_BIG | ISP3X_3A_RAWHIST_BIG | ISP3X_3A_RAWAWB | ISP3X_3A_DDR_DONE; + u64 ns; + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + mask |= ISP3X_3A_RAWAF | ISP3X_3A_RAWHIST_CH0 | ISP3X_3A_RAWAE_CH0; + if (ris & mask) { + isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, ris & mask); + if (dev->is_aiisp_en && !dev->is_aiisp_sync) { + val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_BIG1_BASE); + if (val & ISP39_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWAE_BIG1_BASE, val); + val = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_BIG1_BASE); + if (val & ISP39_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWHIST_BIG1_BASE, val); + val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL); + if (val & ISP39_3A_MEAS_DONE) + isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, val); + } + } + rkisp_dmarx_get_frame(dev, &cur_frame_id, NULL, &ns, !dev->is_aiisp_en); + if (!ns) + ns = ktime_get_ns(); + if (dev->is_aiisp_en && !dev->is_aiisp_sync) { + spin_lock_irqsave(&stats_vdev->rd_lock, flags); + if (!list_empty(&stats_vdev->stat)) { + cur_buf = list_first_entry(&stats_vdev->stat, + struct rkisp_buffer, queue); + list_del(&cur_buf->queue); + } + spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); + stat_tmp_buf = stats_vdev->stats_buf[0].vaddr; + rkisp_finish_buffer(dev, &stats_vdev->stats_buf[0]); + } if (!stats_vdev->rdbk_drop) { if (cur_buf) { cur_stat_buf = cur_buf->vaddr[0]; cur_stat_buf->frame_id = cur_frame_id; cur_stat_buf->params_id = params_vdev->cur_frame_id; + cur_stat_buf->stat.info2ddr.buf_fd = -1; + cur_stat_buf->stat.info2ddr.owner = 0; + cur_stat_buf->stat.buf_bay3d_iir_index = -1; } /* buffer done when frame of right handle */ if (dev->unite_div > ISP_UNITE_DIV1) { @@ -277,51 +404,54 @@ rkisp_stats_send_meas_v39(struct rkisp_isp_stats_vdev *stats_vdev, stats_vdev->cur_buf = stats_vdev->nxt_buf; stats_vdev->nxt_buf = NULL; } - rkisp_stats_update_buf(stats_vdev); + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + rkisp_stats_update_buf(stats_vdev); } } else { cur_buf = NULL; } - if (meas_work->isp3a_ris & ISP3X_3A_RAWAWB && cur_stat_buf) - cur_stat_buf->meas_type |= ISP39_STAT_RAWAWB; - - if (meas_work->isp3a_ris & ISP3X_3A_RAWAF && cur_stat_buf) + if (ris & (mask & ISP3X_3A_RAWAF) && cur_stat_buf) cur_stat_buf->meas_type |= ISP39_STAT_RAWAF; - - if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_BIG && cur_stat_buf) - cur_stat_buf->meas_type |= ISP39_STAT_RAWAE3; - - if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_BIG && cur_stat_buf) - cur_stat_buf->meas_type |= ISP39_STAT_RAWHST3; - - if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH0 && cur_stat_buf) + if (ris & (mask & ISP3X_3A_RAWAE_CH0) && cur_stat_buf) cur_stat_buf->meas_type |= ISP39_STAT_RAWAE0; - - if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH0 && cur_stat_buf) + if (ris & (mask & ISP3X_3A_RAWHIST_CH0) && cur_stat_buf) cur_stat_buf->meas_type |= ISP39_STAT_RAWHST0; - - if (meas_work->isp_ris & ISP3X_FRAME) { - rkisp_stats_get_dhaz_stats(stats_vdev, cur_stat_buf); - rkisp_stats_get_bay3d_stats(stats_vdev, cur_stat_buf); + if (ris & (mask & ISP3X_3A_RAWAE_BIG) && cur_stat_buf) { + cur_stat_buf->meas_type |= ISP39_STAT_RAWAE3; + if (dev->is_aiisp_en && !dev->is_aiisp_sync) + memcpy(&cur_stat_buf->stat.rawae3, + &stat_tmp_buf->stat.rawae3, sizeof(struct isp39_rawae_stat)); + } + if (ris & (mask & ISP3X_3A_RAWHIST_BIG) && cur_stat_buf) { + cur_stat_buf->meas_type |= ISP39_STAT_RAWHST3; + if (dev->is_aiisp_en && !dev->is_aiisp_sync) + memcpy(&cur_stat_buf->stat.rawhist3, + &stat_tmp_buf->stat.rawhist3, sizeof(struct isp39_rawhist_stat)); + } + if (ris & (mask & ISP3X_3A_RAWAWB) && cur_stat_buf) { + cur_stat_buf->meas_type |= ISP39_STAT_RAWAWB; + if (dev->is_aiisp_en && !dev->is_aiisp_sync) + memcpy(&cur_stat_buf->stat.rawawb, + &stat_tmp_buf->stat.rawawb, sizeof(struct isp39_rawawb_stat)); } + rkisp_stats_get_dhaz_stats(stats_vdev, cur_stat_buf); + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + rkisp_stats_get_bay3d_stats(stats_vdev, cur_stat_buf); + if (cur_buf && cur_stat_buf) { - cur_stat_buf->frame_id = cur_frame_id; - cur_stat_buf->params_id = params_vdev->cur_frame_id; - cur_stat_buf->stat.info2ddr.buf_fd = -1; - cur_stat_buf->stat.info2ddr.owner = 0; 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; + cur_buf->vb.vb2_buf.timestamp = ns; vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); } v4l2_dbg(4, rkisp_debug, &stats_vdev->dev->v4l2_dev, "%s seq:%d params_id:%d ris:0x%x buf:%p meas_type:0x%x\n", __func__, - cur_frame_id, params_vdev->cur_frame_id, meas_work->isp3a_ris, + cur_frame_id, params_vdev->cur_frame_id, ris, cur_buf, !cur_stat_buf ? 0 : cur_stat_buf->meas_type); } @@ -329,34 +459,11 @@ static void rkisp_stats_isr_v39(struct rkisp_isp_stats_vdev *stats_vdev, u32 isp_ris, u32 isp3a_ris) { - struct rkisp_isp_readout_work work; - u32 cur_frame_id, isp_mis_tmp = 0; - u32 temp_isp3a_ris; - - rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true); - - temp_isp3a_ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS); - isp_mis_tmp = temp_isp3a_ris; - if (isp_mis_tmp) { - isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, isp_mis_tmp); - - isp_mis_tmp &= isp3_stats_read(stats_vdev, ISP3X_ISP_3A_MIS); - if (isp_mis_tmp) - v4l2_err(stats_vdev->vnode.vdev.v4l2_dev, - "isp3A icr 3A info err: 0x%x 0x%x\n", - isp_mis_tmp, isp3a_ris); - } - rkisp_pdaf_isr(stats_vdev->dev); - - if (isp_ris & ISP3X_FRAME) { - work.readout = RKISP_ISP_READOUT_MEAS; - work.frame_id = cur_frame_id; - work.isp_ris = isp_ris; - work.isp3a_ris = temp_isp3a_ris; - work.timestamp = ktime_get_ns(); - rkisp_stats_send_meas_v39(stats_vdev, &work); - } + if (isp_ris & ISP3X_BAY3D_FRM_END) + rkisp_stats_send_meas_fe(stats_vdev); + if (isp_ris & ISP3X_FRAME) + rkisp_stats_send_meas(stats_vdev); } static void @@ -372,7 +479,6 @@ rkisp_get_stat_size_v39(struct rkisp_isp_stats_vdev *stats_vdev, static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = { .isr_hdl = rkisp_stats_isr_v39, - .send_meas = rkisp_stats_send_meas_v39, .get_stat_size = rkisp_get_stat_size_v39, }; @@ -397,7 +503,9 @@ void rkisp_stats_first_ddr_config_v39(struct rkisp_isp_stats_vdev *stats_vdev) return; } rkisp_unite_set_bits(dev, ISP3X_SWS_CFG, 0, ISP3X_3A_DDR_WRITE_EN, false); - val = ISP39_W3A_EN | ISP39_W3A_AUTO_CLR_EN | ISP39_W3A_FORCE_UPD; + val = ISP39_W3A_EN | ISP39_W3A_FORCE_UPD; + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + val |= ISP39_W3A_AUTO_CLR_EN; if (pdaf_vdev->streaming) { val |= ISP39_W3A_PDAF_EN; rkisp_pdaf_update_buf(dev); @@ -424,7 +532,8 @@ void rkisp_stats_next_ddr_config_v39(struct rkisp_isp_stats_vdev *stats_vdev) return; /* pingpong buf */ if (hw->is_single) { - rkisp_stats_update_buf(stats_vdev); + if (!dev->is_aiisp_en || dev->is_aiisp_sync) + rkisp_stats_update_buf(stats_vdev); if (pdaf_vdev->streaming) rkisp_pdaf_update_buf(dev); } diff --git a/drivers/media/platform/rockchip/isp/isp_stats_v3x.c b/drivers/media/platform/rockchip/isp/isp_stats_v3x.c index ad4dad12fa06..812e9b1fac1a 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats_v3x.c +++ b/drivers/media/platform/rockchip/isp/isp_stats_v3x.c @@ -965,9 +965,10 @@ rkisp_stats_send_meas_v3x(struct rkisp_isp_stats_vdev *stats_vdev, struct rkisp_stats_ops_v3x *ops = stats_vdev->priv_ops; struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev; u32 size = sizeof(struct rkisp3x_isp_stat_buffer); + unsigned long flags = 0; cur_frame_id = meas_work->frame_id; - spin_lock(&stats_vdev->rd_lock); + spin_lock_irqsave(&stats_vdev->rd_lock, flags); /* get one empty buffer */ if (!stats_vdev->rdbk_drop) { if (!list_empty(&stats_vdev->stat)) { @@ -976,7 +977,7 @@ rkisp_stats_send_meas_v3x(struct rkisp_isp_stats_vdev *stats_vdev, list_del(&cur_buf->queue); } } - spin_unlock(&stats_vdev->rd_lock); + spin_unlock_irqrestore(&stats_vdev->rd_lock, flags); if (cur_buf) { cur_stat_buf = cur_buf->vaddr[0]; @@ -1085,13 +1086,14 @@ rkisp_stats_isr_v3x(struct rkisp_isp_stats_vdev *stats_vdev, ISP3X_EXP_END | ISP3X_SIHST_RDY | ISP3X_AFM_SUM_OF | ISP3X_AFM_LUM_OF; u32 cur_frame_id, isp_mis_tmp = 0, iq_3a_mask = 0; u32 i, wr_buf_idx, temp_isp_ris, temp_isp3a_ris; + unsigned long flags = 0; rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true); if (IS_HDR_RDBK(dev->hdr.op_mode)) iq_3a_mask = ISP3X_3A_RAWAE_BIG; - spin_lock(&stats_vdev->irq_lock); + spin_lock_irqsave(&stats_vdev->irq_lock, flags); temp_isp_ris = readl(base + ISP3X_ISP_RIS); temp_isp3a_ris = readl(base + ISP3X_ISP_3A_RIS); @@ -1145,7 +1147,7 @@ rkisp_stats_isr_v3x(struct rkisp_isp_stats_vdev *stats_vdev, } unlock: - spin_unlock(&stats_vdev->irq_lock); + spin_unlock_irqrestore(&stats_vdev->irq_lock, flags); } static void diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c index d52e406d0fd8..6b1f297aa958 100644 --- a/drivers/media/platform/rockchip/isp/procfs.c +++ b/drivers/media/platform/rockchip/isp/procfs.c @@ -889,11 +889,13 @@ static void isp39_show(struct rkisp_device *dev, struct seq_file *p) seq_printf(p, "%-10s %s(0x%x 0x%x 0x%x) bypass:%d iirsparse:%d size:%d\n", "BAY3D", (val & 1) ? "ON" : "OFF", val, val1, val2, !!(val & BIT(1)), !!(val & BIT(2)), - priv ? priv->buf_3dnr_iir.size : 0); - val = rkisp_read(dev, ISP39_YUVME_CTRL, false); - seq_printf(p, "%-10s %s(0x%x) bypass:%d size:%d\n", - "YUVME", (val & 1) ? "ON" : "OFF", val, !!(val & BIT(1)), - priv ? priv->buf_3dnr_cur.size : 0); + priv->buf_bay3d_iir[0].size); + val = rkisp_read(dev, ISP3X_MI_RD_CTRL2, false); + seq_printf(p, "%-10s %s(0x%x) iir(idx:%d cnt:%d) gain(idx:%d cnt:%d) aiisp(idx:%d cnt:%d)\n", + "AINR", (val & ISP39_AIISP_EN) ? "ON" : "OFF", val, + priv->bay3d_iir_cur_idx, priv->bay3d_iir_cnt, + priv->gain_cur_idx, priv->gain_cnt, + priv->aiisp_cur_idx, priv->aiisp_cnt); val = rkisp_read(dev, ISP3X_YNR_GLOBAL_CTRL, false); seq_printf(p, "%-10s %s(0x%x) bypass(lospnr:%d hispnr:%d)\n", "YNR", (val & 1) ? "ON" : "OFF", val, @@ -1138,6 +1140,7 @@ static int isp_show(struct seq_file *p, void *v) struct rkisp_isp_subdev *sdev = &dev->isp_sdev; struct rkisp_sensor_info *sensor = dev->active_sensor; struct rkisp_stream *stream; + char info[128]; u32 val = 0; seq_printf(p, "%-10s ISP:0x%x Version:v%02x.%02x.%02x\n", @@ -1169,32 +1172,31 @@ static int isp_show(struct seq_file *p, void *v) if (!(dev->isp_state & ISP_START)) return 0; + if (!dev->is_aiisp_en) + snprintf(info, sizeof(info), "time:%dms", sdev->dbg.interval / 1000 / 1000); + else + snprintf(info, sizeof(info), "time(fe:%dms be:%dms)", + sdev->dbg.interval / 1000 / 1000, sdev->dbg.interval_be / 1000 / 1000); if (IS_HDR_RDBK(dev->hdr.op_mode)) { stream = &dev->dmarx_dev.stream[RKISP_STREAM_RAWRD2]; - seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms state:%s time:%dms frameloss:%d)" + seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms state:%s %s frameloss:%d)" " cnt(total:%d X1:%d X2:%d X3:%d) rd_bufcnt:%d\n", "Isp offline", dev->rd_mode - 3, dev->dmarx_dev.cur_frame.id, (u32)(dev->dmarx_dev.cur_frame.timestamp - dev->dmarx_dev.pre_frame.timestamp) / 1000 / 1000, (dev->isp_state & ISP_FRAME_END) ? "idle" : "working", - sdev->dbg.interval / 1000 / 1000, - sdev->dbg.frameloss, - dev->rdbk_cnt, - dev->rdbk_cnt_x1, - dev->rdbk_cnt_x2, - dev->rdbk_cnt_x3, + info, sdev->dbg.frameloss, + dev->rdbk_cnt, dev->rdbk_cnt_x1, dev->rdbk_cnt_x2, dev->rdbk_cnt_x3, rkisp_stream_buf_cnt(stream)); seq_printf(p, "\t hw link:%d idle:%d vir(mode:%d index:%d)\n", dev->hw_dev->dev_link_num, dev->hw_dev->is_idle, dev->multi_mode, dev->multi_index); } else { - seq_printf(p, "%-10s frame:%d state:%s time:%dms v-blank:%dus\n", - "Isp online", - sdev->dbg.id, + seq_printf(p, "%-10s frame:%d state:%s %s v-blank:%dus\n", + "Isp online", sdev->dbg.id, (dev->isp_state & ISP_FRAME_END) ? "idle" : "working", - sdev->dbg.interval / 1000 / 1000, - sdev->dbg.delay / 1000); + info, sdev->dbg.delay / 1000); } if (dev->br_dev.en) seq_printf(p, "%-10s rkispp%d Format:%s%s Size:%dx%d (frame:%d rate:%dms frameloss:%d)\n", diff --git a/drivers/media/platform/rockchip/isp/regs_v3x.h b/drivers/media/platform/rockchip/isp/regs_v3x.h index 93d4f3056033..a2817e6f8ad2 100644 --- a/drivers/media/platform/rockchip/isp/regs_v3x.h +++ b/drivers/media/platform/rockchip/isp/regs_v3x.h @@ -3018,6 +3018,7 @@ #define ISP32L_AXI_CONF_RD_DONE BIT(31) /* CSI2RX */ +#define ISP3X_RXSELF_FORCE_UPD BIT(31) /* DEBAYER */ diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 95a0f4eedc4e..66e87bbc3e37 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -42,8 +42,6 @@ #include #include #include -#include -#include #include #include #include @@ -88,6 +86,8 @@ static void rkisp_config_cmsk(struct rkisp_device *dev); static void rkisp_config_aiisp(struct rkisp_device *dev); static void rkisp_config_fpn(struct rkisp_device *dev); +static void rkisp_dvbm_start_event(struct rkisp_device *dev); +static int rkisp_rdbk_aiisp_event(struct rkisp_device *dev, u32 cmd, void *arg); static inline struct rkisp_device *sd_to_isp_dev(struct v4l2_subdev *sd) { @@ -801,13 +801,14 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo if (hw->unite != ISP_UNITE_ONE || dev->unite_index == ISP_UNITE_LEFT) { rkisp_params_first_cfg(&dev->params_vdev, &dev->isp_sdev.in_fmt, dev->isp_sdev.quantization); - rkisp_params_cfg(params_vdev, cur_frame_id); + rkisp_params_cfg(params_vdev, cur_frame_id, RKISP_PARAMS_IMD); rkisp_config_cmsk(dev); rkisp_config_aiisp(dev); - rkisp_stream_frame_start(dev, 0); + if (!dev->is_aiisp_en) + rkisp_stream_frame_start(dev, 0); } - if (dev->isp_ver == ISP_V39) + if (!dev->is_aiisp_en) rkisp_sditf_sof(dev, 0); if (!hw->is_single) { @@ -943,7 +944,8 @@ run_next: if (is_3dlut_upd) rkisp_unite_write(dev, ISP_3DLUT_UPDATE, 1, true); - rkisp_check_mi_ends_mask(dev); + if (!dev->is_aiisp_en) + rkisp_check_mi_ends_mask(dev); if (hw->is_frm_buf) { val = ISP32L_WR_FRM_BUF_EN | ISP32L_RD_FRM_BUF_EN | @@ -1066,7 +1068,7 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd) goto end; if (hw->monitor.state & ISP_MIPI_ERROR && hw->monitor.is_en) goto end; - if (dev->is_suspend) { + if (dev->is_suspend && (!dev->is_aiisp_en || dev->is_aiisp_sync)) { if (dev->suspend_sync) complete(&dev->pm_cmpl); goto end; @@ -1085,7 +1087,8 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd) } /* wait 2 frame to start isp for fast */ - if (dev->is_rtt_first && max == 1 && !atomic_read(&dev->isp_sdev.frm_sync_seq)) + if (dev->is_rtt_first && max == 1 && + dev->dmarx_dev.cur_frame.id == -1) goto end; if (max) { @@ -1101,8 +1104,6 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd) isp->dmarx_dev.cur_frame.id = t.frame_id; isp->dmarx_dev.cur_frame.sof_timestamp = t.sof_timestamp; isp->dmarx_dev.cur_frame.timestamp = t.frame_timestamp; - isp->isp_sdev.frm_timestamp = t.sof_timestamp; - atomic_set(&isp->isp_sdev.frm_sync_seq, t.frame_id + 1); mode = t.mode; times = t.times; hw->cur_dev_id = id; @@ -1260,31 +1261,10 @@ static void rkisp_multi_online_switch(struct rkisp_device *dev) } } -void rkisp_check_idle(struct rkisp_device *dev, u32 irq) +static void rkisp_frame_end_idle(struct rkisp_device *dev) { struct rkisp_hw_dev *hw = dev->hw_dev; - unsigned long lock_flags = 0; - u32 val = 0; - - if (hw->is_single && !IS_HDR_RDBK(dev->rd_mode)) - return; - - spin_lock_irqsave(&dev->hw_dev->rdbk_lock, lock_flags); - dev->irq_ends |= (irq & dev->irq_ends_mask); - v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev, - "%s irq:0x%x ends:0x%x mask:0x%x\n", - __func__, irq, dev->irq_ends, dev->irq_ends_mask); - if (dev->irq_ends == dev->irq_ends_mask && dev->hw_dev->monitor.is_en) { - dev->hw_dev->monitor.retry = 0; - dev->hw_dev->monitor.state |= ISP_FRAME_END; - if (!completion_done(&dev->hw_dev->monitor.cmpl)) - complete(&dev->hw_dev->monitor.cmpl); - } - if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask) { - spin_unlock_irqrestore(&dev->hw_dev->rdbk_lock, lock_flags); - return; - } - spin_unlock_irqrestore(&dev->hw_dev->rdbk_lock, lock_flags); + u32 val; /* two virtual isp online frame end switch to other isp */ if (!hw->is_single && !IS_HDR_RDBK(dev->rd_mode)) @@ -1297,7 +1277,6 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq) rkisp_fast_switch_rx_buf(dev, true); dev->is_rtt_first = false; dev->skip_frame = 0; - dev->irq_ends = 0; return; } @@ -1333,12 +1312,11 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq) fallthrough; default:// for rd2 val |= RAW2_RD_FRAME; - /* FALLTHROUGH */ + break; } rkisp2_rawrd_isr(val, dev); end: - dev->irq_ends = 0; if (dev->is_wait_aiq && (dev->unite_div < ISP_UNITE_DIV2 || dev->unite_index == ISP_UNITE_RIGHT)) return; @@ -1350,6 +1328,81 @@ end: wake_up(&dev->sync_onoff); } +static void rkisp_front_end_idle(struct rkisp_device *dev) +{ + u32 val = 0; + + switch (dev->rd_mode) { + case HDR_RDBK_FRAME3://for rd1 rd0 rd2 + val |= RAW1_RD_FRAME; + fallthrough; + case HDR_RDBK_FRAME2://for rd0 rd2 + val |= RAW0_RD_FRAME; + fallthrough; + default:// for rd2 + val |= RAW2_RD_FRAME; + break; + } + rkisp2_rawrd_isr(val, dev); + rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL); + if (dev->isp_state == ISP_STOP && dev->hw_dev->is_idle) + wake_up(&dev->sync_onoff); +} + +static void rkisp_back_end_idle(struct rkisp_device *dev) +{ + rkisp_rdbk_aiisp_event(dev, T_CMD_END, NULL); + if (dev->isp_state == ISP_STOP && dev->hw_dev->is_idle) + wake_up(&dev->sync_onoff); +} + +void rkisp_check_idle(struct rkisp_device *dev, u32 irq) +{ + struct rkisp_hw_dev *hw = dev->hw_dev; + unsigned long lock_flags = 0; + bool isp_frame_end = false; + bool isp_front_end = false; + bool isp_back_end = false; + + spin_lock_irqsave(&hw->rdbk_lock, lock_flags); + dev->irq_ends |= (irq & dev->irq_ends_mask); + dev->irq_f_ends |= (irq & dev->irq_f_ends_mask); + v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev, + "%s irq:0x%x (0x%x 0x%x) (0x%x 0x%x)\n", + __func__, irq, + dev->irq_f_ends, dev->irq_f_ends_mask, + dev->irq_ends, dev->irq_ends_mask); + if ((dev->irq_ends & dev->irq_ends_mask) == dev->irq_ends_mask) { + dev->irq_ends = 0; + if (dev->is_aiisp_en) { + isp_back_end = true; + if (dev->is_aiisp_sync) + isp_frame_end = true; + } else { + isp_frame_end = true; + } + } + if (dev->is_aiisp_en && !dev->is_aiisp_sync && + (dev->irq_f_ends & dev->irq_f_ends_mask) == dev->irq_f_ends_mask) { + dev->irq_f_ends = 0; + isp_front_end = true; + } + spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags); + + if (isp_frame_end) { + if (hw->is_single && !IS_HDR_RDBK(dev->rd_mode)) + return; + rkisp_frame_end_idle(dev); + } + if (isp_front_end) { + if (hw->is_single && !IS_HDR_RDBK(dev->rd_mode)) + return; + rkisp_front_end_idle(dev); + } + if (isp_back_end) + rkisp_back_end_idle(dev); +} + static void rkisp_set_state(u32 *state, u32 val) { u32 mask = 0xffff; @@ -1971,6 +2024,8 @@ static int rkisp_config_isp(struct rkisp_device *dev) irq_mask |= ISP2X_LSC_LUT_ERR; if (dev->is_pre_on) irq_mask |= CIF_ISP_FRAME_IN; + if (dev->is_aiisp_en) + irq_mask |= ISP3X_BAY3D_FRM_END; rkisp_unite_set_bits(dev, CIF_ISP_IMSC, 0, irq_mask, true); if ((dev->isp_ver == ISP_V20 || @@ -2319,14 +2374,17 @@ static int rkisp_isp_stop(struct rkisp_device *dev) end: dev->is_frm_rd = false; dev->irq_ends_mask = 0; + dev->irq_f_ends_mask = 0; dev->hdr.op_mode = 0; dev->sw_rd_cnt = 0; + dev->dmarx_dev.cur_be_frame.id = -1; + dev->dmarx_dev.cur_frame.id = -1; dev->stats_vdev.rdbk_drop = false; dev->is_multi_one_sync = false; rkisp_set_state(&dev->isp_state, ISP_STOP); - if (dev->isp_ver >= ISP_V20) - kfifo_reset(&dev->rdbk_kfifo); + kfifo_reset(&dev->rdbk_kfifo); + kfifo_reset(&dev->rdbk_be_kfifo); if (dev->isp_ver == ISP_V30 || dev->isp_ver == ISP_V32 || dev->isp_ver == ISP_V33) memset(&dev->cmsk_cfg, 0, sizeof(dev->cmsk_cfg)); @@ -2387,6 +2445,8 @@ static int rkisp_isp_start(struct rkisp_device *dev) dev->isp_err_cnt = 0; dev->isp_isr_cnt = 0; dev->irq_ends_mask |= ISP_FRAME_END; + if (dev->is_aiisp_en && !dev->is_aiisp_sync) + dev->irq_f_ends_mask |= ISP_FRAME_BNR; dev->irq_ends = 0; v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, @@ -3061,50 +3121,6 @@ err: return -EINVAL; } -static void rkisp_isp_read_add_fifo_data(struct rkisp_device *dev) -{ - struct v4l2_device *v4l2_dev = &dev->v4l2_dev; - void __iomem *base = dev->base_addr; - u32 mipi_status = 0; - u32 data_len = 0; - u32 fifo_data = 0; - u32 i, idx, cur_frame_id; - - if (dev->isp_ver != ISP_V10 && - dev->isp_ver != ISP_V10_1) - return; - - cur_frame_id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1; - idx = dev->emd_data_idx; - dev->emd_data_fifo[idx].frame_id = 0; - kfifo_reset_out(&dev->emd_data_fifo[idx].mipi_kfifo); - for (i = 0; i < CIFISP_ADD_DATA_FIFO_SIZE / 4; i++) { - mipi_status = readl(base + CIF_MIPI_STATUS); - if (!(mipi_status & 0x01)) - break; - - fifo_data = readl(base + CIF_MIPI_ADD_DATA_FIFO); - kfifo_in(&dev->emd_data_fifo[idx].mipi_kfifo, - &fifo_data, sizeof(fifo_data)); - data_len += 4; - - if (kfifo_is_full(&dev->emd_data_fifo[idx].mipi_kfifo)) - v4l2_warn(v4l2_dev, "%s: mipi_kfifo is full!\n", - __func__); - } - - if (data_len) { - dev->emd_data_fifo[idx].frame_id = cur_frame_id; - dev->emd_data_fifo[idx].data_len = data_len; - dev->emd_data_idx = (idx + 1) % RKISP_EMDDATA_FIFO_MAX; - } - - v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, - "emd kfifo size: %d, frame_id %d\n", - kfifo_len(&dev->emd_data_fifo[idx].mipi_kfifo), - dev->emd_data_fifo[idx].frame_id); -} - static void rkisp_global_update_mi(struct rkisp_device *dev) { struct rkisp_stream *stream; @@ -3135,7 +3151,6 @@ static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on) { struct rkisp_device *isp_dev = sd_to_isp_dev(sd); struct rkisp_hw_dev *hw_dev = isp_dev->hw_dev; - int ret; if (!on) { if (IS_HDR_RDBK(isp_dev->rd_mode)) { @@ -3148,17 +3163,9 @@ static int rkisp_isp_sd_s_stream(struct v4l2_subdev *sd, int on) wake_up(&s->done); } } - ret = wait_event_timeout(isp_dev->sync_onoff, - isp_dev->isp_state & ISP_STOP || - !IS_HDR_RDBK(isp_dev->rd_mode), - msecs_to_jiffies(500)); - if (!ret) - v4l2_warn(&isp_dev->v4l2_dev, "%s wait timeout, mode:%d state:0x%x\n", - __func__, isp_dev->rd_mode, isp_dev->isp_state); rkisp_isp_stop(isp_dev); atomic_dec(&hw_dev->refcnt); rkisp_params_stream_stop(&isp_dev->params_vdev); - atomic_set(&isp_dev->isp_sdev.frm_sync_seq, 0); rkisp_stop_3a_run(isp_dev); return 0; } @@ -3671,15 +3678,22 @@ static int rkisp_subdev_fmt_link_validate(struct v4l2_subdev *sd, #endif void -rkisp_isp_queue_event_sof(struct rkisp_isp_subdev *isp) +rkisp_isp_queue_event_sof(struct rkisp_device *dev) { - struct v4l2_event event = { - .type = V4L2_EVENT_FRAME_SYNC, - .u.frame_sync.frame_sequence = - atomic_inc_return(&isp->frm_sync_seq) - 1, - }; + struct v4l2_event event = { 0 }; + unsigned long flag = 0; + u64 ns = rkisp_time_get_ns(dev); + u32 seq; - v4l2_event_queue(isp->sd.devnode, &event); + spin_lock_irqsave(&dev->rdbk_lock, flag); + seq = ++dev->dmarx_dev.cur_frame.id; + dev->dmarx_dev.cur_frame.timestamp = ns; + spin_unlock_irqrestore(&dev->rdbk_lock, flag); + + event.type = V4L2_EVENT_FRAME_SYNC; + event.u.frame_sync.frame_sequence = seq; + + v4l2_event_queue(dev->isp_sdev.sd.devnode, &event); } static int rkisp_isp_sd_subs_evt(struct v4l2_subdev *sd, struct v4l2_fh *fh, @@ -3804,56 +3818,10 @@ 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 h = dev->isp_sdev.out_crop.height; u32 wr_line, rd_line, irq, irq_mask, en, en_mask; spin_lock_irqsave(&dev->aiisp_lock, lock_flags); @@ -3872,8 +3840,14 @@ static void rkisp_config_aiisp(struct rkisp_device *dev) 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; + if (dev->aiisp_cfg.rd_linecnt >= h) + rd_line = h - 1; + else + rd_line = dev->aiisp_cfg.rd_linecnt; + if (dev->aiisp_cfg.wr_linecnt >= h) + wr_line = (h - 1) << 16; + else + 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); @@ -3888,16 +3862,13 @@ 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; - dev->is_aiisp_en = en; + dev->is_aiisp_en = !!cfg->mode; dev->is_aiisp_upd = true; - memcpy(&dev->aiisp_cfg, cfg, sizeof(*cfg)); + dev->aiisp_cfg = *cfg; spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags); return 0; } @@ -3911,28 +3882,116 @@ static int rkisp_get_aiisp_linecnt(struct rkisp_device *dev, return -EINVAL; spin_lock_irqsave(&dev->aiisp_lock, lock_flags); - memcpy(cfg, &dev->aiisp_cfg, sizeof(*cfg)); + *cfg = dev->aiisp_cfg; spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags); return 0; } -static void rkisp_aiisp_rd_start(struct rkisp_device *dev) +static void rkisp_aiisp_irq_event(struct rkisp_device *dev, u32 irq) { - u32 val; + if (!(dev->isp_state & ISP_START) && irq == ISP39_AIISP_LINECNT_DONE) + return; + rkisp_params_aiisp_event(&dev->params_vdev, irq); +} + +static int rkisp_rdbk_aiisp_handle(struct rkisp_device *dev, u32 cmd) +{ + struct rkisp_hw_dev *hw = dev->hw_dev; + struct rkisp_device *isp = NULL; + struct rkisp_aiisp_st st = { 0 }; + unsigned long lock_flags = 0; + int i, max = 0, id = 0, ret = 0; + int len[DEV_MAX] = { 0 }; + + spin_lock_irqsave(&hw->rdbk_lock, lock_flags); + if (cmd == T_CMD_END) + hw->is_be_idle = true; + if (hw->is_shutdown) + hw->is_be_idle = false; + if (!hw->is_be_idle) + goto end; + if (dev->is_suspend) { + if (dev->suspend_sync) + complete(&dev->pm_cmpl); + goto end; + } + + for (i = 0; i < hw->dev_num; i++) { + isp = hw->isp[i]; + if (!isp || + (isp && (!(isp->isp_state & ISP_START) || isp->is_suspend))) + continue; + rkisp_rdbk_aiisp_event(isp, T_CMD_LEN, &len[i]); + if (max < len[i]) { + max = len[i]; + id = i; + } + } + if (max) { + isp = hw->isp[id]; + v4l2_dbg(2, rkisp_debug, &isp->v4l2_dev, + "aiisp fifo len:%d\n", max); + rkisp_rdbk_aiisp_event(isp, T_CMD_DEQUEUE, &st); + isp->dmarx_dev.cur_be_frame.id = st.sequence; + isp->dmarx_dev.cur_be_frame.timestamp = st.timestamp; + hw->cur_be_dev_id = id; + hw->is_be_idle = false; + } +end: + spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags); + if (max) { + isp->isp_sdev.dbg.timestamp_be = rkisp_time_get_ns(dev); + ret = rkisp_params_aiisp_start(&isp->params_vdev, &st); + if (ret == 0) { + rkisp_stream_frame_start(dev, 0); + rkisp_dvbm_start_event(dev); + rkisp_rockit_frame_start(dev); + rkisp_sditf_sof(dev, 0); + + rkisp_check_mi_ends_mask(dev); + rkisp_set_bits(dev, ISP3X_MI_RD_CTRL2, 0, ISP39_AIISP_ST, true); + } + } + return ret; +} + +static int rkisp_rdbk_aiisp_event(struct rkisp_device *dev, u32 cmd, void *arg) +{ + struct kfifo *fifo = &dev->rdbk_be_kfifo; + unsigned long lock_flags = 0; + int val, ret = 0; 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); + return -EINVAL; + + spin_lock_irqsave(&dev->rdbk_lock, lock_flags); + switch (cmd) { + case T_CMD_QUEUE: + if (!arg) + break; + if (!kfifo_is_full(fifo)) + kfifo_in(fifo, arg, sizeof(struct rkisp_aiisp_st)); + else + v4l2_err(&dev->v4l2_dev, "rdbk aiisp fifo is full\n"); + break; + case T_CMD_DEQUEUE: + if (!kfifo_is_empty(fifo)) + ret = kfifo_out(fifo, arg, sizeof(struct rkisp_aiisp_st)); + if (!ret) + ret = -EINVAL; + break; + case T_CMD_LEN: + val = kfifo_len(fifo) / sizeof(struct rkisp_aiisp_st); + *(u32 *)arg = val; + break; + default: + break; } - v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, - "%s 0x%x:0x%x\n", __func__, ISP39_AIISP_LINE_CNT, val); + spin_unlock_irqrestore(&dev->rdbk_lock, lock_flags); + + if (cmd == T_CMD_QUEUE || cmd == T_CMD_END) + ret = rkisp_rdbk_aiisp_handle(dev, cmd); + return ret; } static int rkisp_set_offline_raw_buf_cnt(struct rkisp_device *dev, int *cnt) @@ -4064,14 +4123,18 @@ err: static int rkisp_vicap_sof(struct rkisp_device *dev, struct rkisp_vicap_sof *sof) { + unsigned long flag = 0; + dev->vicap_sof = *sof; + spin_lock_irqsave(&dev->rdbk_lock, flag); if (!IS_HDR_RDBK(dev->rd_mode) && - sof->sequence - atomic_read(&dev->isp_sdev.frm_sync_seq) > 0) { - v4l2_dbg(4, rkisp_debug, &dev->v4l2_dev, + sof->sequence - dev->dmarx_dev.cur_frame.id > 1) { + v4l2_dbg(3, rkisp_debug, &dev->v4l2_dev, "vicap sof %d, isp sof %d\n", - sof->sequence, atomic_read(&dev->isp_sdev.frm_sync_seq)); - atomic_set(&dev->isp_sdev.frm_sync_seq, sof->sequence); + sof->sequence, dev->dmarx_dev.cur_frame.id); + dev->dmarx_dev.cur_frame.id = sof->sequence; } + spin_unlock_irqrestore(&dev->rdbk_lock, flag); return 0; } @@ -4090,8 +4153,7 @@ 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_AIISP_RD_START)) + cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM)) return -EINVAL; switch (cmd) { @@ -4232,6 +4294,9 @@ 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_INIT_BNR_BUF: + ret = rkisp_params_init_bnr_buf(&isp_dev->params_vdev, arg); + break; case RKISP_CMD_SET_AIISP_LINECNT: ret = rkisp_set_aiisp_linecnt(isp_dev, arg); break; @@ -4239,7 +4304,8 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) ret = rkisp_get_aiisp_linecnt(isp_dev, arg); break; case RKISP_CMD_AIISP_RD_START: - rkisp_aiisp_rd_start(isp_dev); + if (isp_dev->isp_state & ISP_START) + ret = rkisp_rdbk_aiisp_event(isp_dev, T_CMD_QUEUE, arg); break; case RKISP_CMD_SET_OFFLINE_RAW_BUFCNT: ret = rkisp_set_offline_raw_buf_cnt(isp_dev, arg); @@ -4278,8 +4344,7 @@ 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_AIISP_RD_START) + cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM) return -EINVAL; switch (cmd) { @@ -4297,7 +4362,6 @@ 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); @@ -4340,6 +4404,11 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, size = sizeof(struct rkisp_bay3dbuf_info); cp_t_us = true; break; + case RKISP_CMD_INIT_BNR_BUF: + size = sizeof(struct rkisp_bnr_buf_info); + cp_t_us = true; + cp_f_us = true; + break; case RKISP_CMD_SET_AIISP_LINECNT: size = sizeof(struct rkisp_aiisp_cfg); cp_f_us = true; @@ -4348,6 +4417,10 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, size = sizeof(struct rkisp_aiisp_cfg); cp_t_us = true; break; + case RKISP_CMD_AIISP_RD_START: + size = sizeof(struct rkisp_aiisp_st); + cp_f_us = true; + break; case RKISP_CMD_SET_OFFLINE_RAW_BUFCNT: case RKISP_CMD_SET_ONLINE_HDR_WRAP_LINE: size = sizeof(int); @@ -4463,6 +4536,12 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev, v4l2_err(v4l2_dev, "Failed to alloc csi kfifo %d", ret); return ret; } + ret = kfifo_alloc(&isp_dev->rdbk_be_kfifo, + 16 * sizeof(struct rkisp_aiisp_st), GFP_KERNEL); + if (ret < 0) { + v4l2_err(v4l2_dev, "Failed to alloc aiisp kfifo %d", ret); + goto free_kfifo; + } v4l2_subdev_init(sd, &rkisp_isp_sd_ops); sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; @@ -4475,10 +4554,9 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev, isp_sdev->pads[RKISP_ISP_PAD_SINK_PARAMS].flags = MEDIA_PAD_FL_SINK; isp_sdev->pads[RKISP_ISP_PAD_SOURCE_PATH].flags = MEDIA_PAD_FL_SOURCE; isp_sdev->pads[RKISP_ISP_PAD_SOURCE_STATS].flags = MEDIA_PAD_FL_SOURCE; - ret = media_entity_pads_init(&sd->entity, RKISP_ISP_PAD_MAX, - isp_sdev->pads); + ret = media_entity_pads_init(&sd->entity, RKISP_ISP_PAD_MAX, isp_sdev->pads); if (ret < 0) - goto free_kfifo; + goto free_be_kfifo; sd->owner = THIS_MODULE; v4l2_set_subdevdata(sd, isp_dev); @@ -4501,6 +4579,8 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev, return 0; err_cleanup_media_entity: media_entity_cleanup(&sd->entity); +free_be_kfifo: + kfifo_free(&isp_dev->rdbk_be_kfifo); free_kfifo: kfifo_free(&isp_dev->rdbk_kfifo); return ret; @@ -4510,6 +4590,7 @@ void rkisp_unregister_isp_subdev(struct rkisp_device *isp_dev) { struct v4l2_subdev *sd = &isp_dev->isp_sdev.sd; + kfifo_free(&isp_dev->rdbk_be_kfifo); kfifo_free(&isp_dev->rdbk_kfifo); v4l2_device_unregister_subdev(sd); media_entity_cleanup(&sd->entity); @@ -4843,7 +4924,8 @@ void rkisp_isp_isr(unsigned int isp_mis, complete(&dev->hw_dev->monitor.cmpl); } - rkisp_dvbm_start_event(dev); + if (!dev->is_aiisp_en) + rkisp_dvbm_start_event(dev); if (IS_HDR_RDBK(dev->hdr.op_mode)) { /* disabled frame end to read 3dlut for multi sensor * 3dlut will update at isp readback @@ -4855,7 +4937,7 @@ void rkisp_isp_isr(unsigned int isp_mis, } rkisp_stats_rdbk_enable(&dev->stats_vdev, true); goto vs_skip; - } else if (!hw->is_single) { + } else if (!hw->is_single && !dev->is_aiisp_en) { rkisp_check_mi_ends_mask(dev); if (dev->unite_index == ISP_UNITE_RIGHT) goto vs_skip; @@ -4884,12 +4966,12 @@ void rkisp_isp_isr(unsigned int isp_mis, if (isp_mis & CIF_ISP_FRAME) sof_event_later = true; if (dev->vs_irq < 0 && !sof_event_later) { - dev->isp_sdev.frm_timestamp = rkisp_time_get_ns(dev); - rkisp_isp_queue_event_sof(&dev->isp_sdev); - rkisp_stream_frame_start(dev, isp_mis); - if (dev->isp_ver == ISP_V39) + rkisp_isp_queue_event_sof(dev); + if (!dev->is_aiisp_en) { + rkisp_stream_frame_start(dev, isp_mis); rkisp_sditf_sof(dev, isp_mis); - rkisp_rockit_frame_start(dev); + rkisp_rockit_frame_start(dev); + } } vs_skip: writel(CIF_ISP_V_START, base + CIF_ISP_ICR); @@ -4901,7 +4983,7 @@ vs_skip: 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); + rkisp_aiisp_irq_event(dev, ISP39_AIISP_LINECNT_DONE); } if ((isp_mis & (CIF_ISP_DATA_LOSS | CIF_ISP_PIC_SIZE_ERROR))) { @@ -4961,7 +5043,6 @@ vs_skip: if (isp_mis & CIF_ISP_FRAME_IN) { dev->isp_sdev.dbg.interval = rkisp_time_get_ns(dev) - dev->isp_sdev.dbg.timestamp; - rkisp_set_state(&dev->isp_state, ISP_FRAME_IN); writel(CIF_ISP_FRAME_IN, base + CIF_ISP_ICR); isp_mis_tmp = readl(base + CIF_ISP_MIS); if (isp_mis_tmp & CIF_ISP_FRAME_IN) @@ -4972,7 +5053,10 @@ vs_skip: /* frame was completely put out */ if (isp_mis & CIF_ISP_FRAME) { dev->rawaf_irq_cnt = 0; - if (!dev->is_pre_on || !IS_HDR_RDBK(dev->rd_mode)) + if (dev->is_aiisp_en) + dev->isp_sdev.dbg.interval_be = + rkisp_time_get_ns(dev) - dev->isp_sdev.dbg.timestamp_be; + else if (!dev->is_pre_on || !IS_HDR_RDBK(dev->rd_mode)) dev->isp_sdev.dbg.interval = rkisp_time_get_ns(dev) - dev->isp_sdev.dbg.timestamp; /* Clear Frame In (ISP) */ @@ -4982,8 +5066,7 @@ vs_skip: if (isp_mis_tmp & CIF_ISP_FRAME) v4l2_err(&dev->v4l2_dev, "isp icr frame end err: 0x%x\n", isp_mis_tmp); - rkisp_dmarx_get_frame(dev, &dev->isp_sdev.dbg.id, NULL, NULL, true); - rkisp_isp_read_add_fifo_data(dev); + rkisp_dmarx_get_frame(dev, &dev->isp_sdev.dbg.id, NULL, NULL, !dev->is_aiisp_en); dev->isp_err_cnt = 0; dev->isp_state &= ~ISP_ERROR; @@ -4991,14 +5074,12 @@ vs_skip: } if (isp_mis & CIF_ISP_V_START) { - if (dev->isp_state & ISP_FRAME_END) { - u64 tmp = dev->isp_sdev.dbg.interval + - dev->isp_sdev.dbg.timestamp; + u64 tmp = dev->isp_sdev.dbg.interval + dev->isp_sdev.dbg.timestamp; + + dev->isp_sdev.dbg.timestamp = rkisp_time_get_ns(dev); + /* v-blank: frame(N)start - frame(N-1)end */ + dev->isp_sdev.dbg.delay = dev->isp_sdev.dbg.timestamp - tmp; - dev->isp_sdev.dbg.timestamp = rkisp_time_get_ns(dev); - /* v-blank: frame(N)start - frame(N-1)end */ - dev->isp_sdev.dbg.delay = dev->isp_sdev.dbg.timestamp - tmp; - } rkisp_set_state(&dev->isp_state, ISP_FRAME_VS); if (dev->procfs.is_fs_wait) { dev->procfs.is_fs_wait = false; @@ -5006,17 +5087,25 @@ vs_skip: } } + if (isp_mis & ISP3X_OUT_FRM_QUARTER) { + writel(ISP3X_OUT_FRM_QUARTER, base + CIF_ISP_ICR); + rkisp_aiisp_irq_event(dev, ISP3X_OUT_FRM_QUARTER); + } + + if (isp_mis & ISP3X_BAY3D_FRM_END) { + writel(ISP3X_BAY3D_FRM_END, base + CIF_ISP_ICR); + if (dev->is_aiisp_en) + dev->isp_sdev.dbg.interval = + rkisp_time_get_ns(dev) - dev->isp_sdev.dbg.timestamp; + rkisp_stats_isr(&dev->stats_vdev, ISP3X_BAY3D_FRM_END, 0); + rkisp_params_isr(&dev->params_vdev, ISP3X_BAY3D_FRM_END); + rkisp_check_idle(dev, ISP_FRAME_BNR); + } + if ((isp_mis & (CIF_ISP_FRAME | si3a_isr_mask)) || (isp3a_mis & raw3a_isr_mask)) { - u32 irq = isp_mis; - - /* FRAME to get EXP and HIST together */ - if (isp_mis & CIF_ISP_FRAME) - irq |= ((CIF_ISP_EXP_END | - CIF_ISP_HIST_MEASURE_RDY) & - readl(base + CIF_ISP_RIS)); - - rkisp_stats_isr(&dev->stats_vdev, irq, isp3a_mis); + isp_mis_tmp = isp_mis & (CIF_ISP_FRAME | si3a_isr_mask); + rkisp_stats_isr(&dev->stats_vdev, isp_mis_tmp, isp3a_mis); if ((isp_mis & CIF_ISP_FRAME) && dev->stats_vdev.rdbk_mode) rkisp_stats_rdbk_enable(&dev->stats_vdev, false); @@ -5044,40 +5133,40 @@ vs_skip: * lot of register writes. Do those only one per frame. * Do the updates in the order of the processing flow. */ - if (isp_mis & (CIF_ISP_V_START | CIF_ISP_FRAME)) - rkisp_params_isr(&dev->params_vdev, isp_mis); - + if (isp_mis & (CIF_ISP_V_START | CIF_ISP_FRAME)) { + isp_mis_tmp = isp_mis & (CIF_ISP_V_START | CIF_ISP_FRAME); + rkisp_params_isr(&dev->params_vdev, isp_mis_tmp); + } /* cur frame end and next frame start irq togeter */ if (dev->vs_irq < 0 && sof_event_later) { - dev->isp_sdev.frm_timestamp = rkisp_time_get_ns(dev); - rkisp_isp_queue_event_sof(&dev->isp_sdev); - rkisp_stream_frame_start(dev, isp_mis); - rkisp_rockit_frame_start(dev); - if (dev->isp_ver == ISP_V39) + rkisp_isp_queue_event_sof(dev); + if (!dev->is_aiisp_en) { + rkisp_stream_frame_start(dev, isp_mis); + rkisp_rockit_frame_start(dev); rkisp_sditf_sof(dev, isp_mis); + } } - 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) { writel(ISP3X_OUT_FRM_HALF, base + CIF_ISP_ICR); - rkisp_dvbm_event(dev, ISP3X_OUT_FRM_HALF); rkisp_stream_buf_done_early(dev); } - if (isp_mis & ISP3X_OUT_FRM_END) { + if (isp_mis & ISP3X_OUT_FRM_END) writel(ISP3X_OUT_FRM_END, base + CIF_ISP_ICR); - rkisp_dvbm_event(dev, ISP3X_OUT_FRM_END); - } if ((isp_mis & ISP39_LDCV_END) && (dev->isp_ver == ISP_V39)) { writel(ISP39_LDCV_END, base + CIF_ISP_ICR); rkisp_stream_ldc_end_v39(dev); } - if (isp_mis & CIF_ISP_FRAME) + if (isp_mis & CIF_ISP_FRAME) { + if (dev->hw_dev->monitor.is_en) { + dev->hw_dev->monitor.retry = 0; + dev->hw_dev->monitor.state |= ISP_FRAME_END; + if (!completion_done(&dev->hw_dev->monitor.cmpl)) + complete(&dev->hw_dev->monitor.cmpl); + } rkisp_check_idle(dev, ISP_FRAME_END); + } } irqreturn_t rkisp_vs_isr_handler(int irq, void *ctx) @@ -5086,7 +5175,7 @@ irqreturn_t rkisp_vs_isr_handler(int irq, void *ctx) struct rkisp_device *rkisp_dev = dev_get_drvdata(dev); if (rkisp_dev->vs_irq >= 0) - rkisp_isp_queue_event_sof(&rkisp_dev->isp_sdev); + rkisp_isp_queue_event_sof(rkisp_dev); return IRQ_HANDLED; } diff --git a/drivers/media/platform/rockchip/isp/rkisp.h b/drivers/media/platform/rockchip/isp/rkisp.h index 39ac5d9988ba..60a12dc2b284 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.h +++ b/drivers/media/platform/rockchip/isp/rkisp.h @@ -142,7 +142,6 @@ struct rkisp_isp_subdev { atomic_t frm_sync_seq; enum v4l2_quantization quantization; enum v4l2_colorspace colorspace; - u64 frm_timestamp; struct frame_debug_info dbg; }; @@ -184,7 +183,7 @@ int rkisp_update_sensor_info(struct rkisp_device *dev); u32 rkisp_mbus_pixelcode_to_v4l2(u32 pixelcode); -void rkisp_isp_queue_event_sof(struct rkisp_isp_subdev *isp); +void rkisp_isp_queue_event_sof(struct rkisp_device *dev); void rkisp_check_idle(struct rkisp_device *dev, u32 irq); diff --git a/include/uapi/linux/rk-isp2-config.h b/include/uapi/linux/rk-isp2-config.h index d948dbd270ce..8ebaca078367 100644 --- a/include/uapi/linux/rk-isp2-config.h +++ b/include/uapi/linux/rk-isp2-config.h @@ -69,7 +69,7 @@ _IOR('V', BASE_VIDIOC_PRIVATE + 17, struct rkisp_aiisp_cfg) #define RKISP_CMD_AIISP_RD_START \ - _IO('V', BASE_VIDIOC_PRIVATE + 18) + _IOW('V', BASE_VIDIOC_PRIVATE + 18, struct rkisp_aiisp_st) /* BASE_VIDIOC_PRIVATE + 19 for RKISP_CMD_GET_TB_HEAD_V33 */ /* BASE_VIDIOC_PRIVATE + 20 for RKISP_CMD_SET_TB_HEAD_V33 */ @@ -89,6 +89,8 @@ #define RKISP_CMD_SET_FPN \ _IOW('V', BASE_VIDIOC_PRIVATE + 25, struct rkisp_fpn_cfg) +#define RKISP_CMD_INIT_BNR_BUF \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 26, struct rkisp_bnr_buf_info) /****************ISP VIDEO IOCTL******************************/ #define RKISP_CMD_GET_CSI_MEMORY_MODE \ @@ -321,6 +323,13 @@ #define ISP2X_MESH_BUF_NUM 2 +#define RKISP_BUFFER_MAX 8 +struct rkisp_buf_info { + int buf_cnt; + int buf_size; + int buf_fd[RKISP_BUFFER_MAX]; +} __attribute__ ((packed)); + enum rkisp_isp_mode { /* frame input related */ RKISP_ISP_NORMAL = _BITUL(0), @@ -372,7 +381,7 @@ enum { RKISP_FPN_DATA_SHIFT_3, }; -/* struct rkisp_aiisp_cfg +/* struct rkisp_fpn_cfg * en: enable fpn function * row_en: row fpn mode other column fpn * data_shift: fpn data shift, 4bits of 7bits calculate fpn data @@ -391,24 +400,48 @@ struct rkisp_fpn_cfg { #define RKISP_AIISP_WR_LINECNT_ID 0 #define RKISP_AIISP_RD_LINECNT_ID 1 struct rkisp_aiisp_ev_info { + unsigned long long timestamp; int sequence; int height; + + /* bnr front end */ + int iir_index; + int gain_index; + /* bnr back end */ + int aiisp_index; +} __attribute__ ((packed)); + +struct rkisp_aiisp_st { + unsigned long long timestamp; + int sequence; + + int iir_index; + int gain_index; + int aiisp_index; } __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 + * mode: 0: disable aiisp, 1:enable aiisp + * wr_linecnt: aiisp write irq line + * rd_linecnt: aiisp read irq line */ struct rkisp_aiisp_cfg { - char wr_mode; - char rd_mode; - + int mode; int wr_linecnt; int rd_linecnt; } __attribute__ ((packed)); +struct rkisp_bnr_buf_info { + struct rkisp_buf_info iir; + union { + struct { + struct rkisp_buf_info aiisp; + struct rkisp_buf_info gain; + __u8 iirsparse_en; + } v39; + } u; +} __attribute__ ((packed)); + struct rkisp_bay3dbuf_info { int iir_fd; int iir_size; @@ -429,12 +462,6 @@ struct rkisp_bay3dbuf_info { int gain_fd; int gain_size; } v33; - struct { - int gain_fd; - int gain_size; - int aiisp_fd; - int aiisp_size; - } v39; } u; } __attribute__ ((packed)); diff --git a/include/uapi/linux/rk-isp39-config.h b/include/uapi/linux/rk-isp39-config.h index 552c6a617911..b6ab9e5e2f82 100644 --- a/include/uapi/linux/rk-isp39-config.h +++ b/include/uapi/linux/rk-isp39-config.h @@ -1794,6 +1794,7 @@ struct isp39_stat { struct isp39_dhaz_stat dhaz; struct isp39_bay3d_stat bay3d; struct isp32_info2ddr_stat info2ddr; + int buf_bay3d_iir_index; } __attribute__ ((packed)); struct rkisp39_stat_buffer {