From patchwork Wed Jan 16 05:23:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1025648 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="U4wXCnqO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fbHY3mX5z9sD9 for ; Wed, 16 Jan 2019 16:24:41 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726362AbfAPFYh (ORCPT ); Wed, 16 Jan 2019 00:24:37 -0500 Received: from mail-qk1-f193.google.com ([209.85.222.193]:34031 "EHLO mail-qk1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726166AbfAPFYh (ORCPT ); Wed, 16 Jan 2019 00:24:37 -0500 Received: by mail-qk1-f193.google.com with SMTP id q8so3085087qke.1 for ; Tue, 15 Jan 2019 21:24: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 :mime-version:content-transfer-encoding; bh=4atIWB0BOXLk+6zUKQdhNUIF8Jp7Ydvw5h6PBsKKHh4=; b=U4wXCnqOfo6bDCn2G9SHcmM47XnY4TX8sqCXSOKcr5wNkCBQHfyL4dVokp1cAvdtMR O2rj6JAy7wgjyUN9qqlnhIPvXdDGf7erCuNSPMdVHLg+lqXIOFump5toTTpNstH8U6R7 VMvUxsNFgsDa4t6noldmGTdva9mItDDXAjuYNGsCmvJMlkkAfq8dehZmFDVKioSZoOFs rs/TdIeWe74TjIn6miJhPDtIttbuOi84xYCZkSzKAVY3PXL4JmnARk3/KBJ8zA0ZWLbU RqXcf3KPsz+xfJJQ9sTfzvkWb9zTrzSWRDnAzdAqz8hTzG2VUMqM/InOoqYCG8A++iCn Scng== 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:mime-version:content-transfer-encoding; bh=4atIWB0BOXLk+6zUKQdhNUIF8Jp7Ydvw5h6PBsKKHh4=; b=cG+awJE4h6M/cDoCKdSKOifEFgbJ9aw52xIKnbOoniEG9hIqg4lrH9ZOQyHzgM+u2M tYag5lHuBc3vxLdu9rWUS+CuP1PPfmVFbEmjcOTe31+XKgB7AcRYjO0mBeMYJ0mrHtko GjVAmdPMYS9ZGiqQO7x5Lpty2oMbILOsbhJo6kO853fwijq4yvoL3YkZJfhybAFovx3/ hXWgeOUkzXtoszF80ckD+DqA1WEcAOW4eBFO4KuflUabcY6h1GLUFB4FBH+N0pk7Ku+P WFhtQkZ97qfO0Hvnl5eNUprv2JPmZS1flrNRlPv5y13TFRi4SpsdrJBmGZaesFF7APy3 cYUw== X-Gm-Message-State: AJcUukcPxkA0Otf+WHJ8EpHolm8x0eL+nFIYCdX2PLVvJT+aKbKtaSZx dozG7S9dinIjwL7HO31K5FrSVw== X-Google-Smtp-Source: ALg8bN4ru7iKC55iRgShcSW8ETdplTM0nwcVkR6gRJZCGBw5l+Hc47MHN24Jyo0gGiwwote8E1w+aQ== X-Received: by 2002:a37:8b84:: with SMTP id n126mr5118218qkd.355.1547616275990; Tue, 15 Jan 2019 21:24:35 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id n71sm57803913qkh.59.2019.01.15.21.24.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 21:24:35 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, jiri@resnulli.us, f.fainelli@gmail.com, andrew@lunn.ch, mkubecek@suse.cz, eugenem@fb.com, jonathan.lemon@gmail.com, oss-drivers@netronome.com, Jakub Kicinski Subject: [RFC net-next v2 1/6] devlink: add device information API Date: Tue, 15 Jan 2019 21:23:50 -0800 Message-Id: <20190116052356.18086-2-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116052356.18086-1-jakub.kicinski@netronome.com> References: <20190116052356.18086-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org ethtool -i has served us well for a long time, but its showing its limitations more and more. The device information should also be reported per device not per-netdev. Lay foundation for a simple devlink-based way of reading device info. Add driver name and device serial number as initial pieces of information exposed via this new API. RFC v2: - wrap the skb into an opaque structure (Jiri); - allow the serial number of be any length (Jiri & Andrew); - add driver name (Jonathan). Signed-off-by: Jakub Kicinski --- include/net/devlink.h | 18 ++++++ include/uapi/linux/devlink.h | 5 ++ net/core/devlink.c | 114 +++++++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+) diff --git a/include/net/devlink.h b/include/net/devlink.h index 67f4293bc970..d8d425028d55 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -420,6 +420,7 @@ enum devlink_param_generic_id { } struct devlink_region; +struct devlink_info_req; typedef void devlink_snapshot_data_dest_t(const void *data); @@ -475,6 +476,8 @@ struct devlink_ops { int (*eswitch_encap_mode_get)(struct devlink *devlink, u8 *p_encap_mode); int (*eswitch_encap_mode_set)(struct devlink *devlink, u8 encap_mode, struct netlink_ext_ack *extack); + int (*info_get)(struct devlink *devlink, struct devlink_info_req *req, + struct netlink_ext_ack *extack); }; static inline void *devlink_priv(struct devlink *devlink) @@ -583,6 +586,10 @@ u32 devlink_region_shapshot_id_get(struct devlink *devlink); int devlink_region_snapshot_create(struct devlink_region *region, u64 data_len, u8 *data, u32 snapshot_id, devlink_snapshot_data_dest_t *data_destructor); +int devlink_info_report_serial_number(struct devlink_info_req *req, + const char *sn); +int devlink_info_report_driver_name(struct devlink_info_req *req, + const char *name); #else @@ -844,6 +851,17 @@ devlink_region_snapshot_create(struct devlink_region *region, u64 data_len, return 0; } +static inline int +devlink_info_report_driver_name(struct devlink_info_req *req, const char *name) +{ + return 0; +} + +static inline int +devlink_info_report_serial_number(struct devlink_info_req *req, const char *sn) +{ + return 0; +} #endif #endif /* _NET_DEVLINK_H_ */ diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 6e52d3660654..c4b5d923f59f 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -89,6 +89,8 @@ enum devlink_command { DEVLINK_CMD_REGION_DEL, DEVLINK_CMD_REGION_READ, + DEVLINK_CMD_INFO_GET, + /* add new commands above here */ __DEVLINK_CMD_MAX, DEVLINK_CMD_MAX = __DEVLINK_CMD_MAX - 1 @@ -285,6 +287,9 @@ enum devlink_attr { DEVLINK_ATTR_REGION_CHUNK_ADDR, /* u64 */ DEVLINK_ATTR_REGION_CHUNK_LEN, /* u64 */ + DEVLINK_ATTR_INFO_DRV_NAME, /* string */ + DEVLINK_ATTR_INFO_SERIAL_NUMBER, /* string */ + /* add new attributes above here, update the policy in devlink.c */ __DEVLINK_ATTR_MAX, diff --git a/net/core/devlink.c b/net/core/devlink.c index abb0da9d7b4b..844e086ff038 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -3597,6 +3597,112 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb, return 0; } +struct devlink_info_req { + struct sk_buff *msg; +}; + +int devlink_info_report_driver_name(struct devlink_info_req *req, + const char *name) +{ + return nla_put_string(req->msg, DEVLINK_ATTR_INFO_DRV_NAME, name); +} +EXPORT_SYMBOL_GPL(devlink_info_report_driver_name); + +int devlink_info_report_serial_number(struct devlink_info_req *req, + const char *sn) +{ + return nla_put_string(req->msg, DEVLINK_ATTR_INFO_SERIAL_NUMBER, sn); +} +EXPORT_SYMBOL_GPL(devlink_info_report_serial_number); + +static int +devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink, + enum devlink_command cmd, u32 portid, + u32 seq, int flags, struct netlink_ext_ack *extack) +{ + struct devlink_info_req req; + void *hdr; + int err; + + hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd); + if (!hdr) + return -EMSGSIZE; + + err = -EMSGSIZE; + if (devlink_nl_put_handle(msg, devlink)) + goto err_cancel_msg; + + req.msg = msg; + err = devlink->ops->info_get(devlink, &req, extack); + if (err) + goto err_cancel_msg; + + genlmsg_end(msg, hdr); + return 0; + +err_cancel_msg: + genlmsg_cancel(msg, hdr); + return err; +} + +static int devlink_nl_cmd_info_get_doit(struct sk_buff *skb, + struct genl_info *info) +{ + struct devlink *devlink = info->user_ptr[0]; + struct sk_buff *msg; + int err; + + if (!devlink->ops || !devlink->ops->info_get) + return -EOPNOTSUPP; + + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!msg) + return -ENOMEM; + + err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, + info->snd_portid, info->snd_seq, 0, + info->extack); + if (err) { + nlmsg_free(msg); + return err; + } + + return genlmsg_reply(msg, info); +} + +static int devlink_nl_cmd_info_get_dumpit(struct sk_buff *msg, + struct netlink_callback *cb) +{ + struct devlink *devlink; + int start = cb->args[0]; + int idx = 0; + int err; + + mutex_lock(&devlink_mutex); + list_for_each_entry(devlink, &devlink_list, list) { + if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) + continue; + if (idx < start) { + idx++; + continue; + } + + mutex_lock(&devlink->lock); + err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, + NETLINK_CB(cb->skb).portid, + cb->nlh->nlmsg_seq, NLM_F_MULTI, + cb->extack); + mutex_unlock(&devlink->lock); + if (err) + break; + idx++; + } + mutex_unlock(&devlink_mutex); + + cb->args[0] = idx; + return msg->len; +} + static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING }, [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING }, @@ -3842,6 +3948,14 @@ static const struct genl_ops devlink_nl_ops[] = { .flags = GENL_ADMIN_PERM, .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK, }, + { + .cmd = DEVLINK_CMD_INFO_GET, + .doit = devlink_nl_cmd_info_get_doit, + .dumpit = devlink_nl_cmd_info_get_dumpit, + .policy = devlink_nl_policy, + .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK, + /* can be retrieved by unprivileged users */ + }, }; static struct genl_family devlink_nl_family __ro_after_init = { From patchwork Wed Jan 16 05:23:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1025649 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="kuGQO8WT"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fbHZ2XlTz9sD4 for ; Wed, 16 Jan 2019 16:24:42 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727593AbfAPFYj (ORCPT ); Wed, 16 Jan 2019 00:24:39 -0500 Received: from mail-qt1-f194.google.com ([209.85.160.194]:42261 "EHLO mail-qt1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726166AbfAPFYj (ORCPT ); Wed, 16 Jan 2019 00:24:39 -0500 Received: by mail-qt1-f194.google.com with SMTP id d19so5789899qtq.9 for ; Tue, 15 Jan 2019 21:24: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 :mime-version:content-transfer-encoding; bh=6EwyJMk0obsep3hPuD+OTpMIf3GVMaAcKT5/IJQSeas=; b=kuGQO8WTcnTxogY4GlfOXAFLkdU+AsjFbv2V31fGdhebb1U3SzHwpLgCn7hEUtL79p fYmsVaPTfL94p7BPFhXoH7JypoYBZG5iNZSXA8ioOhw6o3JMHeXW9xMPUQdaM+FIDYXy y4mejOLNOcqtSVe8j29Hch93pRyrp8hkJX1xmg2Ay99BvDhfpnwy+CiCmNVdKsEem20s zo5U9peQIoWJxo7z9NXoXBrdcHnn/AjSN5xYBpgkAnrvoT7wyJ7Et5xfM3Io36bFoKRw hZbo5kfrXSFdrh5Xc6uUwJlP5UXh3t4gG+hVn/tUj9hfaoa3xTzvCnF1BofWFRAkvPTS hl7w== 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:mime-version:content-transfer-encoding; bh=6EwyJMk0obsep3hPuD+OTpMIf3GVMaAcKT5/IJQSeas=; b=P5uJjpj/fPdMAQHu+Zp3LcpHrZyNrhdtxRdw0ASwh1s+qbOdU59dp4omsSijVWR79/ hJqOdK61p7g6jHT1POZbSKHLqN9Y4kkvZUQq27SlwLDaFy7g4yuVG3mfurkXb5+l/oqp bmPWf1g0BGSXS5ouRL1D7uzzcNRZmEk+qPzYfbKpcxHrWb4fc747OY2dKxrrY4Vk4gpG hWVI8MrMx2nyuiFkssYPa1TduPGnwFIBJgDPaNqWUcmPRUmh46EAIMzUxBJ4U3Fp/a6Z PW+HrSKoUlxSDFupJxGJe16g4yYjfNCKkagf2wcNH4eSVQWT8XC093WpsZfeZzWaJ4LB 9AJA== X-Gm-Message-State: AJcUukdNSQUHA3ejeTbKVhbJhkbYCxhCKkAI/U0HQ2lFL2y1wTBy/ShK RBk+5VaWWJP6srz+qeAKrpVzwQ== X-Google-Smtp-Source: ALg8bN4sUtFXPF4XhUAFHABHWZgQX8ZIKCF9ZaXo1R4SvtUQzob/a+r0ialOfM0T2ZDhann42wpElg== X-Received: by 2002:a0c:8164:: with SMTP id 91mr5720926qvc.100.1547616277889; Tue, 15 Jan 2019 21:24:37 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id n71sm57803913qkh.59.2019.01.15.21.24.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 21:24:37 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, jiri@resnulli.us, f.fainelli@gmail.com, andrew@lunn.ch, mkubecek@suse.cz, eugenem@fb.com, jonathan.lemon@gmail.com, oss-drivers@netronome.com, Jakub Kicinski Subject: [RFC net-next v2 2/6] devlink: add version reporting to devlink info API Date: Tue, 15 Jan 2019 21:23:51 -0800 Message-Id: <20190116052356.18086-3-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116052356.18086-1-jakub.kicinski@netronome.com> References: <20190116052356.18086-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org ethtool -i has a few fixed-size fields which can be used to report firmware version and expansion ROM version. Unfortunately, modern hardware has more firmware components. There is usually some datapath microcode, management controller, PXE drivers, and a CPLD load. Running ethtool -i on modern controllers reveals the fact that vendors cram multiple values into firmware version field. Here are some examples from systems I could lay my hands on quickly: tg3: "FFV20.2.17 bc 5720-v1.39" i40e: "6.01 0x800034a4 1.1747.0" nfp: "0.0.3.5 0.25 sriov-2.1.16 nic" Add a new devlink API to allow retrieving multiple versions, and provide user-readable name for those versions. While at it break down the versions into three categories: - fixed - this is the board/fixed component version, usually vendors report information like the board version in the PCI VPD, but it will benefit from naming and common API as well; - running - this is the running firmware version; - stored - this is firmware in the flash, after firmware update this value will reflect the flashed version, while the running version may only be updated after reboot. RFCv2: - remove the nesting in attr DEVLINK_ATTR_INFO_VERSIONS (now versions are mixed with other info attrs)l - have the driver report versions from the same callback as other info. Signed-off-by: Jakub Kicinski --- include/net/devlink.h | 18 ++++++++++++++++ include/uapi/linux/devlink.h | 5 +++++ net/core/devlink.c | 40 ++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/include/net/devlink.h b/include/net/devlink.h index d8d425028d55..f53ace3ac4b3 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -419,6 +419,12 @@ enum devlink_param_generic_id { .validate = _validate, \ } +enum devlink_version_type { + DEVLINK_VERSION_FIXED, + DEVLINK_VERSION_STORED, + DEVLINK_VERSION_RUNNING, +}; + struct devlink_region; struct devlink_info_req; @@ -590,6 +596,10 @@ int devlink_info_report_serial_number(struct devlink_info_req *req, const char *sn); int devlink_info_report_driver_name(struct devlink_info_req *req, const char *name); +int devlink_info_report_version(struct devlink_info_req *req, + enum devlink_version_type type, + const char *version_name, + const char *version_value); #else @@ -862,6 +872,14 @@ devlink_info_report_serial_number(struct devlink_info_req *req, const char *sn) { return 0; } + +static inline int +devlink_info_report_version(struct devlink_info_req *req, + enum devlink_version_type type, + const char *version_name, const char *version_value) +{ + return 0; +} #endif #endif /* _NET_DEVLINK_H_ */ diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index c4b5d923f59f..e8d449a203ec 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -289,6 +289,11 @@ enum devlink_attr { DEVLINK_ATTR_INFO_DRV_NAME, /* string */ DEVLINK_ATTR_INFO_SERIAL_NUMBER, /* string */ + DEVLINK_ATTR_INFO_VERSION_FIXED, /* nested */ + DEVLINK_ATTR_INFO_VERSION_RUNNING, /* nested */ + DEVLINK_ATTR_INFO_VERSION_STORED, /* nested */ + DEVLINK_ATTR_INFO_VERSION_NAME, /* string */ + DEVLINK_ATTR_INFO_VERSION_VALUE, /* string */ /* add new attributes above here, update the policy in devlink.c */ diff --git a/net/core/devlink.c b/net/core/devlink.c index 844e086ff038..f0c5f9bd96b7 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -3615,6 +3615,46 @@ int devlink_info_report_serial_number(struct devlink_info_req *req, } EXPORT_SYMBOL_GPL(devlink_info_report_serial_number); +int devlink_info_report_version(struct devlink_info_req *req, + enum devlink_version_type type, + const char *version_name, + const char *version_value) +{ + static const enum devlink_attr type2attr[] = { + [DEVLINK_VERSION_FIXED] = DEVLINK_ATTR_INFO_VERSION_FIXED, + [DEVLINK_VERSION_STORED] = DEVLINK_ATTR_INFO_VERSION_STORED, + [DEVLINK_VERSION_RUNNING] = DEVLINK_ATTR_INFO_VERSION_RUNNING, + }; + struct nlattr *nest; + int err; + + if (type >= ARRAY_SIZE(type2attr) || !type2attr[type]) + return -EINVAL; + + nest = nla_nest_start(req->msg, type2attr[type]); + if (!nest) + return -EMSGSIZE; + + err = nla_put_string(req->msg, DEVLINK_ATTR_INFO_VERSION_NAME, + version_name); + if (err) + goto nla_put_failure; + + err = nla_put_string(req->msg, DEVLINK_ATTR_INFO_VERSION_VALUE, + version_value); + if (err) + goto nla_put_failure; + + nla_nest_end(req->msg, nest); + + return 0; + +nla_put_failure: + nla_nest_cancel(req->msg, nest); + return err; +} +EXPORT_SYMBOL_GPL(devlink_info_report_version); + static int devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink, enum devlink_command cmd, u32 portid, From patchwork Wed Jan 16 05:23:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1025650 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="0pe0ifjw"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fbHg0gTGz9sD4 for ; Wed, 16 Jan 2019 16:24:46 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729194AbfAPFYm (ORCPT ); Wed, 16 Jan 2019 00:24:42 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:39013 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726166AbfAPFYk (ORCPT ); Wed, 16 Jan 2019 00:24:40 -0500 Received: by mail-qt1-f196.google.com with SMTP id u47so5815531qtj.6 for ; Tue, 15 Jan 2019 21:24: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 :mime-version:content-transfer-encoding; bh=vOblOBw53pGUlZlDbyb36XspUwstEz7O8SLV0BkBliY=; b=0pe0ifjwt4RFBEpcv3VwEkcF+wr+0/wPZ0lNFhDDNrJJJ2rND8qupW6H2enugvMB7e zvLA1y2C5RcmS2pGoCMxODaNPGMCzW7MKNT8iAMetBrRwl82R3wVdVpvBJNFf8VQwNtv aNcGi985oYwZhXeZQVLGmS+Jt5Az6qX6wqsCbekbwN8r5T/k7TTe2cDXrb+LVYyLWwHa 5S5HtIfDWCX0RXsmiFxw92hzUBrh8sYGfOyVmRT5NV0wNDG0bMvjU1wVx0vHxvHYITNc QOBxetE8Q0Gb/vIGf4ww/L1QqV6QiekPaMHxMCtN14kVeGsxCMQmLQFL7Tt33XmJG66N jSbw== 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:mime-version:content-transfer-encoding; bh=vOblOBw53pGUlZlDbyb36XspUwstEz7O8SLV0BkBliY=; b=Hw47SUhmnTzx44hDu4Jh/KZL4ST84KW6xE8BfvJ8P/M/J2CbL/PluMDNrtD59F6xX7 h370XuIZdNtDj2urI18sASwd8Mnrdb6oY44h2swa16hA+/DItW5ANZ/SofIPpAnPKtiG bZOOwbYv3W6Y9yHw3hJfyzvmYoUNJb0GBH5rBLUQlGyyy2vV2eJJCAmmz5eOUzbiH8iW Sp5jiwU488fprtHAtrivaGZtiRZVOIGCQA7ObDEaibP8JPa4pA0j6R90cHsf/VfOimOu HY4kQAXly2xjKC4xOE68rxcvPsxCv0tXOV1tMwWb/145GC2Mnaet/lYwFWtNRFnyrDtA ZscA== X-Gm-Message-State: AJcUukfo3NX+7EovG3Qscr9TfpGmSCMh8yTG7BNsJ5EJCoF6duStZ6WQ tsLsbpCAh9aOJI+KW0jyLsavBg== X-Google-Smtp-Source: ALg8bN5r2PB+hT21FbUFgtvEiOBercti1HUucwJ+P8X1f1xwj9o+QhOwgFGjbKniab02s1wwXzn1YQ== X-Received: by 2002:a0c:aa56:: with SMTP id e22mr5842897qvb.158.1547616279774; Tue, 15 Jan 2019 21:24:39 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id n71sm57803913qkh.59.2019.01.15.21.24.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 21:24:39 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, jiri@resnulli.us, f.fainelli@gmail.com, andrew@lunn.ch, mkubecek@suse.cz, eugenem@fb.com, jonathan.lemon@gmail.com, oss-drivers@netronome.com, Jakub Kicinski Subject: [RFC net-next v2 3/6] nfp: devlink: report driver name and serial number Date: Tue, 15 Jan 2019 21:23:52 -0800 Message-Id: <20190116052356.18086-4-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116052356.18086-1-jakub.kicinski@netronome.com> References: <20190116052356.18086-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Report the basic info through new devlink info API. RFCv2: - add driver name; - align serial to core changes. Signed-off-by: Jakub Kicinski --- .../net/ethernet/netronome/nfp/nfp_devlink.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index 808647ec3573..cb3ef7e46614 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -4,6 +4,7 @@ #include #include +#include "nfpcore/nfp.h" #include "nfpcore/nfp_nsp.h" #include "nfp_app.h" #include "nfp_main.h" @@ -171,6 +172,28 @@ static int nfp_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode, return ret; } +static int +nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req, + struct netlink_ext_ack *extack) +{ + struct nfp_pf *pf = devlink_priv(devlink); + const char *sn; + int err; + + err = devlink_info_report_driver_name(req, "nfp"); + if (err) + return err; + + sn = nfp_hwinfo_lookup(pf->hwinfo, "assembly.serial"); + if (sn) { + err = devlink_info_report_serial_number(req, sn); + if (err) + return err; + } + + return 0; +} + const struct devlink_ops nfp_devlink_ops = { .port_split = nfp_devlink_port_split, .port_unsplit = nfp_devlink_port_unsplit, @@ -178,6 +201,7 @@ const struct devlink_ops nfp_devlink_ops = { .sb_pool_set = nfp_devlink_sb_pool_set, .eswitch_mode_get = nfp_devlink_eswitch_mode_get, .eswitch_mode_set = nfp_devlink_eswitch_mode_set, + .info_get = nfp_devlink_info_get, }; int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port) From patchwork Wed Jan 16 05:23:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1025651 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="MKhsnC/x"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fbHg6NNzz9sD9 for ; Wed, 16 Jan 2019 16:24:47 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730057AbfAPFYn (ORCPT ); Wed, 16 Jan 2019 00:24:43 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:44827 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729052AbfAPFYm (ORCPT ); Wed, 16 Jan 2019 00:24:42 -0500 Received: by mail-qt1-f196.google.com with SMTP id n32so5772352qte.11 for ; Tue, 15 Jan 2019 21:24: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 :mime-version:content-transfer-encoding; bh=3sW2PfD/YZ9HFtd+n3j/iLssrO+MfvAYIhx/tnDT234=; b=MKhsnC/xuJUd+FckiIaTE41yNjpkx6i6wKNIiOYr6K7pOrYefkMLvDJMKAPnPfy3Hi /jDkDuuPEgzKVBZpLzbb2n7CHh3ocK5n9MlqOwqZoo7ckVNqpf50HKCF2paZDWgKxi9J gVllYDKP36Il+9Db+MH6t3fWe+qcveJ+pdhsS5BqDjV/hW4/VeMDiWUPLfeAHOca3ns2 27cLiwCdfe1MaGaX2PKk9s5nGLDgaFUL1I6pWp6Ru7GhEx0h8oZNTcuj5YDP5BoDPgfA uoGUDXMG1wgJ6dLlt8KUTC9oiiWWUeOynYtSMnrnk3dBomaxRZYxRu2ISaj6Zri4zW8k 5O0A== 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:mime-version:content-transfer-encoding; bh=3sW2PfD/YZ9HFtd+n3j/iLssrO+MfvAYIhx/tnDT234=; b=QGiolVDEE8ctWjBGle23nbozecaIqu6NdRDFaYLnkBnEyveu0dRfTQueSkmEBpmJ5Z e06pgTe+yWR51HAI/mL/s7cjgVjrEiL3KPYHCEQXlH6OmNyCnVRYtaIWAlDKNk2s8huq gMght7K0JpA5SSmalifmR5mORQUYrQ1GJG432prdtCbPFpphTGPJgH1CbyZVFbNzzPgf lq8U3NOVT6yKRPN/O8jw3Lyr7JEtfz0y6dUMvfCQQA2zzvKeizO2Hi/SCSKyBjhvDa6K BNuSq+ReJchxcmFvSgyDEmS9PlPOoSfilzNhC3EdIeQsq/mLHgiuqd6sIc3mNG8Q9cN3 Lodw== X-Gm-Message-State: AJcUukcLUafrtxEyGMKlP4hl0MnL4TWsStU2OlK4aZKr4DeiDJoJOMLL acK2zQ283C9KwCXkJt0XSzwAXA== X-Google-Smtp-Source: ALg8bN4d8eqaDviuMe6tc1qoOl2ZfwFfQihge4z9zCAwMPCTkVlpN1Vpt76cSMiQBQwGRj9+aN6g9g== X-Received: by 2002:a0c:e486:: with SMTP id n6mr5788249qvl.210.1547616281588; Tue, 15 Jan 2019 21:24:41 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id n71sm57803913qkh.59.2019.01.15.21.24.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 21:24:41 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, jiri@resnulli.us, f.fainelli@gmail.com, andrew@lunn.ch, mkubecek@suse.cz, eugenem@fb.com, jonathan.lemon@gmail.com, oss-drivers@netronome.com, Jakub Kicinski Subject: [RFC net-next v2 4/6] nfp: devlink: report fixed versions Date: Tue, 15 Jan 2019 21:23:53 -0800 Message-Id: <20190116052356.18086-5-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116052356.18086-1-jakub.kicinski@netronome.com> References: <20190116052356.18086-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Report information about the hardware. RFCv2: - add defines for board IDs which are likely to be reusable for other drivers (Jiri). Signed-off-by: Jakub Kicinski --- .../net/ethernet/netronome/nfp/nfp_devlink.c | 37 ++++++++++++++++++- include/net/devlink.h | 5 +++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index cb3ef7e46614..63b2fa37256c 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -172,6 +172,41 @@ static int nfp_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode, return ret; } +static const struct nfp_devlink_versions_simple { + const char *key; + const char *hwinfo; +} nfp_devlink_versions_hwinfo[] = { + { DEVLINK_VERSION_GENERIC_BOARD_ID, "assembly.partno", }, + { DEVLINK_VERSION_GENERIC_BOARD_REV, "assembly.revision", }, + { "board.vendor", /* fab */ "assembly.vendor", }, + { "board.name", /* code name */ "assembly.model", }, +}; + +static int +nfp_devlink_versions_get_hwinfo(struct nfp_pf *pf, struct devlink_info_req *req) +{ + unsigned int i; + int err; + + for (i = 0; i < ARRAY_SIZE(nfp_devlink_versions_hwinfo); i++) { + const struct nfp_devlink_versions_simple *info; + const char *val; + + info = &nfp_devlink_versions_hwinfo[i]; + + val = nfp_hwinfo_lookup(pf->hwinfo, info->hwinfo); + if (!val) + continue; + + err = devlink_info_report_version(req, DEVLINK_VERSION_FIXED, + info->key, val); + if (err) + return err; + } + + return 0; +} + static int nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req, struct netlink_ext_ack *extack) @@ -191,7 +226,7 @@ nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req, return err; } - return 0; + return nfp_devlink_versions_get_hwinfo(pf, req); } const struct devlink_ops nfp_devlink_ops = { diff --git a/include/net/devlink.h b/include/net/devlink.h index f53ace3ac4b3..dc08301028a9 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -419,6 +419,11 @@ enum devlink_param_generic_id { .validate = _validate, \ } +/* Part number, identifier of board design */ +#define DEVLINK_VERSION_GENERIC_BOARD_ID "board.id" +/* Revision of board design */ +#define DEVLINK_VERSION_GENERIC_BOARD_REV "board.rev" + enum devlink_version_type { DEVLINK_VERSION_FIXED, DEVLINK_VERSION_STORED, From patchwork Wed Jan 16 05:23:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1025652 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="oQhaT6uJ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fbHh48T7z9sD4 for ; Wed, 16 Jan 2019 16:24:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730477AbfAPFYr (ORCPT ); Wed, 16 Jan 2019 00:24:47 -0500 Received: from mail-qt1-f193.google.com ([209.85.160.193]:39017 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730268AbfAPFYo (ORCPT ); Wed, 16 Jan 2019 00:24:44 -0500 Received: by mail-qt1-f193.google.com with SMTP id u47so5815644qtj.6 for ; Tue, 15 Jan 2019 21:24:43 -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 :mime-version:content-transfer-encoding; bh=CMGzKdjwqoeT3moHKGtmi1O2NIZj2On3yJh3CulNo+E=; b=oQhaT6uJZyPiP487iS/fz2FjH9WpLK1WdYLTOf6NckKcpG4lkpHdawihMNpq0cbLwE 2C7DjAhLxU8yLqvpFtO5mouu9O1AX+dLl16rgQEaj+yCFJ36Mleg/flkimQNJLP/QtEB zhayVU0liSF9jjUSlxzbArO7qKG4whTLzEux+Rkkda6A9IK5IdWHgEEvoaG/YYgzjMQh f3f0vTBQqu/17p70ZrWnmMZr5sLRp3d5lapzF3e/AmDw1LxLigRQV4h2wLVO9rsAbgxE BnXh6KQ7PBDQBNebDdusBZ+n/ajEnSj6CI6GAWfgLM6olR2PkxtsQDrLbDqgDD7CGg/o al4Q== 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:mime-version:content-transfer-encoding; bh=CMGzKdjwqoeT3moHKGtmi1O2NIZj2On3yJh3CulNo+E=; b=SA7NzguNvYepnaUHOrCneBMTtJHPzBYrWIdCbWTTPziWyyf3oAnN6pBN/HfOmpbz17 fvUmvAlatnZZQ80AlYfqPe/6O+Z5N49aMBKV/D+b3sU+Hzd1yeYosq7Zgj4HxEjOe5Xs FWBv40BwIeqE2BbgBAsRxMrRBS0rYpg4Z6CMdARCY03wVtFxRgj2LEn2y/YcWkYg5awq 2U9AHR0Q/d0dbFoSip6+SRQvmsdzKvvtb/2gJb6A+DF7o0Qr/MqHWhKEe5IsjQaQnBhD /BveqIyUyU0pCFn29567rOmJT9vSMPGweDVMdsKDKQnKMfyQdRrGMd+YHnZ73XM857tn 1aJg== X-Gm-Message-State: AJcUukcNW0LBMVb3K0GZYdAqOao9Z3lzNICr5MrQbdGTo0yLk597M4kV AKyUC7EXcV9CJWj3TKmI3xKHbQ== X-Google-Smtp-Source: ALg8bN4YW21bJW2pyznItZ/i6rJeOywyQ0gWDrwS25L0xUQjMpNS1SDS/4HmgKjxarfa+nV6El/sYQ== X-Received: by 2002:ac8:296a:: with SMTP id z39mr5891860qtz.264.1547616283381; Tue, 15 Jan 2019 21:24:43 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id n71sm57803913qkh.59.2019.01.15.21.24.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 21:24:42 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, jiri@resnulli.us, f.fainelli@gmail.com, andrew@lunn.ch, mkubecek@suse.cz, eugenem@fb.com, jonathan.lemon@gmail.com, oss-drivers@netronome.com, Jakub Kicinski Subject: [RFC net-next v2 5/6] nfp: nsp: add support for versions command Date: Tue, 15 Jan 2019 21:23:54 -0800 Message-Id: <20190116052356.18086-6-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116052356.18086-1-jakub.kicinski@netronome.com> References: <20190116052356.18086-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Retrieve the FW versions with the new command. Signed-off-by: Jakub Kicinski --- .../ethernet/netronome/nfp/nfpcore/nfp_nsp.c | 53 +++++++++++++++++++ .../ethernet/netronome/nfp/nfpcore/nfp_nsp.h | 14 +++++ 2 files changed, 67 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.c b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.c index ce1577bbbd2a..bd1a39088116 100644 --- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.c +++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.c @@ -7,6 +7,7 @@ * Jason McMullan */ +#include #include #include #include @@ -62,6 +63,12 @@ #define NFP_HWINFO_LOOKUP_SIZE GENMASK(11, 0) +#define NFP_VERSIONS_SIZE GENMASK(11, 0) +#define NFP_VERSIONS_CNT_OFF 0 +#define NFP_VERSIONS_BSP_OFF 2 +#define NFP_VERSIONS_CPLD_OFF 6 +#define NFP_VERSIONS_APP_OFF 10 + enum nfp_nsp_cmd { SPCODE_NOOP = 0, /* No operation */ SPCODE_SOFT_RESET = 1, /* Soft reset the NFP */ @@ -77,6 +84,7 @@ enum nfp_nsp_cmd { SPCODE_NSP_IDENTIFY = 13, /* Read NSP version */ SPCODE_FW_STORED = 16, /* If no FW loaded, load flash app FW */ SPCODE_HWINFO_LOOKUP = 17, /* Lookup HWinfo with overwrites etc. */ + SPCODE_VERSIONS = 20, /* Report FW versions */ }; static const struct { @@ -711,3 +719,48 @@ int nfp_nsp_hwinfo_lookup(struct nfp_nsp *state, void *buf, unsigned int size) return 0; } + +int nfp_nsp_versions(struct nfp_nsp *state, void *buf, unsigned int size) +{ + struct nfp_nsp_command_buf_arg versions = { + { + .code = SPCODE_VERSIONS, + .option = min_t(u32, size, NFP_VERSIONS_SIZE), + }, + .out_buf = buf, + .out_size = min_t(u32, size, NFP_VERSIONS_SIZE), + }; + + return nfp_nsp_command_buf(state, &versions); +} + +const char *nfp_nsp_versions_get(enum nfp_nsp_versions id, bool flash, + const u8 *buf, unsigned int size) +{ + static const u32 id2off[] = { + [NFP_VERSIONS_BSP] = NFP_VERSIONS_BSP_OFF, + [NFP_VERSIONS_CPLD] = NFP_VERSIONS_CPLD_OFF, + [NFP_VERSIONS_APP] = NFP_VERSIONS_APP_OFF, + }; + unsigned int field, buf_field_cnt, buf_off; + + if (id >= ARRAY_SIZE(id2off) || !id2off[id]) + return ERR_PTR(-EINVAL); + + field = id * 2 + flash; + + buf_field_cnt = get_unaligned_le16(buf); + if (buf_field_cnt <= field) + return ERR_PTR(-ENOENT); + + buf_off = get_unaligned_le16(buf + id2off[id] + flash * 2); + if (!buf_off) + return ERR_PTR(-ENOENT); + + if (buf_off >= size) + return ERR_PTR(-EINVAL); + if (strnlen(&buf[buf_off], size - buf_off) == size - buf_off) + return ERR_PTR(-EINVAL); + + return (const char *)&buf[buf_off]; +} diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h index ff33ac54097a..65b2b5819811 100644 --- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h +++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h @@ -38,6 +38,11 @@ static inline bool nfp_nsp_has_hwinfo_lookup(struct nfp_nsp *state) return nfp_nsp_get_abi_ver_minor(state) > 24; } +static inline bool nfp_nsp_has_versions(struct nfp_nsp *state) +{ + return nfp_nsp_get_abi_ver_minor(state) > 0xff; +} + enum nfp_eth_interface { NFP_INTERFACE_NONE = 0, NFP_INTERFACE_SFP = 1, @@ -208,4 +213,13 @@ enum nfp_nsp_sensor_id { int nfp_hwmon_read_sensor(struct nfp_cpp *cpp, enum nfp_nsp_sensor_id id, long *val); +enum nfp_nsp_versions { + NFP_VERSIONS_BSP, + NFP_VERSIONS_CPLD, + NFP_VERSIONS_APP, +}; + +int nfp_nsp_versions(struct nfp_nsp *state, void *buf, unsigned int size); +const char *nfp_nsp_versions_get(enum nfp_nsp_versions id, bool flash, + const u8 *buf, unsigned int size); #endif From patchwork Wed Jan 16 05:23:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 1025653 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=none (p=none dis=none) header.from=netronome.com 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="cHwwyLVP"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fbHl19Dhz9sD4 for ; Wed, 16 Jan 2019 16:24:51 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730623AbfAPFYt (ORCPT ); Wed, 16 Jan 2019 00:24:49 -0500 Received: from mail-qk1-f196.google.com ([209.85.222.196]:37586 "EHLO mail-qk1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729052AbfAPFYq (ORCPT ); Wed, 16 Jan 2019 00:24:46 -0500 Received: by mail-qk1-f196.google.com with SMTP id g125so3055648qke.4 for ; Tue, 15 Jan 2019 21:24:45 -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 :mime-version:content-transfer-encoding; bh=Jv7mC+22i9/VKFrMGN94xjJdpmmCvqWOYDAfC5V4rs8=; b=cHwwyLVPV2r+/1Y7qW+SKPDBPm25FnfEAguOWv/XRQo5fM2ZKfv/rF3vYjlwTcwZav WHxcug32qKFqd5ZZr6ct5DlG3oZnAjqtY9ipSmQDzsKcb+a05v38IrbBkiRlHm33HREO mLIL3hCDc8NcEKs0dSnCggdpZkUz3gexfZIkXbzYDnWtbfjQhpM8QhlSAo7hlP/FAfe5 QqHtlgFwArbuAOBv/f/6q+MLWmdvN4s2tU/mjy3THWSrgONN4qfAsfXlzcKPEQKvkd4d dY+bXMHho5bzd8H6ajZ4fjZMBUd9ETGZ+qpUv299Q6+zQ3Eea6ez5E5YhrJxorGZW2oO r1pQ== 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:mime-version:content-transfer-encoding; bh=Jv7mC+22i9/VKFrMGN94xjJdpmmCvqWOYDAfC5V4rs8=; b=L3xn4M913SlHWU+qXMiIdNer0LPpE7rhn28m4Wdi75vSpyYIfsAiWCAQtFn6QRcUdr Wrv0oi6UKmLOKQ0Yl7XZ2rdpEg8R/XL8gk7j9nJp0aDCR9mxWekemypI9Ah3KPcH3gfz 9nMTE+G4Tv/roswDbscT0/Pw+kOlDrxnP0/AwToDncwpWBKUKbO5opzkuoV3ouK2dgPk 3SSYRr1BfsMcKtLITE3m3iZdgA/M0pu6ZS7MuvwbY42/Tz35fup8QyWrOwZtCOh6ji1U o2LkWpYypVTWAFKEWeMw8Ljp67HQJp9Y7Zmt0j451YgNjodEa01sZ3MSoiOsIrlFE7OV 8JhA== X-Gm-Message-State: AJcUukf2IIjTIo2Jxlt2HmeDH28ym9cFZ5o2chCr4Ho0/vS4R57Ta8Ez qRDHDTNKydN28+R6igNTYbIg4g== X-Google-Smtp-Source: ALg8bN7FB8Po7k4l4aJygre4XiWu1FR2qFGgUevjTtcbQkn5Yhtseqfdk01rUccZQYOIzyswfOOOGQ== X-Received: by 2002:a37:bcc1:: with SMTP id m184mr5249696qkf.286.1547616285263; Tue, 15 Jan 2019 21:24:45 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id n71sm57803913qkh.59.2019.01.15.21.24.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Jan 2019 21:24:44 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net Cc: netdev@vger.kernel.org, jiri@resnulli.us, f.fainelli@gmail.com, andrew@lunn.ch, mkubecek@suse.cz, eugenem@fb.com, jonathan.lemon@gmail.com, oss-drivers@netronome.com, Jakub Kicinski Subject: [RFC net-next v2 6/6] nfp: devlink: report the running and flashed versions Date: Tue, 15 Jan 2019 21:23:55 -0800 Message-Id: <20190116052356.18086-7-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190116052356.18086-1-jakub.kicinski@netronome.com> References: <20190116052356.18086-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Report versions of firmware components using the new NSP command. Signed-off-by: Jakub Kicinski --- .../net/ethernet/netronome/nfp/nfp_devlink.c | 73 +++++++++++++++++++ include/net/devlink.h | 7 ++ 2 files changed, 80 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index 63b2fa37256c..e3d23724a37c 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -207,11 +207,54 @@ nfp_devlink_versions_get_hwinfo(struct nfp_pf *pf, struct devlink_info_req *req) return 0; } +static const struct nfp_devlink_versions { + enum nfp_nsp_versions id; + const char *key; +} nfp_devlink_versions_nsp[] = { + { NFP_VERSIONS_BSP, DEVLINK_VERSION_GENERIC_FW_MGMT, }, + { NFP_VERSIONS_CPLD, "fw.cpld", }, + { NFP_VERSIONS_APP, DEVLINK_VERSION_GENERIC_FW_APP, }, +}; + +static int +nfp_devlink_versions_get_nsp(struct devlink_info_req *req, bool flash, + const u8 *buf, unsigned int size) +{ + enum devlink_version_type type; + unsigned int i; + int err; + + type = flash ? DEVLINK_VERSION_STORED : DEVLINK_VERSION_RUNNING; + + for (i = 0; i < ARRAY_SIZE(nfp_devlink_versions_nsp); i++) { + const struct nfp_devlink_versions *info; + const char *version; + + info = &nfp_devlink_versions_nsp[i]; + + version = nfp_nsp_versions_get(info->id, flash, buf, size); + if (IS_ERR(version)) { + if (PTR_ERR(version) == -ENOENT) + continue; + else + return PTR_ERR(version); + } + + err = devlink_info_report_version(req, type, + info->key, version); + if (err) + return err; + } + + return 0; +} + static int nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req, struct netlink_ext_ack *extack) { struct nfp_pf *pf = devlink_priv(devlink); + struct nfp_nsp *nsp; const char *sn; int err; @@ -226,7 +269,37 @@ nfp_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req, return err; } + nsp = nfp_nsp_open(pf->cpp); + if (IS_ERR(nsp)) { + NL_SET_ERR_MSG_MOD(extack, "can't access NSP"); + return PTR_ERR(nsp); + } + + if (nfp_nsp_has_versions(nsp)) { + char buf[512] = {}; + + err = nfp_nsp_versions(nsp, buf, sizeof(buf)); + if (err) + goto err_close_nsp; + + err = nfp_devlink_versions_get_nsp(req, false, + buf, sizeof(buf)); + if (err) + goto err_close_nsp; + + err = nfp_devlink_versions_get_nsp(req, true, + buf, sizeof(buf)); + if (err) + goto err_close_nsp; + } + + nfp_nsp_close(nsp); + return nfp_devlink_versions_get_hwinfo(pf, req); + +err_close_nsp: + nfp_nsp_close(nsp); + return err; } const struct devlink_ops nfp_devlink_ops = { diff --git a/include/net/devlink.h b/include/net/devlink.h index dc08301028a9..9270f1a21f08 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -424,6 +424,13 @@ enum devlink_param_generic_id { /* Revision of board design */ #define DEVLINK_VERSION_GENERIC_BOARD_REV "board.rev" +/* Control processor FW version, FW is responsible for house keeping tasks, + * PHY control etc. + */ +#define DEVLINK_VERSION_GENERIC_FW_MGMT "fw.mgmt" +/* Data path microcode controlling high-speed packet processing */ +#define DEVLINK_VERSION_GENERIC_FW_APP "fw.app" + enum devlink_version_type { DEVLINK_VERSION_FIXED, DEVLINK_VERSION_STORED,