DPDK patches and discussions
 help / color / mirror / Atom feed
From: Heinrich Kuhn <heinrich.kuhn@netronome.com>
To: dev@dpdk.org
Cc: Heinrich Kuhn <heinrich.kuhn@netronome.com>,
	Simon Horman <simon.horman@corigine.com>
Subject: [dpdk-dev] [PATCH v2 1/2] net/nfp: improve PF probing logic
Date: Wed,  9 Jun 2021 16:08:13 +0200	[thread overview]
Message-ID: <20210609140814.76977-1-heinrich.kuhn@netronome.com> (raw)

When using rte_eth_dev_pci_generic_probe() during probing a
rte_eth_dev will be created with the name field corresponding to the PCI
address of the device. NFP4000/6000 devices only have a single PF (but
potentially multiple physical ports). This means that in a simple two
port example the rte_eth_devices[] array will be populated with two
devices: 0000:02:00.0 and 0000:02:00.0_port1. This is inconsistent and
not ideal. It will also cause issues when a secondary process tries to
attach to these ports.

This patch removes the use of rte_eth_dev_pci_generic_probe() and
allocates eth_dev's for each physical port during PF initialization,
giving them more consistent names.

Fixes: 5e15e799d697 ("net/nfp: create separate entity for PF device")

Signed-off-by: Heinrich Kuhn <heinrich.kuhn@netronome.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
---
 drivers/net/nfp/nfp_net.c     | 31 ++++++++-----------------------
 drivers/net/nfp/nfp_net_pmd.h |  3 ---
 2 files changed, 8 insertions(+), 26 deletions(-)

diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 2ee88fbfc7..d94c8dc727 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -58,7 +58,7 @@ static int nfp_net_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
 static int nfp_net_infos_get(struct rte_eth_dev *dev,
 			     struct rte_eth_dev_info *dev_info);
 static int nfp_net_init(struct rte_eth_dev *eth_dev);
-static int nfp_pf_init(struct rte_eth_dev *eth_dev);
+static int nfp_pf_init(struct rte_pci_device *pci_dev);
 static int nfp_pci_uninit(struct rte_eth_dev *eth_dev);
 static int nfp_init_phyports(struct nfp_pf_dev *pf_dev);
 static int nfp_net_link_update(struct rte_eth_dev *dev, int wait_to_complete);
@@ -3530,20 +3530,14 @@ static int nfp_init_phyports(struct nfp_pf_dev *pf_dev)
 			goto nfp_net_init;
 		}
 
-		/* First port has already been initialized */
-		if (i == 0) {
-			eth_dev = pf_dev->eth_dev;
-			goto skip_dev_alloc;
-		}
-
-		/* Allocate a eth_dev for remaining ports */
+		/* Allocate a eth_dev for this phyport */
 		eth_dev = rte_eth_dev_allocate(port_name);
 		if (!eth_dev) {
 			ret = -ENODEV;
 			goto port_cleanup;
 		}
 
-		/* Allocate memory for remaining ports */
+		/* Allocate memory for this phyport */
 		eth_dev->data->dev_private =
 			rte_zmalloc_socket(port_name, sizeof(struct nfp_net_hw),
 					   RTE_CACHE_LINE_SIZE, numa_node);
@@ -3553,7 +3547,6 @@ static int nfp_init_phyports(struct nfp_pf_dev *pf_dev)
 			goto port_cleanup;
 		}
 
-skip_dev_alloc:
 		hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
 
 		/* Add this device to the PF's array of physical ports */
@@ -3600,24 +3593,20 @@ static int nfp_init_phyports(struct nfp_pf_dev *pf_dev)
 	return ret;
 }
 
