139 lines
5.5 KiB
Diff
139 lines
5.5 KiB
Diff
From cb384ea85892df1bafcb9e6d92919a27840649c6 Mon Sep 17 00:00:00 2001
|
|
From: Kamal Heib <kheib@redhat.com>
|
|
Date: Sun, 19 Apr 2026 18:20:57 -0400
|
|
Subject: [PATCH] net/mlx5: E-switch, Set representor attributes for adjacent
|
|
VFs
|
|
|
|
JIRA: https://redhat.atlassian.net/browse/RHEL-169055
|
|
|
|
commit 5d8ae2c2cfe88a2c7458e18f30df4c655dfa983e
|
|
Author: Adithya Jayachandran <ajayachandra@nvidia.com>
|
|
Date: Fri Aug 29 15:37:21 2025 -0700
|
|
|
|
net/mlx5: E-switch, Set representor attributes for adjacent VFs
|
|
|
|
Adjacent vfs get their devlink port information from firmware,
|
|
use the information (pfnum, function id) from FW when populating the
|
|
devlink port attributes.
|
|
|
|
Before:
|
|
$ devlink port show
|
|
pci/0000:00:03.0/180225: type eth netdev eth0 flavour pcivf controller 0 pfnum 0 vfnum 49152 external false splittable false
|
|
function:
|
|
hw_addr 00:00:00:00:00:00
|
|
|
|
After:
|
|
$ devlink port show
|
|
pci/0000:00:03.0/180225: type eth netdev enp0s3npf0vf2 flavour pcivf controller 0 pfnum 0 vfnum 2 external false splittable false
|
|
function:
|
|
hw_addr 00:00:00:00:00:00
|
|
|
|
Signed-off-by: Adithya Jayachandran <ajayachandra@nvidia.com>
|
|
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
|
|
Reviewed-by: Simon Horman <horms@kernel.org>
|
|
Link: https://patch.msgid.link/20250829223722.900629-7-saeed@kernel.org
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
|
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/adj_vport.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/adj_vport.c
|
|
index 3380f85678bc..0091ba697bae 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/adj_vport.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/adj_vport.c
|
|
@@ -57,7 +57,8 @@ static int mlx5_esw_create_esw_vport(struct mlx5_core_dev *dev, u16 vhca_id,
|
|
return err;
|
|
}
|
|
|
|
-static int mlx5_esw_adj_vport_create(struct mlx5_eswitch *esw, u16 vhca_id)
|
|
+static int mlx5_esw_adj_vport_create(struct mlx5_eswitch *esw, u16 vhca_id,
|
|
+ const void *rid_info_reg)
|
|
{
|
|
struct mlx5_vport *vport;
|
|
u16 vport_num;
|
|
@@ -83,6 +84,12 @@ static int mlx5_esw_adj_vport_create(struct mlx5_eswitch *esw, u16 vhca_id)
|
|
vport->adjacent = true;
|
|
vport->vhca_id = vhca_id;
|
|
|
|
+ vport->adj_info.parent_pci_devfn =
|
|
+ MLX5_GET(function_vhca_rid_info_reg, rid_info_reg,
|
|
+ parent_pci_device_function);
|
|
+ vport->adj_info.function_id =
|
|
+ MLX5_GET(function_vhca_rid_info_reg, rid_info_reg, function_id);
|
|
+
|
|
mlx5_fs_vport_egress_acl_ns_add(esw->dev->priv.steering, vport->index);
|
|
mlx5_fs_vport_ingress_acl_ns_add(esw->dev->priv.steering, vport->index);
|
|
err = mlx5_esw_offloads_rep_add(esw, vport);
|
|
@@ -176,7 +183,7 @@ void mlx5_esw_adjacent_vhcas_setup(struct mlx5_eswitch *esw)
|
|
esw_debug(esw->dev, "Delegated vhca functions count %d\n", count);
|
|
|
|
for (i = 0; i < count; i++) {
|
|
- void *rid_info, *rid_info_reg;
|
|
+ const void *rid_info, *rid_info_reg;
|
|
u16 vhca_id;
|
|
|
|
rid_info = MLX5_ADDR_OF(query_delegated_vhca_out, out,
|
|
@@ -187,10 +194,9 @@ void mlx5_esw_adjacent_vhcas_setup(struct mlx5_eswitch *esw)
|
|
|
|
vhca_id = MLX5_GET(function_vhca_rid_info_reg, rid_info_reg,
|
|
vhca_id);
|
|
- esw_debug(esw->dev, "Delegating vhca_id 0x%x rid info:\n",
|
|
- vhca_id);
|
|
+ esw_debug(esw->dev, "Delegating vhca_id 0x%x\n", vhca_id);
|
|
|
|
- err = mlx5_esw_adj_vport_create(esw, vhca_id);
|
|
+ err = mlx5_esw_adj_vport_create(esw, vhca_id, rid_info_reg);
|
|
if (err) {
|
|
esw_warn(esw->dev,
|
|
"Failed to init adjacent vhca 0x%x, err %d\n",
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
|
|
index c33accadae0f..cf88a106d80d 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
|
|
@@ -27,6 +27,7 @@ static void mlx5_esw_offloads_pf_vf_devlink_port_attrs_set(struct mlx5_eswitch *
|
|
{
|
|
struct mlx5_core_dev *dev = esw->dev;
|
|
struct netdev_phys_item_id ppid = {};
|
|
+ struct mlx5_vport *vport;
|
|
u32 controller_num = 0;
|
|
bool external;
|
|
u16 pfnum;
|
|
@@ -42,10 +43,18 @@ static void mlx5_esw_offloads_pf_vf_devlink_port_attrs_set(struct mlx5_eswitch *
|
|
dl_port->attrs.switch_id.id_len = ppid.id_len;
|
|
devlink_port_attrs_pci_pf_set(dl_port, controller_num, pfnum, external);
|
|
} else if (mlx5_eswitch_is_vf_vport(esw, vport_num)) {
|
|
+ u16 func_id = vport_num - 1;
|
|
+
|
|
+ vport = mlx5_eswitch_get_vport(esw, vport_num);
|
|
memcpy(dl_port->attrs.switch_id.id, ppid.id, ppid.id_len);
|
|
dl_port->attrs.switch_id.id_len = ppid.id_len;
|
|
+ if (vport->adjacent) {
|
|
+ func_id = vport->adj_info.function_id;
|
|
+ pfnum = vport->adj_info.parent_pci_devfn;
|
|
+ }
|
|
+
|
|
devlink_port_attrs_pci_vf_set(dl_port, controller_num, pfnum,
|
|
- vport_num - 1, external);
|
|
+ func_id, external);
|
|
} else if (mlx5_core_is_ec_vf_vport(esw->dev, vport_num)) {
|
|
u16 base_vport = mlx5_core_ec_vf_vport_base(dev);
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
index 6d36d8bbb979..4fe285ce32aa 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
|
|
@@ -217,6 +217,11 @@ struct mlx5_vport {
|
|
int vhca_id;
|
|
|
|
bool adjacent; /* delegated vhca from adjacent function */
|
|
+ struct {
|
|
+ u16 parent_pci_devfn; /* Adjacent parent PCI device function */
|
|
+ u16 function_id; /* Function ID of the delegated VPort */
|
|
+ } adj_info;
|
|
+
|
|
struct mlx5_vport_info info;
|
|
|
|
/* Protected with the E-Switch qos domain lock. The Vport QoS can
|
|
--
|
|
2.50.1 (Apple Git-155)
|
|
|