net/axgbe: add minimal init and uninit support
[dpdk.git] / drivers / net / axgbe / axgbe_ethdev.c
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
3  *   Copyright(c) 2018 Synopsys, Inc. All rights reserved.
4  */
5
6 #include "axgbe_ethdev.h"
7
8 static int eth_axgbe_dev_init(struct rte_eth_dev *eth_dev);
9 static int eth_axgbe_dev_uninit(struct rte_eth_dev *eth_dev);
10
11 /* The set of PCI devices this driver supports */
12 #define AMD_PCI_VENDOR_ID       0x1022
13 #define AMD_PCI_AXGBE_DEVICE_V2A 0x1458
14 #define AMD_PCI_AXGBE_DEVICE_V2B 0x1459
15
16 int axgbe_logtype_init;
17 int axgbe_logtype_driver;
18
19 static const struct rte_pci_id pci_id_axgbe_map[] = {
20         {RTE_PCI_DEVICE(AMD_PCI_VENDOR_ID, AMD_PCI_AXGBE_DEVICE_V2A)},
21         {RTE_PCI_DEVICE(AMD_PCI_VENDOR_ID, AMD_PCI_AXGBE_DEVICE_V2B)},
22         { .vendor_id = 0, },
23 };
24
25 /*
26  * It returns 0 on success.
27  */
28 static int
29 eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)
30 {
31         PMD_INIT_FUNC_TRACE();
32         struct axgbe_port *pdata;
33         struct rte_pci_device *pci_dev;
34
35         /*
36          * For secondary processes, we don't initialise any further as primary
37          * has already done this work.
38          */
39         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
40                 return 0;
41
42         pdata = (struct axgbe_port *)eth_dev->data->dev_private;
43         pdata->eth_dev = eth_dev;
44
45         pci_dev = RTE_DEV_TO_PCI(eth_dev->device);
46         pdata->pci_dev = pci_dev;
47
48         PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x",
49                      eth_dev->data->port_id, pci_dev->id.vendor_id,
50                      pci_dev->id.device_id);
51
52         return 0;
53 }
54
55 static int
56 eth_axgbe_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
57 {
58         /* stub function */
59         PMD_INIT_FUNC_TRACE();
60
61         return 0;
62 }
63
64 static int eth_axgbe_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
65         struct rte_pci_device *pci_dev)
66 {
67         return rte_eth_dev_pci_generic_probe(pci_dev,
68                 sizeof(struct axgbe_port), eth_axgbe_dev_init);
69 }
70
71 static int eth_axgbe_pci_remove(struct rte_pci_device *pci_dev)
72 {
73         return rte_eth_dev_pci_generic_remove(pci_dev, eth_axgbe_dev_uninit);
74 }
75
76 static struct rte_pci_driver rte_axgbe_pmd = {
77         .id_table = pci_id_axgbe_map,
78         .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
79         .probe = eth_axgbe_pci_probe,
80         .remove = eth_axgbe_pci_remove,
81 };
82
83 RTE_PMD_REGISTER_PCI(net_axgbe, rte_axgbe_pmd);
84 RTE_PMD_REGISTER_PCI_TABLE(net_axgbe, pci_id_axgbe_map);
85 RTE_PMD_REGISTER_KMOD_DEP(net_axgbe, "* igb_uio | uio_pci_generic | vfio-pci");
86
87 RTE_INIT(axgbe_init_log);
88 static void
89 axgbe_init_log(void)
90 {
91         axgbe_logtype_init = rte_log_register("pmd.net.axgbe.init");
92         if (axgbe_logtype_init >= 0)
93                 rte_log_set_level(axgbe_logtype_init, RTE_LOG_NOTICE);
94         axgbe_logtype_driver = rte_log_register("pmd.net.axgbe.driver");
95         if (axgbe_logtype_driver >= 0)
96                 rte_log_set_level(axgbe_logtype_driver, RTE_LOG_NOTICE);
97 }