]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: E-switch, Set representor attributes for adjacent VFs
authorAdithya Jayachandran <ajayachandra@nvidia.com>
Fri, 29 Aug 2025 22:37:21 +0000 (15:37 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 2 Sep 2025 13:18:16 +0000 (15:18 +0200)
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>
drivers/net/ethernet/mellanox/mlx5/core/esw/adj_vport.c
drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h

index 3380f85678bc13dcfeac4cdfb8e2531b9b8214a5..0091ba697baece5ec2c5a64d6f92b559b62f58ac 100644 (file)
@@ -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",
index c33accadae0f01f68f6e4982dca954c281cd9e9f..cf88a106d80d71c2f394d2e9392d7f9a559f0313 100644 (file)
@@ -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);
 
index 6d36d8bbb9799c11c6277b1f6ef18195837e0209..4fe285ce32aa2f96cd0b4e6621b12a41fca94dca 100644 (file)
@@ -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