From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A9328A052A; Tue, 26 Jan 2021 07:45:55 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 65BDE141278; Tue, 26 Jan 2021 07:45:35 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id CAE98141282; Tue, 26 Jan 2021 07:45:30 +0100 (CET) IronPort-SDR: RqNAFHxOMl+EP8jp9LWKTyghLUmMHc1vYpq4qIYB52Y0kUgq5QMj2jM825WLvf251dLiSIYzrA q9b8C+8DGYaw== X-IronPort-AV: E=McAfee;i="6000,8403,9875"; a="198641586" X-IronPort-AV: E=Sophos;i="5.79,375,1602572400"; d="scan'208";a="198641586" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2021 22:45:30 -0800 IronPort-SDR: y2min/FJ4biE/51jXfAVaepr7fY0SI4apOyn2bLzSvNxTExcq58XkA6HOtHs08GzhekFt9eYUc +uSXjUHKo3fA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.79,375,1602572400"; d="scan'208";a="504432725" Received: from unknown (HELO sh_lab5_1.sh.intel.com) ([10.238.175.190]) by orsmga004.jf.intel.com with ESMTP; 25 Jan 2021 22:45:27 -0800 From: Wei Huang To: dev@dpdk.org, rosen.xu@intel.com, qi.z.zhang@intel.com Cc: stable@dpdk.org, tianfei.zhang@intel.com, Wei Huang Date: Tue, 26 Jan 2021 01:45:27 -0500 Message-Id: <1611643528-18311-4-git-send-email-wei.huang@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1611643528-18311-1-git-send-email-wei.huang@intel.com> References: <1611643528-18311-1-git-send-email-wei.huang@intel.com> Subject: [dpdk-dev] [PATCH v12 3/4] raw/ifpga: add fpga helper function X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 Acked-by: Tianfei Zhang Acked-by: Rosen Xu --- 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= " "afu_bts="); +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