From owner-svn-src-all@freebsd.org Mon Mar 26 20:59:28 2018 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 BDB7CF6B49D; Mon, 26 Mar 2018 20:59:27 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 693DC73D0F; Mon, 26 Mar 2018 20:59:27 +0000 (UTC) (envelope-from hselasky@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 63E661221E; Mon, 26 Mar 2018 20:59:27 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w2QKxRGn032083; Mon, 26 Mar 2018 20:59:27 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w2QKxQAM032070; Mon, 26 Mar 2018 20:59:26 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <201803262059.w2QKxQAM032070@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Mon, 26 Mar 2018 20:59:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r331586 - in stable/11: etc/mtree include share/man/man4 share/man/man5 share/mk sys/conf sys/dev/mlx5 sys/dev/mlx5/mlx5_core sys/modules/mlx5 targets/pseudo/userland tools/build/option... X-SVN-Group: stable-11 X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: in stable/11: etc/mtree include share/man/man4 share/man/man5 share/mk sys/conf sys/dev/mlx5 sys/dev/mlx5/mlx5_core sys/modules/mlx5 targets/pseudo/userland tools/build/options usr.sbin usr.sbin/mlx5t... X-SVN-Commit-Revision: 331586 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.25 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: Mon, 26 Mar 2018 20:59:28 -0000 Author: hselasky Date: Mon Mar 26 20:59:26 2018 New Revision: 331586 URL: https://svnweb.freebsd.org/changeset/base/331586 Log: MFC r330653: Add kernel and userspace code to dump the firmware state of supported ConnectX-4/5 devices in mlx5core. The dump is obtained by reading a predefined register map from the non-destructive crspace, accessible by the vendor-specific PCIe capability (VSC). The dump is stored in preallocated kernel memory and managed by the mlx5tool(8), which communicates with the driver using a character device node. The utility allows to store the dump in format
into a file, to reset the dump content, and to manually initiate the dump. A call to mlx5_fwdump() should be added at the places where a dump must be fetched automatically. The most likely place is right before a firmware reset request. Submitted by: kib@ Sponsored by: Mellanox Technologies Added: stable/11/share/man/man4/mlx5io.4 - copied unchanged from r330653, head/share/man/man4/mlx5io.4 stable/11/sys/dev/mlx5/mlx5_core/mlx5_fwdump.c - copied unchanged from r330653, head/sys/dev/mlx5/mlx5_core/mlx5_fwdump.c stable/11/sys/dev/mlx5/mlx5_core/mlx5_fwdump_regmaps.c - copied unchanged from r330653, head/sys/dev/mlx5/mlx5_core/mlx5_fwdump_regmaps.c stable/11/sys/dev/mlx5/mlx5io.h - copied unchanged from r330653, head/sys/dev/mlx5/mlx5io.h stable/11/tools/build/options/WITHOUT_MLX5TOOL - copied unchanged from r330653, head/tools/build/options/WITHOUT_MLX5TOOL stable/11/tools/build/options/WITH_MLX5TOOL - copied unchanged from r330653, head/tools/build/options/WITH_MLX5TOOL stable/11/usr.sbin/mlx5tool/ - copied from r330653, head/usr.sbin/mlx5tool/ Modified: stable/11/etc/mtree/BSD.include.dist stable/11/include/Makefile stable/11/share/man/man4/Makefile stable/11/share/man/man5/src.conf.5 stable/11/share/mk/src.opts.mk stable/11/sys/conf/files stable/11/sys/dev/mlx5/driver.h stable/11/sys/dev/mlx5/mlx5_core/mlx5_core.h stable/11/sys/dev/mlx5/mlx5_core/mlx5_main.c stable/11/sys/modules/mlx5/Makefile stable/11/targets/pseudo/userland/Makefile.depend stable/11/usr.sbin/Makefile Directory Properties: stable/11/ (props changed) Modified: stable/11/etc/mtree/BSD.include.dist ============================================================================== --- stable/11/etc/mtree/BSD.include.dist Mon Mar 26 20:54:21 2018 (r331585) +++ stable/11/etc/mtree/BSD.include.dist Mon Mar 26 20:59:26 2018 (r331586) @@ -130,6 +130,8 @@ .. mfi .. + mlx5 + .. mmc .. mpt Modified: stable/11/include/Makefile ============================================================================== --- stable/11/include/Makefile Mon Mar 26 20:54:21 2018 (r331585) +++ stable/11/include/Makefile Mon Mar 26 20:59:26 2018 (r331586) @@ -253,6 +253,11 @@ copies: .PHONY .META ${INSTALL} -C ${TAG_ARGS} -o ${BINOWN} -g ${BINGRP} -m 444 nvpair.h \ ${DESTDIR}${INCLUDEDIR}/sys .endif +.if ${MK_MLX5TOOL} != "no" + cd ${SRCTOP}/sys/dev/mlx5; \ + ${INSTALL} -C ${TAG_ARGS} -o ${BINOWN} -g ${BINGRP} -m 444 mlx5io.h \ + ${SDESTDIR}${INCLUDEDIR}/dev/mlx5 +.endif symlinks: .PHONY .META @${ECHO} "Setting up symlinks to kernel source tree..." @@ -382,6 +387,10 @@ symlinks: .PHONY .META ${INSTALL_SYMLINK} ${TAG_ARGS} ../../../sys/rpc/$$h \ ${DESTDIR}${INCLUDEDIR}/rpc; \ done +.if ${MK_MLX5TOOL} != "no" + ${INSTALL_SYMLINK} ${TAG_ARGS} ../../../../sys/dev/mlx5/mlx5io.h \ + ${SDESTDIR}${INCLUDEDIR}/dev/mlx5 +.endif .include Modified: stable/11/share/man/man4/Makefile ============================================================================== --- stable/11/share/man/man4/Makefile Mon Mar 26 20:54:21 2018 (r331585) +++ stable/11/share/man/man4/Makefile Mon Mar 26 20:59:26 2018 (r331586) @@ -920,6 +920,10 @@ MAN+= mlx4ib.4 MAN+= mlx5ib.4 .endif +.if ${MK_MLX5TOOL} != "no" +MAN+= mlx5io.4 +.endif + .if ${MK_TESTS} != "no" ATF= ${.CURDIR}/../../../contrib/atf .PATH: ${ATF}/doc Copied: stable/11/share/man/man4/mlx5io.4 (from r330653, head/share/man/man4/mlx5io.4) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/11/share/man/man4/mlx5io.4 Mon Mar 26 20:59:26 2018 (r331586, copy of r330653, head/share/man/man4/mlx5io.4) @@ -0,0 +1,142 @@ +.\" +.\" Copyright (c) 2018 Mellanox Technologies +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd February 20, 2018 +.Dt mlx5io 4 +.Os +.Sh NAME +.Nm mlx5io +.Nd IOCTL interface to manage Connect-X 4/5 Mellanox network adapters +.Sh SYNOPSIS +.In dev/mlx5/mlx5io.h +.Sh DESCRIPTION +The +.Nm +interface is provided for management of the Connect-X 4 and 5 network adapters +in the aspects not covered by the generic network configuration, +mostly related to the PCIe attachment and internal card working. +Interface consists of the commands, which are passed by means of +.Xr ioctl 2 +on the file descriptor, opened from the +.Pa /dev/mlx5ctl +device node. +.Pp +The following commands are implemented: +.Bl -tag -width indent +.It Dv MLX5_FWDUMP_FORCE +Take the snapshot of the firmware registers state and store it in the +kernel buffer. +The buffer must be empty, in other words, no dumps should be written so +far, or existing dump cleared with the +.Dv MLX5_FWDUMP_RESET +command for the specified device. +The argument for the command should point to the +.Vt struct mlx5_fwdump_addr +structure, containing the PCIe bus address of the device. +.Bd -literal +struct mlx5_fwdump_addr { + uint32_t domain; + uint8_t bus; + uint8_t slot; + uint8_t func; +}; +.Ed +.It Dv MLX5_FWDUMP_RESET +Clear the stored firmware dump, preparing the kernel buffer for +the next dump. +The argument for the command should point to the +.Vt struct mlx5_fwdump_addr +structure, containing the PCIe bus address of the device. +.It Dv MLX5_FWDUMP_GET +Fetch the stored firmware dump into the user memory. +The argument to the command should point to the input/output +.Vt struct mlx5_fwdump_get +structure. +Its +.Dv devaddr +field specifies the address of the device, the +.Dv buf +fields points to the array of +.Vt struct mlx5_fwdump_reg +of records of the registers values, the size of the array is specified +in the +.Dv reg_cnt +field. +.Bd -literal +struct mlx5_fwdump_get { + struct mlx5_fwdump_addr devaddr; + struct mlx5_fwdump_reg *buf; + size_t reg_cnt; + size_t reg_filled; /* out */ +}; +.Ed +.Pp +On successfull return, the +.Dv reg_filled +field reports the number of the +.Dv buf +array elements actually filled with the registers values. +If +.Dv buf +contains the +.Dv NULL +pointer, no registers are filled, but +.Dv reg_filled +still contains the number of registers that should be passed for +the complete dump. +.Pp +The +.Vt struct mlx5_fwdump_reg +element contains the address of the register in the field +.Dv addr , +and its value in the field +.Dv val . +.Bd -literal +struct mlx5_fwdump_reg { + uint32_t addr; + uint32_t val; +}; +.Ed +.El +.Sh FILES +The +.Pa /dev/mlx5ctl +.Xr devfs 5 +node is used to pass commands to the driver. +.Sh RETURN VALUES +If successful, the IOCTL returns zero. +Otherwise, -1 is returned and the global variable +.Va errno +is set to indicate the error. +.Sh SEE ALSO +.Xr errno 2 , +.Xr ioctl 2 , +.Xr mlx5en 4 , +.Xr mlx5ib 4 , +.Xr mlx5tool 8 +and +.Xr pci 9 . Modified: stable/11/share/man/man5/src.conf.5 ============================================================================== --- stable/11/share/man/man5/src.conf.5 Mon Mar 26 20:54:21 2018 (r331585) +++ stable/11/share/man/man5/src.conf.5 Mon Mar 26 20:59:26 2018 (r331586) @@ -431,12 +431,18 @@ Set to not build CUSE-related programs and libraries. .It Va WITHOUT_CXGBETOOL Set to not build .Xr cxgbetool 8 +.It Va WITHOUT_MLX5TOOL +Set to not build +.Xr mlx5tool 8 .Pp This is a default setting on arm/arm, arm/armeb, arm/armv6, mips/mipsel, mips/mips, mips/mips64el, mips/mips64, mips/mipsn32 and powerpc/powerpc. .It Va WITH_CXGBETOOL Set to build .Xr cxgbetool 8 +.It Va WITH_MLX5TOOL +Set to build +.Xr mlx5tool 8 .Pp This is a default setting on amd64/amd64, arm64/aarch64, i386/i386, pc98/i386, powerpc/powerpc64 and sparc64/sparc64. Modified: stable/11/share/mk/src.opts.mk ============================================================================== --- stable/11/share/mk/src.opts.mk Mon Mar 26 20:54:21 2018 (r331585) +++ stable/11/share/mk/src.opts.mk Mon Mar 26 20:59:26 2018 (r331586) @@ -286,8 +286,10 @@ BROKEN_OPTIONS+=PROFILE .if ${__T} == "aarch64" || ${__T} == "amd64" || ${__T} == "i386" || \ ${__T} == "powerpc64" || ${__T} == "sparc64" __DEFAULT_YES_OPTIONS+=CXGBETOOL +__DEFAULT_YES_OPTIONS+=MLX5TOOL .else __DEFAULT_NO_OPTIONS+=CXGBETOOL +__DEFAULT_NO_OPTIONS+=MLX5TOOL .endif .include Modified: stable/11/sys/conf/files ============================================================================== --- stable/11/sys/conf/files Mon Mar 26 20:54:21 2018 (r331585) +++ stable/11/sys/conf/files Mon Mar 26 20:59:26 2018 (r331586) @@ -4477,6 +4477,10 @@ dev/mlx5/mlx5_core/mlx5_fs_tree.c optional mlx5 pci \ compile-with "${OFED_C}" dev/mlx5/mlx5_core/mlx5_fw.c optional mlx5 pci \ compile-with "${OFED_C}" +dev/mlx5/mlx5_core/mlx5_fwdump.c optional mlx5 pci \ + compile-with "${OFED_C}" +dev/mlx5/mlx5_core/mlx5_fwdump_regmaps.c optional mlx5 pci \ + compile-with "${OFED_C}" dev/mlx5/mlx5_core/mlx5_health.c optional mlx5 pci \ compile-with "${OFED_C}" dev/mlx5/mlx5_core/mlx5_mad.c optional mlx5 pci \ Modified: stable/11/sys/dev/mlx5/driver.h ============================================================================== --- stable/11/sys/dev/mlx5/driver.h Mon Mar 26 20:54:21 2018 (r331585) +++ stable/11/sys/dev/mlx5/driver.h Mon Mar 26 20:59:26 2018 (r331586) @@ -614,6 +614,7 @@ struct mlx5_special_contexts { }; struct mlx5_flow_root_namespace; +struct mlx5_dump_data; struct mlx5_core_dev { struct pci_dev *pdev; /* sync pci state */ @@ -647,6 +648,7 @@ struct mlx5_core_dev { struct mlx5_flow_root_namespace *sniffer_rx_root_ns; struct mlx5_flow_root_namespace *sniffer_tx_root_ns; u32 num_q_counter_allocated[MLX5_INTERFACE_NUMBER]; + struct mlx5_dump_data *dump_data; }; enum { Modified: stable/11/sys/dev/mlx5/mlx5_core/mlx5_core.h ============================================================================== --- stable/11/sys/dev/mlx5/mlx5_core/mlx5_core.h Mon Mar 26 20:54:21 2018 (r331585) +++ stable/11/sys/dev/mlx5/mlx5_core/mlx5_core.h Mon Mar 26 20:59:26 2018 (r331586) @@ -95,4 +95,17 @@ static inline int mlx5_cmd_exec_check_status(struct ml int mlx5_rename_eq(struct mlx5_core_dev *dev, int eq_ix, char *name); +int mlx5_fwdump_init(void); +void mlx5_fwdump_fini(void); +int mlx5_fwdump_prep(struct mlx5_core_dev *mdev); +void mlx5_fwdump(struct mlx5_core_dev *mdev); +void mlx5_fwdump_clean(struct mlx5_core_dev *mdev); + +struct mlx5_crspace_regmap { + uint32_t addr; + unsigned cnt; +}; + +extern struct pci_driver mlx5_core_driver; + #endif /* __MLX5_CORE_H__ */ Copied: stable/11/sys/dev/mlx5/mlx5_core/mlx5_fwdump.c (from r330653, head/sys/dev/mlx5/mlx5_core/mlx5_fwdump.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/11/sys/dev/mlx5/mlx5_core/mlx5_fwdump.c Mon Mar 26 20:59:26 2018 (r331586, copy of r330653, head/sys/dev/mlx5/mlx5_core/mlx5_fwdump.c) @@ -0,0 +1,308 @@ +/*- + * Copyright (c) 2018, Mellanox Technologies, Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS `AS IS' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +extern const struct mlx5_crspace_regmap mlx5_crspace_regmap_mt4117[]; +extern const struct mlx5_crspace_regmap mlx5_crspace_regmap_mt4115[]; +extern const struct mlx5_crspace_regmap mlx5_crspace_regmap_connectx5[]; + +struct mlx5_dump_data { + const struct mlx5_crspace_regmap *rege; + uint32_t *dump; + unsigned dump_size; + int dump_valid; + struct mtx dump_lock; +}; + +static MALLOC_DEFINE(M_MLX5_DUMP, "MLX5DUMP", "MLX5 Firmware dump"); + +static unsigned +mlx5_fwdump_getsize(const struct mlx5_crspace_regmap *rege) +{ + const struct mlx5_crspace_regmap *r; + unsigned sz; + + for (sz = 0, r = rege; r->cnt != 0; r++) + sz += r->cnt; + return (sz); +} + +static void +mlx5_fwdump_destroy_dd(struct mlx5_dump_data *dd) +{ + + mtx_destroy(&dd->dump_lock); + free(dd->dump, M_MLX5_DUMP); + free(dd, M_MLX5_DUMP); +} + +int +mlx5_fwdump_prep(struct mlx5_core_dev *mdev) +{ + struct mlx5_dump_data *dd; + int error; + + error = mlx5_vsc_find_cap(mdev); + if (error != 0) + return (error); + dd = malloc(sizeof(struct mlx5_dump_data), M_MLX5_DUMP, M_WAITOK); + switch (pci_get_device(mdev->pdev->dev.bsddev)) { + case 0x1013: + dd->rege = mlx5_crspace_regmap_mt4115; + break; + case 0x1015: + dd->rege = mlx5_crspace_regmap_mt4117; + break; + case 0x1017: + case 0x1019: + dd->rege = mlx5_crspace_regmap_connectx5; + break; + default: + free(dd, M_MLX5_DUMP); + return (0); /* silently fail to not prevent driver attach */ + } + dd->dump_size = mlx5_fwdump_getsize(dd->rege); + dd->dump = malloc(dd->dump_size * sizeof(uint32_t), M_MLX5_DUMP, + M_WAITOK | M_ZERO); + dd->dump_valid = 0; + mtx_init(&dd->dump_lock, "mlx5dmp", NULL, MTX_DEF | MTX_NEW); + if (atomic_cmpset_rel_ptr((uintptr_t *)&mdev->dump_data, 0, + (uintptr_t)dd) == 0) + mlx5_fwdump_destroy_dd(dd); + return (0); +} + +void +mlx5_fwdump(struct mlx5_core_dev *mdev) +{ + struct mlx5_dump_data *dd; + const struct mlx5_crspace_regmap *r; + uint32_t i, ri; + int error; + + dd = (struct mlx5_dump_data *)atomic_load_acq_ptr((uintptr_t *) + &mdev->dump_data); + if (dd == NULL) + return; + mtx_lock(&dd->dump_lock); + if (dd->dump_valid) + /* only one dump */ + goto failed; + + /* mlx5_vsc already warns, be silent. */ + error = mlx5_vsc_lock(mdev); + if (error != 0) + goto failed; + error = mlx5_vsc_set_space(mdev, MLX5_VSC_DOMAIN_PROTECTED_CRSPACE); + if (error != 0) + goto unlock_vsc; + for (i = 0, r = dd->rege; r->cnt != 0; r++) { + for (ri = 0; ri < r->cnt; ri++) { + error = mlx5_vsc_read(mdev, r->addr + ri * 4, + &dd->dump[i]); + if (error != 0) + goto unlock_vsc; + i++; + } + } + atomic_store_rel_int(&dd->dump_valid, 1); +unlock_vsc: + mlx5_vsc_unlock(mdev); +failed: + mtx_unlock(&dd->dump_lock); +} + +void +mlx5_fwdump_clean(struct mlx5_core_dev *mdev) +{ + struct mlx5_dump_data *dd; + + for (;;) { + dd = mdev->dump_data; + if (dd == NULL) + return; + if (atomic_cmpset_ptr((uintptr_t *)&mdev->dump_data, + (uintptr_t)dd, 0) == 1) { + mlx5_fwdump_destroy_dd(dd); + return; + } + } +} + +static int +mlx5_dbsf_to_core(const struct mlx5_fwdump_addr *devaddr, + struct mlx5_core_dev **mdev) +{ + device_t dev; + struct pci_dev *pdev; + + dev = pci_find_dbsf(devaddr->domain, devaddr->bus, devaddr->slot, + devaddr->func); + if (dev == NULL) + return (ENOENT); + if (device_get_devclass(dev) != mlx5_core_driver.bsdclass) + return (EINVAL); + pdev = device_get_softc(dev); + *mdev = pci_get_drvdata(pdev); + if (*mdev == NULL) + return (ENOENT); + return (0); +} + +static int +mlx5_fwdump_copyout(struct mlx5_dump_data *dd, struct mlx5_fwdump_get *fwg) +{ + const struct mlx5_crspace_regmap *r; + struct mlx5_fwdump_reg rv, *urv; + uint32_t i, ri; + int error; + + if (dd == NULL) + return (ENOENT); + if (fwg->buf == NULL) { + fwg->reg_filled = dd->dump_size; + return (0); + } + if (atomic_load_acq_int(&dd->dump_valid) == 0) + return (ENOENT); + + urv = fwg->buf; + for (i = 0, r = dd->rege; r->cnt != 0; r++) { + for (ri = 0; ri < r->cnt; ri++) { + if (i >= fwg->reg_cnt) + goto out; + rv.addr = r->addr + ri * 4; + rv.val = dd->dump[i]; + error = copyout(&rv, urv, sizeof(rv)); + if (error != 0) + return (error); + urv++; + i++; + } + } +out: + fwg->reg_filled = i; + return (0); +} + +static int +mlx5_fwdump_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, + struct thread *td) +{ + struct mlx5_core_dev *mdev; + struct mlx5_fwdump_get *fwg; + struct mlx5_fwdump_addr *devaddr; + struct mlx5_dump_data *dd; + int error; + + error = 0; + switch (cmd) { + case MLX5_FWDUMP_GET: + if ((fflag & FREAD) == 0) { + error = EBADF; + break; + } + fwg = (struct mlx5_fwdump_get *)data; + devaddr = &fwg->devaddr; + error = mlx5_dbsf_to_core(devaddr, &mdev); + if (error != 0) + break; + error = mlx5_fwdump_copyout(mdev->dump_data, fwg); + break; + case MLX5_FWDUMP_RESET: + if ((fflag & FWRITE) == 0) { + error = EBADF; + break; + } + devaddr = (struct mlx5_fwdump_addr *)data; + error = mlx5_dbsf_to_core(devaddr, &mdev); + if (error != 0) + break; + dd = mdev->dump_data; + if (dd != NULL) + atomic_store_rel_int(&dd->dump_valid, 0); + else + error = ENOENT; + break; + case MLX5_FWDUMP_FORCE: + if ((fflag & FWRITE) == 0) { + error = EBADF; + break; + } + devaddr = (struct mlx5_fwdump_addr *)data; + error = mlx5_dbsf_to_core(devaddr, &mdev); + if (error != 0) + break; + mlx5_fwdump(mdev); + break; + default: + error = ENOTTY; + break; + } + return (error); +} + +static struct cdevsw mlx5_fwdump_devsw = { + .d_version = D_VERSION, + .d_ioctl = mlx5_fwdump_ioctl, +}; + +static struct cdev *mlx5_fwdump_dev; + +int +mlx5_fwdump_init(void) +{ + struct make_dev_args mda; + int error; + + make_dev_args_init(&mda); + mda.mda_flags = MAKEDEV_WAITOK | MAKEDEV_CHECKNAME; + mda.mda_devsw = &mlx5_fwdump_devsw; + mda.mda_uid = UID_ROOT; + mda.mda_gid = GID_OPERATOR; + mda.mda_mode = 0640; + error = make_dev_s(&mda, &mlx5_fwdump_dev, "mlx5ctl"); + return (-error); +} + +void +mlx5_fwdump_fini(void) +{ + + if (mlx5_fwdump_dev != NULL) + destroy_dev(mlx5_fwdump_dev); + +} Copied: stable/11/sys/dev/mlx5/mlx5_core/mlx5_fwdump_regmaps.c (from r330653, head/sys/dev/mlx5/mlx5_core/mlx5_fwdump_regmaps.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/11/sys/dev/mlx5/mlx5_core/mlx5_fwdump_regmaps.c Mon Mar 26 20:59:26 2018 (r331586, copy of r330653, head/sys/dev/mlx5/mlx5_core/mlx5_fwdump_regmaps.c) @@ -0,0 +1,11187 @@ +/*- + * Copyright (c) 2018, Mellanox Technologies, Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS `AS IS' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +const struct mlx5_crspace_regmap mlx5_crspace_regmap_mt4117[] = { + {0x000000, 16388}, + {0x010084, 1}, + {0x01008c, 2}, + {0x010180, 6}, + {0x01019c, 9}, + {0x010304, 1}, + {0x0103bc, 52}, + {0x010500, 35}, + {0x010604, 1}, + {0x01060c, 1}, + {0x010624, 1}, + {0x01062c, 1}, + {0x010644, 1}, + {0x01064c, 3}, + {0x010800, 1}, + {0x010814, 3}, + {0x010844, 1}, + {0x01084c, 4}, + {0x011000, 32}, + {0x011200, 32}, + {0x011400, 32}, + {0x011600, 32}, + {0x011800, 32}, + {0x011a00, 5}, + {0x011a24, 1}, + {0x011a2c, 1}, + {0x011a34, 3}, + {0x011a44, 1}, + {0x011a4c, 2}, + {0x012000, 20}, + {0x012088, 22}, + {0x012100, 18}, + {0x012200, 36}, + {0x012300, 3}, + {0x012310, 1}, + {0x012320, 1}, + {0x012330, 1}, + {0x012340, 1}, + {0x012350, 1}, + {0x012360, 1}, + {0x012370, 1}, + {0x012400, 166}, + {0x0126a0, 1}, + {0x012700, 32}, + {0x012800, 1}, + {0x012808, 1}, + {0x012810, 1}, + {0x012818, 1}, + {0x012820, 1}, + {0x012828, 1}, + {0x012830, 1}, + {0x012838, 1}, + {0x012850, 1}, + {0x012858, 1}, + {0x012860, 1}, + {0x012868, 1}, + {0x012870, 1}, + {0x012878, 1}, + {0x012880, 1}, + {0x012888, 1}, + {0x012890, 5}, + {0x012900, 10}, + {0x012940, 6}, + {0x012960, 6}, + {0x012980, 5}, + {0x012a00, 6}, + {0x012a40, 5}, + {0x012a80, 9}, + {0x012ac0, 19}, + {0x012b10, 2}, + {0x014000, 1}, + {0x014010, 10}, + {0x014104, 1}, + {0x01410c, 4}, + {0x014200, 1}, + {0x014210, 4}, + {0x014300, 4}, + {0x014400, 3}, + {0x014410, 1}, + {0x014444, 1}, + {0x01444c, 4}, + {0x014480, 2}, + {0x014500, 35}, + {0x014590, 1}, + {0x014600, 32}, + {0x014704, 1}, + {0x01470c, 1}, + {0x014804, 2}, + {0x014814, 3}, + {0x014824, 2}, + {0x014834, 3}, + {0x014844, 2}, + {0x014854, 5}, + {0x014a00, 4}, + {0x014a14, 2}, + {0x015004, 1}, + {0x01500c, 4}, + {0x015204, 1}, + {0x015214, 4}, + {0x015228, 1}, + {0x015244, 1}, + {0x015250, 4}, + {0x015274, 1}, + {0x01527c, 1}, + {0x0152a4, 1}, + {0x015300, 4}, + {0x015314, 1}, + {0x01531c, 3}, + {0x015404, 2}, + {0x015430, 20}, + {0x015484, 2}, + {0x015498, 5}, + {0x0154bc, 1}, + {0x0154c8, 1}, + {0x0154d4, 2}, + {0x01550c, 3}, + {0x015524, 3}, + {0x015608, 3}, + {0x015618, 4}, + {0x015680, 16}, + {0x015704, 2}, + {0x015730, 20}, + {0x015784, 3}, + {0x015794, 3}, + {0x0157c0, 6}, + {0x015800, 52}, + {0x0158d4, 1}, + {0x0158dc, 1}, + {0x0158e4, 3}, + {0x0158f4, 1}, + {0x0158fc, 52}, + {0x015b04, 2}, + {0x015b14, 3}, + {0x015b24, 2}, + {0x015b38, 6}, + {0x015b60, 5}, + {0x015c04, 1}, + {0x015cb8, 18}, + {0x015d98, 1}, + {0x015e00, 1}, + {0x015e08, 1}, + {0x015e10, 1}, + {0x016000, 32}, + {0x016100, 7}, + {0x016120, 2}, + {0x016144, 3}, + {0x016204, 1}, + {0x01620c, 1}, + {0x016224, 1}, + {0x01622c, 1}, + {0x016234, 1}, + {0x01623c, 1}, + {0x016244, 1}, + {0x01624c, 1}, + {0x016254, 1}, + {0x01625c, 2}, + {0x016270, 1}, + {0x016280, 1}, + {0x016290, 1}, + {0x0162a0, 1}, + {0x0162b0, 1}, + {0x0162c0, 1}, + {0x0162d0, 1}, + {0x0162e0, 1}, + {0x0162f0, 1}, + {0x016300, 1}, + {0x016310, 1}, + {0x016320, 1}, + {0x016330, 1}, + {0x016340, 32}, + {0x016400, 19}, + {0x016454, 7}, + {0x016484, 1}, + {0x01648c, 1}, + {0x016800, 9}, + {0x016840, 16}, + {0x017800, 1}, + {0x017828, 1}, + {0x017850, 1}, + {0x017878, 1}, + {0x0178a0, 12}, + {0x0179ac, 1}, + {0x0179d8, 4}, + {0x017a00, 6}, + {0x017a20, 6}, + {0x017a40, 3}, + {0x017c00, 6}, + {0x017c20, 6}, + {0x017c40, 6}, + {0x017c60, 6}, + {0x017c80, 6}, + {0x017ca0, 6}, + {0x017cc0, 6}, + {0x017ce0, 6}, + {0x017d00, 3}, + {0x017d10, 6}, + {0x018400, 11}, + {0x018430, 2}, + {0x018440, 4}, + {0x018604, 1}, + {0x018618, 2}, + {0x018640, 4}, + {0x018660, 2}, + {0x018800, 1}, + {0x018810, 4}, + {0x018844, 1}, + {0x01884c, 4}, + {0x018880, 2}, + {0x01a400, 12}, + {0x01a444, 1}, + {0x01a44c, 1}, + {0x01a800, 1}, + {0x01a814, 3}, + {0x01a844, 1}, + {0x01a84c, 4}, + {0x01c400, 7}, + {0x01c500, 8}, + {0x01c544, 1}, + {0x01c554, 3}, + {0x01c564, 3}, + {0x01c574, 3}, + {0x01c604, 1}, + {0x01c60c, 3}, + {0x01c800, 1}, + {0x01c814, 3}, + {0x01c844, 1}, + {0x01c84c, 4}, + {0x01f000, 1}, + {0x01f400, 1}, + {0x01f408, 4}, + {0x01f41c, 3}, + {0x01f500, 2}, + {0x01f800, 1}, + {0x01f814, 3}, + {0x01f844, 1}, + {0x01f84c, 4}, + {0x01f880, 3}, + {0x020004, 1}, + {0x02000c, 4}, + {0x020080, 3}, + {0x020090, 5}, + {0x020800, 16}, + {0x020900, 192}, + {0x021004, 1}, + {0x02100c, 4}, + {0x021400, 5}, + {0x021418, 5}, + {0x021480, 1}, + {0x021704, 2}, + {0x02173c, 17}, + {0x0217fc, 2}, + {0x021844, 1}, + {0x022280, 12}, + {0x022408, 6}, + {0x022444, 1}, + {0x022454, 3}, + {0x022504, 1}, + {0x02250c, 4}, + {0x022624, 1}, + {0x02262c, 3}, + {0x02263c, 1}, + {0x022804, 1}, + {0x02280c, 4}, + {0x022904, 4}, + {0x022924, 4}, + {0x024000, 36}, + {0x0240c0, 21}, + {0x024120, 11}, + {0x024200, 5}, + {0x024220, 1}, + {0x024230, 8}, + {0x024258, 1}, + {0x024260, 1}, + {0x024270, 9}, + {0x0242a0, 1}, + {0x0242b0, 4}, + {0x0242c8, 2}, + {0x024300, 5}, + {0x024318, 2}, + {0x02439c, 25}, + {0x024424, 4}, + {0x024464, 13}, + {0x0244a4, 1}, + {0x0244ac, 3}, + {0x0244c0, 2}, + {0x0244d0, 3}, + {0x0244e0, 3}, + {0x0244f0, 3}, + {0x024500, 3}, + {0x024510, 3}, + {0x024520, 3}, + {0x024530, 3}, + {0x024884, 11}, + {0x0248b4, 3}, + {0x0248c4, 1}, + {0x0248cc, 1}, + {0x0248d4, 1}, + {0x0248dc, 1}, + {0x0248f0, 2}, + {0x024908, 6}, + {0x024928, 6}, + {0x024968, 6}, + {0x024984, 3}, + {0x024994, 1}, + {0x02499c, 6}, + {0x0249b8, 7}, + {0x024a08, 6}, + {0x024a28, 6}, + {0x024a68, 6}, + {0x024a84, 1}, + {0x024a8c, 1}, + {0x024a94, 1}, + {0x024a9c, 13}, + {0x024ae0, 6}, + {0x024b00, 7}, + {0x024b20, 6}, + {0x024b40, 8}, + {0x024c00, 2}, + {0x024c24, 3}, + {0x024c34, 3}, + {0x025004, 6}, + {0x025800, 37}, + {0x025904, 1}, + {0x02590c, 1}, + {0x026000, 99}, + {0x026200, 1}, + {0x026800, 7}, + {0x026824, 6}, + {0x026840, 2}, + {0x026864, 1}, + {0x02686c, 1}, + {0x026874, 3}, + {0x026884, 1}, + {0x0268a4, 7}, + {0x026904, 1}, + {0x02690c, 4}, + {0x026940, 1}, + {0x026980, 33}, + {0x026a0c, 7}, + {0x026a30, 1}, + {0x026a44, 4}, + {0x026a60, 1}, + {0x026a70, 1}, + {0x026b00, 9}, + {0x026b44, 2}, + {0x026b68, 6}, + {0x026b84, 2}, + {0x026ba8, 14}, + {0x026c00, 16}, + {0x026c44, 1}, + {0x026c4c, 1}, + {0x026c84, 1}, + {0x026c8c, 4}, + {0x026cc4, 1}, + {0x026ccc, 4}, + {0x026d00, 2}, + {0x028800, 2}, + {0x028844, 1}, + {0x02884c, 4}, + {0x029004, 7}, + {0x029b30, 2}, + {0x029b50, 4}, + {0x02a004, 1}, + {0x02a00c, 4}, + {0x02a040, 6}, + {0x02a200, 1}, + {0x02a210, 11}, + {0x02a240, 8}, + {0x02a484, 1}, + {0x02a4c0, 16}, + {0x02a780, 1}, + {0x02a7a0, 4}, + {0x02a7c0, 1}, + {0x02a900, 1}, *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***