From: Zerun Fu <zerun...@corigine.com> When switching speed the BSP needs to be informed whether the firmware needs to be switched. Considering that whether application firmware is indifferent to port speed is a firmware property instead of port property, now use a new rtsym to get the property. So 'sp_indiff' is written to hwinfo to notify BSP.
Signed-off-by: Zerun Fu <zerun...@corigine.com> Reviewed-by: Long Wu <long...@corigine.com> Reviewed-by: Peng Zhang <peng.zh...@corigine.com> Reviewed-by: Chaoyong He <chaoyong...@corigine.com> --- drivers/net/nfp/nfp_ethdev.c | 51 +++++++++++++++++++++++++++++++ drivers/net/nfp/nfpcore/nfp_nsp.c | 17 +++++++++++ drivers/net/nfp/nfpcore/nfp_nsp.h | 3 ++ 3 files changed, 71 insertions(+) diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index 336d18491e..ef0b0dcd48 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -25,6 +25,9 @@ #include "nfp_logs.h" #include "nfp_net_flow.h" +/* 64-bit per app capabilities */ +#define NFP_NET_APP_CAP_SP_INDIFF RTE_BIT64(0) /* Indifferent to port speed */ + #define NFP_PF_DRIVER_NAME net_nfp_pf static void @@ -1227,6 +1230,46 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev, return ret; } +static int +nfp_net_hwinfo_set(uint8_t function_id, + struct nfp_rtsym_table *sym_tbl, + struct nfp_cpp *cpp) +{ + int ret = 0; + uint64_t app_cap; + uint8_t sp_indiff; + struct nfp_nsp *nsp; + char hw_info[RTE_ETH_NAME_MAX_LEN]; + char app_cap_name[RTE_ETH_NAME_MAX_LEN]; + + /* Read the app capabilities of the firmware loaded */ + snprintf(app_cap_name, sizeof(app_cap_name), "_pf%u_net_app_cap", function_id); + app_cap = nfp_rtsym_read_le(sym_tbl, app_cap_name, &ret); + if (ret != 0) { + PMD_INIT_LOG(ERR, "Couldn't read app_fw_cap from firmware."); + return ret; + } + + /* Calculate the value of sp_indiff and write to hw_info */ + sp_indiff = app_cap & NFP_NET_APP_CAP_SP_INDIFF; + snprintf(hw_info, sizeof(hw_info), "sp_indiff=%u", sp_indiff); + + nsp = nfp_nsp_open(cpp); + if (nsp == NULL) { + PMD_INIT_LOG(ERR, "Couldn't get NSP."); + return -EIO; + } + + ret = nfp_nsp_hwinfo_set(nsp, hw_info, sizeof(hw_info)); + nfp_nsp_close(nsp); + if (ret != 0) { + PMD_INIT_LOG(ERR, "Failed to set parameter to hwinfo."); + return ret; + } + + return 0; +} + static int nfp_pf_init(struct rte_pci_device *pci_dev) { @@ -1337,6 +1380,14 @@ nfp_pf_init(struct rte_pci_device *pci_dev) goto sym_tbl_cleanup; } + /* Write sp_indiff to hw_info */ + ret = nfp_net_hwinfo_set(function_id, sym_tbl, cpp); + if (ret != 0) { + PMD_INIT_LOG(ERR, "Failed to set hwinfo."); + ret = -EIO; + goto sym_tbl_cleanup; + } + /* Populate the newly created PF device */ pf_dev->app_fw_id = app_fw_id; pf_dev->cpp = cpp; diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.c b/drivers/net/nfp/nfpcore/nfp_nsp.c index e5aaef8d55..e57176adb3 100644 --- a/drivers/net/nfp/nfpcore/nfp_nsp.c +++ b/drivers/net/nfp/nfpcore/nfp_nsp.c @@ -711,3 +711,20 @@ nfp_nsp_read_sensors(struct nfp_nsp *state, return nfp_nsp_command_buf(state, &sensors); } + +int +nfp_nsp_hwinfo_set(struct nfp_nsp *state, + const void *buf, + size_t size) +{ + struct nfp_nsp_command_buf_arg hwinfo_set = { + { + .code = SPCODE_HWINFO_SET, + .option = size, + }, + .in_buf = buf, + .in_size = size, + }; + + return nfp_nsp_command_buf(state, &hwinfo_set); +} diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h index 9f506a0b2e..f99ca941d5 100644 --- a/drivers/net/nfp/nfpcore/nfp_nsp.h +++ b/drivers/net/nfp/nfpcore/nfp_nsp.h @@ -169,6 +169,9 @@ void *nfp_nsp_config_entries(struct nfp_nsp *state); struct nfp_cpp *nfp_nsp_cpp(struct nfp_nsp *state); bool nfp_nsp_config_modified(struct nfp_nsp *state); uint32_t nfp_nsp_config_idx(struct nfp_nsp *state); +int nfp_nsp_hwinfo_set(struct nfp_nsp *state, + const void *buf, + size_t size); static inline bool nfp_eth_can_support_fec(struct nfp_eth_table_port *eth_port) -- 2.39.1