raw/ifpga: add FPGA RSU APIs
[dpdk.git] / drivers / 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_sec_mgr.h"
12
13
14 int
15 rte_pmd_ifpga_get_dev_id(const char *pci_addr, uint16_t *dev_id)
16 {
17         struct rte_pci_addr addr;
18         struct rte_rawdev *rdev = NULL;
19         char rdev_name[RTE_RAWDEV_NAME_MAX_LEN] = {0};
20
21         if (!pci_addr || !dev_id) {
22                 IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid.");
23                 return -EINVAL;
24         }
25
26         if (strnlen(pci_addr, PCI_PRI_STR_SIZE) == PCI_PRI_STR_SIZE) {
27                 IFPGA_RAWDEV_PMD_ERR("PCI address is too long.");
28                 return -EINVAL;
29         }
30
31         if (rte_pci_addr_parse(pci_addr, &addr)) {
32                 IFPGA_RAWDEV_PMD_ERR("PCI address %s is invalid.", pci_addr);
33                 return -EINVAL;
34         }
35
36         snprintf(rdev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%02x:%02x.%x",
37                 addr.bus, addr.devid, addr.function);
38         rdev = rte_rawdev_pmd_get_named_dev(rdev_name);
39         if (!rdev) {
40                 IFPGA_RAWDEV_PMD_DEBUG("%s is not probed by ifpga driver.",
41                         pci_addr);
42                 return -ENODEV;
43         }
44         *dev_id = rdev->dev_id;
45
46         return 0;
47 }
48
49 static struct rte_rawdev *
50 get_rte_rawdev(uint16_t dev_id)
51 {
52         struct rte_rawdev *dev = NULL;
53
54         if (dev_id >= RTE_RAWDEV_MAX_DEVS)
55                 return NULL;
56
57         dev = &rte_rawdevs[dev_id];
58         if (dev->attached == RTE_RAWDEV_ATTACHED)
59                 return dev;
60
61         return NULL;
62 }
63
64 static struct opae_adapter *
65 get_opae_adapter(uint16_t dev_id)
66 {
67         struct rte_rawdev *dev = NULL;
68         struct opae_adapter *adapter = NULL;
69
70         dev = get_rte_rawdev(dev_id);
71         if (!dev) {
72                 IFPGA_RAWDEV_PMD_ERR("Device ID %u is invalid.", dev_id);
73                 return NULL;
74         }
75
76         adapter = ifpga_rawdev_get_priv(dev);
77         if (!adapter) {
78                 IFPGA_RAWDEV_PMD_ERR("Adapter is not registered.");
79                 return NULL;
80         }
81
82         return adapter;
83 }
84
85 static opae_share_data *
86 get_share_data(struct opae_adapter *adapter)
87 {
88         opae_share_data *sd = NULL;
89
90         if (!adapter)
91                 return NULL;
92
93         sd = (opae_share_data *)adapter->shm.ptr;
94         if (!sd) {
95                 IFPGA_RAWDEV_PMD_ERR("Share data is not initialized.");
96                 return NULL;
97         }
98
99         return sd;
100 }
101
102 int
103 rte_pmd_ifpga_update_flash(uint16_t dev_id, const char *image,
104         uint64_t *status)
105 {
106         struct opae_adapter *adapter = NULL;
107
108         adapter = get_opae_adapter(dev_id);
109         if (!adapter)
110                 return -ENODEV;
111
112         return opae_mgr_update_flash(adapter->mgr, image, status);
113 }
114
115 int
116 rte_pmd_ifpga_stop_update(uint16_t dev_id, int force)
117 {
118         struct opae_adapter *adapter = NULL;
119
120         adapter = get_opae_adapter(dev_id);
121         if (!adapter)
122                 return -ENODEV;
123
124         return opae_mgr_stop_flash_update(adapter->mgr, force);
125 }
126
127 int
128 rte_pmd_ifpga_reboot_try(uint16_t dev_id)
129 {
130         struct opae_adapter *adapter = NULL;
131         opae_share_data *sd = NULL;
132
133         adapter = get_opae_adapter(dev_id);
134         if (!adapter)
135                 return -ENODEV;
136
137         sd = get_share_data(adapter);
138         if (!sd)
139                 return -ENOMEM;
140
141         opae_adapter_lock(adapter, -1);
142         if (IFPGA_RSU_GET_STAT(sd->rsu_stat) != IFPGA_RSU_IDLE) {
143                 opae_adapter_unlock(adapter);
144                 IFPGA_RAWDEV_PMD_WARN("Update or reboot is in progress.");
145                 return -EBUSY;
146         }
147         sd->rsu_stat = IFPGA_RSU_STATUS(IFPGA_RSU_REBOOT, 0);
148         opae_adapter_unlock(adapter);
149
150         return 0;
151 }
152
153 int
154 rte_pmd_ifpga_reload(uint16_t dev_id, int type, int page)
155 {
156         struct opae_adapter *adapter = NULL;
157
158         adapter = get_opae_adapter(dev_id);
159         if (!adapter)
160                 return -ENODEV;
161
162         return opae_mgr_reload(adapter->mgr, type, page);
163 }