17c125393SAlfredo Cardigliano /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 27c125393SAlfredo Cardigliano * Copyright(c) 2018-2019 Pensando Systems, Inc. All rights reserved. 37c125393SAlfredo Cardigliano */ 47c125393SAlfredo Cardigliano 5*5ef51809SAlfredo Cardigliano #include <rte_pci.h> 6*5ef51809SAlfredo Cardigliano #include <rte_bus_pci.h> 7*5ef51809SAlfredo Cardigliano #include <rte_ethdev.h> 8*5ef51809SAlfredo Cardigliano #include <rte_ethdev_driver.h> 9*5ef51809SAlfredo Cardigliano #include <rte_malloc.h> 10*5ef51809SAlfredo Cardigliano 117c125393SAlfredo Cardigliano #include "ionic_logs.h" 12*5ef51809SAlfredo Cardigliano #include "ionic.h" 13*5ef51809SAlfredo Cardigliano #include "ionic_dev.h" 14*5ef51809SAlfredo Cardigliano #include "ionic_mac_api.h" 157c125393SAlfredo Cardigliano 167c125393SAlfredo Cardigliano int ionic_logtype; 177c125393SAlfredo Cardigliano 18*5ef51809SAlfredo Cardigliano static const struct rte_pci_id pci_id_ionic_map[] = { 19*5ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_PF) }, 20*5ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_VF) }, 21*5ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_MGMT) }, 22*5ef51809SAlfredo Cardigliano { .vendor_id = 0, /* sentinel */ }, 23*5ef51809SAlfredo Cardigliano }; 24*5ef51809SAlfredo Cardigliano 25*5ef51809SAlfredo Cardigliano static int 26*5ef51809SAlfredo Cardigliano eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, 27*5ef51809SAlfredo Cardigliano struct rte_pci_device *pci_dev) 28*5ef51809SAlfredo Cardigliano { 29*5ef51809SAlfredo Cardigliano struct rte_mem_resource *resource; 30*5ef51809SAlfredo Cardigliano struct ionic_adapter *adapter; 31*5ef51809SAlfredo Cardigliano struct ionic_hw *hw; 32*5ef51809SAlfredo Cardigliano unsigned long i; 33*5ef51809SAlfredo Cardigliano int err; 34*5ef51809SAlfredo Cardigliano 35*5ef51809SAlfredo Cardigliano /* Check structs (trigger error at compilation time) */ 36*5ef51809SAlfredo Cardigliano ionic_struct_size_checks(); 37*5ef51809SAlfredo Cardigliano 38*5ef51809SAlfredo Cardigliano /* Multi-process not supported */ 39*5ef51809SAlfredo Cardigliano if (rte_eal_process_type() != RTE_PROC_PRIMARY) { 40*5ef51809SAlfredo Cardigliano err = -EPERM; 41*5ef51809SAlfredo Cardigliano goto err; 42*5ef51809SAlfredo Cardigliano } 43*5ef51809SAlfredo Cardigliano 44*5ef51809SAlfredo Cardigliano IONIC_PRINT(DEBUG, "Initializing device %s", 45*5ef51809SAlfredo Cardigliano pci_dev->device.name); 46*5ef51809SAlfredo Cardigliano 47*5ef51809SAlfredo Cardigliano adapter = rte_zmalloc("ionic", sizeof(*adapter), 0); 48*5ef51809SAlfredo Cardigliano if (!adapter) { 49*5ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "OOM"); 50*5ef51809SAlfredo Cardigliano err = -ENOMEM; 51*5ef51809SAlfredo Cardigliano goto err; 52*5ef51809SAlfredo Cardigliano } 53*5ef51809SAlfredo Cardigliano 54*5ef51809SAlfredo Cardigliano adapter->pci_dev = pci_dev; 55*5ef51809SAlfredo Cardigliano hw = &adapter->hw; 56*5ef51809SAlfredo Cardigliano 57*5ef51809SAlfredo Cardigliano hw->device_id = pci_dev->id.device_id; 58*5ef51809SAlfredo Cardigliano hw->vendor_id = pci_dev->id.vendor_id; 59*5ef51809SAlfredo Cardigliano 60*5ef51809SAlfredo Cardigliano err = ionic_init_mac(hw); 61*5ef51809SAlfredo Cardigliano if (err != 0) { 62*5ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Mac init failed: %d", err); 63*5ef51809SAlfredo Cardigliano err = -EIO; 64*5ef51809SAlfredo Cardigliano goto err_free_adapter; 65*5ef51809SAlfredo Cardigliano } 66*5ef51809SAlfredo Cardigliano 67*5ef51809SAlfredo Cardigliano adapter->is_mgmt_nic = (pci_dev->id.device_id == IONIC_DEV_ID_ETH_MGMT); 68*5ef51809SAlfredo Cardigliano 69*5ef51809SAlfredo Cardigliano adapter->num_bars = 0; 70*5ef51809SAlfredo Cardigliano for (i = 0; i < PCI_MAX_RESOURCE && i < IONIC_BARS_MAX; i++) { 71*5ef51809SAlfredo Cardigliano resource = &pci_dev->mem_resource[i]; 72*5ef51809SAlfredo Cardigliano if (resource->phys_addr == 0 || resource->len == 0) 73*5ef51809SAlfredo Cardigliano continue; 74*5ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].vaddr = resource->addr; 75*5ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].bus_addr = resource->phys_addr; 76*5ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].len = resource->len; 77*5ef51809SAlfredo Cardigliano adapter->num_bars++; 78*5ef51809SAlfredo Cardigliano } 79*5ef51809SAlfredo Cardigliano 80*5ef51809SAlfredo Cardigliano /* Discover ionic dev resources */ 81*5ef51809SAlfredo Cardigliano 82*5ef51809SAlfredo Cardigliano err = ionic_setup(adapter); 83*5ef51809SAlfredo Cardigliano if (err) { 84*5ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot setup device: %d, aborting", err); 85*5ef51809SAlfredo Cardigliano goto err_free_adapter; 86*5ef51809SAlfredo Cardigliano } 87*5ef51809SAlfredo Cardigliano 88*5ef51809SAlfredo Cardigliano err = ionic_identify(adapter); 89*5ef51809SAlfredo Cardigliano if (err) { 90*5ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot identify device: %d, aborting", 91*5ef51809SAlfredo Cardigliano err); 92*5ef51809SAlfredo Cardigliano goto err_free_adapter; 93*5ef51809SAlfredo Cardigliano } 94*5ef51809SAlfredo Cardigliano 95*5ef51809SAlfredo Cardigliano err = ionic_init(adapter); 96*5ef51809SAlfredo Cardigliano if (err) { 97*5ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot init device: %d, aborting", err); 98*5ef51809SAlfredo Cardigliano goto err_free_adapter; 99*5ef51809SAlfredo Cardigliano } 100*5ef51809SAlfredo Cardigliano 101*5ef51809SAlfredo Cardigliano return 0; 102*5ef51809SAlfredo Cardigliano 103*5ef51809SAlfredo Cardigliano err_free_adapter: 104*5ef51809SAlfredo Cardigliano rte_free(adapter); 105*5ef51809SAlfredo Cardigliano err: 106*5ef51809SAlfredo Cardigliano return err; 107*5ef51809SAlfredo Cardigliano } 108*5ef51809SAlfredo Cardigliano 109*5ef51809SAlfredo Cardigliano static int 110*5ef51809SAlfredo Cardigliano eth_ionic_pci_remove(struct rte_pci_device *pci_dev __rte_unused) 111*5ef51809SAlfredo Cardigliano { 112*5ef51809SAlfredo Cardigliano return 0; 113*5ef51809SAlfredo Cardigliano } 114*5ef51809SAlfredo Cardigliano 115*5ef51809SAlfredo Cardigliano static struct rte_pci_driver rte_ionic_pmd = { 116*5ef51809SAlfredo Cardigliano .id_table = pci_id_ionic_map, 117*5ef51809SAlfredo Cardigliano .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, 118*5ef51809SAlfredo Cardigliano .probe = eth_ionic_pci_probe, 119*5ef51809SAlfredo Cardigliano .remove = eth_ionic_pci_remove, 120*5ef51809SAlfredo Cardigliano }; 121*5ef51809SAlfredo Cardigliano 122*5ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_PCI(net_ionic, rte_ionic_pmd); 123*5ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_PCI_TABLE(net_ionic, pci_id_ionic_map); 124*5ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_KMOD_DEP(net_ionic, "* igb_uio | uio_pci_generic | vfio-pci"); 125*5ef51809SAlfredo Cardigliano 1267c125393SAlfredo Cardigliano RTE_INIT(ionic_init_log) 1277c125393SAlfredo Cardigliano { 1287c125393SAlfredo Cardigliano ionic_logtype = rte_log_register("pmd.net.ionic"); 1297c125393SAlfredo Cardigliano if (ionic_logtype >= 0) 1307c125393SAlfredo Cardigliano rte_log_set_level(ionic_logtype, RTE_LOG_NOTICE); 1317c125393SAlfredo Cardigliano } 132