From patchwork Thu Aug 24 16:20:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alejandro Lucero X-Patchwork-Id: 27892 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 8E98A7D9E; Thu, 24 Aug 2017 18:20:46 +0200 (CEST) Received: from netronome.com (host-79-78-33-110.static.as9105.net [79.78.33.110]) by dpdk.org (Postfix) with ESMTP id 8AD637CEC for ; Thu, 24 Aug 2017 18:20:34 +0200 (CEST) Received: from netronome.com (localhost [127.0.0.1]) by netronome.com (8.14.4/8.14.4/Debian-4.1ubuntu1) with ESMTP id v7OGKOnA016321 for ; Thu, 24 Aug 2017 17:20:24 +0100 Received: (from alucero@localhost) by netronome.com (8.14.4/8.14.4/Submit) id v7OGKOQm016320 for dev@dpdk.org; Thu, 24 Aug 2017 17:20:24 +0100 From: Alejandro Lucero To: dev@dpdk.org Date: Thu, 24 Aug 2017 17:20:13 +0100 Message-Id: <1503591622-16232-8-git-send-email-alejandro.lucero@netronome.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1503591622-16232-1-git-send-email-alejandro.lucero@netronome.com> References: <1503591622-16232-1-git-send-email-alejandro.lucero@netronome.com> Subject: [dpdk-dev] [PATCH 07/16] nfp: add fw upload logic X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" PMD will use this function for uploading the firmware. First, a symbol resolution is done for finding out if there is a firmware already there. If not, a NFP reset is called before using NSPU fw upload code. PMD PF probe function is now using this logic. Signed-off-by: Alejandro Lucero --- drivers/net/nfp/nfp_net.c | 3 +++ drivers/net/nfp/nfp_nspu.c | 48 +++++++++++++++++++++++++++++++++++++++++++--- drivers/net/nfp/nfp_nspu.h | 6 +----- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index 1890a4a..c0d5f58 100644 --- a/drivers/net/nfp/nfp_net.c +++ b/drivers/net/nfp/nfp_net.c @@ -2639,6 +2639,7 @@ static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, { nfpu_desc_t *nfpu_desc; nspu_desc_t *nspu_desc; + uint64_t offset_symbol; int major, minor; if (!dev) @@ -2669,6 +2670,8 @@ static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, goto no_abi; } + nfp_nsp_fw_setup(nspu_desc, "nfd_cfg_pf0_num_ports", &offset_symbol); + /* No port is created yet */ no_abi: diff --git a/drivers/net/nfp/nfp_nspu.c b/drivers/net/nfp/nfp_nspu.c index 4296be1..f4fee71 100644 --- a/drivers/net/nfp/nfp_nspu.c +++ b/drivers/net/nfp/nfp_nspu.c @@ -21,6 +21,9 @@ /* NFP target for NSP access */ #define NFP_NSP_TARGET 7 +/* Expansion BARs for mapping PF vnic BARs */ +#define NFP_NET_PF_CFG_EXP_BAR 6 + /* * This is an NFP internal address used for configuring properly an NFP * expansion BAR. @@ -297,7 +300,7 @@ return ret; } -int +static int nfp_fw_reset(nspu_desc_t *nspu_desc) { int res; @@ -313,7 +316,7 @@ #define DEFAULT_FW_PATH "/lib/firmware/netronome" #define DEFAULT_FW_FILENAME "nic_dpdk_default.nffw" -int +static int nfp_fw_upload(nspu_desc_t *nspu_desc) { int fw_f; @@ -391,7 +394,7 @@ * a PCI BAR window. NFP expansion BARs are used in this regard through * the NSPU interface. */ -int +static int nfp_nspu_set_bar_from_symbl(nspu_desc_t *desc, const char *symbl, uint32_t expbar, uint64_t *pcie_offset, ssize_t *size) @@ -454,3 +457,42 @@ free(sym_buf); return ret; } + +int +nfp_nsp_fw_setup(nspu_desc_t *desc, const char *sym, uint64_t *pcie_offset) +{ + ssize_t bar0_sym_size; + + /* If the symbol resolution works, it implies a firmware app + * is already there. + */ + if (!nfp_nspu_set_bar_from_symbl(desc, sym, NFP_NET_PF_CFG_EXP_BAR, + pcie_offset, &bar0_sym_size)) + return 0; + + /* No firmware app detected or not the right one */ + RTE_LOG(INFO, PMD, "No firmware detected. Resetting NFP...\n"); + if (nfp_fw_reset(desc) < 0) { + RTE_LOG(ERR, PMD, "nfp fw reset failed\n"); + return -ENODEV; + } + + RTE_LOG(INFO, PMD, "Reset done.\n"); + RTE_LOG(INFO, PMD, "Uploading firmware...\n"); + + if (nfp_fw_upload(desc) < 0) { + RTE_LOG(ERR, PMD, "nfp fw upload failed\n"); + return -ENODEV; + } + + RTE_LOG(INFO, PMD, "Done.\n"); + + /* Now the symbol should be there */ + if (nfp_nspu_set_bar_from_symbl(desc, sym, NFP_NET_PF_CFG_EXP_BAR, + pcie_offset, &bar0_sym_size)) { + RTE_LOG(ERR, PMD, "nfp PF BAR symbol resolution failed\n"); + return -ENODEV; + } + + return 0; +} diff --git a/drivers/net/nfp/nfp_nspu.h b/drivers/net/nfp/nfp_nspu.h index 7734b4f..c439700 100644 --- a/drivers/net/nfp/nfp_nspu.h +++ b/drivers/net/nfp/nfp_nspu.h @@ -72,8 +72,4 @@ int nfp_nspu_init(nspu_desc_t *desc, int nfp, int pcie_bar, size_t pcie_barsz, int exp_bar, void *exp_bar_cfg_base, void *exp_bar_mmap); int nfp_nsp_get_abi_version(nspu_desc_t *desc, int *major, int *minor); -int nfp_fw_reset(nspu_desc_t *nspu_desc); -int nfp_fw_upload(nspu_desc_t *nspu_desc); -int nfp_nspu_set_bar_from_symbl(nspu_desc_t *desc, const char *symbl, - uint32_t expbar, uint64_t *pcie_offset, - ssize_t *size); +int nfp_nsp_fw_setup(nspu_desc_t *desc, const char *sym, uint64_t *pcie_offset);