]> git.droids-corp.org - dpdk.git/commitdiff
net/nfp: support firmware with NFDk
authorJin Liu <jin.liu@corigine.com>
Fri, 17 Jun 2022 09:34:38 +0000 (11:34 +0200)
committerFerruh Yigit <ferruh.yigit@xilinx.com>
Fri, 17 Jun 2022 13:32:41 +0000 (15:32 +0200)
Modify nfp driver logic, add firmware version (NFD3 or NFDK) judgment, will
according to the firmware version, mount different driver functions.

Signed-off-by: Jin Liu <jin.liu@corigine.com>
Signed-off-by: Diana Wang <na.wang@corigine.com>
Signed-off-by: Peng Zhang <peng.zhang@corigine.com>
Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Signed-off-by: Niklas Söderlund <niklas.soderlund@corigine.com>
doc/guides/nics/nfp.rst
doc/guides/rel_notes/release_22_07.rst
drivers/net/nfp/nfp_ctrl.h
drivers/net/nfp/nfp_ethdev.c
drivers/net/nfp/nfp_ethdev_vf.c

index dcefac3ef6e6d7533a73a4c12248336a49e0d401..55539accc27917616335a65480b947234df5dac7 100644 (file)
@@ -100,9 +100,10 @@ more than one SmartNIC, same type of SmartNIC or different ones, and to upload a
 different firmware to each SmartNIC.
 
    .. Note::
-      Currently the NFP PMD supports using the PF with Agilio Basic Firmware. See
-      https://help.netronome.com/support/solutions for more information on the
-      various firmwares supported by the Netronome Agilio CX smartNIC.
+      Currently the NFP PMD supports using the PF with Agilio Firmware with NFD3
+      and Agilio Firmware with NFDk. See https://help.netronome.com/support/solutions
+      for more information on the various firmwares supported by the Netronome
+      Agilio CX smartNIC.
 
 PF multiport support
 --------------------
index 98db21c6e4935d707aba57cc311e35f19f43d778..97d1a7d945487ac2d251387713a0b26bff52b02c 100644 (file)
@@ -160,6 +160,7 @@ New Features
 * **Updated Netronome nfp driver.**
 
   * Added support for NFP3800 NIC.
+  * Added support for firmware with NFDk.
 
 * **Updated VMware vmxnet3 networking driver.**
 
index 4dd62ef1943f7520e1484a64db2e20888830b826..e73715e2aa711dae712b34d4908d6860ba1f609c 100644 (file)
  * - define more STS bits
  */
 #define NFP_NET_CFG_VERSION             0x0030
+#define   NFP_NET_CFG_VERSION_DP_NFD3   0
+#define   NFP_NET_CFG_VERSION_DP_NFDK   1
 #define   NFP_NET_CFG_VERSION_RESERVED_MASK    (0xff << 24)
 #define   NFP_NET_CFG_VERSION_CLASS_MASK  (0xff << 16)
 #define   NFP_NET_CFG_VERSION_CLASS(x)    (((x) & 0xff) << 16)
index cb84dc31889e42a336186136ba72688e0f07edf6..1bbba9187e4b9b178ae9bff61d644a951373f8e4 100644 (file)
@@ -358,6 +358,32 @@ static const struct eth_dev_ops nfp_net_nfd3_eth_dev_ops = {
        .rx_queue_intr_disable  = nfp_rx_queue_intr_disable,
 };
 
