Skip to content

Commit 520369e

Browse files
danielj-mellanoxkuba-moo
authored andcommitted
net/mlx5: Support disabling host PFs
Some devices support disabling the physical function on the host. When this is configured the vports for the host functions do not exist. This patch checks if host functions are enabled before trying to access their vports. Signed-off-by: Daniel Jurgens <[email protected]> Reviewed-by: William Tu <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 9e84de7 commit 520369e

File tree

3 files changed

+66
-37
lines changed

3 files changed

+66
-37
lines changed

drivers/net/ethernet/mellanox/mlx5/core/eswitch.c

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,17 +1297,19 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
12971297
esw->mode == MLX5_ESWITCH_LEGACY;
12981298

12991299
/* Enable PF vport */
1300-
if (pf_needed) {
1300+
if (pf_needed && mlx5_esw_host_functions_enabled(esw->dev)) {
13011301
ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_PF,
13021302
enabled_events);
13031303
if (ret)
13041304
return ret;
13051305
}
13061306

1307-
/* Enable external host PF HCA */
1308-
ret = host_pf_enable_hca(esw->dev);
1309-
if (ret)
1310-
goto pf_hca_err;
1307+
if (mlx5_esw_host_functions_enabled(esw->dev)) {
1308+
/* Enable external host PF HCA */
1309+
ret = host_pf_enable_hca(esw->dev);
1310+
if (ret)
1311+
goto pf_hca_err;
1312+
}
13111313

13121314
/* Enable ECPF vport */
13131315
if (mlx5_ecpf_vport_exists(esw->dev)) {
@@ -1339,9 +1341,10 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
13391341
if (mlx5_ecpf_vport_exists(esw->dev))
13401342
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
13411343
ecpf_err:
1342-
host_pf_disable_hca(esw->dev);
1344+
if (mlx5_esw_host_functions_enabled(esw->dev))
1345+
host_pf_disable_hca(esw->dev);
13431346
pf_hca_err:
1344-
if (pf_needed)
1347+
if (pf_needed && mlx5_esw_host_functions_enabled(esw->dev))
13451348
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
13461349
return ret;
13471350
}
@@ -1361,10 +1364,12 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw)
13611364
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
13621365
}
13631366

1364-
host_pf_disable_hca(esw->dev);
1367+
if (mlx5_esw_host_functions_enabled(esw->dev))
1368+
host_pf_disable_hca(esw->dev);
13651369

1366-
if (mlx5_core_is_ecpf_esw_manager(esw->dev) ||
1367-
esw->mode == MLX5_ESWITCH_LEGACY)
1370+
if ((mlx5_core_is_ecpf_esw_manager(esw->dev) ||
1371+
esw->mode == MLX5_ESWITCH_LEGACY) &&
1372+
mlx5_esw_host_functions_enabled(esw->dev))
13681373
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
13691374
}
13701375

@@ -1693,7 +1698,8 @@ int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs, u16 *
16931698
void *hca_caps;
16941699
int err;
16951700

1696-
if (!mlx5_core_is_ecpf(dev)) {
1701+
if (!mlx5_core_is_ecpf(dev) ||
1702+
!mlx5_esw_host_functions_enabled(dev)) {
16971703
*max_sfs = 0;
16981704
return 0;
16991705
}
@@ -1769,21 +1775,23 @@ static int mlx5_esw_vports_init(struct mlx5_eswitch *esw)
17691775

17701776
xa_init(&esw->vports);
17711777

1772-
err = mlx5_esw_vport_alloc(esw, idx, MLX5_VPORT_PF);
1773-
if (err)
1774-
goto err;
1775-
if (esw->first_host_vport == MLX5_VPORT_PF)
1776-
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
1777-
idx++;
1778-
1779-
for (i = 0; i < mlx5_core_max_vfs(dev); i++) {
1780-
err = mlx5_esw_vport_alloc(esw, idx, idx);
1778+
if (mlx5_esw_host_functions_enabled(dev)) {
1779+
err = mlx5_esw_vport_alloc(esw, idx, MLX5_VPORT_PF);
17811780
if (err)
17821781
goto err;
1783-
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_VF);
1784-
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
1782+
if (esw->first_host_vport == MLX5_VPORT_PF)
1783+
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
17851784
idx++;
1785+
for (i = 0; i < mlx5_core_max_vfs(dev); i++) {
1786+
err = mlx5_esw_vport_alloc(esw, idx, idx);
1787+
if (err)
1788+
goto err;
1789+
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_VF);
1790+
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
1791+
idx++;
1792+
}
17861793
}
1794+
17871795
base_sf_num = mlx5_sf_start_function_id(dev);
17881796
for (i = 0; i < mlx5_sf_max_functions(dev); i++) {
17891797
err = mlx5_esw_vport_alloc(esw, idx, base_sf_num + i);
@@ -1883,6 +1891,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
18831891
goto free_esw;
18841892

18851893
esw->dev = dev;
1894+
dev->priv.eswitch = esw;
18861895
esw->manager_vport = mlx5_eswitch_manager_vport(dev);
18871896
esw->first_host_vport = mlx5_eswitch_first_host_vport_num(dev);
18881897

@@ -1901,7 +1910,6 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
19011910
if (err)
19021911
goto abort;
19031912

1904-
dev->priv.eswitch = esw;
19051913
err = esw_offloads_init(esw);
19061914
if (err)
19071915
goto reps_err;
@@ -2433,3 +2441,11 @@ void mlx5_eswitch_unblock_ipsec(struct mlx5_core_dev *dev)
24332441
dev->num_ipsec_offloads--;
24342442
mutex_unlock(&esw->state_lock);
24352443
}
2444+
2445+
bool mlx5_esw_host_functions_enabled(const struct mlx5_core_dev *dev)
2446+
{
2447+
if (!dev->priv.eswitch)
2448+
return true;
2449+
2450+
return !dev->priv.eswitch->esw_funcs.host_funcs_disabled;
2451+
}

