Below helper functions are used to implement OPAE application. 1. ifpga_rawdev_lock() and ifpga_rawdev_unlock() protect FPGA access in multiproces. 2. ifpga_rawdev_get_rsu_stat() and ifpga_rawdev_set_rsu_stat() record current RSU status and progress. 3. ifpga_rawdev_get_phy_info() get information of connected retimer. 4. ifpga_rawdev_partial_reconfigure() do partial reconfiguration. 5. ifpga_rawdev_cleanup() free software resources allocated for driver.
Signed-off-by: Wei Huang <wei.hu...@intel.com> Acked-by: Tianfei Zhang <tianfei.zh...@intel.com> Acked-by: Rosen Xu <rosen...@intel.com> --- drivers/raw/ifpga/ifpga_rawdev.c | 152 +++++++++++++++++++++++++++++-- drivers/raw/ifpga/ifpga_rawdev.h | 15 +++ 2 files changed, 161 insertions(+), 6 deletions(-) diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c index 8dd566e44..64ed9903e 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.c +++ b/drivers/raw/ifpga/ifpga_rawdev.c @@ -1738,6 +1738,79 @@ RTE_PMD_REGISTER_PARAM_STRING(ifpga_rawdev_cfg, "port=<int> " "afu_bts=<path>"); +struct rte_pci_bus *ifpga_get_pci_bus(void) +{ + return rte_ifpga_rawdev_pmd.bus; +} + +int ifpga_rawdev_lock(struct rte_rawdev *dev) +{ + if (!dev) { + IFPGA_RAWDEV_PMD_ERR("rawdev is invalid"); + return -EINVAL; + } + return opae_adapter_lock(ifpga_rawdev_get_priv(dev), -1); +} + +int ifpga_rawdev_unlock(struct rte_rawdev *dev) +{ + if (!dev) { + IFPGA_RAWDEV_PMD_ERR("rawdev is invalid"); + return -EINVAL; + } + return opae_adapter_unlock(ifpga_rawdev_get_priv(dev)); +} + +uint32_t ifpga_rawdev_get_rsu_stat(struct rte_rawdev *dev) +{ + struct opae_adapter *adapter = NULL; + opae_share_data *sd = NULL; + + if (!dev) { + IFPGA_RAWDEV_PMD_ERR("rawdev is invalid"); + return 0; + } + + adapter = ifpga_rawdev_get_priv(dev); + if (!adapter) { + IFPGA_RAWDEV_PMD_ERR("adapter is invalid"); + return 0; + } + + sd = (opae_share_data *)adapter->shm.ptr; + if (!sd) { + IFPGA_RAWDEV_PMD_ERR("shared memory is invalid"); + return 0; + } + + return sd->rsu_stat; +} + +void ifpga_rawdev_set_rsu_stat(struct rte_rawdev *dev, uint32_t value) +{ + struct opae_adapter *adapter = NULL; + opae_share_data *sd = NULL; + + if (!dev) { + IFPGA_RAWDEV_PMD_ERR("rawdev is invalid"); + return; + } + + adapter = ifpga_rawdev_get_priv(dev); + if (!adapter) { + IFPGA_RAWDEV_PMD_ERR("adapter is invalid"); + return; + } + + sd = (opae_share_data *)adapter->shm.ptr; + if (!sd) { + IFPGA_RAWDEV_PMD_ERR("shared memory is invalid"); + return; + } + + sd->rsu_stat = value; +} + int ifpga_rawdev_get_fme_property(struct rte_rawdev *dev, ifpga_fme_property *prop) { @@ -1748,8 +1821,8 @@ int ifpga_rawdev_get_fme_property(struct rte_rawdev *dev, struct uuid pr_id; int ret = 0; - if (!dev) { - IFPGA_RAWDEV_PMD_ERR("rawdev is invalid"); + if (!dev || !prop) { + IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid"); return -EINVAL; } @@ -1820,8 +1893,8 @@ int ifpga_rawdev_get_port_property(struct rte_rawdev *dev, uint32_t port, struct uuid afu_id; int ret = 0; - if (!dev) { - IFPGA_RAWDEV_PMD_ERR("rawdev is invalid"); + if (!dev || !prop) { + IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid"); return -EINVAL; } @@ -1867,8 +1940,8 @@ int ifpga_rawdev_get_bmc_property(struct rte_rawdev *dev, struct opae_board_info *info = NULL; int ret = 0; - if (!dev) { - IFPGA_RAWDEV_PMD_ERR("rawdev is invalid"); + if (!dev || !prop) { + IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid"); return -EINVAL; } @@ -1895,6 +1968,48 @@ int ifpga_rawdev_get_bmc_property(struct rte_rawdev *dev, return 0; } +int ifpga_rawdev_get_phy_info(struct rte_rawdev *dev, ifpga_phy_info *info) +{ + struct opae_adapter *adapter = NULL; + struct opae_retimer_info rtm_info; + struct opae_retimer_status rtm_status; + int ret = 0; + + if (!dev || !info) { + IFPGA_RAWDEV_PMD_ERR("Input parameter is invalid"); + return -EINVAL; + } + + adapter = ifpga_rawdev_get_priv(dev); + if (!adapter) { + IFPGA_RAWDEV_PMD_ERR("adapter is invalid"); + return -ENODEV; + } + + if (!adapter->mgr) { + IFPGA_RAWDEV_PMD_ERR("manager is invalid"); + return -ENODEV; + } + + ret = opae_manager_get_retimer_info(adapter->mgr, &rtm_info); + if (ret) { + IFPGA_RAWDEV_PMD_ERR("Failed to get retimer info"); + return ret; + } + + ret = opae_manager_get_retimer_status(adapter->mgr, &rtm_status); + if (ret) { + IFPGA_RAWDEV_PMD_ERR("Failed to get retimer status"); + return ret; + } + + info->num_retimers = rtm_info.nums_retimer; + info->link_speed = rtm_status.speed; + info->link_status = rtm_status.line_link_bitmap; + + return 0; +} + int ifpga_rawdev_update_flash(struct rte_rawdev *dev, const char *image, uint64_t *status) { @@ -1949,3 +2064,28 @@ int ifpga_rawdev_reload(struct rte_rawdev *dev, int type, int page) return opae_mgr_reload(adapter->mgr, type, page); } + +int ifpga_rawdev_partial_reconfigure(struct rte_rawdev *dev, int port, + const char *file) +{ + if (!dev) { + IFPGA_RAWDEV_PMD_ERR("rawdev is invalid"); + return -EINVAL; + } + + return rte_fpga_do_pr(dev, port, file); +} + +void ifpga_rawdev_cleanup(void) +{ + struct ifpga_rawdev *dev; + unsigned int i; + + for (i = 0; i < IFPGA_RAWDEV_NUM; i++) { + dev = &ifpga_rawdevices[i]; + if (dev->rawdev) { + rte_rawdev_pmd_release(dev->rawdev); + dev->rawdev = NULL; + } + } +} diff --git a/drivers/raw/ifpga/ifpga_rawdev.h b/drivers/raw/ifpga/ifpga_rawdev.h index d4be7913d..185e79071 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.h +++ b/drivers/raw/ifpga/ifpga_rawdev.h @@ -89,6 +89,12 @@ typedef struct { uint32_t fw_version; } ifpga_bmc_property; +typedef struct { + uint32_t num_retimers; + uint32_t link_speed; + uint32_t link_status; +} ifpga_phy_info; + int ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, enum ifpga_irq_type type, int vec_start, int count, @@ -98,15 +104,24 @@ int ifpga_unregister_msix_irq(enum ifpga_irq_type type, int vec_start, rte_intr_callback_fn handler, void *arg); +struct rte_pci_bus *ifpga_get_pci_bus(void); +int ifpga_rawdev_lock(struct rte_rawdev *dev); +int ifpga_rawdev_unlock(struct rte_rawdev *dev); +uint32_t ifpga_rawdev_get_rsu_stat(struct rte_rawdev *dev); +void ifpga_rawdev_set_rsu_stat(struct rte_rawdev *dev, uint32_t value); int ifpga_rawdev_get_fme_property(struct rte_rawdev *dev, ifpga_fme_property *prop); int ifpga_rawdev_get_port_property(struct rte_rawdev *dev, uint32_t port, ifpga_port_property *prop); int ifpga_rawdev_get_bmc_property(struct rte_rawdev *dev, ifpga_bmc_property *prop); +int ifpga_rawdev_get_phy_info(struct rte_rawdev *dev, ifpga_phy_info *info); int ifpga_rawdev_update_flash(struct rte_rawdev *dev, const char *image, uint64_t *status); int ifpga_rawdev_stop_flash_update(struct rte_rawdev *dev, int force); int ifpga_rawdev_reload(struct rte_rawdev *dev, int type, int page); +int ifpga_rawdev_partial_reconfigure(struct rte_rawdev *dev, int port, + const char *file); +void ifpga_rawdev_cleanup(void); #endif /* _IFPGA_RAWDEV_H_ */ -- 2.29.2