162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci* Copyright(c) 2015 - 2018 Intel Corporation. 462306a36Sopenharmony_ci*/ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#if !defined(__HFI1_TRACE_EXTRA_H) || defined(TRACE_HEADER_MULTI_READ) 762306a36Sopenharmony_ci#define __HFI1_TRACE_EXTRA_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/tracepoint.h> 1062306a36Sopenharmony_ci#include <linux/trace_seq.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "hfi.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * Note: 1662306a36Sopenharmony_ci * This produces a REALLY ugly trace in the console output when the string is 1762306a36Sopenharmony_ci * too long. 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#undef TRACE_SYSTEM 2162306a36Sopenharmony_ci#define TRACE_SYSTEM hfi1_dbg 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define MAX_MSG_LEN 512 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#pragma GCC diagnostic push 2662306a36Sopenharmony_ci#ifndef __clang__ 2762306a36Sopenharmony_ci#pragma GCC diagnostic ignored "-Wsuggest-attribute=format" 2862306a36Sopenharmony_ci#endif 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciDECLARE_EVENT_CLASS(hfi1_trace_template, 3162306a36Sopenharmony_ci TP_PROTO(const char *function, struct va_format *vaf), 3262306a36Sopenharmony_ci TP_ARGS(function, vaf), 3362306a36Sopenharmony_ci TP_STRUCT__entry(__string(function, function) 3462306a36Sopenharmony_ci __vstring(msg, vaf->fmt, vaf->va) 3562306a36Sopenharmony_ci ), 3662306a36Sopenharmony_ci TP_fast_assign(__assign_str(function, function); 3762306a36Sopenharmony_ci __assign_vstr(msg, vaf->fmt, vaf->va); 3862306a36Sopenharmony_ci ), 3962306a36Sopenharmony_ci TP_printk("(%s) %s", 4062306a36Sopenharmony_ci __get_str(function), 4162306a36Sopenharmony_ci __get_str(msg)) 4262306a36Sopenharmony_ci); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#pragma GCC diagnostic pop 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * It may be nice to macroize the __hfi1_trace but the va_* stuff requires an 4862306a36Sopenharmony_ci * actual function to work and can not be in a macro. 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_ci#define __hfi1_trace_def(lvl) \ 5162306a36Sopenharmony_civoid __printf(2, 3) __hfi1_trace_##lvl(const char *funct, char *fmt, ...); \ 5262306a36Sopenharmony_ci \ 5362306a36Sopenharmony_ciDEFINE_EVENT(hfi1_trace_template, hfi1_ ##lvl, \ 5462306a36Sopenharmony_ci TP_PROTO(const char *function, struct va_format *vaf), \ 5562306a36Sopenharmony_ci TP_ARGS(function, vaf)) 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define __hfi1_trace_fn(lvl) \ 5862306a36Sopenharmony_civoid __printf(2, 3) __hfi1_trace_##lvl(const char *func, char *fmt, ...)\ 5962306a36Sopenharmony_ci{ \ 6062306a36Sopenharmony_ci struct va_format vaf = { \ 6162306a36Sopenharmony_ci .fmt = fmt, \ 6262306a36Sopenharmony_ci }; \ 6362306a36Sopenharmony_ci va_list args; \ 6462306a36Sopenharmony_ci \ 6562306a36Sopenharmony_ci va_start(args, fmt); \ 6662306a36Sopenharmony_ci vaf.va = &args; \ 6762306a36Sopenharmony_ci trace_hfi1_ ##lvl(func, &vaf); \ 6862306a36Sopenharmony_ci va_end(args); \ 6962306a36Sopenharmony_ci return; \ 7062306a36Sopenharmony_ci} 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* 7362306a36Sopenharmony_ci * To create a new trace level simply define it below and as a __hfi1_trace_fn 7462306a36Sopenharmony_ci * in trace.c. This will create all the hooks for calling 7562306a36Sopenharmony_ci * hfi1_cdbg(LVL, fmt, ...); as well as take care of all 7662306a36Sopenharmony_ci * the debugfs stuff. 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_ci__hfi1_trace_def(AFFINITY); 7962306a36Sopenharmony_ci__hfi1_trace_def(PKT); 8062306a36Sopenharmony_ci__hfi1_trace_def(PROC); 8162306a36Sopenharmony_ci__hfi1_trace_def(SDMA); 8262306a36Sopenharmony_ci__hfi1_trace_def(LINKVERB); 8362306a36Sopenharmony_ci__hfi1_trace_def(DEBUG); 8462306a36Sopenharmony_ci__hfi1_trace_def(SNOOP); 8562306a36Sopenharmony_ci__hfi1_trace_def(CNTR); 8662306a36Sopenharmony_ci__hfi1_trace_def(PIO); 8762306a36Sopenharmony_ci__hfi1_trace_def(DC8051); 8862306a36Sopenharmony_ci__hfi1_trace_def(FIRMWARE); 8962306a36Sopenharmony_ci__hfi1_trace_def(RCVCTRL); 9062306a36Sopenharmony_ci__hfi1_trace_def(TID); 9162306a36Sopenharmony_ci__hfi1_trace_def(MMU); 9262306a36Sopenharmony_ci__hfi1_trace_def(IOCTL); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define hfi1_cdbg(which, fmt, ...) \ 9562306a36Sopenharmony_ci __hfi1_trace_##which(__func__, fmt, ##__VA_ARGS__) 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci#define hfi1_dbg(fmt, ...) \ 9862306a36Sopenharmony_ci hfi1_cdbg(DEBUG, fmt, ##__VA_ARGS__) 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* 10162306a36Sopenharmony_ci * Define HFI1_EARLY_DBG at compile time or here to enable early trace 10262306a36Sopenharmony_ci * messages. Do not check in an enablement for this. 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#ifdef HFI1_EARLY_DBG 10662306a36Sopenharmony_ci#define hfi1_dbg_early(fmt, ...) \ 10762306a36Sopenharmony_ci trace_printk(fmt, ##__VA_ARGS__) 10862306a36Sopenharmony_ci#else 10962306a36Sopenharmony_ci#define hfi1_dbg_early(fmt, ...) 11062306a36Sopenharmony_ci#endif 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#endif /* __HFI1_TRACE_EXTRA_H */ 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH 11562306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE 11662306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH . 11762306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace_dbg 11862306a36Sopenharmony_ci#include <trace/define_trace.h> 119