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....@corigine.com>
Signed-off-by: Diana Wang <na.w...@corigine.com>
Signed-off-by: Peng Zhang <peng.zh...@corigine.com>
Signed-off-by: Chaoyong He <chaoyong...@corigine.com>
Signed-off-by: Niklas Söderlund <niklas.soderl...@corigine.com>
---
 doc/guides/nics/nfp.rst                |  7 ++--
 doc/guides/rel_notes/release_22_07.rst |  1 +
 drivers/net/nfp/nfp_ctrl.h             |  2 +
 drivers/net/nfp/nfp_ethdev.c           | 49 +++++++++++++++++++-----
 drivers/net/nfp/nfp_ethdev_vf.c        | 53 +++++++++++++++++++-------
 5 files changed, 85 insertions(+), 27 deletions(-)

diff --git a/doc/guides/nics/nfp.rst b/doc/guides/nics/nfp.rst
index dcefac3ef6..55539accc2 100644
--- a/doc/guides/nics/nfp.rst
+++ b/doc/guides/nics/nfp.rst
@@ -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
 --------------------
diff --git a/doc/guides/rel_notes/release_22_07.rst 
b/doc/guides/rel_notes/release_22_07.rst
index d5d8c735b1..64308e6c1a 100644
--- a/doc/guides/rel_notes/release_22_07.rst
+++ b/doc/guides/rel_notes/release_22_07.rst
@@ -111,6 +111,7 @@ New Features
 * **Updated Netronome nfp driver.**
 
   * Added support for NFP3800 NIC.
+  * Added support for firmware with NFDk.
 
 * **Updated VMware vmxnet3 networking driver.**
 
diff --git a/drivers/net/nfp/nfp_ctrl.h b/drivers/net/nfp/nfp_ctrl.h
index 4dd62ef194..e73715e2aa 100644
--- a/drivers/net/nfp/nfp_ctrl.h
+++ b/drivers/net/nfp/nfp_ctrl.h
@@ -135,6 +135,8 @@
  * - 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)
diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index cb84dc3188..1bbba9187e 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -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);
        }
 
diff --git a/drivers/net/nfp/nfp_ethdev_vf.c b/drivers/net/nfp/nfp_ethdev_vf.c
index c46ee0f913..0b4660aba6 100644
--- a/drivers/net/nfp/nfp_ethdev_vf.c
+++ b/drivers/net/nfp/nfp_ethdev_vf.c
@@ -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;
-- 
2.27.0

Reply via email to