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