Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2018 Chelsio Communications.
3 : : * All rights reserved.
4 : : */
5 : :
6 : : #include <ethdev_driver.h>
7 : : #include <ethdev_pci.h>
8 : :
9 : : #include "cxgbe.h"
10 : : #include "cxgbe_pfvf.h"
11 : :
12 : : /*
13 : : * Macros needed to support the PCI Device ID Table ...
14 : : */
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
18 : :
19 : : #define PCI_VENDOR_ID_CHELSIO 0x1425
20 : :
21 : : #define CH_PCI_ID_TABLE_ENTRY(devid) \
22 : : { RTE_PCI_DEVICE(PCI_VENDOR_ID_CHELSIO, (devid)) }
23 : :
24 : : #define CH_PCI_DEVICE_ID_TABLE_DEFINE_END \
25 : : { .vendor_id = 0, } \
26 : : }
27 : :
28 : : /*
29 : : *... and the PCI ID Table itself ...
30 : : */
31 : : #include "base/t4_pci_id_tbl.h"
32 : :
33 : : /*
34 : : * Get port statistics.
35 : : */
36 : 0 : static int cxgbevf_dev_stats_get(struct rte_eth_dev *eth_dev,
37 : : struct rte_eth_stats *eth_stats,
38 : : struct eth_queue_stats *qstats __rte_unused)
39 : : {
40 : 0 : struct port_info *pi = eth_dev->data->dev_private;
41 : 0 : struct adapter *adapter = pi->adapter;
42 : : struct sge *s = &adapter->sge;
43 : : struct port_stats ps;
44 : : unsigned int i;
45 : :
46 : 0 : cxgbevf_stats_get(pi, &ps);
47 : :
48 : : /* RX Stats */
49 : 0 : eth_stats->ierrors = ps.rx_len_err;
50 : :
51 : : /* TX Stats */
52 : 0 : eth_stats->opackets = ps.tx_bcast_frames + ps.tx_mcast_frames +
53 : 0 : ps.tx_ucast_frames;
54 : 0 : eth_stats->obytes = ps.tx_octets;
55 : 0 : eth_stats->oerrors = ps.tx_drop;
56 : :
57 [ # # ]: 0 : for (i = 0; i < pi->n_rx_qsets; i++) {
58 : 0 : struct sge_eth_rxq *rxq = &s->ethrxq[pi->first_rxqset + i];
59 : :
60 : 0 : eth_stats->ipackets += rxq->stats.pkts;
61 : 0 : eth_stats->ibytes += rxq->stats.rx_bytes;
62 : : }
63 : :
64 : 0 : return 0;
65 : : }
66 : :
67 : : static const struct eth_dev_ops cxgbevf_eth_dev_ops = {
68 : : .dev_start = cxgbe_dev_start,
69 : : .dev_stop = cxgbe_dev_stop,
70 : : .dev_close = cxgbe_dev_close,
71 : : .promiscuous_enable = cxgbe_dev_promiscuous_enable,
72 : : .promiscuous_disable = cxgbe_dev_promiscuous_disable,
73 : : .allmulticast_enable = cxgbe_dev_allmulticast_enable,
74 : : .allmulticast_disable = cxgbe_dev_allmulticast_disable,
75 : : .dev_configure = cxgbe_dev_configure,
76 : : .dev_infos_get = cxgbe_dev_info_get,
77 : : .dev_supported_ptypes_get = cxgbe_dev_supported_ptypes_get,
78 : : .link_update = cxgbe_dev_link_update,
79 : : .dev_set_link_up = cxgbe_dev_set_link_up,
80 : : .dev_set_link_down = cxgbe_dev_set_link_down,
81 : : .mtu_set = cxgbe_dev_mtu_set,
82 : : .tx_queue_setup = cxgbe_dev_tx_queue_setup,
83 : : .tx_queue_start = cxgbe_dev_tx_queue_start,
84 : : .tx_queue_stop = cxgbe_dev_tx_queue_stop,
85 : : .tx_queue_release = cxgbe_dev_tx_queue_release,
86 : : .rx_queue_setup = cxgbe_dev_rx_queue_setup,
87 : : .rx_queue_start = cxgbe_dev_rx_queue_start,
88 : : .rx_queue_stop = cxgbe_dev_rx_queue_stop,
89 : : .rx_queue_release = cxgbe_dev_rx_queue_release,
90 : : .stats_get = cxgbevf_dev_stats_get,
91 : : .xstats_get = cxgbe_dev_xstats_get,
92 : : .xstats_get_by_id = cxgbe_dev_xstats_get_by_id,
93 : : .xstats_get_names = cxgbe_dev_xstats_get_names,
94 : : .xstats_get_names_by_id = cxgbe_dev_xstats_get_names_by_id,
95 : : .mac_addr_set = cxgbe_mac_addr_set,
96 : : .fw_version_get = cxgbe_fw_version_get,
97 : : };
98 : :
99 : : /*
100 : : * Initialize driver
101 : : * It returns 0 on success.
102 : : */
103 : 0 : static int eth_cxgbevf_dev_init(struct rte_eth_dev *eth_dev)
104 : : {
105 : 0 : struct port_info *pi = eth_dev->data->dev_private;
106 : : struct rte_pci_device *pci_dev;
107 : : char name[RTE_ETH_NAME_MAX_LEN];
108 : : struct adapter *adapter = NULL;
109 : : int err = 0;
110 : :
111 : 0 : CXGBE_FUNC_TRACE();
112 : :
113 : 0 : eth_dev->dev_ops = &cxgbevf_eth_dev_ops;
114 : 0 : eth_dev->rx_pkt_burst = &cxgbe_recv_pkts;
115 : 0 : eth_dev->tx_pkt_burst = &cxgbe_xmit_pkts;
116 : 0 : pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
117 : :
118 : : /* for secondary processes, we attach to ethdevs allocated by primary
119 : : * and do minimal initialization.
120 : : */
121 [ # # ]: 0 : if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
122 : : int i;
123 : :
124 [ # # ]: 0 : for (i = 1; i < MAX_NPORTS; i++) {
125 : : struct rte_eth_dev *rest_eth_dev;
126 : : char namei[RTE_ETH_NAME_MAX_LEN];
127 : :
128 : 0 : snprintf(namei, sizeof(namei), "%s_%d",
129 : : pci_dev->device.name, i);
130 : 0 : rest_eth_dev = rte_eth_dev_attach_secondary(namei);
131 [ # # ]: 0 : if (rest_eth_dev) {
132 : 0 : rest_eth_dev->device = &pci_dev->device;
133 : 0 : rest_eth_dev->dev_ops =
134 : 0 : eth_dev->dev_ops;
135 : 0 : rest_eth_dev->rx_pkt_burst =
136 : 0 : eth_dev->rx_pkt_burst;
137 : 0 : rest_eth_dev->tx_pkt_burst =
138 : 0 : eth_dev->tx_pkt_burst;
139 : 0 : rte_eth_dev_probing_finish(rest_eth_dev);
140 : : }
141 : : }
142 : : return 0;
143 : : }
144 : :
145 : 0 : snprintf(name, sizeof(name), "cxgbevfadapter%d",
146 : 0 : eth_dev->data->port_id);
147 : 0 : adapter = rte_zmalloc(name, sizeof(*adapter), 0);
148 [ # # ]: 0 : if (!adapter)
149 : : return -1;
150 : :
151 : 0 : adapter->use_unpacked_mode = 1;
152 : 0 : adapter->regs = (void *)pci_dev->mem_resource[0].addr;
153 [ # # ]: 0 : if (!adapter->regs) {
154 : 0 : dev_err(adapter, "%s: cannot map device registers\n", __func__);
155 : : err = -ENOMEM;
156 : 0 : goto out_free_adapter;
157 : : }
158 : 0 : adapter->pdev = pci_dev;
159 : 0 : adapter->eth_dev = eth_dev;
160 : 0 : pi->adapter = adapter;
161 : :
162 : 0 : cxgbe_process_devargs(adapter);
163 : :
164 : 0 : err = cxgbevf_probe(adapter);
165 [ # # ]: 0 : if (err) {
166 : 0 : dev_err(adapter, "%s: cxgbevf probe failed with err %d\n",
167 : : __func__, err);
168 : 0 : goto out_free_adapter;
169 : : }
170 : :
171 : : return 0;
172 : :
173 : 0 : out_free_adapter:
174 : 0 : rte_free(adapter);
175 : 0 : return err;
176 : : }
177 : :
178 : 0 : static int eth_cxgbevf_dev_uninit(struct rte_eth_dev *eth_dev)
179 : : {
180 : 0 : struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
181 : : uint16_t port_id;
182 : : int err = 0;
183 : :
184 : : /* Free up other ports and all resources */
185 [ # # ]: 0 : RTE_ETH_FOREACH_DEV_OF(port_id, &pci_dev->device)
186 : 0 : err |= rte_eth_dev_close(port_id);
187 : :
188 [ # # ]: 0 : return err == 0 ? 0 : -EIO;
189 : : }
190 : :
191 : 0 : static int eth_cxgbevf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
192 : : struct rte_pci_device *pci_dev)
193 : : {
194 : 0 : return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct port_info),
195 : : eth_cxgbevf_dev_init);
196 : : }
197 : :
198 : 0 : static int eth_cxgbevf_pci_remove(struct rte_pci_device *pci_dev)
199 : : {
200 : 0 : return rte_eth_dev_pci_generic_remove(pci_dev, eth_cxgbevf_dev_uninit);
201 : : }
202 : :
203 : : static struct rte_pci_driver rte_cxgbevf_pmd = {
204 : : .id_table = cxgb4vf_pci_tbl,
205 : : .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
206 : : .probe = eth_cxgbevf_pci_probe,
207 : : .remove = eth_cxgbevf_pci_remove,
208 : : };
209 : :
210 : 253 : RTE_PMD_REGISTER_PCI(net_cxgbevf, rte_cxgbevf_pmd);
211 : : RTE_PMD_REGISTER_PCI_TABLE(net_cxgbevf, cxgb4vf_pci_tbl);
212 : : RTE_PMD_REGISTER_KMOD_DEP(net_cxgbevf, "* igb_uio | vfio-pci");
213 : : RTE_PMD_REGISTER_PARAM_STRING(net_cxgbevf,
214 : : CXGBE_DEVARG_CMN_KEEP_OVLAN "=<0|1> "
215 : : CXGBE_DEVARG_CMN_TX_MODE_LATENCY "=<0|1> "
216 : : CXGBE_DEVARG_VF_FORCE_LINK_UP "=<0|1> ");
|