vdin: Flash blurre screen when change hdmi 4k timing [1/1]
authorYong Qin <yong.qin@amlogic.com>
Fri, 31 May 2019 02:29:33 +0000 (10:29 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Fri, 31 May 2019 09:13:47 +0000 (02:13 -0700)
PD#SWPL-8153

Problem:
Flash blurre screen when change all 4K format

Solution:
if no video buffer resouce, needn't set afbce regiter
when need switch afbc mode.

Verify:
tl1

Change-Id: Ifb867cdeda2b6d3536246b79531a5bf9027e01a1
Signed-off-by: Yong Qin <yong.qin@amlogic.com>
MAINTAINERS
drivers/amlogic/media/vin/tvin/vdin/vdin_debug.c
drivers/amlogic/media/vin/tvin/vdin/vdin_drv.c
drivers/amlogic/media/vin/tvin/vdin/vdin_drv.h
drivers/amlogic/media/vin/tvin/vdin/vdin_trace.h [new file with mode: 0644]

index ea44e65..144d8b0 100644 (file)
@@ -14725,6 +14725,10 @@ M:     Xuhua Zhang <xuhua.zhang@amlogic.com>
 F:     drivers/amlogic/media/vin/tvin/vdin/vdin_afbce.c
 F:     drivers/amlogic/media/vin/tvin/vdin/vdin_afbce.h
 
+AMLOGIC VDIN DRIVERS
+M:  Yong Qin <yong.qin@amlogic.com>
+F:  drivers/amlogic/media/vin/tvin/vdin/vdin_trace.h
+
 AMLOGIC MESONAXG S400 DTS
 M:     Yuegui He <yuegui.he@amlogic.com>
 F:     arch/arm64/boot/dts/amlogic/axg_s400_v03.dts
index 475106b..515d985 100644 (file)
@@ -808,6 +808,7 @@ static void vdin_dump_state(struct vdin_dev_s *devp)
        pr_info("vdin_irq_flag: %d, vdin_rest_flag: %d, irq_cnt: %d, rdma_irq_cnt: %d\n",
                devp->vdin_irq_flag, devp->vdin_reset_flag,
                devp->irq_cnt, devp->rdma_irq_cnt);
+       pr_info("vdin_drop_cnt: %d\n", vdin_drop_cnt);
        pr_info("game_mode :  %d\n", devp->game_mode);
        pr_info("dolby_input :  %d\n", devp->dv.dolby_input);
        if ((devp->cma_config_en != 1) || !(devp->cma_config_flag & 0x100))
index d421deb..2154233 100644 (file)
@@ -149,7 +149,7 @@ static unsigned int isr_flag;
 module_param(isr_flag, uint, 0664);
 MODULE_PARM_DESC(isr_flag, "flag which affect the skip field");
 
-static unsigned int vdin_drop_cnt;
+unsigned int vdin_drop_cnt;
 module_param(vdin_drop_cnt, uint, 0664);
 MODULE_PARM_DESC(vdin_drop_cnt, "vdin_drop_cnt");
 
@@ -1430,9 +1430,7 @@ irqreturn_t vdin_isr(int irq, void *dev_id)
         * this code about system time must be outside of spinlock.
         * because the spinlock may affect the system time.
         */
-
        spin_lock_irqsave(&devp->isr_lock, flags);
-
        if (devp->afbce_mode == 1) {
                /* no need reset mif under afbc mode */
                devp->vdin_reset_flag = 0;
@@ -1599,8 +1597,10 @@ irqreturn_t vdin_isr(int irq, void *dev_id)
        curr_wr_vfe = devp->curr_wr_vfe;
        curr_wr_vf  = &curr_wr_vfe->vf;
 
+       next_wr_vfe = provider_vf_peek(devp->vfp);
+
        /* change afbce mode */
-       if (devp->afbce_mode_pre != devp->afbce_mode)
+       if (next_wr_vfe && (devp->afbce_mode_pre != devp->afbce_mode))
                vdin_afbce_mode_update(devp);
 
        /* change color matrix */
@@ -1707,7 +1707,6 @@ irqreturn_t vdin_isr(int irq, void *dev_id)
                goto irq_handled;
        }
 
-       next_wr_vfe = provider_vf_peek(devp->vfp);
        if (!next_wr_vfe) {
                /*add for force vdin buffer recycle*/
                if (devp->flags & VDIN_FLAG_FORCE_RECYCLE) {
index c8bc046..11dde0c 100644 (file)
@@ -48,7 +48,7 @@
 /* Ref.2019/04/25: tl1 vdin0 afbce dynamically switch support,
  *                 vpp also should support this function
  */
-#define VDIN_VER "Ref.2019/05/14"
+#define VDIN_VER "Ref.2019/05/31"
 
 /*the counter of vdin*/
 #define VDIN_MAX_DEVS                  2
@@ -412,7 +412,7 @@ struct vdin_v4l2_param_s {
 extern unsigned int max_recycle_frame_cnt;
 extern unsigned int max_ignore_frame_cnt;
 extern unsigned int skip_frame_debug;
-
+extern unsigned int vdin_drop_cnt;
 extern unsigned int vdin0_afbce_debug_force;
 
 extern struct vframe_provider_s *vf_get_provider_by_name(
diff --git a/drivers/amlogic/media/vin/tvin/vdin/vdin_trace.h b/drivers/amlogic/media/vin/tvin/vdin/vdin_trace.h
new file mode 100644 (file)
index 0000000..3cdefc4
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * drivers/amlogic/media/vin/tvin/vdin/vdin_trace.h
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM vdin
+
+#if !defined(_VDIN_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _VDIN_TRACE_H
+
+#include <linux/tracepoint.h>
+
+/* single lifecycle events */
+DECLARE_EVENT_CLASS(vdin_event_class,
+       TP_PROTO(const char *name, int field_cnt, unsigned long time),
+       TP_ARGS(name, field_cnt, time),
+       TP_STRUCT__entry(
+               __string(name, name)
+               __field(int, field_cnt)
+               __field(unsigned long, time)
+       ),
+       TP_fast_assign(
+               __assign_str(name, name);
+               __entry->field_cnt = field_cnt;
+               __entry->time = time;
+       ),
+       TP_printk("[%s-%dth-%lums]",  __get_str(name),
+                       __entry->field_cnt, __entry->time)
+);
+
+#define DEFINE_VDIN_EVENT(name) \
+DEFINE_EVENT(vdin_event_class, name, \
+       TP_PROTO(const char *name, int field_cnt, unsigned long time), \
+       TP_ARGS(name, field_cnt, time))
+
+DEFINE_VDIN_EVENT(vdin_afbc);
+#endif /* _VDEC_TRACE_H */
+
+#if 0
+#define CREATE_TRACE_POINTS
+#include "vdin_trace.h"
+#undef TRACE_INCLUDE_PATH
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_PATH .
+#define TRACE_INCLUDE_FILE vdin_trace
+#include <trace/define_trace.h>
+
+#define VDIN_TRACE
+#ifdef VDIN_TRACE
+trace_vdin_afbc("vdin-afbc", devp->afbce_mode, devp->frame_cnt);
+#endif
+
+#endif
+
+/*
+ * a. clear pipe
+ * cat /sys/kernel/debug/tracing/trace_pipe
+ * b. enable trace di:
+ * echo 1 >/sys/kernel/debug/tracing/events/vdin/vdin_afbc/enable
+ * echo 1 >/sys/kernel/debug/tracing/tracing_on
+ * c. disable trace
+ * echo 0 >/sys/kernel/debug/tracing/tracing_on
+ * cat /sys/kernel/debug/tracing/trace_pipe
+ */
+