nfp: introduce dev_info static chip data
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>
This commit is contained in:
parent
7ab7985df2
commit
9423d24b7b
@ -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 \
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -105,6 +105,7 @@
|
||||
|
||||
/* 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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 */
|
||||
|
10
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.c
Normal file
10
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.c
Normal file
@ -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",
|
||||
},
|
||||
};
|
18
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.h
Normal file
18
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_dev.h
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user