DPDK patches and discussions
 help / color / mirror / Atom feed
From: Chaoyong He <chaoyong.he@corigine.com>
To: dev@dpdk.org
Cc: oss-drivers@corigine.com, Peng Zhang <peng.zhang@corigine.com>,
	Chaoyong He <chaoyong.he@corigine.com>,
	Long Wu <long.wu@corigine.com>
Subject: [PATCH 08/11] net/nfp: add PF ID used to format symbols
Date: Thu,  2 Nov 2023 10:23:18 +0800	[thread overview]
Message-ID: <20231102022321.2254224-9-chaoyong.he@corigine.com> (raw)
In-Reply-To: <20231102022321.2254224-1-chaoyong.he@corigine.com>

From: Peng Zhang <peng.zhang@corigine.com>

In single PF scenario, the format symbols just is related
with PF ID 0. In multiple PF scenario, the format symbols
should be related with PF ID. So this commit adds the
PF ID used to format symbols.

Signed-off-by: Peng Zhang <peng.zhang@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c     | 109 ++++++++++++++++++++++++-------
 drivers/net/nfp/nfp_net_common.h |   2 +
 2 files changed, 86 insertions(+), 25 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 9378a2ebc3..96f0ae3fe3 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -224,11 +224,22 @@ nfp_net_set_link_down(struct rte_eth_dev *dev)
 		return nfp_eth_set_configured(dev->process_private, hw->nfp_idx, 0);
 }
 
+static uint8_t
+nfp_function_id_get(const struct nfp_pf_dev *pf_dev,
+		uint8_t phy_port)
+{
+	if (pf_dev->multi_pf.enabled)
+		return pf_dev->multi_pf.function_id;
+
+	return phy_port;
+}
+
 /* Reset and stop device. The device can not be restarted. */
 static int
 nfp_net_close(struct rte_eth_dev *dev)
 {
 	uint8_t i;
+	uint8_t id;
 	struct nfp_net_hw *hw;
 	struct nfp_pf_dev *pf_dev;
 	struct rte_pci_device *pci_dev;
@@ -264,8 +275,10 @@ nfp_net_close(struct rte_eth_dev *dev)
 	app_fw_nic->ports[hw->idx] = NULL;
 
 	for (i = 0; i < app_fw_nic->total_phyports; i++) {
+		id = nfp_function_id_get(pf_dev, i);
+
 		/* Check to see if ports are still in use */
-		if (app_fw_nic->ports[i] != NULL)
+		if (app_fw_nic->ports[id] != NULL)
 			return 0;
 	}
 
@@ -667,6 +680,19 @@ nfp_fw_upload(struct rte_pci_device *dev,
 	return 0;
 }
 
+static void
+nfp_fw_unload(struct nfp_cpp *cpp)
+{
+	struct nfp_nsp *nsp;
+
+	nsp = nfp_nsp_open(cpp);
+	if (nsp == NULL)
+		return;
+
+	nfp_nsp_device_soft_reset(nsp);
+	nfp_nsp_close(nsp);
+}
+
 static int
 nfp_fw_setup(struct rte_pci_device *dev,
 		struct nfp_cpp *cpp,
@@ -751,6 +777,7 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,
 		const struct nfp_dev_info *dev_info)
 {
 	uint8_t i;
+	uint8_t id;
 	int ret = 0;
 	uint32_t total_vnics;
 	struct nfp_net_hw *hw;
@@ -758,10 +785,13 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,
 	struct rte_eth_dev *eth_dev;
 	struct nfp_app_fw_nic *app_fw_nic;
 	struct nfp_eth_table *nfp_eth_table;
+	char bar_name[RTE_ETH_NAME_MAX_LEN];
 	char port_name[RTE_ETH_NAME_MAX_LEN];
+	char vnic_name[RTE_ETH_NAME_MAX_LEN];
 
 	nfp_eth_table = pf_dev->nfp_eth_table;
 	PMD_INIT_LOG(INFO, "Total physical ports: %d", nfp_eth_table->count);
+	id = nfp_function_id_get(pf_dev, 0);
 
 	/* Allocate memory for the CoreNIC app */
 	app_fw_nic = rte_zmalloc("nfp_app_fw_nic", sizeof(*app_fw_nic), 0);
@@ -772,9 +802,10 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,
 	pf_dev->app_fw_priv = app_fw_nic;
 
 	/* Read the number of vNIC's created for the PF */
-	total_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, "nfd_cfg_pf0_num_ports", &ret);
+	snprintf(vnic_name, sizeof(vnic_name), "nfd_cfg_pf%u_num_ports", id);
+	total_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, vnic_name, &ret);
 	if (ret != 0 || total_vnics == 0 || total_vnics > 8) {
-		PMD_INIT_LOG(ERR, "nfd_cfg_pf0_num_ports symbol with wrong value");
+		PMD_INIT_LOG(ERR, "%s symbol with wrong value", vnic_name);
 		ret = -ENODEV;
 		goto app_cleanup;
 	}
