1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2021 Intel Corporation
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"
16 rte_pmd_ifpga_get_dev_id(const char *pci_addr, uint16_t *dev_id)
18 struct rte_pci_addr addr;
19 struct rte_rawdev *rdev = NULL;
20 char rdev_name[RTE_RAWDEV_NAME_MAX_LEN] = {0};
22 if (!pci_addr || !dev_id) {
23 IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid.");
27 if (strnlen(pci_addr, PCI_PRI_STR_SIZE) == PCI_PRI_STR_SIZE) {
28 IFPGA_RAWDEV_PMD_ERR("PCI address is too long.");
32 if (rte_pci_addr_parse(pci_addr, &addr)) {
33 IFPGA_RAWDEV_PMD_ERR("PCI address %s is invalid.", pci_addr);
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);
41 IFPGA_RAWDEV_PMD_DEBUG("%s is not probed by ifpga driver.",
45 *dev_id = rdev->dev_id;
50 static struct rte_rawdev *
51 get_rte_rawdev(uint16_t dev_id)
53 struct rte_rawdev *dev = NULL;
55 if (dev_id >= RTE_RAWDEV_MAX_DEVS)
58 dev = &rte_rawdevs[dev_id];
59 if (dev->attached == RTE_RAWDEV_ATTACHED)
65 static struct opae_adapter *
66 get_opae_adapter(uint16_t dev_id)
68 struct rte_rawdev *dev = NULL;
69 struct opae_adapter *adapter = NULL;
71 dev = get_rte_rawdev(dev_id);
73 IFPGA_RAWDEV_PMD_ERR("Device ID %u is invalid.", dev_id);
77 adapter = ifpga_rawdev_get_priv(dev);
79 IFPGA_RAWDEV_PMD_ERR("Adapter is not registered.");
86 static opae_share_data *
87 get_share_data(struct opae_adapter *adapter)
89 opae_share_data *sd = NULL;
94 sd = (opae_share_data *)adapter->shm.ptr;
96 IFPGA_RAWDEV_PMD_ERR("Share data is not initialized.");
104 rte_pmd_ifpga_get_rsu_status(uint16_t dev_id, uint32_t *stat, uint32_t *prog)
106 struct opae_adapter *adapter = NULL;
107 opae_share_data *sd = NULL;
109 adapter = get_opae_adapter(dev_id);
113 sd = get_share_data(adapter);
118 *stat = IFPGA_RSU_GET_STAT(sd->rsu_stat);
120 *prog = IFPGA_RSU_GET_PROG(sd->rsu_stat);
126 ifpga_is_rebooting(struct opae_adapter *adapter)
128 opae_share_data *sd = NULL;
130 sd = get_share_data(adapter);
134 if (IFPGA_RSU_GET_STAT(sd->rsu_stat) == IFPGA_RSU_REBOOT) {
135 IFPGA_RAWDEV_PMD_WARN("Reboot is in progress.");
143 get_common_property(struct opae_adapter *adapter,
144 rte_pmd_ifpga_common_prop *prop)
146 struct ifpga_fme_hw *fme = NULL;
147 struct opae_board_info *info = NULL;
148 struct feature_prop fp;
152 if (!adapter || !prop)
155 if (!adapter->mgr || !adapter->mgr->data) {
156 IFPGA_RAWDEV_PMD_ERR("Manager is not registered.");
160 fme = adapter->mgr->data;
161 fp.feature_id = FME_FEATURE_ID_HEADER;
162 fp.prop_id = FME_HDR_PROP_PORTS_NUM;
163 ret = ifpga_get_prop(fme->parent, FEATURE_FIU_ID_FME, 0, &fp);
165 IFPGA_RAWDEV_PMD_ERR("Failed to get port number.");
168 prop->num_ports = fp.data;
170 fp.prop_id = FME_HDR_PROP_BITSTREAM_ID;
171 ret = ifpga_get_prop(fme->parent, FEATURE_FIU_ID_FME, 0, &fp);
173 IFPGA_RAWDEV_PMD_ERR("Failed to get bitstream ID.");
176 prop->bitstream_id = fp.data;
178 fp.prop_id = FME_HDR_PROP_BITSTREAM_METADATA;
179 ret = ifpga_get_prop(fme->parent, FEATURE_FIU_ID_FME, 0, &fp);
181 IFPGA_RAWDEV_PMD_ERR("Failed to get bitstream metadata.");
184 prop->bitstream_metadata = fp.data;
186 ret = opae_mgr_get_uuid(adapter->mgr, &pr_id);
188 IFPGA_RAWDEV_PMD_ERR("Failed to get PR ID.");
191 memcpy(prop->pr_id.b, pr_id.b, sizeof(rte_pmd_ifpga_uuid));
193 ret = opae_mgr_get_board_info(adapter->mgr, &info);
195 IFPGA_RAWDEV_PMD_ERR("Failed to get board info.");
198 prop->boot_page = info->boot_page;
199 prop->bmc_version = info->max10_version;
200 prop->bmc_nios_version = info->nios_fw_version;
206 get_port_property(struct opae_adapter *adapter, uint16_t port,
207 rte_pmd_ifpga_port_prop *prop)
209 struct ifpga_fme_hw *fme = NULL;
210 struct feature_prop fp;
211 struct opae_accelerator *acc = NULL;
215 if (!adapter || !prop)
218 if (!adapter->mgr || !adapter->mgr->data) {
219 IFPGA_RAWDEV_PMD_ERR("Manager is not registered.");
223 fme = adapter->mgr->data;
224 fp.feature_id = FME_FEATURE_ID_HEADER;
225 fp.prop_id = FME_HDR_PROP_PORT_TYPE;
228 ret = ifpga_get_prop(fme->parent, FEATURE_FIU_ID_FME, 0, &fp);
231 prop->type = fp.data & 0xffffffff;
233 if (prop->type == 0) {
234 acc = opae_adapter_get_acc(adapter, port);
235 ret = opae_acc_get_uuid(acc, &afu_id);
237 IFPGA_RAWDEV_PMD_ERR("Failed to get port%u AFU ID.",
241 memcpy(prop->afu_id.b, afu_id.b, sizeof(rte_pmd_ifpga_uuid));
248 rte_pmd_ifpga_get_property(uint16_t dev_id, rte_pmd_ifpga_prop *prop)
250 struct opae_adapter *adapter = NULL;
254 adapter = get_opae_adapter(dev_id);
258 opae_adapter_lock(adapter, -1);
259 if (ifpga_is_rebooting(adapter)) {
264 ret = get_common_property(adapter, &prop->common);
270 for (i = 0; i < prop->common.num_ports; i++) {
271 ret = get_port_property(adapter, i, &prop->port[i]);
279 opae_adapter_unlock(adapter);
284 rte_pmd_ifpga_get_phy_info(uint16_t dev_id, rte_pmd_ifpga_phy_info *info)
286 struct opae_adapter *adapter = NULL;
287 struct opae_retimer_info rtm_info;
288 struct opae_retimer_status rtm_status;
291 adapter = get_opae_adapter(dev_id);
295 opae_adapter_lock(adapter, -1);
296 if (ifpga_is_rebooting(adapter)) {
301 ret = opae_manager_get_retimer_info(adapter->mgr, &rtm_info);
303 IFPGA_RAWDEV_PMD_ERR("Failed to get retimer info.");
307 info->num_retimers = rtm_info.nums_retimer;
309 ret = opae_manager_get_retimer_status(adapter->mgr, &rtm_status);
311 IFPGA_RAWDEV_PMD_ERR("Failed to get retimer status.");
315 info->link_speed = rtm_status.speed;
316 info->link_status = rtm_status.line_link_bitmap;
319 opae_adapter_unlock(adapter);
324 rte_pmd_ifpga_update_flash(uint16_t dev_id, const char *image,
327 struct opae_adapter *adapter = NULL;
329 adapter = get_opae_adapter(dev_id);
333 return opae_mgr_update_flash(adapter->mgr, image, status);
337 rte_pmd_ifpga_stop_update(uint16_t dev_id, int force)
339 struct opae_adapter *adapter = NULL;
341 adapter = get_opae_adapter(dev_id);
345 return opae_mgr_stop_flash_update(adapter->mgr, force);
349 rte_pmd_ifpga_reboot_try(uint16_t dev_id)
351 struct opae_adapter *adapter = NULL;
352 opae_share_data *sd = NULL;
354 adapter = get_opae_adapter(dev_id);
358 sd = get_share_data(adapter);
362 opae_adapter_lock(adapter, -1);
363 if (IFPGA_RSU_GET_STAT(sd->rsu_stat) != IFPGA_RSU_IDLE) {
364 opae_adapter_unlock(adapter);
365 IFPGA_RAWDEV_PMD_WARN("Update or reboot is in progress.");
368 sd->rsu_stat = IFPGA_RSU_STATUS(IFPGA_RSU_REBOOT, 0);
369 opae_adapter_unlock(adapter);
375 rte_pmd_ifpga_reload(uint16_t dev_id, int type, int page)
377 struct opae_adapter *adapter = NULL;
379 adapter = get_opae_adapter(dev_id);
383 return opae_mgr_reload(adapter->mgr, type, page);