Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2019 Marvell International Ltd.
3 : : */
4 : :
5 : : #include <rte_malloc.h>
6 : :
7 : : #include "nitrox_device.h"
8 : : #include "nitrox_hal.h"
9 : :
10 : : #define PCI_VENDOR_ID_CAVIUM 0x177d
11 : : #define NITROX_V_PCI_VF_DEV_ID 0x13
12 : :
13 : : TAILQ_HEAD(ndev_list, nitrox_device);
14 : : static struct ndev_list ndev_list = TAILQ_HEAD_INITIALIZER(ndev_list);
15 : :
16 : : static struct nitrox_device *
17 : 0 : ndev_allocate(struct rte_pci_device *pdev)
18 : : {
19 : : struct nitrox_device *ndev;
20 : :
21 : 0 : ndev = rte_zmalloc_socket("nitrox device", sizeof(*ndev),
22 : : RTE_CACHE_LINE_SIZE,
23 : : pdev->device.numa_node);
24 [ # # ]: 0 : if (!ndev)
25 : : return NULL;
26 : :
27 : 0 : TAILQ_INSERT_TAIL(&ndev_list, ndev, next);
28 : 0 : return ndev;
29 : : }
30 : :
31 : : static void
32 : 0 : ndev_init(struct nitrox_device *ndev, struct rte_pci_device *pdev)
33 : : {
34 : : enum nitrox_vf_mode vf_mode;
35 : :
36 : 0 : ndev->pdev = pdev;
37 : 0 : ndev->bar_addr = pdev->mem_resource[0].addr;
38 : 0 : vf_mode = vf_get_vf_config_mode(ndev->bar_addr);
39 : 0 : ndev->nr_queues = vf_config_mode_to_nr_queues(vf_mode);
40 : 0 : }
41 : :
42 : : static struct nitrox_device *
43 : : find_ndev(struct rte_pci_device *pdev)
44 : : {
45 : : struct nitrox_device *ndev;
46 : :
47 [ # # ]: 0 : TAILQ_FOREACH(ndev, &ndev_list, next)
48 [ # # ]: 0 : if (ndev->pdev == pdev)
49 : : return ndev;
50 : :
51 : : return NULL;
52 : : }
53 : :
54 : : static void
55 : 0 : ndev_release(struct nitrox_device *ndev)
56 : : {
57 [ # # ]: 0 : if (!ndev)
58 : : return;
59 : :
60 [ # # ]: 0 : TAILQ_REMOVE(&ndev_list, ndev, next);
61 : 0 : rte_free(ndev);
62 : : }
63 : :
64 : : TAILQ_HEAD(ndrv_list, nitrox_driver);
65 : : static struct ndrv_list ndrv_list = TAILQ_HEAD_INITIALIZER(ndrv_list);
66 : :
67 : : void
68 : 504 : nitrox_register_driver(struct nitrox_driver *ndrv)
69 : : {
70 : 504 : TAILQ_INSERT_TAIL(&ndrv_list, ndrv, next);
71 : 504 : }
72 : :
73 : : static int
74 : 0 : nitrox_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
75 : : struct rte_pci_device *pdev)
76 : : {
77 : : struct nitrox_device *ndev;
78 : : struct nitrox_driver *ndrv;
79 : : int err = -1;
80 : :
81 : : /* Nitrox CSR space */
82 [ # # ]: 0 : if (!pdev->mem_resource[0].addr)
83 : : return -EINVAL;
84 : :
85 : 0 : ndev = ndev_allocate(pdev);
86 [ # # ]: 0 : if (!ndev)
87 : : return -ENOMEM;
88 : :
89 : 0 : ndev_init(ndev, pdev);
90 [ # # ]: 0 : TAILQ_FOREACH(ndrv, &ndrv_list, next) {
91 : 0 : err = ndrv->create(ndev);
92 [ # # ]: 0 : if (err)
93 : 0 : goto drv_err;
94 : : }
95 : :
96 : : return 0;
97 : :
98 : : drv_err:
99 : 0 : ndrv = TAILQ_PREV(ndrv, ndrv_list, next);
100 [ # # ]: 0 : while (ndrv != NULL) {
101 : 0 : ndrv->destroy(ndev);
102 : 0 : ndrv = TAILQ_PREV(ndrv, ndrv_list, next);
103 : : }
104 : :
105 : 0 : ndev_release(ndev);
106 : 0 : return err;
107 : : }
108 : :
109 : : static int
110 : 0 : nitrox_pci_remove(struct rte_pci_device *pdev)
111 : : {
112 : : struct nitrox_device *ndev;
113 : : struct nitrox_driver *ndrv;
114 : : int err;
115 : :
116 : : ndev = find_ndev(pdev);
117 [ # # ]: 0 : if (!ndev)
118 : : return -ENODEV;
119 : :
120 [ # # ]: 0 : TAILQ_FOREACH(ndrv, &ndrv_list, next) {
121 : 0 : err = ndrv->destroy(ndev);
122 [ # # ]: 0 : if (err)
123 : 0 : return err;
124 : : }
125 : :
126 : 0 : ndev_release(ndev);
127 : 0 : return 0;
128 : : }
129 : :
130 : : static struct rte_pci_id pci_id_nitrox_map[] = {
131 : : {
132 : : /* Nitrox 5 VF */
133 : : RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, NITROX_V_PCI_VF_DEV_ID)
134 : : },
135 : : {.device_id = 0},
136 : : };
137 : :
138 : : static struct rte_pci_driver nitrox_pmd = {
139 : : .id_table = pci_id_nitrox_map,
140 : : .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
141 : : .probe = nitrox_pci_probe,
142 : : .remove = nitrox_pci_remove,
143 : : };
144 : :
145 : 252 : RTE_PMD_REGISTER_PCI(nitrox, nitrox_pmd);
146 : : RTE_PMD_REGISTER_PCI_TABLE(nitrox, pci_id_nitrox_map);
|