+static inline int
+nfp_net_ethdev_ops_mount(struct nfp_net_hw *hw, struct rte_eth_dev *eth_dev)
+{
+       switch (NFD_CFG_CLASS_VER_of(hw->ver)) {
+       case NFP_NET_CFG_VERSION_DP_NFD3:
+               break;
+       case NFP_NET_CFG_VERSION_DP_NFDK:
+               if (NFD_CFG_MAJOR_VERSION_of(hw->ver) < 5) {
+                       PMD_DRV_LOG(ERR, "NFDK must use ABI 5 or newer, found: %d",
+                               NFD_CFG_MAJOR_VERSION_of(hw->ver));
+                       return -EINVAL;
+               }
+               break;
+       default:
+               PMD_DRV_LOG(ERR, "The version of firmware is not correct.");
+               return -EINVAL;
+       }
+
+       eth_dev->dev_ops = &nfp_net_nfd3_eth_dev_ops;
+       eth_dev->rx_queue_count = nfp_net_rx_queue_count;
+       eth_dev->rx_pkt_burst = &nfp_net_recv_pkts;
+       eth_dev->tx_pkt_burst = &nfp_net_nfd3_xmit_pkts;
+
+       return 0;
+}
+
 static int
 nfp_net_init(struct rte_eth_dev *eth_dev)
 {
@@ -402,11 +428,6 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
        PMD_INIT_LOG(DEBUG, "Working with physical port number: %d, "
                        "NFP internal port number: %d", port, hw->nfp_idx);
 
-       eth_dev->dev_ops = &nfp_net_nfd3_eth_dev_ops;
-       eth_dev->rx_queue_count = nfp_net_rx_queue_count;
-       eth_dev->rx_pkt_burst = &nfp_net_recv_pkts;
-       eth_dev->tx_pkt_burst = &nfp_net_nfd3_xmit_pkts;
-
        /* For secondary processes, the primary has done all the work */
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
                return 0;
@@ -441,6 +462,11 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
 
        PMD_INIT_LOG(DEBUG, "ctrl bar: %p", hw->ctrl_bar);
 
+       hw->ver = nn_cfg_readl(hw, NFP_NET_CFG_VERSION);
+
+       if (nfp_net_ethdev_ops_mount(hw, eth_dev))
+               return -EINVAL;
+
        hw->max_rx_queues = nn_cfg_readl(hw, NFP_NET_CFG_MAX_RXRINGS);
        hw->max_tx_queues = nn_cfg_readl(hw, NFP_NET_CFG_MAX_TXRINGS);
 
@@ -473,7 +499,6 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
        nfp_net_cfg_queue_setup(hw);
 
        /* Get some of the read-only fields from the config BAR */
-       hw->ver = nn_cfg_readl(hw, NFP_NET_CFG_VERSION);
        hw->cap = nn_cfg_readl(hw, NFP_NET_CFG_CAP);
        hw->max_mtu = nn_cfg_readl(hw, NFP_NET_CFG_MAX_MTU);
        hw->mtu = RTE_ETHER_MTU;
@@ -939,6 +964,7 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)
        int err;
        int total_ports;
        struct nfp_cpp *cpp;
+       struct nfp_net_hw *hw;
        struct nfp_rtsym_table *sym_tbl;
 
        if (pci_dev == NULL)
@@ -988,11 +1014,14 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)
                                "secondary process attach failed, ethdev doesn't exist");
                        return -ENODEV;
                }
+
+               hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
+
+               if (nfp_net_ethdev_ops_mount(hw, eth_dev))
+                       return -EINVAL;
+
                eth_dev->process_private = cpp;
-               eth_dev->dev_ops = &nfp_net_nfd3_eth_dev_ops;
-               eth_dev->rx_queue_count = nfp_net_rx_queue_count;
-               eth_dev->rx_pkt_burst = &nfp_net_recv_pkts;
-               eth_dev->tx_pkt_burst = &nfp_net_nfd3_xmit_pkts;
+
                rte_eth_dev_probing_finish(eth_dev);
        }
 
index c46ee0f91342fbd3f4e17b71aef563d70ead7090..0b4660aba6f08d1be9220cb7340270633d549483 100644 (file)
@@ -265,6 +265,32 @@ static const struct eth_dev_ops nfp_netvf_nfd3_eth_dev_ops = {
        .rx_queue_intr_disable  = nfp_rx_queue_intr_disable,
 };
 