@@ -804,11 +835,12 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,
 		app_fw_nic->multiport = true;
 
 	/* Map the symbol table */
-	pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, "_pf0_net_bar0",
+	snprintf(bar_name, sizeof(bar_name), "_pf%u_net_bar0", id);
+	pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, bar_name,
 			app_fw_nic->total_phyports * NFP_NET_CFG_BAR_SZ,
 			&pf_dev->ctrl_area);
 	if (pf_dev->ctrl_bar == NULL) {
-		PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for _pf0_net_ctrl_bar");
+		PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for %s", bar_name);
 		ret = -EIO;
 		goto app_cleanup;
 	}
@@ -818,8 +850,9 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,
 	/* Loop through all physical ports on PF */
 	numa_node = rte_socket_id();
 	for (i = 0; i < app_fw_nic->total_phyports; i++) {
-		snprintf(port_name, sizeof(port_name), "%s_port%d",
-				pf_dev->pci_dev->device.name, i);
+		id = nfp_function_id_get(pf_dev, i);
+		snprintf(port_name, sizeof(port_name), "%s_port%u",
+				pf_dev->pci_dev->device.name, id);
 
 		/* Allocate a eth_dev for this phyport */
 		eth_dev = rte_eth_dev_allocate(port_name);
@@ -841,14 +874,14 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,
 		hw = eth_dev->data->dev_private;
 
 		/* Add this device to the PF's array of physical ports */
-		app_fw_nic->ports[i] = hw;
+		app_fw_nic->ports[id] = hw;
 
 		hw->dev_info = dev_info;
 		hw->pf_dev = pf_dev;
 		hw->cpp = pf_dev->cpp;
 		hw->eth_dev = eth_dev;
-		hw->idx = i;
-		hw->nfp_idx = nfp_eth_table->ports[i].index;
+		hw->idx = id;
+		hw->nfp_idx = nfp_eth_table->ports[id].index;
 
 		eth_dev->device = &pf_dev->pci_dev->device;
 
@@ -870,13 +903,15 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,
 
 port_cleanup:
 	for (i = 0; i < app_fw_nic->total_phyports; i++) {
-		if (app_fw_nic->ports[i] != NULL &&
-				app_fw_nic->ports[i]->eth_dev != NULL) {
+		id = nfp_function_id_get(pf_dev, i);
+
+		if (app_fw_nic->ports[id] != NULL &&
+				app_fw_nic->ports[id]->eth_dev != NULL) {
 			struct rte_eth_dev *tmp_dev;
-			tmp_dev = app_fw_nic->ports[i]->eth_dev;
+			tmp_dev = app_fw_nic->ports[id]->eth_dev;
 			nfp_ipsec_uninit(tmp_dev);
 			rte_eth_dev_release_port(tmp_dev);
-			app_fw_nic->ports[i] = NULL;
+			app_fw_nic->ports[id] = NULL;
 		}
 	}
 	nfp_cpp_area_free(pf_dev->ctrl_area);
@@ -890,15 +925,19 @@ static int
 nfp_pf_init(struct rte_pci_device *pci_dev)
 {
 	uint32_t i;
+	uint32_t id;
 	int ret = 0;
 	uint64_t addr;
+	uint32_t index;
 	uint32_t cpp_id;
+	uint8_t function_id;
 	struct nfp_cpp *cpp;
 	struct nfp_pf_dev *pf_dev;
 	struct nfp_hwinfo *hwinfo;
 	enum nfp_app_fw_id app_fw_id;
 	char name[RTE_ETH_NAME_MAX_LEN];
 	struct nfp_rtsym_table *sym_tbl;
+	char app_name[RTE_ETH_NAME_MAX_LEN];
 	struct nfp_eth_table *nfp_eth_table;
 	const struct nfp_dev_info *dev_info;
 
@@ -917,7 +956,8 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
 	}
 
 	/* Allocate memory for the PF "device" */
-	snprintf(name, sizeof(name), "nfp_pf%d", 0);
+	function_id = (pci_dev->addr.function) & 0x07;
+	snprintf(name, sizeof(name), "nfp_pf%u", function_id);
 	pf_dev = rte_zmalloc(name, sizeof(*pf_dev), 0);
 	if (pf_dev == NULL) {
 		PMD_INIT_LOG(ERR, "Can't allocate memory for the PF device");
@@ -958,10 +998,14 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
 	}
 
 	pf_dev->multi_pf.enabled = nfp_check_multi_pf_from_nsp(pci_dev, cpp);
+	pf_dev->multi_pf.function_id = function_id;
 
 	/* Force the physical port down to clear the possible DMA error */
-	for (i = 0; i < nfp_eth_table->count; i++)
-		nfp_eth_set_configured(cpp, nfp_eth_table->ports[i].index, 0);
+	for (i = 0; i < nfp_eth_table->count; i++) {
+		id = nfp_function_id_get(pf_dev, i);
+		index = nfp_eth_table->ports[id].index;
+		nfp_eth_set_configured(cpp, index, 0);
+	}
 
 	if (nfp_fw_setup(pci_dev, cpp, nfp_eth_table, hwinfo) != 0) {
 		PMD_INIT_LOG(ERR, "Error when uploading firmware");
@@ -974,13 +1018,14 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
 	if (sym_tbl == NULL) {
 		PMD_INIT_LOG(ERR, "Something is wrong with the firmware symbol table");
 		ret = -EIO;
-		goto eth_table_cleanup;
+		goto fw_cleanup;
 	}
 
 	/* Read the app ID of the firmware loaded */
-	app_fw_id = nfp_rtsym_read_le(sym_tbl, "_pf0_net_app_id", &ret);
+	snprintf(app_name, sizeof(app_name), "_pf%u_net_app_id", function_id);
+	app_fw_id = nfp_rtsym_read_le(sym_tbl, app_name, &ret);
 	if (ret != 0) {
-		PMD_INIT_LOG(ERR, "Couldn't read app_fw_id from fw");
+		PMD_INIT_LOG(ERR, "Couldn't read %s from firmware", app_name);
 		ret = -EIO;
 		goto sym_tbl_cleanup;
 	}
@@ -1045,6 +1090,8 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
 	nfp_cpp_area_free(pf_dev->qc_area);
 sym_tbl_cleanup:
 	free(sym_tbl);
+fw_cleanup:
+	nfp_fw_unload(cpp);
 eth_table_cleanup:
 	free(nfp_eth_table);
 hwinfo_cleanup:
@@ -1063,21 +1110,29 @@ nfp_secondary_init_app_fw_nic(struct nfp_pf_dev *pf_dev)
 	uint32_t i;
 	int err = 0;
 	int ret = 0;
+	uint8_t function_id;
 	uint32_t total_vnics;
 	struct nfp_net_hw *hw;
+	char pf_name[RTE_ETH_NAME_MAX_LEN];
 
 	/* Read the number of vNIC's created for the PF */
-	total_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, "nfd_cfg_pf0_num_ports", &err);
+	function_id = (pf_dev->pci_dev->addr.function) & 0x07;
+	snprintf(pf_name, sizeof(pf_name), "nfd_cfg_pf%u_num_ports", function_id);
+	total_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, pf_name, &err);
 	if (err != 0 || total_vnics == 0 || total_vnics > 8) {
-		PMD_INIT_LOG(ERR, "nfd_cfg_pf0_num_ports symbol with wrong value");
+		PMD_INIT_LOG(ERR, "%s symbol with wrong value", pf_name);
 		return -ENODEV;
 	}
 
 	for (i = 0; i < total_vnics; i++) {
+		uint32_t id = i;
 		struct rte_eth_dev *eth_dev;
 		char port_name[RTE_ETH_NAME_MAX_LEN];
+
+		if (nfp_check_multi_pf_from_fw(total_vnics))
+			id = function_id;
 		snprintf(port_name, sizeof(port_name), "%s_port%u",
-				pf_dev->pci_dev->device.name, i);
+				pf_dev->pci_dev->device.name, id);
 
 		PMD_INIT_LOG(DEBUG, "Secondary attaching to port %s", port_name);
 		eth_dev = rte_eth_dev_attach_secondary(port_name);
@@ -1107,11 +1162,13 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)
 {
 	int ret = 0;
 	struct nfp_cpp *cpp;
+	uint8_t function_id;
 	struct nfp_pf_dev *pf_dev;
 	enum nfp_app_fw_id app_fw_id;
 	char name[RTE_ETH_NAME_MAX_LEN];
 	struct nfp_rtsym_table *sym_tbl;
 	const struct nfp_dev_info *dev_info;
+	char app_name[RTE_ETH_NAME_MAX_LEN];
 
 	if (pci_dev == NULL)
 		return -ENODEV;
@@ -1165,9 +1222,11 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)
 	}
 
 	/* Read the app ID of the firmware loaded */
