net/virtio: fix incorrect cast of void *
[dpdk.git] / raw / ifpga / rte_pmd_ifpga.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2021 Intel Corporation
3  */
4
5 #include <rte_pci.h>
6 #include <rte_bus_pci.h>
7 #include <rte_rawdev.h>
8 #include <rte_rawdev_pmd.h>
9 #include "rte_pmd_ifpga.h"
10 #include "ifpga_rawdev.h"
11 #include "base/ifpga_api.h"
12 #include "base/ifpga_sec_mgr.h"
13
14
15 int
16 rte_pmd_ifpga_get_dev_id(const char *pci_addr, uint16_t *dev_id)
17 {
18         struct rte_pci_addr addr;
19         struct rte_rawdev *rdev = NULL;
20         char rdev_name[RTE_RAWDEV_NAME_MAX_LEN] = {0};
21
22         if (!pci_addr || !dev_id) {
23                 IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid.");
24                 return -EINVAL;
25         }
26
27         if (strnlen(pci_addr, PCI_PRI_STR_SIZE) == PCI_PRI_STR_SIZE) {
28                 IFPGA_RAWDEV_PMD_ERR("PCI address is too long.");
29                 return -EINVAL;
30         }
31
32         if (rte_pci_addr_parse(pci_addr, &addr)) {
33                 IFPGA_RAWDEV_PMD_ERR("PCI address %s is invalid.", pci_addr);
34                 return -EINVAL;
35         }
36
37         snprintf(rdev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%02x:%02x.%x",
38                 addr.bus, addr.devid, addr.function);
39         rdev = rte_rawdev_pmd_get_named_dev(rdev_name);
40         if (!rdev) {
41                 IFPGA_RAWDEV_PMD_DEBUG("%s is not probed by ifpga driver.",
42                         pci_addr);
43                 return -ENODEV;
44         }
45         *dev_id = rdev->dev_id;
46
47         return 0;
48 }
49
50 static struct rte_rawdev *
51 get_rte_rawdev(uint16_t dev_id)
52 {
53         struct rte_rawdev *dev = NULL;
54
55         if (dev_id >= RTE_RAWDEV_MAX_DEVS)
56                 return NULL;
57
58         dev = &rte_rawdevs[dev_id];
59         if (dev->attached == RTE_RAWDEV_ATTACHED)
60                 return dev;
61
62         return NULL;
63 }
64
65 static struct opae_adapter *
66 get_opae_adapter(uint16_t dev_id)
67 {
68         struct rte_rawdev *dev = NULL;
69         struct opae_adapter *adapter = NULL;
70
71         dev = get_rte_rawdev(dev_id);
72         if (!dev) {
73                 IFPGA_RAWDEV_PMD_ERR("Device ID %u is invalid.", dev_id);
74                 return NULL;
75         }
76
77         adapter = ifpga_rawdev_get_priv(dev);
78         if (!adapter) {
79                 IFPGA_RAWDEV_PMD_ERR("Adapter is not registered.");
80                 return NULL;
81         }
82
83         return adapter;
84 }
85
86 static opae_share_data *
87 get_share_data(struct opae_adapter *adapter)
88 {
89         opae_share_data *sd = NULL;
90
91         if (!adapter)
92                 return NULL;
93
94         sd = (opae_share_data *)adapter->shm.ptr;
95         if (!sd) {
96                 IFPGA_RAWDEV_PMD_ERR("Share data is not initialized.");
97                 return NULL;
98         }
99
100         return sd;
101 }
102
103 int
104 rte_pmd_ifpga_get_rsu_status(uint16_t dev_id, uint32_t *stat, uint32_t *prog)
105 {
106         struct opae_adapter *adapter = NULL;
107         opae_share_data *sd = NULL;
108
109         adapter = get_opae_adapter(dev_id);
110         if (!adapter)
111                 return -ENODEV;
112
113         sd = get_share_data(adapter);
114         if (!sd)
115                 return -ENOMEM;
116
117         if (stat)
118                 *stat = IFPGA_RSU_GET_STAT(sd->rsu_stat);
119         if (prog)
120                 *prog = IFPGA_RSU_GET_PROG(sd->rsu_stat);
121
122         return 0;
123 }
124
125 int
126 rte_pmd_ifpga_set_rsu_status(uint16_t dev_id, uint32_t stat, uint32_t prog)
127 {
128         struct opae_adapter *adapter = NULL;
129         opae_share_data *sd = NULL;
130
131         adapter = get_opae_adapter(dev_id);
132         if (!adapter)
133                 return -ENODEV;
134
135         sd = get_share_data(adapter);
136         if (!sd)
137                 return -ENOMEM;
138
139         sd->rsu_stat = IFPGA_RSU_STATUS(stat, prog);
140
141         return 0;
142 }
143
144 static int
145 ifpga_is_rebooting(struct opae_adapter *adapter)
146 {
147         opae_share_data *sd = NULL;
148
149         sd = get_share_data(adapter);
150         if (!sd)
151                 return 1;
152
153         if (IFPGA_RSU_GET_STAT(sd->rsu_stat) == IFPGA_RSU_REBOOT) {
154                 IFPGA_RAWDEV_PMD_WARN("Reboot is in progress.");
155                 return 1;
156         }
157
158         return 0;
159 }
160
161 static int
162 get_common_property(struct opae_adapter *adapter,
163         rte_pmd_ifpga_common_prop *prop)
164 {
165         struct ifpga_fme_hw *fme = NULL;
166         struct opae_board_info *info = NULL;
167         struct feature_prop fp;
168         struct uuid pr_id;
169         int ret = 0;
170
171         if (!adapter || !prop)
172                 return -EINVAL;
173
174         if (!adapter->mgr || !adapter->mgr->data) {
175                 IFPGA_RAWDEV_PMD_ERR("Manager is not registered.");
176                 return -ENODEV;
177         }
178
179         fme = adapter->mgr->data;
180         fp.feature_id = FME_FEATURE_ID_HEADER;
181         fp.prop_id = FME_HDR_PROP_PORTS_NUM;
182         ret = ifpga_get_prop(fme->parent, FEATURE_FIU_ID_FME, 0, &fp);
183         if (ret) {
184                 IFPGA_RAWDEV_PMD_ERR("Failed to get port number.");
185                 return ret;
186         }
187         prop->num_ports = fp.data;
188
189         fp.prop_id = FME_HDR_PROP_BITSTREAM_ID;
190         ret = ifpga_get_prop(fme->parent, FEATURE_FIU_ID_FME, 0, &fp);
191         if (ret) {
192                 IFPGA_RAWDEV_PMD_ERR("Failed to get bitstream ID.");
193                 return ret;
194         }
195         prop->bitstream_id = fp.data;
196
197         fp.prop_id = FME_HDR_PROP_BITSTREAM_METADATA;
198         ret = ifpga_get_prop(fme->parent, FEATURE_FIU_ID_FME, 0, &fp);
199         if (ret) {
200                 IFPGA_RAWDEV_PMD_ERR("Failed to get bitstream metadata.");
201                 return ret;
202         }
203         prop->bitstream_metadata = fp.data;
204
205         ret = opae_mgr_get_uuid(adapter->mgr, &pr_id);
206         if (ret) {
207                 IFPGA_RAWDEV_PMD_ERR("Failed to get PR ID.");
208                 return ret;
209         }
210         memcpy(prop->pr_id.b, pr_id.b, sizeof(rte_pmd_ifpga_uuid));
211
212         ret = opae_mgr_get_board_info(adapter->mgr, &info);
213         if (ret) {
214                 IFPGA_RAWDEV_PMD_ERR("Failed to get board info.");
215                 return ret;
216         }
217         prop->boot_page = info->boot_page;
218         prop->bmc_version = info->max10_version;
219         prop->bmc_nios_version = info->nios_fw_version;
220
221         return 0;
222 }
223
224 static int
225 get_port_property(struct opae_adapter *adapter, uint16_t port,
226         rte_pmd_ifpga_port_prop *prop)
227 {
228         struct ifpga_fme_hw *fme = NULL;
229         struct feature_prop fp;
230         struct opae_accelerator *acc = NULL;
231         struct uuid afu_id;
232         int ret = 0;
233
234         if (!adapter || !prop)
235                 return -EINVAL;
236
237         if (!adapter->mgr || !adapter->mgr->data) {
238                 IFPGA_RAWDEV_PMD_ERR("Manager is not registered.");
239                 return -ENODEV;
240         }
241
242         fme = adapter->mgr->data;
243         fp.feature_id = FME_FEATURE_ID_HEADER;
244         fp.prop_id = FME_HDR_PROP_PORT_TYPE;
245         fp.data = port;
246         fp.data <<= 32;
247         ret = ifpga_get_prop(fme->parent, FEATURE_FIU_ID_FME, 0, &fp);
248         if (ret)
249                 return ret;
250         prop->type = fp.data & 0xffffffff;
251
252         if (prop->type == 0) {
253                 acc = opae_adapter_get_acc(adapter, port);
254                 ret = opae_acc_get_uuid(acc, &afu_id);
255                 if (ret) {
256                         IFPGA_RAWDEV_PMD_ERR("Failed to get port%u AFU ID.",
257                                 port);
258                         return ret;
259                 }
260                 memcpy(prop->afu_id.b, afu_id.b, sizeof(rte_pmd_ifpga_uuid));
261         }
262
263         return 0;
264 }
265
266 int
267 rte_pmd_ifpga_get_property(uint16_t dev_id, rte_pmd_ifpga_prop *prop)
268 {
269         struct opae_adapter *adapter = NULL;
270         uint32_t i = 0;
271         int ret = 0;
272
273         adapter = get_opae_adapter(dev_id);
274         if (!adapter)
275                 return -ENODEV;
276
277         opae_adapter_lock(adapter, -1);
278         if (ifpga_is_rebooting(adapter)) {
279                 ret = -EBUSY;
280                 goto unlock_dev;
281         }
282
283         ret = get_common_property(adapter, &prop->common);
284         if (ret) {
285                 ret = -EIO;
286                 goto unlock_dev;
287         }
288
289         for (i = 0; i < prop->common.num_ports; i++) {
290                 ret = get_port_property(adapter, i, &prop->port[i]);
291                 if (ret) {
292                         ret = -EIO;
293                         break;
294                 }
295         }
296
297 unlock_dev:
298         opae_adapter_unlock(adapter);
299         return ret;
300 }
301
302 int
303 rte_pmd_ifpga_get_phy_info(uint16_t dev_id, rte_pmd_ifpga_phy_info *info)
304 {
305         struct opae_adapter *adapter = NULL;
306         struct opae_retimer_info rtm_info;
307         struct opae_retimer_status rtm_status;
308         int ret = 0;
309
310         adapter = get_opae_adapter(dev_id);
311         if (!adapter)
312                 return -ENODEV;
313
314         opae_adapter_lock(adapter, -1);
315         if (ifpga_is_rebooting(adapter)) {
316                 ret = -EBUSY;
317                 goto unlock_dev;
318         }
319
320         ret = opae_manager_get_retimer_info(adapter->mgr, &rtm_info);
321         if (ret) {
322                 IFPGA_RAWDEV_PMD_ERR("Failed to get retimer info.");
323                 ret = -EIO;
324                 goto unlock_dev;
325         }
326         info->num_retimers = rtm_info.nums_retimer;
327
328         ret = opae_manager_get_retimer_status(adapter->mgr, &rtm_status);
329         if (ret) {
330                 IFPGA_RAWDEV_PMD_ERR("Failed to get retimer status.");
331                 ret = -EIO;
332                 goto unlock_dev;
333         }
334         info->link_speed = rtm_status.speed;
335         info->link_status = rtm_status.line_link_bitmap;
336
337 unlock_dev:
338         opae_adapter_unlock(adapter);
339         return ret;
340 }
341
342 int
343 rte_pmd_ifpga_update_flash(uint16_t dev_id, const char *image,
344         uint64_t *status)
345 {
346         struct opae_adapter *adapter = NULL;
347
348         adapter = get_opae_adapter(dev_id);
349         if (!adapter)
350                 return -ENODEV;
351
352         return opae_mgr_update_flash(adapter->mgr, image, status);
353 }
354
355 int
356 rte_pmd_ifpga_stop_update(uint16_t dev_id, int force)
357 {
358         struct opae_adapter *adapter = NULL;
359
360         adapter = get_opae_adapter(dev_id);
361         if (!adapter)
362                 return -ENODEV;
363
364         return opae_mgr_stop_flash_update(adapter->mgr, force);
365 }
366
367 int
368 rte_pmd_ifpga_reboot_try(uint16_t dev_id)
369 {
370         struct opae_adapter *adapter = NULL;
371         opae_share_data *sd = NULL;
372
373         adapter = get_opae_adapter(dev_id);
374         if (!adapter)
375                 return -ENODEV;
376
377         sd = get_share_data(adapter);
378         if (!sd)
379                 return -ENOMEM;
380
381         opae_adapter_lock(adapter, -1);
382         if (IFPGA_RSU_GET_STAT(sd->rsu_stat) != IFPGA_RSU_IDLE) {
383                 opae_adapter_unlock(adapter);
384                 IFPGA_RAWDEV_PMD_WARN("Update or reboot is in progress.");
385                 return -EBUSY;
386         }
387         sd->rsu_stat = IFPGA_RSU_STATUS(IFPGA_RSU_REBOOT, 0);
388         opae_adapter_unlock(adapter);
389
390         return 0;
391 }
392
393 int
394 rte_pmd_ifpga_reload(uint16_t dev_id, int type, int page)
395 {
396         struct opae_adapter *adapter = NULL;
397
398         adapter = get_opae_adapter(dev_id);
399         if (!adapter)
400                 return -ENODEV;
401
402         return opae_mgr_reload(adapter->mgr, type, page);
403 }
404
405 const struct rte_pci_bus *
406 rte_pmd_ifpga_get_pci_bus(void)
407 {
408         return ifpga_get_pci_bus();
409 }
410
411 int
412 rte_pmd_ifpga_partial_reconfigure(uint16_t dev_id, int port, const char *file)
413 {
414         struct rte_rawdev *dev = NULL;
415
416         dev = get_rte_rawdev(dev_id);
417         if (!dev) {
418                 IFPGA_RAWDEV_PMD_ERR("Device ID %u is invalid.", dev_id);
419                 return -EINVAL;
420         }
421
422         return ifpga_rawdev_partial_reconfigure(dev, port, file);
423 }
424
425 void
426 rte_pmd_ifpga_cleanup(void)
427 {
428         ifpga_rawdev_cleanup();
429 }