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 <xuemi...@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(-)

diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c 
b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
index d4eed11fbc..11c30d587c 100644
--- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c
+++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
@@ -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;
diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c
index 917d6be7b8..aeac1abb2c 100644
--- a/drivers/net/mlx5/linux/mlx5_os.c
+++ b/drivers/net/mlx5/linux/mlx5_os.c
@@ -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, &eth_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;
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 45ee7e4488..ad6aacc329 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -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;
 }
 
-- 
2.25.1

Reply via email to