-	app_fw_id = nfp_rtsym_read_le(sym_tbl, "_pf0_net_app_id", &ret);
+	function_id = pci_dev->addr.function & 0x7;
+	snprintf(app_name, sizeof(app_name), "_pf%u_net_app_id", function_id);
+	app_fw_id = nfp_rtsym_read_le(sym_tbl, app_name, &ret);
 	if (ret != 0) {
-		PMD_INIT_LOG(ERR, "Couldn't read app_fw_id from fw");
+		PMD_INIT_LOG(ERR, "Couldn't read %s from fw", app_name);
 		ret = -EIO;
 		goto sym_tbl_cleanup;
 	}
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index bd0ed077c5..a40ddfd985 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -57,6 +57,8 @@ struct nfp_net_tlv_caps {
 struct nfp_multi_pf {
 	/** Support multiple PF */
 	bool enabled;
+	/** Function index */
+	uint8_t function_id;
 };
 
 struct nfp_pf_dev {
-- 
2.39.1


  parent reply	other threads:[~2023-11-02  2:24 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-02  2:23 [PATCH 00/11] Add the support of multiple PF Chaoyong He
2023-11-02  2:23 ` [PATCH 01/11] net/nfp: refactor the probe logic of the secondary process Chaoyong He
2023-11-02  2:23 ` [PATCH 02/11] net/nfp: fix the failure to initialize the LSC mask Chaoyong He
2023-11-02  2:23 ` [PATCH 03/11] net/nfp: fix the DMA error caused by app exit abnormally Chaoyong He
2023-11-02  2:23 ` [PATCH 04/11] net/nfp: add flag to indicate multiple PFs support Chaoyong He
2023-11-02  2:23 ` [PATCH 05/11] net/nfp: add major version to nsp commands Chaoyong He
2023-11-02  2:23 ` [PATCH 06/11] net/nfp: adjust physical port check for multiple PFs Chaoyong He
2023-11-02  2:23 ` [PATCH 07/11] net/nfp: add the check about the firmware load Chaoyong He
2023-11-02  2:23 ` Chaoyong He [this message]
2023-11-02  2:23 ` [PATCH 09/11] net/nfp: add nsp command to check if firmware is loaded Chaoyong He
2023-11-02  2:23 ` [PATCH 10/11] net/nfp: introduce keepalive mechanism for multiple PF Chaoyong He
2023-11-02  2:23 ` [PATCH 11/11] drivers: enable multiple PF in application firmware Chaoyong He
2023-11-02 14:52 ` [PATCH 00/11] Add the support of multiple PF Ferruh Yigit

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=20231102022321.2254224-9-chaoyong.he@corigine.com \
    --to=chaoyong.he@corigine.com \
    --cc=dev@dpdk.org \
    --cc=long.wu@corigine.com \
    --cc=oss-drivers@corigine.com \
    --cc=peng.zhang@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).