From: Peng Zhang <peng.zh...@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.zh...@corigine.com> Reviewed-by: Chaoyong He <chaoyong...@corigine.com> Reviewed-by: Long Wu <long...@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