From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4991C43381 for ; Tue, 26 Feb 2019 18:25:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8AF0A217F5 for ; Tue, 26 Feb 2019 18:25:08 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="IHUplK0x" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729110AbfBZSYz (ORCPT ); Tue, 26 Feb 2019 13:24:55 -0500 Received: from mail-qk1-f196.google.com ([209.85.222.196]:42544 "EHLO mail-qk1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728968AbfBZSYw (ORCPT ); Tue, 26 Feb 2019 13:24:52 -0500 Received: by mail-qk1-f196.google.com with SMTP id y140so8181832qkb.9 for ; Tue, 26 Feb 2019 10:24:51 -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=//+E+OxrLgJlYwZePYfUXmmP+QynTqQq4MYS5n/zaPI=; b=IHUplK0xYiYXSsUImjPJlG6R7fUHtsV8kTCrEUEaT13ILUPcddCeLy+pLv2i9zBB00 lOYvI/aN0u2qAt5aJ5YvFS+sonpwQOFmTpwT4St02xg5JH2uzQEP0qaIDu/bvSUFAh3B fywA52jyCBmvJnxv014erCsyl/TABJ99iJLDxBAAOiqju5vbshe1TdTUcOWihovjpLQ5 ZXYhGGJ7DIMIW9B42nuX8qHLPPVzwNeUiyBmIv1CAqpDjEze42husgNjPkMlJfFdSFT8 hX9nlGlt1xpoAswjvE3q/XL+a4YLDQDebz/wmJmo/D43LzMshrZXH/8XM/Fbbh5QD2QE LozA== 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=//+E+OxrLgJlYwZePYfUXmmP+QynTqQq4MYS5n/zaPI=; b=AlIPaSN1d674S5+VDvb8gEEmXJcYM6ekkcDqFSKZ6kgQD42gDfsFd+n82MjYxhDNWb XbDoBoI0CMlTMteFA3KJy/WNhLwkdsJ2t6Uyr4HqAplxridPIKQj/7ovZLecO58Fck5+ WUjsrpqaM1i9pexoijhMtyM98yCaCBqJMNuNEQrsxXeoyZCUz1muCrzVgsoDxqxEILbH abmm7dB4Q872MY9aHie4++CXSrWxL780ysRaol9PWVWbhbPuK6ylYqhd7VB0d1/rBvzW 3ifULh+2TrgzIJykRqrQFDWh+VcDA3HWehxLqx/2TPqzQmYtJIgM7b+QyKF6DyxX7CLC cmIg== X-Gm-Message-State: AHQUAuYFGzS6NMU35ZTZI2AalcX4lfGXYs6M2v5B/IUSUbo87BiR0X8Z YsFe6nQo6nMKKvNX4yCPBMJ1fw== X-Google-Smtp-Source: AHgI3IZzVtQ9DymaWp/idz1KkXQgY3ZW7AT/H5GERrdEDADGdc70zoi50Fy2P+4Z35zEwYjkBJAOdA== X-Received: by 2002:a37:457:: with SMTP id 84mr17508317qke.303.1551205490961; Tue, 26 Feb 2019 10:24:50 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id u31sm9733892qth.15.2019.02.26.10.24.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Feb 2019 10:24:50 -0800 (PST) From: Jakub Kicinski To: davem@davemloft.net, jiri@resnulli.us Cc: oss-drivers@netronome.com, netdev@vger.kernel.org, Jakub Kicinski Subject: [PATCH net-next 2/8] devlink: add PF and VF port flavours Date: Tue, 26 Feb 2019 10:24:30 -0800 Message-Id: <20190226182436.23811-3-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190226182436.23811-1-jakub.kicinski@netronome.com> References: <20190226182436.23811-1-jakub.kicinski@netronome.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Current port flavours cover simple switches and DSA. Add PF and VF flavours to cover "switchdev" SR-IOV NICs. Example devlink user space output: $ devlink port pci/0000:82:00.0/0: type eth netdev p4p1 flavour physical pci/0000:82:00.0/10000: type eth netdev eth0 flavour pcie_pf pf 0 pci/0000:82:00.0/10001: type eth netdev eth1 flavour pcie_vf pf 0 vf 0 pci/0000:82:00.0/10002: type eth netdev eth2 flavour pcie_vf pf 0 vf 1 $ devlink -jp port { "port": { "pci/0000:82:00.0/0": { "type": "eth", "netdev": "p4p1", "flavour": "physical" }, "pci/0000:82:00.0/10000": { "type": "eth", "netdev": "eth0", "flavour": "pci_pf", "pf": 0, }, "pci/0000:82:00.0/10001": { "type": "eth", "netdev": "eth1", "flavour": "pci_vf", "pf": 0, "vf": 0 }, "pci/0000:82:00.0/10002": { "type": "eth", "netdev": "eth2", "flavour": "pci_vf", "pf": 0, "vf": 1 } } } Signed-off-by: Jakub Kicinski --- include/net/devlink.h | 25 ++++++++++-- include/uapi/linux/devlink.h | 5 +++ net/core/devlink.c | 73 +++++++++++++++++++++++++++++++----- 3 files changed, 91 insertions(+), 12 deletions(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index 7f5a0bdca228..b5376ef492f1 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -42,9 +42,19 @@ struct devlink { struct devlink_port_attrs { bool set; enum devlink_port_flavour flavour; - u32 port_number; /* same value as "split group" */ - bool split; - u32 split_subport_number; + union { /* port identifiers differ per-flavour */ + /* PHYSICAL, CPU, DSA */ + struct { + bool split; + u32 split_subport_number; + u32 port_number; /* same value as "split group" */ + }; + /* PCI_PF, PCI_VF */ + struct { + u32 pf_number; + u32 vf_number; + } pci; + }; }; struct devlink_port { @@ -568,6 +578,9 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, enum devlink_port_flavour flavour, u32 port_number, bool split, u32 split_subport_number); +void devlink_port_attrs_pci_set(struct devlink_port *devlink_port, + enum devlink_port_flavour flavour, + u32 pf_number, u32 vf_number); int devlink_port_get_phys_port_name(struct devlink_port *devlink_port, char *name, size_t len); int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, @@ -782,6 +795,12 @@ static inline void devlink_port_attrs_set(struct devlink_port *devlink_port, { } +static inline void devlink_port_attrs_pci_set(struct devlink_port *devlink_port, + enum devlink_port_flavour flavour, + u32 pf_number, u32 vf_number) +{ +} + static inline int devlink_port_get_phys_port_name(struct devlink_port *devlink_port, char *name, size_t len) diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 5bb4ea67d84f..9ce76d4f640d 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -167,6 +167,8 @@ enum devlink_port_flavour { DEVLINK_PORT_FLAVOUR_DSA, /* Distributed switch architecture * interconnect port. */ + DEVLINK_PORT_FLAVOUR_PCI_PF, /* PCI Physical function port */ + DEVLINK_PORT_FLAVOUR_PCI_VF, /* PCI Physical function port */ }; enum devlink_param_cmode { @@ -332,6 +334,9 @@ enum devlink_attr { DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME, /* string */ DEVLINK_ATTR_FLASH_UPDATE_COMPONENT, /* string */ + DEVLINK_ATTR_PORT_PCI_PF_NUMBER, /* u32 */ + DEVLINK_ATTR_PORT_PCI_VF_NUMBER, /* u32 */ + /* 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 a49dee67e66f..af177284830b 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -516,16 +516,35 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg, return 0; if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour)) return -EMSGSIZE; - if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER, attrs->port_number)) - return -EMSGSIZE; - if (!attrs->split) + + switch (attrs->flavour) { + case DEVLINK_PORT_FLAVOUR_PHYSICAL: + case DEVLINK_PORT_FLAVOUR_CPU: + case DEVLINK_PORT_FLAVOUR_DSA: + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER, + attrs->port_number)) + return -EMSGSIZE; + + if (attrs->split && + (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, + attrs->port_number) || + nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, + attrs->split_subport_number))) + return -EMSGSIZE; return 0; - if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, attrs->port_number)) - return -EMSGSIZE; - if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, - attrs->split_subport_number)) - return -EMSGSIZE; - return 0; + case DEVLINK_PORT_FLAVOUR_PCI_VF: + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_VF_NUMBER, + attrs->pci.vf_number)) + return -EMSGSIZE; + /* fall through */ + case DEVLINK_PORT_FLAVOUR_PCI_PF: + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, + attrs->pci.pf_number)) + return -EMSGSIZE; + return 0; + default: + return -EINVAL; + } } static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, @@ -5410,6 +5429,9 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, { struct devlink_port_attrs *attrs = &devlink_port->attrs; + WARN_ON(flavour == DEVLINK_PORT_FLAVOUR_PCI_PF || + flavour == DEVLINK_PORT_FLAVOUR_PCI_VF); + attrs->set = true; attrs->flavour = flavour; attrs->port_number = port_number; @@ -5419,6 +5441,32 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, } EXPORT_SYMBOL_GPL(devlink_port_attrs_set); +/** + * devlink_port_attrs_pci_set - Set port attributes for a PCI port + * + * @devlink_port: devlink port + * @flavour: flavour of the port (PF or VF only) + * @pf_number: PCI PF number, in multi-host mapping to hosts depends + * on the platform + * @vf_number: PCI VF number within given PF (ignored for PF itself) + */ +void devlink_port_attrs_pci_set(struct devlink_port *devlink_port, + enum devlink_port_flavour flavour, + u32 pf_number, u32 vf_number) +{ + struct devlink_port_attrs *attrs = &devlink_port->attrs; + + WARN_ON(flavour != DEVLINK_PORT_FLAVOUR_PCI_PF && + flavour != DEVLINK_PORT_FLAVOUR_PCI_VF); + + attrs->set = true; + attrs->flavour = flavour; + attrs->pci.pf_number = pf_number; + attrs->pci.vf_number = vf_number; + devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); +} +EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_set); + int devlink_port_get_phys_port_name(struct devlink_port *devlink_port, char *name, size_t len) { @@ -5443,6 +5491,13 @@ int devlink_port_get_phys_port_name(struct devlink_port *devlink_port, */ WARN_ON(1); return -EINVAL; + case DEVLINK_PORT_FLAVOUR_PCI_PF: + n = snprintf(name, len, "pf%u", attrs->pci.pf_number); + break; + case DEVLINK_PORT_FLAVOUR_PCI_VF: + n = snprintf(name, len, "pf%uvf%u", + attrs->pf_number, attrs->pci.vf_number); + break; } if (n >= len) -- 2.19.2