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