/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ /* * Copyright(c) 2015 - 2018 Intel Corporation. */ #if !defined(__HFI1_TRACE_EXTRA_H) || defined(TRACE_HEADER_MULTI_READ) #define __HFI1_TRACE_EXTRA_H #include #include #include "hfi.h" /* * Note: * This produces a REALLY ugly trace in the console output when the string is * too long. */ #undef TRACE_SYSTEM #define TRACE_SYSTEM hfi1_dbg #define MAX_MSG_LEN 512 DECLARE_EVENT_CLASS(hfi1_trace_template, TP_PROTO(const char *function, struct va_format *vaf), TP_ARGS(function, vaf), TP_STRUCT__entry(__string(function, function) __dynamic_array(char, msg, MAX_MSG_LEN) ), TP_fast_assign(__assign_str(function, function); WARN_ON_ONCE(vsnprintf (__get_dynamic_array(msg), MAX_MSG_LEN, vaf->fmt, *vaf->va) >= MAX_MSG_LEN); ), TP_printk("(%s) %s", __get_str(function), __get_str(msg)) ); /* * It may be nice to macroize the __hfi1_trace but the va_* stuff requires an * actual function to work and can not be in a macro. */ #define __hfi1_trace_def(lvl) \ void __printf(2, 3) __hfi1_trace_##lvl(const char *funct, char *fmt, ...); \ \ DEFINE_EVENT(hfi1_trace_template, hfi1_ ##lvl, \ TP_PROTO(const char *function, struct va_format *vaf), \ TP_ARGS(function, vaf)) #define __hfi1_trace_fn(lvl) \ void __printf(2, 3) __hfi1_trace_##lvl(const char *func, char *fmt, ...)\ { \ struct va_format vaf = { \ .fmt = fmt, \ }; \ va_list args; \ \ va_start(args, fmt); \ vaf.va = &args; \ trace_hfi1_ ##lvl(func, &vaf); \ va_end(args); \ return; \ } /* * To create a new trace level simply define it below and as a __hfi1_trace_fn * in trace.c. This will create all the hooks for calling * hfi1_cdbg(LVL, fmt, ...); as well as take care of all * the debugfs stuff. */ __hfi1_trace_def(AFFINITY); __hfi1_trace_def(PKT); __hfi1_trace_def(PROC); __hfi1_trace_def(SDMA); __hfi1_trace_def(LINKVERB); __hfi1_trace_def(DEBUG); __hfi1_trace_def(SNOOP); __hfi1_trace_def(CNTR); __hfi1_trace_def(PIO); __hfi1_trace_def(DC8051); __hfi1_trace_def(FIRMWARE); __hfi1_trace_def(RCVCTRL); __hfi1_trace_def(TID); __hfi1_trace_def(MMU); __hfi1_trace_def(IOCTL); #define hfi1_cdbg(which, fmt, ...) \ __hfi1_trace_##which(__func__, fmt, ##__VA_ARGS__) #define hfi1_dbg(fmt, ...) \ hfi1_cdbg(DEBUG, fmt, ##__VA_ARGS__) /* * Define HFI1_EARLY_DBG at compile time or here to enable early trace * messages. Do not check in an enablement for this. */ #ifdef HFI1_EARLY_DBG #define hfi1_dbg_early(fmt, ...) \ trace_printk(fmt, ##__VA_ARGS__) #else #define hfi1_dbg_early(fmt, ...) #endif #endif /* __HFI1_TRACE_EXTRA_H */ #undef TRACE_INCLUDE_PATH #undef TRACE_INCLUDE_FILE #define TRACE_INCLUDE_PATH . #define TRACE_INCLUDE_FILE trace_dbg #include