[PATCH net-next 08/12] net/mlx5: Register devlink ports for satellite PFs
From: Tariq Toukan
Date: Thu May 21 2026 - 07:20:33 EST
From: Moshe Shemesh <moshe@xxxxxxxxxx>
Include satellite PFs in mlx5_eswitch_is_pf_vf_vport() so they receive
the standard PF/VF devlink port operations. Update
mlx5_esw_devlink_port_supported() and devlink port attribute setup to
register SPF devlink ports with controller number and PF number.
Add mlx5_esw_spf_vport_to_idx() to look up the SPF array index by vport
number, and mlx5_esw_is_spf_vport() boolean wrapper to identify
satellite PF vports.
Signed-off-by: Moshe Shemesh <moshe@xxxxxxxxxx>
Signed-off-by: Tariq Toukan <tariqt@xxxxxxxxxx>
---
.../mellanox/mlx5/core/esw/devlink_port.c | 13 +++++++++++-
.../net/ethernet/mellanox/mlx5/core/eswitch.c | 21 ++++++++++++++++++-
.../net/ethernet/mellanox/mlx5/core/eswitch.h | 2 ++
3 files changed, 34 insertions(+), 2 deletions(-)
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 fddb108bcbff..05d89769b917 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
@@ -16,7 +16,8 @@ static bool mlx5_esw_devlink_port_supported(struct mlx5_eswitch *esw, u16 vport_
return (mlx5_core_is_ecpf(esw->dev) &&
vport_num == MLX5_VPORT_HOST_PF) ||
mlx5_eswitch_is_vf_vport(esw, vport_num) ||
- mlx5_core_is_ec_vf_vport(esw->dev, vport_num);
+ mlx5_core_is_ec_vf_vport(esw->dev, vport_num) ||
+ mlx5_esw_is_spf_vport(esw, vport_num);
}
static void mlx5_esw_offloads_pf_vf_devlink_port_attrs_set(struct mlx5_eswitch *esw,
@@ -64,6 +65,16 @@ 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_vf_set(dl_port, 0, pfnum,
vport_num - base_vport, false);
+ } else if (mlx5_esw_is_spf_vport(esw, vport_num)) {
+ int spf_idx = mlx5_esw_spf_vport_to_idx(esw, vport_num);
+
+ controller_num = esw->esw_funcs.spfs[spf_idx].host_number + 1;
+ pfnum = esw->esw_funcs.spfs[spf_idx].pf_num;
+
+ memcpy(dl_port->attrs.switch_id.id, ppid.id, ppid.id_len);
+ dl_port->attrs.switch_id.id_len = ppid.id_len;
+ devlink_port_attrs_pci_pf_set(dl_port, controller_num, pfnum,
+ true);
}
}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index f734f9364b2c..8bee014140b8 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -2651,10 +2651,29 @@ bool mlx5_eswitch_is_vf_vport(struct mlx5_eswitch *esw, u16 vport_num)
return mlx5_esw_check_port_type(esw, vport_num, MLX5_ESW_VPT_VF);
}
+int mlx5_esw_spf_vport_to_idx(struct mlx5_eswitch *esw, u16 vport_num)
+{
+ struct mlx5_esw_functions *esw_funcs = &esw->esw_funcs;
+ int i;
+
+ for (i = 0; i < esw_funcs->num_spfs; i++) {
+ if (esw_funcs->spfs[i].vport_num == vport_num)
+ return i;
+ }
+
+ return -ENOENT;
+}
+
+bool mlx5_esw_is_spf_vport(struct mlx5_eswitch *esw, u16 vport_num)
+{
+ return mlx5_esw_spf_vport_to_idx(esw, vport_num) >= 0;
+}
+
bool mlx5_eswitch_is_pf_vf_vport(struct mlx5_eswitch *esw, u16 vport_num)
{
return vport_num == MLX5_VPORT_HOST_PF ||
- mlx5_eswitch_is_vf_vport(esw, vport_num);
+ mlx5_eswitch_is_vf_vport(esw, vport_num) ||
+ mlx5_esw_is_spf_vport(esw, vport_num);
}
bool mlx5_esw_is_sf_vport(struct mlx5_eswitch *esw, u16 vport_num)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
index f85be8e39953..7da1a888aa7c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
@@ -798,6 +798,8 @@ struct mlx5_vport *__must_check
mlx5_eswitch_get_vport(struct mlx5_eswitch *esw, u16 vport_num);
bool mlx5_eswitch_is_vf_vport(struct mlx5_eswitch *esw, u16 vport_num);
+int mlx5_esw_spf_vport_to_idx(struct mlx5_eswitch *esw, u16 vport_num);
+bool mlx5_esw_is_spf_vport(struct mlx5_eswitch *esw, u16 vport_num);
bool mlx5_eswitch_is_pf_vf_vport(struct mlx5_eswitch *esw, u16 vport_num);
bool mlx5_esw_is_sf_vport(struct mlx5_eswitch *esw, u16 vport_num);
--
2.44.0