1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Chelsio Communications.
6 #include <rte_ethdev_driver.h>
7 #include <rte_ethdev_pci.h>
10 #include "cxgbe_pfvf.h"
13 * Macros needed to support the PCI Device ID Table ...
15 #define CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN \
16 static const struct rte_pci_id cxgb4vf_pci_tbl[] = {
17 #define CH_PCI_DEVICE_ID_FUNCTION 0x8
19 #define PCI_VENDOR_ID_CHELSIO 0x1425
21 #define CH_PCI_ID_TABLE_ENTRY(devid) \
22 { RTE_PCI_DEVICE(PCI_VENDOR_ID_CHELSIO, (devid)) }
24 #define CH_PCI_DEVICE_ID_TABLE_DEFINE_END \
29 *... and the PCI ID Table itself ...
31 #include "t4_pci_id_tbl.h"
33 static const struct eth_dev_ops cxgbevf_eth_dev_ops = {
34 .dev_start = cxgbe_dev_start,
35 .dev_stop = cxgbe_dev_stop,
36 .dev_close = cxgbe_dev_close,
37 .promiscuous_enable = cxgbe_dev_promiscuous_enable,
38 .promiscuous_disable = cxgbe_dev_promiscuous_disable,
39 .allmulticast_enable = cxgbe_dev_allmulticast_enable,
40 .allmulticast_disable = cxgbe_dev_allmulticast_disable,
41 .dev_configure = cxgbe_dev_configure,
42 .dev_infos_get = cxgbe_dev_info_get,
43 .dev_supported_ptypes_get = cxgbe_dev_supported_ptypes_get,
44 .link_update = cxgbe_dev_link_update,
45 .mtu_set = cxgbe_dev_mtu_set,
46 .tx_queue_setup = cxgbe_dev_tx_queue_setup,
47 .tx_queue_start = cxgbe_dev_tx_queue_start,
48 .tx_queue_stop = cxgbe_dev_tx_queue_stop,
49 .tx_queue_release = cxgbe_dev_tx_queue_release,
50 .rx_queue_setup = cxgbe_dev_rx_queue_setup,
51 .rx_queue_start = cxgbe_dev_rx_queue_start,
52 .rx_queue_stop = cxgbe_dev_rx_queue_stop,
53 .rx_queue_release = cxgbe_dev_rx_queue_release,
58 * It returns 0 on success.
60 static int eth_cxgbevf_dev_init(struct rte_eth_dev *eth_dev)
62 struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
63 struct rte_pci_device *pci_dev;
64 char name[RTE_ETH_NAME_MAX_LEN];
65 struct adapter *adapter = NULL;
70 eth_dev->dev_ops = &cxgbevf_eth_dev_ops;
71 eth_dev->rx_pkt_burst = &cxgbe_recv_pkts;
72 eth_dev->tx_pkt_burst = &cxgbe_xmit_pkts;
73 pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
75 /* for secondary processes, we attach to ethdevs allocated by primary
76 * and do minimal initialization.
78 if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
81 for (i = 1; i < MAX_NPORTS; i++) {
82 struct rte_eth_dev *rest_eth_dev;
83 char namei[RTE_ETH_NAME_MAX_LEN];
85 snprintf(namei, sizeof(namei), "%s_%d",
86 pci_dev->device.name, i);
87 rest_eth_dev = rte_eth_dev_attach_secondary(namei);
89 rest_eth_dev->device = &pci_dev->device;
90 rest_eth_dev->dev_ops =
92 rest_eth_dev->rx_pkt_burst =
93 eth_dev->rx_pkt_burst;
94 rest_eth_dev->tx_pkt_burst =
95 eth_dev->tx_pkt_burst;
101 snprintf(name, sizeof(name), "cxgbevfadapter%d",
102 eth_dev->data->port_id);
103 adapter = rte_zmalloc(name, sizeof(*adapter), 0);
107 adapter->use_unpacked_mode = 1;
108 adapter->regs = (void *)pci_dev->mem_resource[0].addr;
109 if (!adapter->regs) {
110 dev_err(adapter, "%s: cannot map device registers\n", __func__);
112 goto out_free_adapter;
114 adapter->pdev = pci_dev;
115 adapter->eth_dev = eth_dev;
116 pi->adapter = adapter;
117 err = cxgbevf_probe(adapter);
119 dev_err(adapter, "%s: cxgbevf probe failed with err %d\n",
121 goto out_free_adapter;
131 static int eth_cxgbevf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
132 struct rte_pci_device *pci_dev)
134 return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct port_info),
135 eth_cxgbevf_dev_init);
138 static int eth_cxgbevf_pci_remove(struct rte_pci_device *pci_dev)
140 return rte_eth_dev_pci_generic_remove(pci_dev, NULL);
143 static struct rte_pci_driver rte_cxgbevf_pmd = {
144 .id_table = cxgb4vf_pci_tbl,
145 .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
146 .probe = eth_cxgbevf_pci_probe,
147 .remove = eth_cxgbevf_pci_remove,
150 RTE_PMD_REGISTER_PCI(net_cxgbevf, rte_cxgbevf_pmd);
151 RTE_PMD_REGISTER_PCI_TABLE(net_cxgbevf, cxgb4vf_pci_tbl);
152 RTE_PMD_REGISTER_KMOD_DEP(net_cxgbevf, "* igb_uio | vfio-pci");