]> git.droids-corp.org - dpdk.git/commitdiff
net/nfp: add NSP FW upload command
authorAlejandro Lucero <alejandro.lucero@netronome.com>
Fri, 1 Sep 2017 14:12:08 +0000 (15:12 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 6 Oct 2017 00:49:48 +0000 (02:49 +0200)
Using NSPU interface for fw upload. Firmware file needs to be
installed in specific path inside system firmware directory.

NSPU buffer is used for writing the firmware before sending the
command.

Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>
drivers/net/nfp/nfp_nspu.c
drivers/net/nfp/nfp_nspu.h

index dbb53051c33a8891ceb7cea03ffe7c1812174b0e..57ee45fbf3f3269cf218d1d75aa3bfca9dcad7d9 100644 (file)
@@ -3,6 +3,9 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 
 #include <rte_log.h>
 
@@ -38,7 +41,8 @@
 #define NSP_STATUS_MINOR(x)      (int)(((x) >> 32) & 0xfff)
 
 /* NSP commands */
-#define NSP_CMD_RESET                  1
+#define NSP_CMD_RESET          1
+#define NSP_CMD_FW_LOAD        6
 
 #define NSP_BUFFER_CFG_SIZE_MASK       (0xff)
 
@@ -304,3 +308,63 @@ nfp_fw_reset(nspu_desc_t *nspu_desc)
 
        return res;
 }
+
+#define DEFAULT_FW_PATH       "/lib/firmware/netronome"
+#define DEFAULT_FW_FILENAME   "nic_dpdk_default.nffw"
+
+int
+nfp_fw_upload(nspu_desc_t *nspu_desc)
+{
+       int fw_f;
+       char *fw_buf;
+       char filename[100];
+       struct stat file_stat;
+       off_t fsize, bytes;
+       ssize_t size;
+       int ret;
+
+       size = nspu_desc->buf_size;
+
+       sprintf(filename, "%s/%s", DEFAULT_FW_PATH, DEFAULT_FW_FILENAME);
+       fw_f = open(filename, O_RDONLY);
+       if (fw_f < 0) {
+               RTE_LOG(INFO, PMD, "Firmware file %s/%s not found.",
+                       DEFAULT_FW_PATH, DEFAULT_FW_FILENAME);
+               return -ENOENT;
+       }
+
+       fstat(fw_f, &file_stat);
+
+       fsize = file_stat.st_size;
+       RTE_LOG(DEBUG, PMD, "Firmware file with size: %" PRIu64 "\n",
+                           (uint64_t)fsize);
+
+       if (fsize > (off_t)size) {
+               RTE_LOG(INFO, PMD, "fw file too big: %" PRIu64
+                                  " bytes (%" PRIu64 " max)",
+                                 (uint64_t)fsize, (uint64_t)size);
+               return -EINVAL;
+       }
+
+       fw_buf = malloc((size_t)size);
+       if (!fw_buf) {
+               RTE_LOG(INFO, PMD, "malloc failed for fw buffer");
+               return -ENOMEM;
+       }
+       memset(fw_buf, 0, size);
+
+       bytes = read(fw_f, fw_buf, fsize);
+       if (bytes != fsize) {
+               RTE_LOG(INFO, PMD, "Reading fw to buffer failed.\n"
+                                  "Just %" PRIu64 " of %" PRIu64 " bytes read.",
+                                  (uint64_t)bytes, (uint64_t)fsize);
+               free(fw_buf);
+               return -EIO;
+       }
+
+       ret = nspu_command(nspu_desc, NSP_CMD_FW_LOAD, 0, 1, fw_buf, 0, bytes);
+
+       free(fw_buf);
+
+       return ret;
+}
index a142eb3c744c318a8b01b62700f686eb5e0b7b2c..6e1c25f69a7847ca65264660acc03a54a3a0ad8b 100644 (file)
@@ -73,3 +73,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);