1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright(c) 2015 - 2020 Intel Corporation.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * This file is provided under a dual BSD/GPLv2 license. When using or
5*4882a593Smuzhiyun * redistributing this file, you may do so under either license.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * GPL LICENSE SUMMARY
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify
10*4882a593Smuzhiyun * it under the terms of version 2 of the GNU General Public License as
11*4882a593Smuzhiyun * published by the Free Software Foundation.
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but
14*4882a593Smuzhiyun * WITHOUT ANY WARRANTY; without even the implied warranty of
15*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16*4882a593Smuzhiyun * General Public License for more details.
17*4882a593Smuzhiyun *
18*4882a593Smuzhiyun * BSD LICENSE
19*4882a593Smuzhiyun *
20*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without
21*4882a593Smuzhiyun * modification, are permitted provided that the following conditions
22*4882a593Smuzhiyun * are met:
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * - Redistributions of source code must retain the above copyright
25*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer.
26*4882a593Smuzhiyun * - Redistributions in binary form must reproduce the above copyright
27*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in
28*4882a593Smuzhiyun * the documentation and/or other materials provided with the
29*4882a593Smuzhiyun * distribution.
30*4882a593Smuzhiyun * - Neither the name of Intel Corporation nor the names of its
31*4882a593Smuzhiyun * contributors may be used to endorse or promote products derived
32*4882a593Smuzhiyun * from this software without specific prior written permission.
33*4882a593Smuzhiyun *
34*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35*4882a593Smuzhiyun * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36*4882a593Smuzhiyun * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
37*4882a593Smuzhiyun * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
38*4882a593Smuzhiyun * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
39*4882a593Smuzhiyun * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
40*4882a593Smuzhiyun * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
41*4882a593Smuzhiyun * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
42*4882a593Smuzhiyun * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
43*4882a593Smuzhiyun * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
44*4882a593Smuzhiyun * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45*4882a593Smuzhiyun *
46*4882a593Smuzhiyun */
47*4882a593Smuzhiyun #define CREATE_TRACE_POINTS
48*4882a593Smuzhiyun #include "trace.h"
49*4882a593Smuzhiyun #include "exp_rcv.h"
50*4882a593Smuzhiyun #include "ipoib.h"
51*4882a593Smuzhiyun
__get_ib_hdr_len(struct ib_header * hdr)52*4882a593Smuzhiyun static u8 __get_ib_hdr_len(struct ib_header *hdr)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun struct ib_other_headers *ohdr;
55*4882a593Smuzhiyun u8 opcode;
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun if (ib_get_lnh(hdr) == HFI1_LRH_BTH)
58*4882a593Smuzhiyun ohdr = &hdr->u.oth;
59*4882a593Smuzhiyun else
60*4882a593Smuzhiyun ohdr = &hdr->u.l.oth;
61*4882a593Smuzhiyun opcode = ib_bth_get_opcode(ohdr);
62*4882a593Smuzhiyun return hdr_len_by_opcode[opcode] == 0 ?
63*4882a593Smuzhiyun 0 : hdr_len_by_opcode[opcode] - (12 + 8);
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
__get_16b_hdr_len(struct hfi1_16b_header * hdr)66*4882a593Smuzhiyun static u8 __get_16b_hdr_len(struct hfi1_16b_header *hdr)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun struct ib_other_headers *ohdr = NULL;
69*4882a593Smuzhiyun u8 opcode;
70*4882a593Smuzhiyun u8 l4 = hfi1_16B_get_l4(hdr);
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun if (l4 == OPA_16B_L4_FM) {
73*4882a593Smuzhiyun opcode = IB_OPCODE_UD_SEND_ONLY;
74*4882a593Smuzhiyun return (8 + 8); /* No BTH */
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun if (l4 == OPA_16B_L4_IB_LOCAL)
78*4882a593Smuzhiyun ohdr = &hdr->u.oth;
79*4882a593Smuzhiyun else
80*4882a593Smuzhiyun ohdr = &hdr->u.l.oth;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun opcode = ib_bth_get_opcode(ohdr);
83*4882a593Smuzhiyun return hdr_len_by_opcode[opcode] == 0 ?
84*4882a593Smuzhiyun 0 : hdr_len_by_opcode[opcode] - (12 + 8 + 8);
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
hfi1_trace_packet_hdr_len(struct hfi1_packet * packet)87*4882a593Smuzhiyun u8 hfi1_trace_packet_hdr_len(struct hfi1_packet *packet)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun if (packet->etype != RHF_RCV_TYPE_BYPASS)
90*4882a593Smuzhiyun return __get_ib_hdr_len(packet->hdr);
91*4882a593Smuzhiyun else
92*4882a593Smuzhiyun return __get_16b_hdr_len(packet->hdr);
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun
hfi1_trace_opa_hdr_len(struct hfi1_opa_header * opa_hdr)95*4882a593Smuzhiyun u8 hfi1_trace_opa_hdr_len(struct hfi1_opa_header *opa_hdr)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun if (!opa_hdr->hdr_type)
98*4882a593Smuzhiyun return __get_ib_hdr_len(&opa_hdr->ibh);
99*4882a593Smuzhiyun else
100*4882a593Smuzhiyun return __get_16b_hdr_len(&opa_hdr->opah);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
hfi1_trace_get_packet_l4_str(u8 l4)103*4882a593Smuzhiyun const char *hfi1_trace_get_packet_l4_str(u8 l4)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun if (l4)
106*4882a593Smuzhiyun return "16B";
107*4882a593Smuzhiyun else
108*4882a593Smuzhiyun return "9B";
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun
hfi1_trace_get_packet_l2_str(u8 l2)111*4882a593Smuzhiyun const char *hfi1_trace_get_packet_l2_str(u8 l2)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun switch (l2) {
114*4882a593Smuzhiyun case 0:
115*4882a593Smuzhiyun return "0";
116*4882a593Smuzhiyun case 1:
117*4882a593Smuzhiyun return "1";
118*4882a593Smuzhiyun case 2:
119*4882a593Smuzhiyun return "16B";
120*4882a593Smuzhiyun case 3:
121*4882a593Smuzhiyun return "9B";
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun return "";
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun #define IMM_PRN "imm:%d"
127*4882a593Smuzhiyun #define RETH_PRN "reth vaddr:0x%.16llx rkey:0x%.8x dlen:0x%.8x"
128*4882a593Smuzhiyun #define AETH_PRN "aeth syn:0x%.2x %s msn:0x%.8x"
129*4882a593Smuzhiyun #define DETH_PRN "deth qkey:0x%.8x sqpn:0x%.6x"
130*4882a593Smuzhiyun #define DETH_ENTROPY_PRN "deth qkey:0x%.8x sqpn:0x%.6x entropy:0x%.2x"
131*4882a593Smuzhiyun #define IETH_PRN "ieth rkey:0x%.8x"
132*4882a593Smuzhiyun #define ATOMICACKETH_PRN "origdata:%llx"
133*4882a593Smuzhiyun #define ATOMICETH_PRN "vaddr:0x%llx rkey:0x%.8x sdata:%llx cdata:%llx"
134*4882a593Smuzhiyun #define TID_RDMA_KDETH "kdeth0 0x%x kdeth1 0x%x"
135*4882a593Smuzhiyun #define TID_RDMA_KDETH_DATA "kdeth0 0x%x: kver %u sh %u intr %u tidctrl %u tid %x offset %x kdeth1 0x%x: jkey %x"
136*4882a593Smuzhiyun #define TID_READ_REQ_PRN "tid_flow_psn 0x%x tid_flow_qp 0x%x verbs_qp 0x%x"
137*4882a593Smuzhiyun #define TID_READ_RSP_PRN "verbs_qp 0x%x"
138*4882a593Smuzhiyun #define TID_WRITE_REQ_PRN "original_qp 0x%x"
139*4882a593Smuzhiyun #define TID_WRITE_RSP_PRN "tid_flow_psn 0x%x tid_flow_qp 0x%x verbs_qp 0x%x"
140*4882a593Smuzhiyun #define TID_WRITE_DATA_PRN "verbs_qp 0x%x"
141*4882a593Smuzhiyun #define TID_ACK_PRN "tid_flow_psn 0x%x verbs_psn 0x%x tid_flow_qp 0x%x verbs_qp 0x%x"
142*4882a593Smuzhiyun #define TID_RESYNC_PRN "verbs_qp 0x%x"
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun #define OP(transport, op) IB_OPCODE_## transport ## _ ## op
145*4882a593Smuzhiyun
parse_syndrome(u8 syndrome)146*4882a593Smuzhiyun static const char *parse_syndrome(u8 syndrome)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun switch (syndrome >> 5) {
149*4882a593Smuzhiyun case 0:
150*4882a593Smuzhiyun return "ACK";
151*4882a593Smuzhiyun case 1:
152*4882a593Smuzhiyun return "RNRNAK";
153*4882a593Smuzhiyun case 3:
154*4882a593Smuzhiyun return "NAK";
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun return "";
157*4882a593Smuzhiyun }
158*4882a593Smuzhiyun
hfi1_trace_parse_9b_bth(struct ib_other_headers * ohdr,u8 * ack,bool * becn,bool * fecn,u8 * mig,u8 * se,u8 * pad,u8 * opcode,u8 * tver,u16 * pkey,u32 * psn,u32 * qpn)159*4882a593Smuzhiyun void hfi1_trace_parse_9b_bth(struct ib_other_headers *ohdr,
160*4882a593Smuzhiyun u8 *ack, bool *becn, bool *fecn, u8 *mig,
161*4882a593Smuzhiyun u8 *se, u8 *pad, u8 *opcode, u8 *tver,
162*4882a593Smuzhiyun u16 *pkey, u32 *psn, u32 *qpn)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun *ack = ib_bth_get_ackreq(ohdr);
165*4882a593Smuzhiyun *becn = ib_bth_get_becn(ohdr);
166*4882a593Smuzhiyun *fecn = ib_bth_get_fecn(ohdr);
167*4882a593Smuzhiyun *mig = ib_bth_get_migreq(ohdr);
168*4882a593Smuzhiyun *se = ib_bth_get_se(ohdr);
169*4882a593Smuzhiyun *pad = ib_bth_get_pad(ohdr);
170*4882a593Smuzhiyun *opcode = ib_bth_get_opcode(ohdr);
171*4882a593Smuzhiyun *tver = ib_bth_get_tver(ohdr);
172*4882a593Smuzhiyun *pkey = ib_bth_get_pkey(ohdr);
173*4882a593Smuzhiyun *psn = mask_psn(ib_bth_get_psn(ohdr));
174*4882a593Smuzhiyun *qpn = ib_bth_get_qpn(ohdr);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun
hfi1_trace_parse_16b_bth(struct ib_other_headers * ohdr,u8 * ack,u8 * mig,u8 * opcode,u8 * pad,u8 * se,u8 * tver,u32 * psn,u32 * qpn)177*4882a593Smuzhiyun void hfi1_trace_parse_16b_bth(struct ib_other_headers *ohdr,
178*4882a593Smuzhiyun u8 *ack, u8 *mig, u8 *opcode,
179*4882a593Smuzhiyun u8 *pad, u8 *se, u8 *tver,
180*4882a593Smuzhiyun u32 *psn, u32 *qpn)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun *ack = ib_bth_get_ackreq(ohdr);
183*4882a593Smuzhiyun *mig = ib_bth_get_migreq(ohdr);
184*4882a593Smuzhiyun *opcode = ib_bth_get_opcode(ohdr);
185*4882a593Smuzhiyun *pad = ib_bth_get_pad(ohdr);
186*4882a593Smuzhiyun *se = ib_bth_get_se(ohdr);
187*4882a593Smuzhiyun *tver = ib_bth_get_tver(ohdr);
188*4882a593Smuzhiyun *psn = mask_psn(ib_bth_get_psn(ohdr));
189*4882a593Smuzhiyun *qpn = ib_bth_get_qpn(ohdr);
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
hfi1_trace_parse_9b_hdr(struct ib_header * hdr,bool sc5,u8 * lnh,u8 * lver,u8 * sl,u8 * sc,u16 * len,u32 * dlid,u32 * slid)192*4882a593Smuzhiyun void hfi1_trace_parse_9b_hdr(struct ib_header *hdr, bool sc5,
193*4882a593Smuzhiyun u8 *lnh, u8 *lver, u8 *sl, u8 *sc,
194*4882a593Smuzhiyun u16 *len, u32 *dlid, u32 *slid)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun *lnh = ib_get_lnh(hdr);
197*4882a593Smuzhiyun *lver = ib_get_lver(hdr);
198*4882a593Smuzhiyun *sl = ib_get_sl(hdr);
199*4882a593Smuzhiyun *sc = ib_get_sc(hdr) | (sc5 << 4);
200*4882a593Smuzhiyun *len = ib_get_len(hdr);
201*4882a593Smuzhiyun *dlid = ib_get_dlid(hdr);
202*4882a593Smuzhiyun *slid = ib_get_slid(hdr);
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun
hfi1_trace_parse_16b_hdr(struct hfi1_16b_header * hdr,u8 * age,bool * becn,bool * fecn,u8 * l4,u8 * rc,u8 * sc,u16 * entropy,u16 * len,u16 * pkey,u32 * dlid,u32 * slid)205*4882a593Smuzhiyun void hfi1_trace_parse_16b_hdr(struct hfi1_16b_header *hdr,
206*4882a593Smuzhiyun u8 *age, bool *becn, bool *fecn,
207*4882a593Smuzhiyun u8 *l4, u8 *rc, u8 *sc,
208*4882a593Smuzhiyun u16 *entropy, u16 *len, u16 *pkey,
209*4882a593Smuzhiyun u32 *dlid, u32 *slid)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun *age = hfi1_16B_get_age(hdr);
212*4882a593Smuzhiyun *becn = hfi1_16B_get_becn(hdr);
213*4882a593Smuzhiyun *fecn = hfi1_16B_get_fecn(hdr);
214*4882a593Smuzhiyun *l4 = hfi1_16B_get_l4(hdr);
215*4882a593Smuzhiyun *rc = hfi1_16B_get_rc(hdr);
216*4882a593Smuzhiyun *sc = hfi1_16B_get_sc(hdr);
217*4882a593Smuzhiyun *entropy = hfi1_16B_get_entropy(hdr);
218*4882a593Smuzhiyun *len = hfi1_16B_get_len(hdr);
219*4882a593Smuzhiyun *pkey = hfi1_16B_get_pkey(hdr);
220*4882a593Smuzhiyun *dlid = hfi1_16B_get_dlid(hdr);
221*4882a593Smuzhiyun *slid = hfi1_16B_get_slid(hdr);
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun #define LRH_PRN "len:%d sc:%d dlid:0x%.4x slid:0x%.4x "
225*4882a593Smuzhiyun #define LRH_9B_PRN "lnh:%d,%s lver:%d sl:%d"
226*4882a593Smuzhiyun #define LRH_16B_PRN "age:%d becn:%d fecn:%d l4:%d " \
227*4882a593Smuzhiyun "rc:%d sc:%d pkey:0x%.4x entropy:0x%.4x"
hfi1_trace_fmt_lrh(struct trace_seq * p,bool bypass,u8 age,bool becn,bool fecn,u8 l4,u8 lnh,const char * lnh_name,u8 lver,u8 rc,u8 sc,u8 sl,u16 entropy,u16 len,u16 pkey,u32 dlid,u32 slid)228*4882a593Smuzhiyun const char *hfi1_trace_fmt_lrh(struct trace_seq *p, bool bypass,
229*4882a593Smuzhiyun u8 age, bool becn, bool fecn, u8 l4,
230*4882a593Smuzhiyun u8 lnh, const char *lnh_name, u8 lver,
231*4882a593Smuzhiyun u8 rc, u8 sc, u8 sl, u16 entropy,
232*4882a593Smuzhiyun u16 len, u16 pkey, u32 dlid, u32 slid)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun trace_seq_printf(p, LRH_PRN, len, sc, dlid, slid);
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun if (bypass)
239*4882a593Smuzhiyun trace_seq_printf(p, LRH_16B_PRN,
240*4882a593Smuzhiyun age, becn, fecn, l4, rc, sc, pkey, entropy);
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun else
243*4882a593Smuzhiyun trace_seq_printf(p, LRH_9B_PRN,
244*4882a593Smuzhiyun lnh, lnh_name, lver, sl);
245*4882a593Smuzhiyun trace_seq_putc(p, 0);
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun return ret;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun #define BTH_9B_PRN \
251*4882a593Smuzhiyun "op:0x%.2x,%s se:%d m:%d pad:%d tver:%d pkey:0x%.4x " \
252*4882a593Smuzhiyun "f:%d b:%d qpn:0x%.6x a:%d psn:0x%.8x"
253*4882a593Smuzhiyun #define BTH_16B_PRN \
254*4882a593Smuzhiyun "op:0x%.2x,%s se:%d m:%d pad:%d tver:%d " \
255*4882a593Smuzhiyun "qpn:0x%.6x a:%d psn:0x%.8x"
256*4882a593Smuzhiyun #define L4_FM_16B_PRN \
257*4882a593Smuzhiyun "op:0x%.2x,%s dest_qpn:0x%.6x src_qpn:0x%.6x"
hfi1_trace_fmt_rest(struct trace_seq * p,bool bypass,u8 l4,u8 ack,bool becn,bool fecn,u8 mig,u8 se,u8 pad,u8 opcode,const char * opname,u8 tver,u16 pkey,u32 psn,u32 qpn,u32 dest_qpn,u32 src_qpn)258*4882a593Smuzhiyun const char *hfi1_trace_fmt_rest(struct trace_seq *p, bool bypass, u8 l4,
259*4882a593Smuzhiyun u8 ack, bool becn, bool fecn, u8 mig,
260*4882a593Smuzhiyun u8 se, u8 pad, u8 opcode, const char *opname,
261*4882a593Smuzhiyun u8 tver, u16 pkey, u32 psn, u32 qpn,
262*4882a593Smuzhiyun u32 dest_qpn, u32 src_qpn)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun if (bypass)
267*4882a593Smuzhiyun if (l4 == OPA_16B_L4_FM)
268*4882a593Smuzhiyun trace_seq_printf(p, L4_FM_16B_PRN,
269*4882a593Smuzhiyun opcode, opname, dest_qpn, src_qpn);
270*4882a593Smuzhiyun else
271*4882a593Smuzhiyun trace_seq_printf(p, BTH_16B_PRN,
272*4882a593Smuzhiyun opcode, opname,
273*4882a593Smuzhiyun se, mig, pad, tver, qpn, ack, psn);
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun else
276*4882a593Smuzhiyun trace_seq_printf(p, BTH_9B_PRN,
277*4882a593Smuzhiyun opcode, opname,
278*4882a593Smuzhiyun se, mig, pad, tver, pkey, fecn, becn,
279*4882a593Smuzhiyun qpn, ack, psn);
280*4882a593Smuzhiyun trace_seq_putc(p, 0);
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun return ret;
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun
parse_everbs_hdrs(struct trace_seq * p,u8 opcode,u8 l4,u32 dest_qpn,u32 src_qpn,void * ehdrs)285*4882a593Smuzhiyun const char *parse_everbs_hdrs(
286*4882a593Smuzhiyun struct trace_seq *p,
287*4882a593Smuzhiyun u8 opcode, u8 l4, u32 dest_qpn, u32 src_qpn,
288*4882a593Smuzhiyun void *ehdrs)
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun union ib_ehdrs *eh = ehdrs;
291*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun if (l4 == OPA_16B_L4_FM) {
294*4882a593Smuzhiyun trace_seq_printf(p, "mgmt pkt");
295*4882a593Smuzhiyun goto out;
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun switch (opcode) {
299*4882a593Smuzhiyun /* imm */
300*4882a593Smuzhiyun case OP(RC, SEND_LAST_WITH_IMMEDIATE):
301*4882a593Smuzhiyun case OP(UC, SEND_LAST_WITH_IMMEDIATE):
302*4882a593Smuzhiyun case OP(RC, SEND_ONLY_WITH_IMMEDIATE):
303*4882a593Smuzhiyun case OP(UC, SEND_ONLY_WITH_IMMEDIATE):
304*4882a593Smuzhiyun case OP(RC, RDMA_WRITE_LAST_WITH_IMMEDIATE):
305*4882a593Smuzhiyun case OP(UC, RDMA_WRITE_LAST_WITH_IMMEDIATE):
306*4882a593Smuzhiyun trace_seq_printf(p, IMM_PRN,
307*4882a593Smuzhiyun be32_to_cpu(eh->imm_data));
308*4882a593Smuzhiyun break;
309*4882a593Smuzhiyun /* reth + imm */
310*4882a593Smuzhiyun case OP(RC, RDMA_WRITE_ONLY_WITH_IMMEDIATE):
311*4882a593Smuzhiyun case OP(UC, RDMA_WRITE_ONLY_WITH_IMMEDIATE):
312*4882a593Smuzhiyun trace_seq_printf(p, RETH_PRN " " IMM_PRN,
313*4882a593Smuzhiyun get_ib_reth_vaddr(&eh->rc.reth),
314*4882a593Smuzhiyun be32_to_cpu(eh->rc.reth.rkey),
315*4882a593Smuzhiyun be32_to_cpu(eh->rc.reth.length),
316*4882a593Smuzhiyun be32_to_cpu(eh->rc.imm_data));
317*4882a593Smuzhiyun break;
318*4882a593Smuzhiyun /* reth */
319*4882a593Smuzhiyun case OP(RC, RDMA_READ_REQUEST):
320*4882a593Smuzhiyun case OP(RC, RDMA_WRITE_FIRST):
321*4882a593Smuzhiyun case OP(UC, RDMA_WRITE_FIRST):
322*4882a593Smuzhiyun case OP(RC, RDMA_WRITE_ONLY):
323*4882a593Smuzhiyun case OP(UC, RDMA_WRITE_ONLY):
324*4882a593Smuzhiyun trace_seq_printf(p, RETH_PRN,
325*4882a593Smuzhiyun get_ib_reth_vaddr(&eh->rc.reth),
326*4882a593Smuzhiyun be32_to_cpu(eh->rc.reth.rkey),
327*4882a593Smuzhiyun be32_to_cpu(eh->rc.reth.length));
328*4882a593Smuzhiyun break;
329*4882a593Smuzhiyun case OP(RC, RDMA_READ_RESPONSE_FIRST):
330*4882a593Smuzhiyun case OP(RC, RDMA_READ_RESPONSE_LAST):
331*4882a593Smuzhiyun case OP(RC, RDMA_READ_RESPONSE_ONLY):
332*4882a593Smuzhiyun case OP(RC, ACKNOWLEDGE):
333*4882a593Smuzhiyun trace_seq_printf(p, AETH_PRN, be32_to_cpu(eh->aeth) >> 24,
334*4882a593Smuzhiyun parse_syndrome(be32_to_cpu(eh->aeth) >> 24),
335*4882a593Smuzhiyun be32_to_cpu(eh->aeth) & IB_MSN_MASK);
336*4882a593Smuzhiyun break;
337*4882a593Smuzhiyun case OP(TID_RDMA, WRITE_REQ):
338*4882a593Smuzhiyun trace_seq_printf(p, TID_RDMA_KDETH " " RETH_PRN " "
339*4882a593Smuzhiyun TID_WRITE_REQ_PRN,
340*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.w_req.kdeth0),
341*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.w_req.kdeth1),
342*4882a593Smuzhiyun ib_u64_get(&eh->tid_rdma.w_req.reth.vaddr),
343*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_req.reth.rkey),
344*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_req.reth.length),
345*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_req.verbs_qp));
346*4882a593Smuzhiyun break;
347*4882a593Smuzhiyun case OP(TID_RDMA, WRITE_RESP):
348*4882a593Smuzhiyun trace_seq_printf(p, TID_RDMA_KDETH " " AETH_PRN " "
349*4882a593Smuzhiyun TID_WRITE_RSP_PRN,
350*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.w_rsp.kdeth0),
351*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.w_rsp.kdeth1),
352*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_rsp.aeth) >> 24,
353*4882a593Smuzhiyun parse_syndrome(/* aeth */
354*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_rsp.aeth)
355*4882a593Smuzhiyun >> 24),
356*4882a593Smuzhiyun (be32_to_cpu(eh->tid_rdma.w_rsp.aeth) &
357*4882a593Smuzhiyun IB_MSN_MASK),
358*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_rsp.tid_flow_psn),
359*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_rsp.tid_flow_qp),
360*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_rsp.verbs_qp));
361*4882a593Smuzhiyun break;
362*4882a593Smuzhiyun case OP(TID_RDMA, WRITE_DATA_LAST):
363*4882a593Smuzhiyun case OP(TID_RDMA, WRITE_DATA):
364*4882a593Smuzhiyun trace_seq_printf(p, TID_RDMA_KDETH_DATA " " TID_WRITE_DATA_PRN,
365*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.w_data.kdeth0),
366*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.w_data.kdeth0, KVER),
367*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.w_data.kdeth0, SH),
368*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.w_data.kdeth0, INTR),
369*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.w_data.kdeth0, TIDCTRL),
370*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.w_data.kdeth0, TID),
371*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.w_data.kdeth0, OFFSET),
372*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.w_data.kdeth1),
373*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.w_data.kdeth1, JKEY),
374*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.w_data.verbs_qp));
375*4882a593Smuzhiyun break;
376*4882a593Smuzhiyun case OP(TID_RDMA, READ_REQ):
377*4882a593Smuzhiyun trace_seq_printf(p, TID_RDMA_KDETH " " RETH_PRN " "
378*4882a593Smuzhiyun TID_READ_REQ_PRN,
379*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.r_req.kdeth0),
380*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.r_req.kdeth1),
381*4882a593Smuzhiyun ib_u64_get(&eh->tid_rdma.r_req.reth.vaddr),
382*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.r_req.reth.rkey),
383*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.r_req.reth.length),
384*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.r_req.tid_flow_psn),
385*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.r_req.tid_flow_qp),
386*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.r_req.verbs_qp));
387*4882a593Smuzhiyun break;
388*4882a593Smuzhiyun case OP(TID_RDMA, READ_RESP):
389*4882a593Smuzhiyun trace_seq_printf(p, TID_RDMA_KDETH_DATA " " AETH_PRN " "
390*4882a593Smuzhiyun TID_READ_RSP_PRN,
391*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.r_rsp.kdeth0),
392*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.r_rsp.kdeth0, KVER),
393*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.r_rsp.kdeth0, SH),
394*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.r_rsp.kdeth0, INTR),
395*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.r_rsp.kdeth0, TIDCTRL),
396*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.r_rsp.kdeth0, TID),
397*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.r_rsp.kdeth0, OFFSET),
398*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.r_rsp.kdeth1),
399*4882a593Smuzhiyun KDETH_GET(eh->tid_rdma.r_rsp.kdeth1, JKEY),
400*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.r_rsp.aeth) >> 24,
401*4882a593Smuzhiyun parse_syndrome(/* aeth */
402*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.r_rsp.aeth)
403*4882a593Smuzhiyun >> 24),
404*4882a593Smuzhiyun (be32_to_cpu(eh->tid_rdma.r_rsp.aeth) &
405*4882a593Smuzhiyun IB_MSN_MASK),
406*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.r_rsp.verbs_qp));
407*4882a593Smuzhiyun break;
408*4882a593Smuzhiyun case OP(TID_RDMA, ACK):
409*4882a593Smuzhiyun trace_seq_printf(p, TID_RDMA_KDETH " " AETH_PRN " "
410*4882a593Smuzhiyun TID_ACK_PRN,
411*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.ack.kdeth0),
412*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.ack.kdeth1),
413*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.ack.aeth) >> 24,
414*4882a593Smuzhiyun parse_syndrome(/* aeth */
415*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.ack.aeth)
416*4882a593Smuzhiyun >> 24),
417*4882a593Smuzhiyun (be32_to_cpu(eh->tid_rdma.ack.aeth) &
418*4882a593Smuzhiyun IB_MSN_MASK),
419*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.ack.tid_flow_psn),
420*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.ack.verbs_psn),
421*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.ack.tid_flow_qp),
422*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.ack.verbs_qp));
423*4882a593Smuzhiyun break;
424*4882a593Smuzhiyun case OP(TID_RDMA, RESYNC):
425*4882a593Smuzhiyun trace_seq_printf(p, TID_RDMA_KDETH " " TID_RESYNC_PRN,
426*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.resync.kdeth0),
427*4882a593Smuzhiyun le32_to_cpu(eh->tid_rdma.resync.kdeth1),
428*4882a593Smuzhiyun be32_to_cpu(eh->tid_rdma.resync.verbs_qp));
429*4882a593Smuzhiyun break;
430*4882a593Smuzhiyun /* aeth + atomicacketh */
431*4882a593Smuzhiyun case OP(RC, ATOMIC_ACKNOWLEDGE):
432*4882a593Smuzhiyun trace_seq_printf(p, AETH_PRN " " ATOMICACKETH_PRN,
433*4882a593Smuzhiyun be32_to_cpu(eh->at.aeth) >> 24,
434*4882a593Smuzhiyun parse_syndrome(be32_to_cpu(eh->at.aeth) >> 24),
435*4882a593Smuzhiyun be32_to_cpu(eh->at.aeth) & IB_MSN_MASK,
436*4882a593Smuzhiyun ib_u64_get(&eh->at.atomic_ack_eth));
437*4882a593Smuzhiyun break;
438*4882a593Smuzhiyun /* atomiceth */
439*4882a593Smuzhiyun case OP(RC, COMPARE_SWAP):
440*4882a593Smuzhiyun case OP(RC, FETCH_ADD):
441*4882a593Smuzhiyun trace_seq_printf(p, ATOMICETH_PRN,
442*4882a593Smuzhiyun get_ib_ateth_vaddr(&eh->atomic_eth),
443*4882a593Smuzhiyun eh->atomic_eth.rkey,
444*4882a593Smuzhiyun get_ib_ateth_swap(&eh->atomic_eth),
445*4882a593Smuzhiyun get_ib_ateth_compare(&eh->atomic_eth));
446*4882a593Smuzhiyun break;
447*4882a593Smuzhiyun /* deth */
448*4882a593Smuzhiyun case OP(UD, SEND_ONLY):
449*4882a593Smuzhiyun trace_seq_printf(p, DETH_ENTROPY_PRN,
450*4882a593Smuzhiyun be32_to_cpu(eh->ud.deth[0]),
451*4882a593Smuzhiyun be32_to_cpu(eh->ud.deth[1]) & RVT_QPN_MASK,
452*4882a593Smuzhiyun be32_to_cpu(eh->ud.deth[1]) >>
453*4882a593Smuzhiyun HFI1_IPOIB_ENTROPY_SHIFT);
454*4882a593Smuzhiyun break;
455*4882a593Smuzhiyun case OP(UD, SEND_ONLY_WITH_IMMEDIATE):
456*4882a593Smuzhiyun trace_seq_printf(p, DETH_PRN,
457*4882a593Smuzhiyun be32_to_cpu(eh->ud.deth[0]),
458*4882a593Smuzhiyun be32_to_cpu(eh->ud.deth[1]) & RVT_QPN_MASK);
459*4882a593Smuzhiyun break;
460*4882a593Smuzhiyun /* ieth */
461*4882a593Smuzhiyun case OP(RC, SEND_LAST_WITH_INVALIDATE):
462*4882a593Smuzhiyun case OP(RC, SEND_ONLY_WITH_INVALIDATE):
463*4882a593Smuzhiyun trace_seq_printf(p, IETH_PRN,
464*4882a593Smuzhiyun be32_to_cpu(eh->ieth));
465*4882a593Smuzhiyun break;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun out:
468*4882a593Smuzhiyun trace_seq_putc(p, 0);
469*4882a593Smuzhiyun return ret;
470*4882a593Smuzhiyun }
471*4882a593Smuzhiyun
parse_sdma_flags(struct trace_seq * p,u64 desc0,u64 desc1)472*4882a593Smuzhiyun const char *parse_sdma_flags(
473*4882a593Smuzhiyun struct trace_seq *p,
474*4882a593Smuzhiyun u64 desc0, u64 desc1)
475*4882a593Smuzhiyun {
476*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
477*4882a593Smuzhiyun char flags[5] = { 'x', 'x', 'x', 'x', 0 };
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun flags[0] = (desc1 & SDMA_DESC1_INT_REQ_FLAG) ? 'I' : '-';
480*4882a593Smuzhiyun flags[1] = (desc1 & SDMA_DESC1_HEAD_TO_HOST_FLAG) ? 'H' : '-';
481*4882a593Smuzhiyun flags[2] = (desc0 & SDMA_DESC0_FIRST_DESC_FLAG) ? 'F' : '-';
482*4882a593Smuzhiyun flags[3] = (desc0 & SDMA_DESC0_LAST_DESC_FLAG) ? 'L' : '-';
483*4882a593Smuzhiyun trace_seq_printf(p, "%s", flags);
484*4882a593Smuzhiyun if (desc0 & SDMA_DESC0_FIRST_DESC_FLAG)
485*4882a593Smuzhiyun trace_seq_printf(p, " amode:%u aidx:%u alen:%u",
486*4882a593Smuzhiyun (u8)((desc1 >> SDMA_DESC1_HEADER_MODE_SHIFT) &
487*4882a593Smuzhiyun SDMA_DESC1_HEADER_MODE_MASK),
488*4882a593Smuzhiyun (u8)((desc1 >> SDMA_DESC1_HEADER_INDEX_SHIFT) &
489*4882a593Smuzhiyun SDMA_DESC1_HEADER_INDEX_MASK),
490*4882a593Smuzhiyun (u8)((desc1 >> SDMA_DESC1_HEADER_DWS_SHIFT) &
491*4882a593Smuzhiyun SDMA_DESC1_HEADER_DWS_MASK));
492*4882a593Smuzhiyun return ret;
493*4882a593Smuzhiyun }
494*4882a593Smuzhiyun
print_u32_array(struct trace_seq * p,u32 * arr,int len)495*4882a593Smuzhiyun const char *print_u32_array(
496*4882a593Smuzhiyun struct trace_seq *p,
497*4882a593Smuzhiyun u32 *arr, int len)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun int i;
500*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun for (i = 0; i < len ; i++)
503*4882a593Smuzhiyun trace_seq_printf(p, "%s%#x", i == 0 ? "" : " ", arr[i]);
504*4882a593Smuzhiyun trace_seq_putc(p, 0);
505*4882a593Smuzhiyun return ret;
506*4882a593Smuzhiyun }
507*4882a593Smuzhiyun
hfi1_trace_get_tid_ctrl(u32 ent)508*4882a593Smuzhiyun u8 hfi1_trace_get_tid_ctrl(u32 ent)
509*4882a593Smuzhiyun {
510*4882a593Smuzhiyun return EXP_TID_GET(ent, CTRL);
511*4882a593Smuzhiyun }
512*4882a593Smuzhiyun
hfi1_trace_get_tid_len(u32 ent)513*4882a593Smuzhiyun u16 hfi1_trace_get_tid_len(u32 ent)
514*4882a593Smuzhiyun {
515*4882a593Smuzhiyun return EXP_TID_GET(ent, LEN);
516*4882a593Smuzhiyun }
517*4882a593Smuzhiyun
hfi1_trace_get_tid_idx(u32 ent)518*4882a593Smuzhiyun u16 hfi1_trace_get_tid_idx(u32 ent)
519*4882a593Smuzhiyun {
520*4882a593Smuzhiyun return EXP_TID_GET(ent, IDX);
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun struct hfi1_ctxt_hist {
524*4882a593Smuzhiyun atomic_t count;
525*4882a593Smuzhiyun atomic_t data[255];
526*4882a593Smuzhiyun };
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun struct hfi1_ctxt_hist hist = {
529*4882a593Smuzhiyun .count = ATOMIC_INIT(0)
530*4882a593Smuzhiyun };
531*4882a593Smuzhiyun
hfi1_trace_print_rsm_hist(struct trace_seq * p,unsigned int ctxt)532*4882a593Smuzhiyun const char *hfi1_trace_print_rsm_hist(struct trace_seq *p, unsigned int ctxt)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun int i, len = ARRAY_SIZE(hist.data);
535*4882a593Smuzhiyun const char *ret = trace_seq_buffer_ptr(p);
536*4882a593Smuzhiyun unsigned long packet_count = atomic_fetch_inc(&hist.count);
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun trace_seq_printf(p, "packet[%lu]", packet_count);
539*4882a593Smuzhiyun for (i = 0; i < len; ++i) {
540*4882a593Smuzhiyun unsigned long val;
541*4882a593Smuzhiyun atomic_t *count = &hist.data[i];
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun if (ctxt == i)
544*4882a593Smuzhiyun val = atomic_fetch_inc(count);
545*4882a593Smuzhiyun else
546*4882a593Smuzhiyun val = atomic_read(count);
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun if (val)
549*4882a593Smuzhiyun trace_seq_printf(p, "(%d:%lu)", i, val);
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun trace_seq_putc(p, 0);
552*4882a593Smuzhiyun return ret;
553*4882a593Smuzhiyun }
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun __hfi1_trace_fn(AFFINITY);
556*4882a593Smuzhiyun __hfi1_trace_fn(PKT);
557*4882a593Smuzhiyun __hfi1_trace_fn(PROC);
558*4882a593Smuzhiyun __hfi1_trace_fn(SDMA);
559*4882a593Smuzhiyun __hfi1_trace_fn(LINKVERB);
560*4882a593Smuzhiyun __hfi1_trace_fn(DEBUG);
561*4882a593Smuzhiyun __hfi1_trace_fn(SNOOP);
562*4882a593Smuzhiyun __hfi1_trace_fn(CNTR);
563*4882a593Smuzhiyun __hfi1_trace_fn(PIO);
564*4882a593Smuzhiyun __hfi1_trace_fn(DC8051);
565*4882a593Smuzhiyun __hfi1_trace_fn(FIRMWARE);
566*4882a593Smuzhiyun __hfi1_trace_fn(RCVCTRL);
567*4882a593Smuzhiyun __hfi1_trace_fn(TID);
568*4882a593Smuzhiyun __hfi1_trace_fn(MMU);
569*4882a593Smuzhiyun __hfi1_trace_fn(IOCTL);
570