1 /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 2 /* 3 * Copyright(c) 2015 - 2017 Intel Corporation. 4 */ 5 6 #if !defined(__HFI1_TRACE_IBHDRS_H) || defined(TRACE_HEADER_MULTI_READ) 7 #define __HFI1_TRACE_IBHDRS_H 8 9 #include <linux/tracepoint.h> 10 #include <linux/trace_seq.h> 11 12 #include "hfi.h" 13 14 #undef TRACE_SYSTEM 15 #define TRACE_SYSTEM hfi1_ibhdrs 16 17 #define ib_opcode_name(opcode) { IB_OPCODE_##opcode, #opcode } 18 #define show_ib_opcode(opcode) \ 19 __print_symbolic(opcode, \ 20 ib_opcode_name(RC_SEND_FIRST), \ 21 ib_opcode_name(RC_SEND_MIDDLE), \ 22 ib_opcode_name(RC_SEND_LAST), \ 23 ib_opcode_name(RC_SEND_LAST_WITH_IMMEDIATE), \ 24 ib_opcode_name(RC_SEND_ONLY), \ 25 ib_opcode_name(RC_SEND_ONLY_WITH_IMMEDIATE), \ 26 ib_opcode_name(RC_RDMA_WRITE_FIRST), \ 27 ib_opcode_name(RC_RDMA_WRITE_MIDDLE), \ 28 ib_opcode_name(RC_RDMA_WRITE_LAST), \ 29 ib_opcode_name(RC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \ 30 ib_opcode_name(RC_RDMA_WRITE_ONLY), \ 31 ib_opcode_name(RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \ 32 ib_opcode_name(RC_RDMA_READ_REQUEST), \ 33 ib_opcode_name(RC_RDMA_READ_RESPONSE_FIRST), \ 34 ib_opcode_name(RC_RDMA_READ_RESPONSE_MIDDLE), \ 35 ib_opcode_name(RC_RDMA_READ_RESPONSE_LAST), \ 36 ib_opcode_name(RC_RDMA_READ_RESPONSE_ONLY), \ 37 ib_opcode_name(RC_ACKNOWLEDGE), \ 38 ib_opcode_name(RC_ATOMIC_ACKNOWLEDGE), \ 39 ib_opcode_name(RC_COMPARE_SWAP), \ 40 ib_opcode_name(RC_FETCH_ADD), \ 41 ib_opcode_name(RC_SEND_LAST_WITH_INVALIDATE), \ 42 ib_opcode_name(RC_SEND_ONLY_WITH_INVALIDATE), \ 43 ib_opcode_name(TID_RDMA_WRITE_REQ), \ 44 ib_opcode_name(TID_RDMA_WRITE_RESP), \ 45 ib_opcode_name(TID_RDMA_WRITE_DATA), \ 46 ib_opcode_name(TID_RDMA_WRITE_DATA_LAST), \ 47 ib_opcode_name(TID_RDMA_READ_REQ), \ 48 ib_opcode_name(TID_RDMA_READ_RESP), \ 49 ib_opcode_name(TID_RDMA_RESYNC), \ 50 ib_opcode_name(TID_RDMA_ACK), \ 51 ib_opcode_name(UC_SEND_FIRST), \ 52 ib_opcode_name(UC_SEND_MIDDLE), \ 53 ib_opcode_name(UC_SEND_LAST), \ 54 ib_opcode_name(UC_SEND_LAST_WITH_IMMEDIATE), \ 55 ib_opcode_name(UC_SEND_ONLY), \ 56 ib_opcode_name(UC_SEND_ONLY_WITH_IMMEDIATE), \ 57 ib_opcode_name(UC_RDMA_WRITE_FIRST), \ 58 ib_opcode_name(UC_RDMA_WRITE_MIDDLE), \ 59 ib_opcode_name(UC_RDMA_WRITE_LAST), \ 60 ib_opcode_name(UC_RDMA_WRITE_LAST_WITH_IMMEDIATE), \ 61 ib_opcode_name(UC_RDMA_WRITE_ONLY), \ 62 ib_opcode_name(UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE), \ 63 ib_opcode_name(UD_SEND_ONLY), \ 64 ib_opcode_name(UD_SEND_ONLY_WITH_IMMEDIATE), \ 65 ib_opcode_name(CNP)) 66 67 u8 ibhdr_exhdr_len(struct ib_header *hdr); 68 const char *parse_everbs_hdrs(struct trace_seq *p, u8 opcode, 69 u8 l4, u32 dest_qpn, u32 src_qpn, 70 void *ehdrs); 71 u8 hfi1_trace_opa_hdr_len(struct hfi1_opa_header *opah); 72 u8 hfi1_trace_packet_hdr_len(struct hfi1_packet *packet); 73 const char *hfi1_trace_get_packet_l4_str(u8 l4); 74 void hfi1_trace_parse_9b_bth(struct ib_other_headers *ohdr, 75 u8 *ack, bool *becn, bool *fecn, u8 *mig, 76 u8 *se, u8 *pad, u8 *opcode, u8 *tver, 77 u16 *pkey, u32 *psn, u32 *qpn); 78 void hfi1_trace_parse_9b_hdr(struct ib_header *hdr, bool sc5, 79 u8 *lnh, u8 *lver, u8 *sl, u8 *sc, 80 u16 *len, u32 *dlid, u32 *slid); 81 void hfi1_trace_parse_16b_bth(struct ib_other_headers *ohdr, 82 u8 *ack, u8 *mig, u8 *opcode, 83 u8 *pad, u8 *se, u8 *tver, 84 u32 *psn, u32 *qpn); 85 void hfi1_trace_parse_16b_hdr(struct hfi1_16b_header *hdr, 86 u8 *age, bool *becn, bool *fecn, 87 u8 *l4, u8 *rc, u8 *sc, 88 u16 *entropy, u16 *len, u16 *pkey, 89 u32 *dlid, u32 *slid); 90 91 const char *hfi1_trace_fmt_lrh(struct trace_seq *p, bool bypass, 92 u8 age, bool becn, bool fecn, u8 l4, 93 u8 lnh, const char *lnh_name, u8 lver, 94 u8 rc, u8 sc, u8 sl, u16 entropy, 95 u16 len, u16 pkey, u32 dlid, u32 slid); 96 97 const char *hfi1_trace_fmt_rest(struct trace_seq *p, bool bypass, u8 l4, 98 u8 ack, bool becn, bool fecn, u8 mig, 99 u8 se, u8 pad, u8 opcode, const char *opname, 100 u8 tver, u16 pkey, u32 psn, u32 qpn, 101 u32 dest_qpn, u32 src_qpn); 102 103 const char *hfi1_trace_get_packet_l2_str(u8 l2); 104 105 #define __parse_ib_ehdrs(op, l4, dest_qpn, src_qpn, ehdrs) \ 106 parse_everbs_hdrs(p, op, l4, dest_qpn, src_qpn, ehdrs) 107 108 #define lrh_name(lrh) { HFI1_##lrh, #lrh } 109 #define show_lnh(lrh) \ 110 __print_symbolic(lrh, \ 111 lrh_name(LRH_BTH), \ 112 lrh_name(LRH_GRH)) 113 114 DECLARE_EVENT_CLASS(hfi1_input_ibhdr_template, 115 TP_PROTO(struct hfi1_devdata *dd, 116 struct hfi1_packet *packet, 117 bool sc5), 118 TP_ARGS(dd, packet, sc5), 119 TP_STRUCT__entry( 120 DD_DEV_ENTRY(dd) 121 __field(u8, etype) 122 __field(u8, ack) 123 __field(u8, age) 124 __field(bool, becn) 125 __field(bool, fecn) 126 __field(u8, l2) 127 __field(u8, l4) 128 __field(u8, lnh) 129 __field(u8, lver) 130 __field(u8, mig) 131 __field(u8, opcode) 132 __field(u8, pad) 133 __field(u8, rc) 134 __field(u8, sc) 135 __field(u8, se) 136 __field(u8, sl) 137 __field(u8, tver) 138 __field(u16, entropy) 139 __field(u16, len) 140 __field(u16, pkey) 141 __field(u32, dlid) 142 __field(u32, psn) 143 __field(u32, qpn) 144 __field(u32, slid) 145 __field(u32, dest_qpn) 146 __field(u32, src_qpn) 147 /* extended headers */ 148 __dynamic_array(u8, ehdrs, 149 hfi1_trace_packet_hdr_len(packet)) 150 ), 151 TP_fast_assign( 152 DD_DEV_ASSIGN(dd); 153 154 __entry->etype = packet->etype; 155 __entry->l2 = hfi1_16B_get_l2(packet->hdr); 156 __entry->dest_qpn = 0; 157 __entry->src_qpn = 0; 158 if (__entry->etype == RHF_RCV_TYPE_BYPASS) { 159 hfi1_trace_parse_16b_hdr(packet->hdr, 160 &__entry->age, 161 &__entry->becn, 162 &__entry->fecn, 163 &__entry->l4, 164 &__entry->rc, 165 &__entry->sc, 166 &__entry->entropy, 167 &__entry->len, 168 &__entry->pkey, 169 &__entry->dlid, 170 &__entry->slid); 171 172 if (__entry->l4 == OPA_16B_L4_FM) { 173 __entry->opcode = IB_OPCODE_UD_SEND_ONLY; 174 __entry->dest_qpn = hfi1_16B_get_dest_qpn(packet->mgmt); 175 __entry->src_qpn = hfi1_16B_get_src_qpn(packet->mgmt); 176 } else { 177 hfi1_trace_parse_16b_bth(packet->ohdr, 178 &__entry->ack, 179 &__entry->mig, 180 &__entry->opcode, 181 &__entry->pad, 182 &__entry->se, 183 &__entry->tver, 184 &__entry->psn, 185 &__entry->qpn); 186 } 187 } else { 188 __entry->l4 = OPA_16B_L4_9B; 189 hfi1_trace_parse_9b_hdr(packet->hdr, sc5, 190 &__entry->lnh, 191 &__entry->lver, 192 &__entry->sl, 193 &__entry->sc, 194 &__entry->len, 195 &__entry->dlid, 196 &__entry->slid); 197 198 hfi1_trace_parse_9b_bth(packet->ohdr, 199 &__entry->ack, 200 &__entry->becn, 201 &__entry->fecn, 202 &__entry->mig, 203 &__entry->se, 204 &__entry->pad, 205 &__entry->opcode, 206 &__entry->tver, 207 &__entry->pkey, 208 &__entry->psn, 209 &__entry->qpn); 210 } 211 /* extended headers */ 212 if (__entry->l4 != OPA_16B_L4_FM) 213 memcpy(__get_dynamic_array(ehdrs), 214 &packet->ohdr->u, 215 __get_dynamic_array_len(ehdrs)); 216 ), 217 TP_printk("[%s] (%s) %s %s hlen:%d %s", 218 __get_str(dev), 219 __entry->etype != RHF_RCV_TYPE_BYPASS ? 220 show_packettype(__entry->etype) : 221 hfi1_trace_get_packet_l2_str( 222 __entry->l2), 223 hfi1_trace_fmt_lrh(p, 224 __entry->etype == 225 RHF_RCV_TYPE_BYPASS, 226 __entry->age, 227 __entry->becn, 228 __entry->fecn, 229 __entry->l4, 230 __entry->lnh, 231 show_lnh(__entry->lnh), 232 __entry->lver, 233 __entry->rc, 234 __entry->sc, 235 __entry->sl, 236 __entry->entropy, 237 __entry->len, 238 __entry->pkey, 239 __entry->dlid, 240 __entry->slid), 241 hfi1_trace_fmt_rest(p, 242 __entry->etype == 243 RHF_RCV_TYPE_BYPASS, 244 __entry->l4, 245 __entry->ack, 246 __entry->becn, 247 __entry->fecn, 248 __entry->mig, 249 __entry->se, 250 __entry->pad, 251 __entry->opcode, 252 show_ib_opcode(__entry->opcode), 253 __entry->tver, 254 __entry->pkey, 255 __entry->psn, 256 __entry->qpn, 257 __entry->dest_qpn, 258 __entry->src_qpn), 259 /* extended headers */ 260 __get_dynamic_array_len(ehdrs), 261 __parse_ib_ehdrs( 262 __entry->opcode, 263 __entry->l4, 264 __entry->dest_qpn, 265 __entry->src_qpn, 266 (void *)__get_dynamic_array(ehdrs)) 267 ) 268 ); 269 270 DEFINE_EVENT(hfi1_input_ibhdr_template, input_ibhdr, 271 TP_PROTO(struct hfi1_devdata *dd, 272 struct hfi1_packet *packet, bool sc5), 273 TP_ARGS(dd, packet, sc5)); 274 275 DECLARE_EVENT_CLASS(hfi1_output_ibhdr_template, 276 TP_PROTO(struct hfi1_devdata *dd, 277 struct hfi1_opa_header *opah, bool sc5), 278 TP_ARGS(dd, opah, sc5), 279 TP_STRUCT__entry( 280 DD_DEV_ENTRY(dd) 281 __field(u8, hdr_type) 282 __field(u8, ack) 283 __field(u8, age) 284 __field(bool, becn) 285 __field(bool, fecn) 286 __field(u8, l4) 287 __field(u8, lnh) 288 __field(u8, lver) 289 __field(u8, mig) 290 __field(u8, opcode) 291 __field(u8, pad) 292 __field(u8, rc) 293 __field(u8, sc) 294 __field(u8, se) 295 __field(u8, sl) 296 __field(u8, tver) 297 __field(u16, entropy) 298 __field(u16, len) 299 __field(u16, pkey) 300 __field(u32, dlid) 301 __field(u32, psn) 302 __field(u32, qpn) 303 __field(u32, slid) 304 __field(u32, dest_qpn) 305 __field(u32, src_qpn) 306 /* extended headers */ 307 __dynamic_array(u8, ehdrs, 308 hfi1_trace_opa_hdr_len(opah)) 309 ), 310 TP_fast_assign( 311 struct ib_other_headers *ohdr; 312 313 DD_DEV_ASSIGN(dd); 314 315 __entry->hdr_type = opah->hdr_type; 316 __entry->dest_qpn = 0; 317 __entry->src_qpn = 0; 318 if (__entry->hdr_type) { 319 hfi1_trace_parse_16b_hdr(&opah->opah, 320 &__entry->age, 321 &__entry->becn, 322 &__entry->fecn, 323 &__entry->l4, 324 &__entry->rc, 325 &__entry->sc, 326 &__entry->entropy, 327 &__entry->len, 328 &__entry->pkey, 329 &__entry->dlid, 330 &__entry->slid); 331 332 if (__entry->l4 == OPA_16B_L4_FM) { 333 ohdr = NULL; 334 __entry->opcode = IB_OPCODE_UD_SEND_ONLY; 335 __entry->dest_qpn = hfi1_16B_get_dest_qpn(&opah->opah.u.mgmt); 336 __entry->src_qpn = hfi1_16B_get_src_qpn(&opah->opah.u.mgmt); 337 } else { 338 if (__entry->l4 == OPA_16B_L4_IB_LOCAL) 339 ohdr = &opah->opah.u.oth; 340 else 341 ohdr = &opah->opah.u.l.oth; 342 hfi1_trace_parse_16b_bth(ohdr, 343 &__entry->ack, 344 &__entry->mig, 345 &__entry->opcode, 346 &__entry->pad, 347 &__entry->se, 348 &__entry->tver, 349 &__entry->psn, 350 &__entry->qpn); 351 } 352 } else { 353 __entry->l4 = OPA_16B_L4_9B; 354 hfi1_trace_parse_9b_hdr(&opah->ibh, sc5, 355 &__entry->lnh, 356 &__entry->lver, 357 &__entry->sl, 358 &__entry->sc, 359 &__entry->len, 360 &__entry->dlid, 361 &__entry->slid); 362 if (__entry->lnh == HFI1_LRH_BTH) 363 ohdr = &opah->ibh.u.oth; 364 else 365 ohdr = &opah->ibh.u.l.oth; 366 hfi1_trace_parse_9b_bth(ohdr, 367 &__entry->ack, 368 &__entry->becn, 369 &__entry->fecn, 370 &__entry->mig, 371 &__entry->se, 372 &__entry->pad, 373 &__entry->opcode, 374 &__entry->tver, 375 &__entry->pkey, 376 &__entry->psn, 377 &__entry->qpn); 378 } 379 380 /* extended headers */ 381 if (__entry->l4 != OPA_16B_L4_FM) 382 memcpy(__get_dynamic_array(ehdrs), 383 &ohdr->u, __get_dynamic_array_len(ehdrs)); 384 ), 385 TP_printk("[%s] (%s) %s %s hlen:%d %s", 386 __get_str(dev), 387 hfi1_trace_get_packet_l4_str(__entry->l4), 388 hfi1_trace_fmt_lrh(p, 389 !!__entry->hdr_type, 390 __entry->age, 391 __entry->becn, 392 __entry->fecn, 393 __entry->l4, 394 __entry->lnh, 395 show_lnh(__entry->lnh), 396 __entry->lver, 397 __entry->rc, 398 __entry->sc, 399 __entry->sl, 400 __entry->entropy, 401 __entry->len, 402 __entry->pkey, 403 __entry->dlid, 404 __entry->slid), 405 hfi1_trace_fmt_rest(p, 406 !!__entry->hdr_type, 407 __entry->l4, 408 __entry->ack, 409 __entry->becn, 410 __entry->fecn, 411 __entry->mig, 412 __entry->se, 413 __entry->pad, 414 __entry->opcode, 415 show_ib_opcode(__entry->opcode), 416 __entry->tver, 417 __entry->pkey, 418 __entry->psn, 419 __entry->qpn, 420 __entry->dest_qpn, 421 __entry->src_qpn), 422 /* extended headers */ 423 __get_dynamic_array_len(ehdrs), 424 __parse_ib_ehdrs( 425 __entry->opcode, 426 __entry->l4, 427 __entry->dest_qpn, 428 __entry->src_qpn, 429 (void *)__get_dynamic_array(ehdrs)) 430 ) 431 ); 432 433 DEFINE_EVENT(hfi1_output_ibhdr_template, pio_output_ibhdr, 434 TP_PROTO(struct hfi1_devdata *dd, 435 struct hfi1_opa_header *opah, bool sc5), 436 TP_ARGS(dd, opah, sc5)); 437 438 DEFINE_EVENT(hfi1_output_ibhdr_template, ack_output_ibhdr, 439 TP_PROTO(struct hfi1_devdata *dd, 440 struct hfi1_opa_header *opah, bool sc5), 441 TP_ARGS(dd, opah, sc5)); 442 443 DEFINE_EVENT(hfi1_output_ibhdr_template, sdma_output_ibhdr, 444 TP_PROTO(struct hfi1_devdata *dd, 445 struct hfi1_opa_header *opah, bool sc5), 446 TP_ARGS(dd, opah, sc5)); 447 448 449 #endif /* __HFI1_TRACE_IBHDRS_H */ 450 451 #undef TRACE_INCLUDE_PATH 452 #undef TRACE_INCLUDE_FILE 453 #define TRACE_INCLUDE_PATH . 454 #define TRACE_INCLUDE_FILE trace_ibhdrs 455 #include <trace/define_trace.h> 456