/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) * Copyright(c) 2018-2019 Pensando Systems, Inc. All rights reserved. */ #include #include #include #include #include #include "ionic_logs.h" #include "ionic.h" #include "ionic_dev.h" #include "ionic_mac_api.h" int ionic_logtype; static const struct rte_pci_id pci_id_ionic_map[] = { { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_PF) }, { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_VF) }, { RTE_PCI_DEVICE(IONIC_PENSANDO_VENDOR_ID, IONIC_DEV_ID_ETH_MGMT) }, { .vendor_id = 0, /* sentinel */ }, }; static int eth_ionic_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev) { struct rte_mem_resource *resource; struct ionic_adapter *adapter; struct ionic_hw *hw; unsigned long i; int err; /* Check structs (trigger error at compilation time) */ ionic_struct_size_checks(); /* Multi-process not supported */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) { err = -EPERM; goto err; } IONIC_PRINT(DEBUG, "Initializing device %s", pci_dev->device.name); adapter = rte_zmalloc("ionic", sizeof(*adapter), 0); if (!adapter) { IONIC_PRINT(ERR, "OOM"); err = -ENOMEM; goto err; } adapter->pci_dev = pci_dev; hw = &adapter->hw; hw->device_id = pci_dev->id.device_id; hw->vendor_id = pci_dev->id.vendor_id; err = ionic_init_mac(hw); if (err != 0) { IONIC_PRINT(ERR, "Mac init failed: %d", err); err = -EIO; goto err_free_adapter; } adapter->is_mgmt_nic = (pci_dev->id.device_id == IONIC_DEV_ID_ETH_MGMT); adapter->num_bars = 0; for (i = 0; i < PCI_MAX_RESOURCE && i < IONIC_BARS_MAX; i++) { resource = &pci_dev->mem_resource[i]; if (resource->phys_addr == 0 || resource->len == 0) continue; adapter->bars[adapter->num_bars].vaddr = resource->addr; adapter->bars[adapter->num_bars].bus_addr = resource->phys_addr; adapter->bars[adapter->num_bars].len = resource->len; adapter->num_bars++; } /* Discover ionic dev resources */ err = ionic_setup(adapter); if (err) { IONIC_PRINT(ERR, "Cannot setup device: %d, aborting", err); goto err_free_adapter; } err = ionic_identify(adapter); if (err) { IONIC_PRINT(ERR, "Cannot identify device: %d, aborting", err); goto err_free_adapter; } err = ionic_init(adapter); if (err) { IONIC_PRINT(ERR, "Cannot init device: %d, aborting", err); goto err_free_adapter; } return 0; err_free_adapter: rte_free(adapter); err: return err; } static int eth_ionic_pci_remove(struct rte_pci_device *pci_dev __rte_unused) { return 0; } static struct rte_pci_driver rte_ionic_pmd = { .id_table = pci_id_ionic_map, .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, .probe = eth_ionic_pci_probe, .remove = eth_ionic_pci_remove, }; RTE_PMD_REGISTER_PCI(net_ionic, rte_ionic_pmd); RTE_PMD_REGISTER_PCI_TABLE(net_ionic, pci_id_ionic_map); RTE_PMD_REGISTER_KMOD_DEP(net_ionic, "* igb_uio | uio_pci_generic | vfio-pci"); RTE_INIT(ionic_init_log) { ionic_logtype = rte_log_register("pmd.net.ionic"); if (ionic_logtype >= 0) rte_log_set_level(ionic_logtype, RTE_LOG_NOTICE); }