[PATCH 6/9] net/nfp: initialize the representor port of the multiple PF
Chaoyong He
chaoyong.he at corigine.com
Mon Oct 21 08:32:58 CEST 2024
From: Peng Zhang <peng.zhang at corigine.com>
When using multiple PF firmware, add the process of initialize
the representor port and revise the corresponding logic in the
close function.
Signed-off-by: Peng Zhang <peng.zhang at corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he at corigine.com>
Reviewed-by: Long Wu <long.wu at corigine.com>
---
.../net/nfp/flower/nfp_flower_representor.c | 80 ++++++++++++++++---
1 file changed, 69 insertions(+), 11 deletions(-)
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c
index f769123174..c096862a0f 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.c
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c
@@ -373,9 +373,15 @@ static void
nfp_flower_repr_close_queue(struct rte_eth_dev *eth_dev,
enum nfp_repr_type repr_type)
{
+ struct nfp_net_hw_priv *hw_priv;
+
switch (repr_type) {
case NFP_REPR_TYPE_PHYS_PORT:
- nfp_flower_repr_free_queue(eth_dev);
+ hw_priv = eth_dev->process_private;
+ if (hw_priv->pf_dev->multi_pf.enabled)
+ nfp_flower_pf_repr_close_queue(eth_dev);
+ else
+ nfp_flower_repr_free_queue(eth_dev);
break;
case NFP_REPR_TYPE_PF:
nfp_flower_pf_repr_close_queue(eth_dev);
@@ -757,6 +763,51 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev,
return ret;
}
+static int
+nfp_flower_multiple_pf_repr_init(struct rte_eth_dev *eth_dev,
+ void *init_params)
+{
+ int ret;
+ uint16_t index;
+ struct nfp_repr_init *repr_init;
+ struct nfp_net_hw_priv *hw_priv;
+ struct nfp_flower_representor *repr;
+ struct nfp_app_fw_flower *app_fw_flower;
+
+ /* Cast the input representor data to the correct struct here */
+ repr_init = init_params;
+ app_fw_flower = repr_init->flower_repr->app_fw_flower;
+
+ /* Memory has been allocated in the eth_dev_create() function */
+ repr = eth_dev->data->dev_private;
+ hw_priv = repr_init->hw_priv;
+
+ eth_dev->dev_ops = &nfp_flower_pf_repr_dev_ops;
+ eth_dev->rx_pkt_burst = nfp_net_recv_pkts;
+ eth_dev->tx_pkt_burst = nfp_flower_pf_xmit_pkts;
+ eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR |
+ RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
+
+ ret = nfp_flower_repr_base_init(eth_dev, repr, repr_init);
+ if (ret < 0) {
+ PMD_DRV_LOG(ERR, "Flower multiple PF repr base init failed.");
+ return -ENOMEM;
+ }
+
+ eth_dev->data->representor_id = repr->vf_id;
+
+ /* Add repr to correct array */
+ index = NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(repr->port_id);
+ app_fw_flower->phy_reprs[index] = repr;
+
+ repr->mac_stats = hw_priv->pf_dev->mac_stats_bar +
+ (repr->nfp_idx * NFP_MAC_STATS_SIZE);
+
+ app_fw_flower->pf_ethdev = eth_dev;
+
+ return 0;
+}
+
static void
nfp_flower_repr_free_all(struct nfp_app_fw_flower *app_fw_flower)
{
@@ -833,6 +884,7 @@ nfp_flower_phy_repr_alloc(struct nfp_net_hw_priv *hw_priv,
int ret;
uint8_t id;
struct nfp_pf_dev *pf_dev;
+ ethdev_init_t ethdev_init;
struct nfp_repr_init repr_init;
struct nfp_eth_table_port *eth_port;
struct nfp_app_fw_flower *app_fw_flower;
@@ -846,21 +898,29 @@ nfp_flower_phy_repr_alloc(struct nfp_net_hw_priv *hw_priv,
flower_repr->repr_type = NFP_REPR_TYPE_PHYS_PORT;
flower_repr->port_id = nfp_flower_get_phys_port_id(eth_port->index);
flower_repr->nfp_idx = eth_port->index;
- flower_repr->vf_id = i + 1;
/* Copy the real mac of the interface to the representor struct */
rte_ether_addr_copy(ð_port->mac_addr, &flower_repr->mac_addr);
- snprintf(flower_repr->name, sizeof(flower_repr->name),
- "%s_repr_p%d", pci_name, id);
/*
* Create a eth_dev for this representor.
* This will also allocate private memory for the device.
*/
repr_init.flower_repr = flower_repr;
+ if (pf_dev->multi_pf.enabled) {
+ repr_init.flower_repr->vf_id = i;
+ snprintf(flower_repr->name, sizeof(flower_repr->name),
+ "%s_repr_p", pci_name);
+ ethdev_init = nfp_flower_multiple_pf_repr_init;
+ } else {
+ repr_init.flower_repr->vf_id = i + 1;
+ snprintf(flower_repr->name, sizeof(flower_repr->name),
+ "%s_repr_p%d", pci_name, id);
+ ethdev_init = nfp_flower_repr_init;
+ }
ret = rte_eth_dev_create(&pf_dev->pci_dev->device, flower_repr->name,
sizeof(struct nfp_flower_representor),
- NULL, NULL, nfp_flower_repr_init, &repr_init);
+ NULL, NULL, ethdev_init, &repr_init);
if (ret != 0) {
PMD_INIT_LOG(ERR, "Could not create eth_dev for repr.");
break;
@@ -925,6 +985,8 @@ nfp_flower_pf_repr_alloc(struct nfp_net_hw_priv *hw_priv,
struct nfp_pf_dev *pf_dev;
pf_dev = hw_priv->pf_dev;
+ if (pf_dev->multi_pf.enabled)
+ return 0;
/* Create a rte_eth_dev for PF vNIC representor */
flower_repr->repr_type = NFP_REPR_TYPE_PF;
@@ -932,12 +994,8 @@ nfp_flower_pf_repr_alloc(struct nfp_net_hw_priv *hw_priv,
/* PF vNIC reprs get a random MAC address */
rte_eth_random_addr(flower_repr->mac_addr.addr_bytes);
- if (pf_dev->multi_pf.enabled)
- snprintf(flower_repr->name, sizeof(flower_repr->name),
- "%s_repr_pf%d", pci_name, pf_dev->multi_pf.function_id);
- else
- snprintf(flower_repr->name, sizeof(flower_repr->name),
- "%s_repr_pf", pci_name);
+ snprintf(flower_repr->name, sizeof(flower_repr->name),
+ "%s_repr_pf", pci_name);
/* Create a eth_dev for this representor */
ret = rte_eth_dev_create(&pf_dev->pci_dev->device, flower_repr->name,
--
2.39.1
More information about the dev
mailing list