xref: /dpdk/drivers/net/cxgbe/cxgbevf_ethdev.c (revision 5e80364a0389f76e4c8c20cdbe40a4db36b49f58)
1011ebc23SKumar Sanghvi /* SPDX-License-Identifier: BSD-3-Clause
2011ebc23SKumar Sanghvi  * Copyright(c) 2018 Chelsio Communications.
3011ebc23SKumar Sanghvi  * All rights reserved.
4011ebc23SKumar Sanghvi  */
5011ebc23SKumar Sanghvi 
6011ebc23SKumar Sanghvi #include <rte_ethdev_driver.h>
7011ebc23SKumar Sanghvi #include <rte_ethdev_pci.h>
8011ebc23SKumar Sanghvi 
9011ebc23SKumar Sanghvi #include "cxgbe.h"
10011ebc23SKumar Sanghvi #include "cxgbe_pfvf.h"
11011ebc23SKumar Sanghvi 
12011ebc23SKumar Sanghvi /*
13011ebc23SKumar Sanghvi  * Macros needed to support the PCI Device ID Table ...
14011ebc23SKumar Sanghvi  */
15011ebc23SKumar Sanghvi #define CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN \
16011ebc23SKumar Sanghvi 	static const struct rte_pci_id cxgb4vf_pci_tbl[] = {
17011ebc23SKumar Sanghvi #define CH_PCI_DEVICE_ID_FUNCTION 0x8
18011ebc23SKumar Sanghvi 
19011ebc23SKumar Sanghvi #define PCI_VENDOR_ID_CHELSIO 0x1425
20011ebc23SKumar Sanghvi 
21011ebc23SKumar Sanghvi #define CH_PCI_ID_TABLE_ENTRY(devid) \
22011ebc23SKumar Sanghvi 		{ RTE_PCI_DEVICE(PCI_VENDOR_ID_CHELSIO, (devid)) }
23011ebc23SKumar Sanghvi 
24011ebc23SKumar Sanghvi #define CH_PCI_DEVICE_ID_TABLE_DEFINE_END \
25011ebc23SKumar Sanghvi 		{ .vendor_id = 0, } \
26011ebc23SKumar Sanghvi 	}
27011ebc23SKumar Sanghvi 
28011ebc23SKumar Sanghvi /*
29011ebc23SKumar Sanghvi  *... and the PCI ID Table itself ...
30011ebc23SKumar Sanghvi  */
31011ebc23SKumar Sanghvi #include "t4_pci_id_tbl.h"
32011ebc23SKumar Sanghvi 
33011ebc23SKumar Sanghvi static const struct eth_dev_ops cxgbevf_eth_dev_ops = {
34011ebc23SKumar Sanghvi 	.dev_start              = cxgbe_dev_start,
35011ebc23SKumar Sanghvi 	.dev_stop               = cxgbe_dev_stop,
36011ebc23SKumar Sanghvi 	.dev_close              = cxgbe_dev_close,
37011ebc23SKumar Sanghvi 	.promiscuous_enable     = cxgbe_dev_promiscuous_enable,
38011ebc23SKumar Sanghvi 	.promiscuous_disable    = cxgbe_dev_promiscuous_disable,
39011ebc23SKumar Sanghvi 	.allmulticast_enable    = cxgbe_dev_allmulticast_enable,
40011ebc23SKumar Sanghvi 	.allmulticast_disable   = cxgbe_dev_allmulticast_disable,
41011ebc23SKumar Sanghvi 	.dev_configure          = cxgbe_dev_configure,
42011ebc23SKumar Sanghvi 	.dev_infos_get          = cxgbe_dev_info_get,
43011ebc23SKumar Sanghvi 	.dev_supported_ptypes_get = cxgbe_dev_supported_ptypes_get,
44011ebc23SKumar Sanghvi 	.link_update            = cxgbe_dev_link_update,
45011ebc23SKumar Sanghvi 	.mtu_set                = cxgbe_dev_mtu_set,
46011ebc23SKumar Sanghvi 	.tx_queue_setup         = cxgbe_dev_tx_queue_setup,
47011ebc23SKumar Sanghvi 	.tx_queue_start         = cxgbe_dev_tx_queue_start,
48011ebc23SKumar Sanghvi 	.tx_queue_stop          = cxgbe_dev_tx_queue_stop,
49011ebc23SKumar Sanghvi 	.tx_queue_release       = cxgbe_dev_tx_queue_release,
50011ebc23SKumar Sanghvi 	.rx_queue_setup         = cxgbe_dev_rx_queue_setup,
51011ebc23SKumar Sanghvi 	.rx_queue_start         = cxgbe_dev_rx_queue_start,
52011ebc23SKumar Sanghvi 	.rx_queue_stop          = cxgbe_dev_rx_queue_stop,
53011ebc23SKumar Sanghvi 	.rx_queue_release       = cxgbe_dev_rx_queue_release,
54011ebc23SKumar Sanghvi };
55011ebc23SKumar Sanghvi 
56011ebc23SKumar Sanghvi /*
57011ebc23SKumar Sanghvi  * Initialize driver
58011ebc23SKumar Sanghvi  * It returns 0 on success.
59011ebc23SKumar Sanghvi  */
60011ebc23SKumar Sanghvi static int eth_cxgbevf_dev_init(struct rte_eth_dev *eth_dev)
61011ebc23SKumar Sanghvi {
62*5e80364aSKumar Sanghvi 	struct port_info *pi = (struct port_info *)(eth_dev->data->dev_private);
63*5e80364aSKumar Sanghvi 	struct rte_pci_device *pci_dev;
64*5e80364aSKumar Sanghvi 	char name[RTE_ETH_NAME_MAX_LEN];
65*5e80364aSKumar Sanghvi 	struct adapter *adapter = NULL;
66*5e80364aSKumar Sanghvi 	int err = 0;
67*5e80364aSKumar Sanghvi 
68011ebc23SKumar Sanghvi 	CXGBE_FUNC_TRACE();
69011ebc23SKumar Sanghvi 
70011ebc23SKumar Sanghvi 	eth_dev->dev_ops = &cxgbevf_eth_dev_ops;
71*5e80364aSKumar Sanghvi 	eth_dev->rx_pkt_burst = NULL;
72*5e80364aSKumar Sanghvi 	eth_dev->tx_pkt_burst = NULL;
73*5e80364aSKumar Sanghvi 	pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
74011ebc23SKumar Sanghvi 
75*5e80364aSKumar Sanghvi 	/* for secondary processes, we attach to ethdevs allocated by primary
76*5e80364aSKumar Sanghvi 	 * and do minimal initialization.
77*5e80364aSKumar Sanghvi 	 */
78*5e80364aSKumar Sanghvi 	if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
79*5e80364aSKumar Sanghvi 		int i;
80*5e80364aSKumar Sanghvi 
81*5e80364aSKumar Sanghvi 		for (i = 1; i < MAX_NPORTS; i++) {
82*5e80364aSKumar Sanghvi 			struct rte_eth_dev *rest_eth_dev;
83*5e80364aSKumar Sanghvi 			char namei[RTE_ETH_NAME_MAX_LEN];
84*5e80364aSKumar Sanghvi 
85*5e80364aSKumar Sanghvi 			snprintf(namei, sizeof(namei), "%s_%d",
86*5e80364aSKumar Sanghvi 				 pci_dev->device.name, i);
87*5e80364aSKumar Sanghvi 			rest_eth_dev = rte_eth_dev_attach_secondary(namei);
88*5e80364aSKumar Sanghvi 			if (rest_eth_dev) {
89*5e80364aSKumar Sanghvi 				rest_eth_dev->device = &pci_dev->device;
90*5e80364aSKumar Sanghvi 				rest_eth_dev->dev_ops =
91*5e80364aSKumar Sanghvi 					eth_dev->dev_ops;
92*5e80364aSKumar Sanghvi 				rest_eth_dev->rx_pkt_burst =
93*5e80364aSKumar Sanghvi 					eth_dev->rx_pkt_burst;
94*5e80364aSKumar Sanghvi 				rest_eth_dev->tx_pkt_burst =
95*5e80364aSKumar Sanghvi 					eth_dev->tx_pkt_burst;
96*5e80364aSKumar Sanghvi 			}
97*5e80364aSKumar Sanghvi 		}
98*5e80364aSKumar Sanghvi 		return 0;
99*5e80364aSKumar Sanghvi 	}
100*5e80364aSKumar Sanghvi 
101*5e80364aSKumar Sanghvi 	snprintf(name, sizeof(name), "cxgbevfadapter%d",
102*5e80364aSKumar Sanghvi 		 eth_dev->data->port_id);
103*5e80364aSKumar Sanghvi 	adapter = rte_zmalloc(name, sizeof(*adapter), 0);
104*5e80364aSKumar Sanghvi 	if (!adapter)
105*5e80364aSKumar Sanghvi 		return -1;
106*5e80364aSKumar Sanghvi 
107*5e80364aSKumar Sanghvi 	adapter->use_unpacked_mode = 1;
108*5e80364aSKumar Sanghvi 	adapter->regs = (void *)pci_dev->mem_resource[0].addr;
109*5e80364aSKumar Sanghvi 	if (!adapter->regs) {
110*5e80364aSKumar Sanghvi 		dev_err(adapter, "%s: cannot map device registers\n", __func__);
111*5e80364aSKumar Sanghvi 		err = -ENOMEM;
112*5e80364aSKumar Sanghvi 		goto out_free_adapter;
113*5e80364aSKumar Sanghvi 	}
114*5e80364aSKumar Sanghvi 	adapter->pdev = pci_dev;
115*5e80364aSKumar Sanghvi 	adapter->eth_dev = eth_dev;
116*5e80364aSKumar Sanghvi 	pi->adapter = adapter;
117*5e80364aSKumar Sanghvi 	err = cxgbevf_probe(adapter);
118*5e80364aSKumar Sanghvi 	if (err) {
119*5e80364aSKumar Sanghvi 		dev_err(adapter, "%s: cxgbevf probe failed with err %d\n",
120*5e80364aSKumar Sanghvi 			__func__, err);
121*5e80364aSKumar Sanghvi 		goto out_free_adapter;
122*5e80364aSKumar Sanghvi 	}
123*5e80364aSKumar Sanghvi 
124*5e80364aSKumar Sanghvi 	return 0;
125*5e80364aSKumar Sanghvi 
126*5e80364aSKumar Sanghvi out_free_adapter:
127*5e80364aSKumar Sanghvi 	rte_free(adapter);
128*5e80364aSKumar Sanghvi 	return err;
129011ebc23SKumar Sanghvi }
130011ebc23SKumar Sanghvi 
131011ebc23SKumar Sanghvi static int eth_cxgbevf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
132011ebc23SKumar Sanghvi 				 struct rte_pci_device *pci_dev)
133011ebc23SKumar Sanghvi {
134011ebc23SKumar Sanghvi 	return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct port_info),
135011ebc23SKumar Sanghvi 					     eth_cxgbevf_dev_init);
136011ebc23SKumar Sanghvi }
137011ebc23SKumar Sanghvi 
138011ebc23SKumar Sanghvi static int eth_cxgbevf_pci_remove(struct rte_pci_device *pci_dev)
139011ebc23SKumar Sanghvi {
140011ebc23SKumar Sanghvi 	return rte_eth_dev_pci_generic_remove(pci_dev, NULL);
141011ebc23SKumar Sanghvi }
142011ebc23SKumar Sanghvi 
143011ebc23SKumar Sanghvi static struct rte_pci_driver rte_cxgbevf_pmd = {
144011ebc23SKumar Sanghvi 	.id_table = cxgb4vf_pci_tbl,
145011ebc23SKumar Sanghvi 	.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
146011ebc23SKumar Sanghvi 	.probe = eth_cxgbevf_pci_probe,
147011ebc23SKumar Sanghvi 	.remove = eth_cxgbevf_pci_remove,
148011ebc23SKumar Sanghvi };
149011ebc23SKumar Sanghvi 
150011ebc23SKumar Sanghvi RTE_PMD_REGISTER_PCI(net_cxgbevf, rte_cxgbevf_pmd);
151011ebc23SKumar Sanghvi RTE_PMD_REGISTER_PCI_TABLE(net_cxgbevf, cxgb4vf_pci_tbl);
152011ebc23SKumar Sanghvi RTE_PMD_REGISTER_KMOD_DEP(net_cxgbevf, "* igb_uio | vfio-pci");
153