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...@corigine.com> Reviewed-by: Long Wu <long...@corigine.com> Reviewed-by: Peng Zhang <peng.zh...@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(-) 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 { -- 2.39.1