From: Wei Huang Date: Wed, 3 Mar 2021 02:34:31 +0000 (-0500) Subject: raw/ifpga: add miscellaneous APIs X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=f724a8025dd05111b18461f40c0653f47c8f37a6;p=dpdk.git raw/ifpga: add miscellaneous APIs Below miscellaneous APIs are used to implement OPAE application. 1. rte_pmd_ifpga_get_pci_bus() get PCI bus ifpga driver registered. 2. rte_pmd_ifpga_partial_reconfigure() do partial reconfiguration. 3. rte_pmd_ifpga_cleanup() free software resources allocated by driver. 4. rte_pmd_ifpga_set_rsu_status() set status of rsu process. Signed-off-by: Wei Huang Acked-by: Tianfei Zhang Acked-by: Rosen Xu --- diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c index 27129b133e..05d79bfcc2 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.c +++ b/drivers/raw/ifpga/ifpga_rawdev.c @@ -1737,3 +1737,33 @@ RTE_PMD_REGISTER_PARAM_STRING(ifpga_rawdev_cfg, "ifpga= " "port= " "afu_bts="); + +struct rte_pci_bus *ifpga_get_pci_bus(void) +{ + return rte_ifpga_rawdev_pmd.bus; +} + +int ifpga_rawdev_partial_reconfigure(struct rte_rawdev *dev, int port, + const char *file) +{ + if (!dev) { + IFPGA_RAWDEV_PMD_ERR("Input parameter 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 7754beb02b..9bbe9a4278 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.h +++ b/drivers/raw/ifpga/ifpga_rawdev.h @@ -43,7 +43,7 @@ enum ifpga_rawdev_device_state { static inline struct opae_adapter * ifpga_rawdev_get_priv(const struct rte_rawdev *rawdev) { - return rawdev->dev_private; + return (struct opae_adapter *)rawdev->dev_private; } #define IFPGA_RAWDEV_MSIX_IRQ_NUM 7 @@ -76,4 +76,9 @@ 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_partial_reconfigure(struct rte_rawdev *dev, int port, + const char *file); +void ifpga_rawdev_cleanup(void); + #endif /* _IFPGA_RAWDEV_H_ */ diff --git a/drivers/raw/ifpga/rte_pmd_ifpga.c b/drivers/raw/ifpga/rte_pmd_ifpga.c index 8e04e22d5f..6e23a2581a 100644 --- a/drivers/raw/ifpga/rte_pmd_ifpga.c +++ b/drivers/raw/ifpga/rte_pmd_ifpga.c @@ -122,6 +122,25 @@ rte_pmd_ifpga_get_rsu_status(uint16_t dev_id, uint32_t *stat, uint32_t *prog) return 0; } +int +rte_pmd_ifpga_set_rsu_status(uint16_t dev_id, uint32_t stat, uint32_t prog) +{ + struct opae_adapter *adapter = NULL; + opae_share_data *sd = NULL; + + adapter = get_opae_adapter(dev_id); + if (!adapter) + return -ENODEV; + + sd = get_share_data(adapter); + if (!sd) + return -ENOMEM; + + sd->rsu_stat = IFPGA_RSU_STATUS(stat, prog); + + return 0; +} + static int ifpga_is_rebooting(struct opae_adapter *adapter) { @@ -382,3 +401,29 @@ rte_pmd_ifpga_reload(uint16_t dev_id, int type, int page) return opae_mgr_reload(adapter->mgr, type, page); } + +const struct rte_pci_bus * +rte_pmd_ifpga_get_pci_bus(void) +{ + return ifpga_get_pci_bus(); +} + +int +rte_pmd_ifpga_partial_reconfigure(uint16_t dev_id, int port, const char *file) +{ + struct rte_rawdev *dev = NULL; + + dev = get_rte_rawdev(dev_id); + if (!dev) { + IFPGA_RAWDEV_PMD_ERR("Device ID %u is invalid.", dev_id); + return -EINVAL; + } + + return ifpga_rawdev_partial_reconfigure(dev, port, file); +} + +void +rte_pmd_ifpga_cleanup(void) +{ + ifpga_rawdev_cleanup(); +} diff --git a/drivers/raw/ifpga/rte_pmd_ifpga.h b/drivers/raw/ifpga/rte_pmd_ifpga.h index 633f6e9d1b..47d66ba655 100644 --- a/drivers/raw/ifpga/rte_pmd_ifpga.h +++ b/drivers/raw/ifpga/rte_pmd_ifpga.h @@ -107,6 +107,27 @@ __rte_experimental int rte_pmd_ifpga_get_rsu_status(uint16_t dev_id, uint32_t *stat, uint32_t *prog); +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Set current RSU status of the specified Intel FPGA device + * + * @param dev_id + * The raw device ID of specified Intel FPGA device. + * @param stat + * The RSU status value to set. + * @param prog + * The RSU progress value to set. + * @return + * - (0) if successful. + * - (-ENODEV) if dev_id is invalid. + * - (-ENOMEM) if share data is not initialized. + */ +__rte_experimental +int +rte_pmd_ifpga_set_rsu_status(uint16_t dev_id, uint32_t stat, uint32_t prog); + /** * @warning * @b EXPERIMENTAL: this API may change, or be removed, without prior notice @@ -235,6 +256,51 @@ __rte_experimental int rte_pmd_ifpga_reload(uint16_t dev_id, int type, int page); +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Get PCI bus the Intel FPGA driver register to + * + * @return + * - (valid pointer) if successful. + * - (NULL) if the Intel FPGA driver is not registered to any PCI bus. + */ +__rte_experimental +const struct rte_pci_bus * +rte_pmd_ifpga_get_pci_bus(void); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Perform PR (partial reconfiguration) on specified Intel FPGA device + * + * @param dev_id + * The raw device ID of specified Intel FPGA device. + * @param port + * The port index of the partial reconfiguration area. + * @param file + * The GBS (Green BitStream) image file name string. + * @return + * - (0) if successful. + * - (-EINVAL) if bad parameter or operation failed. + * - (-ENOMEM) if failed to allocate memory. + */ +__rte_experimental +int +rte_pmd_ifpga_partial_reconfigure(uint16_t dev_id, int port, const char *file); + +/** + * @warning + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice + * + * Free software resources allocated by Intel FPGA PMD + */ +__rte_experimental +void +rte_pmd_ifpga_cleanup(void); + #ifdef __cplusplus } #endif diff --git a/drivers/raw/ifpga/version.map b/drivers/raw/ifpga/version.map index ca6f7f5810..995c419a9b 100644 --- a/drivers/raw/ifpga/version.map +++ b/drivers/raw/ifpga/version.map @@ -8,10 +8,14 @@ EXPERIMENTAL { # added in 21.05 rte_pmd_ifpga_get_dev_id; rte_pmd_ifpga_get_rsu_status; + rte_pmd_ifpga_set_rsu_status; rte_pmd_ifpga_get_property; rte_pmd_ifpga_get_phy_info; rte_pmd_ifpga_update_flash; rte_pmd_ifpga_stop_update; rte_pmd_ifpga_reboot_try; rte_pmd_ifpga_reload; + rte_pmd_ifpga_get_pci_bus; + rte_pmd_ifpga_partial_reconfigure; + rte_pmd_ifpga_cleanup; };