Commit b1e4f11e authored by Yinjun Zhang's avatar Yinjun Zhang Committed by Jakub Kicinski

nfp: refine the ABI of getting `sp_indiff` info

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 instead of parsing per-port tlv caps.
With this change, relevant code is moved to `nfp_main` layer.
Signed-off-by: default avatarYinjun Zhang <yinjun.zhang@corigine.com>
Signed-off-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 965dd27d
...@@ -691,6 +691,64 @@ static int nfp_pf_find_rtsyms(struct nfp_pf *pf) ...@@ -691,6 +691,64 @@ static int nfp_pf_find_rtsyms(struct nfp_pf *pf)
return 0; return 0;
} }
int nfp_net_pf_get_app_id(struct nfp_pf *pf)
{
return nfp_pf_rtsym_read_optional(pf, "_pf%u_net_app_id",
NFP_APP_CORE_NIC);
}
static u64 nfp_net_pf_get_app_cap(struct nfp_pf *pf)
{
char name[32];
int err = 0;
u64 val;
snprintf(name, sizeof(name), "_pf%u_net_app_cap", nfp_cppcore_pcie_unit(pf->cpp));
val = nfp_rtsym_read_le(pf->rtbl, name, &err);
if (err) {
if (err != -ENOENT)
nfp_err(pf->cpp, "Unable to read symbol %s\n", name);
return 0;
}
return val;
}
static int nfp_pf_cfg_hwinfo(struct nfp_pf *pf, bool sp_indiff)
{
struct nfp_nsp *nsp;
char hwinfo[32];
int err;
nsp = nfp_nsp_open(pf->cpp);
if (IS_ERR(nsp))
return PTR_ERR(nsp);
snprintf(hwinfo, sizeof(hwinfo), "sp_indiff=%d", sp_indiff);
err = nfp_nsp_hwinfo_set(nsp, hwinfo, sizeof(hwinfo));
/* Not a fatal error, no need to return error to stop driver from loading */
if (err)
nfp_warn(pf->cpp, "HWinfo(sp_indiff=%d) set failed: %d\n", sp_indiff, err);
nfp_nsp_close(nsp);
return 0;
}
static int nfp_pf_nsp_cfg(struct nfp_pf *pf)
{
bool sp_indiff = (nfp_net_pf_get_app_id(pf) == NFP_APP_FLOWER_NIC) ||
(nfp_net_pf_get_app_cap(pf) & NFP_NET_APP_CAP_SP_INDIFF);
return nfp_pf_cfg_hwinfo(pf, sp_indiff);
}
static void nfp_pf_nsp_clean(struct nfp_pf *pf)
{
nfp_pf_cfg_hwinfo(pf, false);
}
static int nfp_pci_probe(struct pci_dev *pdev, static int nfp_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *pci_id) const struct pci_device_id *pci_id)
{ {
...@@ -791,10 +849,14 @@ static int nfp_pci_probe(struct pci_dev *pdev, ...@@ -791,10 +849,14 @@ static int nfp_pci_probe(struct pci_dev *pdev,
goto err_fw_unload; goto err_fw_unload;
} }
err = nfp_net_pci_probe(pf); err = nfp_pf_nsp_cfg(pf);
if (err) if (err)
goto err_fw_unload; goto err_fw_unload;
err = nfp_net_pci_probe(pf);
if (err)
goto err_nsp_clean;
err = nfp_hwmon_register(pf); err = nfp_hwmon_register(pf);
if (err) { if (err) {
dev_err(&pdev->dev, "Failed to register hwmon info\n"); dev_err(&pdev->dev, "Failed to register hwmon info\n");
...@@ -805,6 +867,8 @@ static int nfp_pci_probe(struct pci_dev *pdev, ...@@ -805,6 +867,8 @@ static int nfp_pci_probe(struct pci_dev *pdev,
err_net_remove: err_net_remove:
nfp_net_pci_remove(pf); nfp_net_pci_remove(pf);
err_nsp_clean:
nfp_pf_nsp_clean(pf);
err_fw_unload: err_fw_unload:
kfree(pf->rtbl); kfree(pf->rtbl);
nfp_mip_close(pf->mip); nfp_mip_close(pf->mip);
...@@ -844,6 +908,7 @@ static void __nfp_pci_shutdown(struct pci_dev *pdev, bool unload_fw) ...@@ -844,6 +908,7 @@ static void __nfp_pci_shutdown(struct pci_dev *pdev, bool unload_fw)
nfp_net_pci_remove(pf); nfp_net_pci_remove(pf);
nfp_pf_nsp_clean(pf);
vfree(pf->dumpspec); vfree(pf->dumpspec);
kfree(pf->rtbl); kfree(pf->rtbl);
nfp_mip_close(pf->mip); nfp_mip_close(pf->mip);
......
...@@ -65,7 +65,6 @@ struct nfp_dumpspec { ...@@ -65,7 +65,6 @@ struct nfp_dumpspec {
* @num_vfs: Number of SR-IOV VFs enabled * @num_vfs: Number of SR-IOV VFs enabled
* @fw_loaded: Is the firmware loaded? * @fw_loaded: Is the firmware loaded?
* @unload_fw_on_remove:Do we need to unload firmware on driver removal? * @unload_fw_on_remove:Do we need to unload firmware on driver removal?
* @sp_indiff: Is the firmware indifferent to physical port speed?
* @ctrl_vnic: Pointer to the control vNIC if available * @ctrl_vnic: Pointer to the control vNIC if available
* @mip: MIP handle * @mip: MIP handle
* @rtbl: RTsym table * @rtbl: RTsym table
...@@ -115,7 +114,6 @@ struct nfp_pf { ...@@ -115,7 +114,6 @@ struct nfp_pf {
bool fw_loaded; bool fw_loaded;
bool unload_fw_on_remove; bool unload_fw_on_remove;
bool sp_indiff;
struct nfp_net *ctrl_vnic; struct nfp_net *ctrl_vnic;
...@@ -163,6 +161,7 @@ bool nfp_ctrl_tx(struct nfp_net *nn, struct sk_buff *skb); ...@@ -163,6 +161,7 @@ bool nfp_ctrl_tx(struct nfp_net *nn, struct sk_buff *skb);
int nfp_pf_rtsym_read_optional(struct nfp_pf *pf, const char *format, int nfp_pf_rtsym_read_optional(struct nfp_pf *pf, const char *format,
unsigned int default_val); unsigned int default_val);
int nfp_net_pf_get_app_id(struct nfp_pf *pf);
u8 __iomem * u8 __iomem *
nfp_pf_map_rtsym(struct nfp_pf *pf, const char *name, const char *sym_fmt, nfp_pf_map_rtsym(struct nfp_pf *pf, const char *name, const char *sym_fmt,
unsigned int min_size, struct nfp_cpp_area **area); unsigned int min_size, struct nfp_cpp_area **area);
......
...@@ -148,14 +148,6 @@ int nfp_net_tlv_caps_parse(struct device *dev, u8 __iomem *ctrl_mem, ...@@ -148,14 +148,6 @@ int nfp_net_tlv_caps_parse(struct device *dev, u8 __iomem *ctrl_mem,
true)) true))
return -EINVAL; return -EINVAL;
break; break;
case NFP_NET_CFG_TLV_TYPE_SP_INDIFF:
if (length) {
dev_err(dev, "Unexpected len of SP_INDIFF TLV:%u\n", length);
return -EINVAL;
}
caps->sp_indiff = true;
break;
default: default:
if (!FIELD_GET(NFP_NET_CFG_TLV_HEADER_REQUIRED, hdr)) if (!FIELD_GET(NFP_NET_CFG_TLV_HEADER_REQUIRED, hdr))
break; break;
......
...@@ -14,6 +14,9 @@ ...@@ -14,6 +14,9 @@
#include <linux/types.h> #include <linux/types.h>
/* 64-bit per app capabilities */
#define NFP_NET_APP_CAP_SP_INDIFF BIT_ULL(0) /* indifferent to port speed */
/* Configuration BAR size. /* Configuration BAR size.
* *
* The configuration BAR is 8K in size, but due to * The configuration BAR is 8K in size, but due to
...@@ -492,10 +495,6 @@ ...@@ -492,10 +495,6 @@
* %NFP_NET_CFG_TLV_TYPE_CRYPTO_OPS_RX_SCAN: * %NFP_NET_CFG_TLV_TYPE_CRYPTO_OPS_RX_SCAN:
* Same as %NFP_NET_CFG_TLV_TYPE_CRYPTO_OPS, but crypto TLS does stream scan * Same as %NFP_NET_CFG_TLV_TYPE_CRYPTO_OPS, but crypto TLS does stream scan
* RX sync, rather than kernel-assisted sync. * RX sync, rather than kernel-assisted sync.
*
* %NFP_NET_CFG_TLV_TYPE_SP_INDIFF:
* Empty, indicate the firmware is indifferent to port speed. Then no need to
* reload driver and firmware when port speed is changed.
*/ */
#define NFP_NET_CFG_TLV_TYPE_UNKNOWN 0 #define NFP_NET_CFG_TLV_TYPE_UNKNOWN 0
#define NFP_NET_CFG_TLV_TYPE_RESERVED 1 #define NFP_NET_CFG_TLV_TYPE_RESERVED 1
...@@ -509,7 +508,6 @@ ...@@ -509,7 +508,6 @@
#define NFP_NET_CFG_TLV_TYPE_CRYPTO_OPS 11 /* see crypto/fw.h */ #define NFP_NET_CFG_TLV_TYPE_CRYPTO_OPS 11 /* see crypto/fw.h */
#define NFP_NET_CFG_TLV_TYPE_VNIC_STATS 12 #define NFP_NET_CFG_TLV_TYPE_VNIC_STATS 12
#define NFP_NET_CFG_TLV_TYPE_CRYPTO_OPS_RX_SCAN 13 #define NFP_NET_CFG_TLV_TYPE_CRYPTO_OPS_RX_SCAN 13
#define NFP_NET_CFG_TLV_TYPE_SP_INDIFF 14
struct device; struct device;
...@@ -524,7 +522,6 @@ struct device; ...@@ -524,7 +522,6 @@ struct device;
* @vnic_stats_off: offset of vNIC stats area * @vnic_stats_off: offset of vNIC stats area
* @vnic_stats_cnt: number of vNIC stats * @vnic_stats_cnt: number of vNIC stats
* @tls_resync_ss: TLS resync will be performed via stream scan * @tls_resync_ss: TLS resync will be performed via stream scan
* @sp_indiff: Firmware is indifferent to port speed
*/ */
struct nfp_net_tlv_caps { struct nfp_net_tlv_caps {
u32 me_freq_mhz; u32 me_freq_mhz;
...@@ -537,7 +534,6 @@ struct nfp_net_tlv_caps { ...@@ -537,7 +534,6 @@ struct nfp_net_tlv_caps {
unsigned int vnic_stats_off; unsigned int vnic_stats_off;
unsigned int vnic_stats_cnt; unsigned int vnic_stats_cnt;
unsigned int tls_resync_ss:1; unsigned int tls_resync_ss:1;
unsigned int sp_indiff:1;
}; };
int nfp_net_tlv_caps_parse(struct device *dev, u8 __iomem *ctrl_mem, int nfp_net_tlv_caps_parse(struct device *dev, u8 __iomem *ctrl_mem,
......
...@@ -77,12 +77,6 @@ static int nfp_net_pf_get_num_ports(struct nfp_pf *pf) ...@@ -77,12 +77,6 @@ static int nfp_net_pf_get_num_ports(struct nfp_pf *pf)
return nfp_pf_rtsym_read_optional(pf, "nfd_cfg_pf%u_num_ports", 1); return nfp_pf_rtsym_read_optional(pf, "nfd_cfg_pf%u_num_ports", 1);
} }
static int nfp_net_pf_get_app_id(struct nfp_pf *pf)
{
return nfp_pf_rtsym_read_optional(pf, "_pf%u_net_app_id",
NFP_APP_CORE_NIC);
}
static void nfp_net_pf_free_vnic(struct nfp_pf *pf, struct nfp_net *nn) static void nfp_net_pf_free_vnic(struct nfp_pf *pf, struct nfp_net *nn)
{ {
if (nfp_net_is_data_vnic(nn)) if (nfp_net_is_data_vnic(nn))
...@@ -206,7 +200,6 @@ nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar, ...@@ -206,7 +200,6 @@ nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar,
nn->port->link_cb = nfp_net_refresh_port_table; nn->port->link_cb = nfp_net_refresh_port_table;
ctrl_bar += NFP_PF_CSR_SLICE_SIZE; ctrl_bar += NFP_PF_CSR_SLICE_SIZE;
pf->sp_indiff |= nn->tlv_caps.sp_indiff;
/* Kill the vNIC if app init marked it as invalid */ /* Kill the vNIC if app init marked it as invalid */
if (nn->port && nn->port->type == NFP_PORT_INVALID) if (nn->port && nn->port->type == NFP_PORT_INVALID)
...@@ -308,36 +301,6 @@ static int nfp_net_pf_init_vnics(struct nfp_pf *pf) ...@@ -308,36 +301,6 @@ static int nfp_net_pf_init_vnics(struct nfp_pf *pf)
return err; return err;
} }
static int nfp_net_pf_cfg_nsp(struct nfp_pf *pf, bool sp_indiff)
{
struct nfp_nsp *nsp;
char hwinfo[32];
int err;
nsp = nfp_nsp_open(pf->cpp);
if (IS_ERR(nsp))
return PTR_ERR(nsp);
snprintf(hwinfo, sizeof(hwinfo), "sp_indiff=%d", sp_indiff);
err = nfp_nsp_hwinfo_set(nsp, hwinfo, sizeof(hwinfo));
/* Not a fatal error, no need to return error to stop driver from loading */
if (err)
nfp_warn(pf->cpp, "HWinfo(sp_indiff=%d) set failed: %d\n", sp_indiff, err);
nfp_nsp_close(nsp);
return 0;
}
static int nfp_net_pf_init_nsp(struct nfp_pf *pf)
{
return nfp_net_pf_cfg_nsp(pf, pf->sp_indiff);
}
static void nfp_net_pf_clean_nsp(struct nfp_pf *pf)
{
(void)nfp_net_pf_cfg_nsp(pf, false);
}
static int static int
nfp_net_pf_app_init(struct nfp_pf *pf, u8 __iomem *qc_bar, unsigned int stride) nfp_net_pf_app_init(struct nfp_pf *pf, u8 __iomem *qc_bar, unsigned int stride)
{ {
...@@ -349,8 +312,6 @@ nfp_net_pf_app_init(struct nfp_pf *pf, u8 __iomem *qc_bar, unsigned int stride) ...@@ -349,8 +312,6 @@ nfp_net_pf_app_init(struct nfp_pf *pf, u8 __iomem *qc_bar, unsigned int stride)
if (IS_ERR(pf->app)) if (IS_ERR(pf->app))
return PTR_ERR(pf->app); return PTR_ERR(pf->app);
pf->sp_indiff |= pf->app->type->id == NFP_APP_FLOWER_NIC;
devl_lock(devlink); devl_lock(devlink);
err = nfp_app_init(pf->app); err = nfp_app_init(pf->app);
devl_unlock(devlink); devl_unlock(devlink);
...@@ -813,13 +774,9 @@ int nfp_net_pci_probe(struct nfp_pf *pf) ...@@ -813,13 +774,9 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
if (err) if (err)
goto err_clean_ddir; goto err_clean_ddir;
err = nfp_net_pf_init_nsp(pf);
if (err)
goto err_free_vnics;
err = nfp_net_pf_alloc_irqs(pf); err = nfp_net_pf_alloc_irqs(pf);
if (err) if (err)
goto err_clean_nsp; goto err_free_vnics;
err = nfp_net_pf_app_start(pf); err = nfp_net_pf_app_start(pf);
if (err) if (err)
...@@ -838,8 +795,6 @@ int nfp_net_pci_probe(struct nfp_pf *pf) ...@@ -838,8 +795,6 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
nfp_net_pf_app_stop(pf); nfp_net_pf_app_stop(pf);
err_free_irqs: err_free_irqs:
nfp_net_pf_free_irqs(pf); nfp_net_pf_free_irqs(pf);
err_clean_nsp:
nfp_net_pf_clean_nsp(pf);
err_free_vnics: err_free_vnics:
nfp_net_pf_free_vnics(pf); nfp_net_pf_free_vnics(pf);
err_clean_ddir: err_clean_ddir:
...@@ -870,7 +825,6 @@ void nfp_net_pci_remove(struct nfp_pf *pf) ...@@ -870,7 +825,6 @@ void nfp_net_pci_remove(struct nfp_pf *pf)
nfp_net_pf_free_vnic(pf, nn); nfp_net_pf_free_vnic(pf, nn);
} }
nfp_net_pf_clean_nsp(pf);
nfp_net_pf_app_stop(pf); nfp_net_pf_app_stop(pf);
/* stop app first, to avoid double free of ctrl vNIC's ddir */ /* stop app first, to avoid double free of ctrl vNIC's ddir */
nfp_net_debugfs_dir_clean(&pf->ddir); nfp_net_debugfs_dir_clean(&pf->ddir);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment