mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
media: rockchip: isp: optimize aiisp for isp39
Change-Id: I79d975e39bca68b0b14ed5bdebf361c11749493e Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -3018,6 +3018,7 @@
|
||||
#define ISP32L_AXI_CONF_RD_DONE BIT(31)
|
||||
|
||||
/* CSI2RX */
|
||||
#define ISP3X_RXSELF_FORCE_UPD BIT(31)
|
||||
|
||||
/* DEBAYER */
|
||||
|
||||
|
||||
@@ -42,8 +42,6 @@
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/kfifo.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/rk-preisp.h>
|
||||
#include <linux/rk-isp21-config.h>
|
||||
#include <linux/iommu.h>
|
||||
#include <media/v4l2-event.h>
|
||||
#include <media/media-entity.h>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user