aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2016-04-10 05:06:58 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2016-04-10 05:06:58 +0000
commit113f2316c617b113de58ce85b244819bb49cdcee (patch)
treea6410c3fe374f2e0d9dc93c18d5a0479f538e79a /sys
parent70e22add96ff6317d002cd62250ae83b9a3073a2 (diff)
downloadsrc-113f2316c617b113de58ce85b244819bb49cdcee.tar.gz
src-113f2316c617b113de58ce85b244819bb49cdcee.zip
Add a 'show t4 tcb <nexus> <tid>' command to dump a TCB from DDB.
This allows the contents of a TCB to be extracted from a T4/T5 card in DDB after a panic.
Notes
Notes: svn path=/head/; revision=297777
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/cxgbe/t4_main.c85
-rw-r--r--sys/dev/cxgbe/tom/t4_ddp.c25
-rw-r--r--sys/modules/cxgbe/if_cxgbe/Makefile1
3 files changed, 86 insertions, 25 deletions
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 11d42536caa1..69757450b617 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -28,6 +28,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_ddb.h"
#include "opt_inet.h"
#include "opt_inet6.h"
#include "opt_rss.h"
@@ -63,6 +64,10 @@ __FBSDID("$FreeBSD$");
#include <vm/vm.h>
#include <vm/pmap.h>
#endif
+#ifdef DDB
+#include <ddb/ddb.h>
+#include <ddb/db_lex.h>
+#endif
#include "common/common.h"
#include "common/t4_msg.h"
@@ -9163,6 +9168,86 @@ tweak_tunables(void)
t4_intr_types &= INTR_MSIX | INTR_MSI | INTR_INTX;
}
+#ifdef DDB
+static void
+t4_dump_tcb(struct adapter *sc, int tid)
+{
+ uint32_t base, i, j, off, pf, reg, save, tcb_addr, win_pos;
+
+ reg = PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2);
+ save = t4_read_reg(sc, reg);
+ base = sc->memwin[2].mw_base;
+
+ /* Dump TCB for the tid */
+ tcb_addr = t4_read_reg(sc, A_TP_CMM_TCB_BASE);
+ tcb_addr += tid * TCB_SIZE;
+
+ if (is_t4(sc)) {
+ pf = 0;
+ win_pos = tcb_addr & ~0xf; /* start must be 16B aligned */
+ } else {
+ pf = V_PFNUM(sc->pf);
+ win_pos = tcb_addr & ~0x7f; /* start must be 128B aligned */
+ }
+ t4_write_reg(sc, reg, win_pos | pf);
+ t4_read_reg(sc, reg);
+
+ off = tcb_addr - win_pos;
+ for (i = 0; i < 4; i++) {
+ uint32_t buf[8];
+ for (j = 0; j < 8; j++, off += 4)
+ buf[j] = htonl(t4_read_reg(sc, base + off));
+
+ db_printf("%08x %08x %08x %08x %08x %08x %08x %08x\n",
+ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
+ buf[7]);
+ }
+
+ t4_write_reg(sc, reg, save);
+ t4_read_reg(sc, reg);
+}
+
+static struct command_table db_t4_table = LIST_HEAD_INITIALIZER(db_t4_table);
+_DB_SET(_show, t4, NULL, db_show_table, 0, &db_t4_table);
+
+DB_FUNC(tcb, db_show_t4tcb, db_t4_table, CS_OWN, NULL)
+{
+ device_t dev;
+ int radix, tid, t;
+ bool valid;
+
+ valid = false;
+ radix = db_radix;
+ db_radix = 10;
+ t = db_read_token();
+ if (t == tIDENT) {
+ dev = device_lookup_by_name(db_tok_string);
+ t = db_read_token();
+ if (t == tNUMBER) {
+ tid = db_tok_number;
+ valid = true;
+ }
+ }
+ db_radix = radix;
+ db_skip_to_eol();
+ if (!valid) {
+ db_printf("usage: show t4 tcb <nexus> <tid>\n");
+ return;
+ }
+
+ if (dev == NULL) {
+ db_printf("device not found\n");
+ return;
+ }
+ if (tid < 0) {
+ db_printf("invalid tid\n");
+ return;
+ }
+
+ t4_dump_tcb(device_get_softc(dev), tid);
+}
+#endif
+
static struct sx mlu; /* mod load unload */
SX_SYSINIT(cxgbe_mlu, &mlu, "cxgbe mod load/unload");
diff --git a/sys/dev/cxgbe/tom/t4_ddp.c b/sys/dev/cxgbe/tom/t4_ddp.c
index 2df025777ddb..2aa774d0139c 100644
--- a/sys/dev/cxgbe/tom/t4_ddp.c
+++ b/sys/dev/cxgbe/tom/t4_ddp.c
@@ -80,31 +80,6 @@ static struct mbuf *get_ddp_mbuf(int len);
/* XXX: must match A_ULP_RX_TDDP_PSZ */
static int t4_ddp_pgsz[] = {4096, 4096 << 2, 4096 << 4, 4096 << 6};
-#if 0
-static void
-t4_dump_tcb(struct adapter *sc, int tid)
-{
- uint32_t tcb_base, off, i, j;
-
- /* Dump TCB for the tid */
- tcb_base = t4_read_reg(sc, A_TP_CMM_TCB_BASE);
- t4_write_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2),
- tcb_base + tid * TCB_SIZE);
- t4_read_reg(sc, PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_OFFSET, 2));
- off = 0;
- printf("\n");
- for (i = 0; i < 4; i++) {
- uint32_t buf[8];
- for (j = 0; j < 8; j++, off += 4)
- buf[j] = htonl(t4_read_reg(sc, MEMWIN2_BASE + off));
-
- printf("%08x %08x %08x %08x %08x %08x %08x %08x\n",
- buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
- buf[7]);
- }
-}
-#endif
-
#define MAX_DDP_BUFFER_SIZE (M_TCB_RX_DDP_BUF0_LEN)
static int
alloc_ppods(struct tom_data *td, int n, u_int *ppod_addr)
diff --git a/sys/modules/cxgbe/if_cxgbe/Makefile b/sys/modules/cxgbe/if_cxgbe/Makefile
index df343b27ea73..967683bf94af 100644
--- a/sys/modules/cxgbe/if_cxgbe/Makefile
+++ b/sys/modules/cxgbe/if_cxgbe/Makefile
@@ -8,6 +8,7 @@ CXGBE= ${.CURDIR}/../../../dev/cxgbe
KMOD= if_cxgbe
SRCS= bus_if.h
SRCS+= device_if.h
+SRCS+= opt_ddb.h
SRCS+= opt_inet.h
SRCS+= opt_inet6.h
SRCS+= opt_ofed.h