[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230816143912.34540-13-louis.peens@corigine.com>
Date: Wed, 16 Aug 2023 16:39:11 +0200
From: Louis Peens <louis.peens@...igine.com>
To: David Miller <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>
Cc: Simon Horman <simon.horman@...igine.com>,
Yinjun Zhang <yinjun.zhang@...igine.com>,
Tianyu Yuan <tianyu.yuan@...igine.com>,
netdev@...r.kernel.org,
oss-drivers@...igine.com
Subject: [PATCH net-next v2 12/13] nfp: configure VF split info into application firmware
From: Yinjun Zhang <yinjun.zhang@...igine.com>
In multi-PF case, all PFs share total 64 VFs. To support the VF
count of each PF configurable, driver needs to write the VF count
and the first VF id into application firmware, so that firmware
can initialize and allocate relevant resource accordingly.
Signed-off-by: Yinjun Zhang <yinjun.zhang@...igine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@...igine.com>
Acked-by: Simon Horman <simon.horman@...igine.com>
Signed-off-by: Louis Peens <louis.peens@...igine.com>
---
drivers/net/ethernet/netronome/nfp/nfp_main.c | 1 +
drivers/net/ethernet/netronome/nfp/nfp_main.h | 2 ++
.../net/ethernet/netronome/nfp/nfp_net_main.c | 16 ++++++++++++
.../ethernet/netronome/nfp/nfp_net_sriov.c | 25 +++++++++++++++++++
.../ethernet/netronome/nfp/nfp_net_sriov.h | 5 ++++
5 files changed, 49 insertions(+)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
index b15b5fe0c1c9..70e140e7d93b 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
@@ -254,6 +254,7 @@ static unsigned int nfp_pf_get_limit_vfs(struct nfp_pf *pf,
if (offset >= limit_vfs_rtsym)
return 0;
+ pf->multi_pf.vf_fid = offset;
if (offset + total > limit_vfs_rtsym)
return limit_vfs_rtsym - offset;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.h b/drivers/net/ethernet/netronome/nfp/nfp_main.h
index 4f6763ca1c92..e7f125a3f884 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.h
@@ -87,6 +87,7 @@ struct nfp_dumpspec {
* @multi_pf: Used in multi-PF setup
* @multi_pf.en: True if it's a NIC with multiple PFs
* @multi_pf.id: PF index
+ * @multi_pf.vf_fid: Id of first VF that belongs to this PF
* @multi_pf.beat_timer:Timer for beat to keepalive
* @multi_pf.beat_area: Pointer to CPP area for beat to keepalive
* @multi_pf.beat_addr: Pointer to mapped beat address used for keepalive
@@ -151,6 +152,7 @@ struct nfp_pf {
struct {
bool en;
u8 id;
+ u8 vf_fid;
struct timer_list beat_timer;
struct nfp_cpp_area *beat_area;
u8 __iomem *beat_addr;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
index f6f4fea0a791..eb7b0ecd65df 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
@@ -293,6 +293,16 @@ static int nfp_net_pf_init_vnics(struct nfp_pf *pf)
return err;
}
+static void nfp_net_pf_clean_vnics(struct nfp_pf *pf)
+{
+ struct nfp_net *nn;
+
+ list_for_each_entry(nn, &pf->vnics, vnic_list) {
+ if (nfp_net_is_data_vnic(nn))
+ nfp_net_pf_clean_vnic(pf, nn);
+ }
+}
+
static int
nfp_net_pf_app_init(struct nfp_pf *pf, u8 __iomem *qc_bar, unsigned int stride)
{
@@ -852,11 +862,17 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
if (err)
goto err_stop_app;
+ err = nfp_net_pf_init_sriov(pf);
+ if (err)
+ goto err_clean_vnics;
+
devl_unlock(devlink);
devlink_register(devlink);
return 0;
+err_clean_vnics:
+ nfp_net_pf_clean_vnics(pf);
err_stop_app:
nfp_net_pf_app_stop(pf);
err_free_irqs:
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_sriov.c b/drivers/net/ethernet/netronome/nfp/nfp_net_sriov.c
index 6eeeb0fda91f..f516ba7a429e 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_sriov.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_sriov.c
@@ -14,6 +14,9 @@
#include "nfp_net.h"
#include "nfp_net_sriov.h"
+/* The configurations that precede VF creating. */
+#define NFP_NET_VF_PRE_CONFIG NFP_NET_VF_CFG_MB_CAP_SPLIT
+
static int
nfp_net_sriov_check(struct nfp_app *app, int vf, u16 cap, const char *msg, bool warn)
{
@@ -29,6 +32,10 @@ nfp_net_sriov_check(struct nfp_app *app, int vf, u16 cap, const char *msg, bool
return -EOPNOTSUPP;
}
+ /* No need to check vf for the pre-configurations. */
+ if (cap & NFP_NET_VF_PRE_CONFIG)
+ return 0;
+
if (vf < 0 || vf >= app->pf->num_vfs) {
if (warn)
nfp_warn(app->pf->cpp, "invalid VF id %d\n", vf);
@@ -309,3 +316,21 @@ int nfp_app_get_vf_config(struct net_device *netdev, int vf,
return 0;
}
+
+int nfp_net_pf_init_sriov(struct nfp_pf *pf)
+{
+ int err;
+
+ if (!pf->multi_pf.en || !pf->limit_vfs)
+ return 0;
+
+ err = nfp_net_sriov_check(pf->app, 0, NFP_NET_VF_CFG_MB_CAP_SPLIT, "split", true);
+ if (err)
+ return err;
+
+ writeb(pf->limit_vfs, pf->vfcfg_tbl2 + NFP_NET_VF_CFG_MB_VF_CNT);
+
+ /* Reuse NFP_NET_VF_CFG_MB_VF_NUM to pass vf_fid to FW. */
+ return nfp_net_sriov_update(pf->app, pf->multi_pf.vf_fid,
+ NFP_NET_VF_CFG_MB_UPD_SPLIT, "split");
+}
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_sriov.h b/drivers/net/ethernet/netronome/nfp/nfp_net_sriov.h
index 2d445fa199dc..8de959018819 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_sriov.h
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_sriov.h
@@ -21,6 +21,7 @@
#define NFP_NET_VF_CFG_MB_CAP_TRUST (0x1 << 4)
#define NFP_NET_VF_CFG_MB_CAP_VLAN_PROTO (0x1 << 5)
#define NFP_NET_VF_CFG_MB_CAP_RATE (0x1 << 6)
+#define NFP_NET_VF_CFG_MB_CAP_SPLIT (0x1 << 8)
#define NFP_NET_VF_CFG_MB_RET 0x2
#define NFP_NET_VF_CFG_MB_UPD 0x4
#define NFP_NET_VF_CFG_MB_UPD_MAC (0x1 << 0)
@@ -30,6 +31,8 @@
#define NFP_NET_VF_CFG_MB_UPD_TRUST (0x1 << 4)
#define NFP_NET_VF_CFG_MB_UPD_VLAN_PROTO (0x1 << 5)
#define NFP_NET_VF_CFG_MB_UPD_RATE (0x1 << 6)
+#define NFP_NET_VF_CFG_MB_UPD_SPLIT (0x1 << 8)
+#define NFP_NET_VF_CFG_MB_VF_CNT 0x6
#define NFP_NET_VF_CFG_MB_VF_NUM 0x7
/* VF config entry
@@ -68,4 +71,6 @@ int nfp_app_set_vf_link_state(struct net_device *netdev, int vf,
int nfp_app_get_vf_config(struct net_device *netdev, int vf,
struct ifla_vf_info *ivi);
+int nfp_net_pf_init_sriov(struct nfp_pf *pf);
+
#endif /* _NFP_NET_SRIOV_H_ */
--
2.34.1
Powered by blists - more mailing lists