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,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 8D62EC43381 for ; Fri, 1 Mar 2019 18:05:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 495B020842 for ; Fri, 1 Mar 2019 18:05:16 +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="WcUqc2vl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387795AbfCASFP (ORCPT ); Fri, 1 Mar 2019 13:05:15 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:34645 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733302AbfCASFO (ORCPT ); Fri, 1 Mar 2019 13:05:14 -0500 Received: by mail-qt1-f196.google.com with SMTP id w4so28847380qtc.1 for ; Fri, 01 Mar 2019 10:05:12 -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=dkxqCcKmcbbKbQf4+9VKf9QHumM0dteS/XLBhbo1Djg=; b=WcUqc2vl7LNuyw/vwg8VNPRyoJL0U3rs+Za10AroFd136ITcLr0HxWZV1eVa2boDqS Rdov4hnRLTjYStyYjNlNySJZgwKEqqyr9qG5Z8rk6CC0tbVOnZ9NHJ4Et4IbZbo+cJre SJZrl/ckCfkYoIl5tXQJEZwdAZd4HUKfR8xDHl8oOHjLfFOj0wxdc/3u8lXN23SbvwT+ Ud6VnLZn9nju1NNKS2XSDJH2gFJDDjMfkIX5DvprW+dLOvEyrJghCOu6tv/80NBTicO3 NWi4chZCh4zfeplJ/+1FOxsXtPZCw4XtZbmiGfhF+e9VkTrWKT/IeM7jDPq7ljC/d9HX JhEA== 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=dkxqCcKmcbbKbQf4+9VKf9QHumM0dteS/XLBhbo1Djg=; b=bqszHWKcnAJExmJ+KCz+BNCrOFbThtGEyEfkju8+Pi5++r8hAVAuhS1lzbEmkSK/+i dHa+86qKN3WWxWG6u0NDuAfPSwvKICj/xPLc8wg7gfnqPRdOEjUg/5NYeIbFwS7Ym9lU RUu1EF9Rf0MjguGqrIg8Phaf8PzvzlHdtGd6Z4nO1Z6OV0jeizYhM7oC6Yju7CC6g8t9 efxgvFht7Cgkk5iUmylflF4btZBCyJzS5aIpdfQio/XA3wXmV8wz3s3F5oA2oN89XGbK J+8lyRl3BG/JojMndNcavpRvvcgovHJYpGGahsfM3LJ/idBIgpyCoMDMOp9mmPQvFSjT hSRw== X-Gm-Message-State: APjAAAWwR06ncsHU0uBKN8TQyxIzhNbf526p1GbO+kz9kdTjpKfBom7n y20FFvX86bgl41fOJ9VsAd85Lw== X-Google-Smtp-Source: APXvYqz83n+EQpXLT1b0uJfaG/uM4W+rN3Hy5lnjs9Zo2ES5H4FCmho/4ul8P2H3/4VatniBwhkQBw== X-Received: by 2002:ac8:1bf7:: with SMTP id m52mr5157041qtk.200.1551463512232; Fri, 01 Mar 2019 10:05:12 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([66.60.152.14]) by smtp.gmail.com with ESMTPSA id a13sm16785792qtb.6.2019.03.01.10.05.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Mar 2019 10:05:11 -0800 (PST) From: Jakub Kicinski To: jiri@resnulli.us, davem@davemloft.net Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Jakub Kicinski Subject: [PATCH net-next v2 4/7] devlink: allow subports on devlink PCI ports Date: Fri, 1 Mar 2019 10:04:50 -0800 Message-Id: <20190301180453.17778-5-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190301180453.17778-1-jakub.kicinski@netronome.com> References: <20190301180453.17778-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 PCI endpoint corresponds to a PCI device, but such device can have one more more logical device ports associated with it. We need a way to distinguish those. Add a PCI subport in the dumps and print the info in phys_port_name appropriately. This is not equivalent to port splitting, there is no split group. It's just a way of representing multiple netdevs on a single PCI function. Note that the quality of being multiport pertains only to the PCI function itself. A PF having multiple netdevs does not mean that its VFs will also have multiple, or that VFs are associated with any particular port of a multiport VF. Example (bus 05 device has subports, bus 82 has only one port per function): $ devlink port pci/0000:05:00.0/0: type eth netdev enp5s0np0 flavour physical pci/0000:05:00.0/10000: type eth netdev enp5s0npf0s0 flavour pci_pf pf 0 subport 0 pci/0000:05:00.0/4: type eth netdev enp5s0np1 flavour physical pci/0000:05:00.0/11000: type eth netdev enp5s0npf0s1 flavour pci_pf pf 0 subport 1 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 $ devlink -jp port { "port": { "pci/0000:05:00.0/0": { "type": "eth", "netdev": "enp5s0np0", "flavour": "physical" }, "pci/0000:05:00.0/10000": { "type": "eth", "netdev": "enp5s0npf0s0", "flavour": "pci_pf", "pf": 0, "subport": 0 }, "pci/0000:05:00.0/4": { "type": "eth", "netdev": "enp5s0np1", "flavour": "physical" }, "pci/0000:05:00.0/11000": { "type": "eth", "netdev": "enp5s0npf0s1", "flavour": "pci_pf", "pf": 0, "subport": 1 }, "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 } } } Signed-off-by: Jakub Kicinski --- .../net/ethernet/netronome/nfp/nfp_devlink.c | 6 ++-- include/net/devlink.h | 13 ++++--- include/uapi/linux/devlink.h | 1 + net/core/devlink.c | 36 ++++++++++++++++--- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c index bf7fd9614152..6ad2805f1efc 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c @@ -378,12 +378,14 @@ int nfp_devlink_port_init(struct nfp_app *app, struct nfp_port *port) return nfp_devlink_port_init_phys(devlink, port); case NFP_PORT_PF_PORT: devlink_port_type_eth_set(&port->dl_port, port->netdev); - devlink_port_attrs_pci_pf_set(&port->dl_port, port->pf_id); + devlink_port_attrs_pci_pf_set(&port->dl_port, port->pf_id, + port->pf_split, + port->pf_split_id); return 0; case NFP_PORT_VF_PORT: devlink_port_type_eth_set(&port->dl_port, port->netdev); devlink_port_attrs_pci_vf_set(&port->dl_port, port->pf_id, - port->vf_id); + port->vf_id, false, 0); return 0; default: return -EINVAL; diff --git a/include/net/devlink.h b/include/net/devlink.h index 00ceff76762c..6a29ce80cb38 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -53,6 +53,8 @@ struct devlink_port_attrs { struct { u32 pf_number; u32 vf_number; + bool multiport; + u32 subport_number; } pci; }; }; @@ -579,9 +581,11 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, u32 port_number, bool split, u32 split_subport_number); void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, - u32 pf_number); + u32 pf_number, bool multiport, + u32 subport_number); void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, - u32 pf_number, u32 vf_number); + u32 pf_number, u32 vf_number, bool multiport, + u32 subport_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, @@ -798,13 +802,14 @@ static inline void devlink_port_attrs_set(struct devlink_port *devlink_port, static inline void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, - u32 pf_number) + u32 pf_number, bool multiport, u32 subport_number) { } static inline void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, - u32 pf_number, u32 vf_number) + u32 pf_number, u32 vf_number, bool multiport, + u32 subport_number) { } diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 9ce76d4f640d..417ae8233cce 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -336,6 +336,7 @@ enum devlink_attr { DEVLINK_ATTR_PORT_PCI_PF_NUMBER, /* u32 */ DEVLINK_ATTR_PORT_PCI_VF_NUMBER, /* u32 */ + DEVLINK_ATTR_PORT_PCI_SUBPORT, /* u32 */ /* add new attributes above here, update the policy in devlink.c */ diff --git a/net/core/devlink.c b/net/core/devlink.c index 49216b688c5b..a7dd958be513 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -541,6 +541,11 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg, if (nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, attrs->pci.pf_number)) return -EMSGSIZE; + + if (attrs->pci.multiport && + nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_SUBPORT, + attrs->pci.subport_number)) + return -EMSGSIZE; return 0; default: return -EINVAL; @@ -5449,15 +5454,20 @@ EXPORT_SYMBOL_GPL(devlink_port_attrs_set); * @devlink_port: devlink port * @pf_number: PCI PF number, in multi-host mapping to hosts depends * on the platform + * @multiport: PCI function has more than one logical port + * @subport_number: PCI function has more than one logical port */ void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, - u32 pf_number) + u32 pf_number, bool multiport, + u32 subport_number) { struct devlink_port_attrs *attrs = &devlink_port->attrs; attrs->set = true; attrs->flavour = DEVLINK_PORT_FLAVOUR_PCI_PF; attrs->pci.pf_number = pf_number; + attrs->pci.multiport = multiport; + attrs->pci.subport_number = subport_number; devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); } EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set); @@ -5469,9 +5479,12 @@ EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set); * @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) + * @multiport: PCI function has more than one logical port + * @subport_number: PCI function has more than one logical port */ void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, - u32 pf_number, u32 vf_number) + u32 pf_number, u32 vf_number, bool multiport, + u32 subport_number) { struct devlink_port_attrs *attrs = &devlink_port->attrs; @@ -5479,6 +5492,8 @@ void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, attrs->flavour = DEVLINK_PORT_FLAVOUR_PCI_VF; attrs->pci.pf_number = pf_number; attrs->pci.vf_number = vf_number; + attrs->pci.multiport = multiport; + attrs->pci.subport_number = subport_number; devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); } EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set); @@ -5508,11 +5523,22 @@ 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); + if (!attrs->pci.multiport) + n = snprintf(name, len, "pf%u", attrs->pci.pf_number); + else + n = snprintf(name, len, "pf%us%u", attrs->pci.pf_number, + attrs->pci.subport_number); break; case DEVLINK_PORT_FLAVOUR_PCI_VF: - n = snprintf(name, len, "pf%uvf%u", - attrs->pci.pf_number, attrs->pci.vf_number); + if (!attrs->pci.multiport) + n = snprintf(name, len, "pf%uvf%u", + attrs->pci.pf_number, + attrs->pci.vf_number); + else + n = snprintf(name, len, "pf%uvf%us%u", + attrs->pci.pf_number, + attrs->pci.vf_number, + attrs->pci.subport_number); break; } -- 2.19.2