raw/ifpga: add miscellaneous APIs
authorWei Huang <wei.huang@intel.com>
Wed, 3 Mar 2021 02:34:31 +0000 (21:34 -0500)
committerQi Zhang <qi.z.zhang@intel.com>
Fri, 5 Mar 2021 08:56:18 +0000 (09:56 +0100)
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 <wei.huang@intel.com>
Acked-by: Tianfei Zhang <tianfei.zhang@intel.com>
Acked-by: Rosen Xu <rosen.xu@intel.com>
drivers/raw/ifpga/ifpga_rawdev.c
drivers/raw/ifpga/ifpga_rawdev.h
drivers/raw/ifpga/rte_pmd_ifpga.c
drivers/raw/ifpga/rte_pmd_ifpga.h
drivers/raw/ifpga/version.map

index 27129b1..05d79bf 100644 (file)
@@ -1737,3 +1737,33 @@ RTE_PMD_REGISTER_PARAM_STRING(ifpga_rawdev_cfg,
        "ifpga=<string> "
        "port=<int> "
        "afu_bts=<path>");
+
+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;
+               }
+       }
+}
index 7754beb..9bbe9a4 100644 (file)
@@ -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_ */
index 8e04e22..6e23a25 100644 (file)
@@ -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();
+}
index 633f6e9..47d66ba 100644 (file)
@@ -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
index ca6f7f5..995c419 100644 (file)
@@ -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;
 };