Commit cd56f929 authored by Vu Pham's avatar Vu Pham Committed by Saeed Mahameed
Browse files

net/mlx5: E-Switch, Replace host_params event with functions_changed event



To support sriov on a E-Switch manager, num_vfs are queried
to the firmware whenever E-Switch manager is notified by
esw_functions_changed event.

Replace host_params event with esw_functions_changed event that reflects
more appropriate naming.

While at it, also correct num_vfs type from int to u16 as expected by
the function mlx5_esw_query_functions().

Signed-off-by: default avatarVu Pham <vuhuong@mellanox.com>
Reviewed-by: default avatarParav Pandit <parav@mellanox.com>
Reviewed-by: default avatarBodong Wang <bodong@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent c6d4e45d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -316,7 +316,7 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
	case MLX5_CMD_OP_DESTROY_GENERAL_OBJECT:
	case MLX5_CMD_OP_DEALLOC_MEMIC:
	case MLX5_CMD_OP_PAGE_FAULT_RESUME:
	case MLX5_CMD_OP_QUERY_HOST_PARAMS:
	case MLX5_CMD_OP_QUERY_ESW_FUNCTIONS:
		return MLX5_CMD_STAT_OK;

	case MLX5_CMD_OP_QUERY_HCA_CAP:
@@ -628,7 +628,7 @@ const char *mlx5_command_str(int command)
	MLX5_COMMAND_STR_CASE(QUERY_MODIFY_HEADER_CONTEXT);
	MLX5_COMMAND_STR_CASE(ALLOC_MEMIC);
	MLX5_COMMAND_STR_CASE(DEALLOC_MEMIC);
	MLX5_COMMAND_STR_CASE(QUERY_HOST_PARAMS);
	MLX5_COMMAND_STR_CASE(QUERY_ESW_FUNCTIONS);
	default: return "unknown command opcode";
	}
}
+0 −27
Original line number Diff line number Diff line
@@ -83,30 +83,3 @@ void mlx5_ec_cleanup(struct mlx5_core_dev *dev)

	mlx5_peer_pf_cleanup(dev);
}

static int mlx5_query_host_params_context(struct mlx5_core_dev *dev,
					  u32 *out, int outlen)
{
	u32 in[MLX5_ST_SZ_DW(query_host_params_in)] = {};

	MLX5_SET(query_host_params_in, in, opcode,
		 MLX5_CMD_OP_QUERY_HOST_PARAMS);

	return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen);
}

int mlx5_query_host_params_num_vfs(struct mlx5_core_dev *dev, int *num_vf)
{
	u32 out[MLX5_ST_SZ_DW(query_host_params_out)] = {};
	int err;

	err = mlx5_query_host_params_context(dev, out, sizeof(out));
	if (err)
		return err;

	*num_vf = MLX5_GET(query_host_params_out, out,
			   host_params_context.host_num_of_vfs);
	mlx5_core_dbg(dev, "host_num_of_vfs %d\n", *num_vf);

	return 0;
}
+0 −4
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@ enum {
bool mlx5_read_embedded_cpu(struct mlx5_core_dev *dev);
int mlx5_ec_init(struct mlx5_core_dev *dev);
void mlx5_ec_cleanup(struct mlx5_core_dev *dev);
int mlx5_query_host_params_num_vfs(struct mlx5_core_dev *dev, int *num_vf);

#else  /* CONFIG_MLX5_ESWITCH */

@@ -24,9 +23,6 @@ static inline bool
mlx5_read_embedded_cpu(struct mlx5_core_dev *dev) { return false; }
static inline int mlx5_ec_init(struct mlx5_core_dev *dev) { return 0; }
static inline void mlx5_ec_cleanup(struct mlx5_core_dev *dev) {}
static inline int
mlx5_query_host_params_num_vfs(struct mlx5_core_dev *dev, int *num_vf)
{ return -EOPNOTSUPP; }

#endif /* CONFIG_MLX5_ESWITCH */

+2 −1
Original line number Diff line number Diff line
@@ -534,7 +534,8 @@ static u64 gather_async_events_mask(struct mlx5_core_dev *dev)
		async_event_mask |= (1ull << MLX5_EVENT_TYPE_MONITOR_COUNTER);

	if (mlx5_core_is_ecpf_esw_manager(dev))
		async_event_mask |= (1ull << MLX5_EVENT_TYPE_HOST_PARAMS_CHANGE);
		async_event_mask |=
			(1ull << MLX5_EVENT_TYPE_ESW_FUNCTIONS_CHANGED);

	return async_event_mask;
}
+30 −2
Original line number Diff line number Diff line
@@ -1686,13 +1686,41 @@ static int eswitch_vport_event(struct notifier_block *nb,
	return NOTIFY_OK;
}

static int query_esw_functions(struct mlx5_core_dev *dev,
			       u32 *out, int outlen)
{
	u32 in[MLX5_ST_SZ_DW(query_esw_functions_in)] = {0};

	MLX5_SET(query_esw_functions_in, in, opcode,
		 MLX5_CMD_OP_QUERY_ESW_FUNCTIONS);

	return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen);
}

int mlx5_esw_query_functions(struct mlx5_core_dev *dev, u16 *num_vfs)
{
	u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {0};
	int err;

	err = query_esw_functions(dev, out, sizeof(out));
	if (err)
		return err;

	*num_vfs = MLX5_GET(query_esw_functions_out, out,
			    host_params_context.host_num_of_vfs);
	esw_debug(dev, "host_num_of_vfs=%d\n", *num_vfs);

	return 0;
}

/* Public E-Switch API */
#define ESW_ALLOWED(esw) ((esw) && MLX5_ESWITCH_MANAGER((esw)->dev))

int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode)
{
	int vf_nvports = 0, total_nvports = 0;
	struct mlx5_vport *vport;
	int total_nvports = 0;
	u16 vf_nvports = 0;
	int err;
	int i, enabled_events;

@@ -1712,7 +1740,7 @@ int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode)

	if (mode == SRIOV_OFFLOADS) {
		if (mlx5_core_is_ecpf_esw_manager(esw->dev)) {
			err = mlx5_query_host_params_num_vfs(esw->dev, &vf_nvports);
			err = mlx5_esw_query_functions(esw->dev, &vf_nvports);
			if (err)
				return err;
			total_nvports = esw->total_vports;
Loading