OSDN Git Service

nfp: introduce dev_info static chip data
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 11 Mar 2022 10:43:01 +0000 (11:43 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 12 Mar 2022 07:10:22 +0000 (23:10 -0800)
In preparation for supporting new chip add a driver data structure
which will hold per-chip-version information such as register
offsets.

Plumb it through to the relevant functions (nfpcore and nfp_net).
For now only a very simple member holding chip names is added,
following commits will add more.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Fei Qin <fei.qin@corigine.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/netronome/nfp/Makefile
drivers/net/ethernet/netronome/nfp/nfp_main.c
drivers/net/ethernet/netronome/nfp/nfp_main.h
drivers/net/ethernet/netronome/nfp/nfp_net.h
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
drivers/net/ethernet/netronome/nfp/nfp_net_main.c
drivers/net/ethernet/netronome/nfp/nfp_netvf_main.c
drivers/net/ethernet/netronome/nfp/nfpcore/nfp6000_pcie.c
drivers/net/ethernet/netronome/nfp/nfpcore/nfp6000_pcie.h
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.c [new file with mode: 0644]
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.h [new file with mode: 0644]

index 9c72b43..a35a382 100644 (file)
@@ -5,6 +5,7 @@ nfp-objs := \
            nfpcore/nfp6000_pcie.o \
            nfpcore/nfp_cppcore.o \
            nfpcore/nfp_cpplib.o \
+           nfpcore/nfp_dev.o \
            nfpcore/nfp_hwinfo.o \
            nfpcore/nfp_mip.o \
            nfpcore/nfp_mutex.o \
index 8f2458c..aca4955 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "nfpcore/nfp.h"
 #include "nfpcore/nfp_cpp.h"
+#include "nfpcore/nfp_dev.h"
 #include "nfpcore/nfp_nffw.h"
 #include "nfpcore/nfp_nsp.h"
 
@@ -34,15 +35,15 @@ static const char nfp_driver_name[] = "nfp";
 static const struct pci_device_id nfp_pci_device_ids[] = {
        { PCI_VENDOR_ID_NETRONOME, PCI_DEVICE_ID_NETRONOME_NFP4000,
          PCI_VENDOR_ID_NETRONOME, PCI_ANY_ID,
-         PCI_ANY_ID, 0,
+         PCI_ANY_ID, 0, NFP_DEV_NFP6000,
        },
        { PCI_VENDOR_ID_NETRONOME, PCI_DEVICE_ID_NETRONOME_NFP5000,
          PCI_VENDOR_ID_NETRONOME, PCI_ANY_ID,
-         PCI_ANY_ID, 0,
+         PCI_ANY_ID, 0, NFP_DEV_NFP6000,
        },
        { PCI_VENDOR_ID_NETRONOME, PCI_DEVICE_ID_NETRONOME_NFP6000,
          PCI_VENDOR_ID_NETRONOME, PCI_ANY_ID,
-         PCI_ANY_ID, 0,
+         PCI_ANY_ID, 0, NFP_DEV_NFP6000,
        },
        { 0, } /* Required last entry. */
 };
@@ -667,6 +668,7 @@ static int nfp_pf_find_rtsyms(struct nfp_pf *pf)
 static int nfp_pci_probe(struct pci_dev *pdev,
                         const struct pci_device_id *pci_id)
 {
+       const struct nfp_dev_info *dev_info;
        struct devlink *devlink;
        struct nfp_pf *pf;
        int err;
@@ -675,6 +677,8 @@ static int nfp_pci_probe(struct pci_dev *pdev,
            pdev->device == PCI_DEVICE_ID_NETRONOME_NFP6000_VF)
                dev_warn(&pdev->dev, "Binding NFP VF device to the NFP PF driver, the VF driver is called 'nfp_netvf'\n");
 
+       dev_info = &nfp_dev_info[pci_id->driver_data];
+
        err = pci_enable_device(pdev);
        if (err < 0)
                return err;
@@ -703,6 +707,7 @@ static int nfp_pci_probe(struct pci_dev *pdev,
        mutex_init(&pf->lock);
        pci_set_drvdata(pdev, pf);
        pf->pdev = pdev;
+       pf->dev_info = dev_info;
 
        pf->wq = alloc_workqueue("nfp-%s", 0, 2, pci_name(pdev));
        if (!pf->wq) {
@@ -710,7 +715,7 @@ static int nfp_pci_probe(struct pci_dev *pdev,
                goto err_pci_priv_unset;
        }
 
-       pf->cpp = nfp_cpp_from_nfp6000_pcie(pdev);
+       pf->cpp = nfp_cpp_from_nfp6000_pcie(pdev, dev_info);
        if (IS_ERR(pf->cpp)) {
                err = PTR_ERR(pf->cpp);
                goto err_disable_msix;
index a7dede9..9c72a0a 100644 (file)
@@ -48,6 +48,7 @@ struct nfp_dumpspec {
 /**
  * struct nfp_pf - NFP PF-specific device structure
  * @pdev:              Backpointer to PCI device
+ * @dev_info:          NFP ASIC params
  * @cpp:               Pointer to the CPP handle
  * @app:               Pointer to the APP handle
  * @data_vnic_bar:     Pointer to the CPP area for the data vNICs' BARs
@@ -88,6 +89,7 @@ struct nfp_dumpspec {
  */
 struct nfp_pf {
        struct pci_dev *pdev;
+       const struct nfp_dev_info *dev_info;
 
        struct nfp_cpp *cpp;
 
index f6b7189..9fc9310 100644 (file)
 
 /* Forward declarations */
 struct nfp_cpp;
+struct nfp_dev_info;
 struct nfp_eth_table_port;
 struct nfp_net;
 struct nfp_net_r_vector;
@@ -571,6 +572,7 @@ struct nfp_net_dp {
 /**
  * struct nfp_net - NFP network device structure
  * @dp:                        Datapath structure
+ * @dev_info:          NFP ASIC params
  * @id:                        vNIC id within the PF (0 for VFs)
  * @fw_ver:            Firmware version
  * @cap:                Capabilities advertised by the Firmware
@@ -644,6 +646,7 @@ struct nfp_net_dp {
 struct nfp_net {
        struct nfp_net_dp dp;
 
+       const struct nfp_dev_info *dev_info;
        struct nfp_net_fw_version fw_ver;
 
        u32 id;
@@ -942,7 +945,8 @@ void nfp_net_get_fw_version(struct nfp_net_fw_version *fw_ver,
                            void __iomem *ctrl_bar);
 
 struct nfp_net *
-nfp_net_alloc(struct pci_dev *pdev, void __iomem *ctrl_bar, bool needs_netdev,
+nfp_net_alloc(struct pci_dev *pdev, const struct nfp_dev_info *dev_info,
+             void __iomem *ctrl_bar, bool needs_netdev,
              unsigned int max_tx_rings, unsigned int max_rx_rings);
 void nfp_net_free(struct nfp_net *nn);
 
index 67a87fd..5d99377 100644 (file)
@@ -3962,6 +3962,7 @@ void nfp_net_info(struct nfp_net *nn)
 /**
  * nfp_net_alloc() - Allocate netdev and related structure
  * @pdev:         PCI device
+ * @dev_info:     NFP ASIC params
  * @ctrl_bar:     PCI IOMEM with vNIC config memory
  * @needs_netdev: Whether to allocate a netdev for this vNIC
  * @max_tx_rings: Maximum number of TX rings supported by device
@@ -3974,7 +3975,8 @@ void nfp_net_info(struct nfp_net *nn)
  * Return: NFP Net device structure, or ERR_PTR on error.
  */
 struct nfp_net *
-nfp_net_alloc(struct pci_dev *pdev, void __iomem *ctrl_bar, bool needs_netdev,
+nfp_net_alloc(struct pci_dev *pdev, const struct nfp_dev_info *dev_info,
+             void __iomem *ctrl_bar, bool needs_netdev,
              unsigned int max_tx_rings, unsigned int max_rx_rings)
 {
        struct nfp_net *nn;
@@ -3999,6 +4001,7 @@ nfp_net_alloc(struct pci_dev *pdev, void __iomem *ctrl_bar, bool needs_netdev,
 
        nn->dp.dev = &pdev->dev;
        nn->dp.ctrl_bar = ctrl_bar;
+       nn->dev_info = dev_info;
        nn->pdev = pdev;
 
        nn->max_tx_rings = max_tx_rings;
index 751f76c..8934d54 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "nfpcore/nfp.h"
 #include "nfpcore/nfp_cpp.h"
+#include "nfpcore/nfp_dev.h"
 #include "nfpcore/nfp_nffw.h"
 #include "nfpcore/nfp_nsp.h"
 #include "nfpcore/nfp6000_pcie.h"
@@ -116,7 +117,7 @@ nfp_net_pf_alloc_vnic(struct nfp_pf *pf, bool needs_netdev,
        n_rx_rings = readl(ctrl_bar + NFP_NET_CFG_MAX_RXRINGS);
 
        /* Allocate and initialise the vNIC */
-       nn = nfp_net_alloc(pf->pdev, ctrl_bar, needs_netdev,
+       nn = nfp_net_alloc(pf->pdev, pf->dev_info, ctrl_bar, needs_netdev,
                           n_tx_rings, n_rx_rings);
        if (IS_ERR(nn))
                return nn;
index 6941520..a9e05ef 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/init.h>
 #include <linux/etherdevice.h>
 
+#include "nfpcore/nfp_dev.h"
 #include "nfp_net_ctrl.h"
 #include "nfp_net.h"
 #include "nfp_main.h"
@@ -39,7 +40,7 @@ static const char nfp_net_driver_name[] = "nfp_netvf";
 static const struct pci_device_id nfp_netvf_pci_device_ids[] = {
        { PCI_VENDOR_ID_NETRONOME, PCI_DEVICE_ID_NETRONOME_NFP6000_VF,
          PCI_VENDOR_ID_NETRONOME, PCI_ANY_ID,
-         PCI_ANY_ID, 0,
+         PCI_ANY_ID, 0, NFP_DEV_NFP6000,
        },
        { 0, } /* Required last entry. */
 };
@@ -64,6 +65,7 @@ static void nfp_netvf_get_mac_addr(struct nfp_net *nn)
 static int nfp_netvf_pci_probe(struct pci_dev *pdev,
                               const struct pci_device_id *pci_id)
 {
+       const struct nfp_dev_info *dev_info;
        struct nfp_net_fw_version fw_ver;
        int max_tx_rings, max_rx_rings;
        u32 tx_bar_off, rx_bar_off;
@@ -77,6 +79,8 @@ static int nfp_netvf_pci_probe(struct pci_dev *pdev,
        int stride;
        int err;
 
+       dev_info = &nfp_dev_info[pci_id->driver_data];
+
        vf = kzalloc(sizeof(*vf), GFP_KERNEL);
        if (!vf)
                return -ENOMEM;
@@ -171,7 +175,8 @@ static int nfp_netvf_pci_probe(struct pci_dev *pdev,
        rx_bar_off = NFP_PCIE_QUEUE(startq);
 
        /* Allocate and initialise the netdev */
-       nn = nfp_net_alloc(pdev, ctrl_bar, true, max_tx_rings, max_rx_rings);
+       nn = nfp_net_alloc(pdev, dev_info, ctrl_bar, true,
+                          max_tx_rings, max_rx_rings);
        if (IS_ERR(nn)) {
                err = PTR_ERR(nn);
                goto err_ctrl_unmap;
index 252fe06..aa8122f 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/pci.h>
 
 #include "nfp_cpp.h"
+#include "nfp_dev.h"
 
 #include "nfp6000/nfp6000.h"
 
@@ -145,6 +146,7 @@ struct nfp_bar {
 struct nfp6000_pcie {
        struct pci_dev *pdev;
        struct device *dev;
+       const struct nfp_dev_info *dev_info;
 
        /* PCI BAR management */
        spinlock_t bar_lock;            /* Protect the PCI2CPP BAR cache */
@@ -1306,18 +1308,20 @@ static const struct nfp_cpp_operations nfp6000_pcie_ops = {
 /**
  * nfp_cpp_from_nfp6000_pcie() - Build a NFP CPP bus from a NFP6000 PCI device
  * @pdev:      NFP6000 PCI device
+ * @dev_info:  NFP ASIC params
  *
  * Return: NFP CPP handle
  */
-struct nfp_cpp *nfp_cpp_from_nfp6000_pcie(struct pci_dev *pdev)
+struct nfp_cpp *
+nfp_cpp_from_nfp6000_pcie(struct pci_dev *pdev, const struct nfp_dev_info *dev_info)
 {
        struct nfp6000_pcie *nfp;
        u16 interface;
        int err;
 
        /*  Finished with card initialization. */
-       dev_info(&pdev->dev,
-                "Netronome Flow Processor NFP4000/NFP5000/NFP6000 PCIe Card Probe\n");
+       dev_info(&pdev->dev, "Netronome Flow Processor %s PCIe Card Probe\n",
+                dev_info->chip_names);
        pcie_print_link_status(pdev);
 
        nfp = kzalloc(sizeof(*nfp), GFP_KERNEL);
@@ -1328,6 +1332,7 @@ struct nfp_cpp *nfp_cpp_from_nfp6000_pcie(struct pci_dev *pdev)
 
        nfp->dev = &pdev->dev;
        nfp->pdev = pdev;
+       nfp->dev_info = dev_info;
        init_waitqueue_head(&nfp->bar_waiters);
        spin_lock_init(&nfp->bar_lock);
 
index 6d1bffa..097660b 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "nfp_cpp.h"
 
-struct nfp_cpp *nfp_cpp_from_nfp6000_pcie(struct pci_dev *pdev);
+struct nfp_cpp *
+nfp_cpp_from_nfp6000_pcie(struct pci_dev *pdev, const struct nfp_dev_info *dev_info);
 
 #endif /* NFP6000_PCIE_H */
diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.c b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.c
new file mode 100644 (file)
index 0000000..6069d18
--- /dev/null
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/* Copyright (C) 2019 Netronome Systems, Inc. */
+
+#include "nfp_dev.h"
+
+const struct nfp_dev_info nfp_dev_info[NFP_DEV_CNT] = {
+       [NFP_DEV_NFP6000] = {
+               .chip_names             = "NFP4000/NFP5000/NFP6000",
+       },
+};
diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.h b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.h
new file mode 100644 (file)
index 0000000..514aa08
--- /dev/null
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
+/* Copyright (C) 2019 Netronome Systems, Inc. */
+
+#ifndef _NFP_DEV_H_
+#define _NFP_DEV_H_
+
+enum nfp_dev_id {
+       NFP_DEV_NFP6000,
+       NFP_DEV_CNT,
+};
+
+struct nfp_dev_info {
+       const char *chip_names;
+};
+
+extern const struct nfp_dev_info nfp_dev_info[NFP_DEV_CNT];
+
+#endif