1145eba1aSCai Huoqing /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
2462b6b21SSebastian Sanchez /*
35d18ee67SSebastian Sanchez * Copyright(c) 2015 - 2018 Intel Corporation.
4462b6b21SSebastian Sanchez */
5145eba1aSCai Huoqing 
6462b6b21SSebastian Sanchez #if !defined(__HFI1_TRACE_EXTRA_H) || defined(TRACE_HEADER_MULTI_READ)
7462b6b21SSebastian Sanchez #define __HFI1_TRACE_EXTRA_H
8462b6b21SSebastian Sanchez 
9462b6b21SSebastian Sanchez #include <linux/tracepoint.h>
10462b6b21SSebastian Sanchez #include <linux/trace_seq.h>
11462b6b21SSebastian Sanchez 
12462b6b21SSebastian Sanchez #include "hfi.h"
13462b6b21SSebastian Sanchez 
14462b6b21SSebastian Sanchez /*
15462b6b21SSebastian Sanchez  * Note:
16462b6b21SSebastian Sanchez  * This produces a REALLY ugly trace in the console output when the string is
17462b6b21SSebastian Sanchez  * too long.
18462b6b21SSebastian Sanchez  */
19462b6b21SSebastian Sanchez 
20462b6b21SSebastian Sanchez #undef TRACE_SYSTEM
21462b6b21SSebastian Sanchez #define TRACE_SYSTEM hfi1_dbg
22462b6b21SSebastian Sanchez 
23462b6b21SSebastian Sanchez #define MAX_MSG_LEN 512
24462b6b21SSebastian Sanchez 
25*cf0455f1SEhab Ababneh #pragma GCC diagnostic push
26*cf0455f1SEhab Ababneh #ifndef __clang__
27*cf0455f1SEhab Ababneh #pragma GCC diagnostic ignored "-Wsuggest-attribute=format"
28*cf0455f1SEhab Ababneh #endif
29*cf0455f1SEhab Ababneh 
30462b6b21SSebastian Sanchez DECLARE_EVENT_CLASS(hfi1_trace_template,
31462b6b21SSebastian Sanchez 		    TP_PROTO(const char *function, struct va_format *vaf),
32462b6b21SSebastian Sanchez 		    TP_ARGS(function, vaf),
33462b6b21SSebastian Sanchez 		    TP_STRUCT__entry(__string(function, function)
348d7f5df0SSteven Rostedt (Google) 				     __vstring(msg, vaf->fmt, vaf->va)
35462b6b21SSebastian Sanchez 				     ),
36462b6b21SSebastian Sanchez 		    TP_fast_assign(__assign_str(function, function);
378d7f5df0SSteven Rostedt (Google) 				   __assign_vstr(msg, vaf->fmt, vaf->va);
38462b6b21SSebastian Sanchez 				   ),
39462b6b21SSebastian Sanchez 		    TP_printk("(%s) %s",
40462b6b21SSebastian Sanchez 			      __get_str(function),
41462b6b21SSebastian Sanchez 			      __get_str(msg))
42462b6b21SSebastian Sanchez );
43462b6b21SSebastian Sanchez 
44*cf0455f1SEhab Ababneh #pragma GCC diagnostic pop
45*cf0455f1SEhab Ababneh 
46462b6b21SSebastian Sanchez /*
47462b6b21SSebastian Sanchez  * It may be nice to macroize the __hfi1_trace but the va_* stuff requires an
48462b6b21SSebastian Sanchez  * actual function to work and can not be in a macro.
49462b6b21SSebastian Sanchez  */
50462b6b21SSebastian Sanchez #define __hfi1_trace_def(lvl) \
51920d10e4SBart Van Assche void __printf(2, 3) __hfi1_trace_##lvl(const char *funct, char *fmt, ...); \
52462b6b21SSebastian Sanchez 									\
53462b6b21SSebastian Sanchez DEFINE_EVENT(hfi1_trace_template, hfi1_ ##lvl,				\
54462b6b21SSebastian Sanchez 	TP_PROTO(const char *function, struct va_format *vaf),		\
55462b6b21SSebastian Sanchez 	TP_ARGS(function, vaf))
56462b6b21SSebastian Sanchez 
57462b6b21SSebastian Sanchez #define __hfi1_trace_fn(lvl) \
58920d10e4SBart Van Assche void __printf(2, 3) __hfi1_trace_##lvl(const char *func, char *fmt, ...)\
59462b6b21SSebastian Sanchez {									\
60462b6b21SSebastian Sanchez 	struct va_format vaf = {					\
61462b6b21SSebastian Sanchez 		.fmt = fmt,						\
62462b6b21SSebastian Sanchez 	};								\
63462b6b21SSebastian Sanchez 	va_list args;							\
64462b6b21SSebastian Sanchez 									\
65462b6b21SSebastian Sanchez 	va_start(args, fmt);						\
66462b6b21SSebastian Sanchez 	vaf.va = &args;							\
67462b6b21SSebastian Sanchez 	trace_hfi1_ ##lvl(func, &vaf);					\
68462b6b21SSebastian Sanchez 	va_end(args);							\
69462b6b21SSebastian Sanchez 	return;								\
70462b6b21SSebastian Sanchez }
71462b6b21SSebastian Sanchez 
72462b6b21SSebastian Sanchez /*
73462b6b21SSebastian Sanchez  * To create a new trace level simply define it below and as a __hfi1_trace_fn
74462b6b21SSebastian Sanchez  * in trace.c. This will create all the hooks for calling
75462b6b21SSebastian Sanchez  * hfi1_cdbg(LVL, fmt, ...); as well as take care of all
76462b6b21SSebastian Sanchez  * the debugfs stuff.
77462b6b21SSebastian Sanchez  */
785d18ee67SSebastian Sanchez __hfi1_trace_def(AFFINITY);
79462b6b21SSebastian Sanchez __hfi1_trace_def(PKT);
80462b6b21SSebastian Sanchez __hfi1_trace_def(PROC);
81462b6b21SSebastian Sanchez __hfi1_trace_def(SDMA);
82462b6b21SSebastian Sanchez __hfi1_trace_def(LINKVERB);
83462b6b21SSebastian Sanchez __hfi1_trace_def(DEBUG);
84462b6b21SSebastian Sanchez __hfi1_trace_def(SNOOP);
85462b6b21SSebastian Sanchez __hfi1_trace_def(CNTR);
86462b6b21SSebastian Sanchez __hfi1_trace_def(PIO);
87462b6b21SSebastian Sanchez __hfi1_trace_def(DC8051);
88462b6b21SSebastian Sanchez __hfi1_trace_def(FIRMWARE);
89462b6b21SSebastian Sanchez __hfi1_trace_def(RCVCTRL);
90462b6b21SSebastian Sanchez __hfi1_trace_def(TID);
91462b6b21SSebastian Sanchez __hfi1_trace_def(MMU);
92462b6b21SSebastian Sanchez __hfi1_trace_def(IOCTL);
93462b6b21SSebastian Sanchez 
94462b6b21SSebastian Sanchez #define hfi1_cdbg(which, fmt, ...) \
95462b6b21SSebastian Sanchez 	__hfi1_trace_##which(__func__, fmt, ##__VA_ARGS__)
96462b6b21SSebastian Sanchez 
97462b6b21SSebastian Sanchez #define hfi1_dbg(fmt, ...) \
98462b6b21SSebastian Sanchez 	hfi1_cdbg(DEBUG, fmt, ##__VA_ARGS__)
99462b6b21SSebastian Sanchez 
100462b6b21SSebastian Sanchez /*
101462b6b21SSebastian Sanchez  * Define HFI1_EARLY_DBG at compile time or here to enable early trace
102462b6b21SSebastian Sanchez  * messages. Do not check in an enablement for this.
103462b6b21SSebastian Sanchez  */
104462b6b21SSebastian Sanchez 
105462b6b21SSebastian Sanchez #ifdef HFI1_EARLY_DBG
106462b6b21SSebastian Sanchez #define hfi1_dbg_early(fmt, ...) \
107462b6b21SSebastian Sanchez 	trace_printk(fmt, ##__VA_ARGS__)
108462b6b21SSebastian Sanchez #else
109462b6b21SSebastian Sanchez #define hfi1_dbg_early(fmt, ...)
110462b6b21SSebastian Sanchez #endif
111462b6b21SSebastian Sanchez 
112462b6b21SSebastian Sanchez #endif /* __HFI1_TRACE_EXTRA_H */
113462b6b21SSebastian Sanchez 
114462b6b21SSebastian Sanchez #undef TRACE_INCLUDE_PATH
115462b6b21SSebastian Sanchez #undef TRACE_INCLUDE_FILE
116462b6b21SSebastian Sanchez #define TRACE_INCLUDE_PATH .
117462b6b21SSebastian Sanchez #define TRACE_INCLUDE_FILE trace_dbg
118462b6b21SSebastian Sanchez #include <trace/define_trace.h>
119