media: rockchip: ispp: check frame id when apply params

Change-Id: I4816fd87c4730c29716dd35a7721a66265eb3587
Signed-off-by: Xu Hongfei <xuhf@rock-chips.com>
Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
This commit is contained in:
Hu Kejun 2021-01-11 09:51:23 +08:00 committed by Tao Huang
parent 4331ba1b1d
commit 799ad4b3f2
5 changed files with 39 additions and 204 deletions

View File

@ -366,6 +366,7 @@ static void rkispp_queue_dmabuf(struct rkispp_hw_dev *hw, struct rkisp_ispp_buf
ispp = hw->ispp[buf->index];
vdev = &ispp->stream_vdev;
val = (vdev->module_ens & ISPP_MODULE_TNR) ? ISPP_MODULE_TNR : ISPP_MODULE_NR;
rkispp_params_cfg(&ispp->params_vdev, buf->frame_id);
rkispp_module_work_event(ispp, buf, NULL, val, false);
}

View File

@ -353,16 +353,6 @@ static void nr_enable(struct rkispp_params_vdev *params_vdev, bool en,
SW_UVNR_BIG_EN | SW_NR_EN, val);
}
static bool is_nr_enable(struct rkispp_params_vdev *params_vdev)
{
u32 cur_en;
cur_en = rkispp_read(params_vdev->dev, RKISPP_NR_UVNR_CTRL_PARA);
cur_en &= SW_NR_EN;
return (!!cur_en);
}
static void shp_config(struct rkispp_params_vdev *params_vdev,
struct rkispp_sharp_config *arg)
{
@ -515,16 +505,6 @@ static void shp_enable(struct rkispp_params_vdev *params_vdev, bool en,
SW_SHP_EDGE_AVG_EN | SW_SHP_EN, val);
}
static bool is_shp_enable(struct rkispp_params_vdev *params_vdev)
{
u32 cur_en;
cur_en = rkispp_read(params_vdev->dev, RKISPP_SHARP_CORE_CTRL);
cur_en &= SW_SHP_EN;
return (!!cur_en);
}
static void fec_config(struct rkispp_params_vdev *params_vdev,
struct rkispp_fec_config *arg)
{
@ -607,19 +587,6 @@ static void fec_enable(struct rkispp_params_vdev *params_vdev, bool en)
rkispp_set_bits(params_vdev->dev, RKISPP_FEC_CORE_CTRL, SW_FEC_EN, en);
}
static bool is_fec_enable(struct rkispp_params_vdev *params_vdev)
{
u32 cur_en;
if (params_vdev->dev->hw_dev->is_fec_ext)
return false;
cur_en = rkispp_read(params_vdev->dev, RKISPP_FEC_CORE_CTRL);
cur_en &= SW_FEC_EN;
return (!!cur_en);
}
static void orb_config(struct rkispp_params_vdev *params_vdev,
struct rkispp_orb_config *arg)
{
@ -632,16 +599,6 @@ static void orb_enable(struct rkispp_params_vdev *params_vdev, bool en)
rkispp_set_bits(params_vdev->dev, RKISPP_ORB_CORE_CTRL, SW_ORB_EN, en);
}
static bool is_orb_enable(struct rkispp_params_vdev *params_vdev)
{
u32 cur_en;
cur_en = rkispp_read(params_vdev->dev, RKISPP_ORB_CORE_CTRL);
cur_en &= SW_ORB_EN;
return (!!cur_en);
}
static int rkispp_params_enum_fmt_meta_out(struct file *file, void *priv,
struct v4l2_fmtdesc *f)
{
@ -803,18 +760,14 @@ static void rkispp_params_vb2_buf_queue(struct vb2_buffer *vb)
new_params = (struct rkispp_params_cfg *)vb2_plane_vaddr(vb, 0);
spin_lock_irqsave(&params_vdev->config_lock, flags);
if (params_vdev->first_params) {
vb2_buffer_done(&params_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
params_vdev->first_params = false;
*params_vdev->cur_params = *new_params;
if (new_params->module_init_ens) {
if (params_vdev->dev->hw_dev->is_fec_ext)
new_params->module_init_ens &= ~ISPP_MODULE_FEC_ST;
stream_vdev->module_ens = new_params->module_init_ens;
}
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
wake_up(&params_vdev->dev->sync_onoff);
return;
}
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
@ -961,12 +914,10 @@ rkispp_params_init_vb2_queue(struct vb2_queue *q,
return vb2_queue_init(q);
}
void rkispp_params_isr(struct rkispp_params_vdev *params_vdev, u32 mis)
void rkispp_params_cfg(struct rkispp_params_vdev *params_vdev, u32 frame_id)
{
struct rkispp_params_cfg *new_params = NULL;
u32 module_en_update, module_cfg_update;
u32 module_ens, module_cur_ens;
bool isr_sync;
u32 module_en_update, module_cfg_update, module_ens;
spin_lock(&params_vdev->config_lock);
if (!params_vdev->streamon) {
@ -974,17 +925,30 @@ void rkispp_params_isr(struct rkispp_params_vdev *params_vdev, u32 mis)
return;
}
if (!params_vdev->cur_buf &&
!list_empty(&params_vdev->params)) {
/* get buffer by frame_id */
while (!list_empty(&params_vdev->params) && !params_vdev->cur_buf) {
params_vdev->cur_buf = list_first_entry(&params_vdev->params,
struct rkispp_buffer, queue);
list_del(&params_vdev->cur_buf->queue);
struct rkispp_buffer, queue);
new_params = (struct rkispp_params_cfg *)(params_vdev->cur_buf->vaddr[0]);
if (new_params->frame_id < frame_id) {
list_del(&params_vdev->cur_buf->queue);
vb2_buffer_done(&params_vdev->cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
params_vdev->cur_buf = NULL;
continue;
} else if (new_params->frame_id == frame_id) {
list_del(&params_vdev->cur_buf->queue);
} else {
params_vdev->cur_buf = NULL;
}
break;
}
if (!params_vdev->cur_buf) {
spin_unlock(&params_vdev->config_lock);
return;
}
new_params = (struct rkispp_params_cfg *)(params_vdev->cur_buf->vaddr[0]);
module_en_update = new_params->module_en_update;
@ -996,179 +960,48 @@ void rkispp_params_isr(struct rkispp_params_vdev *params_vdev, u32 mis)
module_ens &= ~ISPP_MODULE_FEC;
}
isr_sync = true;
if ((module_en_update & ISPP_MODULE_TNR) &&
(module_ens & ISPP_MODULE_TNR) &&
!is_tnr_enable(params_vdev))
isr_sync = false;
if (module_cfg_update & ISPP_MODULE_TNR &&
(mis & TNR_INT || !isr_sync)) {
tnr_config(params_vdev,
&new_params->tnr_cfg);
module_cfg_update &= ~ISPP_MODULE_TNR;
}
if (module_en_update & ISPP_MODULE_TNR &&
(mis & TNR_INT || !isr_sync)) {
tnr_enable(params_vdev,
!!(module_ens & ISPP_MODULE_TNR));
module_en_update &= ~ISPP_MODULE_TNR;
}
isr_sync = true;
if ((module_en_update & ISPP_MODULE_NR) &&
(module_ens & ISPP_MODULE_NR) &&
!is_nr_enable(params_vdev))
isr_sync = false;
if (module_cfg_update & ISPP_MODULE_NR &&
(mis & NR_INT || !isr_sync)) {
nr_config(params_vdev,
&new_params->nr_cfg);
module_cfg_update &= ~ISPP_MODULE_NR;
}
if (module_en_update & ISPP_MODULE_NR &&
(mis & NR_INT || !isr_sync)) {
nr_enable(params_vdev,
!!(module_ens & ISPP_MODULE_NR),
&new_params->nr_cfg);
module_en_update &= ~ISPP_MODULE_NR;
}
isr_sync = true;
if ((module_en_update & ISPP_MODULE_SHP) &&
(module_ens & ISPP_MODULE_SHP) &&
!is_shp_enable(params_vdev))
isr_sync = false;
if (module_cfg_update & ISPP_MODULE_SHP &&
(mis & SHP_INT || !isr_sync)) {
shp_config(params_vdev,
&new_params->shp_cfg);
module_cfg_update &= ~ISPP_MODULE_SHP;
}
if (module_en_update & ISPP_MODULE_SHP &&
(mis & SHP_INT || !isr_sync)) {
shp_enable(params_vdev,
!!(module_ens & ISPP_MODULE_SHP),
&new_params->shp_cfg);
module_en_update &= ~ISPP_MODULE_SHP;
}
isr_sync = true;
if ((module_en_update & ISPP_MODULE_ORB) &&
(module_ens & ISPP_MODULE_ORB) &&
!is_orb_enable(params_vdev))
isr_sync = false;
if (module_cfg_update & ISPP_MODULE_ORB &&
(mis & ORB_INT || !isr_sync)) {
orb_config(params_vdev,
&new_params->orb_cfg);
module_cfg_update &= ~ISPP_MODULE_ORB;
}
if (module_en_update & ISPP_MODULE_ORB &&
(mis & ORB_INT || !isr_sync)) {
orb_enable(params_vdev,
!!(module_ens & ISPP_MODULE_ORB));
module_en_update &= ~ISPP_MODULE_ORB;
}
isr_sync = true;
if ((module_en_update & ISPP_MODULE_FEC) &&
(module_ens & ISPP_MODULE_FEC) &&
!is_fec_enable(params_vdev))
isr_sync = false;
if (module_cfg_update & ISPP_MODULE_FEC &&
(mis & FEC_INT || !isr_sync)) {
fec_config(params_vdev,
&new_params->fec_cfg);
module_cfg_update &= ~ISPP_MODULE_FEC;
}
if (module_en_update & ISPP_MODULE_FEC &&
(mis & FEC_INT || !isr_sync)) {
fec_enable(params_vdev,
!!(module_ens & ISPP_MODULE_FEC));
module_en_update &= ~ISPP_MODULE_FEC;
}
new_params->module_en_update = module_en_update;
new_params->module_cfg_update = module_cfg_update;
module_cur_ens = 0;
if (is_tnr_enable(params_vdev))
module_cur_ens |= ISPP_MODULE_TNR;
if (is_nr_enable(params_vdev))
module_cur_ens |= ISPP_MODULE_NR;
if (is_shp_enable(params_vdev))
module_cur_ens |= ISPP_MODULE_SHP;
if (is_orb_enable(params_vdev))
module_cur_ens |= ISPP_MODULE_ORB;
if (is_fec_enable(params_vdev))
module_cur_ens |= ISPP_MODULE_FEC;
if (!(module_en_update & module_cur_ens) &&
!(module_cfg_update & module_cur_ens)) {
vb2_buffer_done(&params_vdev->cur_buf->vb.vb2_buf,
VB2_BUF_STATE_DONE);
params_vdev->cur_buf = NULL;
}
spin_unlock(&params_vdev->config_lock);
}
void rkispp_params_configure(struct rkispp_params_vdev *params_vdev)
{
u32 module_en_update = params_vdev->cur_params->module_en_update;
u32 module_cfg_update = params_vdev->cur_params->module_cfg_update;
u32 module_ens = params_vdev->cur_params->module_ens;
unsigned long flags;
if (params_vdev->dev->hw_dev->is_fec_ext) {
module_en_update &= ~ISPP_MODULE_FEC;
module_cfg_update &= ~ISPP_MODULE_FEC;
module_ens &= ~ISPP_MODULE_FEC;
}
spin_lock_irqsave(&params_vdev->config_lock, flags);
if (params_vdev->first_params) {
params_vdev->first_params = false;
v4l2_warn(&params_vdev->dev->v4l2_dev,
"can not get first iq setting in stream on\n");
}
spin_unlock_irqrestore(&params_vdev->config_lock, flags);
if (module_cfg_update & ISPP_MODULE_TNR)
tnr_config(params_vdev,
&params_vdev->cur_params->tnr_cfg);
&new_params->tnr_cfg);
if (module_en_update & ISPP_MODULE_TNR)
tnr_enable(params_vdev,
!!(module_ens & ISPP_MODULE_TNR));
if (module_cfg_update & ISPP_MODULE_NR)
nr_config(params_vdev,
&params_vdev->cur_params->nr_cfg);
&new_params->nr_cfg);
if (module_en_update & ISPP_MODULE_NR)
nr_enable(params_vdev,
!!(module_ens & ISPP_MODULE_NR),
&params_vdev->cur_params->nr_cfg);
&new_params->nr_cfg);
if (module_cfg_update & ISPP_MODULE_SHP)
shp_config(params_vdev,
&params_vdev->cur_params->shp_cfg);
&new_params->shp_cfg);
if (module_en_update & ISPP_MODULE_SHP)
shp_enable(params_vdev,
!!(module_ens & ISPP_MODULE_SHP),
&params_vdev->cur_params->shp_cfg);
&new_params->shp_cfg);
if (module_cfg_update & ISPP_MODULE_FEC)
fec_config(params_vdev,
&params_vdev->cur_params->fec_cfg);
&new_params->fec_cfg);
if (module_en_update & ISPP_MODULE_FEC)
fec_enable(params_vdev,
!!(module_ens & ISPP_MODULE_FEC));
if (module_cfg_update & ISPP_MODULE_ORB)
orb_config(params_vdev,
&params_vdev->cur_params->orb_cfg);
&new_params->orb_cfg);
if (module_en_update & ISPP_MODULE_ORB)
orb_enable(params_vdev,
!!(module_ens & ISPP_MODULE_ORB));
vb2_buffer_done(&params_vdev->cur_buf->vb.vb2_buf,
VB2_BUF_STATE_DONE);
params_vdev->cur_buf = NULL;
spin_unlock(&params_vdev->config_lock);
}
void rkispp_params_get_fecbuf_inf(struct rkispp_params_vdev *params_vdev,

View File

@ -33,8 +33,7 @@ struct rkispp_params_vdev {
int rkispp_register_params_vdev(struct rkispp_device *dev);
void rkispp_unregister_params_vdev(struct rkispp_device *dev);
void rkispp_params_configure(struct rkispp_params_vdev *params_vdev);
void rkispp_params_isr(struct rkispp_params_vdev *params_vdev, u32 mis);
void rkispp_params_cfg(struct rkispp_params_vdev *params_vdev, u32 frame_id);
void rkispp_params_get_fecbuf_inf(struct rkispp_params_vdev *params_vdev,
struct rkispp_fecbuf_info *fecbuf);
void rkispp_params_set_fecbuf_size(struct rkispp_params_vdev *params_vdev,

View File

@ -1123,8 +1123,6 @@ static int config_modules(struct rkispp_device *dev)
if (ret < 0)
goto free_nr;
rkispp_params_configure(&dev->params_vdev);
return 0;
free_nr:
nr_free_buf(dev);
@ -2399,6 +2397,7 @@ static void fec_work_event(struct rkispp_device *dev,
offset += size;
reg_buf->reg_size = offset;
}
writel(FEC_ST, base + RKISPP_CTRL_STRT);
vdev->fec.is_end = false;
}
@ -2578,6 +2577,7 @@ static void nr_work_event(struct rkispp_device *dev,
}
rkispp_update_regs(dev, RKISPP_NR, RKISPP_ORB_MAX_FEATURE);
}
writel(OTHER_FORCE_UPD, base + RKISPP_CTRL_UPDATE);
v4l2_dbg(3, rkispp_debug, &dev->v4l2_dev,
@ -2637,6 +2637,7 @@ static void nr_work_event(struct rkispp_device *dev,
offset += size;
reg_buf->reg_size = offset;
}
if (!is_quick)
writel(NR_SHP_ST, base + RKISPP_CTRL_STRT);
vdev->nr.is_end = false;
@ -2893,6 +2894,7 @@ static void tnr_work_event(struct rkispp_device *dev,
offset += size;
reg_buf->reg_size = offset;
}
writel(TNR_ST, base + RKISPP_CTRL_STRT);
vdev->tnr.is_end = false;
}
@ -3101,7 +3103,6 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
if (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM)
rkispp_clear_bits(dev, RKISPP_TNR_CTRL, SW_TNR_1ST_FRM);
rkispp_params_isr(&dev->params_vdev, mis_val);
rkispp_stats_isr(&dev->stats_vdev, mis_val);
for (i = 0; i <= STREAM_S2; i++) {

View File

@ -335,6 +335,7 @@ struct rkispp_params_cfg {
u32 module_cfg_update;
u32 module_init_ens;
u32 frame_id;
struct rkispp_tnr_config tnr_cfg;
struct rkispp_nr_config nr_cfg;
struct rkispp_sharp_config shp_cfg;