-static int nfp_pf_init(struct rte_eth_dev *eth_dev)
+static int nfp_pf_init(struct rte_pci_device *pci_dev)
 {
-	struct rte_pci_device *pci_dev;
-	struct nfp_net_hw *hw = NULL;
 	struct nfp_pf_dev *pf_dev = NULL;
 	struct nfp_cpp *cpp;
 	struct nfp_hwinfo *hwinfo;
 	struct nfp_rtsym_table *sym_tbl;
 	struct nfp_eth_table *nfp_eth_table = NULL;
 	struct rte_service_spec service;
+	uint32_t *nfp_cpp_service_id = NULL;
 	char name[RTE_ETH_NAME_MAX_LEN];
 	int total_ports;
 	int ret = -ENODEV;
 	int err;
 
-	pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
-	hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev);
-
 	if (!pci_dev)
 		return ret;
 
@@ -3685,7 +3674,7 @@ static int nfp_pf_init(struct rte_eth_dev *eth_dev)
 		goto sym_tbl_cleanup;
 	}
 	/* Allocate memory for the PF "device" */
-	snprintf(name, sizeof(name), "nfp_pf%d", eth_dev->data->port_id);
+	snprintf(name, sizeof(name), "nfp_pf%d", 0);
 	pf_dev = rte_zmalloc(name, sizeof(*pf_dev), 0);
 	if (!pf_dev) {
 		ret = -ENOMEM;
@@ -3703,9 +3692,6 @@ static int nfp_pf_init(struct rte_eth_dev *eth_dev)
 
 	pf_dev->pci_dev = pci_dev;
 
-	/* The first eth_dev is part of the PF struct */
-	pf_dev->eth_dev = eth_dev;
-
 	/* Map the symbol table */
 	pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, "_pf0_net_bar0",
 				     pf_dev->total_phyports * 32768,
@@ -3754,7 +3740,7 @@ static int nfp_pf_init(struct rte_eth_dev *eth_dev)
 	service.callback_userdata = (void *)cpp;
 
 	if (rte_service_component_register(&service,
-					   &hw->nfp_cpp_service_id))
+					   nfp_cpp_service_id))
 		RTE_LOG(ERR, PMD, "NFP CPP bridge service register() failed");
 	else
 		RTE_LOG(DEBUG, PMD, "NFP CPP bridge service registered");
@@ -3780,8 +3766,7 @@ static int nfp_pf_init(struct rte_eth_dev *eth_dev)
 static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 			    struct rte_pci_device *dev)
 {
-	return rte_eth_dev_pci_generic_probe(dev,
-		sizeof(struct nfp_net_hw), nfp_pf_init);
+	return nfp_pf_init(dev);
 }
 
 static const struct rte_pci_id pci_id_nfp_pf_net_map[] = {
diff --git a/drivers/net/nfp/nfp_net_pmd.h b/drivers/net/nfp/nfp_net_pmd.h
index b1303b13f5..212f9ef162 100644
--- a/drivers/net/nfp/nfp_net_pmd.h
+++ b/drivers/net/nfp/nfp_net_pmd.h
@@ -389,9 +389,6 @@ struct nfp_pf_dev {
 	/* Backpointer to associated pci device */
 	struct rte_pci_device *pci_dev;
 
-	/* First physical port's eth device */
-	struct rte_eth_dev *eth_dev;
-
 	/* Array of physical ports belonging to this PF */
 	struct nfp_net_hw *ports[NFP_MAX_PHYPORTS];
 
-- 
2.30.1 (Apple Git-130)


             reply	other threads:[~2021-06-09 14:08 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-09 14:08 Heinrich Kuhn [this message]
2021-06-09 14:08 ` [dpdk-dev] [PATCH v2 2/2] net/nfp: fix PF secondary process probing Heinrich Kuhn
2021-07-01 14:33   ` Andrew Rybchenko
2021-07-01 14:33 ` [dpdk-dev] [PATCH v2 1/2] net/nfp: improve PF probing logic Andrew Rybchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210609140814.76977-1-heinrich.kuhn@netronome.com \
    --to=heinrich.kuhn@netronome.com \
    --cc=dev@dpdk.org \
    --cc=simon.horman@corigine.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).