1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2
3/*
4 * Copyright (c) 2018 Intel Corporation.  All rights reserved.
5 */
6
7#undef TRACE_SYSTEM
8#define TRACE_SYSTEM ib_mad
9
10#if !defined(_TRACE_IB_MAD_H) || defined(TRACE_HEADER_MULTI_READ)
11#define _TRACE_IB_MAD_H
12
13#include <linux/tracepoint.h>
14#include <rdma/ib_mad.h>
15
16#ifdef CONFIG_TRACEPOINTS
17struct trace_event_raw_ib_mad_send_template;
18static void create_mad_addr_info(struct ib_mad_send_wr_private *mad_send_wr,
19			  struct ib_mad_qp_info *qp_info,
20			  struct trace_event_raw_ib_mad_send_template *entry);
21#endif
22
23DECLARE_EVENT_CLASS(ib_mad_send_template,
24	TP_PROTO(struct ib_mad_send_wr_private *wr,
25		 struct ib_mad_qp_info *qp_info),
26	TP_ARGS(wr, qp_info),
27
28	TP_STRUCT__entry(
29		__field(u8,             base_version)
30		__field(u8,             mgmt_class)
31		__field(u8,             class_version)
32		__field(u8,             port_num)
33		__field(u32,            qp_num)
34		__field(u8,             method)
35		__field(u8,             sl)
36		__field(u16,            attr_id)
37		__field(u32,            attr_mod)
38		__field(u64,            wrtid)
39		__field(u64,            tid)
40		__field(u16,            status)
41		__field(u16,            class_specific)
42		__field(u32,            length)
43		__field(u32,            dlid)
44		__field(u32,            rqpn)
45		__field(u32,            rqkey)
46		__field(u32,            dev_index)
47		__field(void *,         agent_priv)
48		__field(unsigned long,  timeout)
49		__field(int,            retries_left)
50		__field(int,            max_retries)
51		__field(int,            retry)
52	),
53
54	TP_fast_assign(
55		__entry->dev_index = wr->mad_agent_priv->agent.device->index;
56		__entry->port_num = wr->mad_agent_priv->agent.port_num;
57		__entry->qp_num = wr->mad_agent_priv->qp_info->qp->qp_num;
58		__entry->agent_priv = wr->mad_agent_priv;
59		__entry->wrtid = wr->tid;
60		__entry->max_retries = wr->max_retries;
61		__entry->retries_left = wr->retries_left;
62		__entry->retry = wr->retry;
63		__entry->timeout = wr->timeout;
64		__entry->length = wr->send_buf.hdr_len +
65				  wr->send_buf.data_len;
66		__entry->base_version =
67			((struct ib_mad_hdr *)wr->send_buf.mad)->base_version;
68		__entry->mgmt_class =
69			((struct ib_mad_hdr *)wr->send_buf.mad)->mgmt_class;
70		__entry->class_version =
71			((struct ib_mad_hdr *)wr->send_buf.mad)->class_version;
72		__entry->method =
73			((struct ib_mad_hdr *)wr->send_buf.mad)->method;
74		__entry->status =
75			((struct ib_mad_hdr *)wr->send_buf.mad)->status;
76		__entry->class_specific =
77			((struct ib_mad_hdr *)wr->send_buf.mad)->class_specific;
78		__entry->tid = ((struct ib_mad_hdr *)wr->send_buf.mad)->tid;
79		__entry->attr_id =
80			((struct ib_mad_hdr *)wr->send_buf.mad)->attr_id;
81		__entry->attr_mod =
82			((struct ib_mad_hdr *)wr->send_buf.mad)->attr_mod;
83		create_mad_addr_info(wr, qp_info, __entry);
84	),
85
86	TP_printk("%d:%d QP%d agent %p: " \
87		  "wrtid 0x%llx; %d/%d retries(%d); timeout %lu length %d : " \
88		  "hdr : base_ver 0x%x class 0x%x class_ver 0x%x " \
89		  "method 0x%x status 0x%x class_specific 0x%x tid 0x%llx " \
90		  "attr_id 0x%x attr_mod 0x%x  => dlid 0x%08x sl %d "\
91		  "rpqn 0x%x rqpkey 0x%x",
92		__entry->dev_index, __entry->port_num, __entry->qp_num,
93		__entry->agent_priv, be64_to_cpu(__entry->wrtid),
94		__entry->retries_left, __entry->max_retries,
95		__entry->retry, __entry->timeout, __entry->length,
96		__entry->base_version, __entry->mgmt_class,
97		__entry->class_version,
98		__entry->method, be16_to_cpu(__entry->status),
99		be16_to_cpu(__entry->class_specific),
100		be64_to_cpu(__entry->tid), be16_to_cpu(__entry->attr_id),
101		be32_to_cpu(__entry->attr_mod),
102		be32_to_cpu(__entry->dlid), __entry->sl,
103		__entry->rqpn, __entry->rqkey
104	)
105);
106
107DEFINE_EVENT(ib_mad_send_template, ib_mad_error_handler,
108	TP_PROTO(struct ib_mad_send_wr_private *wr,
109		 struct ib_mad_qp_info *qp_info),
110	TP_ARGS(wr, qp_info));
111DEFINE_EVENT(ib_mad_send_template, ib_mad_ib_send_mad,
112	TP_PROTO(struct ib_mad_send_wr_private *wr,
113		 struct ib_mad_qp_info *qp_info),
114	TP_ARGS(wr, qp_info));
115DEFINE_EVENT(ib_mad_send_template, ib_mad_send_done_resend,
116	TP_PROTO(struct ib_mad_send_wr_private *wr,
117		 struct ib_mad_qp_info *qp_info),
118	TP_ARGS(wr, qp_info));
119
120TRACE_EVENT(ib_mad_send_done_handler,
121	TP_PROTO(struct ib_mad_send_wr_private *wr, struct ib_wc *wc),
122	TP_ARGS(wr, wc),
123
124	TP_STRUCT__entry(
125		__field(u8,             port_num)
126		__field(u8,             base_version)
127		__field(u8,             mgmt_class)
128		__field(u8,             class_version)
129		__field(u32,            qp_num)
130		__field(u64,            wrtid)
131		__field(u16,            status)
132		__field(u16,            wc_status)
133		__field(u32,            length)
134		__field(void *,         agent_priv)
135		__field(unsigned long,  timeout)
136		__field(u32,            dev_index)
137		__field(int,            retries_left)
138		__field(int,            max_retries)
139		__field(int,            retry)
140		__field(u8,             method)
141	),
142
143	TP_fast_assign(
144		__entry->dev_index = wr->mad_agent_priv->agent.device->index;
145		__entry->port_num = wr->mad_agent_priv->agent.port_num;
146		__entry->qp_num = wr->mad_agent_priv->qp_info->qp->qp_num;
147		__entry->agent_priv = wr->mad_agent_priv;
148		__entry->wrtid = wr->tid;
149		__entry->max_retries = wr->max_retries;
150		__entry->retries_left = wr->retries_left;
151		__entry->retry = wr->retry;
152		__entry->timeout = wr->timeout;
153		__entry->base_version =
154			((struct ib_mad_hdr *)wr->send_buf.mad)->base_version;
155		__entry->mgmt_class =
156			((struct ib_mad_hdr *)wr->send_buf.mad)->mgmt_class;
157		__entry->class_version =
158			((struct ib_mad_hdr *)wr->send_buf.mad)->class_version;
159		__entry->method =
160			((struct ib_mad_hdr *)wr->send_buf.mad)->method;
161		__entry->status =
162			((struct ib_mad_hdr *)wr->send_buf.mad)->status;
163		__entry->wc_status = wc->status;
164		__entry->length = wc->byte_len;
165	),
166
167	TP_printk("%d:%d QP%d : SEND WC Status %d : agent %p: " \
168		  "wrtid 0x%llx %d/%d retries(%d) timeout %lu length %d: " \
169		  "hdr : base_ver 0x%x class 0x%x class_ver 0x%x " \
170		  "method 0x%x status 0x%x",
171		__entry->dev_index, __entry->port_num, __entry->qp_num,
172		__entry->wc_status,
173		__entry->agent_priv, be64_to_cpu(__entry->wrtid),
174		__entry->retries_left, __entry->max_retries,
175		__entry->retry, __entry->timeout,
176		__entry->length,
177		__entry->base_version, __entry->mgmt_class,
178		__entry->class_version, __entry->method,
179		be16_to_cpu(__entry->status)
180	)
181);
182
183TRACE_EVENT(ib_mad_recv_done_handler,
184	TP_PROTO(struct ib_mad_qp_info *qp_info, struct ib_wc *wc,
185		 struct ib_mad_hdr *mad_hdr),
186	TP_ARGS(qp_info, wc, mad_hdr),
187
188	TP_STRUCT__entry(
189		__field(u8,             base_version)
190		__field(u8,             mgmt_class)
191		__field(u8,             class_version)
192		__field(u8,             port_num)
193		__field(u32,            qp_num)
194		__field(u16,            status)
195		__field(u16,            class_specific)
196		__field(u32,            length)
197		__field(u64,            tid)
198		__field(u8,             method)
199		__field(u8,             sl)
200		__field(u16,            attr_id)
201		__field(u32,            attr_mod)
202		__field(u16,            src_qp)
203		__field(u16,            wc_status)
204		__field(u32,            slid)
205		__field(u32,            dev_index)
206	),
207
208	TP_fast_assign(
209		__entry->dev_index = qp_info->port_priv->device->index;
210		__entry->port_num = qp_info->port_priv->port_num;
211		__entry->qp_num = qp_info->qp->qp_num;
212		__entry->length = wc->byte_len;
213		__entry->base_version = mad_hdr->base_version;
214		__entry->mgmt_class = mad_hdr->mgmt_class;
215		__entry->class_version = mad_hdr->class_version;
216		__entry->method = mad_hdr->method;
217		__entry->status = mad_hdr->status;
218		__entry->class_specific = mad_hdr->class_specific;
219		__entry->tid = mad_hdr->tid;
220		__entry->attr_id = mad_hdr->attr_id;
221		__entry->attr_mod = mad_hdr->attr_mod;
222		__entry->slid = wc->slid;
223		__entry->src_qp = wc->src_qp;
224		__entry->sl = wc->sl;
225		__entry->wc_status = wc->status;
226	),
227
228	TP_printk("%d:%d QP%d : RECV WC Status %d : length %d : hdr : " \
229		  "base_ver 0x%02x class 0x%02x class_ver 0x%02x " \
230		  "method 0x%02x status 0x%04x class_specific 0x%04x " \
231		  "tid 0x%016llx attr_id 0x%04x attr_mod 0x%08x " \
232		  "slid 0x%08x src QP%d, sl %d",
233		__entry->dev_index, __entry->port_num, __entry->qp_num,
234		__entry->wc_status,
235		__entry->length,
236		__entry->base_version, __entry->mgmt_class,
237		__entry->class_version, __entry->method,
238		be16_to_cpu(__entry->status),
239		be16_to_cpu(__entry->class_specific),
240		be64_to_cpu(__entry->tid), be16_to_cpu(__entry->attr_id),
241		be32_to_cpu(__entry->attr_mod),
242		__entry->slid, __entry->src_qp, __entry->sl
243	)
244);
245
246DECLARE_EVENT_CLASS(ib_mad_agent_template,
247	TP_PROTO(struct ib_mad_agent_private *agent),
248	TP_ARGS(agent),
249
250	TP_STRUCT__entry(
251		__field(u32,            dev_index)
252		__field(u32,            hi_tid)
253		__field(u8,             port_num)
254		__field(u8,             mgmt_class)
255		__field(u8,             mgmt_class_version)
256	),
257
258	TP_fast_assign(
259		__entry->dev_index = agent->agent.device->index;
260		__entry->port_num = agent->agent.port_num;
261		__entry->hi_tid = agent->agent.hi_tid;
262
263		if (agent->reg_req) {
264			__entry->mgmt_class = agent->reg_req->mgmt_class;
265			__entry->mgmt_class_version =
266				agent->reg_req->mgmt_class_version;
267		} else {
268			__entry->mgmt_class = 0;
269			__entry->mgmt_class_version = 0;
270		}
271	),
272
273	TP_printk("%d:%d mad agent : hi_tid 0x%08x class 0x%02x class_ver 0x%02x",
274		__entry->dev_index, __entry->port_num,
275		__entry->hi_tid, __entry->mgmt_class,
276		__entry->mgmt_class_version
277	)
278);
279DEFINE_EVENT(ib_mad_agent_template, ib_mad_recv_done_agent,
280	TP_PROTO(struct ib_mad_agent_private *agent),
281	TP_ARGS(agent));
282DEFINE_EVENT(ib_mad_agent_template, ib_mad_send_done_agent,
283	TP_PROTO(struct ib_mad_agent_private *agent),
284	TP_ARGS(agent));
285DEFINE_EVENT(ib_mad_agent_template, ib_mad_create_agent,
286	TP_PROTO(struct ib_mad_agent_private *agent),
287	TP_ARGS(agent));
288DEFINE_EVENT(ib_mad_agent_template, ib_mad_unregister_agent,
289	TP_PROTO(struct ib_mad_agent_private *agent),
290	TP_ARGS(agent));
291
292
293
294DECLARE_EVENT_CLASS(ib_mad_opa_smi_template,
295	TP_PROTO(struct opa_smp *smp),
296	TP_ARGS(smp),
297
298	TP_STRUCT__entry(
299		__field(u64,            mkey)
300		__field(u32,            dr_slid)
301		__field(u32,            dr_dlid)
302		__field(u8,             hop_ptr)
303		__field(u8,             hop_cnt)
304		__array(u8,             initial_path, OPA_SMP_MAX_PATH_HOPS)
305		__array(u8,             return_path, OPA_SMP_MAX_PATH_HOPS)
306	),
307
308	TP_fast_assign(
309		__entry->hop_ptr = smp->hop_ptr;
310		__entry->hop_cnt = smp->hop_cnt;
311		__entry->mkey = smp->mkey;
312		__entry->dr_slid = smp->route.dr.dr_slid;
313		__entry->dr_dlid = smp->route.dr.dr_dlid;
314		memcpy(__entry->initial_path, smp->route.dr.initial_path,
315			OPA_SMP_MAX_PATH_HOPS);
316		memcpy(__entry->return_path, smp->route.dr.return_path,
317			OPA_SMP_MAX_PATH_HOPS);
318	),
319
320	TP_printk("OPA SMP: hop_ptr %d hop_cnt %d " \
321		  "mkey 0x%016llx dr_slid 0x%08x dr_dlid 0x%08x " \
322		  "initial_path %*ph return_path %*ph ",
323		__entry->hop_ptr, __entry->hop_cnt,
324		be64_to_cpu(__entry->mkey), be32_to_cpu(__entry->dr_slid),
325		be32_to_cpu(__entry->dr_dlid),
326		OPA_SMP_MAX_PATH_HOPS, __entry->initial_path,
327		OPA_SMP_MAX_PATH_HOPS, __entry->return_path
328	)
329);
330
331DEFINE_EVENT(ib_mad_opa_smi_template, ib_mad_handle_opa_smi,
332	TP_PROTO(struct opa_smp *smp),
333	TP_ARGS(smp));
334DEFINE_EVENT(ib_mad_opa_smi_template, ib_mad_handle_out_opa_smi,
335	TP_PROTO(struct opa_smp *smp),
336	TP_ARGS(smp));
337
338
339DECLARE_EVENT_CLASS(ib_mad_opa_ib_template,
340	TP_PROTO(struct ib_smp *smp),
341	TP_ARGS(smp),
342
343	TP_STRUCT__entry(
344		__field(u64,            mkey)
345		__field(u32,            dr_slid)
346		__field(u32,            dr_dlid)
347		__field(u8,             hop_ptr)
348		__field(u8,             hop_cnt)
349		__array(u8,             initial_path, IB_SMP_MAX_PATH_HOPS)
350		__array(u8,             return_path, IB_SMP_MAX_PATH_HOPS)
351	),
352
353	TP_fast_assign(
354		__entry->hop_ptr = smp->hop_ptr;
355		__entry->hop_cnt = smp->hop_cnt;
356		__entry->mkey = smp->mkey;
357		__entry->dr_slid = smp->dr_slid;
358		__entry->dr_dlid = smp->dr_dlid;
359		memcpy(__entry->initial_path, smp->initial_path,
360			IB_SMP_MAX_PATH_HOPS);
361		memcpy(__entry->return_path, smp->return_path,
362			IB_SMP_MAX_PATH_HOPS);
363	),
364
365	TP_printk("OPA SMP: hop_ptr %d hop_cnt %d " \
366		  "mkey 0x%016llx dr_slid 0x%04x dr_dlid 0x%04x " \
367		  "initial_path %*ph return_path %*ph ",
368		__entry->hop_ptr, __entry->hop_cnt,
369		be64_to_cpu(__entry->mkey), be16_to_cpu(__entry->dr_slid),
370		be16_to_cpu(__entry->dr_dlid),
371		IB_SMP_MAX_PATH_HOPS, __entry->initial_path,
372		IB_SMP_MAX_PATH_HOPS, __entry->return_path
373	)
374);
375
376DEFINE_EVENT(ib_mad_opa_ib_template, ib_mad_handle_ib_smi,
377	TP_PROTO(struct ib_smp *smp),
378	TP_ARGS(smp));
379DEFINE_EVENT(ib_mad_opa_ib_template, ib_mad_handle_out_ib_smi,
380	TP_PROTO(struct ib_smp *smp),
381	TP_ARGS(smp));
382
383#endif /* _TRACE_IB_MAD_H */
384
385#include <trace/define_trace.h>
386