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);