media: rockchip: isp: optimize aiisp for isp39

Change-Id: I79d975e39bca68b0b14ed5bdebf361c11749493e
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2025-01-06 10:21:38 +08:00
committed by Tao Huang
parent e5cff921bf
commit 8e24c177fa
40 changed files with 1415 additions and 1026 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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(&params_vdev->params);
INIT_LIST_HEAD(&params_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(&params_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
params_vdev->first_params = false;
wake_up(&params_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(&params_vdev->config_lock, flags);
params_vdev->streamon = false;
wake_up(&dev->sync_onoff);
while (!list_empty(&params_vdev->params)) {
buf = list_first_entry(&params_vdev->params,
struct rkisp_buffer, queue);
if (params_vdev->cur_buf) {
buf = params_vdev->cur_buf;
list_add_tail(&buf->queue, &params_vdev->params);
params_vdev->cur_buf = NULL;
}
list_replace_init(&params_vdev->params, &local_list);
list_replace_init(&params_vdev->params_be, &local_list_be);
spin_unlock_irqrestore(&params_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(&params_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, &params_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)

View File

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

View File

@@ -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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_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(&params_vdev->dev->isp_sdev.frm_sync_seq) - 1;
unsigned long flags = 0;
spin_lock(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
}
static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {

View File

@@ -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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
}
static void

View File

@@ -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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
}
static void

View File

@@ -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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
}
static void

View File

@@ -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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
}
static void

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_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(&params_vdev->config_lock);
spin_lock_irqsave(&params_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(&params_vdev->config_lock);
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
}
static void

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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",

View File

@@ -3018,6 +3018,7 @@
#define ISP32L_AXI_CONF_RD_DONE BIT(31)
/* CSI2RX */
#define ISP3X_RXSELF_FORCE_UPD BIT(31)
/* DEBAYER */

View File

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

View File

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

View File

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

View File

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