2 * Copyright (c) 2004-2008 Voltaire Inc. All rights reserved.
3 * Copyright (c) 2007 Xsigo Systems Inc. All rights reserved.
5 * This software is available to you under a choice of one of two
6 * licenses. You may choose to be licensed under the terms of the GNU
7 * General Public License (GPL) Version 2, available from the file
8 * COPYING in the main directory of this source tree, or the
9 * OpenIB.org BSD license below:
11 * Redistribution and use in source and binary forms, with or
12 * without modification, are permitted provided that the following
15 * - Redistributions of source code must retain the above
16 * copyright notice, this list of conditions and the following
19 * - Redistributions in binary form must reproduce the above
20 * copyright notice, this list of conditions and the following
21 * disclaimer in the documentation and/or other materials
22 * provided with the distribution.
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37 #endif /* HAVE_CONFIG_H */
42 mad_dump_int(char *buf, int bufsz, void *val, int valsz)
46 snprintf(buf, bufsz, "%d", *(uint8_t *)val);
49 snprintf(buf, bufsz, "%d", *(uint16_t *)val);
53 snprintf(buf, bufsz, "%d", *(uint32_t *)val);
59 snprintf(buf, bufsz, "%" PRIu64, *(uint64_t *)val);
62 IBWARN("bad int sz %d", valsz);
68 mad_dump_uint(char *buf, int bufsz, void *val, int valsz)
72 snprintf(buf, bufsz, "%u", *(uint8_t *)val);
75 snprintf(buf, bufsz, "%u", *(uint16_t *)val);
79 snprintf(buf, bufsz, "%u", *(uint32_t *)val);
85 snprintf(buf, bufsz, "%" PRIu64, *(uint64_t *)val);
88 IBWARN("bad int sz %u", valsz);
94 mad_dump_hex(char *buf, int bufsz, void *val, int valsz)
98 snprintf(buf, bufsz, "0x%02x", *(uint8_t *)val);
101 snprintf(buf, bufsz, "0x%04x", *(uint16_t *)val);
104 snprintf(buf, bufsz, "0x%06x", *(uint32_t *)val & 0xffffff);
107 snprintf(buf, bufsz, "0x%08x", *(uint32_t *)val);
110 snprintf(buf, bufsz, "0x%010" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffULL);
113 snprintf(buf, bufsz, "0x%012" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffffULL);
116 snprintf(buf, bufsz, "0x%014" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffffffULL);
119 snprintf(buf, bufsz, "0x%016" PRIx64, *(uint64_t *)val);
122 IBWARN("bad int sz %d", valsz);
128 mad_dump_rhex(char *buf, int bufsz, void *val, int valsz)
132 snprintf(buf, bufsz, "%02x", *(uint8_t *)val);
135 snprintf(buf, bufsz, "%04x", *(uint16_t *)val);
138 snprintf(buf, bufsz, "%06x", *(uint32_t *)val & 0xffffff);
141 snprintf(buf, bufsz, "%08x", *(uint32_t *)val);
144 snprintf(buf, bufsz, "%010" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffULL);
147 snprintf(buf, bufsz, "%012" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffffULL);
150 snprintf(buf, bufsz, "%014" PRIx64, *(uint64_t *)val & (uint64_t) 0xffffffffffffffULL);
153 snprintf(buf, bufsz, "%016" PRIx64, *(uint64_t *)val);
156 IBWARN("bad int sz %d", valsz);
162 mad_dump_linkwidth(char *buf, int bufsz, void *val, int valsz)
164 int width = *(int *)val;
168 snprintf(buf, bufsz, "1X");
171 snprintf(buf, bufsz, "4X");
174 snprintf(buf, bufsz, "8X");
177 snprintf(buf, bufsz, "12X");
180 IBWARN("bad width %d", width);
186 dump_linkwidth(char *buf, int bufsz, int width)
191 n += snprintf(buf + n, bufsz - n, "1X or ");
192 if (n < bufsz && (width & 0x2))
193 n += snprintf(buf + n, bufsz - n, "4X or ");
194 if (n < bufsz && (width & 0x4))
195 n += snprintf(buf + n, bufsz - n, "8X or ");
196 if (n < bufsz && (width & 0x8))
197 n += snprintf(buf + n, bufsz - n, "12X or ");
201 else if (width == 0 || (width >> 4))
202 snprintf(buf + n, bufsz - n, "undefined (%d)", width);
208 mad_dump_linkwidthsup(char *buf, int bufsz, void *val, int valsz)
210 int width = *(int *)val;
212 dump_linkwidth(buf, bufsz, width);
224 snprintf(buf + strlen(buf), bufsz - strlen(buf),
231 mad_dump_linkwidthen(char *buf, int bufsz, void *val, int valsz)
233 int width = *(int *)val;
235 dump_linkwidth(buf, bufsz, width);
239 mad_dump_linkspeed(char *buf, int bufsz, void *val, int valsz)
241 int speed = *(int *)val;
245 snprintf(buf, bufsz, "2.5 Gbps");
248 snprintf(buf, bufsz, "5.0 Gbps");
251 snprintf(buf, bufsz, "10.0 Gbps");
254 snprintf(buf, bufsz, "undefined (%d)", speed);
260 dump_linkspeed(char *buf, int bufsz, int speed)
265 n += snprintf(buf + n, bufsz - n, "2.5 Gbps or ");
266 if (n < bufsz && (speed & 0x2))
267 n += snprintf(buf + n, bufsz - n, "5.0 Gbps or ");
268 if (n < bufsz && (speed & 0x4))
269 n += snprintf(buf + n, bufsz - n, "10.0 Gbps or ");
273 else if (speed == 0 || (speed >> 3)) {
274 n += snprintf(buf + n, bufsz - n, "undefined (%d)", speed);
277 } else if (bufsz > 3) {
290 snprintf(buf + n, bufsz - n, " (IBA extension)");
296 mad_dump_linkspeedsup(char *buf, int bufsz, void *val, int valsz)
298 int speed = *(int *)val;
300 dump_linkspeed(buf, bufsz, speed);
304 mad_dump_linkspeeden(char *buf, int bufsz, void *val, int valsz)
306 int speed = *(int *)val;
308 dump_linkspeed(buf, bufsz, speed);
312 mad_dump_portstate(char *buf, int bufsz, void *val, int valsz)
314 int state = *(int *)val;
318 snprintf(buf, bufsz, "NoChange");
321 snprintf(buf, bufsz, "Down");
324 snprintf(buf, bufsz, "Initialize");
327 snprintf(buf, bufsz, "Armed");
330 snprintf(buf, bufsz, "Active");
333 snprintf(buf, bufsz, "?(%d)", state);
338 mad_dump_linkdowndefstate(char *buf, int bufsz, void *val, int valsz)
340 int state = *(int *)val;
344 snprintf(buf, bufsz, "NoChange");
347 snprintf(buf, bufsz, "Sleep");
350 snprintf(buf, bufsz, "Polling");
353 snprintf(buf, bufsz, "?(%d)", state);
359 mad_dump_physportstate(char *buf, int bufsz, void *val, int valsz)
361 int state = *(int *)val;
365 snprintf(buf, bufsz, "NoChange");
368 snprintf(buf, bufsz, "Sleep");
371 snprintf(buf, bufsz, "Polling");
374 snprintf(buf, bufsz, "Disabled");
377 snprintf(buf, bufsz, "PortConfigurationTraining");
380 snprintf(buf, bufsz, "LinkUp");
383 snprintf(buf, bufsz, "LinkErrorRecovery");
386 snprintf(buf, bufsz, "PhyTest");
389 snprintf(buf, bufsz, "?(%d)", state);
394 mad_dump_mtu(char *buf, int bufsz, void *val, int valsz)
396 int mtu = *(int *)val;
400 snprintf(buf, bufsz, "256");
403 snprintf(buf, bufsz, "512");
406 snprintf(buf, bufsz, "1024");
409 snprintf(buf, bufsz, "2048");
412 snprintf(buf, bufsz, "4096");
415 snprintf(buf, bufsz, "?(%d)", mtu);
421 mad_dump_vlcap(char *buf, int bufsz, void *val, int valsz)
423 int vlcap = *(int *)val;
427 snprintf(buf, bufsz, "VL0");
430 snprintf(buf, bufsz, "VL0-1");
433 snprintf(buf, bufsz, "VL0-3");
436 snprintf(buf, bufsz, "VL0-7");
439 snprintf(buf, bufsz, "VL0-14");
442 snprintf(buf, bufsz, "?(%d)", vlcap);
447 mad_dump_opervls(char *buf, int bufsz, void *val, int valsz)
449 int opervls = *(int *)val;
453 snprintf(buf, bufsz, "No change");
456 snprintf(buf, bufsz, "VL0");
459 snprintf(buf, bufsz, "VL0-1");
462 snprintf(buf, bufsz, "VL0-3");
465 snprintf(buf, bufsz, "VL0-7");
468 snprintf(buf, bufsz, "VL0-14");
471 snprintf(buf, bufsz, "?(%d)", opervls);
476 mad_dump_portcapmask(char *buf, int bufsz, void *val, int valsz)
478 unsigned mask = *(unsigned *)val;
481 s += sprintf(s, "0x%x\n", mask);
483 s += sprintf(s, "\t\t\t\tIsSM\n");
485 s += sprintf(s, "\t\t\t\tIsNoticeSupported\n");
487 s += sprintf(s, "\t\t\t\tIsTrapSupported\n");
489 s += sprintf(s, "\t\t\t\tIsAutomaticMigrationSupported\n");
491 s += sprintf(s, "\t\t\t\tIsSLMappingSupported\n");
493 s += sprintf(s, "\t\t\t\tIsMKeyNVRAM\n");
495 s += sprintf(s, "\t\t\t\tIsPKeyNVRAM\n");
497 s += sprintf(s, "\t\t\t\tIsLedInfoSupported\n");
498 if (mask & (1 << 10))
499 s += sprintf(s, "\t\t\t\tIsSMdisabled\n");
500 if (mask & (1 << 11))
501 s += sprintf(s, "\t\t\t\tIsSystemImageGUIDsupported\n");
502 if (mask & (1 << 12))
503 s += sprintf(s, "\t\t\t\tIsPkeySwitchExternalPortTrapSupported\n");
504 if (mask & (1 << 16))
505 s += sprintf(s, "\t\t\t\tIsCommunicatonManagementSupported\n");
506 if (mask & (1 << 17))
507 s += sprintf(s, "\t\t\t\tIsSNMPTunnelingSupported\n");
508 if (mask & (1 << 18))
509 s += sprintf(s, "\t\t\t\tIsReinitSupported\n");
510 if (mask & (1 << 19))
511 s += sprintf(s, "\t\t\t\tIsDeviceManagementSupported\n");
512 if (mask & (1 << 20))
513 s += sprintf(s, "\t\t\t\tIsVendorClassSupported\n");
514 if (mask & (1 << 21))
515 s += sprintf(s, "\t\t\t\tIsDRNoticeSupported\n");
516 if (mask & (1 << 22))
517 s += sprintf(s, "\t\t\t\tIsCapabilityMaskNoticeSupported\n");
518 if (mask & (1 << 23))
519 s += sprintf(s, "\t\t\t\tIsBootManagementSupported\n");
520 if (mask & (1 << 24))
521 s += sprintf(s, "\t\t\t\tIsLinkRoundTripLatencySupported\n");
522 if (mask & (1 << 25))
523 s += sprintf(s, "\t\t\t\tIsClientRegistrationSupported\n");
524 if (mask & (1 << 26))
525 s += sprintf(s, "\t\t\t\tIsOtherLocalChangesNoticeSupported\n");
526 if (mask & (1 << 27))
527 s += sprintf(s, "\t\t\t\tIsLinkSpeedWidthPairsTableSupported\n");
534 mad_dump_bitfield(char *buf, int bufsz, void *val, int valsz)
536 snprintf(buf, bufsz, "0x%x", *(uint32_t *)val);
540 mad_dump_array(char *buf, int bufsz, void *val, int valsz)
542 uint8_t *p = val, *e;
548 for (p = val, e = p + valsz; p < e; p++, s += 2)
549 sprintf(s, "%02x", *p);
553 mad_dump_string(char *buf, int bufsz, void *val, int valsz)
558 snprintf(buf, valsz, "'%s'", (char *)val);
562 mad_dump_node_type(char *buf, int bufsz, void *val, int valsz)
564 int nodetype = *(int*)val;
568 snprintf(buf, bufsz, "Channel Adapter");
571 snprintf(buf, bufsz, "Switch");
574 snprintf(buf, bufsz, "Router");
577 snprintf(buf, bufsz, "?(%d)?", nodetype);
582 #define IB_MAX_NUM_VLS 16
583 #define IB_MAX_NUM_VLS_TO_U8 ((IB_MAX_NUM_VLS)/2)
585 typedef struct _ib_slvl_table {
586 uint8_t vl_by_sl_num[IB_MAX_NUM_VLS_TO_U8];
590 ib_slvl_get_i(ib_slvl_table_t *tbl, int i, uint8_t *vl)
592 *vl = (tbl->vl_by_sl_num[i >> 1] >> ((!(i&1)) << 2)) & 0xf;
595 #define IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK 32
597 typedef struct _ib_vl_arb_table {
601 } vl_entry[IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK];
605 ib_vl_arb_get_vl(uint8_t res_vl, uint8_t *const vl )
611 mad_dump_sltovl(char *buf, int bufsz, void *val, int valsz)
613 ib_slvl_table_t* p_slvl_tbl = val;
616 n = snprintf(buf, bufsz, "|");
617 for (i = 0; i < 16; i++) {
618 ib_slvl_get_i(p_slvl_tbl, i, &vl);
619 n += snprintf(buf + n, bufsz - n, "%2u|", vl);
623 snprintf(buf + n, bufsz - n, "\n");
627 mad_dump_vlarbitration(char *buf, int bufsz, void *val, int num)
629 ib_vl_arb_table_t* p_vla_tbl = val;
633 num /= sizeof(p_vla_tbl->vl_entry[0]);
635 n = snprintf(buf, bufsz, "\nVL : |");
638 for (i = 0; i < num; i++) {
639 ib_vl_arb_get_vl(p_vla_tbl->vl_entry[i].res_vl, &vl);
640 n += snprintf(buf + n, bufsz - n, "0x%-2X|", vl);
645 n += snprintf(buf + n, bufsz - n, "\nWEIGHT: |");
648 for (i = 0; i < num; i++) {
649 n += snprintf(buf + n, bufsz - n, "0x%-2X|",
650 p_vla_tbl->vl_entry[i].weight);
655 snprintf(buf + n, bufsz - n, "\n");
659 _dump_fields(char *buf, int bufsz, void *data, int start, int end)
665 for (field = start; field < end && bufsz > 0; field++) {
666 mad_decode_field(data, field, val);
667 if (!mad_dump_field(field, s, bufsz, val))
677 return (int)(s - buf);
681 mad_dump_nodedesc(char *buf, int bufsz, void *val, int valsz)
683 strncpy(buf, val, bufsz);
690 mad_dump_nodeinfo(char *buf, int bufsz, void *val, int valsz)
692 _dump_fields(buf, bufsz, val, IB_NODE_FIRST_F, IB_NODE_LAST_F);
696 mad_dump_portinfo(char *buf, int bufsz, void *val, int valsz)
698 _dump_fields(buf, bufsz, val, IB_PORT_FIRST_F, IB_PORT_LAST_F);
702 mad_dump_portstates(char *buf, int bufsz, void *val, int valsz)
704 _dump_fields(buf, bufsz, val, IB_PORT_STATE_F, IB_PORT_LINK_DOWN_DEF_F);
708 mad_dump_switchinfo(char *buf, int bufsz, void *val, int valsz)
710 _dump_fields(buf, bufsz, val, IB_SW_FIRST_F, IB_SW_LAST_F);
714 mad_dump_perfcounters(char *buf, int bufsz, void *val, int valsz)
716 _dump_fields(buf, bufsz, val, IB_PC_FIRST_F, IB_PC_LAST_F);
720 mad_dump_perfcounters_ext(char *buf, int bufsz, void *val, int valsz)
722 _dump_fields(buf, bufsz, val, IB_PC_EXT_FIRST_F, IB_PC_EXT_LAST_F);
725 void xdump(FILE *file, char *msg, void *p, int size)
727 #define HEX(x) ((x) < 10 ? '0' + (x) : 'a' + ((x) -10))
734 for (i = 0; i < size;) {
735 fputc(HEX(*cp >> 4), file);
736 fputc(HEX(*cp & 0xf), file);
739 fputc(HEX(cp[1] >> 4), file);
740 fputc(HEX(cp[1] & 0xf), file);