[2/3] net/nfp: add two APIs of the NSP module

Message ID 20240903055239.2642656-3-chaoyong.he@corigine.com (mailing list archive)
State Accepted
Delegated to: Ferruh Yigit
Headers
Series support load firmware from flash |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Chaoyong He Sept. 3, 2024, 5:52 a.m. UTC
Add two APIs of the NSP module, also modify the logic to use the
argument to control the log switch for NSP command.

Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
---
 drivers/net/nfp/nfpcore/nfp_nsp.c | 86 ++++++++++++++++++++++++++++++-
 drivers/net/nfp/nfpcore/nfp_nsp.h | 15 ++++++
 2 files changed, 100 insertions(+), 1 deletion(-)
  

Patch

diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.c b/drivers/net/nfp/nfpcore/nfp_nsp.c
index 7dfb472723..2ac39b10b5 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.c
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.c
@@ -60,6 +60,8 @@ 
 #define NFP_FW_LOAD_RET_MAJOR   GENMASK_ULL(15, 8)
 #define NFP_FW_LOAD_RET_MINOR   GENMASK_ULL(23, 16)
 
+#define NFP_HWINFO_LOOKUP_SIZE  GENMASK_ULL(11, 0)
+
 enum nfp_nsp_cmd {
 	SPCODE_NOOP             = 0, /* No operation */
 	SPCODE_SOFT_RESET       = 1, /* Soft reset the NFP */
@@ -477,7 +479,9 @@  nfp_nsp_command_buf_def(struct nfp_nsp *nsp,
 			FIELD_PREP(NSP_BUFFER_ADDRESS, cpp_buf);
 	ret = nfp_nsp_command_real(nsp, &arg->arg);
 	if (ret < 0) {
-		PMD_DRV_LOG(ERR, "NSP command failed");
+		if (!arg->arg.error_quiet)
+			PMD_DRV_LOG(ERR, "NSP command failed");
+
 		return ret;
 	}
 
@@ -755,3 +759,83 @@  nfp_nsp_read_media(struct nfp_nsp *state,
 
 	return nfp_nsp_command_buf(state, &media);
 }
+
+int
+nfp_nsp_load_stored_fw(struct nfp_nsp *state)
+{
+	int ret;
+	struct nfp_nsp_command_buf_arg fw_stored = {
+		{
+			.code     = SPCODE_FW_STORED,
+			.error_cb = nfp_nsp_load_fw_extended_msg,
+		},
+	};
+
+	ret = nfp_nsp_command_buf(state, &fw_stored);
+	if (ret < 0)
+		return ret;
+
+	nfp_nsp_load_fw_extended_msg(state, ret);
+
+	return 0;
+}
+
+static int
+nfp_nsp_hwinfo_lookup_real(struct nfp_nsp *state,
+		void *buf,
+		size_t size,
+		bool optional)
+{
+	struct nfp_nsp_command_buf_arg hwinfo_lookup = {
+		{
+			.code   = SPCODE_HWINFO_LOOKUP,
+			.option = size,
+			.error_quiet = optional,
+		},
+		.in_buf = buf,
+		.in_size = size,
+		.out_buf  = buf,
+		.out_size = size,
+	};
+
+	return nfp_nsp_command_buf(state, &hwinfo_lookup);
+}
+
+int
+nfp_nsp_hwinfo_lookup_optional(struct nfp_nsp *state,
+		void *buf,
+		size_t size,
+		const char *default_val)
+{
+	int ret;
+	size_t min_size;
+
+	if (strnlen(default_val, size) == size) {
+		PMD_DRV_LOG(ERR, "NSP HWinfo default value not NULL terminated");
+		return -EINVAL;
+	}
+
+	if (!nfp_nsp_has_hwinfo_lookup(state))
+		goto default_return;
+
+	min_size = RTE_MIN(size, NFP_HWINFO_LOOKUP_SIZE);
+	ret = nfp_nsp_hwinfo_lookup_real(state, buf, min_size, true);
+	if (ret != 0) {
+		if (ret == -ENOENT)
+			goto default_return;
+
+		PMD_DRV_LOG(ERR, "NSP HWinfo lookup failed: %d", ret);
+		return ret;
+	}
+
+	if (strnlen(buf, min_size) == min_size) {
+		PMD_DRV_LOG(ERR, "NSP HWinfo value not NULL terminated");
+		return -EINVAL;
+	}
+
+	return 0;
+
+default_return:
+	strlcpy(buf, default_val, size);
+	return 0;
+}
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h
index 003cdc5fa3..cfb5066fc9 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.h
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h
@@ -8,6 +8,18 @@ 
 
 #include "nfp_cpp.h"
 
+/* Defines the valid values of the 'abi_drv_reset' hwinfo key */
+#define NFP_NSP_DRV_RESET_DISK                  0
+#define NFP_NSP_DRV_RESET_ALWAYS                1
+#define NFP_NSP_DRV_RESET_NEVER                 2
+#define NFP_NSP_DRV_RESET_DEFAULT               "0"
+
+/* Defines the valid values of the 'app_fw_from_flash' hwinfo key */
+#define NFP_NSP_APP_FW_LOAD_DISK                0
+#define NFP_NSP_APP_FW_LOAD_FLASH               1
+#define NFP_NSP_APP_FW_LOAD_PREF                2
+#define NFP_NSP_APP_FW_LOAD_DEFAULT             "2"
+
 struct nfp_nsp;
 
 struct nfp_nsp *nfp_nsp_open(struct nfp_cpp *cpp);
@@ -225,6 +237,9 @@  enum nfp_nsp_sensor_id {
 int nfp_hwmon_read_sensor(struct nfp_cpp *cpp, enum nfp_nsp_sensor_id id,
 		uint32_t *val);
 bool nfp_nsp_fw_loaded(struct nfp_nsp *state);
+int nfp_nsp_load_stored_fw(struct nfp_nsp *state);
+int nfp_nsp_hwinfo_lookup_optional(struct nfp_nsp *state,
+		void *buf, size_t size, const char *default_val);
 
 /* The buf used to receive bitmap of link modes */
 struct nfp_eth_media_buf {