net/mlx5: update switch port id in bonding configuration

With bonding configuration multiple PFs may represent the
single switching device with multiple ports as representors.
To distinguish representors belonging to different PFs we
should generated unique port ID. It is proposed to use
the PF index in bonding configuration to generate this
unique port IDs.

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
This commit is contained in:
Viacheslav Ovsiienko 2019-09-25 07:53:34 +00:00 committed by Ferruh Yigit
parent f7e95215ac
commit bee57a0a35
4 changed files with 25 additions and 0 deletions

View File

@ -1788,6 +1788,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
priv->domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID;
priv->vport_meta_tag = 0;
priv->vport_meta_mask = 0;
priv->pf_bond = spawn->pf_bond;
#ifdef HAVE_MLX5DV_DR_DEVX_PORT
/*
* The DevX port query API is implemented. E-Switch may use

View File

@ -623,6 +623,7 @@ struct mlx5_priv {
uint32_t vport_meta_tag; /* Used for vport index match ove VF LAG. */
uint32_t vport_meta_mask; /* Used for vport index field match mask. */
int32_t representor_id; /* Port representor identifier. */
int32_t pf_bond; /* >=0 means PF index in bonding configuration. */
unsigned int if_index; /* Associated kernel network device index. */
/* RX/TX queues. */
unsigned int rxqs_n; /* RX queues array size. */

View File

@ -58,6 +58,10 @@
#define MLX5_PMD_SOFT_COUNTERS 1
#endif
/* Switch port ID parameters for bonding configurations. */
#define MLX5_PORT_ID_BONDING_PF_MASK 0xf
#define MLX5_PORT_ID_BONDING_PF_SHIFT 0xf
/* Alarm timeout. */
#define MLX5_ALARM_TIMEOUT_US 100000

View File

@ -582,6 +582,25 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
if (priv->representor) {
uint16_t port_id;
if (priv->pf_bond >= 0) {
/*
* Switch port ID is opaque value with driver defined
* format. Push the PF index in bonding configurations
* in upper four bits of port ID. If we get too many
* representors (more than 4K) or PFs (more than 15)
* this approach must be reconsidered.
*/
if ((info->switch_info.port_id >>
MLX5_PORT_ID_BONDING_PF_SHIFT) ||
priv->pf_bond > MLX5_PORT_ID_BONDING_PF_MASK) {
DRV_LOG(ERR, "can't update switch port ID"
" for bonding device");
assert(false);
return -ENODEV;
}
info->switch_info.port_id |=
priv->pf_bond << MLX5_PORT_ID_BONDING_PF_SHIFT;
}
MLX5_ETH_FOREACH_DEV(port_id) {
struct mlx5_priv *opriv =
rte_eth_devices[port_id].data->dev_private;