18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci* Copyright(c) 2015 - 2018 Intel Corporation. 38c2ecf20Sopenharmony_ci* 48c2ecf20Sopenharmony_ci* This file is provided under a dual BSD/GPLv2 license. When using or 58c2ecf20Sopenharmony_ci* redistributing this file, you may do so under either license. 68c2ecf20Sopenharmony_ci* 78c2ecf20Sopenharmony_ci* GPL LICENSE SUMMARY 88c2ecf20Sopenharmony_ci* 98c2ecf20Sopenharmony_ci* This program is free software; you can redistribute it and/or modify 108c2ecf20Sopenharmony_ci* it under the terms of version 2 of the GNU General Public License as 118c2ecf20Sopenharmony_ci* published by the Free Software Foundation. 128c2ecf20Sopenharmony_ci* 138c2ecf20Sopenharmony_ci* This program is distributed in the hope that it will be useful, but 148c2ecf20Sopenharmony_ci* WITHOUT ANY WARRANTY; without even the implied warranty of 158c2ecf20Sopenharmony_ci* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 168c2ecf20Sopenharmony_ci* General Public License for more details. 178c2ecf20Sopenharmony_ci* 188c2ecf20Sopenharmony_ci* BSD LICENSE 198c2ecf20Sopenharmony_ci* 208c2ecf20Sopenharmony_ci* Redistribution and use in source and binary forms, with or without 218c2ecf20Sopenharmony_ci* modification, are permitted provided that the following conditions 228c2ecf20Sopenharmony_ci* are met: 238c2ecf20Sopenharmony_ci* 248c2ecf20Sopenharmony_ci* - Redistributions of source code must retain the above copyright 258c2ecf20Sopenharmony_ci* notice, this list of conditions and the following disclaimer. 268c2ecf20Sopenharmony_ci* - Redistributions in binary form must reproduce the above copyright 278c2ecf20Sopenharmony_ci* notice, this list of conditions and the following disclaimer in 288c2ecf20Sopenharmony_ci* the documentation and/or other materials provided with the 298c2ecf20Sopenharmony_ci* distribution. 308c2ecf20Sopenharmony_ci* - Neither the name of Intel Corporation nor the names of its 318c2ecf20Sopenharmony_ci* contributors may be used to endorse or promote products derived 328c2ecf20Sopenharmony_ci* from this software without specific prior written permission. 338c2ecf20Sopenharmony_ci* 348c2ecf20Sopenharmony_ci* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 358c2ecf20Sopenharmony_ci* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 368c2ecf20Sopenharmony_ci* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 378c2ecf20Sopenharmony_ci* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 388c2ecf20Sopenharmony_ci* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 398c2ecf20Sopenharmony_ci* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 408c2ecf20Sopenharmony_ci* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 418c2ecf20Sopenharmony_ci* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 428c2ecf20Sopenharmony_ci* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 438c2ecf20Sopenharmony_ci* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 448c2ecf20Sopenharmony_ci* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 458c2ecf20Sopenharmony_ci* 468c2ecf20Sopenharmony_ci*/ 478c2ecf20Sopenharmony_ci#if !defined(__HFI1_TRACE_EXTRA_H) || defined(TRACE_HEADER_MULTI_READ) 488c2ecf20Sopenharmony_ci#define __HFI1_TRACE_EXTRA_H 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#include <linux/tracepoint.h> 518c2ecf20Sopenharmony_ci#include <linux/trace_seq.h> 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#include "hfi.h" 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/* 568c2ecf20Sopenharmony_ci * Note: 578c2ecf20Sopenharmony_ci * This produces a REALLY ugly trace in the console output when the string is 588c2ecf20Sopenharmony_ci * too long. 598c2ecf20Sopenharmony_ci */ 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#undef TRACE_SYSTEM 628c2ecf20Sopenharmony_ci#define TRACE_SYSTEM hfi1_dbg 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci#define MAX_MSG_LEN 512 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ciDECLARE_EVENT_CLASS(hfi1_trace_template, 678c2ecf20Sopenharmony_ci TP_PROTO(const char *function, struct va_format *vaf), 688c2ecf20Sopenharmony_ci TP_ARGS(function, vaf), 698c2ecf20Sopenharmony_ci TP_STRUCT__entry(__string(function, function) 708c2ecf20Sopenharmony_ci __dynamic_array(char, msg, MAX_MSG_LEN) 718c2ecf20Sopenharmony_ci ), 728c2ecf20Sopenharmony_ci TP_fast_assign(__assign_str(function, function); 738c2ecf20Sopenharmony_ci WARN_ON_ONCE(vsnprintf 748c2ecf20Sopenharmony_ci (__get_dynamic_array(msg), 758c2ecf20Sopenharmony_ci MAX_MSG_LEN, vaf->fmt, 768c2ecf20Sopenharmony_ci *vaf->va) >= 778c2ecf20Sopenharmony_ci MAX_MSG_LEN); 788c2ecf20Sopenharmony_ci ), 798c2ecf20Sopenharmony_ci TP_printk("(%s) %s", 808c2ecf20Sopenharmony_ci __get_str(function), 818c2ecf20Sopenharmony_ci __get_str(msg)) 828c2ecf20Sopenharmony_ci); 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci/* 858c2ecf20Sopenharmony_ci * It may be nice to macroize the __hfi1_trace but the va_* stuff requires an 868c2ecf20Sopenharmony_ci * actual function to work and can not be in a macro. 878c2ecf20Sopenharmony_ci */ 888c2ecf20Sopenharmony_ci#define __hfi1_trace_def(lvl) \ 898c2ecf20Sopenharmony_civoid __printf(2, 3) __hfi1_trace_##lvl(const char *funct, char *fmt, ...); \ 908c2ecf20Sopenharmony_ci \ 918c2ecf20Sopenharmony_ciDEFINE_EVENT(hfi1_trace_template, hfi1_ ##lvl, \ 928c2ecf20Sopenharmony_ci TP_PROTO(const char *function, struct va_format *vaf), \ 938c2ecf20Sopenharmony_ci TP_ARGS(function, vaf)) 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci#define __hfi1_trace_fn(lvl) \ 968c2ecf20Sopenharmony_civoid __printf(2, 3) __hfi1_trace_##lvl(const char *func, char *fmt, ...)\ 978c2ecf20Sopenharmony_ci{ \ 988c2ecf20Sopenharmony_ci struct va_format vaf = { \ 998c2ecf20Sopenharmony_ci .fmt = fmt, \ 1008c2ecf20Sopenharmony_ci }; \ 1018c2ecf20Sopenharmony_ci va_list args; \ 1028c2ecf20Sopenharmony_ci \ 1038c2ecf20Sopenharmony_ci va_start(args, fmt); \ 1048c2ecf20Sopenharmony_ci vaf.va = &args; \ 1058c2ecf20Sopenharmony_ci trace_hfi1_ ##lvl(func, &vaf); \ 1068c2ecf20Sopenharmony_ci va_end(args); \ 1078c2ecf20Sopenharmony_ci return; \ 1088c2ecf20Sopenharmony_ci} 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/* 1118c2ecf20Sopenharmony_ci * To create a new trace level simply define it below and as a __hfi1_trace_fn 1128c2ecf20Sopenharmony_ci * in trace.c. This will create all the hooks for calling 1138c2ecf20Sopenharmony_ci * hfi1_cdbg(LVL, fmt, ...); as well as take care of all 1148c2ecf20Sopenharmony_ci * the debugfs stuff. 1158c2ecf20Sopenharmony_ci */ 1168c2ecf20Sopenharmony_ci__hfi1_trace_def(AFFINITY); 1178c2ecf20Sopenharmony_ci__hfi1_trace_def(PKT); 1188c2ecf20Sopenharmony_ci__hfi1_trace_def(PROC); 1198c2ecf20Sopenharmony_ci__hfi1_trace_def(SDMA); 1208c2ecf20Sopenharmony_ci__hfi1_trace_def(LINKVERB); 1218c2ecf20Sopenharmony_ci__hfi1_trace_def(DEBUG); 1228c2ecf20Sopenharmony_ci__hfi1_trace_def(SNOOP); 1238c2ecf20Sopenharmony_ci__hfi1_trace_def(CNTR); 1248c2ecf20Sopenharmony_ci__hfi1_trace_def(PIO); 1258c2ecf20Sopenharmony_ci__hfi1_trace_def(DC8051); 1268c2ecf20Sopenharmony_ci__hfi1_trace_def(FIRMWARE); 1278c2ecf20Sopenharmony_ci__hfi1_trace_def(RCVCTRL); 1288c2ecf20Sopenharmony_ci__hfi1_trace_def(TID); 1298c2ecf20Sopenharmony_ci__hfi1_trace_def(MMU); 1308c2ecf20Sopenharmony_ci__hfi1_trace_def(IOCTL); 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci#define hfi1_cdbg(which, fmt, ...) \ 1338c2ecf20Sopenharmony_ci __hfi1_trace_##which(__func__, fmt, ##__VA_ARGS__) 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#define hfi1_dbg(fmt, ...) \ 1368c2ecf20Sopenharmony_ci hfi1_cdbg(DEBUG, fmt, ##__VA_ARGS__) 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci/* 1398c2ecf20Sopenharmony_ci * Define HFI1_EARLY_DBG at compile time or here to enable early trace 1408c2ecf20Sopenharmony_ci * messages. Do not check in an enablement for this. 1418c2ecf20Sopenharmony_ci */ 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci#ifdef HFI1_EARLY_DBG 1448c2ecf20Sopenharmony_ci#define hfi1_dbg_early(fmt, ...) \ 1458c2ecf20Sopenharmony_ci trace_printk(fmt, ##__VA_ARGS__) 1468c2ecf20Sopenharmony_ci#else 1478c2ecf20Sopenharmony_ci#define hfi1_dbg_early(fmt, ...) 1488c2ecf20Sopenharmony_ci#endif 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci#endif /* __HFI1_TRACE_EXTRA_H */ 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_PATH 1538c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_FILE 1548c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_PATH . 1558c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_FILE trace_dbg 1568c2ecf20Sopenharmony_ci#include <trace/define_trace.h> 157