@@ -11,7 +11,9 @@
*
* On the NFP6000, due to THB-350, the configuration BAR is 32K in size.
*/
-#define NFP_NET_CFG_BAR_SZ (32 * 1024)
+#define NFP_NET_CFG_BAR_SZ_32K (32 * 1024)
+#define NFP_NET_CFG_BAR_SZ_8K (8 * 1024)
+#define NFP_NET_CFG_BAR_SZ_MIN NFP_NET_CFG_BAR_SZ_8K
/*
* Configuration sriov VF.
@@ -121,6 +123,10 @@
struct nfp_net_fw_ver {
uint8_t minor;
uint8_t major;
+ /**
+ * BIT0: class, refer NFP_NET_CFG_VERSION_CLASS_*
+ * BIT[7:1]: reserved
+ */
uint8_t class;
/**
* This byte can be extended for more use.
@@ -147,6 +153,8 @@ struct nfp_net_fw_ver {
#define NFP_NET_CFG_VERSION 0x0030
#define NFP_NET_CFG_VERSION_DP_NFD3 0
#define NFP_NET_CFG_VERSION_DP_NFDK 1
+#define NFP_NET_CFG_VERSION_CLASS_GENERIC 0
+#define NFP_NET_CFG_VERSION_CLASS_NO_EMEM 1
#define NFP_NET_CFG_STS 0x0034
#define NFP_NET_CFG_STS_LINK (0x1 << 0) /* Link up or down */
/* Link rate */
@@ -692,7 +692,7 @@ nfp_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv)
/* Map the PF ctrl bar */
snprintf(bar_name, sizeof(bar_name), "_pf%u_net_bar0", id);
pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, bar_name,
- NFP_NET_CFG_BAR_SZ, &pf_dev->ctrl_area);
+ pf_dev->ctrl_bar_size, &pf_dev->ctrl_area);
if (pf_dev->ctrl_bar == NULL) {
PMD_INIT_LOG(ERR, "Cloud not map the PF vNIC ctrl bar");
ret = -ENODEV;
@@ -737,7 +737,7 @@ nfp_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv)
/* Map the ctrl vNIC ctrl bar */
snprintf(ctrl_name, sizeof(ctrl_name), "_pf%u_net_ctrl_bar", id);
ctrl_hw->super.ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, ctrl_name,
- NFP_NET_CFG_BAR_SZ, &ctrl_hw->ctrl_area);
+ pf_dev->ctrl_bar_size, &ctrl_hw->ctrl_area);
if (ctrl_hw->super.ctrl_bar == NULL) {
PMD_INIT_LOG(ERR, "Cloud not map the ctrl vNIC ctrl bar");
ret = -ENODEV;
@@ -1022,7 +1022,7 @@ nfp_net_init(struct rte_eth_dev *eth_dev,
if (pf_dev->multi_pf.enabled)
hw->ctrl_bar = pf_dev->ctrl_bar;
else
- hw->ctrl_bar = pf_dev->ctrl_bar + (port * NFP_NET_CFG_BAR_SZ);
+ hw->ctrl_bar = pf_dev->ctrl_bar + (port * pf_dev->ctrl_bar_size);
net_hw->mac_stats = pf_dev->mac_stats_bar +
(net_hw->nfp_idx * NFP_MAC_STATS_SIZE);
@@ -1555,9 +1555,10 @@ nfp_enable_multi_pf(struct nfp_pf_dev *pf_dev)
memset(&net_hw, 0, sizeof(struct nfp_net_hw));
/* Map the symbol table */
+ pf_dev->ctrl_bar_size = NFP_NET_CFG_BAR_SZ_MIN;
snprintf(name, sizeof(name), "_pf%u_net_bar0",
pf_dev->multi_pf.function_id);
- ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, name, NFP_NET_CFG_BAR_SZ,
+ ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, name, pf_dev->ctrl_bar_size,
&area);
if (ctrl_bar == NULL) {
PMD_INIT_LOG(ERR, "Failed to find data vNIC memory symbol");
@@ -1574,6 +1575,9 @@ nfp_enable_multi_pf(struct nfp_pf_dev *pf_dev)
goto end;
}
+ /* Set the ctrl bar size */
+ nfp_net_ctrl_bar_size_set(pf_dev);
+
if (!pf_dev->multi_pf.enabled)
goto end;
@@ -1670,7 +1674,7 @@ nfp_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)
/* Map the symbol table */
snprintf(bar_name, sizeof(bar_name), "_pf%u_net_bar0", id);
pf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, bar_name,
- pf_dev->total_phyports * NFP_NET_CFG_BAR_SZ,
+ pf_dev->total_phyports * pf_dev->ctrl_bar_size,
&pf_dev->ctrl_area);
if (pf_dev->ctrl_bar == NULL) {
PMD_INIT_LOG(ERR, "nfp_rtsym_map fails for %s", bar_name);
@@ -2065,11 +2069,11 @@ nfp_net_vf_config_init(struct nfp_pf_dev *pf_dev)
if (pf_dev->sriov_vf == 0)
return 0;
- min_size = NFP_NET_CFG_BAR_SZ * pf_dev->sriov_vf;
+ min_size = pf_dev->ctrl_bar_size * pf_dev->sriov_vf;
snprintf(vf_bar_name, sizeof(vf_bar_name), "_pf%d_net_vf_bar",
pf_dev->multi_pf.function_id);
pf_dev->vf_bar = nfp_rtsym_map_offset(pf_dev->sym_tbl, vf_bar_name,
- NFP_NET_CFG_BAR_SZ * pf_dev->vf_base_id,
+ pf_dev->ctrl_bar_size * pf_dev->vf_base_id,
min_size, &pf_dev->vf_area);
if (pf_dev->vf_bar == NULL) {
PMD_INIT_LOG(ERR, "Failed to get vf cfg.");
@@ -2295,15 +2299,15 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
goto hwqueues_cleanup;
}
+ ret = nfp_enable_multi_pf(pf_dev);
+ if (ret != 0)
+ goto mac_stats_cleanup;
+
ret = nfp_net_vf_config_init(pf_dev);
if (ret != 0) {
PMD_INIT_LOG(ERR, "Failed to init VF config.");
- goto mac_stats_cleanup;
- }
-
- ret = nfp_enable_multi_pf(pf_dev);
- if (ret != 0)
goto vf_cfg_tbl_cleanup;
+ }
hw_priv->is_pf = true;
hw_priv->pf_dev = pf_dev;
@@ -295,6 +295,9 @@ nfp_netvf_init(struct rte_eth_dev *eth_dev)
goto pf_dev_free;
}
+ /* Set the ctrl bar size */
+ nfp_net_ctrl_bar_size_set(pf_dev);
+
PMD_INIT_LOG(DEBUG, "ctrl bar: %p", hw->ctrl_bar);
err = nfp_net_common_init(pf_dev, net_hw);
@@ -2184,6 +2184,9 @@ nfp_net_version_check(struct nfp_hw *hw,
if (!nfp_net_is_valid_nfd_version(pf_dev->ver))
return false;
+ if (!nfp_net_is_valid_version_class(pf_dev->ver))
+ return false;
+
return true;
}
@@ -2325,6 +2328,28 @@ nfp_net_is_valid_nfd_version(struct nfp_net_fw_ver version)
return false;
}
+bool
+nfp_net_is_valid_version_class(struct nfp_net_fw_ver version)
+{
+ switch (version.class) {
+ case NFP_NET_CFG_VERSION_CLASS_GENERIC:
+ return true;
+ case NFP_NET_CFG_VERSION_CLASS_NO_EMEM:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void
+nfp_net_ctrl_bar_size_set(struct nfp_pf_dev *pf_dev)
+{
+ if (pf_dev->ver.class == NFP_NET_CFG_VERSION_CLASS_GENERIC)
+ pf_dev->ctrl_bar_size = NFP_NET_CFG_BAR_SZ_32K;
+ else
+ pf_dev->ctrl_bar_size = NFP_NET_CFG_BAR_SZ_8K;
+}
+
/* Disable rx and tx functions to allow for reconfiguring. */
int
nfp_net_stop(struct rte_eth_dev *dev)
@@ -117,6 +117,7 @@ struct nfp_pf_dev {
struct nfp_eth_table *nfp_eth_table;
uint8_t *ctrl_bar;
+ uint32_t ctrl_bar_size;
struct nfp_cpp *cpp;
struct nfp_cpp_area *ctrl_area;
@@ -353,6 +354,7 @@ void nfp_net_tx_desc_limits(struct nfp_net_hw_priv *hw_priv,
int nfp_net_check_dma_mask(struct nfp_pf_dev *pf_dev, char *name);
int nfp_net_firmware_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size);
bool nfp_net_is_valid_nfd_version(struct nfp_net_fw_ver version);
+bool nfp_net_is_valid_version_class(struct nfp_net_fw_ver version);
struct nfp_net_hw *nfp_net_get_hw(const struct rte_eth_dev *dev);
int nfp_net_stop(struct rte_eth_dev *dev);
int nfp_net_flow_ctrl_get(struct rte_eth_dev *dev,
@@ -379,6 +381,7 @@ int nfp_net_vf_config_app_init(struct nfp_net_hw *net_hw,
struct nfp_pf_dev *pf_dev);
bool nfp_net_version_check(struct nfp_hw *hw,
struct nfp_pf_dev *pf_dev);
+void nfp_net_ctrl_bar_size_set(struct nfp_pf_dev *pf_dev);
#define NFP_PRIV_TO_APP_FW_NIC(app_fw_priv)\
((struct nfp_app_fw_nic *)app_fw_priv)
@@ -30,13 +30,15 @@ nfp_net_tlv_caps_parse(struct rte_eth_dev *dev)
uint32_t tlv_type;
struct nfp_net_hw *net_hw;
struct nfp_net_tlv_caps *caps;
+ struct nfp_net_hw_priv *hw_priv;
net_hw = dev->data->dev_private;
+ hw_priv = dev->process_private;
caps = &net_hw->tlv_caps;
nfp_net_tlv_caps_reset(caps);
data = net_hw->super.ctrl_bar + NFP_NET_CFG_TLV_BASE;
- end = net_hw->super.ctrl_bar + NFP_NET_CFG_BAR_SZ;
+ end = net_hw->super.ctrl_bar + hw_priv->pf_dev->ctrl_bar_size;
hdr = rte_read32(data);
if (hdr == 0) {