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_sec_mgr.h"
15 rte_pmd_ifpga_get_dev_id(const char *pci_addr, uint16_t *dev_id)
17 struct rte_pci_addr addr;
18 struct rte_rawdev *rdev = NULL;
19 char rdev_name[RTE_RAWDEV_NAME_MAX_LEN] = {0};
21 if (!pci_addr || !dev_id) {
22 IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid.");
26 if (strnlen(pci_addr, PCI_PRI_STR_SIZE) == PCI_PRI_STR_SIZE) {
27 IFPGA_RAWDEV_PMD_ERR("PCI address is too long.");
31 if (rte_pci_addr_parse(pci_addr, &addr)) {
32 IFPGA_RAWDEV_PMD_ERR("PCI address %s is invalid.", pci_addr);
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);
40 IFPGA_RAWDEV_PMD_DEBUG("%s is not probed by ifpga driver.",
44 *dev_id = rdev->dev_id;
49 static struct rte_rawdev *
50 get_rte_rawdev(uint16_t dev_id)
52 struct rte_rawdev *dev = NULL;
54 if (dev_id >= RTE_RAWDEV_MAX_DEVS)
57 dev = &rte_rawdevs[dev_id];
58 if (dev->attached == RTE_RAWDEV_ATTACHED)
64 static struct opae_adapter *
65 get_opae_adapter(uint16_t dev_id)
67 struct rte_rawdev *dev = NULL;
68 struct opae_adapter *adapter = NULL;
70 dev = get_rte_rawdev(dev_id);
72 IFPGA_RAWDEV_PMD_ERR("Device ID %u is invalid.", dev_id);
76 adapter = ifpga_rawdev_get_priv(dev);
78 IFPGA_RAWDEV_PMD_ERR("Adapter is not registered.");
85 static opae_share_data *
86 get_share_data(struct opae_adapter *adapter)
88 opae_share_data *sd = NULL;
93 sd = (opae_share_data *)adapter->shm.ptr;
95 IFPGA_RAWDEV_PMD_ERR("Share data is not initialized.");
103 rte_pmd_ifpga_update_flash(uint16_t dev_id, const char *image,
106 struct opae_adapter *adapter = NULL;
108 adapter = get_opae_adapter(dev_id);
112 return opae_mgr_update_flash(adapter->mgr, image, status);
116 rte_pmd_ifpga_stop_update(uint16_t dev_id, int force)
118 struct opae_adapter *adapter = NULL;
120 adapter = get_opae_adapter(dev_id);
124 return opae_mgr_stop_flash_update(adapter->mgr, force);
128 rte_pmd_ifpga_reboot_try(uint16_t dev_id)
130 struct opae_adapter *adapter = NULL;
131 opae_share_data *sd = NULL;
133 adapter = get_opae_adapter(dev_id);
137 sd = get_share_data(adapter);
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.");
147 sd->rsu_stat = IFPGA_RSU_STATUS(IFPGA_RSU_REBOOT, 0);
148 opae_adapter_unlock(adapter);
154 rte_pmd_ifpga_reload(uint16_t dev_id, int type, int page)
156 struct opae_adapter *adapter = NULL;
158 adapter = get_opae_adapter(dev_id);
162 return opae_mgr_reload(adapter->mgr, type, page);