From: Wei Huang <wei.huang@intel.com>
To: dev@dpdk.org, rosen.xu@intel.com, qi.z.zhang@intel.com
Cc: stable@dpdk.org, tianfei.zhang@intel.com,
Wei Huang <wei.huang@intel.com>
Subject: [dpdk-dev] [PATCH v12 3/4] raw/ifpga: add fpga helper function
Date: Tue, 26 Jan 2021 01:45:27 -0500 [thread overview]
Message-ID: <1611643528-18311-4-git-send-email-wei.huang@intel.com> (raw)
In-Reply-To: <1611643528-18311-1-git-send-email-wei.huang@intel.com>
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.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 | 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
next prev parent reply other threads:[~2021-01-26 6:45 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-26 6:45 [dpdk-dev] [PATCH v12 0/4] raw/ifpga: add extra OPAE APIs Wei Huang
2021-01-26 6:45 ` [dpdk-dev] [PATCH v12 1/4] raw/ifpga: add fpga rsu function Wei Huang
2021-01-28 13:24 ` Ferruh Yigit
2021-01-29 7:38 ` Huang, Wei
2021-01-29 8:59 ` Ferruh Yigit
2021-01-26 6:45 ` [dpdk-dev] [PATCH v12 2/4] raw/ifpga: add fpga property get function Wei Huang
2021-01-26 6:45 ` Wei Huang [this message]
2021-01-28 13:30 ` [dpdk-dev] [dpdk-stable] [PATCH v12 3/4] raw/ifpga: add fpga helper function Ferruh Yigit
2021-01-29 7:42 ` Huang, Wei
2021-01-26 6:45 ` [dpdk-dev] [PATCH v12 4/4] examples/ifpga: add example for ifpga opae API Wei Huang
2021-01-28 13:34 ` Ferruh Yigit
2021-01-29 7:44 ` Huang, Wei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1611643528-18311-4-git-send-email-wei.huang@intel.com \
--to=wei.huang@intel.com \
--cc=dev@dpdk.org \
--cc=qi.z.zhang@intel.com \
--cc=rosen.xu@intel.com \
--cc=stable@dpdk.org \
--cc=tianfei.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.