Merge branch 'mlx5-misc-patches'
Tariq Toukan says: ==================== mlx5 misc patches This patchset includes small features and misc code enhancements for the mlx5 core and EN drivers. Patches 1-4 by Gal improves the mlx5e ethtool stats implementation, for example by using standard helpers ethtool_sprintf/puts. Patch 5 by me adds a reset option for the FW command interface debugfs stats entries. This allows explicit FW command interface stats reset between different runs of a test case. Patches 6 and 7 are simple cleanups. Patch 8 by Gal adds driver support for 800Gbps link modes. Patch 9 by Jianbo enhances the L4 steering abilities. Patches 10-11 by Jianbo save redundant operations. ==================== Link: https://lore.kernel.org/r/20240402133043.56322-1-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
6b164687f8
@ -143,8 +143,8 @@ static ssize_t average_read(struct file *filp, char __user *buf, size_t count,
|
||||
return simple_read_from_buffer(buf, count, pos, tbuf, ret);
|
||||
}
|
||||
|
||||
static ssize_t average_write(struct file *filp, const char __user *buf,
|
||||
size_t count, loff_t *pos)
|
||||
static ssize_t reset_write(struct file *filp, const char __user *buf,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
struct mlx5_cmd_stats *stats;
|
||||
|
||||
@ -152,6 +152,11 @@ static ssize_t average_write(struct file *filp, const char __user *buf,
|
||||
spin_lock_irq(&stats->lock);
|
||||
stats->sum = 0;
|
||||
stats->n = 0;
|
||||
stats->failed = 0;
|
||||
stats->failed_mbox_status = 0;
|
||||
stats->last_failed_errno = 0;
|
||||
stats->last_failed_mbox_status = 0;
|
||||
stats->last_failed_syndrome = 0;
|
||||
spin_unlock_irq(&stats->lock);
|
||||
|
||||
*pos += count;
|
||||
@ -159,11 +164,16 @@ static ssize_t average_write(struct file *filp, const char __user *buf,
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations stats_fops = {
|
||||
static const struct file_operations reset_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = simple_open,
|
||||
.write = reset_write,
|
||||
};
|
||||
|
||||
static const struct file_operations average_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = simple_open,
|
||||
.read = average_read,
|
||||
.write = average_write,
|
||||
};
|
||||
|
||||
static ssize_t slots_read(struct file *filp, char __user *buf, size_t count,
|
||||
@ -228,8 +238,10 @@ void mlx5_cmdif_debugfs_init(struct mlx5_core_dev *dev)
|
||||
continue;
|
||||
stats->root = debugfs_create_dir(namep, *cmd);
|
||||
|
||||
debugfs_create_file("reset", 0200, stats->root, stats,
|
||||
&reset_fops);
|
||||
debugfs_create_file("average", 0400, stats->root, stats,
|
||||
&stats_fops);
|
||||
&average_fops);
|
||||
debugfs_create_u64("n", 0400, stats->root, &stats->n);
|
||||
debugfs_create_u64("failed", 0400, stats->root, &stats->failed);
|
||||
debugfs_create_u64("failed_mbox_status", 0400, stats->root,
|
||||
|
@ -1160,7 +1160,7 @@ void mlx5e_vxlan_set_netdev_info(struct mlx5e_priv *priv);
|
||||
void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
|
||||
struct ethtool_drvinfo *drvinfo);
|
||||
void mlx5e_ethtool_get_strings(struct mlx5e_priv *priv,
|
||||
uint32_t stringset, uint8_t *data);
|
||||
u32 stringset, u8 *data);
|
||||
int mlx5e_ethtool_get_sset_count(struct mlx5e_priv *priv, int sset);
|
||||
void mlx5e_ethtool_get_ethtool_stats(struct mlx5e_priv *priv,
|
||||
struct ethtool_stats *stats, u64 *data);
|
||||
|
@ -565,7 +565,7 @@ mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xmit_data *xdptxd,
|
||||
linear = !!(dma_len - inline_hdr_sz);
|
||||
ds_cnt = MLX5E_TX_WQE_EMPTY_DS_COUNT + linear + !!inline_hdr_sz;
|
||||
|
||||
/* check_result must be 0 if sinfo is passed. */
|
||||
/* check_result must be 0 if xdptxd->has_frags is true. */
|
||||
if (!check_result) {
|
||||
int stop_room = 1;
|
||||
|
||||
|
@ -73,7 +73,7 @@ void mlx5e_accel_fs_del_sk(struct mlx5_flow_handle *rule)
|
||||
|
||||
struct mlx5_flow_handle *mlx5e_accel_fs_add_sk(struct mlx5e_flow_steering *fs,
|
||||
struct sock *sk, u32 tirn,
|
||||
uint32_t flow_tag)
|
||||
u32 flow_tag)
|
||||
{
|
||||
struct mlx5e_accel_fs_tcp *fs_tcp = mlx5e_fs_get_accel_tcp(fs);
|
||||
struct mlx5_flow_destination dest = {};
|
||||
|
@ -11,14 +11,14 @@ int mlx5e_accel_fs_tcp_create(struct mlx5e_flow_steering *fs);
|
||||
void mlx5e_accel_fs_tcp_destroy(struct mlx5e_flow_steering *fs);
|
||||
struct mlx5_flow_handle *mlx5e_accel_fs_add_sk(struct mlx5e_flow_steering *fs,
|
||||
struct sock *sk, u32 tirn,
|
||||
uint32_t flow_tag);
|
||||
u32 flow_tag);
|
||||
void mlx5e_accel_fs_del_sk(struct mlx5_flow_handle *rule);
|
||||
#else
|
||||
static inline int mlx5e_accel_fs_tcp_create(struct mlx5e_flow_steering *fs) { return 0; }
|
||||
static inline void mlx5e_accel_fs_tcp_destroy(struct mlx5e_flow_steering *fs) {}
|
||||
static inline struct mlx5_flow_handle *mlx5e_accel_fs_add_sk(struct mlx5e_flow_steering *fs,
|
||||
struct sock *sk, u32 tirn,
|
||||
uint32_t flow_tag)
|
||||
u32 flow_tag)
|
||||
{ return ERR_PTR(-EOPNOTSUPP); }
|
||||
static inline void mlx5e_accel_fs_del_sk(struct mlx5_flow_handle *rule) {}
|
||||
#endif
|
||||
|
@ -78,13 +78,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ipsec_hw)
|
||||
unsigned int i;
|
||||
|
||||
if (!priv->ipsec)
|
||||
return idx;
|
||||
return;
|
||||
|
||||
for (i = 0; i < NUM_IPSEC_HW_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
mlx5e_ipsec_hw_stats_desc[i].format);
|
||||
|
||||
return idx;
|
||||
ethtool_puts(data, mlx5e_ipsec_hw_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ipsec_hw)
|
||||
@ -92,14 +89,14 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ipsec_hw)
|
||||
int i;
|
||||
|
||||
if (!priv->ipsec)
|
||||
return idx;
|
||||
return;
|
||||
|
||||
mlx5e_accel_ipsec_fs_read_stats(priv, &priv->ipsec->hw_stats);
|
||||
for (i = 0; i < NUM_IPSEC_HW_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR_ATOMIC64(&priv->ipsec->hw_stats,
|
||||
mlx5e_ipsec_hw_stats_desc, i);
|
||||
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR_ATOMIC64(&priv->ipsec->hw_stats,
|
||||
mlx5e_ipsec_hw_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(ipsec_sw)
|
||||
@ -115,9 +112,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ipsec_sw)
|
||||
|
||||
if (priv->ipsec)
|
||||
for (i = 0; i < NUM_IPSEC_SW_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
mlx5e_ipsec_sw_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data, mlx5e_ipsec_sw_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ipsec_sw)
|
||||
@ -126,9 +121,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ipsec_sw)
|
||||
|
||||
if (priv->ipsec)
|
||||
for (i = 0; i < NUM_IPSEC_SW_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR_ATOMIC64(&priv->ipsec->sw_stats,
|
||||
mlx5e_ipsec_sw_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR_ATOMIC64(
|
||||
&priv->ipsec->sw_stats,
|
||||
mlx5e_ipsec_sw_stats_desc, i));
|
||||
}
|
||||
|
||||
MLX5E_DEFINE_STATS_GRP(ipsec_hw, 0);
|
||||
|
@ -95,8 +95,8 @@ int mlx5e_ktls_init(struct mlx5e_priv *priv);
|
||||
void mlx5e_ktls_cleanup(struct mlx5e_priv *priv);
|
||||
|
||||
int mlx5e_ktls_get_count(struct mlx5e_priv *priv);
|
||||
int mlx5e_ktls_get_strings(struct mlx5e_priv *priv, uint8_t *data);
|
||||
int mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 *data);
|
||||
void mlx5e_ktls_get_strings(struct mlx5e_priv *priv, u8 **data);
|
||||
void mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 **data);
|
||||
|
||||
#else
|
||||
static inline void mlx5e_ktls_build_netdev(struct mlx5e_priv *priv)
|
||||
@ -144,15 +144,9 @@ static inline bool mlx5e_is_ktls_rx(struct mlx5_core_dev *mdev)
|
||||
static inline int mlx5e_ktls_init(struct mlx5e_priv *priv) { return 0; }
|
||||
static inline void mlx5e_ktls_cleanup(struct mlx5e_priv *priv) { }
|
||||
static inline int mlx5e_ktls_get_count(struct mlx5e_priv *priv) { return 0; }
|
||||
static inline int mlx5e_ktls_get_strings(struct mlx5e_priv *priv, uint8_t *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void mlx5e_ktls_get_strings(struct mlx5e_priv *priv, u8 **data) { }
|
||||
|
||||
static inline int mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 **data) { }
|
||||
#endif
|
||||
|
||||
#endif /* __MLX5E_TLS_H__ */
|
||||
|
@ -58,35 +58,31 @@ int mlx5e_ktls_get_count(struct mlx5e_priv *priv)
|
||||
return ARRAY_SIZE(mlx5e_ktls_sw_stats_desc);
|
||||
}
|
||||
|
||||
int mlx5e_ktls_get_strings(struct mlx5e_priv *priv, uint8_t *data)
|
||||
void mlx5e_ktls_get_strings(struct mlx5e_priv *priv, u8 **data)
|
||||
{
|
||||
unsigned int i, n, idx = 0;
|
||||
unsigned int i, n;
|
||||
|
||||
if (!priv->tls)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
n = mlx5e_ktls_get_count(priv);
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
mlx5e_ktls_sw_stats_desc[i].format);
|
||||
|
||||
return n;
|
||||
ethtool_puts(data, mlx5e_ktls_sw_stats_desc[i].format);
|
||||
}
|
||||
|
||||
int mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 *data)
|
||||
void mlx5e_ktls_get_stats(struct mlx5e_priv *priv, u64 **data)
|
||||
{
|
||||
unsigned int i, n, idx = 0;
|
||||
unsigned int i, n;
|
||||
|
||||
if (!priv->tls)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
n = mlx5e_ktls_get_count(priv);
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
data[idx++] = MLX5E_READ_CTR_ATOMIC64(&priv->tls->sw_stats,
|
||||
mlx5e_ktls_sw_stats_desc,
|
||||
i);
|
||||
|
||||
return n;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR_ATOMIC64(&priv->tls->sw_stats,
|
||||
mlx5e_ktls_sw_stats_desc, i));
|
||||
}
|
||||
|
@ -38,16 +38,13 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(macsec_hw)
|
||||
unsigned int i;
|
||||
|
||||
if (!priv->macsec)
|
||||
return idx;
|
||||
return;
|
||||
|
||||
if (!mlx5e_is_macsec_device(priv->mdev))
|
||||
return idx;
|
||||
return;
|
||||
|
||||
for (i = 0; i < NUM_MACSEC_HW_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
mlx5e_macsec_hw_stats_desc[i].format);
|
||||
|
||||
return idx;
|
||||
ethtool_puts(data, mlx5e_macsec_hw_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(macsec_hw)
|
||||
@ -56,19 +53,18 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(macsec_hw)
|
||||
int i;
|
||||
|
||||
if (!priv->macsec)
|
||||
return idx;
|
||||
return;
|
||||
|
||||
if (!mlx5e_is_macsec_device(priv->mdev))
|
||||
return idx;
|
||||
return;
|
||||
|
||||
macsec_fs = priv->mdev->macsec_fs;
|
||||
mlx5_macsec_fs_get_stats_fill(macsec_fs, mlx5_macsec_fs_get_stats(macsec_fs));
|
||||
for (i = 0; i < NUM_MACSEC_HW_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_CPU(mlx5_macsec_fs_get_stats(macsec_fs),
|
||||
mlx5e_macsec_hw_stats_desc,
|
||||
i);
|
||||
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
mlx5_macsec_fs_get_stats(macsec_fs),
|
||||
mlx5e_macsec_hw_stats_desc, i));
|
||||
}
|
||||
|
||||
MLX5E_DEFINE_STATS_GRP(macsec_hw, 0);
|
||||
|
@ -219,6 +219,13 @@ void mlx5e_build_ptys2ethtool_map(void)
|
||||
ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT);
|
||||
MLX5_BUILD_PTYS2ETHTOOL_CONFIG(MLX5E_800GAUI_8_800GBASE_CR8_KR8, ext,
|
||||
ETHTOOL_LINK_MODE_800000baseCR8_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_800000baseKR8_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_800000baseDR8_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_800000baseSR8_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_800000baseVR8_Full_BIT);
|
||||
}
|
||||
|
||||
static void mlx5e_ethtool_get_speed_arr(struct mlx5_core_dev *mdev,
|
||||
@ -269,8 +276,7 @@ void mlx5e_ethtool_get_strings(struct mlx5e_priv *priv, u32 stringset, u8 *data)
|
||||
switch (stringset) {
|
||||
case ETH_SS_PRIV_FLAGS:
|
||||
for (i = 0; i < MLX5E_NUM_PFLAGS; i++)
|
||||
strcpy(data + i * ETH_GSTRING_LEN,
|
||||
mlx5e_priv_flags[i].name);
|
||||
ethtool_puts(&data, mlx5e_priv_flags[i].name);
|
||||
break;
|
||||
|
||||
case ETH_SS_TEST:
|
||||
|
@ -896,8 +896,7 @@ static void mlx5e_set_inner_ttc_params(struct mlx5e_flow_steering *fs,
|
||||
int tt;
|
||||
|
||||
memset(ttc_params, 0, sizeof(*ttc_params));
|
||||
ttc_params->ns = mlx5_get_flow_namespace(fs->mdev,
|
||||
MLX5_FLOW_NAMESPACE_KERNEL);
|
||||
ttc_params->ns_type = MLX5_FLOW_NAMESPACE_KERNEL;
|
||||
ft_attr->level = MLX5E_INNER_TTC_FT_LEVEL;
|
||||
ft_attr->prio = MLX5E_NIC_PRIO;
|
||||
|
||||
@ -920,8 +919,7 @@ void mlx5e_set_ttc_params(struct mlx5e_flow_steering *fs,
|
||||
int tt;
|
||||
|
||||
memset(ttc_params, 0, sizeof(*ttc_params));
|
||||
ttc_params->ns = mlx5_get_flow_namespace(fs->mdev,
|
||||
MLX5_FLOW_NAMESPACE_KERNEL);
|
||||
ttc_params->ns_type = MLX5_FLOW_NAMESPACE_KERNEL;
|
||||
ft_attr->level = MLX5E_TTC_FT_LEVEL;
|
||||
ft_attr->prio = MLX5E_NIC_PRIO;
|
||||
|
||||
|
@ -135,9 +135,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(sw_rep)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_VPORT_REP_SW_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
sw_rep_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data, sw_rep_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw_rep)
|
||||
@ -145,9 +143,9 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw_rep)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_VPORT_REP_SW_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.sw,
|
||||
sw_rep_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(&priv->stats.sw,
|
||||
sw_rep_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw_rep)
|
||||
@ -176,11 +174,9 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport_rep)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_VPORT_REP_HW_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_rep_stats_desc[i].format);
|
||||
ethtool_puts(data, vport_rep_stats_desc[i].format);
|
||||
for (i = 0; i < NUM_VPORT_REP_LOOPBACK_COUNTERS(priv->mdev); i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
vport_rep_loopback_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data, vport_rep_loopback_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport_rep)
|
||||
@ -188,12 +184,14 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport_rep)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_VPORT_REP_HW_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.rep_stats,
|
||||
vport_rep_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(&priv->stats.rep_stats,
|
||||
vport_rep_stats_desc, i));
|
||||
for (i = 0; i < NUM_VPORT_REP_LOOPBACK_COUNTERS(priv->mdev); i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.rep_stats,
|
||||
vport_rep_loopback_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_CPU(&priv->stats.rep_stats,
|
||||
vport_rep_loopback_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport_rep)
|
||||
@ -276,7 +274,7 @@ out:
|
||||
}
|
||||
|
||||
static void mlx5e_rep_get_strings(struct net_device *dev,
|
||||
u32 stringset, uint8_t *data)
|
||||
u32 stringset, u8 *data)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
|
||||
|
@ -359,7 +359,7 @@ int mlx5e_self_test_fill_strings(struct mlx5e_priv *priv, u8 *data)
|
||||
if (st.cond_func && st.cond_func(priv))
|
||||
continue;
|
||||
if (data)
|
||||
strcpy(data + count * ETH_GSTRING_LEN, st.name);
|
||||
ethtool_puts(&data, st.name);
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
|
@ -41,6 +41,11 @@
|
||||
#include <net/page_pool/helpers.h>
|
||||
#endif
|
||||
|
||||
void mlx5e_ethtool_put_stat(u64 **data, u64 val)
|
||||
{
|
||||
*(*data)++ = val;
|
||||
}
|
||||
|
||||
static unsigned int stats_grps_num(struct mlx5e_priv *priv)
|
||||
{
|
||||
return !priv->profile->stats_grps_num ? 0 :
|
||||
@ -90,17 +95,17 @@ void mlx5e_stats_fill(struct mlx5e_priv *priv, u64 *data, int idx)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_stats_grps; i++)
|
||||
idx = stats_grps[i]->fill_stats(priv, data, idx);
|
||||
stats_grps[i]->fill_stats(priv, &data);
|
||||
}
|
||||
|
||||
void mlx5e_stats_fill_strings(struct mlx5e_priv *priv, u8 *data)
|
||||
{
|
||||
mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
|
||||
const unsigned int num_stats_grps = stats_grps_num(priv);
|
||||
int i, idx = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_stats_grps; i++)
|
||||
idx = stats_grps[i]->fill_strings(priv, data, idx);
|
||||
stats_grps[i]->fill_strings(priv, &data);
|
||||
}
|
||||
|
||||
/* Concrete NIC Stats */
|
||||
@ -257,8 +262,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(sw)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_SW_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, sw_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data, sw_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw)
|
||||
@ -266,8 +270,9 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_SW_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.sw, sw_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(data,
|
||||
MLX5E_READ_CTR64_CPU(&priv->stats.sw,
|
||||
sw_stats_desc, i));
|
||||
}
|
||||
|
||||
static void mlx5e_stats_grp_sw_update_stats_xdp_red(struct mlx5e_sw_stats *s,
|
||||
@ -591,14 +596,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_Q_COUNTERS && q_counter_any(priv); i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
q_stats_desc[i].format);
|
||||
ethtool_puts(data, q_stats_desc[i].format);
|
||||
|
||||
for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
drop_rq_stats_desc[i].format);
|
||||
|
||||
return idx;
|
||||
ethtool_puts(data, drop_rq_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt)
|
||||
@ -606,12 +607,13 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_Q_COUNTERS && q_counter_any(priv); i++)
|
||||
data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
|
||||
q_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(data,
|
||||
MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
|
||||
q_stats_desc, i));
|
||||
for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
|
||||
data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
|
||||
drop_rq_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
|
||||
drop_rq_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt)
|
||||
@ -685,18 +687,13 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vnic_env)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
vnic_env_stats_steer_desc[i].format);
|
||||
ethtool_puts(data, vnic_env_stats_steer_desc[i].format);
|
||||
|
||||
for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
vnic_env_stats_dev_oob_desc[i].format);
|
||||
ethtool_puts(data, vnic_env_stats_dev_oob_desc[i].format);
|
||||
|
||||
for (i = 0; i < NUM_VNIC_ENV_DROP_COUNTERS(priv->mdev); i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
vnic_env_stats_drop_desc[i].format);
|
||||
|
||||
return idx;
|
||||
ethtool_puts(data, vnic_env_stats_drop_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vnic_env)
|
||||
@ -704,18 +701,22 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vnic_env)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vnic.query_vnic_env_out,
|
||||
vnic_env_stats_steer_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(priv->stats.vnic.query_vnic_env_out,
|
||||
vnic_env_stats_steer_desc, i));
|
||||
|
||||
for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
|
||||
data[idx++] = MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
|
||||
vnic_env_stats_dev_oob_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
|
||||
vnic_env_stats_dev_oob_desc, i));
|
||||
|
||||
for (i = 0; i < NUM_VNIC_ENV_DROP_COUNTERS(priv->mdev); i++)
|
||||
data[idx++] = MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
|
||||
vnic_env_stats_drop_desc, i);
|
||||
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
|
||||
vnic_env_stats_drop_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vnic_env)
|
||||
@ -798,13 +799,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_VPORT_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_stats_desc[i].format);
|
||||
ethtool_puts(data, vport_stats_desc[i].format);
|
||||
|
||||
for (i = 0; i < NUM_VPORT_LOOPBACK_COUNTERS(priv->mdev); i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
vport_loopback_stats_desc[i].format);
|
||||
|
||||
return idx;
|
||||
ethtool_puts(data, vport_loopback_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport)
|
||||
@ -812,14 +810,16 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_VPORT_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
|
||||
vport_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
|
||||
vport_stats_desc, i));
|
||||
|
||||
for (i = 0; i < NUM_VPORT_LOOPBACK_COUNTERS(priv->mdev); i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
|
||||
vport_loopback_stats_desc, i);
|
||||
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
|
||||
vport_loopback_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport)
|
||||
@ -868,8 +868,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(802_3)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_802_3_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data, pport_802_3_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(802_3)
|
||||
@ -877,9 +876,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(802_3)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.IEEE_802_3_counters,
|
||||
pport_802_3_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport.IEEE_802_3_counters,
|
||||
pport_802_3_stats_desc, i));
|
||||
}
|
||||
|
||||
#define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \
|
||||
@ -1029,8 +1029,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2863)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2863_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data, pport_2863_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2863)
|
||||
@ -1038,9 +1037,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2863)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2863_counters,
|
||||
pport_2863_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport.RFC_2863_counters,
|
||||
pport_2863_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2863)
|
||||
@ -1088,8 +1088,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2819)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2819_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data, pport_2819_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2819)
|
||||
@ -1097,9 +1096,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2819)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2819_counters,
|
||||
pport_2819_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport.RFC_2819_counters,
|
||||
pport_2819_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2819)
|
||||
@ -1215,21 +1215,18 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(phy)
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
int i;
|
||||
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, "link_down_events_phy");
|
||||
ethtool_puts(data, "link_down_events_phy");
|
||||
|
||||
if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
|
||||
return idx;
|
||||
return;
|
||||
|
||||
for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_phy_statistical_stats_desc[i].format);
|
||||
ethtool_puts(data, pport_phy_statistical_stats_desc[i].format);
|
||||
|
||||
if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
|
||||
for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_phy_statistical_err_lanes_stats_desc[i].format);
|
||||
|
||||
return idx;
|
||||
ethtool_puts(data,
|
||||
pport_phy_statistical_err_lanes_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)
|
||||
@ -1238,24 +1235,29 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)
|
||||
int i;
|
||||
|
||||
/* link_down_events_phy has special handling since it is not stored in __be64 format */
|
||||
data[idx++] = MLX5_GET(ppcnt_reg, priv->stats.pport.phy_counters,
|
||||
counter_set.phys_layer_cntrs.link_down_events);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5_GET(ppcnt_reg, priv->stats.pport.phy_counters,
|
||||
counter_set.phys_layer_cntrs.link_down_events));
|
||||
|
||||
if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
|
||||
return idx;
|
||||
return;
|
||||
|
||||
for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
|
||||
pport_phy_statistical_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport.phy_statistical_counters,
|
||||
pport_phy_statistical_stats_desc, i));
|
||||
|
||||
if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
|
||||
for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
|
||||
pport_phy_statistical_err_lanes_stats_desc,
|
||||
i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport
|
||||
.phy_statistical_counters,
|
||||
pport_phy_statistical_err_lanes_stats_desc,
|
||||
i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy)
|
||||
@ -1436,9 +1438,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(eth_ext)
|
||||
|
||||
if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
|
||||
for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_eth_ext_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data, pport_eth_ext_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(eth_ext)
|
||||
@ -1447,10 +1447,11 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(eth_ext)
|
||||
|
||||
if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
|
||||
for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&priv->stats.pport.eth_ext_counters,
|
||||
pport_eth_ext_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport.eth_ext_counters,
|
||||
pport_eth_ext_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(eth_ext)
|
||||
@ -1516,19 +1517,16 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pcie)
|
||||
|
||||
if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
|
||||
for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pcie_perf_stats_desc[i].format);
|
||||
ethtool_puts(data, pcie_perf_stats_desc[i].format);
|
||||
|
||||
if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
|
||||
for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pcie_perf_stats_desc64[i].format);
|
||||
ethtool_puts(data, pcie_perf_stats_desc64[i].format);
|
||||
|
||||
if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
|
||||
for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pcie_perf_stall_stats_desc[i].format);
|
||||
return idx;
|
||||
ethtool_puts(data,
|
||||
pcie_perf_stall_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pcie)
|
||||
@ -1537,22 +1535,27 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pcie)
|
||||
|
||||
if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
|
||||
for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
|
||||
pcie_perf_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR32_BE(
|
||||
&priv->stats.pcie.pcie_perf_counters,
|
||||
pcie_perf_stats_desc, i));
|
||||
|
||||
if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
|
||||
for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&priv->stats.pcie.pcie_perf_counters,
|
||||
pcie_perf_stats_desc64, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pcie.pcie_perf_counters,
|
||||
pcie_perf_stats_desc64, i));
|
||||
|
||||
if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
|
||||
for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
|
||||
pcie_perf_stall_stats_desc, i);
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR32_BE(
|
||||
&priv->stats.pcie.pcie_perf_counters,
|
||||
pcie_perf_stall_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pcie)
|
||||
@ -1609,18 +1612,18 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_port_buff_congest)
|
||||
int i, prio;
|
||||
|
||||
if (!MLX5_CAP_GEN(mdev, sbcam_reg))
|
||||
return idx;
|
||||
return;
|
||||
|
||||
for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
|
||||
for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_per_tc_prio_stats_desc[i].format, prio);
|
||||
ethtool_sprintf(data,
|
||||
pport_per_tc_prio_stats_desc[i].format,
|
||||
prio);
|
||||
for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_per_tc_congest_prio_stats_desc[i].format, prio);
|
||||
ethtool_sprintf(data,
|
||||
pport_per_tc_congest_prio_stats_desc[i].format,
|
||||
prio);
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_port_buff_congest)
|
||||
@ -1630,20 +1633,24 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_port_buff_congest)
|
||||
int i, prio;
|
||||
|
||||
if (!MLX5_CAP_GEN(mdev, sbcam_reg))
|
||||
return idx;
|
||||
return;
|
||||
|
||||
for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
|
||||
for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&pport->per_tc_prio_counters[prio],
|
||||
pport_per_tc_prio_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&pport->per_tc_prio_counters[prio],
|
||||
pport_per_tc_prio_stats_desc, i));
|
||||
for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS ; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&pport->per_tc_congest_prio_counters[prio],
|
||||
pport_per_tc_congest_prio_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&pport->per_tc_congest_prio_counters
|
||||
[prio],
|
||||
pport_per_tc_congest_prio_stats_desc,
|
||||
i));
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static void mlx5e_grp_per_tc_prio_update_stats(struct mlx5e_priv *priv)
|
||||
@ -1728,35 +1735,33 @@ static int mlx5e_grp_per_prio_traffic_get_num_stats(void)
|
||||
return NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS * NUM_PPORT_PRIO;
|
||||
}
|
||||
|
||||
static int mlx5e_grp_per_prio_traffic_fill_strings(struct mlx5e_priv *priv,
|
||||
u8 *data,
|
||||
int idx)
|
||||
static void mlx5e_grp_per_prio_traffic_fill_strings(struct mlx5e_priv *priv,
|
||||
u8 **data)
|
||||
{
|
||||
int i, prio;
|
||||
|
||||
for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
|
||||
for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_per_prio_traffic_stats_desc[i].format, prio);
|
||||
ethtool_sprintf(data,
|
||||
pport_per_prio_traffic_stats_desc[i].format,
|
||||
prio);
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static int mlx5e_grp_per_prio_traffic_fill_stats(struct mlx5e_priv *priv,
|
||||
u64 *data,
|
||||
int idx)
|
||||
static void mlx5e_grp_per_prio_traffic_fill_stats(struct mlx5e_priv *priv,
|
||||
u64 **data)
|
||||
{
|
||||
int i, prio;
|
||||
|
||||
for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
|
||||
for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
|
||||
pport_per_prio_traffic_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport
|
||||
.per_prio_counters[prio],
|
||||
pport_per_prio_traffic_stats_desc, i));
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static const struct counter_desc pport_per_prio_pfc_stats_desc[] = {
|
||||
@ -1816,9 +1821,8 @@ static int mlx5e_grp_per_prio_pfc_get_num_stats(struct mlx5e_priv *priv)
|
||||
NUM_PPORT_PFC_STALL_COUNTERS(priv);
|
||||
}
|
||||
|
||||
static int mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv *priv,
|
||||
u8 *data,
|
||||
int idx)
|
||||
static void mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv *priv,
|
||||
u8 **data)
|
||||
{
|
||||
unsigned long pfc_combined;
|
||||
int i, prio;
|
||||
@ -1829,28 +1833,26 @@ static int mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv *priv,
|
||||
char pfc_string[ETH_GSTRING_LEN];
|
||||
|
||||
snprintf(pfc_string, sizeof(pfc_string), "prio%d", prio);
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_per_prio_pfc_stats_desc[i].format, pfc_string);
|
||||
ethtool_sprintf(data,
|
||||
pport_per_prio_pfc_stats_desc[i].format,
|
||||
pfc_string);
|
||||
}
|
||||
}
|
||||
|
||||
if (mlx5e_query_global_pause_combined(priv)) {
|
||||
for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_per_prio_pfc_stats_desc[i].format, "global");
|
||||
ethtool_sprintf(data,
|
||||
pport_per_prio_pfc_stats_desc[i].format,
|
||||
"global");
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN,
|
||||
pport_pfc_stall_stats_desc[i].format);
|
||||
|
||||
return idx;
|
||||
ethtool_puts(data, pport_pfc_stall_stats_desc[i].format);
|
||||
}
|
||||
|
||||
static int mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv *priv,
|
||||
u64 *data,
|
||||
int idx)
|
||||
static void mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv *priv,
|
||||
u64 **data)
|
||||
{
|
||||
unsigned long pfc_combined;
|
||||
int i, prio;
|
||||
@ -1858,25 +1860,30 @@ static int mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv *priv,
|
||||
pfc_combined = mlx5e_query_pfc_combined(priv);
|
||||
for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
|
||||
for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
|
||||
pport_per_prio_pfc_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport
|
||||
.per_prio_counters[prio],
|
||||
pport_per_prio_pfc_stats_desc, i));
|
||||
}
|
||||
}
|
||||
|
||||
if (mlx5e_query_global_pause_combined(priv)) {
|
||||
for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
|
||||
pport_per_prio_pfc_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport.per_prio_counters[0],
|
||||
pport_per_prio_pfc_stats_desc, i));
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
|
||||
pport_pfc_stall_stats_desc, i);
|
||||
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_BE(
|
||||
&priv->stats.pport.per_prio_counters[0],
|
||||
pport_pfc_stall_stats_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_prio)
|
||||
@ -1887,16 +1894,14 @@ static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_prio)
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_prio)
|
||||
{
|
||||
idx = mlx5e_grp_per_prio_traffic_fill_strings(priv, data, idx);
|
||||
idx = mlx5e_grp_per_prio_pfc_fill_strings(priv, data, idx);
|
||||
return idx;
|
||||
mlx5e_grp_per_prio_traffic_fill_strings(priv, data);
|
||||
mlx5e_grp_per_prio_pfc_fill_strings(priv, data);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_prio)
|
||||
{
|
||||
idx = mlx5e_grp_per_prio_traffic_fill_stats(priv, data, idx);
|
||||
idx = mlx5e_grp_per_prio_pfc_fill_stats(priv, data, idx);
|
||||
return idx;
|
||||
mlx5e_grp_per_prio_traffic_fill_stats(priv, data);
|
||||
mlx5e_grp_per_prio_pfc_fill_stats(priv, data);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_prio)
|
||||
@ -1944,12 +1949,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pme)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_PME_STATUS_STATS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_status_desc[i].format);
|
||||
ethtool_puts(data, mlx5e_pme_status_desc[i].format);
|
||||
|
||||
for (i = 0; i < NUM_PME_ERR_STATS; i++)
|
||||
strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_error_desc[i].format);
|
||||
|
||||
return idx;
|
||||
ethtool_puts(data, mlx5e_pme_error_desc[i].format);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pme)
|
||||
@ -1960,14 +1963,14 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pme)
|
||||
mlx5_get_pme_stats(priv->mdev, &pme_stats);
|
||||
|
||||
for (i = 0; i < NUM_PME_STATUS_STATS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.status_counters,
|
||||
mlx5e_pme_status_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(pme_stats.status_counters,
|
||||
mlx5e_pme_status_desc, i));
|
||||
|
||||
for (i = 0; i < NUM_PME_ERR_STATS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.error_counters,
|
||||
mlx5e_pme_error_desc, i);
|
||||
|
||||
return idx;
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(pme_stats.error_counters,
|
||||
mlx5e_pme_error_desc, i));
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pme) { return; }
|
||||
@ -1979,12 +1982,12 @@ static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(tls)
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(tls)
|
||||
{
|
||||
return idx + mlx5e_ktls_get_strings(priv, data + idx * ETH_GSTRING_LEN);
|
||||
mlx5e_ktls_get_strings(priv, data);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(tls)
|
||||
{
|
||||
return idx + mlx5e_ktls_get_stats(priv, data + idx);
|
||||
mlx5e_ktls_get_stats(priv, data);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(tls) { return; }
|
||||
@ -2264,10 +2267,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qos)
|
||||
|
||||
for (qid = 0; qid < max_qos_sqs; qid++)
|
||||
for (i = 0; i < NUM_QOS_SQ_STATS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
qos_sq_stats_desc[i].format, qid);
|
||||
|
||||
return idx;
|
||||
ethtool_sprintf(data, qos_sq_stats_desc[i].format, qid);
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos)
|
||||
@ -2284,10 +2284,10 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos)
|
||||
struct mlx5e_sq_stats *s = READ_ONCE(stats[qid]);
|
||||
|
||||
for (i = 0; i < NUM_QOS_SQ_STATS; i++)
|
||||
data[idx++] = MLX5E_READ_CTR64_CPU(s, qos_sq_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_CPU(s, qos_sq_stats_desc, i));
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qos) { return; }
|
||||
@ -2312,29 +2312,29 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ptp)
|
||||
int i, tc;
|
||||
|
||||
if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
|
||||
return idx;
|
||||
return;
|
||||
|
||||
for (i = 0; i < NUM_PTP_CH_STATS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
"%s", ptp_ch_stats_desc[i].format);
|
||||
ethtool_puts(data, ptp_ch_stats_desc[i].format);
|
||||
|
||||
if (priv->tx_ptp_opened) {
|
||||
for (tc = 0; tc < priv->max_opened_tc; tc++)
|
||||
for (i = 0; i < NUM_PTP_SQ_STATS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
ptp_sq_stats_desc[i].format, tc);
|
||||
ethtool_sprintf(data,
|
||||
ptp_sq_stats_desc[i].format,
|
||||
tc);
|
||||
|
||||
for (tc = 0; tc < priv->max_opened_tc; tc++)
|
||||
for (i = 0; i < NUM_PTP_CQ_STATS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
ptp_cq_stats_desc[i].format, tc);
|
||||
ethtool_sprintf(data,
|
||||
ptp_cq_stats_desc[i].format,
|
||||
tc);
|
||||
}
|
||||
if (priv->rx_ptp_opened) {
|
||||
for (i = 0; i < NUM_PTP_RQ_STATS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
ptp_rq_stats_desc[i].format, MLX5E_PTP_CHANNEL_IX);
|
||||
ethtool_sprintf(data, ptp_rq_stats_desc[i].format,
|
||||
MLX5E_PTP_CHANNEL_IX);
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ptp)
|
||||
@ -2342,33 +2342,35 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ptp)
|
||||
int i, tc;
|
||||
|
||||
if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
|
||||
return idx;
|
||||
return;
|
||||
|
||||
for (i = 0; i < NUM_PTP_CH_STATS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->ptp_stats.ch,
|
||||
ptp_ch_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(&priv->ptp_stats.ch,
|
||||
ptp_ch_stats_desc, i));
|
||||
|
||||
if (priv->tx_ptp_opened) {
|
||||
for (tc = 0; tc < priv->max_opened_tc; tc++)
|
||||
for (i = 0; i < NUM_PTP_SQ_STATS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->ptp_stats.sq[tc],
|
||||
ptp_sq_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
&priv->ptp_stats.sq[tc],
|
||||
ptp_sq_stats_desc, i));
|
||||
|
||||
for (tc = 0; tc < priv->max_opened_tc; tc++)
|
||||
for (i = 0; i < NUM_PTP_CQ_STATS; i++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->ptp_stats.cq[tc],
|
||||
ptp_cq_stats_desc, i);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
&priv->ptp_stats.cq[tc],
|
||||
ptp_cq_stats_desc, i));
|
||||
}
|
||||
if (priv->rx_ptp_opened) {
|
||||
for (i = 0; i < NUM_PTP_RQ_STATS; i++)
|
||||
data[idx++] =
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_CPU(&priv->ptp_stats.rq,
|
||||
ptp_rq_stats_desc, i);
|
||||
ptp_rq_stats_desc, i));
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(ptp) { return; }
|
||||
@ -2394,38 +2396,29 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels)
|
||||
|
||||
for (i = 0; i < max_nch; i++)
|
||||
for (j = 0; j < NUM_CH_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
ch_stats_desc[j].format, i);
|
||||
ethtool_sprintf(data, ch_stats_desc[j].format, i);
|
||||
|
||||
for (i = 0; i < max_nch; i++) {
|
||||
for (j = 0; j < NUM_RQ_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
rq_stats_desc[j].format, i);
|
||||
ethtool_sprintf(data, rq_stats_desc[j].format, i);
|
||||
for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
xskrq_stats_desc[j].format, i);
|
||||
ethtool_sprintf(data, xskrq_stats_desc[j].format, i);
|
||||
for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
rq_xdpsq_stats_desc[j].format, i);
|
||||
ethtool_sprintf(data, rq_xdpsq_stats_desc[j].format, i);
|
||||
}
|
||||
|
||||
for (tc = 0; tc < priv->max_opened_tc; tc++)
|
||||
for (i = 0; i < max_nch; i++)
|
||||
for (j = 0; j < NUM_SQ_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
sq_stats_desc[j].format,
|
||||
i + tc * max_nch);
|
||||
ethtool_sprintf(data, sq_stats_desc[j].format,
|
||||
i + tc * max_nch);
|
||||
|
||||
for (i = 0; i < max_nch; i++) {
|
||||
for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
xsksq_stats_desc[j].format, i);
|
||||
ethtool_sprintf(data, xsksq_stats_desc[j].format, i);
|
||||
for (j = 0; j < NUM_XDPSQ_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
xdpsq_stats_desc[j].format, i);
|
||||
ethtool_sprintf(data, xdpsq_stats_desc[j].format, i);
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels)
|
||||
@ -2436,44 +2429,50 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels)
|
||||
|
||||
for (i = 0; i < max_nch; i++)
|
||||
for (j = 0; j < NUM_CH_STATS; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->ch,
|
||||
ch_stats_desc, j);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
&priv->channel_stats[i]->ch,
|
||||
ch_stats_desc, j));
|
||||
|
||||
for (i = 0; i < max_nch; i++) {
|
||||
for (j = 0; j < NUM_RQ_STATS; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->rq,
|
||||
rq_stats_desc, j);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
&priv->channel_stats[i]->rq,
|
||||
rq_stats_desc, j));
|
||||
for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xskrq,
|
||||
xskrq_stats_desc, j);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
&priv->channel_stats[i]->xskrq,
|
||||
xskrq_stats_desc, j));
|
||||
for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->rq_xdpsq,
|
||||
rq_xdpsq_stats_desc, j);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
&priv->channel_stats[i]->rq_xdpsq,
|
||||
rq_xdpsq_stats_desc, j));
|
||||
}
|
||||
|
||||
for (tc = 0; tc < priv->max_opened_tc; tc++)
|
||||
for (i = 0; i < max_nch; i++)
|
||||
for (j = 0; j < NUM_SQ_STATS; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->sq[tc],
|
||||
sq_stats_desc, j);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data,
|
||||
MLX5E_READ_CTR64_CPU(
|
||||
&priv->channel_stats[i]->sq[tc],
|
||||
sq_stats_desc, j));
|
||||
|
||||
for (i = 0; i < max_nch; i++) {
|
||||
for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xsksq,
|
||||
xsksq_stats_desc, j);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
&priv->channel_stats[i]->xsksq,
|
||||
xsksq_stats_desc, j));
|
||||
for (j = 0; j < NUM_XDPSQ_STATS; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xdpsq,
|
||||
xdpsq_stats_desc, j);
|
||||
mlx5e_ethtool_put_stat(
|
||||
data, MLX5E_READ_CTR64_CPU(
|
||||
&priv->channel_stats[i]->xdpsq,
|
||||
xdpsq_stats_desc, j));
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(channels) { return; }
|
||||
|
@ -71,11 +71,13 @@ struct mlx5e_priv;
|
||||
struct mlx5e_stats_grp {
|
||||
u16 update_stats_mask;
|
||||
int (*get_num_stats)(struct mlx5e_priv *priv);
|
||||
int (*fill_strings)(struct mlx5e_priv *priv, u8 *data, int idx);
|
||||
int (*fill_stats)(struct mlx5e_priv *priv, u64 *data, int idx);
|
||||
void (*fill_strings)(struct mlx5e_priv *priv, u8 **data);
|
||||
void (*fill_stats)(struct mlx5e_priv *priv, u64 **data);
|
||||
void (*update_stats)(struct mlx5e_priv *priv);
|
||||
};
|
||||
|
||||
void mlx5e_ethtool_put_stat(u64 **data, u64 val);
|
||||
|
||||
typedef const struct mlx5e_stats_grp *const mlx5e_stats_grp_t;
|
||||
|
||||
#define MLX5E_STATS_GRP_OP(grp, name) mlx5e_stats_grp_ ## grp ## _ ## name
|
||||
@ -87,10 +89,10 @@ typedef const struct mlx5e_stats_grp *const mlx5e_stats_grp_t;
|
||||
void MLX5E_STATS_GRP_OP(grp, update_stats)(struct mlx5e_priv *priv)
|
||||
|
||||
#define MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(grp) \
|
||||
int MLX5E_STATS_GRP_OP(grp, fill_strings)(struct mlx5e_priv *priv, u8 *data, int idx)
|
||||
void MLX5E_STATS_GRP_OP(grp, fill_strings)(struct mlx5e_priv *priv, u8 **data)
|
||||
|
||||
#define MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(grp) \
|
||||
int MLX5E_STATS_GRP_OP(grp, fill_stats)(struct mlx5e_priv *priv, u64 *data, int idx)
|
||||
void MLX5E_STATS_GRP_OP(grp, fill_stats)(struct mlx5e_priv *priv, u64 **data)
|
||||
|
||||
#define MLX5E_STATS_GRP(grp) mlx5e_stats_grp_ ## grp
|
||||
|
||||
|
@ -835,8 +835,7 @@ static void mlx5e_hairpin_set_ttc_params(struct mlx5e_hairpin *hp,
|
||||
|
||||
memset(ttc_params, 0, sizeof(*ttc_params));
|
||||
|
||||
ttc_params->ns = mlx5_get_flow_namespace(hp->func_mdev,
|
||||
MLX5_FLOW_NAMESPACE_KERNEL);
|
||||
ttc_params->ns_type = MLX5_FLOW_NAMESPACE_KERNEL;
|
||||
for (tt = 0; tt < MLX5_NUM_TT; tt++) {
|
||||
ttc_params->dests[tt].type = MLX5_FLOW_DESTINATION_TYPE_TIR;
|
||||
ttc_params->dests[tt].tir_num =
|
||||
|
@ -688,6 +688,12 @@ static int create_async_eqs(struct mlx5_core_dev *dev)
|
||||
if (err)
|
||||
goto err2;
|
||||
|
||||
/* Skip page eq creation when the device does not request for page requests */
|
||||
if (MLX5_CAP_GEN(dev, page_request_disable)) {
|
||||
mlx5_core_dbg(dev, "Skip page EQ creation\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
param = (struct mlx5_eq_param) {
|
||||
.irq = table->ctrl_irq,
|
||||
.nent = /* TODO: sriov max_vf + */ 1,
|
||||
@ -716,7 +722,8 @@ static void destroy_async_eqs(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_eq_table *table = dev->priv.eq_table;
|
||||
|
||||
cleanup_async_eq(dev, &table->pages_eq, "pages");
|
||||
if (!MLX5_CAP_GEN(dev, page_request_disable))
|
||||
cleanup_async_eq(dev, &table->pages_eq, "pages");
|
||||
cleanup_async_eq(dev, &table->async_eq, "async");
|
||||
mlx5_cmd_allowed_opcode(dev, MLX5_CMD_OP_DESTROY_EQ);
|
||||
mlx5_cmd_use_polling(dev);
|
||||
|
@ -283,7 +283,7 @@ int mlx5_query_hca_caps(struct mlx5_core_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlx5_cmd_init_hca(struct mlx5_core_dev *dev, uint32_t *sw_owner_id)
|
||||
int mlx5_cmd_init_hca(struct mlx5_core_dev *dev, u32 *sw_owner_id)
|
||||
{
|
||||
u32 in[MLX5_ST_SZ_DW(init_hca_in)] = {};
|
||||
int i;
|
||||
|
@ -449,13 +449,11 @@ static void set_tt_map(struct mlx5_lag_port_sel *port_sel,
|
||||
static void mlx5_lag_set_inner_ttc_params(struct mlx5_lag *ldev,
|
||||
struct ttc_params *ttc_params)
|
||||
{
|
||||
struct mlx5_core_dev *dev = ldev->pf[MLX5_LAG_P1].dev;
|
||||
struct mlx5_lag_port_sel *port_sel = &ldev->port_sel;
|
||||
struct mlx5_flow_table_attr *ft_attr;
|
||||
int tt;
|
||||
|
||||
ttc_params->ns = mlx5_get_flow_namespace(dev,
|
||||
MLX5_FLOW_NAMESPACE_PORT_SEL);
|
||||
ttc_params->ns_type = MLX5_FLOW_NAMESPACE_PORT_SEL;
|
||||
ft_attr = &ttc_params->ft_attr;
|
||||
ft_attr->level = MLX5_LAG_FT_LEVEL_INNER_TTC;
|
||||
|
||||
@ -470,13 +468,11 @@ static void mlx5_lag_set_inner_ttc_params(struct mlx5_lag *ldev,
|
||||
static void mlx5_lag_set_outer_ttc_params(struct mlx5_lag *ldev,
|
||||
struct ttc_params *ttc_params)
|
||||
{
|
||||
struct mlx5_core_dev *dev = ldev->pf[MLX5_LAG_P1].dev;
|
||||
struct mlx5_lag_port_sel *port_sel = &ldev->port_sel;
|
||||
struct mlx5_flow_table_attr *ft_attr;
|
||||
int tt;
|
||||
|
||||
ttc_params->ns = mlx5_get_flow_namespace(dev,
|
||||
MLX5_FLOW_NAMESPACE_PORT_SEL);
|
||||
ttc_params->ns_type = MLX5_FLOW_NAMESPACE_PORT_SEL;
|
||||
ft_attr = &ttc_params->ft_attr;
|
||||
ft_attr->level = MLX5_LAG_FT_LEVEL_TTC;
|
||||
|
||||
|
@ -9,21 +9,24 @@
|
||||
#include "mlx5_core.h"
|
||||
#include "lib/fs_ttc.h"
|
||||
|
||||
#define MLX5_TTC_NUM_GROUPS 3
|
||||
#define MLX5_TTC_GROUP1_SIZE (BIT(3) + MLX5_NUM_TUNNEL_TT)
|
||||
#define MLX5_TTC_GROUP2_SIZE BIT(1)
|
||||
#define MLX5_TTC_GROUP3_SIZE BIT(0)
|
||||
#define MLX5_TTC_TABLE_SIZE (MLX5_TTC_GROUP1_SIZE +\
|
||||
MLX5_TTC_GROUP2_SIZE +\
|
||||
MLX5_TTC_GROUP3_SIZE)
|
||||
#define MLX5_TTC_MAX_NUM_GROUPS 4
|
||||
#define MLX5_TTC_GROUP_TCPUDP_SIZE (MLX5_TT_IPV6_UDP + 1)
|
||||
|
||||
#define MLX5_INNER_TTC_NUM_GROUPS 3
|
||||
#define MLX5_INNER_TTC_GROUP1_SIZE BIT(3)
|
||||
#define MLX5_INNER_TTC_GROUP2_SIZE BIT(1)
|
||||
#define MLX5_INNER_TTC_GROUP3_SIZE BIT(0)
|
||||
#define MLX5_INNER_TTC_TABLE_SIZE (MLX5_INNER_TTC_GROUP1_SIZE +\
|
||||
MLX5_INNER_TTC_GROUP2_SIZE +\
|
||||
MLX5_INNER_TTC_GROUP3_SIZE)
|
||||
struct mlx5_fs_ttc_groups {
|
||||
bool use_l4_type;
|
||||
int num_groups;
|
||||
int group_size[MLX5_TTC_MAX_NUM_GROUPS];
|
||||
};
|
||||
|
||||
static int mlx5_fs_ttc_table_size(const struct mlx5_fs_ttc_groups *groups)
|
||||
{
|
||||
int i, sz = 0;
|
||||
|
||||
for (i = 0; i < groups->num_groups; i++)
|
||||
sz += groups->group_size[i];
|
||||
|
||||
return sz;
|
||||
}
|
||||
|
||||
/* L3/L4 traffic type classifier */
|
||||
struct mlx5_ttc_table {
|
||||
@ -138,6 +141,53 @@ static struct mlx5_etype_proto ttc_tunnel_rules[] = {
|
||||
|
||||
};
|
||||
|
||||
enum TTC_GROUP_TYPE {
|
||||
TTC_GROUPS_DEFAULT = 0,
|
||||
TTC_GROUPS_USE_L4_TYPE = 1,
|
||||
};
|
||||
|
||||
static const struct mlx5_fs_ttc_groups ttc_groups[] = {
|
||||
[TTC_GROUPS_DEFAULT] = {
|
||||
.num_groups = 3,
|
||||
.group_size = {
|
||||
BIT(3) + MLX5_NUM_TUNNEL_TT,
|
||||
BIT(1),
|
||||
BIT(0),
|
||||
},
|
||||
},
|
||||
[TTC_GROUPS_USE_L4_TYPE] = {
|
||||
.use_l4_type = true,
|
||||
.num_groups = 4,
|
||||
.group_size = {
|
||||
MLX5_TTC_GROUP_TCPUDP_SIZE,
|
||||
BIT(3) + MLX5_NUM_TUNNEL_TT - MLX5_TTC_GROUP_TCPUDP_SIZE,
|
||||
BIT(1),
|
||||
BIT(0),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct mlx5_fs_ttc_groups inner_ttc_groups[] = {
|
||||
[TTC_GROUPS_DEFAULT] = {
|
||||
.num_groups = 3,
|
||||
.group_size = {
|
||||
BIT(3),
|
||||
BIT(1),
|
||||
BIT(0),
|
||||
},
|
||||
},
|
||||
[TTC_GROUPS_USE_L4_TYPE] = {
|
||||
.use_l4_type = true,
|
||||
.num_groups = 4,
|
||||
.group_size = {
|
||||
MLX5_TTC_GROUP_TCPUDP_SIZE,
|
||||
BIT(3) - MLX5_TTC_GROUP_TCPUDP_SIZE,
|
||||
BIT(1),
|
||||
BIT(0),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
u8 mlx5_get_proto_by_tunnel_type(enum mlx5_tunnel_types tt)
|
||||
{
|
||||
return ttc_tunnel_rules[tt].proto;
|
||||
@ -188,9 +238,29 @@ static u8 mlx5_etype_to_ipv(u16 ethertype)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5_fs_ttc_set_match_proto(void *headers_c, void *headers_v,
|
||||
u8 proto, bool use_l4_type)
|
||||
{
|
||||
int l4_type;
|
||||
|
||||
if (use_l4_type && (proto == IPPROTO_TCP || proto == IPPROTO_UDP)) {
|
||||
if (proto == IPPROTO_TCP)
|
||||
l4_type = MLX5_PACKET_L4_TYPE_TCP;
|
||||
else
|
||||
l4_type = MLX5_PACKET_L4_TYPE_UDP;
|
||||
|
||||
MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, l4_type);
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_v, l4_type, l4_type);
|
||||
} else {
|
||||
MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, ip_protocol);
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol, proto);
|
||||
}
|
||||
}
|
||||
|
||||
static struct mlx5_flow_handle *
|
||||
mlx5_generate_ttc_rule(struct mlx5_core_dev *dev, struct mlx5_flow_table *ft,
|
||||
struct mlx5_flow_destination *dest, u16 etype, u8 proto)
|
||||
struct mlx5_flow_destination *dest, u16 etype, u8 proto,
|
||||
bool use_l4_type)
|
||||
{
|
||||
int match_ipv_outer =
|
||||
MLX5_CAP_FLOWTABLE_NIC_RX(dev,
|
||||
@ -207,8 +277,13 @@ mlx5_generate_ttc_rule(struct mlx5_core_dev *dev, struct mlx5_flow_table *ft,
|
||||
|
||||
if (proto) {
|
||||
spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
|
||||
MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, outer_headers.ip_protocol);
|
||||
MLX5_SET(fte_match_param, spec->match_value, outer_headers.ip_protocol, proto);
|
||||
mlx5_fs_ttc_set_match_proto(MLX5_ADDR_OF(fte_match_param,
|
||||
spec->match_criteria,
|
||||
outer_headers),
|
||||
MLX5_ADDR_OF(fte_match_param,
|
||||
spec->match_value,
|
||||
outer_headers),
|
||||
proto, use_l4_type);
|
||||
}
|
||||
|
||||
ipv = mlx5_etype_to_ipv(etype);
|
||||
@ -234,7 +309,8 @@ mlx5_generate_ttc_rule(struct mlx5_core_dev *dev, struct mlx5_flow_table *ft,
|
||||
|
||||
static int mlx5_generate_ttc_table_rules(struct mlx5_core_dev *dev,
|
||||
struct ttc_params *params,
|
||||
struct mlx5_ttc_table *ttc)
|
||||
struct mlx5_ttc_table *ttc,
|
||||
bool use_l4_type)
|
||||
{
|
||||
struct mlx5_flow_handle **trules;
|
||||
struct mlx5_ttc_rule *rules;
|
||||
@ -251,7 +327,8 @@ static int mlx5_generate_ttc_table_rules(struct mlx5_core_dev *dev,
|
||||
continue;
|
||||
rule->rule = mlx5_generate_ttc_rule(dev, ft, ¶ms->dests[tt],
|
||||
ttc_rules[tt].etype,
|
||||
ttc_rules[tt].proto);
|
||||
ttc_rules[tt].proto,
|
||||
use_l4_type);
|
||||
if (IS_ERR(rule->rule)) {
|
||||
err = PTR_ERR(rule->rule);
|
||||
rule->rule = NULL;
|
||||
@ -273,7 +350,8 @@ static int mlx5_generate_ttc_table_rules(struct mlx5_core_dev *dev,
|
||||
trules[tt] = mlx5_generate_ttc_rule(dev, ft,
|
||||
¶ms->tunnel_dests[tt],
|
||||
ttc_tunnel_rules[tt].etype,
|
||||
ttc_tunnel_rules[tt].proto);
|
||||
ttc_tunnel_rules[tt].proto,
|
||||
use_l4_type);
|
||||
if (IS_ERR(trules[tt])) {
|
||||
err = PTR_ERR(trules[tt]);
|
||||
trules[tt] = NULL;
|
||||
@ -289,7 +367,8 @@ del_rules:
|
||||
}
|
||||
|
||||
static int mlx5_create_ttc_table_groups(struct mlx5_ttc_table *ttc,
|
||||
bool use_ipv)
|
||||
bool use_ipv,
|
||||
const struct mlx5_fs_ttc_groups *groups)
|
||||
{
|
||||
int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in);
|
||||
int ix = 0;
|
||||
@ -297,7 +376,7 @@ static int mlx5_create_ttc_table_groups(struct mlx5_ttc_table *ttc,
|
||||
int err;
|
||||
u8 *mc;
|
||||
|
||||
ttc->g = kcalloc(MLX5_TTC_NUM_GROUPS, sizeof(*ttc->g), GFP_KERNEL);
|
||||
ttc->g = kcalloc(groups->num_groups, sizeof(*ttc->g), GFP_KERNEL);
|
||||
if (!ttc->g)
|
||||
return -ENOMEM;
|
||||
in = kvzalloc(inlen, GFP_KERNEL);
|
||||
@ -307,16 +386,31 @@ static int mlx5_create_ttc_table_groups(struct mlx5_ttc_table *ttc,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* L4 Group */
|
||||
mc = MLX5_ADDR_OF(create_flow_group_in, in, match_criteria);
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, outer_headers.ip_protocol);
|
||||
if (use_ipv)
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, outer_headers.ip_version);
|
||||
else
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, outer_headers.ethertype);
|
||||
MLX5_SET_CFG(in, match_criteria_enable, MLX5_MATCH_OUTER_HEADERS);
|
||||
|
||||
/* TCP UDP group */
|
||||
if (groups->use_l4_type) {
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, outer_headers.l4_type);
|
||||
MLX5_SET_CFG(in, start_flow_index, ix);
|
||||
ix += groups->group_size[ttc->num_groups];
|
||||
MLX5_SET_CFG(in, end_flow_index, ix - 1);
|
||||
ttc->g[ttc->num_groups] = mlx5_create_flow_group(ttc->t, in);
|
||||
if (IS_ERR(ttc->g[ttc->num_groups]))
|
||||
goto err;
|
||||
ttc->num_groups++;
|
||||
|
||||
MLX5_SET(fte_match_param, mc, outer_headers.l4_type, 0);
|
||||
}
|
||||
|
||||
/* L4 Group */
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, outer_headers.ip_protocol);
|
||||
MLX5_SET_CFG(in, start_flow_index, ix);
|
||||
ix += MLX5_TTC_GROUP1_SIZE;
|
||||
ix += groups->group_size[ttc->num_groups];
|
||||
MLX5_SET_CFG(in, end_flow_index, ix - 1);
|
||||
ttc->g[ttc->num_groups] = mlx5_create_flow_group(ttc->t, in);
|
||||
if (IS_ERR(ttc->g[ttc->num_groups]))
|
||||
@ -326,7 +420,7 @@ static int mlx5_create_ttc_table_groups(struct mlx5_ttc_table *ttc,
|
||||
/* L3 Group */
|
||||
MLX5_SET(fte_match_param, mc, outer_headers.ip_protocol, 0);
|
||||
MLX5_SET_CFG(in, start_flow_index, ix);
|
||||
ix += MLX5_TTC_GROUP2_SIZE;
|
||||
ix += groups->group_size[ttc->num_groups];
|
||||
MLX5_SET_CFG(in, end_flow_index, ix - 1);
|
||||
ttc->g[ttc->num_groups] = mlx5_create_flow_group(ttc->t, in);
|
||||
if (IS_ERR(ttc->g[ttc->num_groups]))
|
||||
@ -336,7 +430,7 @@ static int mlx5_create_ttc_table_groups(struct mlx5_ttc_table *ttc,
|
||||
/* Any Group */
|
||||
memset(in, 0, inlen);
|
||||
MLX5_SET_CFG(in, start_flow_index, ix);
|
||||
ix += MLX5_TTC_GROUP3_SIZE;
|
||||
ix += groups->group_size[ttc->num_groups];
|
||||
MLX5_SET_CFG(in, end_flow_index, ix - 1);
|
||||
ttc->g[ttc->num_groups] = mlx5_create_flow_group(ttc->t, in);
|
||||
if (IS_ERR(ttc->g[ttc->num_groups]))
|
||||
@ -358,7 +452,7 @@ static struct mlx5_flow_handle *
|
||||
mlx5_generate_inner_ttc_rule(struct mlx5_core_dev *dev,
|
||||
struct mlx5_flow_table *ft,
|
||||
struct mlx5_flow_destination *dest,
|
||||
u16 etype, u8 proto)
|
||||
u16 etype, u8 proto, bool use_l4_type)
|
||||
{
|
||||
MLX5_DECLARE_FLOW_ACT(flow_act);
|
||||
struct mlx5_flow_handle *rule;
|
||||
@ -379,8 +473,13 @@ mlx5_generate_inner_ttc_rule(struct mlx5_core_dev *dev,
|
||||
|
||||
if (proto) {
|
||||
spec->match_criteria_enable = MLX5_MATCH_INNER_HEADERS;
|
||||
MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, inner_headers.ip_protocol);
|
||||
MLX5_SET(fte_match_param, spec->match_value, inner_headers.ip_protocol, proto);
|
||||
mlx5_fs_ttc_set_match_proto(MLX5_ADDR_OF(fte_match_param,
|
||||
spec->match_criteria,
|
||||
inner_headers),
|
||||
MLX5_ADDR_OF(fte_match_param,
|
||||
spec->match_value,
|
||||
inner_headers),
|
||||
proto, use_l4_type);
|
||||
}
|
||||
|
||||
rule = mlx5_add_flow_rules(ft, spec, &flow_act, dest, 1);
|
||||
@ -395,7 +494,8 @@ mlx5_generate_inner_ttc_rule(struct mlx5_core_dev *dev,
|
||||
|
||||
static int mlx5_generate_inner_ttc_table_rules(struct mlx5_core_dev *dev,
|
||||
struct ttc_params *params,
|
||||
struct mlx5_ttc_table *ttc)
|
||||
struct mlx5_ttc_table *ttc,
|
||||
bool use_l4_type)
|
||||
{
|
||||
struct mlx5_ttc_rule *rules;
|
||||
struct mlx5_flow_table *ft;
|
||||
@ -413,7 +513,8 @@ static int mlx5_generate_inner_ttc_table_rules(struct mlx5_core_dev *dev,
|
||||
rule->rule = mlx5_generate_inner_ttc_rule(dev, ft,
|
||||
¶ms->dests[tt],
|
||||
ttc_rules[tt].etype,
|
||||
ttc_rules[tt].proto);
|
||||
ttc_rules[tt].proto,
|
||||
use_l4_type);
|
||||
if (IS_ERR(rule->rule)) {
|
||||
err = PTR_ERR(rule->rule);
|
||||
rule->rule = NULL;
|
||||
@ -430,7 +531,8 @@ del_rules:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int mlx5_create_inner_ttc_table_groups(struct mlx5_ttc_table *ttc)
|
||||
static int mlx5_create_inner_ttc_table_groups(struct mlx5_ttc_table *ttc,
|
||||
const struct mlx5_fs_ttc_groups *groups)
|
||||
{
|
||||
int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in);
|
||||
int ix = 0;
|
||||
@ -438,8 +540,7 @@ static int mlx5_create_inner_ttc_table_groups(struct mlx5_ttc_table *ttc)
|
||||
int err;
|
||||
u8 *mc;
|
||||
|
||||
ttc->g = kcalloc(MLX5_INNER_TTC_NUM_GROUPS, sizeof(*ttc->g),
|
||||
GFP_KERNEL);
|
||||
ttc->g = kcalloc(groups->num_groups, sizeof(*ttc->g), GFP_KERNEL);
|
||||
if (!ttc->g)
|
||||
return -ENOMEM;
|
||||
in = kvzalloc(inlen, GFP_KERNEL);
|
||||
@ -449,13 +550,28 @@ static int mlx5_create_inner_ttc_table_groups(struct mlx5_ttc_table *ttc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* L4 Group */
|
||||
mc = MLX5_ADDR_OF(create_flow_group_in, in, match_criteria);
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, inner_headers.ip_protocol);
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, inner_headers.ip_version);
|
||||
MLX5_SET_CFG(in, match_criteria_enable, MLX5_MATCH_INNER_HEADERS);
|
||||
|
||||
/* TCP UDP group */
|
||||
if (groups->use_l4_type) {
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, inner_headers.l4_type);
|
||||
MLX5_SET_CFG(in, start_flow_index, ix);
|
||||
ix += groups->group_size[ttc->num_groups];
|
||||
MLX5_SET_CFG(in, end_flow_index, ix - 1);
|
||||
ttc->g[ttc->num_groups] = mlx5_create_flow_group(ttc->t, in);
|
||||
if (IS_ERR(ttc->g[ttc->num_groups]))
|
||||
goto err;
|
||||
ttc->num_groups++;
|
||||
|
||||
MLX5_SET(fte_match_param, mc, inner_headers.l4_type, 0);
|
||||
}
|
||||
|
||||
/* L4 Group */
|
||||
MLX5_SET_TO_ONES(fte_match_param, mc, inner_headers.ip_protocol);
|
||||
MLX5_SET_CFG(in, start_flow_index, ix);
|
||||
ix += MLX5_INNER_TTC_GROUP1_SIZE;
|
||||
ix += groups->group_size[ttc->num_groups];
|
||||
MLX5_SET_CFG(in, end_flow_index, ix - 1);
|
||||
ttc->g[ttc->num_groups] = mlx5_create_flow_group(ttc->t, in);
|
||||
if (IS_ERR(ttc->g[ttc->num_groups]))
|
||||
@ -465,7 +581,7 @@ static int mlx5_create_inner_ttc_table_groups(struct mlx5_ttc_table *ttc)
|
||||
/* L3 Group */
|
||||
MLX5_SET(fte_match_param, mc, inner_headers.ip_protocol, 0);
|
||||
MLX5_SET_CFG(in, start_flow_index, ix);
|
||||
ix += MLX5_INNER_TTC_GROUP2_SIZE;
|
||||
ix += groups->group_size[ttc->num_groups];
|
||||
MLX5_SET_CFG(in, end_flow_index, ix - 1);
|
||||
ttc->g[ttc->num_groups] = mlx5_create_flow_group(ttc->t, in);
|
||||
if (IS_ERR(ttc->g[ttc->num_groups]))
|
||||
@ -475,7 +591,7 @@ static int mlx5_create_inner_ttc_table_groups(struct mlx5_ttc_table *ttc)
|
||||
/* Any Group */
|
||||
memset(in, 0, inlen);
|
||||
MLX5_SET_CFG(in, start_flow_index, ix);
|
||||
ix += MLX5_INNER_TTC_GROUP3_SIZE;
|
||||
ix += groups->group_size[ttc->num_groups];
|
||||
MLX5_SET_CFG(in, end_flow_index, ix - 1);
|
||||
ttc->g[ttc->num_groups] = mlx5_create_flow_group(ttc->t, in);
|
||||
if (IS_ERR(ttc->g[ttc->num_groups]))
|
||||
@ -496,27 +612,47 @@ err:
|
||||
struct mlx5_ttc_table *mlx5_create_inner_ttc_table(struct mlx5_core_dev *dev,
|
||||
struct ttc_params *params)
|
||||
{
|
||||
const struct mlx5_fs_ttc_groups *groups;
|
||||
struct mlx5_flow_namespace *ns;
|
||||
struct mlx5_ttc_table *ttc;
|
||||
bool use_l4_type;
|
||||
int err;
|
||||
|
||||
ttc = kvzalloc(sizeof(*ttc), GFP_KERNEL);
|
||||
if (!ttc)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
switch (params->ns_type) {
|
||||
case MLX5_FLOW_NAMESPACE_PORT_SEL:
|
||||
use_l4_type = MLX5_CAP_GEN_2(dev, pcc_ifa2) &&
|
||||
MLX5_CAP_PORT_SELECTION_FT_FIELD_SUPPORT_2(dev, inner_l4_type);
|
||||
break;
|
||||
case MLX5_FLOW_NAMESPACE_KERNEL:
|
||||
use_l4_type = MLX5_CAP_GEN_2(dev, pcc_ifa2) &&
|
||||
MLX5_CAP_NIC_RX_FT_FIELD_SUPPORT_2(dev, inner_l4_type);
|
||||
break;
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
ns = mlx5_get_flow_namespace(dev, params->ns_type);
|
||||
groups = use_l4_type ? &inner_ttc_groups[TTC_GROUPS_USE_L4_TYPE] :
|
||||
&inner_ttc_groups[TTC_GROUPS_DEFAULT];
|
||||
|
||||
WARN_ON_ONCE(params->ft_attr.max_fte);
|
||||
params->ft_attr.max_fte = MLX5_INNER_TTC_TABLE_SIZE;
|
||||
ttc->t = mlx5_create_flow_table(params->ns, ¶ms->ft_attr);
|
||||
params->ft_attr.max_fte = mlx5_fs_ttc_table_size(groups);
|
||||
ttc->t = mlx5_create_flow_table(ns, ¶ms->ft_attr);
|
||||
if (IS_ERR(ttc->t)) {
|
||||
err = PTR_ERR(ttc->t);
|
||||
kvfree(ttc);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
err = mlx5_create_inner_ttc_table_groups(ttc);
|
||||
err = mlx5_create_inner_ttc_table_groups(ttc, groups);
|
||||
if (err)
|
||||
goto destroy_ft;
|
||||
|
||||
err = mlx5_generate_inner_ttc_table_rules(dev, params, ttc);
|
||||
err = mlx5_generate_inner_ttc_table_rules(dev, params, ttc, use_l4_type);
|
||||
if (err)
|
||||
goto destroy_ft;
|
||||
|
||||
@ -549,27 +685,47 @@ struct mlx5_ttc_table *mlx5_create_ttc_table(struct mlx5_core_dev *dev,
|
||||
bool match_ipv_outer =
|
||||
MLX5_CAP_FLOWTABLE_NIC_RX(dev,
|
||||
ft_field_support.outer_ip_version);
|
||||
const struct mlx5_fs_ttc_groups *groups;
|
||||
struct mlx5_flow_namespace *ns;
|
||||
struct mlx5_ttc_table *ttc;
|
||||
bool use_l4_type;
|
||||
int err;
|
||||
|
||||
ttc = kvzalloc(sizeof(*ttc), GFP_KERNEL);
|
||||
if (!ttc)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
switch (params->ns_type) {
|
||||
case MLX5_FLOW_NAMESPACE_PORT_SEL:
|
||||
use_l4_type = MLX5_CAP_GEN_2(dev, pcc_ifa2) &&
|
||||
MLX5_CAP_PORT_SELECTION_FT_FIELD_SUPPORT_2(dev, outer_l4_type);
|
||||
break;
|
||||
case MLX5_FLOW_NAMESPACE_KERNEL:
|
||||
use_l4_type = MLX5_CAP_GEN_2(dev, pcc_ifa2) &&
|
||||
MLX5_CAP_NIC_RX_FT_FIELD_SUPPORT_2(dev, outer_l4_type);
|
||||
break;
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
ns = mlx5_get_flow_namespace(dev, params->ns_type);
|
||||
groups = use_l4_type ? &ttc_groups[TTC_GROUPS_USE_L4_TYPE] :
|
||||
&ttc_groups[TTC_GROUPS_DEFAULT];
|
||||
|
||||
WARN_ON_ONCE(params->ft_attr.max_fte);
|
||||
params->ft_attr.max_fte = MLX5_TTC_TABLE_SIZE;
|
||||
ttc->t = mlx5_create_flow_table(params->ns, ¶ms->ft_attr);
|
||||
params->ft_attr.max_fte = mlx5_fs_ttc_table_size(groups);
|
||||
ttc->t = mlx5_create_flow_table(ns, ¶ms->ft_attr);
|
||||
if (IS_ERR(ttc->t)) {
|
||||
err = PTR_ERR(ttc->t);
|
||||
kvfree(ttc);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
err = mlx5_create_ttc_table_groups(ttc, match_ipv_outer);
|
||||
err = mlx5_create_ttc_table_groups(ttc, match_ipv_outer, groups);
|
||||
if (err)
|
||||
goto destroy_ft;
|
||||
|
||||
err = mlx5_generate_ttc_table_rules(dev, params, ttc);
|
||||
err = mlx5_generate_ttc_table_rules(dev, params, ttc, use_l4_type);
|
||||
if (err)
|
||||
goto destroy_ft;
|
||||
|
||||
|
@ -40,7 +40,7 @@ struct mlx5_ttc_rule {
|
||||
struct mlx5_ttc_table;
|
||||
|
||||
struct ttc_params {
|
||||
struct mlx5_flow_namespace *ns;
|
||||
enum mlx5_flow_namespace_type ns_type;
|
||||
struct mlx5_flow_table_attr ft_attr;
|
||||
struct mlx5_flow_destination dests[MLX5_NUM_TT];
|
||||
DECLARE_BITMAP(ignore_dests, MLX5_NUM_TT);
|
||||
|
@ -205,7 +205,7 @@ int mlx5_cmd_enable(struct mlx5_core_dev *dev);
|
||||
void mlx5_cmd_disable(struct mlx5_core_dev *dev);
|
||||
void mlx5_cmd_set_state(struct mlx5_core_dev *dev,
|
||||
enum mlx5_cmdif_state cmdif_state);
|
||||
int mlx5_cmd_init_hca(struct mlx5_core_dev *dev, uint32_t *sw_owner_id);
|
||||
int mlx5_cmd_init_hca(struct mlx5_core_dev *dev, u32 *sw_owner_id);
|
||||
int mlx5_cmd_teardown_hca(struct mlx5_core_dev *dev);
|
||||
int mlx5_cmd_force_teardown_hca(struct mlx5_core_dev *dev);
|
||||
int mlx5_cmd_fast_teardown_hca(struct mlx5_core_dev *dev);
|
||||
|
@ -660,6 +660,9 @@ int mlx5_satisfy_startup_pages(struct mlx5_core_dev *dev, int boot)
|
||||
mlx5_core_dbg(dev, "requested %d %s pages for func_id 0x%x\n",
|
||||
npages, boot ? "boot" : "init", func_id);
|
||||
|
||||
if (!npages)
|
||||
return 0;
|
||||
|
||||
return give_pages(dev, func_id, npages, 0, mlx5_core_is_ecpf(dev));
|
||||
}
|
||||
|
||||
|
@ -1883,7 +1883,7 @@ dr_ste_v0_build_tnl_gtpu_flex_parser_1_init(struct mlx5dr_ste_build *sb,
|
||||
|
||||
static int dr_ste_v0_build_tnl_header_0_1_tag(struct mlx5dr_match_param *value,
|
||||
struct mlx5dr_ste_build *sb,
|
||||
uint8_t *tag)
|
||||
u8 *tag)
|
||||
{
|
||||
struct mlx5dr_match_misc5 *misc5 = &value->misc5;
|
||||
|
||||
|
@ -1897,7 +1897,7 @@ void dr_ste_v1_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb,
|
||||
|
||||
static int dr_ste_v1_build_tnl_header_0_1_tag(struct mlx5dr_match_param *value,
|
||||
struct mlx5dr_ste_build *sb,
|
||||
uint8_t *tag)
|
||||
u8 *tag)
|
||||
{
|
||||
struct mlx5dr_match_misc5 *misc5 = &value->misc5;
|
||||
|
||||
@ -2129,7 +2129,7 @@ dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_init(struct mlx5dr_ste_build *sb,
|
||||
static int
|
||||
dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_tag(struct mlx5dr_match_param *value,
|
||||
struct mlx5dr_ste_build *sb,
|
||||
uint8_t *tag)
|
||||
u8 *tag)
|
||||
{
|
||||
u8 parser_id = sb->caps->flex_parser_id_geneve_tlv_option_0;
|
||||
struct mlx5dr_match_misc *misc = &value->misc;
|
||||
|
@ -68,7 +68,7 @@
|
||||
#define MLX5_UN_SZ_BYTES(typ) (sizeof(union mlx5_ifc_##typ##_bits) / 8)
|
||||
#define MLX5_UN_SZ_DW(typ) (sizeof(union mlx5_ifc_##typ##_bits) / 32)
|
||||
#define MLX5_BYTE_OFF(typ, fld) (__mlx5_bit_off(typ, fld) / 8)
|
||||
#define MLX5_ADDR_OF(typ, p, fld) ((void *)((uint8_t *)(p) + MLX5_BYTE_OFF(typ, fld)))
|
||||
#define MLX5_ADDR_OF(typ, p, fld) ((void *)((u8 *)(p) + MLX5_BYTE_OFF(typ, fld)))
|
||||
|
||||
/* insert a value to a struct */
|
||||
#define MLX5_SET(typ, p, fld, v) do { \
|
||||
@ -1336,6 +1336,9 @@ enum mlx5_qcam_feature_groups {
|
||||
#define MLX5_CAP_ESW_FT_FIELD_SUPPORT_2(mdev, cap) \
|
||||
MLX5_CAP_ESW_FLOWTABLE(mdev, ft_field_support_2_esw_fdb.cap)
|
||||
|
||||
#define MLX5_CAP_NIC_RX_FT_FIELD_SUPPORT_2(mdev, cap) \
|
||||
MLX5_CAP_FLOWTABLE(mdev, ft_field_support_2_nic_receive.cap)
|
||||
|
||||
#define MLX5_CAP_ESW(mdev, cap) \
|
||||
MLX5_GET(e_switch_cap, \
|
||||
mdev->caps.hca[MLX5_CAP_ESWITCH]->cur, cap)
|
||||
@ -1359,6 +1362,9 @@ enum mlx5_qcam_feature_groups {
|
||||
#define MLX5_CAP_FLOWTABLE_PORT_SELECTION(mdev, cap) \
|
||||
MLX5_CAP_PORT_SELECTION(mdev, flow_table_properties_port_selection.cap)
|
||||
|
||||
#define MLX5_CAP_PORT_SELECTION_FT_FIELD_SUPPORT_2(mdev, cap) \
|
||||
MLX5_CAP_PORT_SELECTION(mdev, ft_field_support_2_port_selection.cap)
|
||||
|
||||
#define MLX5_CAP_ODP(mdev, cap)\
|
||||
MLX5_GET(odp_cap, mdev->caps.hca[MLX5_CAP_ODP]->cur, cap)
|
||||
|
||||
|
@ -416,7 +416,10 @@ struct mlx5_ifc_flow_table_fields_supported_bits {
|
||||
|
||||
/* Table 2170 - Flow Table Fields Supported 2 Format */
|
||||
struct mlx5_ifc_flow_table_fields_supported_2_bits {
|
||||
u8 reserved_at_0[0xe];
|
||||
u8 reserved_at_0[0x2];
|
||||
u8 inner_l4_type[0x1];
|
||||
u8 outer_l4_type[0x1];
|
||||
u8 reserved_at_4[0xa];
|
||||
u8 bth_opcode[0x1];
|
||||
u8 reserved_at_f[0x1];
|
||||
u8 tunnel_header_0_1[0x1];
|
||||
@ -525,6 +528,12 @@ union mlx5_ifc_ipv6_layout_ipv4_layout_auto_bits {
|
||||
u8 reserved_at_0[0x80];
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_PACKET_L4_TYPE_NONE,
|
||||
MLX5_PACKET_L4_TYPE_TCP,
|
||||
MLX5_PACKET_L4_TYPE_UDP,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_fte_match_set_lyr_2_4_bits {
|
||||
u8 smac_47_16[0x20];
|
||||
|
||||
@ -550,7 +559,8 @@ struct mlx5_ifc_fte_match_set_lyr_2_4_bits {
|
||||
u8 tcp_sport[0x10];
|
||||
u8 tcp_dport[0x10];
|
||||
|
||||
u8 reserved_at_c0[0x10];
|
||||
u8 l4_type[0x2];
|
||||
u8 reserved_at_c2[0xe];
|
||||
u8 ipv4_ihl[0x4];
|
||||
u8 reserved_at_c4[0x4];
|
||||
|
||||
@ -846,7 +856,11 @@ struct mlx5_ifc_flow_table_nic_cap_bits {
|
||||
|
||||
struct mlx5_ifc_flow_table_prop_layout_bits flow_table_properties_nic_transmit_sniffer;
|
||||
|
||||
u8 reserved_at_e00[0x700];
|
||||
u8 reserved_at_e00[0x600];
|
||||
|
||||
struct mlx5_ifc_flow_table_fields_supported_2_bits ft_field_support_2_nic_receive;
|
||||
|
||||
u8 reserved_at_1480[0x80];
|
||||
|
||||
struct mlx5_ifc_flow_table_fields_supported_2_bits ft_field_support_2_nic_receive_rdma;
|
||||
|
||||
@ -876,7 +890,9 @@ struct mlx5_ifc_port_selection_cap_bits {
|
||||
|
||||
struct mlx5_ifc_flow_table_prop_layout_bits flow_table_properties_port_selection;
|
||||
|
||||
u8 reserved_at_400[0x7c00];
|
||||
struct mlx5_ifc_flow_table_fields_supported_2_bits ft_field_support_2_port_selection;
|
||||
|
||||
u8 reserved_at_480[0x7b80];
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -1469,7 +1485,9 @@ enum {
|
||||
};
|
||||
|
||||
struct mlx5_ifc_cmd_hca_cap_bits {
|
||||
u8 reserved_at_0[0x10];
|
||||
u8 reserved_at_0[0x6];
|
||||
u8 page_request_disable[0x1];
|
||||
u8 reserved_at_7[0x9];
|
||||
u8 shared_object_to_user_object_allowed[0x1];
|
||||
u8 reserved_at_13[0xe];
|
||||
u8 vhca_resource_manager[0x1];
|
||||
@ -2004,7 +2022,13 @@ struct mlx5_ifc_cmd_hca_cap_2_bits {
|
||||
u8 reserved_at_3a0[0x10];
|
||||
u8 max_rqt_vhca_id[0x10];
|
||||
|
||||
u8 reserved_at_3c0[0x440];
|
||||
u8 reserved_at_3c0[0x20];
|
||||
|
||||
u8 reserved_at_3e0[0x10];
|
||||
u8 pcc_ifa2[0x1];
|
||||
u8 reserved_at_3f1[0xf];
|
||||
|
||||
u8 reserved_at_400[0x400];
|
||||
};
|
||||
|
||||
enum mlx5_ifc_flow_destination_type {
|
||||
|
Loading…
x
Reference in New Issue
Block a user