+static inline int
+nfp_netvf_ethdev_ops_mount(struct nfp_net_hw *hw, struct rte_eth_dev *eth_dev)
+{
+       switch (NFD_CFG_CLASS_VER_of(hw->ver)) {
+       case NFP_NET_CFG_VERSION_DP_NFD3:
+               break;
+       case NFP_NET_CFG_VERSION_DP_NFDK:
+               if (NFD_CFG_MAJOR_VERSION_of(hw->ver) < 5) {
+                       PMD_DRV_LOG(ERR, "NFDK must use ABI 5 or newer, found: %d",
+                               NFD_CFG_MAJOR_VERSION_of(hw->ver));
+                       return -EINVAL;
+               }
+               break;
+       default:
+               PMD_DRV_LOG(ERR, "The version of firmware is not correct.");
+               return -EINVAL;
+       }
+
+       eth_dev->dev_ops = &nfp_netvf_nfd3_eth_dev_ops;
+       eth_dev->rx_queue_count = nfp_net_rx_queue_count;
+       eth_dev->rx_pkt_burst = &nfp_net_recv_pkts;
+       eth_dev->tx_pkt_burst = &nfp_net_nfd3_xmit_pkts;
+
+       return 0;
+}
+
 static int
 nfp_netvf_init(struct rte_eth_dev *eth_dev)
 {
@@ -292,10 +318,19 @@ nfp_netvf_init(struct rte_eth_dev *eth_dev)
 
        hw = NFP_NET_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
 
-       eth_dev->dev_ops = &nfp_netvf_nfd3_eth_dev_ops;
-       eth_dev->rx_queue_count = nfp_net_rx_queue_count;
-       eth_dev->rx_pkt_burst = &nfp_net_recv_pkts;
-       eth_dev->tx_pkt_burst = &nfp_net_nfd3_xmit_pkts;
+       hw->ctrl_bar = (uint8_t *)pci_dev->mem_resource[0].addr;
+       if (hw->ctrl_bar == NULL) {
+               PMD_DRV_LOG(ERR,
+                       "hw->ctrl_bar is NULL. BAR0 not configured");
+               return -ENODEV;
+       }
+
+       PMD_INIT_LOG(DEBUG, "ctrl bar: %p", hw->ctrl_bar);
+
+       hw->ver = nn_cfg_readl(hw, NFP_NET_CFG_VERSION);
+
+       if (nfp_netvf_ethdev_ops_mount(hw, eth_dev))
+               return -EINVAL;
 
        /* For secondary processes, the primary has done all the work */
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
@@ -313,15 +348,6 @@ nfp_netvf_init(struct rte_eth_dev *eth_dev)
                     pci_dev->addr.domain, pci_dev->addr.bus,
                     pci_dev->addr.devid, pci_dev->addr.function);
 
-       hw->ctrl_bar = (uint8_t *)pci_dev->mem_resource[0].addr;
-       if (hw->ctrl_bar == NULL) {
-               PMD_DRV_LOG(ERR,
-                       "hw->ctrl_bar is NULL. BAR0 not configured");
-               return -ENODEV;
-       }
-
-       PMD_INIT_LOG(DEBUG, "ctrl bar: %p", hw->ctrl_bar);
-
        hw->max_rx_queues = nn_cfg_readl(hw, NFP_NET_CFG_MAX_RXRINGS);
        hw->max_tx_queues = nn_cfg_readl(hw, NFP_NET_CFG_MAX_TXRINGS);
 
@@ -354,7 +380,6 @@ nfp_netvf_init(struct rte_eth_dev *eth_dev)
        nfp_net_cfg_queue_setup(hw);
 
        /* Get some of the read-only fields from the config BAR */
-       hw->ver = nn_cfg_readl(hw, NFP_NET_CFG_VERSION);
        hw->cap = nn_cfg_readl(hw, NFP_NET_CFG_CAP);
        hw->max_mtu = nn_cfg_readl(hw, NFP_NET_CFG_MAX_MTU);
        hw->mtu = RTE_ETHER_MTU;