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