From: Adithya Jayachandran 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 Signed-off-by: Saeed Mahameed --- .../ethernet/mellanox/mlx5/core/esw/adj_vport.c | 16 +++++++++++----- .../mellanox/mlx5/core/esw/devlink_port.c | 11 ++++++++++- .../net/ethernet/mellanox/mlx5/core/eswitch.h | 5 +++++ 3 files changed, 26 insertions(+), 6 deletions(-) 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 26f2ba6f665d..6e1a6057e6b8 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 9fc020bc40cf..6fb925949ed1 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