From: Moshe Shemesh 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 Signed-off-by: Tariq Toukan --- .../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