]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: fix host physical function representor naming
authorViacheslav Ovsiienko <viacheslavo@mellanox.com>
Tue, 23 Jun 2020 07:48:34 +0000 (07:48 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 30 Jun 2020 12:52:30 +0000 (14:52 +0200)
The new kernel adds the names like "pf0" for Host PCI physical
function representor on Bluefield SmartNIC hosts. This patch
provides correct HPF representor recognition over the kernel
versions 5.7 and laters.

The following port naming formats are supported:

  - missing physical port name (no sysfs/netlink key) at all,
    master is assumed

  - decimal digits (for example "12"), representor is
    assumed, the value is the index of attached VF

  - "p" followed by decimal digits, for example "p2", master
    is assumed

  - "pf" followed by PF index, for example "pf0", Host PF
     representor is assumed on SmartNIC systems.

  - "pf" followed by PF index concatenated with "vf" followed by
     VF index, for example "pf0vf1", representor is assumed.
     If index of VF is "-1" it is a special case of Host PF
     representor, this representor must be indexed in devargs
     as 65535, for example representor=[0-3,65535] will
     allow representors for VF0, VF1, VF2, VF3 and for host PF.

Fixes: 79aa430721b1 ("common/mlx5: split common file under Linux directory")
Cc: stable@dpdk.org
Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
drivers/common/mlx5/linux/mlx5_common_os.c
drivers/common/mlx5/linux/mlx5_nl.c
drivers/common/mlx5/mlx5_common.h
drivers/net/mlx5/linux/mlx5_ethdev_os.c
drivers/net/mlx5/linux/mlx5_os.c

index 5a54875fbc7aa3fc8ef59b3a6c9e7500486699c4..e422e955a03a08a1a05b293b588ac2cf73c152cf 100644 (file)
@@ -117,6 +117,17 @@ mlx5_translate_port_name(const char *port_name_in,
                port_info_out->name_type = MLX5_PHYS_PORT_NAME_TYPE_UPLINK;
                return;
        }
+       /*
+        * Check for port-name as a string of the form pf0
+        * (support kernel ver >= 5.7 for HPF representor on BF).
+        */
+       sc_items = sscanf(port_name_in, "%c%c%d",
+                         &pf_c1, &pf_c2, &port_info_out->pf_num);
+       if (sc_items == 3 && pf_c1 == 'p' && pf_c2 == 'f') {
+               port_info_out->port_name = -1;
+               port_info_out->name_type = MLX5_PHYS_PORT_NAME_TYPE_PFHPF;
+               return;
+       }
        /* Check for port-name as a number (support kernel ver < 5.0 */
        errno = 0;
        port_info_out->port_name = strtol(port_name_in, &end, 0);
index 2943704e5ec3bb6105014597fd449457df420565..dc504d81a5e667d17aee626707e3e965cc3d5445 100644 (file)
@@ -1145,6 +1145,8 @@ mlx5_nl_check_switch_info(bool num_vf_set,
                /* Legacy representors naming schema. */
                switch_info->representor = !num_vf_set;
                break;
+       case MLX5_PHYS_PORT_NAME_TYPE_PFHPF:
+               /* Fallthrough */
        case MLX5_PHYS_PORT_NAME_TYPE_PFVF:
                /* New representors naming schema. */
                switch_info->representor = 1;
index a82956ba6bd61d2b1996b8512795ee0b72a5e36a..da01ffa1ce9dd8f064d10cefd688bef94906d32f 100644 (file)
@@ -146,6 +146,7 @@ enum mlx5_nl_phys_port_name_type {
        MLX5_PHYS_PORT_NAME_TYPE_LEGACY, /* before kernel ver < 5.0 */
        MLX5_PHYS_PORT_NAME_TYPE_UPLINK, /* p0, kernel ver >= 5.0 */
        MLX5_PHYS_PORT_NAME_TYPE_PFVF, /* pf0vf0, kernel ver >= 5.0 */
+       MLX5_PHYS_PORT_NAME_TYPE_PFHPF, /* pf0, kernel ver >= 5.7, HPF rep */
        MLX5_PHYS_PORT_NAME_TYPE_UNKNOWN, /* Unrecognized. */
 };
 
index 21105f6b2fa0c444c9c82e83a986b1b92a2d6512..701614a53ad304f94c73a9dfbb1e89d8df8b30ed 100644 (file)
@@ -1091,6 +1091,8 @@ mlx5_sysfs_check_switch_info(bool device_dir,
                /* Legacy representors naming schema. */
                switch_info->representor = !device_dir;
                break;
+       case MLX5_PHYS_PORT_NAME_TYPE_PFHPF:
+               /* Fallthrough */
        case MLX5_PHYS_PORT_NAME_TYPE_PFVF:
                /* New representors naming schema. */
                switch_info->representor = 1;
index c851d820b672c5973f832b4081b34b88f1333167..f0147e6e9bbcc1093fd44d1b35a8b43f9dd77bd6 100644 (file)
@@ -1491,6 +1491,8 @@ mlx5_os_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                                        if (list[ns].info.port_name == bd)
                                                ns++;
                                        break;
+                               case MLX5_PHYS_PORT_NAME_TYPE_PFHPF:
+                                       /* Fallthrough */
                                case MLX5_PHYS_PORT_NAME_TYPE_PFVF:
                                        if (list[ns].info.pf_num == bd)
                                                ns++;