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