Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2024 ZTE Corporation
3 : : */
4 : :
5 : : #include "zsda_qp.h"
6 : : #include "zsda_device.h"
7 : :
8 : : /* per-process array of device data */
9 : : struct zsda_device_info zsda_devs[RTE_PMD_ZSDA_MAX_PCI_DEVICES];
10 : :
11 : : /*
12 : : * The set of PCI devices this driver supports
13 : : */
14 : : static const struct rte_pci_id pci_id_zsda_map[] = {
15 : : {
16 : : RTE_PCI_DEVICE(0x1cf2, 0x8050),
17 : : },
18 : : {
19 : : RTE_PCI_DEVICE(0x1cf2, 0x8051),
20 : : },
21 : : {.device_id = 0},
22 : : };
23 : :
24 : : static struct zsda_pci_device *
25 : 0 : zsda_pci_dev_by_name_get(const char *name)
26 : : {
27 : : unsigned int i;
28 : :
29 [ # # ]: 0 : if (name == NULL) {
30 : 0 : ZSDA_LOG(ERR, "Failed! name is NULL.");
31 : 0 : return NULL;
32 : : }
33 [ # # ]: 0 : for (i = 0; i < RTE_PMD_ZSDA_MAX_PCI_DEVICES; i++) {
34 [ # # ]: 0 : if (zsda_devs[i].mz &&
35 : 0 : (strcmp(((struct zsda_pci_device *)zsda_devs[i].mz->addr)
36 [ # # ]: 0 : ->name,
37 : : name) == 0))
38 : 0 : return (struct zsda_pci_device *)zsda_devs[i].mz->addr;
39 : : }
40 : :
41 : : return NULL;
42 : : }
43 : :
44 : : static uint8_t
45 : : zsda_pci_dev_free_id_get(void)
46 : : {
47 : : uint32_t dev_id;
48 : :
49 [ # # ]: 0 : for (dev_id = 0; dev_id < RTE_PMD_ZSDA_MAX_PCI_DEVICES; dev_id++)
50 [ # # ]: 0 : if (zsda_devs[dev_id].mz == NULL)
51 : : break;
52 : :
53 : 0 : return dev_id & (ZSDA_MAX_DEV - 1);
54 : : }
55 : :
56 : : static struct zsda_pci_device *
57 : : zsda_pci_dev_get(const struct rte_pci_device *pci_dev)
58 : : {
59 : : char name[ZSDA_DEV_NAME_MAX_LEN];
60 : :
61 : 0 : rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
62 : :
63 : 0 : return zsda_pci_dev_by_name_get(name);
64 : : }
65 : :
66 : : static struct zsda_pci_device *
67 : 0 : zsda_pci_device_allocate(struct rte_pci_device *pci_dev)
68 : : {
69 : : struct zsda_pci_device *zsda_pci_dev;
70 : : uint8_t zsda_dev_id;
71 : : char name[ZSDA_DEV_NAME_MAX_LEN];
72 : 0 : unsigned int socket_id = rte_socket_id();
73 : :
74 : 0 : rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
75 : 0 : snprintf(name + strlen(name), (ZSDA_DEV_NAME_MAX_LEN - strlen(name)),
76 : : "_zsda");
77 [ # # ]: 0 : if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
78 : 0 : const struct rte_memzone *mz = rte_memzone_lookup(name);
79 : :
80 [ # # ]: 0 : if (mz == NULL) {
81 : 0 : ZSDA_LOG(ERR, "Secondary can't find %s mz", name);
82 : 0 : return NULL;
83 : : }
84 : 0 : zsda_pci_dev = mz->addr;
85 : 0 : zsda_devs[zsda_pci_dev->zsda_dev_id].mz = mz;
86 : 0 : zsda_devs[zsda_pci_dev->zsda_dev_id].pci_dev = pci_dev;
87 : 0 : return zsda_pci_dev;
88 : : }
89 : :
90 [ # # ]: 0 : if (zsda_pci_dev_by_name_get(name) != NULL) {
91 : 0 : ZSDA_LOG(ERR, "Failed! config");
92 : 0 : return NULL;
93 : : }
94 : :
95 : : zsda_dev_id = zsda_pci_dev_free_id_get();
96 : :
97 [ # # ]: 0 : if (zsda_dev_id == (RTE_PMD_ZSDA_MAX_PCI_DEVICES - 1))
98 : : return NULL;
99 : :
100 : 0 : zsda_devs[zsda_dev_id].mz =
101 : 0 : rte_memzone_reserve(name, sizeof(struct zsda_pci_device),
102 : 0 : (int)(socket_id & 0xfff), 0);
103 : :
104 [ # # ]: 0 : if (zsda_devs[zsda_dev_id].mz == NULL) {
105 : 0 : ZSDA_LOG(ERR, "Failed! malloc");
106 : 0 : return NULL;
107 : : }
108 : 0 : zsda_pci_dev = zsda_devs[zsda_dev_id].mz->addr;
109 : : memset(zsda_pci_dev, 0, sizeof(*zsda_pci_dev));
110 : 0 : memcpy(zsda_pci_dev->name, name, ZSDA_DEV_NAME_MAX_LEN);
111 : 0 : zsda_pci_dev->zsda_dev_id = zsda_dev_id;
112 : 0 : zsda_pci_dev->pci_dev = pci_dev;
113 : 0 : zsda_devs[zsda_dev_id].pci_dev = pci_dev;
114 : :
115 : 0 : return zsda_pci_dev;
116 : : }
117 : :
118 : : static int
119 : 0 : zsda_pci_device_release(const struct rte_pci_device *pci_dev)
120 : : {
121 : : struct zsda_pci_device *zsda_pci_dev;
122 : : struct zsda_device_info *inst;
123 : : char name[ZSDA_DEV_NAME_MAX_LEN];
124 : :
125 [ # # ]: 0 : if (pci_dev == NULL)
126 : : return -EINVAL;
127 : :
128 : 0 : rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
129 : :
130 : 0 : snprintf(name + strlen(name),
131 : 0 : ZSDA_DEV_NAME_MAX_LEN - (strlen(name) - 1), "_zsda");
132 : 0 : zsda_pci_dev = zsda_pci_dev_by_name_get(name);
133 [ # # ]: 0 : if (zsda_pci_dev != NULL) {
134 : 0 : inst = &zsda_devs[zsda_pci_dev->zsda_dev_id];
135 : :
136 [ # # ]: 0 : if (rte_eal_process_type() == RTE_PROC_PRIMARY)
137 : 0 : rte_memzone_free(inst->mz);
138 : :
139 : : memset(inst, 0, sizeof(struct zsda_device_info));
140 : : }
141 : : return 0;
142 : : }
143 : :
144 : : static int
145 : : zsda_pci_dev_destroy(struct zsda_pci_device *zsda_pci_dev,
146 : : const struct rte_pci_device *pci_dev)
147 : : {
148 : :
149 : 0 : zsda_comp_dev_destroy(zsda_pci_dev);
150 : 0 : zsda_crypto_dev_destroy(zsda_pci_dev);
151 : :
152 : 0 : return zsda_pci_device_release(pci_dev);
153 : : }
154 : :
155 : : static int
156 : 0 : zsda_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
157 : : struct rte_pci_device *pci_dev)
158 : : {
159 : : int ret = 0;
160 : : struct zsda_pci_device *zsda_pci_dev;
161 : :
162 : 0 : zsda_pci_dev = zsda_pci_device_allocate(pci_dev);
163 [ # # ]: 0 : if (zsda_pci_dev == NULL) {
164 : 0 : ZSDA_LOG(ERR, "Failed! zsda_pci_dev is NULL");
165 : 0 : return -ENODEV;
166 : : }
167 : :
168 : 0 : ret = zsda_queue_init(zsda_pci_dev);
169 [ # # ]: 0 : if (ret) {
170 : 0 : ZSDA_LOG(ERR, "Failed! queue init.");
171 : 0 : return ret;
172 : : }
173 : :
174 : 0 : ret = zsda_comp_dev_create(zsda_pci_dev);
175 [ # # ]: 0 : if (ret)
176 : 0 : ZSDA_LOG(ERR, "Failed! comp_dev create.");
177 : :
178 : 0 : ret = zsda_crypto_dev_create(zsda_pci_dev);
179 [ # # ]: 0 : if (ret) {
180 : 0 : ZSDA_LOG(ERR, "Failed! crypto_dev create.");
181 : 0 : goto exit;
182 : : }
183 : :
184 : : return ret;
185 : :
186 : : exit:
187 : 0 : zsda_comp_dev_destroy(zsda_pci_dev);
188 : :
189 : 0 : return ZSDA_FAILED;
190 : : }
191 : :
192 : : static int
193 : 0 : zsda_pci_remove(struct rte_pci_device *pci_dev)
194 : : {
195 : : struct zsda_pci_device *zsda_pci_dev;
196 : :
197 [ # # ]: 0 : if (pci_dev == NULL)
198 : : return -EINVAL;
199 : :
200 : : zsda_pci_dev = zsda_pci_dev_get(pci_dev);
201 [ # # ]: 0 : if (zsda_pci_dev == NULL)
202 : : return 0;
203 : :
204 : 0 : return zsda_pci_dev_destroy(zsda_pci_dev, pci_dev);
205 : : }
206 : :
207 : : static struct rte_pci_driver rte_zsda_pmd = {
208 : : .id_table = pci_id_zsda_map,
209 : : .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
210 : : .probe = zsda_pci_probe,
211 : : .remove = zsda_pci_remove
212 : : };
213 : :
214 : 302 : RTE_PMD_REGISTER_PCI(ZSDA_PCI_NAME, rte_zsda_pmd);
215 : : RTE_PMD_REGISTER_PCI_TABLE(ZSDA_PCI_NAME, pci_id_zsda_map);
216 : : RTE_PMD_REGISTER_KMOD_DEP(ZSDA_PCI_NAME,
217 : : "* igb_uio | uio_pci_generic | vfio-pci");
|