xref: /freebsd-14.2/sys/dev/bxe/bxe_debug.c (revision e36ffbdd)
14e400768SDavid Christensen /*-
2*e36ffbddSDavid C Somayajulu  * Copyright (c) 2007-2014 QLogic Corporation. All rights reserved.
34e400768SDavid Christensen  *
44e400768SDavid Christensen  * Redistribution and use in source and binary forms, with or without
54e400768SDavid Christensen  * modification, are permitted provided that the following conditions
64e400768SDavid Christensen  * are met:
74e400768SDavid Christensen  *
84e400768SDavid Christensen  * 1. Redistributions of source code must retain the above copyright
94e400768SDavid Christensen  *    notice, this list of conditions and the following disclaimer.
104e400768SDavid Christensen  * 2. Redistributions in binary form must reproduce the above copyright
114e400768SDavid Christensen  *    notice, this list of conditions and the following disclaimer in the
124e400768SDavid Christensen  *    documentation and/or other materials provided with the distribution.
134e400768SDavid Christensen  *
144e400768SDavid Christensen  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
154e400768SDavid Christensen  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
164e400768SDavid Christensen  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
174e400768SDavid Christensen  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
184e400768SDavid Christensen  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
194e400768SDavid Christensen  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
204e400768SDavid Christensen  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
214e400768SDavid Christensen  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
224e400768SDavid Christensen  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
234e400768SDavid Christensen  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
244e400768SDavid Christensen  * THE POSSIBILITY OF SUCH DAMAGE.
254e400768SDavid Christensen  */
264e400768SDavid Christensen 
274e400768SDavid Christensen #include <sys/cdefs.h>
284e400768SDavid Christensen __FBSDID("$FreeBSD$");
294e400768SDavid Christensen 
304e400768SDavid Christensen #include "bxe.h"
314e400768SDavid Christensen 
324e400768SDavid Christensen #include "ddb/ddb.h"
334e400768SDavid Christensen #include "ddb/db_sym.h"
344e400768SDavid Christensen #include "ddb/db_lex.h"
354e400768SDavid Christensen 
364e400768SDavid Christensen #ifdef BXE_REG_NO_INLINE
374e400768SDavid Christensen 
384e400768SDavid Christensen /*
394e400768SDavid Christensen  * Debug versions of the 8/16/32 bit OS register read/write functions to
404e400768SDavid Christensen  * capture/display values read/written from/to the controller.
414e400768SDavid Christensen  */
424e400768SDavid Christensen 
434e400768SDavid Christensen void
444e400768SDavid Christensen bxe_reg_write8(struct bxe_softc *sc, bus_size_t offset, uint8_t val)
454e400768SDavid Christensen {
464e400768SDavid Christensen     BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%02x\n", offset, val);
474e400768SDavid Christensen     bus_space_write_1(sc->bar[BAR0].tag,
484e400768SDavid Christensen                       sc->bar[BAR0].handle,
494e400768SDavid Christensen                       offset,
504e400768SDavid Christensen                       val);
514e400768SDavid Christensen }
524e400768SDavid Christensen 
534e400768SDavid Christensen void
544e400768SDavid Christensen bxe_reg_write16(struct bxe_softc *sc, bus_size_t offset, uint16_t val)
554e400768SDavid Christensen {
564e400768SDavid Christensen     if ((offset % 2) != 0) {
574e400768SDavid Christensen         BLOGD(sc, DBG_REGS, "Unaligned 16-bit write to 0x%08lx\n", offset);
584e400768SDavid Christensen     }
594e400768SDavid Christensen 
604e400768SDavid Christensen     BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%04x\n", offset, val);
614e400768SDavid Christensen     bus_space_write_2(sc->bar[BAR0].tag,
624e400768SDavid Christensen                       sc->bar[BAR0].handle,
634e400768SDavid Christensen                       offset,
644e400768SDavid Christensen                       val);
654e400768SDavid Christensen }
664e400768SDavid Christensen 
674e400768SDavid Christensen void
684e400768SDavid Christensen bxe_reg_write32(struct bxe_softc *sc, bus_size_t offset, uint32_t val)
694e400768SDavid Christensen {
704e400768SDavid Christensen     if ((offset % 4) != 0) {
714e400768SDavid Christensen         BLOGD(sc, DBG_REGS, "Unaligned 32-bit write to 0x%08lx\n", offset);
724e400768SDavid Christensen     }
734e400768SDavid Christensen 
744e400768SDavid Christensen     BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val);
754e400768SDavid Christensen     bus_space_write_4(sc->bar[BAR0].tag,
764e400768SDavid Christensen                       sc->bar[BAR0].handle,
774e400768SDavid Christensen                       offset,
784e400768SDavid Christensen                       val);
794e400768SDavid Christensen }
804e400768SDavid Christensen 
814e400768SDavid Christensen uint8_t
824e400768SDavid Christensen bxe_reg_read8(struct bxe_softc *sc, bus_size_t offset)
834e400768SDavid Christensen {
844e400768SDavid Christensen     uint8_t val;
854e400768SDavid Christensen 
864e400768SDavid Christensen     val = bus_space_read_1(sc->bar[BAR0].tag,
874e400768SDavid Christensen                            sc->bar[BAR0].handle,
884e400768SDavid Christensen                            offset);
894e400768SDavid Christensen     BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%02x\n", offset, val);
904e400768SDavid Christensen 
914e400768SDavid Christensen     return (val);
924e400768SDavid Christensen }
934e400768SDavid Christensen 
944e400768SDavid Christensen uint16_t
954e400768SDavid Christensen bxe_reg_read16(struct bxe_softc *sc, bus_size_t offset)
964e400768SDavid Christensen {
974e400768SDavid Christensen     uint16_t val;
984e400768SDavid Christensen 
994e400768SDavid Christensen     if ((offset % 2) != 0) {
1004e400768SDavid Christensen         BLOGD(sc, DBG_REGS, "Unaligned 16-bit read from 0x%08lx\n", offset);
1014e400768SDavid Christensen     }
1024e400768SDavid Christensen 
1034e400768SDavid Christensen     val = bus_space_read_2(sc->bar[BAR0].tag,
1044e400768SDavid Christensen                            sc->bar[BAR0].handle,
1054e400768SDavid Christensen                            offset);
1064e400768SDavid Christensen     BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val);
1074e400768SDavid Christensen 
1084e400768SDavid Christensen     return (val);
1094e400768SDavid Christensen }
1104e400768SDavid Christensen 
1114e400768SDavid Christensen uint32_t
1124e400768SDavid Christensen bxe_reg_read32(struct bxe_softc *sc, bus_size_t offset)
1134e400768SDavid Christensen {
1144e400768SDavid Christensen     uint32_t val;
1154e400768SDavid Christensen 
1164e400768SDavid Christensen     if ((offset % 4) != 0) {
1174e400768SDavid Christensen         BLOGD(sc, DBG_REGS, "Unaligned 32-bit read from 0x%08lx\n", offset);
1184e400768SDavid Christensen     }
1194e400768SDavid Christensen 
1204e400768SDavid Christensen     val = bus_space_read_4(sc->bar[BAR0].tag,
1214e400768SDavid Christensen                            sc->bar[BAR0].handle,
1224e400768SDavid Christensen                            offset);
1234e400768SDavid Christensen     BLOGD(sc, DBG_REGS, "offset=0x%08lx val=0x%08x\n", offset, val);
1244e400768SDavid Christensen 
1254e400768SDavid Christensen     return (val);
1264e400768SDavid Christensen }
1274e400768SDavid Christensen 
1284e400768SDavid Christensen #endif /* BXE_REG_NO_INLINE */
1294e400768SDavid Christensen 
1304e400768SDavid Christensen #ifdef ELINK_DEBUG
1314e400768SDavid Christensen 
1324e400768SDavid Christensen void
1334e400768SDavid Christensen elink_cb_dbg(struct bxe_softc *sc,
1344e400768SDavid Christensen              char             *fmt)
1354e400768SDavid Christensen {
1364e400768SDavid Christensen     char buf[128];
1374e400768SDavid Christensen     if (__predict_false(sc->debug & DBG_PHY)) {
1384e400768SDavid Christensen         snprintf(buf, sizeof(buf), "ELINK: %s", fmt);
1394e400768SDavid Christensen         device_printf(sc->dev, "%s", buf);
1404e400768SDavid Christensen     }
1414e400768SDavid Christensen }
1424e400768SDavid Christensen 
1434e400768SDavid Christensen void
1444e400768SDavid Christensen elink_cb_dbg1(struct bxe_softc *sc,
1454e400768SDavid Christensen               char             *fmt,
1464e400768SDavid Christensen               uint32_t         arg1)
1474e400768SDavid Christensen {
1484e400768SDavid Christensen     char tmp[128], buf[128];
1494e400768SDavid Christensen     if (__predict_false(sc->debug & DBG_PHY)) {
1504e400768SDavid Christensen         snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt);
1514e400768SDavid Christensen         snprintf(buf, sizeof(buf), tmp, arg1);
1524e400768SDavid Christensen         device_printf(sc->dev, "%s", buf);
1534e400768SDavid Christensen     }
1544e400768SDavid Christensen }
1554e400768SDavid Christensen 
1564e400768SDavid Christensen void
1574e400768SDavid Christensen elink_cb_dbg2(struct bxe_softc *sc,
1584e400768SDavid Christensen               char             *fmt,
1594e400768SDavid Christensen               uint32_t         arg1,
1604e400768SDavid Christensen               uint32_t         arg2)
1614e400768SDavid Christensen {
1624e400768SDavid Christensen     char tmp[128], buf[128];
1634e400768SDavid Christensen     if (__predict_false(sc->debug & DBG_PHY)) {
1644e400768SDavid Christensen         snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt);
1654e400768SDavid Christensen         snprintf(buf, sizeof(buf), tmp, arg1, arg2);
1664e400768SDavid Christensen         device_printf(sc->dev, "%s", buf);
1674e400768SDavid Christensen     }
1684e400768SDavid Christensen }
1694e400768SDavid Christensen 
1704e400768SDavid Christensen void
1714e400768SDavid Christensen elink_cb_dbg3(struct bxe_softc *sc,
1724e400768SDavid Christensen               char             *fmt,
1734e400768SDavid Christensen               uint32_t         arg1,
1744e400768SDavid Christensen               uint32_t         arg2,
1754e400768SDavid Christensen               uint32_t         arg3)
1764e400768SDavid Christensen {
1774e400768SDavid Christensen     char tmp[128], buf[128];
1784e400768SDavid Christensen     if (__predict_false(sc->debug & DBG_PHY)) {
1794e400768SDavid Christensen         snprintf(tmp, sizeof(tmp), "ELINK: %s", fmt);
1804e400768SDavid Christensen         snprintf(buf, sizeof(buf), tmp, arg1, arg2, arg3);
1814e400768SDavid Christensen         device_printf(sc->dev, "%s", buf);
1824e400768SDavid Christensen     }
1834e400768SDavid Christensen }
1844e400768SDavid Christensen 
1854e400768SDavid Christensen #endif /* ELINK_DEBUG */
1864e400768SDavid Christensen 
1874e400768SDavid Christensen extern struct mtx bxe_prev_mtx;
1884e400768SDavid Christensen 
1894e400768SDavid Christensen void
1904e400768SDavid Christensen bxe_dump_mem(struct bxe_softc *sc,
1914e400768SDavid Christensen              char             *tag,
1924e400768SDavid Christensen              uint8_t          *mem,
1934e400768SDavid Christensen              uint32_t         len)
1944e400768SDavid Christensen {
1954e400768SDavid Christensen     char buf[256];
1964e400768SDavid Christensen     char c[32];
1974e400768SDavid Christensen     int  xx;
1984e400768SDavid Christensen 
1994e400768SDavid Christensen     mtx_lock(&bxe_prev_mtx);
2004e400768SDavid Christensen 
2014e400768SDavid Christensen     BLOGI(sc, "++++++++++++ %s\n", tag);
2024e400768SDavid Christensen     strcpy(buf, "** 000: ");
2034e400768SDavid Christensen 
2044e400768SDavid Christensen     for (xx = 0; xx < len; xx++)
2054e400768SDavid Christensen     {
2064e400768SDavid Christensen         if ((xx != 0) && (xx % 16 == 0))
2074e400768SDavid Christensen         {
2084e400768SDavid Christensen             BLOGI(sc, "%s\n", buf);
2094e400768SDavid Christensen             strcpy(buf, "** ");
2104e400768SDavid Christensen             snprintf(c, sizeof(c), "%03x", xx);
2114e400768SDavid Christensen             strcat(buf, c);
2124e400768SDavid Christensen             strcat(buf, ": ");
2134e400768SDavid Christensen         }
2144e400768SDavid Christensen 
2154e400768SDavid Christensen         snprintf(c, sizeof(c), "%02x ", *mem);
2164e400768SDavid Christensen         strcat(buf, c);
2174e400768SDavid Christensen 
2184e400768SDavid Christensen         mem++;
2194e400768SDavid Christensen     }
2204e400768SDavid Christensen 
2214e400768SDavid Christensen     BLOGI(sc, "%s\n", buf);
2224e400768SDavid Christensen     BLOGI(sc, "------------ %s\n", tag);
2234e400768SDavid Christensen 
2244e400768SDavid Christensen     mtx_unlock(&bxe_prev_mtx);
2254e400768SDavid Christensen }
2264e400768SDavid Christensen 
2274e400768SDavid Christensen void
2284e400768SDavid Christensen bxe_dump_mbuf_data(struct bxe_softc *sc,
2294e400768SDavid Christensen                    char             *tag,
2304e400768SDavid Christensen                    struct mbuf      *m,
2314e400768SDavid Christensen                    uint8_t          contents)
2324e400768SDavid Christensen {
2334e400768SDavid Christensen     char buf[256];
2344e400768SDavid Christensen     char c[32];
2354e400768SDavid Christensen     uint8_t *memp;
2364e400768SDavid Christensen     int i, xx = 0;
2374e400768SDavid Christensen 
2384e400768SDavid Christensen     mtx_lock(&bxe_prev_mtx);
2394e400768SDavid Christensen 
2404e400768SDavid Christensen     BLOGI(sc, "++++++++++++ %s\n", tag);
2414e400768SDavid Christensen 
2424e400768SDavid Christensen     while (m)
2434e400768SDavid Christensen     {
2444e400768SDavid Christensen         memp = m->m_data;
2454e400768SDavid Christensen         strcpy(buf, "** > ");
2464e400768SDavid Christensen         snprintf(c, sizeof(c), "%03x", xx);
2474e400768SDavid Christensen         strcat(buf, c);
2484e400768SDavid Christensen         strcat(buf, ": ");
2494e400768SDavid Christensen 
2504e400768SDavid Christensen         if (contents)
2514e400768SDavid Christensen         {
2524e400768SDavid Christensen             for (i = 0; i < m->m_len; i++)
2534e400768SDavid Christensen             {
2544e400768SDavid Christensen                 if ((xx != 0) && (xx % 16 == 0))
2554e400768SDavid Christensen                 {
2564e400768SDavid Christensen                     BLOGI(sc, "%s\n", buf);
2574e400768SDavid Christensen                     strcpy(buf, "**   ");
2584e400768SDavid Christensen                     snprintf(c, sizeof(c), "%03x", xx);
2594e400768SDavid Christensen                     strcat(buf, c);
2604e400768SDavid Christensen                     strcat(buf, ": ");
2614e400768SDavid Christensen                 }
2624e400768SDavid Christensen 
2634e400768SDavid Christensen                 snprintf(c, sizeof(c), "%02x ", *memp);
2644e400768SDavid Christensen                 strcat(buf, c);
2654e400768SDavid Christensen 
2664e400768SDavid Christensen                 memp++;
2674e400768SDavid Christensen                 xx++;
2684e400768SDavid Christensen             }
2694e400768SDavid Christensen         }
2704e400768SDavid Christensen         else
2714e400768SDavid Christensen         {
2724e400768SDavid Christensen             snprintf(c, sizeof(c), "%d", m->m_len);
2734e400768SDavid Christensen             strcat(buf, c);
2744e400768SDavid Christensen             xx += m->m_len;
2754e400768SDavid Christensen         }
2764e400768SDavid Christensen 
2774e400768SDavid Christensen         BLOGI(sc, "%s\n", buf);
2784e400768SDavid Christensen         m = m->m_next;
2794e400768SDavid Christensen     }
2804e400768SDavid Christensen 
2814e400768SDavid Christensen     BLOGI(sc, "------------ %s\n", tag);
2824e400768SDavid Christensen 
2834e400768SDavid Christensen     mtx_unlock(&bxe_prev_mtx);
2844e400768SDavid Christensen }
2854e400768SDavid Christensen 
2864e400768SDavid Christensen #ifdef DDB
2874e400768SDavid Christensen 
2884e400768SDavid Christensen static void bxe_ddb_usage()
2894e400768SDavid Christensen {
2904e400768SDavid Christensen     db_printf("Usage: bxe[/hpv] <instance> [<address>]\n");
2914e400768SDavid Christensen }
2924e400768SDavid Christensen 
2934e400768SDavid Christensen static db_cmdfcn_t bxe_ddb;
2944e400768SDavid Christensen _DB_SET(_cmd, bxe, bxe_ddb, db_cmd_table, CS_OWN, NULL);
2954e400768SDavid Christensen 
2964e400768SDavid Christensen static void bxe_ddb(db_expr_t blah1,
2974e400768SDavid Christensen                     boolean_t blah2,
2984e400768SDavid Christensen                     db_expr_t blah3,
2994e400768SDavid Christensen                     char      *blah4)
3004e400768SDavid Christensen {
3014e400768SDavid Christensen     char if_xname[IFNAMSIZ];
3024e400768SDavid Christensen     struct ifnet *ifp = NULL;
3034e400768SDavid Christensen     struct bxe_softc *sc;
3044e400768SDavid Christensen     db_expr_t next_arg;
3054e400768SDavid Christensen     int index;
3064e400768SDavid Christensen     int tok;
3074e400768SDavid Christensen     int mod_phys_addr = FALSE;
3084e400768SDavid Christensen     int mod_virt_addr = FALSE;
3094e400768SDavid Christensen     db_addr_t addr;
3104e400768SDavid Christensen 
3114e400768SDavid Christensen     tok = db_read_token();
3124e400768SDavid Christensen     if (tok == tSLASH) {
3134e400768SDavid Christensen         tok = db_read_token();
3144e400768SDavid Christensen         if (tok != tIDENT) {
3154e400768SDavid Christensen             db_printf("ERROR: bad modifier\n");
3164e400768SDavid Christensen             bxe_ddb_usage();
3174e400768SDavid Christensen             goto bxe_ddb_done;
3184e400768SDavid Christensen         }
3194e400768SDavid Christensen         if (strcmp(db_tok_string, "h") == 0) {
3204e400768SDavid Christensen             bxe_ddb_usage();
3214e400768SDavid Christensen             goto bxe_ddb_done;
3224e400768SDavid Christensen         } else if (strcmp(db_tok_string, "p") == 0) {
3234e400768SDavid Christensen             mod_phys_addr = TRUE;
3244e400768SDavid Christensen         } else if (strcmp(db_tok_string, "v") == 0) {
3254e400768SDavid Christensen             mod_virt_addr = TRUE;
3264e400768SDavid Christensen         }
3274e400768SDavid Christensen     } else {
3284e400768SDavid Christensen         db_unread_token(tok);
3294e400768SDavid Christensen     }
3304e400768SDavid Christensen 
3314e400768SDavid Christensen     if (!db_expression((db_expr_t *)&index)) {
3324e400768SDavid Christensen         db_printf("ERROR: bxe index missing\n");
3334e400768SDavid Christensen         bxe_ddb_usage();
3344e400768SDavid Christensen         goto bxe_ddb_done;
3354e400768SDavid Christensen     }
3364e400768SDavid Christensen 
3374e400768SDavid Christensen     snprintf(if_xname, sizeof(if_xname), "bxe%d", index);
3384e400768SDavid Christensen     if ((ifp = ifunit_ref(if_xname)) == NULL)
3394e400768SDavid Christensen     {
3404e400768SDavid Christensen         db_printf("ERROR: Invalid interface %s\n", if_xname);
3414e400768SDavid Christensen         goto bxe_ddb_done;
3424e400768SDavid Christensen     }
3434e400768SDavid Christensen 
3444e400768SDavid Christensen     sc = (struct bxe_softc *)ifp->if_softc;
3454e400768SDavid Christensen     db_printf("ifnet=%p (%s)\n", ifp, if_xname);
3464e400768SDavid Christensen     db_printf("softc=%p\n", sc);
3474e400768SDavid Christensen     db_printf("  dev=%p\n", sc->dev);
3484e400768SDavid Christensen     db_printf("  BDF=%d:%d:%d\n",
3494e400768SDavid Christensen               sc->pcie_bus, sc->pcie_device, sc->pcie_func);
3504e400768SDavid Christensen 
3514e400768SDavid Christensen     if (mod_phys_addr || mod_virt_addr) {
3524e400768SDavid Christensen         if (!db_expression((db_addr_t *)&addr)) {
3534e400768SDavid Christensen             db_printf("ERROR: Invalid address\n");
3544e400768SDavid Christensen             bxe_ddb_usage();
3554e400768SDavid Christensen             goto bxe_ddb_done;
3564e400768SDavid Christensen         }
3574e400768SDavid Christensen 
3584e400768SDavid Christensen         db_printf("addr=%p", addr);
3594e400768SDavid Christensen     }
3604e400768SDavid Christensen 
3614e400768SDavid Christensen bxe_ddb_done:
3624e400768SDavid Christensen 
3634e400768SDavid Christensen     db_flush_lex();
3644e400768SDavid Christensen     if (ifp) if_rele(ifp);
3654e400768SDavid Christensen }
3664e400768SDavid Christensen 
3674e400768SDavid Christensen #endif /* DDB */
3684e400768SDavid Christensen 
369