From patchwork Mon Dec 4 22:34:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844488 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="xtkHETqT"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKSH2fsCz9ryQ for ; Tue, 5 Dec 2017 09:34:39 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752326AbdLDWeg (ORCPT ); Mon, 4 Dec 2017 17:34:36 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:40063 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752151AbdLDWec (ORCPT ); Mon, 4 Dec 2017 17:34:32 -0500 Received: by mail-wm0-f67.google.com with SMTP id f206so10887812wmf.5 for ; Mon, 04 Dec 2017 14:34:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FnEg2WfuiWwWSRsO2zKi/806Xi7LMjevOrU22AdDWdA=; b=xtkHETqTLOPq48Sysewwe/I/rEFHmPuYmqgA7DMttPHWCdVPgnin82lX/a9y3YZ83l CetP+4dDl0QFYL2naVRToqDUfcXExCTmtaISQHy+tqQ54Ej08C0Tw8xeCHaZw2TfQj9u cf5k1aFrXoD49JWAmryumZWcUK+yvIOkoSk330RD7Z4KeZOgUHAUd3tkMgrkQ9p+0Pm1 xQSfbyYh7mrKh/3VR/zUUM9RVBv5iOQZ06r0K+abRt/wLjFlJXDdykLODy7PShPIVj/e 9v+6cEOR0KVOQoTKvkgjBcZd35YHMVwe7C6Vxs+taWOORBMMkrqqV3c9AEQ4rLYg+OkO My5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FnEg2WfuiWwWSRsO2zKi/806Xi7LMjevOrU22AdDWdA=; b=iwiIywt+chhX0l+IElWxjkiwFIaEi6I/9u1XxA9qK5TsAylEVTlG4gSaGapMHmGdAi Yz25e6nFba2KEQMLwLP0TLRHu9QN1Mqh0H5l20BTerhzIzszNq22v+3PhW4ZLjsV+FGu OkblzrmDjgV2J7Ax7g3RJUB5HPeV7Y2E64i+N8HHKcvf++mtImCvyjYEh4iMG0tSpdY6 6gpiv65sbLd3SUfxwCY0wg5FVz/9Gliy+JUtOoYsY6VYleWs53NnED9Y81o/E0tiuRmL gP9RyJCMbEB1UwY5wYaZWTblX98ioM2WfUvtME7wHV6nqfbpDhGFsqVcyB16pu2L7cWr MWoQ== X-Gm-Message-State: AJaThX71aQ6gSkTtcnFvlVtCTaRhpNNQLAQkktByh1pYzMG9RWtZMECv XQAcINgLoZsRXbPBX3jfr21EGg== X-Google-Smtp-Source: AGs4zMbJY7o5iJez5Xyh1cHUi7kFOT9RHAjnSDTKXyhFsNtcSlFiEb2yKBi3tF+Xg3OznxB0SvHRfg== X-Received: by 10.80.134.51 with SMTP id o48mr32781732edo.276.1512426871428; Mon, 04 Dec 2017 14:34:31 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:30 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 01/10] nfp: debug dump ethtool ops Date: Mon, 4 Dec 2017 23:34:12 +0100 Message-Id: <20171204223421.19174-2-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann - Skeleton code to perform a binary debug dump via ethtoolops "set_dump", "get_dump_flags" and "get_dump_data", i.e. the ethtool -W/w mechanism. - Skeleton functions for debugdump operations provided. - An integer "dump level" can be specified, this is stored between ethtool invocations. Dump level 0 is still the "arm.diag" resource for backward compatibility. Other dump levels each define a set of state information to include in the dump, driven by a spec from FW. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- drivers/net/ethernet/netronome/nfp/Makefile | 1 + drivers/net/ethernet/netronome/nfp/nfp_main.c | 6 +++ drivers/net/ethernet/netronome/nfp/nfp_main.h | 29 ++++++++++++ .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 54 +++++++++++++++++++++ .../net/ethernet/netronome/nfp/nfp_net_ethtool.c | 55 ++++++++++++++++++---- 5 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c diff --git a/drivers/net/ethernet/netronome/nfp/Makefile b/drivers/net/ethernet/netronome/nfp/Makefile index 24c4408b5734..6e5ef984398b 100644 --- a/drivers/net/ethernet/netronome/nfp/Makefile +++ b/drivers/net/ethernet/netronome/nfp/Makefile @@ -22,6 +22,7 @@ nfp-objs := \ nfp_hwmon.o \ nfp_main.o \ nfp_net_common.o \ + nfp_net_debugdump.o \ nfp_net_ethtool.o \ nfp_net_main.o \ nfp_net_repr.o \ diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c index 35eaccbece36..0953fa8f3109 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_main.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include "nfpcore/nfp.h" @@ -509,6 +510,9 @@ static int nfp_pci_probe(struct pci_dev *pdev, pf->mip = nfp_mip_open(pf->cpp); pf->rtbl = __nfp_rtsym_table_read(pf->cpp, pf->mip); + pf->dump_flag = NFP_DUMP_NSP_DIAG; + pf->dumpspec = nfp_net_dump_load_dumpspec(pf->cpp, pf->rtbl); + err = nfp_pcie_sriov_read_nfd_limit(pf); if (err) goto err_fw_unload; @@ -544,6 +548,7 @@ static int nfp_pci_probe(struct pci_dev *pdev, nfp_fw_unload(pf); kfree(pf->eth_tbl); kfree(pf->nspi); + vfree(pf->dumpspec); err_devlink_unreg: devlink_unregister(devlink); err_hwinfo_free: @@ -579,6 +584,7 @@ static void nfp_pci_remove(struct pci_dev *pdev) devlink_unregister(devlink); + vfree(pf->dumpspec); kfree(pf->rtbl); nfp_mip_close(pf->mip); if (pf->fw_loaded) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.h b/drivers/net/ethernet/netronome/nfp/nfp_main.h index be0ee59f2eb9..add46e28212b 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_main.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_main.h @@ -39,6 +39,7 @@ #ifndef NFP_MAIN_H #define NFP_MAIN_H +#include #include #include #include @@ -62,6 +63,17 @@ struct nfp_port; struct nfp_rtsym_table; /** + * struct nfp_dumpspec - NFP FW dump specification structure + * @size: Size of the data + * @data: Sequence of TLVs, each being an instruction to dump some data + * from FW + */ +struct nfp_dumpspec { + u32 size; + u8 data[0]; +}; + +/** * struct nfp_pf - NFP PF-specific device structure * @pdev: Backpointer to PCI device * @cpp: Pointer to the CPP handle @@ -83,6 +95,9 @@ struct nfp_rtsym_table; * @mip: MIP handle * @rtbl: RTsym table * @hwinfo: HWInfo table + * @dumpspec: Debug dump specification + * @dump_flag: Store dump flag between set_dump and get_dump_flag + * @dump_len: Store dump length between set_dump and get_dump_flag * @eth_tbl: NSP ETH table * @nspi: NSP identification info * @hwmon_dev: pointer to hwmon device @@ -124,6 +139,9 @@ struct nfp_pf { const struct nfp_mip *mip; struct nfp_rtsym_table *rtbl; struct nfp_hwinfo *hwinfo; + struct nfp_dumpspec *dumpspec; + u32 dump_flag; + u32 dump_len; struct nfp_eth_table *eth_tbl; struct nfp_nsp_identify *nspi; @@ -157,4 +175,15 @@ void nfp_net_get_mac_addr(struct nfp_pf *pf, struct nfp_port *port); bool nfp_ctrl_tx(struct nfp_net *nn, struct sk_buff *skb); +enum nfp_dump_diag { + NFP_DUMP_NSP_DIAG = 0, +}; + +struct nfp_dumpspec * +nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl); +s64 nfp_net_dump_calculate_size(struct nfp_pf *pf, struct nfp_dumpspec *spec, + u32 flag); +int nfp_net_dump_populate_buffer(struct nfp_pf *pf, struct nfp_dumpspec *spec, + struct ethtool_dump *dump_param, void *dest); + #endif /* NFP_MAIN_H */ diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c new file mode 100644 index 000000000000..a7061b6c609d --- /dev/null +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2017 Netronome Systems, Inc. + * + * This software is dual licensed under the GNU General License Version 2, + * June 1991 as shown in the file COPYING in the top-level directory of this + * source tree or the BSD 2-Clause License provided below. You have the + * option to license this software under the complete terms of either license. + * + * The BSD 2-Clause License: + * + * 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. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include + +#include "nfp_main.h" + +struct nfp_dumpspec * +nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl) +{ + return NULL; +} + +s64 nfp_net_dump_calculate_size(struct nfp_pf *pf, struct nfp_dumpspec *spec, + u32 flag) +{ + return -EOPNOTSUPP; +} + +int nfp_net_dump_populate_buffer(struct nfp_pf *pf, struct nfp_dumpspec *spec, + struct ethtool_dump *dump_param, void *dest) +{ + return -EOPNOTSUPP; +} diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c index 2801ecd09eab..2cde0eb00ee3 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c @@ -51,14 +51,11 @@ #include "nfpcore/nfp.h" #include "nfpcore/nfp_nsp.h" #include "nfp_app.h" +#include "nfp_main.h" #include "nfp_net_ctrl.h" #include "nfp_net.h" #include "nfp_port.h" -enum nfp_dump_diag { - NFP_DUMP_NSP_DIAG = 0, -}; - struct nfp_et_stat { char name[ETH_GSTRING_LEN]; int off; @@ -1066,15 +1063,34 @@ nfp_dump_nsp_diag(struct nfp_app *app, struct ethtool_dump *dump, void *buffer) return ret; } +/* Set the dump flag/level. Calculate the dump length for flag > 0 only (new TLV + * based dumps), since flag 0 (default) calculates the length in + * nfp_app_get_dump_flag(), and we need to support triggering a level 0 dump + * without setting the flag first, for backward compatibility. + */ static int nfp_app_set_dump(struct net_device *netdev, struct ethtool_dump *val) { struct nfp_app *app = nfp_app_from_netdev(netdev); + s64 len; if (!app) return -EOPNOTSUPP; - if (val->flag != NFP_DUMP_NSP_DIAG) - return -EINVAL; + if (val->flag == NFP_DUMP_NSP_DIAG) { + app->pf->dump_flag = val->flag; + return 0; + } + + if (!app->pf->dumpspec) + return -EOPNOTSUPP; + + len = nfp_net_dump_calculate_size(app->pf, app->pf->dumpspec, + val->flag); + if (len < 0) + return len; + + app->pf->dump_flag = val->flag; + app->pf->dump_len = len; return 0; } @@ -1082,14 +1098,37 @@ static int nfp_app_set_dump(struct net_device *netdev, struct ethtool_dump *val) static int nfp_app_get_dump_flag(struct net_device *netdev, struct ethtool_dump *dump) { - return nfp_dump_nsp_diag(nfp_app_from_netdev(netdev), dump, NULL); + struct nfp_app *app = nfp_app_from_netdev(netdev); + + if (!app) + return -EOPNOTSUPP; + + if (app->pf->dump_flag == NFP_DUMP_NSP_DIAG) + return nfp_dump_nsp_diag(app, dump, NULL); + + dump->flag = app->pf->dump_flag; + dump->len = app->pf->dump_len; + + return 0; } static int nfp_app_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump, void *buffer) { - return nfp_dump_nsp_diag(nfp_app_from_netdev(netdev), dump, buffer); + struct nfp_app *app = nfp_app_from_netdev(netdev); + + if (!app) + return -EOPNOTSUPP; + + if (app->pf->dump_flag == NFP_DUMP_NSP_DIAG) + return nfp_dump_nsp_diag(app, dump, buffer); + + dump->flag = app->pf->dump_flag; + dump->len = app->pf->dump_len; + + return nfp_net_dump_populate_buffer(app->pf, app->pf->dumpspec, dump, + buffer); } static int nfp_net_set_coalesce(struct net_device *netdev, From patchwork Mon Dec 4 22:34:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844497 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="Il5Am1aq"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKTf6dJlz9ryQ for ; Tue, 5 Dec 2017 09:35:50 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752303AbdLDWfs (ORCPT ); Mon, 4 Dec 2017 17:35:48 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:44778 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751628AbdLDWed (ORCPT ); Mon, 4 Dec 2017 17:34:33 -0500 Received: by mail-wm0-f66.google.com with SMTP id t8so8668578wmc.3 for ; Mon, 04 Dec 2017 14:34:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=3loN4LlDXWBW0H4hXZhrxpxTrHRzFl4DbUlrSFYOtmk=; b=Il5Am1aq3zKrPuOqRZIUSTNyW5jF8kyox6cub1TMfzyn5gusWDqrsd/73H9ZR74l04 b0uIJVhfetWMRipicDMwi9NKiQoZKQxXQ07RZZOrU8sca/2zzFNJgRJSzG+IP/Bz2cav jbdfZfJ23SWb4zQc6LAJMGvHW3mnwEfMJ/75sNhR7LTe4XooLohxaSXWrT/loXJiEx9p Ljf/ZX1XZC7PfImnTYrFTcw9yuYAeyPg8bPuGwxKu6fHJOvCj17h6zw5phcrisaKS/J2 6zv8q17cQ8YqvShss03QNkdOrhlO7CoNkKa5+LQ8iNtv08QqeYu1JdvQE0I1vGqcohG6 zHhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=3loN4LlDXWBW0H4hXZhrxpxTrHRzFl4DbUlrSFYOtmk=; b=ZFsCR8EX3cKxvzFloLQ8byFQDd7MU83FgO3404pVf9mxnvt6JVoMSS40cZZ4T85yAs dl5es/TXYGJliiSB5mavyaoFCVPZPSB4a58NXYIy3eBLFTzx40hvLpN3filuVHgwj9Lr j+/mLYtvDsYFcskqpzo3KnWg9RBC4rbGNNKkgeCZ8isJDIHdrR7tLR3WnkOd/KtYIE8y nzb5wPTN5J1cFJAI5wWcrgqvUfpPE/u6nC682ebOQHbaBQerOhKOuJ66ttR04zfRujyq 8g4eyS/WUyoLeuDvjxkMmK7rP2YehspKqVeRoVPuWKVOGRRA3+rxzEi9uUzURMu2dawu qYbA== X-Gm-Message-State: AJaThX7GHAeK/KQ1fiSA6IbKVtqJ0OE4K4Ev8aVDMws5t4q45dYLWkaX eukF90mO5bivwEC/BCSFq1YQJE/SzbI= X-Google-Smtp-Source: AGs4zMauDi5PGRvV6iAw/8529rQ6SGtsy58Lh86UdtxE55G3opY5Dak32QfX++JlAEhnNgCfP31gGw== X-Received: by 10.80.160.198 with SMTP id 64mr33389609edo.242.1512426872526; Mon, 04 Dec 2017 14:34:32 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:31 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 02/10] nfp: load debug dump spec Date: Mon, 4 Dec 2017 23:34:13 +0100 Message-Id: <20171204223421.19174-3-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann Load the TLV-based binary specification of what needs to be included in a dump, from the "_abi_dump_spec" rtsymbol. If the symbol is not defined, then dumps for levels >= 1 are not supported. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index a7061b6c609d..15b6623ef0b2 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -32,13 +32,45 @@ */ #include +#include #include "nfp_main.h" +#include "nfpcore/nfp.h" +#include "nfpcore/nfp_nffw.h" + +#define NFP_DUMP_SPEC_RTSYM "_abi_dump_spec" struct nfp_dumpspec * nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl) { - return NULL; + const struct nfp_rtsym *specsym; + struct nfp_dumpspec *dumpspec; + int bytes_read; + u32 cpp_id; + + specsym = nfp_rtsym_lookup(rtbl, NFP_DUMP_SPEC_RTSYM); + if (!specsym) + return NULL; + + /* expected size of this buffer is in the order of tens of kilobytes */ + dumpspec = vmalloc(sizeof(*dumpspec) + specsym->size); + if (!dumpspec) + return NULL; + + dumpspec->size = specsym->size; + + cpp_id = NFP_CPP_ISLAND_ID(specsym->target, NFP_CPP_ACTION_RW, 0, + specsym->domain); + + bytes_read = nfp_cpp_read(cpp, cpp_id, specsym->addr, dumpspec->data, + specsym->size); + if (bytes_read != specsym->size) { + vfree(dumpspec); + nfp_warn(cpp, "Debug dump specification read failed.\n"); + return NULL; + } + + return dumpspec; } s64 nfp_net_dump_calculate_size(struct nfp_pf *pf, struct nfp_dumpspec *spec, From patchwork Mon Dec 4 22:34:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844496 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="Ofy/mJj1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKTb6r7tz9s7g for ; Tue, 5 Dec 2017 09:35:47 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752177AbdLDWfp (ORCPT ); Mon, 4 Dec 2017 17:35:45 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:37530 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752212AbdLDWef (ORCPT ); Mon, 4 Dec 2017 17:34:35 -0500 Received: by mail-wm0-f67.google.com with SMTP id f140so17090404wmd.2 for ; Mon, 04 Dec 2017 14:34:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HfTRlam4fqg86jiBCeCctYt02EzesAJiXUnAl41xTCA=; b=Ofy/mJj1INqnh+xatl0/BJWW+OtK8caREU4TqITuzI4bjfCLisRpgPGGN651xrrnvR QZ6p5V8zr8KO5ylAxdhAON5bgAYvmXg1mk2t7eAwMpnsdy0LDaHPqk1GDDqbRYCvrwD4 Sr/U8Xv1PwwQnkFEZSZQevTXBw6v24WiYOgRSlWIDMQtSCGwluyeyYcYEDwzICOtoK6J kHic9QxMstsnkU6CbsuhQdDDRJ/77mRLBIE+fxkq6Ug8jxKxbeQ0gemXpHY66qmnOTF2 4IeT+YDDjtzjO14XtoakJ6k6+oWaEmg12qSUP2BQJnqBG9PrEF7CSigPHDVjNVt/hfU0 cKjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HfTRlam4fqg86jiBCeCctYt02EzesAJiXUnAl41xTCA=; b=dUIfdaf2Py7WLJ0dsVkwkqIJr1eSDjWyisYFie/rNoZyc9u0tQXCBBK0DB3hwu+62F VdhSghqsi0rIknwH0luuDjsU199HlhbsAmdffQd2MmG0SR0CTo29O1BAiuB8CI0p/iK2 dLGnBXtg5DIDNL+To2hSKvick94Y2oPVm8oZFxoFAGzFjawmKrjy63PdYs3t9MzOp9U0 N+2Gv/EaLa3UREt+CIkkx/8EFiA8EDd2Wol/MxfBkJ5VZPmJh05eBFTTBx1BxVgDlIq2 k2lzY0NEGcLunhfESFmmVHvfeX6ujuIZ12MO8mXvmmBHwCDSss+HstuvqBG9EtRd2Eek i/Eg== X-Gm-Message-State: AJaThX7Pj2tBCBYSe0LKa1o+GERR/6ANV8v4W7TSYe90I6ntS1RGKyBD 9TLBLsHXa61L3PrZ8pLkfbU5bA== X-Google-Smtp-Source: AGs4zMZ18nYzyqq/vYvnrFoYCRYbUNd6IMaJT7OjiblbGPW7Hy4IbtMk/b7H0oRzek9GSrWkUvxs9w== X-Received: by 10.80.141.141 with SMTP id r13mr32566941edh.122.1512426873742; Mon, 04 Dec 2017 14:34:33 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:33 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 03/10] nfp: dump prolog Date: Mon, 4 Dec 2017 23:34:14 +0100 Message-Id: <20171204223421.19174-4-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann - Use a TLV structure, with the typed chunks aligned to 8-byte sizes. - Dump numeric fields as big-endian. - Prolog contains the dump level. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 88 +++++++++++++++++++++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index 15b6623ef0b2..f05566fd12a2 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -40,6 +40,37 @@ #define NFP_DUMP_SPEC_RTSYM "_abi_dump_spec" +#define ALIGN8(x) ALIGN(x, 8) + +enum nfp_dumpspec_type { + NFP_DUMPSPEC_TYPE_PROLOG = 10000, +}; + +/* The following structs must be carefully aligned so that they can be used to + * interpret the binary dumpspec and populate the dump data in a deterministic + * way. + */ + +/* generic type plus length */ +struct nfp_dump_tl { + __be32 type; + __be32 length; /* chunk length to follow, aligned to 8 bytes */ + char data[0]; +}; + +struct nfp_dump_prolog { + struct nfp_dump_tl tl; + __be32 dump_level; +}; + +/* to track state during debug dump creation TLV traversal */ +struct nfp_dump_state { + u32 requested_level; /* input param */ + u32 dumped_size; /* adds up to size of dumped data */ + u32 buf_size; /* size of buffer pointer to by p */ + void *p; /* current point in dump buffer */ +}; + struct nfp_dumpspec * nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl) { @@ -76,11 +107,64 @@ nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl) s64 nfp_net_dump_calculate_size(struct nfp_pf *pf, struct nfp_dumpspec *spec, u32 flag) { - return -EOPNOTSUPP; + return ALIGN8(sizeof(struct nfp_dump_prolog)); +} + +static int nfp_add_tlv(u32 type, u32 total_tlv_sz, struct nfp_dump_state *dump) +{ + struct nfp_dump_tl *tl = dump->p; + + if (total_tlv_sz > dump->buf_size) + return -ENOSPC; + + if (dump->buf_size - total_tlv_sz < dump->dumped_size) + return -ENOSPC; + + tl->type = cpu_to_be32(type); + tl->length = cpu_to_be32(total_tlv_sz - sizeof(*tl)); + + dump->dumped_size += total_tlv_sz; + dump->p += total_tlv_sz; + + return 0; +} + +static int nfp_dump_populate_prolog(struct nfp_dump_state *dump) +{ + struct nfp_dump_prolog *prolog = dump->p; + u32 total_size; + int err; + + total_size = ALIGN8(sizeof(*prolog)); + + err = nfp_add_tlv(NFP_DUMPSPEC_TYPE_PROLOG, total_size, dump); + if (err) + return err; + + prolog->dump_level = cpu_to_be32(dump->requested_level); + + return 0; } int nfp_net_dump_populate_buffer(struct nfp_pf *pf, struct nfp_dumpspec *spec, struct ethtool_dump *dump_param, void *dest) { - return -EOPNOTSUPP; + struct nfp_dump_state dump; + int err; + + dump.requested_level = dump_param->flag; + dump.dumped_size = 0; + dump.p = dest; + dump.buf_size = dump_param->len; + + err = nfp_dump_populate_prolog(&dump); + if (err) + return err; + + /* Set size of actual dump, to trigger warning if different from + * calculated size. + */ + dump_param->len = dump.dumped_size; + + return 0; } From patchwork Mon Dec 4 22:34:15 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844490 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="fXLGB50n"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKST1L5jz9ryQ for ; Tue, 5 Dec 2017 09:34:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752449AbdLDWeq (ORCPT ); Mon, 4 Dec 2017 17:34:46 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:37532 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752235AbdLDWeg (ORCPT ); Mon, 4 Dec 2017 17:34:36 -0500 Received: by mail-wm0-f67.google.com with SMTP id f140so17090459wmd.2 for ; Mon, 04 Dec 2017 14:34:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/UAtKreLDfJgbUzciredUm8yMTJ1WZ/HFfkS2a/OWLU=; b=fXLGB50ndwiTu49TGE9sWBHodALtJlJ94fWK+wF68DvKZ0DVkhnyCEikjrsXDQ7X/H 2G8YM0tsmu6i/v7R0im1m0FkMfRVtlqrpy4KCs1wMvoXES5wPX/Um4U9Uxc+N5LZbY1a hrP2YsmySRJQD390t8c88RUm+cldj1camCBoXFeiSUKpOR8M+GjQwsGUPLwxKaMtuEEc HtDMIL1DKrfZNtytoVtL048teeqLu5wpMykEvf+mdxzbFuVAmHxioF34ezkNCc1NfETB a+Y1jcaEu/H/h/dIhuCm8Cubyul8Dbox9xJS9I/z4vPAS3HCsLnkcxsbucOR4luLFrtv SwqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/UAtKreLDfJgbUzciredUm8yMTJ1WZ/HFfkS2a/OWLU=; b=DdPHbTSva6aduylBRcmy2+38Dwb5EXUQPgkKchfqK/MqXxD8fYIc62qc8Indx7E/Op XkxcxOSs//RhHtXYX2mbBOehS0H2knxoVLcY8A+cDTMpy266v1z9MML4G5wQFEL/98o+ nlOKMp0qcKtY6XxDPFchZcrNhawcSoVu0UFfiTYWUTsnlzc6Co0sTRbMHEqsh+EH9j5U pMD4a9ynysc8XxJNQIPPJYCa9R+6t3qmZZsbgjk9EQ93trze78WnqKTQPuhlkOKa6aMT iiJIbn8y7fdE44HPBD8Iez4SgEL/ij2b4aIPyUBIDJfiWVPTiyVFLziFre6kh/KioMZr oNBQ== X-Gm-Message-State: AJaThX62Sf/jBKSeQf68BH3IaBPSsQN8g4T5S9B7iJU4fJ1in6H1Tmuk 3p2L1clZgHIPOUPfBTERU3btRP0ohVw= X-Google-Smtp-Source: AGs4zMYQZjzmH3QWtXwzC4EC5AZXUKdzbvaFOCDFfcBiodzUx618R6ufkAWj+xmc6mvrTJoc7NeqEA== X-Received: by 10.80.170.87 with SMTP id p23mr33489246edc.289.1512426874843; Mon, 04 Dec 2017 14:34:34 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:34 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 04/10] nfp: dumpspec TLV traversal Date: Mon, 4 Dec 2017 23:34:15 +0100 Message-Id: <20171204223421.19174-5-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann - Perform dumpspec traversals for calculating size and populating the dump. - Initially, wrap all spec TLVs in dump error TLVs (changed by later patches in the series). Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 154 ++++++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index f05566fd12a2..d52e01ca6621 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -44,6 +44,7 @@ enum nfp_dumpspec_type { NFP_DUMPSPEC_TYPE_PROLOG = 10000, + NFP_DUMPSPEC_TYPE_ERROR = 10001, }; /* The following structs must be carefully aligned so that they can be used to @@ -63,6 +64,19 @@ struct nfp_dump_prolog { __be32 dump_level; }; +struct nfp_dump_error { + struct nfp_dump_tl tl; + __be32 error; + char padding[4]; + char spec[0]; +}; + +/* to track state through debug size calculation TLV traversal */ +struct nfp_level_size { + u32 requested_level; /* input */ + u32 total_size; /* output */ +}; + /* to track state during debug dump creation TLV traversal */ struct nfp_dump_state { u32 requested_level; /* input param */ @@ -71,6 +85,43 @@ struct nfp_dump_state { void *p; /* current point in dump buffer */ }; +typedef int (*nfp_tlv_visit)(struct nfp_pf *pf, struct nfp_dump_tl *tl, + void *param); + +static int +nfp_traverse_tlvs(struct nfp_pf *pf, void *data, u32 data_length, void *param, + nfp_tlv_visit tlv_visit) +{ + long long remaining = data_length; + struct nfp_dump_tl *tl; + u32 total_tlv_size; + void *p = data; + int err; + + while (remaining >= sizeof(*tl)) { + tl = p; + if (!tl->type && !tl->length) + break; + + if (be32_to_cpu(tl->length) > remaining - sizeof(*tl)) + return -EINVAL; + + total_tlv_size = sizeof(*tl) + be32_to_cpu(tl->length); + + /* Spec TLVs should be aligned to 4 bytes. */ + if (total_tlv_size % 4 != 0) + return -EINVAL; + + p += total_tlv_size; + remaining -= total_tlv_size; + err = tlv_visit(pf, tl, param); + if (err) + return err; + } + + return 0; +} + struct nfp_dumpspec * nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl) { @@ -104,10 +155,55 @@ nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl) return dumpspec; } +static int nfp_dump_error_tlv_size(struct nfp_dump_tl *spec) +{ + return ALIGN8(sizeof(struct nfp_dump_error) + sizeof(*spec) + + be32_to_cpu(spec->length)); +} + +static int +nfp_add_tlv_size(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) +{ + u32 *size = param; + + switch (be32_to_cpu(tl->type)) { + default: + *size += nfp_dump_error_tlv_size(tl); + break; + } + + return 0; +} + +static int +nfp_calc_specific_level_size(struct nfp_pf *pf, struct nfp_dump_tl *dump_level, + void *param) +{ + struct nfp_level_size *lev_sz = param; + + if (be32_to_cpu(dump_level->type) != lev_sz->requested_level) + return 0; + + return nfp_traverse_tlvs(pf, dump_level->data, + be32_to_cpu(dump_level->length), + &lev_sz->total_size, nfp_add_tlv_size); +} + s64 nfp_net_dump_calculate_size(struct nfp_pf *pf, struct nfp_dumpspec *spec, u32 flag) { - return ALIGN8(sizeof(struct nfp_dump_prolog)); + struct nfp_level_size lev_sz; + int err; + + lev_sz.requested_level = flag; + lev_sz.total_size = ALIGN8(sizeof(struct nfp_dump_prolog)); + + err = nfp_traverse_tlvs(pf, spec->data, spec->size, &lev_sz, + nfp_calc_specific_level_size); + if (err) + return err; + + return lev_sz.total_size; } static int nfp_add_tlv(u32 type, u32 total_tlv_sz, struct nfp_dump_state *dump) @@ -129,6 +225,57 @@ static int nfp_add_tlv(u32 type, u32 total_tlv_sz, struct nfp_dump_state *dump) return 0; } +static int +nfp_dump_error_tlv(struct nfp_dump_tl *spec, int error, + struct nfp_dump_state *dump) +{ + struct nfp_dump_error *dump_header = dump->p; + u32 total_spec_size, total_size; + int err; + + total_spec_size = sizeof(*spec) + be32_to_cpu(spec->length); + total_size = ALIGN8(sizeof(*dump_header) + total_spec_size); + + err = nfp_add_tlv(NFP_DUMPSPEC_TYPE_ERROR, total_size, dump); + if (err) + return err; + + dump_header->error = cpu_to_be32(error); + memcpy(dump_header->spec, spec, total_spec_size); + + return 0; +} + +static int +nfp_dump_for_tlv(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) +{ + struct nfp_dump_state *dump = param; + int err; + + switch (be32_to_cpu(tl->type)) { + default: + err = nfp_dump_error_tlv(tl, -EOPNOTSUPP, dump); + if (err) + return err; + } + + return 0; +} + +static int +nfp_dump_specific_level(struct nfp_pf *pf, struct nfp_dump_tl *dump_level, + void *param) +{ + struct nfp_dump_state *dump = param; + + if (be32_to_cpu(dump_level->type) != dump->requested_level) + return 0; + + return nfp_traverse_tlvs(pf, dump_level->data, + be32_to_cpu(dump_level->length), dump, + nfp_dump_for_tlv); +} + static int nfp_dump_populate_prolog(struct nfp_dump_state *dump) { struct nfp_dump_prolog *prolog = dump->p; @@ -161,6 +308,11 @@ int nfp_net_dump_populate_buffer(struct nfp_pf *pf, struct nfp_dumpspec *spec, if (err) return err; + err = nfp_traverse_tlvs(pf, spec->data, spec->size, &dump, + nfp_dump_specific_level); + if (err) + return err; + /* Set size of actual dump, to trigger warning if different from * calculated size. */ From patchwork Mon Dec 4 22:34:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844489 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="Z6MNBhQI"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKSN0kdSz9ryQ for ; Tue, 5 Dec 2017 09:34:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752429AbdLDWem (ORCPT ); Mon, 4 Dec 2017 17:34:42 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:41279 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752151AbdLDWeh (ORCPT ); Mon, 4 Dec 2017 17:34:37 -0500 Received: by mail-wm0-f66.google.com with SMTP id g75so8720439wme.0 for ; Mon, 04 Dec 2017 14:34:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ky/cpYWeTwms4MDXWxE+Hkbzp6YLC2gFRxUkR03v55c=; b=Z6MNBhQINHL3mfPFC4RjY7L1K7XhCPYTRHRtspWh1qJzfEsQZzuA7f86uJHzuwBsTp oHPJD8d85RtsZme756ZRMyqr9hg9ypihOfi853wFhW2UR8njvwbcWB5Y6rfeKRtVOJIU cqs6b4/G5l+5qCdW3jc3Ku6wvs8ENHefxT1Nvt2EECln8KwK7CNc6vdDMHhsUIk/jJOx X0o6wl8jD+KYDStA+M9LDBjOYSnCsxKHwAnPfGk66xBHGSccBf8knYn7rB1grVLy5w+m TfUoYTPm+cOoZtIozFbpN/OxG+hECv3N91SjJzak2Ag3cmk/O+QpwdrH3be5lcLi/32w 5NvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ky/cpYWeTwms4MDXWxE+Hkbzp6YLC2gFRxUkR03v55c=; b=VjBNCadYdf3IgDm/THcNFjYk//VhkvCQ4/4qJWzDVlhuGvPPSJHJEPHq4uOoRAEKrg GU9ExfeqFinF/4if3IN4RC/ke8DtgndBjr3FmatChoEmETqoeA4pqSx/5whPJHlF7/5O WjAxJ9aZ5yDTL0FfkVMshwy4mBJEi864Y6ZLt6mv1fdwDMLuG6nr8NOKQfJGITJqLP9S 0sWuVD6RHhEYyoBowKgdjVRpM1X6jjPOPScWVLBmAQTixWzy6oaN7aus8OOjMctDhKfj ljDdozg6EBamXhMxyqf4d3d8psQJkP6nJ0B4nvVHX37LeQvODbATw9mH+Jrid8Ag/FVd FeVw== X-Gm-Message-State: AJaThX4SkRtNJOQIx2nBMOAZSy+isi25LAs2Nc6b9xH88QlRd7VQp6FT fSeoP9YHnxOOQppDR/fHryDhsQdUQLM= X-Google-Smtp-Source: AGs4zMZI0JE8QrU9g7cQnFAOUK6NzZonBKgS4w+3KmLAOwfmg3ykQwH5+pN5+Xy+nAy6isV9JbP7XQ== X-Received: by 10.80.148.10 with SMTP id p10mr33236759eda.250.1512426875882; Mon, 04 Dec 2017 14:34:35 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:35 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 05/10] nfp: dump rtsyms Date: Mon, 4 Dec 2017 23:34:16 +0100 Message-Id: <20171204223421.19174-6-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann - Support rtsym TLVs. - If specified rtsym is not found, dump the spec TLV as -ENOENT error. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 124 +++++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index d52e01ca6621..746e114a8da8 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -43,6 +43,7 @@ #define ALIGN8(x) ALIGN(x, 8) enum nfp_dumpspec_type { + NFP_DUMPSPEC_TYPE_RTSYM = 4, NFP_DUMPSPEC_TYPE_PROLOG = 10000, NFP_DUMPSPEC_TYPE_ERROR = 10001, }; @@ -59,6 +60,34 @@ struct nfp_dump_tl { char data[0]; }; +/* NFP CPP parameters */ +struct nfp_dumpspec_cpp_isl_id { + u8 target; + u8 action; + u8 token; + u8 island; +}; + +struct nfp_dump_common_cpp { + struct nfp_dumpspec_cpp_isl_id cpp_id; + __be32 offset; /* address to start dump */ + __be32 dump_length; /* total bytes to dump, aligned to reg size */ +}; + +struct nfp_dumpspec_rtsym { + struct nfp_dump_tl tl; + char rtsym[0]; +}; + +struct nfp_dump_rtsym { + struct nfp_dump_tl tl; + struct nfp_dump_common_cpp cpp; + __be32 error; /* error code encountered while reading */ + u8 padded_name_length; /* pad so data starts at 8 byte boundary */ + char rtsym[0]; + /* after padded_name_length, there is dump_length data */ +}; + struct nfp_dump_prolog { struct nfp_dump_tl tl; __be32 dump_level; @@ -122,6 +151,12 @@ nfp_traverse_tlvs(struct nfp_pf *pf, void *data, u32 data_length, void *param, return 0; } +static u32 nfp_get_numeric_cpp_id(struct nfp_dumpspec_cpp_isl_id *cpp_id) +{ + return NFP_CPP_ISLAND_ID(cpp_id->target, cpp_id->action, cpp_id->token, + cpp_id->island); +} + struct nfp_dumpspec * nfp_net_dump_load_dumpspec(struct nfp_cpp *cpp, struct nfp_rtsym_table *rtbl) { @@ -162,11 +197,36 @@ static int nfp_dump_error_tlv_size(struct nfp_dump_tl *spec) } static int +nfp_calc_rtsym_dump_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec) +{ + struct nfp_rtsym_table *rtbl = pf->rtbl; + struct nfp_dumpspec_rtsym *spec_rtsym; + const struct nfp_rtsym *sym; + u32 tl_len, key_len; + + spec_rtsym = (struct nfp_dumpspec_rtsym *)spec; + tl_len = be32_to_cpu(spec->length); + key_len = strnlen(spec_rtsym->rtsym, tl_len); + if (key_len == tl_len) + return nfp_dump_error_tlv_size(spec); + + sym = nfp_rtsym_lookup(rtbl, spec_rtsym->rtsym); + if (!sym) + return nfp_dump_error_tlv_size(spec); + + return ALIGN8(offsetof(struct nfp_dump_rtsym, rtsym) + key_len + 1) + + ALIGN8(sym->size); +} + +static int nfp_add_tlv_size(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) { u32 *size = param; switch (be32_to_cpu(tl->type)) { + case NFP_DUMPSPEC_TYPE_RTSYM: + *size += nfp_calc_rtsym_dump_sz(pf, tl); + break; default: *size += nfp_dump_error_tlv_size(tl); break; @@ -247,12 +307,76 @@ nfp_dump_error_tlv(struct nfp_dump_tl *spec, int error, } static int +nfp_dump_single_rtsym(struct nfp_pf *pf, struct nfp_dumpspec_rtsym *spec, + struct nfp_dump_state *dump) +{ + struct nfp_dump_rtsym *dump_header = dump->p; + struct nfp_dumpspec_cpp_isl_id cpp_params; + struct nfp_rtsym_table *rtbl = pf->rtbl; + const struct nfp_rtsym *sym; + u32 header_size, total_size; + u32 tl_len, key_len; + int bytes_read; + u32 cpp_id; + void *dest; + int err; + + tl_len = be32_to_cpu(spec->tl.length); + key_len = strnlen(spec->rtsym, tl_len); + if (key_len == tl_len) + return nfp_dump_error_tlv(&spec->tl, -EINVAL, dump); + + sym = nfp_rtsym_lookup(rtbl, spec->rtsym); + if (!sym) + return nfp_dump_error_tlv(&spec->tl, -ENOENT, dump); + + header_size = + ALIGN8(offsetof(struct nfp_dump_rtsym, rtsym) + key_len + 1); + total_size = header_size + ALIGN8(sym->size); + dest = dump->p + header_size; + + err = nfp_add_tlv(be32_to_cpu(spec->tl.type), total_size, dump); + if (err) + return err; + + dump_header->padded_name_length = + header_size - offsetof(struct nfp_dump_rtsym, rtsym); + memcpy(dump_header->rtsym, spec->rtsym, key_len + 1); + + cpp_params.target = sym->target; + cpp_params.action = NFP_CPP_ACTION_RW; + cpp_params.token = 0; + cpp_params.island = sym->domain; + cpp_id = nfp_get_numeric_cpp_id(&cpp_params); + + dump_header->cpp.cpp_id = cpp_params; + dump_header->cpp.offset = cpu_to_be32(sym->addr); + dump_header->cpp.dump_length = cpu_to_be32(sym->size); + + bytes_read = nfp_cpp_read(pf->cpp, cpp_id, sym->addr, dest, sym->size); + if (bytes_read != sym->size) { + if (bytes_read >= 0) + bytes_read = -EIO; + dump_header->error = cpu_to_be32(bytes_read); + } + + return 0; +} + +static int nfp_dump_for_tlv(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) { + struct nfp_dumpspec_rtsym *spec_rtsym; struct nfp_dump_state *dump = param; int err; switch (be32_to_cpu(tl->type)) { + case NFP_DUMPSPEC_TYPE_RTSYM: + spec_rtsym = (struct nfp_dumpspec_rtsym *)tl; + err = nfp_dump_single_rtsym(pf, spec_rtsym, dump); + if (err) + return err; + break; default: err = nfp_dump_error_tlv(tl, -EOPNOTSUPP, dump); if (err) From patchwork Mon Dec 4 22:34:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844494 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="wI3IZ+wT"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKTL2wSXz9s7g for ; Tue, 5 Dec 2017 09:35:34 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752456AbdLDWet (ORCPT ); Mon, 4 Dec 2017 17:34:49 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:44029 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751827AbdLDWei (ORCPT ); Mon, 4 Dec 2017 17:34:38 -0500 Received: by mail-wm0-f67.google.com with SMTP id n138so8665986wmg.2 for ; Mon, 04 Dec 2017 14:34:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MVPytAShB9ate5qL57+aZiFCBjxlGto7V0ZzWWrRsWM=; b=wI3IZ+wTnwdYWUlG8cvW1cboPIHUxzmSiRZCpTmYiBfsj/fGdI2qxlj7Ud1veR9+ra 7EI9mg2QPJ1pavsNhhlRVX90fk5d3PS1HlGD35EddQkPXbe1lh3HwW4MKEJ0gYsJTzjb PkrR6dghCNlYjfMkbl+vS8PQDlY8QJNwm2Kqt7sc7JsI6UgDiRjljTpE0oQgtG9vNJgY YGXnaVMB/0Kgw52PgupFI0LslFVfyUYp6UvtZJjFHzCxmIbrtyD1OwnOknKMzf14GCO6 AUMOPDARSESb9BF+7/H8MuJXjwwTdrC9DftwL/BfdpLtp9l2BL00DDPB9RyB0HTrq1xp 5pFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MVPytAShB9ate5qL57+aZiFCBjxlGto7V0ZzWWrRsWM=; b=a6L1UFd3DeragOY6+ffwPEjts+2WMOMPqhlBvbpcQAT/Up7xFxo9NFBo6EJMRkPHA9 6ksQ11xc7t4d+rvDN0Ts9fLcjFxfq6NFBm0S+WB9QVxKuB9A3wVrg4RRipctl0wJpEhP DT/SgYpb6MomAmcjNhxpEi6yQ1ihmfFeyc5N9bDJb2M/6Uupbt9JCaXirsFqSHowsvq6 w5NUwC46Y/gWigVcNi7myc1itmpS2i6KIvRrOEQgbgS4f+oLmBfgwCGHHwqHzbGbgYim Zz08IKTFx7t8ojt31QxMxw+HrSWWV67gHz1oVpDHzRhMY4+c32gB6QNkTfKNcRmycJ48 gERw== X-Gm-Message-State: AJaThX4SsfpjFcaOnEtEVI4Pc0dyU7NAwW8xQOdg5vqgkrf5NEaXksTr db19Nw0vMPVafDP3vfCIY2gHkQ== X-Google-Smtp-Source: AGs4zMYp4UVVbkANtmVz5BA42pk2hhywgjWziyFhHVAnCgb549SQsWF/3rF6p38g/gGtPDhgR1IiMw== X-Received: by 10.80.182.5 with SMTP id b5mr32273190ede.227.1512426877077; Mon, 04 Dec 2017 14:34:37 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:36 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 06/10] nfp: dump all hwinfo Date: Mon, 4 Dec 2017 23:34:17 +0100 Message-Id: <20171204223421.19174-7-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann - Dump hwinfo as separate TLV chunk, in a packed format containing zero-separated key and value strings. - This provides additional debug context, if requested by the dumpspec. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 33 ++++++++++++++++++++++ drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h | 2 ++ .../ethernet/netronome/nfp/nfpcore/nfp_hwinfo.c | 10 +++++++ 3 files changed, 45 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index 746e114a8da8..449cf0a3a158 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -44,6 +44,7 @@ enum nfp_dumpspec_type { NFP_DUMPSPEC_TYPE_RTSYM = 4, + NFP_DUMPSPEC_TYPE_HWINFO = 5, NFP_DUMPSPEC_TYPE_PROLOG = 10000, NFP_DUMPSPEC_TYPE_ERROR = 10001, }; @@ -222,11 +223,16 @@ static int nfp_add_tlv_size(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) { u32 *size = param; + u32 hwinfo_size; switch (be32_to_cpu(tl->type)) { case NFP_DUMPSPEC_TYPE_RTSYM: *size += nfp_calc_rtsym_dump_sz(pf, tl); break; + case NFP_DUMPSPEC_TYPE_HWINFO: + hwinfo_size = nfp_hwinfo_get_packed_str_size(pf->hwinfo); + *size += sizeof(struct nfp_dump_tl) + ALIGN8(hwinfo_size); + break; default: *size += nfp_dump_error_tlv_size(tl); break; @@ -307,6 +313,28 @@ nfp_dump_error_tlv(struct nfp_dump_tl *spec, int error, } static int +nfp_dump_hwinfo(struct nfp_pf *pf, struct nfp_dump_tl *spec, + struct nfp_dump_state *dump) +{ + struct nfp_dump_tl *dump_header = dump->p; + u32 hwinfo_size, total_size; + char *hwinfo; + int err; + + hwinfo = nfp_hwinfo_get_packed_strings(pf->hwinfo); + hwinfo_size = nfp_hwinfo_get_packed_str_size(pf->hwinfo); + total_size = sizeof(*dump_header) + ALIGN8(hwinfo_size); + + err = nfp_add_tlv(NFP_DUMPSPEC_TYPE_HWINFO, total_size, dump); + if (err) + return err; + + memcpy(dump_header->data, hwinfo, hwinfo_size); + + return 0; +} + +static int nfp_dump_single_rtsym(struct nfp_pf *pf, struct nfp_dumpspec_rtsym *spec, struct nfp_dump_state *dump) { @@ -377,6 +405,11 @@ nfp_dump_for_tlv(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) if (err) return err; break; + case NFP_DUMPSPEC_TYPE_HWINFO: + err = nfp_dump_hwinfo(pf, tl, dump); + if (err) + return err; + break; default: err = nfp_dump_error_tlv(tl, -EOPNOTSUPP, dump); if (err) diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h index 3ce51f03126f..ced62d112aa2 100644 --- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h +++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp.h @@ -49,6 +49,8 @@ struct nfp_hwinfo; struct nfp_hwinfo *nfp_hwinfo_read(struct nfp_cpp *cpp); const char *nfp_hwinfo_lookup(struct nfp_hwinfo *hwinfo, const char *lookup); +char *nfp_hwinfo_get_packed_strings(struct nfp_hwinfo *hwinfo); +u32 nfp_hwinfo_get_packed_str_size(struct nfp_hwinfo *hwinfo); /* Implemented in nfp_nsp.c, low level functions */ diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_hwinfo.c b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_hwinfo.c index 4f24aff1e772..063a9a6243d6 100644 --- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_hwinfo.c +++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_hwinfo.c @@ -302,3 +302,13 @@ const char *nfp_hwinfo_lookup(struct nfp_hwinfo *hwinfo, const char *lookup) return NULL; } + +char *nfp_hwinfo_get_packed_strings(struct nfp_hwinfo *hwinfo) +{ + return hwinfo->data; +} + +u32 nfp_hwinfo_get_packed_str_size(struct nfp_hwinfo *hwinfo) +{ + return le32_to_cpu(hwinfo->size) - sizeof(u32); +} From patchwork Mon Dec 4 22:34:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844492 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="Or0UYZnc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKSc3VkJz9ryQ for ; Tue, 5 Dec 2017 09:34:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752183AbdLDWey (ORCPT ); Mon, 4 Dec 2017 17:34:54 -0500 Received: from mail-wm0-f68.google.com ([74.125.82.68]:36140 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752229AbdLDWej (ORCPT ); Mon, 4 Dec 2017 17:34:39 -0500 Received: by mail-wm0-f68.google.com with SMTP id b76so17174291wmg.1 for ; Mon, 04 Dec 2017 14:34:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fsGsp4eGCi4FbRvKHrRQujHJGpMG3KeHaxjTvKY0jAE=; b=Or0UYZncU9WUWImrpZYmqiRhnd1uRtgMLt3HBCBvMW/4mKHTrE2LryDBBZsr7DQTae UcH3NFhYVzvlN1PojzhVHba65wfeidinq1jg63U1Ic0BSQJE9nB5JGl+ZOdWtvkuClRh 6keFnKee9YIqT3hSmPVgMlY1qjpwdYI99p+mhFpS/gDmF4Xz+OuAxlpsFhgUfyWVmbg3 a4o+YIYk4WkWM7AuJ2+kCdwlSZE8oaBys9R73gNSCVfmtGE7N0L8fSwqJqB7oBirOjK2 ttxzifcUNWif6qtlF+wec7/WfO7OtzVi3NldlrEYVf/lCbNrggND5UA9tozsBpG5wMtn gykA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fsGsp4eGCi4FbRvKHrRQujHJGpMG3KeHaxjTvKY0jAE=; b=X/Q9aM61kaKI0jF8M0n2pfVv7B1cWCfYKFyjwk9p/Cv63sqZ0tWC8O9IUk0qgYJhqo HIIBHR6ozWR2RUkqgm1Kzobtn5YHjSl0fuMU9gPl8Uq69kHIMbD9IYq2q7jUCpUyJPpx g5BijMdglxtBrkNgMEm7BUxl2Y9rNUcjYevhrGbQ79oKkm1gjYtAmGMul9QG9FKd3KO5 hZVAAU24S4JWtMhmsTWWGJPfPnsFUV6xr5Pq/pUeLBi214rUueE5PRd4jGEi5/qWt5Q3 gUd+ceT1PWr2cCa3fiz7QjKAG1QCEczTEqVZukQjr/KwRQOsne+PBlbb/i4CdU8lDSrx n5Zg== X-Gm-Message-State: AJaThX776ozW9CI5vabcmSpkQxmioZalmXMlVcZJZkH2sf+ZR1sqLsoj tgqnEsYnge1q0uOjCF4VU+DKvQ== X-Google-Smtp-Source: AGs4zMa5Av69OPw4Zkou5hYCQVGi4fWQBFv4wscuDEYUzGc/6jzC2nTqhjf28fWQ8FTDJ7MZVepw1Q== X-Received: by 10.80.140.237 with SMTP id r42mr32052023edr.299.1512426878286; Mon, 04 Dec 2017 14:34:38 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:37 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 07/10] nfp: dump single hwinfo field by key Date: Mon, 4 Dec 2017 23:34:18 +0100 Message-Id: <20171204223421.19174-8-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann - Add spec TLV for hwinfo field, containing key string as data. - Add dump TLV for hwinfo field, with data being key and value as packed zero-terminated strings. - If specified hwinfo field is not found, dump the spec TLV as -ENOENT error. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index 449cf0a3a158..833036715ca0 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -45,6 +45,7 @@ enum nfp_dumpspec_type { NFP_DUMPSPEC_TYPE_RTSYM = 4, NFP_DUMPSPEC_TYPE_HWINFO = 5, + NFP_DUMPSPEC_TYPE_HWINFO_FIELD = 7, NFP_DUMPSPEC_TYPE_PROLOG = 10000, NFP_DUMPSPEC_TYPE_ERROR = 10001, }; @@ -197,6 +198,23 @@ static int nfp_dump_error_tlv_size(struct nfp_dump_tl *spec) be32_to_cpu(spec->length)); } +static int nfp_calc_hwinfo_field_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec) +{ + u32 tl_len, key_len; + const char *value; + + tl_len = be32_to_cpu(spec->length); + key_len = strnlen(spec->data, tl_len); + if (key_len == tl_len) + return nfp_dump_error_tlv_size(spec); + + value = nfp_hwinfo_lookup(pf->hwinfo, spec->data); + if (!value) + return nfp_dump_error_tlv_size(spec); + + return sizeof(struct nfp_dump_tl) + ALIGN8(key_len + strlen(value) + 2); +} + static int nfp_calc_rtsym_dump_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec) { @@ -233,6 +251,9 @@ nfp_add_tlv_size(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) hwinfo_size = nfp_hwinfo_get_packed_str_size(pf->hwinfo); *size += sizeof(struct nfp_dump_tl) + ALIGN8(hwinfo_size); break; + case NFP_DUMPSPEC_TYPE_HWINFO_FIELD: + *size += nfp_calc_hwinfo_field_sz(pf, tl); + break; default: *size += nfp_dump_error_tlv_size(tl); break; @@ -334,6 +355,37 @@ nfp_dump_hwinfo(struct nfp_pf *pf, struct nfp_dump_tl *spec, return 0; } +static int nfp_dump_hwinfo_field(struct nfp_pf *pf, struct nfp_dump_tl *spec, + struct nfp_dump_state *dump) +{ + struct nfp_dump_tl *dump_header = dump->p; + u32 tl_len, key_len, val_len; + const char *key, *value; + u32 total_size; + int err; + + tl_len = be32_to_cpu(spec->length); + key_len = strnlen(spec->data, tl_len); + if (key_len == tl_len) + return nfp_dump_error_tlv(spec, -EINVAL, dump); + + key = spec->data; + value = nfp_hwinfo_lookup(pf->hwinfo, key); + if (!value) + return nfp_dump_error_tlv(spec, -ENOENT, dump); + + val_len = strlen(value); + total_size = sizeof(*dump_header) + ALIGN8(key_len + val_len + 2); + err = nfp_add_tlv(NFP_DUMPSPEC_TYPE_HWINFO_FIELD, total_size, dump); + if (err) + return err; + + memcpy(dump_header->data, key, key_len + 1); + memcpy(dump_header->data + key_len + 1, value, val_len + 1); + + return 0; +} + static int nfp_dump_single_rtsym(struct nfp_pf *pf, struct nfp_dumpspec_rtsym *spec, struct nfp_dump_state *dump) @@ -410,6 +462,11 @@ nfp_dump_for_tlv(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) if (err) return err; break; + case NFP_DUMPSPEC_TYPE_HWINFO_FIELD: + err = nfp_dump_hwinfo_field(pf, tl, dump); + if (err) + return err; + break; default: err = nfp_dump_error_tlv(tl, -EOPNOTSUPP, dump); if (err) From patchwork Mon Dec 4 22:34:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844491 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="N8hLVrA+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKSX3Glbz9s7g for ; Tue, 5 Dec 2017 09:34:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752468AbdLDWev (ORCPT ); Mon, 4 Dec 2017 17:34:51 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34662 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752241AbdLDWek (ORCPT ); Mon, 4 Dec 2017 17:34:40 -0500 Received: by mail-wm0-f66.google.com with SMTP id y82so16510393wmg.1 for ; Mon, 04 Dec 2017 14:34:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=D5xiEALAP9TjYsdOj1GV9nAAC/JdQ7p2IZUy9r5UVNQ=; b=N8hLVrA+OI3dAnSUEWnbMhStCtkPDz0G/e+NBAlfKQq18WJzzJMgiqNCnJ29Eg8QmI JuGq87zViF1e6Ee8UhM/EIOKJrPZrYu4Rlo9zXj3aIx0byhpo0gmr7wcLlWYAhdkTovJ jjt10sYa+28UJV+7vwZnj4h2QIanVllS60CcCgzX5HZFZkd0+Um4gnpDD3jgJBKV19wi t3bX23XijkCRkq7SdRctkIWBVuqjiqKiI0VPaaZGnXMBOk1mo8X6EeTCJoVDZJHZCCkJ dWHVto3zUZrMQ+3JsZbBrr6/+wtex1di4cCu+Tz3VOjvUdb6JWtVhPaeLv+PYL9r0JnY NY+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=D5xiEALAP9TjYsdOj1GV9nAAC/JdQ7p2IZUy9r5UVNQ=; b=fpuuTk/bOmckZABYydp/7sYzOnqzJ+HatEL+H9sBSftJL/BP8aesMIuP54N2kCoaQF ujS8u895c/Sj16ylLww1OudeX9mY3W9jC+xiTL0SztuOqcxyySP6I0MCOYeBhqFSPjQ3 SVaUxYTIa8/1cMZYkbweeet8s7fP4wIOoAfT+Z3QHp4L62P2DY0cNB2WSuX3AaSO7doQ yPnOj1VXnRqylR1xngGaHD5YxFBv2e4RdXWlyTPlPQQUSbbiW2X1FrtD6PyZZc1eFO9h jyjPdNvgHNg+lfumDB4umR07Kasl9DkuihOp1QKS2rCxau9WcZNyr/8oT7QrFhPBx4Sq 1nTQ== X-Gm-Message-State: AJaThX6VsxPN21c2ZvpJFZ6UMmQBt64qx5HEMD/T9Ft+gO6enWZyM9Ss zUC0Za2CU42xIbIhxwBXnPzYuQ== X-Google-Smtp-Source: AGs4zMY+pz1pzzOvi9BdmqlXXGKHgV8pR2eWLzfvGkJcnGzs2J9exeHHF2wuqZ5L6XcTywLjdokNlw== X-Received: by 10.80.139.180 with SMTP id m49mr33737295edm.36.1512426879313; Mon, 04 Dec 2017 14:34:39 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:38 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 08/10] nfp: dump firmware name Date: Mon, 4 Dec 2017 23:34:19 +0100 Message-Id: <20171204223421.19174-9-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann Dump FW name as TLV, based on dump specification. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index 833036715ca0..1e57dab60abf 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -45,6 +45,7 @@ enum nfp_dumpspec_type { NFP_DUMPSPEC_TYPE_RTSYM = 4, NFP_DUMPSPEC_TYPE_HWINFO = 5, + NFP_DUMPSPEC_TYPE_FWNAME = 6, NFP_DUMPSPEC_TYPE_HWINFO_FIELD = 7, NFP_DUMPSPEC_TYPE_PROLOG = 10000, NFP_DUMPSPEC_TYPE_ERROR = 10001, @@ -198,6 +199,13 @@ static int nfp_dump_error_tlv_size(struct nfp_dump_tl *spec) be32_to_cpu(spec->length)); } +static int nfp_calc_fwname_tlv_size(struct nfp_pf *pf) +{ + u32 fwname_len = strlen(nfp_mip_name(pf->mip)); + + return sizeof(struct nfp_dump_tl) + ALIGN8(fwname_len + 1); +} + static int nfp_calc_hwinfo_field_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec) { u32 tl_len, key_len; @@ -244,6 +252,9 @@ nfp_add_tlv_size(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) u32 hwinfo_size; switch (be32_to_cpu(tl->type)) { + case NFP_DUMPSPEC_TYPE_FWNAME: + *size += nfp_calc_fwname_tlv_size(pf); + break; case NFP_DUMPSPEC_TYPE_RTSYM: *size += nfp_calc_rtsym_dump_sz(pf, tl); break; @@ -333,6 +344,26 @@ nfp_dump_error_tlv(struct nfp_dump_tl *spec, int error, return 0; } +static int nfp_dump_fwname(struct nfp_pf *pf, struct nfp_dump_state *dump) +{ + struct nfp_dump_tl *dump_header = dump->p; + u32 fwname_len, total_size; + const char *fwname; + int err; + + fwname = nfp_mip_name(pf->mip); + fwname_len = strlen(fwname); + total_size = sizeof(*dump_header) + ALIGN8(fwname_len + 1); + + err = nfp_add_tlv(NFP_DUMPSPEC_TYPE_FWNAME, total_size, dump); + if (err) + return err; + + memcpy(dump_header->data, fwname, fwname_len); + + return 0; +} + static int nfp_dump_hwinfo(struct nfp_pf *pf, struct nfp_dump_tl *spec, struct nfp_dump_state *dump) @@ -451,6 +482,11 @@ nfp_dump_for_tlv(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) int err; switch (be32_to_cpu(tl->type)) { + case NFP_DUMPSPEC_TYPE_FWNAME: + err = nfp_dump_fwname(pf, dump); + if (err) + return err; + break; case NFP_DUMPSPEC_TYPE_RTSYM: spec_rtsym = (struct nfp_dumpspec_rtsym *)tl; err = nfp_dump_single_rtsym(pf, spec_rtsym, dump); From patchwork Mon Dec 4 22:34:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844495 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="WMfN6WCd"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKTY3bPZz9ryQ for ; Tue, 5 Dec 2017 09:35:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752275AbdLDWfn (ORCPT ); Mon, 4 Dec 2017 17:35:43 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:39024 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752162AbdLDWel (ORCPT ); Mon, 4 Dec 2017 17:34:41 -0500 Received: by mail-wm0-f66.google.com with SMTP id i11so17075448wmf.4 for ; Mon, 04 Dec 2017 14:34:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=pJwwCUoEaXixzLvCOsQEheuJvHjRFAsRXiqPp+vg5/A=; b=WMfN6WCddt0azHUN4SMT3wOCIYs+MWkrZJKuLhbJpBpe/uwosQS5yMkh87qjg9fcss Smj00AeAITmdoSbHSLWC1AP4sjGL7XvM/Tvml0GcFTv1GJHdobfTMqaNbtM4vTo74v8Z pD+rlC8jQmR23gmk8+jdr+lSdR9aRvL/zxMcJ7t+i4f3pXnQo9h7gA6d/yqx3Z5TdLPZ miU6tGdDy38uDLtAeLUKrhQjNgR9wILFzVn9If5qrlpxEaRxwlXRwsfZaYMXITbA/kWP lfEQez0gbhHgYwyvmbxFpmvVFVbaapAxFgxV+Bf0GX8rnNppY+n5s5CCeOx2nT97UlXS 9sRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=pJwwCUoEaXixzLvCOsQEheuJvHjRFAsRXiqPp+vg5/A=; b=m7VEzCbBHjqmBN162vGL1/LItIYWY2O0Jfvh0qmPpqQGEE0/MmMYo+DG4JRJl9qYDf KAmvSfLyW/bRH+CE0XHvwyNI9YCrvAGd3iKZtpmriJHeZLYOsxGVVpvpAg1VoOhpB9WX OVMA597tnK+dtjIp8Ua8HgyZNcu9wrC0c7T9y00PZGFDnpS9B3y91fpTP8FBHnK+Vgj1 EOtOpXs+WgVV52/8IpmCrdwfnoEC29YzmrQleXezP/N3r8N/iHyWRzuc+2Jd6n5b1rqv i2yEGZQNx/zzxnYrb+Vm+ckGSGpafcOkz7jU+7amfGJVa/WoDRDe6fYpyfOtdJefLF9n BI8Q== X-Gm-Message-State: AJaThX5ecPdwl6MssPb4CD8dbVfOuP+WwQlQP+0ALsiOtxn51WENHYVV qigNvKuQTraZj5Ce2F2PAv/DpA== X-Google-Smtp-Source: AGs4zMb60kkf0yIO/oV0ShWCE6waBNeK6bWE+XQH8eDuUE0fVd6xiRWzzcbTOXdvgIhQIIhL4NoLww== X-Received: by 10.80.164.241 with SMTP id x46mr32671801edb.247.1512426880457; Mon, 04 Dec 2017 14:34:40 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:39 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 09/10] nfp: dump CPP, XPB and direct ME CSRs Date: Mon, 4 Dec 2017 23:34:20 +0100 Message-Id: <20171204223421.19174-10-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann - The spec defines CSR address ranges for these types. - Dump each TLV chunk in the spec as a chunk that includes the spec and the data over the defined address range. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index 1e57dab60abf..b23e2e0570af 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -43,6 +43,9 @@ #define ALIGN8(x) ALIGN(x, 8) enum nfp_dumpspec_type { + NFP_DUMPSPEC_TYPE_CPP_CSR = 0, + NFP_DUMPSPEC_TYPE_XPB_CSR = 1, + NFP_DUMPSPEC_TYPE_ME_CSR = 2, NFP_DUMPSPEC_TYPE_RTSYM = 4, NFP_DUMPSPEC_TYPE_HWINFO = 5, NFP_DUMPSPEC_TYPE_FWNAME = 6, @@ -77,11 +80,27 @@ struct nfp_dump_common_cpp { __be32 dump_length; /* total bytes to dump, aligned to reg size */ }; +/* CSR dumpables */ +struct nfp_dumpspec_csr { + struct nfp_dump_tl tl; + struct nfp_dump_common_cpp cpp; + __be32 register_width; /* in bits */ +}; + struct nfp_dumpspec_rtsym { struct nfp_dump_tl tl; char rtsym[0]; }; +/* header for register dumpable */ +struct nfp_dump_csr { + struct nfp_dump_tl tl; + struct nfp_dump_common_cpp cpp; + __be32 register_width; /* in bits */ + __be32 error; /* error code encountered while reading */ + __be32 error_offset; /* offset being read when error occurred */ +}; + struct nfp_dump_rtsym { struct nfp_dump_tl tl; struct nfp_dump_common_cpp cpp; @@ -223,6 +242,20 @@ static int nfp_calc_hwinfo_field_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec) return sizeof(struct nfp_dump_tl) + ALIGN8(key_len + strlen(value) + 2); } +static bool nfp_csr_spec_valid(struct nfp_dumpspec_csr *spec_csr) +{ + u32 required_read_sz = sizeof(*spec_csr) - sizeof(spec_csr->tl); + u32 available_sz = be32_to_cpu(spec_csr->tl.length); + u32 reg_width; + + if (available_sz < required_read_sz) + return false; + + reg_width = be32_to_cpu(spec_csr->register_width); + + return reg_width == 32 || reg_width == 64; +} + static int nfp_calc_rtsym_dump_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec) { @@ -248,6 +281,7 @@ nfp_calc_rtsym_dump_sz(struct nfp_pf *pf, struct nfp_dump_tl *spec) static int nfp_add_tlv_size(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) { + struct nfp_dumpspec_csr *spec_csr; u32 *size = param; u32 hwinfo_size; @@ -255,6 +289,16 @@ nfp_add_tlv_size(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) case NFP_DUMPSPEC_TYPE_FWNAME: *size += nfp_calc_fwname_tlv_size(pf); break; + case NFP_DUMPSPEC_TYPE_CPP_CSR: + case NFP_DUMPSPEC_TYPE_XPB_CSR: + case NFP_DUMPSPEC_TYPE_ME_CSR: + spec_csr = (struct nfp_dumpspec_csr *)tl; + if (!nfp_csr_spec_valid(spec_csr)) + *size += nfp_dump_error_tlv_size(tl); + else + *size += ALIGN8(sizeof(struct nfp_dump_csr)) + + ALIGN8(be32_to_cpu(spec_csr->cpp.dump_length)); + break; case NFP_DUMPSPEC_TYPE_RTSYM: *size += nfp_calc_rtsym_dump_sz(pf, tl); break; @@ -418,6 +462,55 @@ static int nfp_dump_hwinfo_field(struct nfp_pf *pf, struct nfp_dump_tl *spec, } static int +nfp_dump_csr_range(struct nfp_pf *pf, struct nfp_dumpspec_csr *spec_csr, + struct nfp_dump_state *dump) +{ + struct nfp_dump_csr *dump_header = dump->p; + u32 reg_sz, header_size, total_size; + u32 cpp_rd_addr, max_rd_addr; + int bytes_read; + void *dest; + u32 cpp_id; + int err; + + if (!nfp_csr_spec_valid(spec_csr)) + return nfp_dump_error_tlv(&spec_csr->tl, -EINVAL, dump); + + reg_sz = be32_to_cpu(spec_csr->register_width) / BITS_PER_BYTE; + header_size = ALIGN8(sizeof(*dump_header)); + total_size = header_size + + ALIGN8(be32_to_cpu(spec_csr->cpp.dump_length)); + dest = dump->p + header_size; + + err = nfp_add_tlv(be32_to_cpu(spec_csr->tl.type), total_size, dump); + if (err) + return err; + + dump_header->cpp = spec_csr->cpp; + dump_header->register_width = spec_csr->register_width; + + cpp_id = nfp_get_numeric_cpp_id(&spec_csr->cpp.cpp_id); + cpp_rd_addr = be32_to_cpu(spec_csr->cpp.offset); + max_rd_addr = cpp_rd_addr + be32_to_cpu(spec_csr->cpp.dump_length); + + while (cpp_rd_addr < max_rd_addr) { + bytes_read = nfp_cpp_read(pf->cpp, cpp_id, cpp_rd_addr, dest, + reg_sz); + if (bytes_read != reg_sz) { + if (bytes_read >= 0) + bytes_read = -EIO; + dump_header->error = cpu_to_be32(bytes_read); + dump_header->error_offset = cpu_to_be32(cpp_rd_addr); + break; + } + cpp_rd_addr += reg_sz; + dest += reg_sz; + } + + return 0; +} + +static int nfp_dump_single_rtsym(struct nfp_pf *pf, struct nfp_dumpspec_rtsym *spec, struct nfp_dump_state *dump) { @@ -479,6 +572,7 @@ nfp_dump_for_tlv(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) { struct nfp_dumpspec_rtsym *spec_rtsym; struct nfp_dump_state *dump = param; + struct nfp_dumpspec_csr *spec_csr; int err; switch (be32_to_cpu(tl->type)) { @@ -487,6 +581,14 @@ nfp_dump_for_tlv(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) if (err) return err; break; + case NFP_DUMPSPEC_TYPE_CPP_CSR: + case NFP_DUMPSPEC_TYPE_XPB_CSR: + case NFP_DUMPSPEC_TYPE_ME_CSR: + spec_csr = (struct nfp_dumpspec_csr *)tl; + err = nfp_dump_csr_range(pf, spec_csr, dump); + if (err) + return err; + break; case NFP_DUMPSPEC_TYPE_RTSYM: spec_rtsym = (struct nfp_dumpspec_rtsym *)tl; err = nfp_dump_single_rtsym(pf, spec_rtsym, dump); From patchwork Mon Dec 4 22:34:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 844493 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="pSPqXI5b"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yrKTB5gh4z9s7g for ; Tue, 5 Dec 2017 09:35:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752471AbdLDWe4 (ORCPT ); Mon, 4 Dec 2017 17:34:56 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:34666 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752423AbdLDWem (ORCPT ); Mon, 4 Dec 2017 17:34:42 -0500 Received: by mail-wm0-f67.google.com with SMTP id y82so16510497wmg.1 for ; Mon, 04 Dec 2017 14:34:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=p5ahbXGvh/BfRkyKDJoFxoh20VzCTtTwaI9zdzlKCu4=; b=pSPqXI5bGfG59H55ytrQLKfPQ4AuYhohM9b3rDGA60KgZgbSiZF3oG7U06b/gP3dk1 9rk5hRN2eVx0YRTxCsTLSHb+TWi6L+VZKoiXgdCmZBNU707802hJaYX4i+I+RBgq2eH3 aja0UmeOf6iqo3UiPlyV/mkUpBtjdMzhlwhicC0H9NKwo41MIyZdID2sobIYRaaaOmkj PYzc6WjUwS+yFxH6VGPQN//XUVJgRdCOenzEbYKtdTE5+nK8uDRyH9+eChPJ4RMN+0qQ Y+t1GmnLqoUtjZXU8Ria5PejLaUR0NeLhV6oryPfs9mmfqXtnfjYEuniDLGHnIkhymlo dwSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=p5ahbXGvh/BfRkyKDJoFxoh20VzCTtTwaI9zdzlKCu4=; b=kzD4luFgkaqBPaBPugSSnTrtn8/XMG0ScGFsQNLWAMKTYfX1xjCkE0m+xaBRoGN8WH NE0Dc6BB+ZFBl4TdhU+mvjI8i13VlCbxdgwGQJl2esC5RvnkvhU/drQXqzho4UbO1Wby I40nGpwHXlZOuRFl4/k4G/vCETnEbp6CLiGYKSaZS/IFkmBWeVW8Nw1OvK4zV/0e8eum /AtB5ffA/jBpE6ividuR0oMXH973IGZwacHUT2IAjfsxqJDZvzwsx7HhTBHi2oEzcu4n WFBAnmlDptcSYDKMxBpyzkMlnT1htMUTJXyCCo5lok27DCJARrzUzmFanQjsIYaHn3iW IekQ== X-Gm-Message-State: AJaThX5YR3dhgiTHSPFXPVQ1iN32/OJk5UhA0JNFhii/mZA4gak04wkX LFlqmNZA3So2DA1YbkqgXGSkBQ== X-Google-Smtp-Source: AGs4zMZvJFSgIe1fUtB5Oc+NwM9jHU/dP5e2oZJpqvj0LaN3YeB/+Qw9oBPb3cwo4zGeO6Hu8HODzg== X-Received: by 10.80.202.200 with SMTP id f8mr32062409edi.54.1512426881422; Mon, 04 Dec 2017 14:34:41 -0800 (PST) Received: from penelope.horms.nl (penelope.horms.nl. [2001:470:7eb3:403:201:8eff:fe22:8fea]) by smtp.gmail.com with ESMTPSA id x7sm7851991edi.6.2017.12.04.14.34.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 04 Dec 2017 14:34:40 -0800 (PST) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Carl Heymann , Simon Horman Subject: [PATCH net-next 10/10] nfp: dump indirect ME CSRs Date: Mon, 4 Dec 2017 23:34:21 +0100 Message-Id: <20171204223421.19174-11-simon.horman@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171204223421.19174-1-simon.horman@netronome.com> References: <20171204223421.19174-1-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Carl Heymann - The spec defines CSR address ranges for indirect ME CSRs. For Each TLV chunk in the spec, dump a chunk that includes the spec and the data over the defined address range. - Each indirect CSR has 8 contexts. To read one context, first write the context to a specific derived address, read it back, and then read the register value. - For each address, read and dump all 8 contexts in this manner. Signed-off-by: Carl Heymann Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- drivers/net/ethernet/netronome/nfp/nfp_asm.h | 10 ++ .../net/ethernet/netronome/nfp/nfp_net_debugdump.c | 113 +++++++++++++++++++++ 2 files changed, 123 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_asm.h b/drivers/net/ethernet/netronome/nfp/nfp_asm.h index 98803f9f40b6..3387e6926eb0 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_asm.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_asm.h @@ -262,6 +262,7 @@ enum lcsr_wr_src { #define OP_CARB_BASE 0x0e000000000ULL #define OP_CARB_OR 0x00000010000ULL +#define NFP_CSR_CTX_PTR 0x20 #define NFP_CSR_ACT_LM_ADDR0 0x64 #define NFP_CSR_ACT_LM_ADDR1 0x6c #define NFP_CSR_ACT_LM_ADDR2 0x94 @@ -382,4 +383,13 @@ int swreg_to_restricted(swreg dst, swreg lreg, swreg rreg, int nfp_ustore_check_valid_no_ecc(u64 insn); u64 nfp_ustore_calc_ecc_insn(u64 insn); +#define NFP_IND_ME_REFL_WR_SIG_INIT 3 +#define NFP_IND_ME_CTX_PTR_BASE_MASK GENMASK(9, 0) +#define NFP_IND_NUM_CONTEXTS 8 + +static inline u32 nfp_get_ind_csr_ctx_ptr_offs(u32 read_offset) +{ + return (read_offset & ~NFP_IND_ME_CTX_PTR_BASE_MASK) | NFP_CSR_CTX_PTR; +} + #endif diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c index b23e2e0570af..cb74602f0907 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_debugdump.c @@ -34,6 +34,7 @@ #include #include +#include "nfp_asm.h" #include "nfp_main.h" #include "nfpcore/nfp.h" #include "nfpcore/nfp_nffw.h" @@ -46,6 +47,7 @@ enum nfp_dumpspec_type { NFP_DUMPSPEC_TYPE_CPP_CSR = 0, NFP_DUMPSPEC_TYPE_XPB_CSR = 1, NFP_DUMPSPEC_TYPE_ME_CSR = 2, + NFP_DUMPSPEC_TYPE_INDIRECT_ME_CSR = 3, NFP_DUMPSPEC_TYPE_RTSYM = 4, NFP_DUMPSPEC_TYPE_HWINFO = 5, NFP_DUMPSPEC_TYPE_FWNAME = 6, @@ -299,6 +301,15 @@ nfp_add_tlv_size(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) *size += ALIGN8(sizeof(struct nfp_dump_csr)) + ALIGN8(be32_to_cpu(spec_csr->cpp.dump_length)); break; + case NFP_DUMPSPEC_TYPE_INDIRECT_ME_CSR: + spec_csr = (struct nfp_dumpspec_csr *)tl; + if (!nfp_csr_spec_valid(spec_csr)) + *size += nfp_dump_error_tlv_size(tl); + else + *size += ALIGN8(sizeof(struct nfp_dump_csr)) + + ALIGN8(be32_to_cpu(spec_csr->cpp.dump_length) * + NFP_IND_NUM_CONTEXTS); + break; case NFP_DUMPSPEC_TYPE_RTSYM: *size += nfp_calc_rtsym_dump_sz(pf, tl); break; @@ -510,6 +521,102 @@ nfp_dump_csr_range(struct nfp_pf *pf, struct nfp_dumpspec_csr *spec_csr, return 0; } +/* Write context to CSRCtxPtr, then read from it. Then the value can be read + * from IndCtxStatus. + */ +static int +nfp_read_indirect_csr(struct nfp_cpp *cpp, + struct nfp_dumpspec_cpp_isl_id cpp_params, u32 offset, + u32 reg_sz, u32 context, void *dest) +{ + u32 csr_ctx_ptr_offs; + u32 cpp_id; + int result; + + csr_ctx_ptr_offs = nfp_get_ind_csr_ctx_ptr_offs(offset); + cpp_id = NFP_CPP_ISLAND_ID(cpp_params.target, + NFP_IND_ME_REFL_WR_SIG_INIT, + cpp_params.token, cpp_params.island); + result = nfp_cpp_writel(cpp, cpp_id, csr_ctx_ptr_offs, context); + if (result != sizeof(context)) + return result < 0 ? result : -EIO; + + cpp_id = nfp_get_numeric_cpp_id(&cpp_params); + result = nfp_cpp_read(cpp, cpp_id, csr_ctx_ptr_offs, dest, reg_sz); + if (result != reg_sz) + return result < 0 ? result : -EIO; + + result = nfp_cpp_read(cpp, cpp_id, offset, dest, reg_sz); + if (result != reg_sz) + return result < 0 ? result : -EIO; + + return 0; +} + +static int +nfp_read_all_indirect_csr_ctx(struct nfp_cpp *cpp, + struct nfp_dumpspec_csr *spec_csr, u32 address, + u32 reg_sz, void *dest) +{ + u32 ctx; + int err; + + for (ctx = 0; ctx < NFP_IND_NUM_CONTEXTS; ctx++) { + err = nfp_read_indirect_csr(cpp, spec_csr->cpp.cpp_id, address, + reg_sz, ctx, dest + ctx * reg_sz); + if (err) + return err; + } + + return 0; +} + +static int +nfp_dump_indirect_csr_range(struct nfp_pf *pf, + struct nfp_dumpspec_csr *spec_csr, + struct nfp_dump_state *dump) +{ + struct nfp_dump_csr *dump_header = dump->p; + u32 reg_sz, header_size, total_size; + u32 cpp_rd_addr, max_rd_addr; + u32 reg_data_length; + void *dest; + int err; + + if (!nfp_csr_spec_valid(spec_csr)) + return nfp_dump_error_tlv(&spec_csr->tl, -EINVAL, dump); + + reg_sz = be32_to_cpu(spec_csr->register_width) / BITS_PER_BYTE; + header_size = ALIGN8(sizeof(*dump_header)); + reg_data_length = be32_to_cpu(spec_csr->cpp.dump_length) * + NFP_IND_NUM_CONTEXTS; + total_size = header_size + ALIGN8(reg_data_length); + dest = dump->p + header_size; + + err = nfp_add_tlv(be32_to_cpu(spec_csr->tl.type), total_size, dump); + if (err) + return err; + + dump_header->cpp = spec_csr->cpp; + dump_header->register_width = spec_csr->register_width; + + cpp_rd_addr = be32_to_cpu(spec_csr->cpp.offset); + max_rd_addr = cpp_rd_addr + be32_to_cpu(spec_csr->cpp.dump_length); + while (cpp_rd_addr < max_rd_addr) { + err = nfp_read_all_indirect_csr_ctx(pf->cpp, spec_csr, + cpp_rd_addr, reg_sz, dest); + if (err) { + dump_header->error = cpu_to_be32(err); + dump_header->error_offset = cpu_to_be32(cpp_rd_addr); + break; + } + cpp_rd_addr += reg_sz; + dest += reg_sz * NFP_IND_NUM_CONTEXTS; + } + + return 0; +} + static int nfp_dump_single_rtsym(struct nfp_pf *pf, struct nfp_dumpspec_rtsym *spec, struct nfp_dump_state *dump) @@ -589,6 +696,12 @@ nfp_dump_for_tlv(struct nfp_pf *pf, struct nfp_dump_tl *tl, void *param) if (err) return err; break; + case NFP_DUMPSPEC_TYPE_INDIRECT_ME_CSR: + spec_csr = (struct nfp_dumpspec_csr *)tl; + err = nfp_dump_indirect_csr_range(pf, spec_csr, dump); + if (err) + return err; + break; case NFP_DUMPSPEC_TYPE_RTSYM: spec_rtsym = (struct nfp_dumpspec_rtsym *)tl; err = nfp_dump_single_rtsym(pf, spec_rtsym, dump);