vframe_in[i] = NULL;
di_pre_stru.pre_de_process_done = 0;
di_pre_stru.pre_de_busy = 0;
+ di_pre_stru.pre_de_process_flag = 0;
if (post_wr_en && post_wr_support) {
di_post_stru.cur_post_buf = NULL;
di_post_stru.post_de_busy = 0;
unsigned short cur_inp_field_type = VIDTYPE_TYPEMASK;
unsigned short int_mask = 0x7f;
- di_pre_stru.pre_de_busy = 1;
+ di_pre_stru.pre_de_process_flag = 1;
di_pre_stru.pre_de_busy_timer_count = 0;
#ifdef CONFIG_AMLOGIC_MEDIA_MULTI_DEC
pre_inp_canvas_config(di_pre_stru.di_inp_buf->vframe);
/* enable mc pre mif*/
enable_di_pre_mif(true, mcpre_en);
}
+ /*reinit pre busy flag*/
+ di_pre_stru.pre_de_busy_timer_count = 0;
+ di_pre_stru.pre_de_busy = 1;
#ifdef SUPPORT_MPEG_TO_VDIN
if (mpeg2vdin_flag)
RDMA_WR_BITS(DI_PRE_CTRL, 1, 13, 1);
#endif
- di_pre_stru.irq_time = sched_clock()/NSEC_PER_MSEC;
+ di_pre_stru.irq_time[0] = sched_clock()/NSEC_PER_MSEC;
+ di_pre_stru.irq_time[1] = sched_clock()/NSEC_PER_MSEC;
#ifdef CONFIG_AMLOGIC_MEDIA_RDMA
if (di_pre_rdma_enable & 0x2)
rdma_config(de_devp->rdma_handle, RDMA_TRIGGER_MANUAL);
else if (di_pre_rdma_enable & 1)
rdma_config(de_devp->rdma_handle, RDMA_DEINT_IRQ);
#endif
+ di_pre_stru.pre_de_process_flag = 0;
}
static void pre_de_done_buf_clear(void)
di_pre_stru.di_wr_buf->vframe);
}
#endif
- }
if (!di_pre_rdma_enable)
di_pre_stru.di_post_wr_buf = di_pre_stru.di_wr_buf;
post_wr_buf = di_pre_stru.di_post_wr_buf;
di_pre_stru.di_wr_buf = NULL;
}
}
-
+ }
if (di_pre_stru.di_post_inp_buf && di_pre_rdma_enable) {
#ifdef DI_BUFFER_DEBUG
di_print("%s: %s[%d] => recycle_list\n", __func__,
}
if (flag) {
- di_pre_stru.irq_time =
- (sched_clock()/NSEC_PER_MSEC - di_pre_stru.irq_time);
+ di_pre_stru.irq_time[0] =
+ (sched_clock()/NSEC_PER_MSEC - di_pre_stru.irq_time[0]);
trace_di_pre("PRE-IRQ-0",
di_pre_stru.field_count_for_cont,
- di_pre_stru.irq_time);
+ di_pre_stru.irq_time[0]);
if (mcpre_en) {
get_mcinfo_from_reg_in_irq();
if ((is_meson_gxlx_cpu() &&
}
}
di_unlock_irqfiq_restore(irq_flag2);
-
- if ((di_pre_stru.pre_de_busy == 0) &&
- (di_pre_stru.pre_de_process_done == 0)) {
- if ((pre_run_flag == DI_RUN_FLAG_RUN) ||
- (pre_run_flag == DI_RUN_FLAG_STEP)) {
- if (pre_run_flag == DI_RUN_FLAG_STEP)
- pre_run_flag =
- DI_RUN_FLAG_STEP_DONE;
- if (pre_de_buf_config())
- pre_de_process();
- }
+ if ((di_pre_stru.pre_de_busy == 0) &&
+ (di_pre_stru.pre_de_process_done == 0)) {
+ if ((pre_run_flag == DI_RUN_FLAG_RUN) ||
+ (pre_run_flag == DI_RUN_FLAG_STEP)) {
+ if (pre_run_flag == DI_RUN_FLAG_STEP)
+ pre_run_flag = DI_RUN_FLAG_STEP_DONE;
+ if (pre_de_buf_config() &&
+ (di_pre_stru.pre_de_process_flag == 0))
+ pre_de_process();
}
+ }
di_post_stru.di_post_process_cnt = 0;
while (process_post_vframe()) {
if (di_post_stru.di_post_process_cnt++ >
if (pre_stru_p->pre_de_busy && init_flag) {
pre_stru_p->pre_de_busy_timer_count++;
- if (pre_stru_p->pre_de_busy_timer_count >= nr_done_check_cnt) {
+ if (pre_stru_p->pre_de_busy_timer_count >= nr_done_check_cnt &&
+ ((sched_clock()/NSEC_PER_MSEC - di_pre_stru.irq_time[1]) >
+ (10*nr_done_check_cnt))) {
if (di_dbg_mask & 4) {
dump_mif_size_state(&di_pre_stru,
&di_post_stru);
pre_stru_p->pre_de_clear_flag = 2;
if ((pre_stru_p->field_count_for_cont < 10) ||
(di_dbg_mask&0x2)) {
- pr_info("DI*****wait %d timeout 0x%x*****\n",
+ pr_info("DI*****wait %d timeout 0x%x(%d ms)*****\n",
pre_stru_p->field_count_for_cont,
- Rd(DI_INTR_CTRL));
+ Rd(DI_INTR_CTRL),
+ (unsigned int)(sched_clock()/
+ NSEC_PER_MSEC -
+ di_pre_stru.irq_time[1]));
}
}
} else {
if (pre_run_flag == DI_RUN_FLAG_STEP)
pre_run_flag =
DI_RUN_FLAG_STEP_DONE;
- if (pre_de_buf_config())
+ if (pre_de_buf_config() &&
+ (di_pre_stru.pre_de_process_flag == 0))
pre_de_process();
}
}
module_param_named(di_stop_reg_flag, di_stop_reg_flag, uint, 0664);
module_param(di_dbg_mask, uint, 0664);
MODULE_PARM_DESC(di_dbg_mask, "\n di_dbg_mask\n");
+module_param(nr_done_check_cnt, uint, 0664);
+MODULE_PARM_DESC(nr_done_check_cnt, "\n nr_done_check_cnt\n");
module_param_array(di_stop_reg_addr, uint, &num_di_stop_reg_addr,
0664);
module_param_named(mcpre_en, mcpre_en, bool, 0664);
#include <linux/workqueue.h>
#include <linux/platform_device.h>
#include <linux/module.h>
+#include <linux/atomic.h>
#include <linux/amlogic/media/vpu/vpu.h>
#include <linux/amlogic/cpu_version.h>
mif->set_separate_en ? 0 : (mif->video_mode ? 2 : 1);
demux_mode = mif->video_mode;
DI_VSYNC_WR_MPEG_REG(VD1_IF0_GEN_REG,
-(0 << 29) | /* reset on go field */
+(1 << 29) | /* reset on go field */
(urgent << 28) | /* urgent */
(urgent << 27) | /* luma urgent */
(1 << 25) | /* no dummy data. */
}
static bool pre_mif_gate;
+static atomic_t mif_flag;
void enable_di_pre_mif(bool en, bool mc_enable)
{
+ if (atomic_read(&mif_flag))
+ return;
+
if (pre_mif_gate && !en)
return;
+ atomic_set(&mif_flag, 1);
+
if (cpu_after_eq(MESON_CPU_MAJOR_ID_G12A)) {
if (mc_enable)
mc_pre_mif_ctrl_g12(en);
ma_pre_mif_ctrl(en);
}
di_pre_data_mif_ctrl(en);
+ atomic_set(&mif_flag, 0);
}
void combing_pd22_window_config(unsigned int width, unsigned int height)