* more details.
*
*/
+#include <linux/module.h>
#define CREATE_TRACE_POINTS
#include <trace/events/meson_atrace.h>
-EXPORT_TRACEPOINT_SYMBOL_GPL(tracing_mark_write);
+static uint64_t atrace_tag;
+
+#define TAG_INFO(name) \
+ { #name, KERNEL_ATRACE_TAG_ ## name }
+
+struct {
+ char *name;
+ int tag;
+} tag_info[] = {
+ TAG_INFO(VIDEO),
+ TAG_INFO(CODEC_MM),
+ TAG_INFO(VDEC),
+ TAG_INFO(TSYNC),
+ { NULL, 0 }
+};
+
+int get_atrace_tag_enabled(unsigned short tag)
+{
+ if (tag == KERNEL_ATRACE_TAG_ALL)
+ return 1;
+ return atrace_tag & (1 << tag);
+}
+EXPORT_SYMBOL(get_atrace_tag_enabled);
+
+void set_atrace_tag_enabled(unsigned short tag, int enable)
+{
+ if (enable)
+ atrace_tag |= 1 << tag;
+ else
+ atrace_tag &= ~(1 << tag);
+}
+EXPORT_SYMBOL(set_atrace_tag_enabled);
+
+static ssize_t show_atrace_tag(struct class *class,
+ struct class_attribute *attr, char *buf)
+{
+ ssize_t size = 0;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(tag_info) && tag_info[i].name; i++) {
+ size += sprintf(buf + size, "%2d %s %s\n",
+ tag_info[i].tag, tag_info[i].name,
+ get_atrace_tag_enabled(tag_info[i].tag) ? "ON" : "OFF");
+ }
+
+ return size;
+}
+
+static ssize_t store_atrace_tag(struct class *class,
+ struct class_attribute *attr,
+ const char *buf, size_t size)
+{
+ unsigned int tag;
+ ssize_t r;
+
+ r = kstrtouint(buf, 0, &tag);
+
+ if (r != 0)
+ return -EINVAL;
+ if (tag < KERNEL_ATRACE_TAG_MAX)
+ set_atrace_tag_enabled(tag, !get_atrace_tag_enabled(tag));
+
+ return size;
+}
+
+
+static struct class_attribute debug_class_attrs[] = {
+ __ATTR(atrace_tag, 0664, show_atrace_tag, store_atrace_tag),
+ __ATTR_NULL
+};
+
+static struct class debug_class = {
+ .name = "debug",
+ .class_attrs = debug_class_attrs,
+ };
+
+static int __init debug_module_init(void)
+{
+ int r;
+
+ r = class_register(&debug_class);
+
+ if (r) {
+ pr_err("debug class create fail.\n");
+ return r;
+ }
+
+ return 0;
+}
+
+static void __exit debug_module_exit(void)
+{
+ class_unregister(&debug_class);
+}
+
+void meson_atrace(int tag, const char *name, unsigned int flags,
+ unsigned int value)
+{
+ if (get_atrace_tag_enabled(tag))
+ trace_tracing_mark_write(name, flags, value);
+}
+EXPORT_SYMBOL_GPL(meson_atrace);
+
+
+module_init(debug_module_init);
+module_exit(debug_module_exit);
+MODULE_DESCRIPTION("AMLOGIC meson debugger controller");
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Tao Guo <tao.guo@amlogic.com>");
#include <linux/amlogic/media/utils/vdec_reg.h>
#include <linux/amlogic/media/registers/register.h>
#include <linux/amlogic/media/vout/vout_notify.h>
+#define KERNEL_ATRACE_TAG KERNEL_ATRACE_TAG_TSYNC
#include <trace/events/meson_atrace.h>
void timestamp_vpts_set(u32 pts)
{
video_pts = pts;
+ ATRACE_COUNTER("VPTS", video_pts);
}
EXPORT_SYMBOL(timestamp_vpts_set);
void timestamp_vpts_inc(s32 val)
{
video_pts += val;
+ ATRACE_COUNTER("VPTS", video_pts);
}
EXPORT_SYMBOL(timestamp_vpts_inc);
void timestamp_apts_set(u32 pts)
{
audio_pts = pts;
+ ATRACE_COUNTER("APTS", audio_pts);
}
EXPORT_SYMBOL(timestamp_apts_set);
inc = inc * timestamp_inc_factor / PLL_FACTOR;
#endif
audio_pts += inc;
+ ATRACE_COUNTER("APTS", audio_pts);
}
}
EXPORT_SYMBOL(timestamp_apts_inc);
void timestamp_pcrscr_set(u32 pts)
{
/*pr_info("timestamp_pcrscr_set system time = %x\n", pts);*/
- ATRACE_COUNTER("PCRSCR", pts);
system_time = pts;
+ ATRACE_COUNTER("PCRSCR", pts);
}
EXPORT_SYMBOL(timestamp_pcrscr_set);
#define KERNEL_ATRACE_COUNTER 0
#define KERNEL_ATRACE_BEGIN 1
#define KERNEL_ATRACE_END 2
+#define KERNEL_ATRACE_ASYNC_BEGIN 3
+#define KERNEL_ATRACE_ASYNC_END 4
+
+#if !defined(TRACE_HEADER_MULTI_READ)
+
+enum {
+ KERNEL_ATRACE_TAG_VIDEO,
+ KERNEL_ATRACE_TAG_CODEC_MM,
+ KERNEL_ATRACE_TAG_VDEC,
+ KERNEL_ATRACE_TAG_TSYNC,
+ KERNEL_ATRACE_TAG_MAX = 64,
+ KERNEL_ATRACE_TAG_ALL
+};
+
+#endif
#define print_flags_header(flags) __print_flags(flags, "", \
- { (1UL << KERNEL_ATRACE_COUNTER), "C" }, \
- { (1UL << KERNEL_ATRACE_BEGIN), "B" }, \
- { (1UL << KERNEL_ATRACE_END), "E" })
+ { (1UL << KERNEL_ATRACE_COUNTER), "C" }, \
+ { (1UL << KERNEL_ATRACE_BEGIN), "B" }, \
+ { (1UL << KERNEL_ATRACE_END), "E" }, \
+ { (1UL << KERNEL_ATRACE_ASYNC_BEGIN), "S" }, \
+ { (1UL << KERNEL_ATRACE_ASYNC_END), "F" })
#define print_flags_delim(flags) __print_flags(flags, "", \
- { (1UL << KERNEL_ATRACE_COUNTER), "|1|" }, \
- { (1UL << KERNEL_ATRACE_BEGIN), "|1|" }, \
- { (1UL << KERNEL_ATRACE_END), "" })
+ { (1UL << KERNEL_ATRACE_COUNTER), "|1|" },\
+ { (1UL << KERNEL_ATRACE_BEGIN), "|1|" },\
+ { (1UL << KERNEL_ATRACE_END), "" }, \
+ { (1UL << KERNEL_ATRACE_ASYNC_BEGIN), "|1|" },\
+ { (1UL << KERNEL_ATRACE_ASYNC_END), "|1|" })
TRACE_EVENT(tracing_mark_write,
print_flags_delim(__entry->flags),
__get_str(name), __entry->value)
);
+
#ifdef CONFIG_AMLOGIC_DEBUG_ATRACE
+void meson_atrace(int tag, const char *name, unsigned int flags,
+ unsigned int value);
+
#define ATRACE_COUNTER(name, value) \
- trace_tracing_mark_write(name, (1 << KERNEL_ATRACE_COUNTER), value)
+ meson_atrace(KERNEL_ATRACE_TAG, name, \
+ (1 << KERNEL_ATRACE_COUNTER), value)
#define ATRACE_BEGIN(name) \
- trace_tracing_mark_write(name, (1 << KERNEL_ATRACE_BEGIN), 0)
+ meson_atrace(KERNEL_ATRACE_TAG, name, \
+ (1 << KERNEL_ATRACE_BEGIN), 0)
#define ATRACE_END(name) \
- trace_tracing_mark_write("", (1 << KERNEL_ATRACE_END), 1)
+ meson_atrace(KERNEL_ATRACE_TAG, "", \
+ (1 << KERNEL_ATRACE_END), 1)
+#define ATRACE_ASYNC_BEGIN(name, cookie) \
+ meson_atrace(KERNEL_ATRACE_TAG, name, \
+ (1 << KERNEL_ATRACE_ASYNC_BEGIN), cookie)
+#define ATRACE_ASYNC_END(name, cookie) \
+ meson_atrace(KERNEL_ATRACE_TAG, name, \
+ (1 << KERNEL_ATRACE_ASYNC_END), cookie)
#else
#define ATRACE_COUNTER(name, value)
#define ATRACE_BEGIN(name)
#define ATRACE_END(name)
+#define ATRACE_ASYNC_BEGIN(name, cookie)
+#define ATRACE_ASYNC_END(name, cookie)
#endif
#endif /* _TRACE_MESON_BASE_H */