diff --git a/drivers/media/vin/tvin/vdin/vdin_debug.c b/drivers/media/vin/tvin/vdin/vdin_debug.c index 755283744..10e85f634 100644 --- a/drivers/media/vin/tvin/vdin/vdin_debug.c +++ b/drivers/media/vin/tvin/vdin/vdin_debug.c @@ -2129,6 +2129,8 @@ static void vdin_dump_count(struct vdin_dev_s *devp) pr_info("frame_drop_num:%d\n", devp->frame_drop_num); pr_info("vdin_drop_cnt: %d\n", devp->vdin_drop_cnt); pr_info("vdin_drop_num:%d\n", devp->vdin_drop_num); + pr_info("rdma_manual_cnt: %d,rdma_undone_cnt: %d\n", + devp->stats.rdma_manual_cnt, devp->rdma_undone_cnt); pr_info("dbg_fr_ctl:%d,drop_ctl_cnt:%d\n", devp->dbg_fr_ctl, devp->vdin_drop_ctl_cnt); vdin_dump_vs_info(devp); diff --git a/drivers/media/vin/tvin/vdin/vdin_drv.c b/drivers/media/vin/tvin/vdin/vdin_drv.c index a2f4b0ee4..25e0d87d4 100644 --- a/drivers/media/vin/tvin/vdin/vdin_drv.c +++ b/drivers/media/vin/tvin/vdin/vdin_drv.c @@ -1057,6 +1057,7 @@ __maybe_unused static void vdin_rdma_irq(void *arg) devp->flags_isr &= ~VDIN_FLAG_RDMA_DONE; devp->rdma_irq_cnt++; + devp->rdma_undone_cnt = 0; return; } __maybe_unused static struct rdma_op_s vdin_rdma_op[VDIN_MAX_DEVS]; @@ -1550,6 +1551,7 @@ int vdin_start_dec(struct vdin_dev_s *devp) devp->vframe_wr_en = 1; devp->vframe_wr_en_pre = 1; devp->keystone_vframe_ready = 0; + devp->rdma_undone_cnt = 0; memset(&devp->stats, 0, sizeof(devp->stats)); if (vdin_time_en) pr_info("vdin.%d start time: %ums, run time:%ums.\n", @@ -3752,7 +3754,8 @@ irq_handled: spin_unlock_irqrestore(&devp->isr_lock, flags); #ifdef CONFIG_AMLOGIC_MEDIA_RDMA if ((devp->flags & VDIN_FLAG_RDMA_ENABLE) && - (devp->flags_isr & VDIN_FLAG_RDMA_DONE)) { + ((devp->flags_isr & VDIN_FLAG_RDMA_DONE) || + devp->rdma_undone_cnt++ > VDIN_RDMA_UNDONE_MAX_CNT)) { ret = rdma_config(devp->rdma_handle, (devp->rdma_enable & 1) ? devp->rdma_irq : RDMA_TRIGGER_MANUAL); @@ -3760,6 +3763,8 @@ irq_handled: devp->flags_isr |= VDIN_FLAG_RDMA_DONE; else devp->flags_isr &= ~VDIN_FLAG_RDMA_DONE; + devp->rdma_undone_cnt = 0; + devp->stats.rdma_manual_cnt++; } #endif diff --git a/drivers/media/vin/tvin/vdin/vdin_drv.h b/drivers/media/vin/tvin/vdin/vdin_drv.h index 56bc1cd41..df8266529 100644 --- a/drivers/media/vin/tvin/vdin/vdin_drv.h +++ b/drivers/media/vin/tvin/vdin/vdin_drv.h @@ -362,6 +362,7 @@ struct match_data_s { #define FPS_23_97_SET_TO_23 23 #define VDIN_SET_MODE_MAX_FRAME 60 #define VDIN_VRR_MIN_FRAME_RATE 25 +#define VDIN_RDMA_UNDONE_MAX_CNT 10 #define IS_HDMI_SRC(src) \ ({typeof(src) src_ = src; \ @@ -441,6 +442,7 @@ enum vdin_vf_put_md { #define DBG_RX_UPDATE_VDIN_PROP BIT(20) #define VDIN_ISR_MONITOR_INPUT BIT(21) +#define VDIN_ISR_MONITOR_RDMA BIT(22) #define VDIN_ISR_MONITOR_CFMT BIT(23) @@ -736,6 +738,7 @@ struct vdin_frame_stat_s { unsigned int meta_wr_done_irq_cnt; /* Continuous cycle error counting */ unsigned int cycle_err_cnt_con; + unsigned int rdma_manual_cnt; }; struct vdin_v4l2_s { @@ -1168,6 +1171,7 @@ struct vdin_dev_s { unsigned int vdin_isr_drop; unsigned int vdin_isr_drop_num; unsigned int fs_open_cnt; + unsigned int rdma_undone_cnt; struct vdin_dv_hw5_s dv_hw5; };