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 55ef51809SAlfredo Cardigliano #include <rte_pci.h> 65ef51809SAlfredo Cardigliano #include <rte_bus_pci.h> 75ef51809SAlfredo Cardigliano #include <rte_ethdev.h> 85ef51809SAlfredo Cardigliano #include <rte_ethdev_driver.h> 95ef51809SAlfredo Cardigliano #include <rte_malloc.h> 105ef51809SAlfredo Cardigliano 117c125393SAlfredo Cardigliano #include "ionic_logs.h" 125ef51809SAlfredo Cardigliano #include "ionic.h" 135ef51809SAlfredo Cardigliano #include "ionic_dev.h" 145ef51809SAlfredo Cardigliano #include "ionic_mac_api.h" 157c125393SAlfredo Cardigliano 167c125393SAlfredo Cardigliano int ionic_logtype; 177c125393SAlfredo Cardigliano 185ef51809SAlfredo Cardigliano static const struct rte_pci_id pci_id_ionic_map[] = { 195ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_PF) }, 205ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_VF) }, 215ef51809SAlfredo Cardigliano { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_MGMT) }, 225ef51809SAlfredo Cardigliano { .vendor_id = 0, /* sentinel */ }, 235ef51809SAlfredo Cardigliano }; 245ef51809SAlfredo Cardigliano 255ef51809SAlfredo Cardigliano static int 265ef51809SAlfredo Cardigliano eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, 275ef51809SAlfredo Cardigliano struct rte_pci_device *pci_dev) 285ef51809SAlfredo Cardigliano { 295ef51809SAlfredo Cardigliano struct rte_mem_resource *resource; 305ef51809SAlfredo Cardigliano struct ionic_adapter *adapter; 315ef51809SAlfredo Cardigliano struct ionic_hw *hw; 325ef51809SAlfredo Cardigliano unsigned long i; 335ef51809SAlfredo Cardigliano int err; 345ef51809SAlfredo Cardigliano 355ef51809SAlfredo Cardigliano /* Check structs (trigger error at compilation time) */ 365ef51809SAlfredo Cardigliano ionic_struct_size_checks(); 375ef51809SAlfredo Cardigliano 385ef51809SAlfredo Cardigliano /* Multi-process not supported */ 395ef51809SAlfredo Cardigliano if (rte_eal_process_type() != RTE_PROC_PRIMARY) { 405ef51809SAlfredo Cardigliano err = -EPERM; 415ef51809SAlfredo Cardigliano goto err; 425ef51809SAlfredo Cardigliano } 435ef51809SAlfredo Cardigliano 445ef51809SAlfredo Cardigliano IONIC_PRINT(DEBUG, "Initializing device %s", 455ef51809SAlfredo Cardigliano pci_dev->device.name); 465ef51809SAlfredo Cardigliano 475ef51809SAlfredo Cardigliano adapter = rte_zmalloc("ionic", sizeof(*adapter), 0); 485ef51809SAlfredo Cardigliano if (!adapter) { 495ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "OOM"); 505ef51809SAlfredo Cardigliano err = -ENOMEM; 515ef51809SAlfredo Cardigliano goto err; 525ef51809SAlfredo Cardigliano } 535ef51809SAlfredo Cardigliano 545ef51809SAlfredo Cardigliano adapter->pci_dev = pci_dev; 555ef51809SAlfredo Cardigliano hw = &adapter->hw; 565ef51809SAlfredo Cardigliano 575ef51809SAlfredo Cardigliano hw->device_id = pci_dev->id.device_id; 585ef51809SAlfredo Cardigliano hw->vendor_id = pci_dev->id.vendor_id; 595ef51809SAlfredo Cardigliano 605ef51809SAlfredo Cardigliano err = ionic_init_mac(hw); 615ef51809SAlfredo Cardigliano if (err != 0) { 625ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Mac init failed: %d", err); 635ef51809SAlfredo Cardigliano err = -EIO; 645ef51809SAlfredo Cardigliano goto err_free_adapter; 655ef51809SAlfredo Cardigliano } 665ef51809SAlfredo Cardigliano 675ef51809SAlfredo Cardigliano adapter->is_mgmt_nic = (pci_dev->id.device_id == IONIC_DEV_ID_ETH_MGMT); 685ef51809SAlfredo Cardigliano 695ef51809SAlfredo Cardigliano adapter->num_bars = 0; 705ef51809SAlfredo Cardigliano for (i = 0; i < PCI_MAX_RESOURCE && i < IONIC_BARS_MAX; i++) { 715ef51809SAlfredo Cardigliano resource = &pci_dev->mem_resource[i]; 725ef51809SAlfredo Cardigliano if (resource->phys_addr == 0 || resource->len == 0) 735ef51809SAlfredo Cardigliano continue; 745ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].vaddr = resource->addr; 755ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].bus_addr = resource->phys_addr; 765ef51809SAlfredo Cardigliano adapter->bars[adapter->num_bars].len = resource->len; 775ef51809SAlfredo Cardigliano adapter->num_bars++; 785ef51809SAlfredo Cardigliano } 795ef51809SAlfredo Cardigliano 805ef51809SAlfredo Cardigliano /* Discover ionic dev resources */ 815ef51809SAlfredo Cardigliano 825ef51809SAlfredo Cardigliano err = ionic_setup(adapter); 835ef51809SAlfredo Cardigliano if (err) { 845ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot setup device: %d, aborting", err); 855ef51809SAlfredo Cardigliano goto err_free_adapter; 865ef51809SAlfredo Cardigliano } 875ef51809SAlfredo Cardigliano 885ef51809SAlfredo Cardigliano err = ionic_identify(adapter); 895ef51809SAlfredo Cardigliano if (err) { 905ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot identify device: %d, aborting", 915ef51809SAlfredo Cardigliano err); 925ef51809SAlfredo Cardigliano goto err_free_adapter; 935ef51809SAlfredo Cardigliano } 945ef51809SAlfredo Cardigliano 955ef51809SAlfredo Cardigliano err = ionic_init(adapter); 965ef51809SAlfredo Cardigliano if (err) { 975ef51809SAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot init device: %d, aborting", err); 985ef51809SAlfredo Cardigliano goto err_free_adapter; 995ef51809SAlfredo Cardigliano } 1005ef51809SAlfredo Cardigliano 101*23bf4ddbSAlfredo Cardigliano /* Configure the ports */ 102*23bf4ddbSAlfredo Cardigliano err = ionic_port_identify(adapter); 103*23bf4ddbSAlfredo Cardigliano if (err) { 104*23bf4ddbSAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot identify port: %d, aborting", 105*23bf4ddbSAlfredo Cardigliano err); 106*23bf4ddbSAlfredo Cardigliano goto err_free_adapter; 107*23bf4ddbSAlfredo Cardigliano } 108*23bf4ddbSAlfredo Cardigliano 109*23bf4ddbSAlfredo Cardigliano err = ionic_port_init(adapter); 110*23bf4ddbSAlfredo Cardigliano if (err) { 111*23bf4ddbSAlfredo Cardigliano IONIC_PRINT(ERR, "Cannot init port: %d, aborting", err); 112*23bf4ddbSAlfredo Cardigliano goto err_free_adapter; 113*23bf4ddbSAlfredo Cardigliano } 114*23bf4ddbSAlfredo Cardigliano 1155ef51809SAlfredo Cardigliano return 0; 1165ef51809SAlfredo Cardigliano 1175ef51809SAlfredo Cardigliano err_free_adapter: 1185ef51809SAlfredo Cardigliano rte_free(adapter); 1195ef51809SAlfredo Cardigliano err: 1205ef51809SAlfredo Cardigliano return err; 1215ef51809SAlfredo Cardigliano } 1225ef51809SAlfredo Cardigliano 1235ef51809SAlfredo Cardigliano static int 1245ef51809SAlfredo Cardigliano eth_ionic_pci_remove(struct rte_pci_device *pci_dev __rte_unused) 1255ef51809SAlfredo Cardigliano { 1265ef51809SAlfredo Cardigliano return 0; 1275ef51809SAlfredo Cardigliano } 1285ef51809SAlfredo Cardigliano 1295ef51809SAlfredo Cardigliano static struct rte_pci_driver rte_ionic_pmd = { 1305ef51809SAlfredo Cardigliano .id_table = pci_id_ionic_map, 1315ef51809SAlfredo Cardigliano .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, 1325ef51809SAlfredo Cardigliano .probe = eth_ionic_pci_probe, 1335ef51809SAlfredo Cardigliano .remove = eth_ionic_pci_remove, 1345ef51809SAlfredo Cardigliano }; 1355ef51809SAlfredo Cardigliano 1365ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_PCI(net_ionic, rte_ionic_pmd); 1375ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_PCI_TABLE(net_ionic, pci_id_ionic_map); 1385ef51809SAlfredo Cardigliano RTE_PMD_REGISTER_KMOD_DEP(net_ionic, "* igb_uio | uio_pci_generic | vfio-pci"); 1395ef51809SAlfredo Cardigliano 1407c125393SAlfredo Cardigliano RTE_INIT(ionic_init_log) 1417c125393SAlfredo Cardigliano { 1427c125393SAlfredo Cardigliano ionic_logtype = rte_log_register("pmd.net.ionic"); 1437c125393SAlfredo Cardigliano if (ionic_logtype >= 0) 1447c125393SAlfredo Cardigliano rte_log_set_level(ionic_logtype, RTE_LOG_NOTICE); 1457c125393SAlfredo Cardigliano } 146