[RFC,7/7] net/mlx5: support representor of sub function
Checks
Commit Message
This patch supports of SF representor. Similar to VF representor, switch
port name of SF representor in sysfs phys_port_name is "pf<x>sf<y>".
Device representor argumnt is "representors=sf[list]", list member could
be mix of instance and range. Example:
representors=sf[0,2,4,8-12,-1]
To probe VF representor and SF representor, need to separate into 2
devices:
-a <BDF>,representor=vf[list] -a <BDF>,representor=sf[list]
Signed-off-by: Xueming Li <xuemingl@nvidia.com>
---
drivers/net/mlx5/linux/mlx5_ethdev_os.c | 2 +
drivers/net/mlx5/linux/mlx5_os.c | 69 ++++++++++++++++++++++---
drivers/net/mlx5/mlx5_ethdev.c | 2 +
3 files changed, 67 insertions(+), 6 deletions(-)
@@ -1010,6 +1010,8 @@ mlx5_sysfs_check_switch_info(bool device_dir,
case MLX5_PHYS_PORT_NAME_TYPE_PFHPF:
/* Fallthrough */
case MLX5_PHYS_PORT_NAME_TYPE_PFVF:
+ /* Fallthrough */
+ case MLX5_PHYS_PORT_NAME_TYPE_PFSF:
/* New representors naming schema. */
switch_info->representor = 1;
break;
@@ -692,20 +692,70 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
/* Determine if this port representor is supposed to be spawned. */
if (switch_info->representor && dpdk_dev->devargs) {
- struct rte_eth_devargs eth_da;
+ struct rte_eth_devargs eth_da = { .nb_ports = 0 };
err = rte_eth_devargs_parse(dpdk_dev->devargs->args, ð_da);
if (err) {
rte_errno = -err;
DRV_LOG(ERR, "failed to process device arguments: %s",
- strerror(rte_errno));
+ dpdk_dev->devargs->args);
return NULL;
}
+ switch (eth_da.type) {
+ case RTE_ETH_REPRESENTOR_PF:
+ if (switch_info->name_type !=
+ MLX5_PHYS_PORT_NAME_TYPE_PFHPF) {
+ rte_errno = EBUSY;
+ return NULL;
+ }
+ break;
+ case RTE_ETH_REPRESENTOR_SF:
+ if (switch_info->name_type !=
+ MLX5_PHYS_PORT_NAME_TYPE_PFSF) {
+ rte_errno = EBUSY;
+ return NULL;
+ }
+ break;
+ case RTE_ETH_REPRESENTOR_VF:
+ /* Allows HPF representor index -1 as exception. */
+ if (!(spawn->info.port_name == -1 &&
+ switch_info->name_type ==
+ MLX5_PHYS_PORT_NAME_TYPE_PFHPF) &&
+ switch_info->name_type !=
+ MLX5_PHYS_PORT_NAME_TYPE_PFVF) {
+ rte_errno = EBUSY;
+ return NULL;
+ }
+ break;
+ default:
+ rte_errno = EBUSY;
+ return NULL;
+ }
+ /* Check controller ID: */
+ for (i = 0; i < eth_da.nb_mh_controllers; ++i)
+ if (eth_da.mh_controllers[i] ==
+ (uint16_t)switch_info->ctrl_num)
+ break;
+ if (eth_da.nb_mh_controllers && i == eth_da.nb_mh_controllers) {
+ rte_errno = EBUSY;
+ return NULL;
+ }
+ /* Check PF ID: */
+ for (i = 0; i < eth_da.nb_ports; ++i)
+ if (eth_da.ports[i] ==
+ (uint16_t)switch_info->pf_num)
+ break;
+ if (eth_da.nb_ports && i == eth_da.nb_ports) {
+ rte_errno = EBUSY;
+ return NULL;
+ }
+ /* Check SF/VF ID: */
for (i = 0; i < eth_da.nb_representor_ports; ++i)
if (eth_da.representor_ports[i] ==
(uint16_t)switch_info->port_name)
break;
- if (i == eth_da.nb_representor_ports) {
+ if (eth_da.type != RTE_ETH_REPRESENTOR_PF &&
+ i == eth_da.nb_representor_ports) {
rte_errno = EBUSY;
return NULL;
}
@@ -716,8 +766,11 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
if (!switch_info->representor)
strlcpy(name, dpdk_dev->name, sizeof(name));
else
- snprintf(name, sizeof(name), "%s_representor_%u",
- dpdk_dev->name, switch_info->port_name);
+ snprintf(name, sizeof(name), "%s_representor_%s%u",
+ dpdk_dev->name,
+ switch_info->name_type ==
+ MLX5_PHYS_PORT_NAME_TYPE_PFSF ? "sf" : "vf",
+ switch_info->port_name);
} else {
/* Bonding device. */
if (!switch_info->representor)
@@ -725,9 +778,11 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
dpdk_dev->name,
mlx5_os_get_dev_device_name(spawn->phys_dev));
else
- snprintf(name, sizeof(name), "%s_%s_representor_%u",
+ snprintf(name, sizeof(name), "%s_%s_representor_%s%u",
dpdk_dev->name,
mlx5_os_get_dev_device_name(spawn->phys_dev),
+ switch_info->name_type ==
+ MLX5_PHYS_PORT_NAME_TYPE_PFSF ? "sf" : "vf",
switch_info->port_name);
}
/* check if the device is already spawned */
@@ -1966,6 +2021,8 @@ mlx5_os_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
case MLX5_PHYS_PORT_NAME_TYPE_PFHPF:
/* Fallthrough */
case MLX5_PHYS_PORT_NAME_TYPE_PFVF:
+ /* Fallthrough */
+ case MLX5_PHYS_PORT_NAME_TYPE_PFSF:
if (list[ns].info.pf_num == bd)
ns++;
break;
@@ -374,6 +374,8 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
break;
}
}
+ if (priv->master)
+ info->dev_capa = RTE_ETH_DEV_CAPA_REPRESENTOR_SF;
return 0;
}