drivers/net/ethernet/mellanox/mlx5/core/eswitch.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,7 @@ int mlx5_esw_ipsec_vf_packet_offload_set(struct mlx5_eswitch *esw, struct mlx5_v
899899
bool enable);
900900
int mlx5_esw_ipsec_vf_packet_offload_supported(struct mlx5_core_dev *dev,
901901
u16 vport_num);
902+
bool mlx5_esw_host_functions_enabled(const struct mlx5_core_dev *dev);
902903
#else /* CONFIG_MLX5_ESWITCH */
903904
/* eswitch API stubs */
904905
static inline int mlx5_eswitch_init(struct mlx5_core_dev *dev) { return 0; }
@@ -966,6 +967,12 @@ static inline bool mlx5_eswitch_block_ipsec(struct mlx5_core_dev *dev)
966967
}
967968

968969
static inline void mlx5_eswitch_unblock_ipsec(struct mlx5_core_dev *dev) {}
970+
971+
static inline bool
972+
mlx5_esw_host_functions_enabled(const struct mlx5_core_dev *dev)
973+
{
974+
return true;
975+
}
969976
#endif /* CONFIG_MLX5_ESWITCH */
970977

971978
#endif /* __MLX5_ESWITCH_H__ */

drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,7 +1213,8 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
12131213
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value,
12141214
misc_parameters);
12151215

1216-
if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
1216+
if (mlx5_core_is_ecpf_esw_manager(peer_dev) &&
1217+
mlx5_esw_host_functions_enabled(peer_dev)) {
12171218
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
12181219
esw_set_peer_miss_rule_source_port(esw, peer_esw, spec,
12191220
MLX5_VPORT_PF);
@@ -1239,19 +1240,21 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
12391240
flows[peer_vport->index] = flow;
12401241
}
12411242

1242-
mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
1243-
mlx5_core_max_vfs(peer_dev)) {
1244-
esw_set_peer_miss_rule_source_port(esw,
1245-
peer_esw,
1246-
spec, peer_vport->vport);
1243+
if (mlx5_esw_host_functions_enabled(esw->dev)) {
1244+
mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
1245+
mlx5_core_max_vfs(peer_dev)) {
1246+
esw_set_peer_miss_rule_source_port(esw, peer_esw,
1247+
spec,
1248+
peer_vport->vport);
12471249

1248-
flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
1249-
spec, &flow_act, &dest, 1);
1250-
if (IS_ERR(flow)) {
1251-
err = PTR_ERR(flow);
1252-
goto add_vf_flow_err;
1250+
flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
1251+
spec, &flow_act, &dest, 1);
1252+
if (IS_ERR(flow)) {
1253+
err = PTR_ERR(flow);
1254+
goto add_vf_flow_err;
1255+
}
1256+
flows[peer_vport->index] = flow;
12531257
}
1254-
flows[peer_vport->index] = flow;
12551258
}
12561259

12571260
if (mlx5_core_ec_sriov_enabled(peer_dev)) {
@@ -1301,7 +1304,9 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
13011304
mlx5_del_flow_rules(flows[peer_vport->index]);
13021305
}
13031306
add_ecpf_flow_err:
1304-
if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
1307+
1308+
if (mlx5_core_is_ecpf_esw_manager(peer_dev) &&
1309+
mlx5_esw_host_functions_enabled(peer_dev)) {
13051310
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
13061311
mlx5_del_flow_rules(flows[peer_vport->index]);
13071312
}
@@ -4059,7 +4064,8 @@ mlx5_eswitch_vport_has_rep(const struct mlx5_eswitch *esw, u16 vport_num)
40594064
{
40604065
/* Currently, only ECPF based device has representor for host PF. */
40614066
if (vport_num == MLX5_VPORT_PF &&
4062-
!mlx5_core_is_ecpf_esw_manager(esw->dev))
4067+
(!mlx5_core_is_ecpf_esw_manager(esw->dev) ||
4068+
!mlx5_esw_host_functions_enabled(esw->dev)))
40634069
return false;
40644070

40654071
if (vport_num == MLX5_VPORT_ECPF &&

0 commit comments

Comments
 (0)