net/mlx5: Initialize host PF host number earlier

Move host_number from esw->offloads to esw->esw_funcs as hpf_host_number
and initialize it during vports_init instead of offloads_enable. This
makes the host PF host number available earlier in the initialization
sequence, which is required for upcoming SF hardware table support for
satellite PFs.

Add a mlx5_esw_get_hpf_host_number() accessor to retrieve the stored
host number.

Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260521110843.367329-4-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Moshe Shemesh 2026-05-21 14:08:34 +03:00 committed by Jakub Kicinski
parent 69978da9bb
commit 171b7fb59f
4 changed files with 38 additions and 26 deletions

View File

@ -34,7 +34,7 @@ static void mlx5_esw_offloads_pf_vf_devlink_port_attrs_set(struct mlx5_eswitch *
pfnum = PCI_FUNC(dev->pdev->devfn);
external = mlx5_core_is_ecpf_esw_manager(dev);
if (external)
controller_num = dev->priv.eswitch->offloads.host_number + 1;
controller_num = mlx5_esw_get_hpf_host_number(dev) + 1;
if (vport_num == MLX5_VPORT_HOST_PF) {
memcpy(dl_port->attrs.switch_id.id, ppid.id, ppid.id_len);

View File

@ -2083,6 +2083,35 @@ int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs,
sf_base_id);
}
u16 mlx5_esw_get_hpf_host_number(struct mlx5_core_dev *dev)
{
struct mlx5_eswitch *esw = dev->priv.eswitch;
if (!mlx5_esw_allowed(esw))
return 0;
return esw->esw_funcs.hpf_host_number;
}
static int mlx5_esw_hpf_host_number_init(struct mlx5_eswitch *esw)
{
struct mlx5_esw_pf_info host_pf_info;
const u32 *query_host_out;
if (!mlx5_core_is_ecpf_esw_manager(esw->dev))
return 0;
query_host_out = mlx5_esw_query_functions(esw->dev);
if (IS_ERR(query_host_out))
return PTR_ERR(query_host_out);
/* Mark non local controller with non zero controller number. */
host_pf_info = mlx5_esw_get_host_pf_info(esw->dev, query_host_out);
esw->esw_funcs.hpf_host_number = host_pf_info.host_number;
kvfree(query_host_out);
return 0;
}
int mlx5_esw_vport_alloc(struct mlx5_eswitch *esw, int index, u16 vport_num)
{
struct mlx5_vport *vport;
@ -2232,6 +2261,10 @@ static int mlx5_esw_vports_init(struct mlx5_eswitch *esw)
xa_init(&esw->vports);
err = mlx5_esw_hpf_host_number_init(esw);
if (err)
goto err;
if (mlx5_esw_host_functions_enabled(dev)) {
err = mlx5_esw_vport_alloc(esw, idx, MLX5_VPORT_HOST_PF);
if (err)

View File

@ -333,7 +333,6 @@ struct mlx5_esw_offload {
u64 num_block_mode;
enum devlink_eswitch_encap_mode encap;
struct ida vport_metadata_ida;
unsigned int host_number; /* ECPF supports one external host */
};
/* E-Switch MC FDB table hash node */
@ -360,6 +359,7 @@ struct mlx5_esw_functions {
bool host_funcs_disabled;
u16 num_vfs;
u16 num_ec_vfs;
u16 hpf_host_number;
struct mlx5_esw_spf *spfs;
int num_spfs;
};
@ -880,6 +880,8 @@ struct devlink_port *mlx5_esw_offloads_devlink_port(struct mlx5_eswitch *esw, u1
int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs, u16 *sf_base_id);
u16 mlx5_esw_get_hpf_host_number(struct mlx5_core_dev *dev);
int mlx5_esw_vport_vhca_id_map(struct mlx5_eswitch *esw,
struct mlx5_vport *vport);
void mlx5_esw_vport_vhca_id_unmap(struct mlx5_eswitch *esw,

View File

@ -3819,25 +3819,6 @@ int mlx5_esw_funcs_changed_handler(struct notifier_block *nb,
return NOTIFY_OK;
}
static int mlx5_esw_host_number_init(struct mlx5_eswitch *esw)
{
struct mlx5_esw_pf_info host_pf_info;
const u32 *query_host_out;
if (!mlx5_core_is_ecpf_esw_manager(esw->dev))
return 0;
query_host_out = mlx5_esw_query_functions(esw->dev);
if (IS_ERR(query_host_out))
return PTR_ERR(query_host_out);
/* Mark non local controller with non zero controller number. */
host_pf_info = mlx5_esw_get_host_pf_info(esw->dev, query_host_out);
esw->offloads.host_number = host_pf_info.host_number;
kvfree(query_host_out);
return 0;
}
bool mlx5_esw_offloads_controller_valid(const struct mlx5_eswitch *esw, u32 controller)
{
/* Local controller is always valid */
@ -3848,7 +3829,7 @@ bool mlx5_esw_offloads_controller_valid(const struct mlx5_eswitch *esw, u32 cont
return false;
/* External host number starts with zero in device */
return (controller == esw->offloads.host_number + 1);
return (controller == mlx5_esw_get_hpf_host_number(esw->dev) + 1);
}
int esw_offloads_enable(struct mlx5_eswitch *esw)
@ -3867,10 +3848,6 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
if (err)
goto err_roce;
err = mlx5_esw_host_number_init(esw);
if (err)
goto err_metadata;
err = esw_offloads_metadata_init(esw);
if (err)
goto err_metadata;