From 420bbdae89f29744847a166b831c675ad5affd2a Mon Sep 17 00:00:00 2001 From: Viacheslav Ovsiienko Date: Tue, 23 Jun 2020 07:48:34 +0000 Subject: [PATCH] net/mlx5: fix host physical function representor naming 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 Acked-by: Matan Azrad --- drivers/common/mlx5/linux/mlx5_common_os.c | 11 +++++++++++ drivers/common/mlx5/linux/mlx5_nl.c | 2 ++ drivers/common/mlx5/mlx5_common.h | 1 + drivers/net/mlx5/linux/mlx5_ethdev_os.c | 2 ++ drivers/net/mlx5/linux/mlx5_os.c | 2 ++ 5 files changed, 18 insertions(+) diff --git a/drivers/common/mlx5/linux/mlx5_common_os.c b/drivers/common/mlx5/linux/mlx5_common_os.c index 5a54875fbc..e422e955a0 100644 --- a/drivers/common/mlx5/linux/mlx5_common_os.c +++ b/drivers/common/mlx5/linux/mlx5_common_os.c @@ -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); diff --git a/drivers/common/mlx5/linux/mlx5_nl.c b/drivers/common/mlx5/linux/mlx5_nl.c index 2943704e5e..dc504d81a5 100644 --- a/drivers/common/mlx5/linux/mlx5_nl.c +++ b/drivers/common/mlx5/linux/mlx5_nl.c @@ -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; diff --git a/drivers/common/mlx5/mlx5_common.h b/drivers/common/mlx5/mlx5_common.h index a82956ba6b..da01ffa1ce 100644 --- a/drivers/common/mlx5/mlx5_common.h +++ b/drivers/common/mlx5/mlx5_common.h @@ -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. */ }; diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c b/drivers/net/mlx5/linux/mlx5_ethdev_os.c index 21105f6b2f..701614a53a 100644 --- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c +++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c @@ -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; diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index c851d820b6..f0147e6e9b 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -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++; -- 2.20.1