From owner-svn-src-all@freebsd.org Thu Feb 7 05:40:53 2019 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 409DC14C5AEA; Thu, 7 Feb 2019 05:40:53 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id D3EE2700C0; Thu, 7 Feb 2019 05:40:52 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C87C1188AA; Thu, 7 Feb 2019 05:40:52 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x175eqsE079475; Thu, 7 Feb 2019 05:40:52 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x175eqLR079473; Thu, 7 Feb 2019 05:40:52 GMT (envelope-from np@FreeBSD.org) Message-Id: <201902070540.x175eqLR079473@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Thu, 7 Feb 2019 05:40:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r343862 - in head/sys/dev/cxgbe: . common X-SVN-Group: head X-SVN-Commit-Author: np X-SVN-Commit-Paths: in head/sys/dev/cxgbe: . common X-SVN-Commit-Revision: 343862 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: D3EE2700C0 X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.95 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-0.999,0]; NEURAL_HAM_SHORT(-0.95)[-0.951,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US]; NEURAL_HAM_LONG(-1.00)[-0.999,0] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 07 Feb 2019 05:40:53 -0000 Author: np Date: Thu Feb 7 05:40:51 2019 New Revision: 343862 URL: https://svnweb.freebsd.org/changeset/base/343862 Log: cxgbe(4): Auto-dump the CIM block's logic analyzer on a TIMER0 interrupt. Sponsored by: Chelsio Communications Modified: head/sys/dev/cxgbe/adapter.h head/sys/dev/cxgbe/common/t4_hw.c head/sys/dev/cxgbe/t4_main.c Modified: head/sys/dev/cxgbe/adapter.h ============================================================================== --- head/sys/dev/cxgbe/adapter.h Thu Feb 7 05:06:29 2019 (r343861) +++ head/sys/dev/cxgbe/adapter.h Thu Feb 7 05:40:51 2019 (r343862) @@ -1164,6 +1164,7 @@ void free_atid(struct adapter *, int); void release_tid(struct adapter *, int, struct sge_wrq *); int cxgbe_media_change(struct ifnet *); void cxgbe_media_status(struct ifnet *, struct ifmediareq *); +bool t4_os_dump_cimla(struct adapter *, int, bool); void t4_os_dump_devlog(struct adapter *); #ifdef DEV_NETMAP Modified: head/sys/dev/cxgbe/common/t4_hw.c ============================================================================== --- head/sys/dev/cxgbe/common/t4_hw.c Thu Feb 7 05:06:29 2019 (r343861) +++ head/sys/dev/cxgbe/common/t4_hw.c Thu Feb 7 05:40:51 2019 (r343862) @@ -4356,6 +4356,10 @@ static bool sge_intr_handler(struct adapter *adap, int */ static bool cim_intr_handler(struct adapter *adap, int arg, bool verbose) { + static const struct intr_action cim_host_intr_actions[] = { + { F_TIMER0INT, 0, t4_os_dump_cimla }, + { 0 }, + }; static const struct intr_details cim_host_intr_details[] = { /* T6+ */ { F_PCIE2CIMINTFPARERR, "CIM IBQ PCIe interface parity error" }, @@ -4400,7 +4404,7 @@ static bool cim_intr_handler(struct adapter *adap, int .enable_reg = A_CIM_HOST_INT_ENABLE, .fatal = 0, .details = cim_host_intr_details, - .actions = NULL, + .actions = cim_host_intr_actions, }; static const struct intr_details cim_host_upacc_intr_details[] = { { F_EEPROMWRINT, "CIM EEPROM came out of busy state" }, Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Thu Feb 7 05:06:29 2019 (r343861) +++ head/sys/dev/cxgbe/t4_main.c Thu Feb 7 05:40:51 2019 (r343862) @@ -648,7 +648,6 @@ static int sysctl_loadavg(SYSCTL_HANDLER_ARGS); static int sysctl_cctrl(SYSCTL_HANDLER_ARGS); static int sysctl_cim_ibq_obq(SYSCTL_HANDLER_ARGS); static int sysctl_cim_la(SYSCTL_HANDLER_ARGS); -static int sysctl_cim_la_t6(SYSCTL_HANDLER_ARGS); static int sysctl_cim_ma_la(SYSCTL_HANDLER_ARGS); static int sysctl_cim_pif_la(SYSCTL_HANDLER_ARGS); static int sysctl_cim_qcfg(SYSCTL_HANDLER_ARGS); @@ -6026,8 +6025,7 @@ t4_sysctls(struct adapter *sc) sysctl_cim_ibq_obq, "A", "CIM IBQ 5 (NCSI)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_la", - CTLTYPE_STRING | CTLFLAG_RD, sc, 0, - chip_id(sc) <= CHELSIO_T5 ? sysctl_cim_la : sysctl_cim_la_t6, + CTLTYPE_STRING | CTLFLAG_RD, sc, 0, sysctl_cim_la, "A", "CIM logic analyzer"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ma_la", @@ -7249,36 +7247,11 @@ done: return (rc); } -static int -sysctl_cim_la(SYSCTL_HANDLER_ARGS) +static void +sbuf_cim_la4(struct adapter *sc, struct sbuf *sb, uint32_t *buf, uint32_t cfg) { - struct adapter *sc = arg1; - u_int cfg; - struct sbuf *sb; - uint32_t *buf, *p; - int rc; + uint32_t *p; - MPASS(chip_id(sc) <= CHELSIO_T5); - - rc = -t4_cim_read(sc, A_UP_UP_DBG_LA_CFG, 1, &cfg); - if (rc != 0) - return (rc); - - rc = sysctl_wire_old_buffer(req, 0); - if (rc != 0) - return (rc); - - sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); - if (sb == NULL) - return (ENOMEM); - - buf = malloc(sc->params.cim_la_size * sizeof(uint32_t), M_CXGBE, - M_ZERO | M_WAITOK); - - rc = -t4_cim_read_la(sc, buf, NULL); - if (rc != 0) - goto done; - sbuf_printf(sb, "Status Data PC%s", cfg & F_UPDBGLACAPTPCONLY ? "" : " LS0Stat LS0Addr LS0Data"); @@ -7302,44 +7275,13 @@ sysctl_cim_la(SYSCTL_HANDLER_ARGS) p[6], p[7]); } } - - rc = sbuf_finish(sb); - sbuf_delete(sb); -done: - free(buf, M_CXGBE); - return (rc); } -static int -sysctl_cim_la_t6(SYSCTL_HANDLER_ARGS) +static void +sbuf_cim_la6(struct adapter *sc, struct sbuf *sb, uint32_t *buf, uint32_t cfg) { - struct adapter *sc = arg1; - u_int cfg; - struct sbuf *sb; - uint32_t *buf, *p; - int rc; + uint32_t *p; - MPASS(chip_id(sc) > CHELSIO_T5); - - rc = -t4_cim_read(sc, A_UP_UP_DBG_LA_CFG, 1, &cfg); - if (rc != 0) - return (rc); - - rc = sysctl_wire_old_buffer(req, 0); - if (rc != 0) - return (rc); - - sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); - if (sb == NULL) - return (ENOMEM); - - buf = malloc(sc->params.cim_la_size * sizeof(uint32_t), M_CXGBE, - M_ZERO | M_WAITOK); - - rc = -t4_cim_read_la(sc, buf, NULL); - if (rc != 0) - goto done; - sbuf_printf(sb, "Status Inst Data PC%s", cfg & F_UPDBGLACAPTPCONLY ? "" : " LS0Stat LS0Addr LS0Data LS1Stat LS1Addr LS1Data"); @@ -7365,12 +7307,76 @@ sysctl_cim_la_t6(SYSCTL_HANDLER_ARGS) p[2], p[1], p[0], p[5], p[4], p[3]); } } +} - rc = sbuf_finish(sb); - sbuf_delete(sb); +static int +sbuf_cim_la(struct adapter *sc, struct sbuf *sb, int flags) +{ + uint32_t cfg, *buf; + int rc; + + rc = -t4_cim_read(sc, A_UP_UP_DBG_LA_CFG, 1, &cfg); + if (rc != 0) + return (rc); + + MPASS(flags == M_WAITOK || flags == M_NOWAIT); + buf = malloc(sc->params.cim_la_size * sizeof(uint32_t), M_CXGBE, + M_ZERO | flags); + if (buf == NULL) + return (ENOMEM); + + rc = -t4_cim_read_la(sc, buf, NULL); + if (rc != 0) + goto done; + if (chip_id(sc) < CHELSIO_T6) + sbuf_cim_la4(sc, sb, buf, cfg); + else + sbuf_cim_la6(sc, sb, buf, cfg); + done: free(buf, M_CXGBE); return (rc); +} + +static int +sysctl_cim_la(SYSCTL_HANDLER_ARGS) +{ + struct adapter *sc = arg1; + struct sbuf *sb; + int rc; + + rc = sysctl_wire_old_buffer(req, 0); + if (rc != 0) + return (rc); + sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req); + if (sb == NULL) + return (ENOMEM); + + rc = sbuf_cim_la(sc, sb, M_WAITOK); + if (rc == 0) + rc = sbuf_finish(sb); + sbuf_delete(sb); + return (rc); +} + +bool +t4_os_dump_cimla(struct adapter *sc, int arg, bool verbose) +{ + struct sbuf sb; + int rc; + + if (sbuf_new(&sb, NULL, 4096, SBUF_AUTOEXTEND) != &sb) + return (false); + rc = sbuf_cim_la(sc, &sb, M_NOWAIT); + if (rc == 0) { + rc = sbuf_finish(&sb); + if (rc == 0) { + log(LOG_DEBUG, "%s: CIM LA dump follows.\n%s", + device_get_nameunit(sc->dev), sbuf_data(&sb)); + } + } + sbuf_delete(&sb); + return (false); } static int