net/mlx5: E-Switch, Consider SF ports of host PF
Query SF vports count and base id of host PF from the firmware. Account these ports in the total port calculation whenever it is non zero. Signed-off-by: Parav Pandit <parav@nvidia.com> Reviewed-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Vu Pham <vuhuong@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
47dd7e609f
commit
87bd418ea7
@ -1566,6 +1566,48 @@ void mlx5_eswitch_disable(struct mlx5_eswitch *esw, bool clear_vf)
|
||||
up_write(&esw->mode_lock);
|
||||
}
|
||||
|
||||
static int mlx5_query_hca_cap_host_pf(struct mlx5_core_dev *dev, void *out)
|
||||
{
|
||||
u16 opmod = (MLX5_CAP_GENERAL << 1) | (HCA_CAP_OPMOD_GET_MAX & 0x01);
|
||||
u8 in[MLX5_ST_SZ_BYTES(query_hca_cap_in)] = {};
|
||||
|
||||
MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
|
||||
MLX5_SET(query_hca_cap_in, in, op_mod, opmod);
|
||||
MLX5_SET(query_hca_cap_in, in, function_id, MLX5_VPORT_PF);
|
||||
MLX5_SET(query_hca_cap_in, in, other_function, true);
|
||||
return mlx5_cmd_exec_inout(dev, query_hca_cap, in, out);
|
||||
}
|
||||
|
||||
int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs, u16 *sf_base_id)
|
||||
|
||||
{
|
||||
int query_out_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
|
||||
void *query_ctx;
|
||||
void *hca_caps;
|
||||
int err;
|
||||
|
||||
if (!mlx5_core_is_ecpf(dev)) {
|
||||
*max_sfs = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
query_ctx = kzalloc(query_out_sz, GFP_KERNEL);
|
||||
if (!query_ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
err = mlx5_query_hca_cap_host_pf(dev, query_ctx);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
||||
hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_ctx, capability);
|
||||
*max_sfs = MLX5_GET(cmd_hca_cap, hca_caps, max_num_sf);
|
||||
*sf_base_id = MLX5_GET(cmd_hca_cap, hca_caps, sf_base_id);
|
||||
|
||||
out_free:
|
||||
kfree(query_ctx);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int mlx5_esw_vport_alloc(struct mlx5_eswitch *esw, struct mlx5_core_dev *dev,
|
||||
int index, u16 vport_num)
|
||||
{
|
||||
@ -1612,6 +1654,7 @@ static void mlx5_esw_vports_cleanup(struct mlx5_eswitch *esw)
|
||||
static int mlx5_esw_vports_init(struct mlx5_eswitch *esw)
|
||||
{
|
||||
struct mlx5_core_dev *dev = esw->dev;
|
||||
u16 max_host_pf_sfs;
|
||||
u16 base_sf_num;
|
||||
int idx = 0;
|
||||
int err;
|
||||
@ -1642,6 +1685,18 @@ static int mlx5_esw_vports_init(struct mlx5_eswitch *esw)
|
||||
xa_set_mark(&esw->vports, base_sf_num + i, MLX5_ESW_VPT_SF);
|
||||
idx++;
|
||||
}
|
||||
|
||||
err = mlx5_esw_sf_max_hpf_functions(dev, &max_host_pf_sfs, &base_sf_num);
|
||||
if (err)
|
||||
goto err;
|
||||
for (i = 0; i < max_host_pf_sfs; i++) {
|
||||
err = mlx5_esw_vport_alloc(esw, dev, idx, base_sf_num + i);
|
||||
if (err)
|
||||
goto err;
|
||||
xa_set_mark(&esw->vports, base_sf_num + i, MLX5_ESW_VPT_SF);
|
||||
idx++;
|
||||
}
|
||||
|
||||
if (mlx5_ecpf_vport_exists(dev)) {
|
||||
err = mlx5_esw_vport_alloc(esw, dev, idx, MLX5_VPORT_ECPF);
|
||||
if (err)
|
||||
|
@ -668,6 +668,7 @@ void mlx5_esw_devlink_sf_port_unregister(struct mlx5_eswitch *esw, u16 vport_num
|
||||
int mlx5_esw_offloads_sf_vport_enable(struct mlx5_eswitch *esw, struct devlink_port *dl_port,
|
||||
u16 vport_num, u32 sfnum);
|
||||
void mlx5_esw_offloads_sf_vport_disable(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs, u16 *sf_base_id);
|
||||
|
||||
int mlx5_esw_vport_vhca_id_set(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
void mlx5_esw_vport_vhca_id_clear(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
|
Loading…
x
Reference in New Issue
Block a user