Changed FW FT and FTE creation to allow dynamic creation. Till now only FTE with vport destination action was supported. Also enhanced forward table creation to be generic.
Signed-off-by: Hamdan Igbaria <hamd...@nvidia.com> Reviewed-by: Alex Vesker <va...@nvidia.com> --- drivers/common/mlx5/mlx5_prm.h | 20 +++++++-- drivers/net/mlx5/hws/mlx5dr_cmd.c | 66 +++++++++++++++++------------ drivers/net/mlx5/hws/mlx5dr_cmd.h | 28 +++++++++--- drivers/net/mlx5/hws/mlx5dr_table.c | 12 ++++-- 4 files changed, 83 insertions(+), 43 deletions(-) diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h index 6b72039bdd..d6af069fae 100644 --- a/drivers/common/mlx5/mlx5_prm.h +++ b/drivers/common/mlx5/mlx5_prm.h @@ -4951,10 +4951,17 @@ struct mlx5_ifc_query_flow_table_out_bits { enum mlx5_flow_destination_type { MLX5_FLOW_DESTINATION_TYPE_VPORT = 0x0, + MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE = 0x1, }; -enum { - MLX5_FLOW_CONTEXT_ACTION_FWD_DEST = 0x4, +enum mlx5_flow_context_action { + MLX5_FLOW_CONTEXT_ACTION_FWD_DEST = 1 << 2, +}; + +enum mlx5_flow_context_flow_source { + MLX5_FLOW_CONTEXT_FLOW_SOURCE_ANY_VPORT = 0x0, + MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK = 0x1, + MLX5_FLOW_CONTEXT_FLOW_SOURCE_LOCAL_VPORT = 0x2, }; struct mlx5_ifc_set_fte_out_bits { @@ -4992,11 +4999,16 @@ struct mlx5_ifc_flow_context_bits { u8 reserved_at_60[0x10]; u8 action[0x10]; u8 extended_destination[0x1]; - u8 reserved_at_81[0x7]; + u8 reserved_at_81[0x1]; + u8 flow_source[0x2]; + u8 encrypt_decrypt_type[0x4]; u8 destination_list_size[0x18]; u8 reserved_at_a0[0x8]; u8 flow_counter_list_size[0x18]; - u8 reserved_at_c0[0x1740]; + u8 packet_reformat_id[0x20]; + u8 reserved_at_e0[0x40]; + u8 encrypt_decrypt_obj_id[0x20]; + u8 reserved_at_140[0x16c0]; /* Currently only one destnation */ union mlx5_ifc_dest_format_flow_counter_list_auto_bits destination[1]; }; diff --git a/drivers/net/mlx5/hws/mlx5dr_cmd.c b/drivers/net/mlx5/hws/mlx5dr_cmd.c index 6e7d6eb1ac..369bc8bf55 100644 --- a/drivers/net/mlx5/hws/mlx5dr_cmd.c +++ b/drivers/net/mlx5/hws/mlx5dr_cmd.c @@ -140,17 +140,18 @@ mlx5dr_cmd_flow_group_create(struct ibv_context *ctx, return devx_obj; } -static struct mlx5dr_devx_obj * -mlx5dr_cmd_set_vport_fte(struct ibv_context *ctx, - uint32_t table_type, - uint32_t table_id, - uint32_t group_id, - uint32_t vport_id) +struct mlx5dr_devx_obj * +mlx5dr_cmd_set_fte(struct ibv_context *ctx, + uint32_t table_type, + uint32_t table_id, + uint32_t group_id, + struct mlx5dr_cmd_set_fte_attr *fte_attr) { uint32_t in[MLX5_ST_SZ_DW(set_fte_in) + MLX5_ST_SZ_DW(dest_format)] = {0}; uint32_t out[MLX5_ST_SZ_DW(set_fte_out)] = {0}; struct mlx5dr_devx_obj *devx_obj; void *in_flow_context; + uint32_t action_flags; void *in_dests; devx_obj = simple_malloc(sizeof(*devx_obj)); @@ -166,50 +167,51 @@ mlx5dr_cmd_set_vport_fte(struct ibv_context *ctx, in_flow_context = MLX5_ADDR_OF(set_fte_in, in, flow_context); MLX5_SET(flow_context, in_flow_context, group_id, group_id); - MLX5_SET(flow_context, in_flow_context, destination_list_size, 1); - MLX5_SET(flow_context, in_flow_context, action, MLX5_FLOW_CONTEXT_ACTION_FWD_DEST); + MLX5_SET(flow_context, in_flow_context, flow_source, fte_attr->flow_source); + + action_flags = fte_attr->action_flags; + MLX5_SET(flow_context, in_flow_context, action, action_flags); - in_dests = MLX5_ADDR_OF(flow_context, in_flow_context, destination); - MLX5_SET(dest_format, in_dests, destination_type, - MLX5_FLOW_DESTINATION_TYPE_VPORT); - MLX5_SET(dest_format, in_dests, destination_id, vport_id); + if (action_flags & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) { + /* Only destination_list_size of size 1 is supported */ + MLX5_SET(flow_context, in_flow_context, destination_list_size, 1); + in_dests = MLX5_ADDR_OF(flow_context, in_flow_context, destination); + MLX5_SET(dest_format, in_dests, destination_type, fte_attr->destination_type); + MLX5_SET(dest_format, in_dests, destination_id, fte_attr->destination_id); + } devx_obj->obj = mlx5_glue->devx_obj_create(ctx, in, sizeof(in), out, sizeof(out)); if (!devx_obj->obj) { DR_LOG(ERR, "Failed to create FTE"); - simple_free(devx_obj); rte_errno = errno; - return NULL; + goto free_devx; } return devx_obj; -} -void mlx5dr_cmd_miss_ft_destroy(struct mlx5dr_cmd_forward_tbl *tbl) -{ - mlx5dr_cmd_destroy_obj(tbl->fte); - mlx5dr_cmd_destroy_obj(tbl->fg); - mlx5dr_cmd_destroy_obj(tbl->ft); +free_devx: + simple_free(devx_obj); + return NULL; } struct mlx5dr_cmd_forward_tbl * -mlx5dr_cmd_miss_ft_create(struct ibv_context *ctx, - struct mlx5dr_cmd_ft_create_attr *ft_attr, - uint32_t vport) +mlx5dr_cmd_forward_tbl_create(struct ibv_context *ctx, + struct mlx5dr_cmd_ft_create_attr *ft_attr, + struct mlx5dr_cmd_set_fte_attr *fte_attr) { struct mlx5dr_cmd_fg_attr fg_attr = {0}; struct mlx5dr_cmd_forward_tbl *tbl; tbl = simple_calloc(1, sizeof(*tbl)); if (!tbl) { - DR_LOG(ERR, "Failed to allocate memory for forward default"); + DR_LOG(ERR, "Failed to allocate memory"); rte_errno = ENOMEM; return NULL; } tbl->ft = mlx5dr_cmd_flow_table_create(ctx, ft_attr); if (!tbl->ft) { - DR_LOG(ERR, "Failed to create FT for miss-table"); + DR_LOG(ERR, "Failed to create FT"); goto free_tbl; } @@ -218,13 +220,13 @@ mlx5dr_cmd_miss_ft_create(struct ibv_context *ctx, tbl->fg = mlx5dr_cmd_flow_group_create(ctx, &fg_attr); if (!tbl->fg) { - DR_LOG(ERR, "Failed to create FG for miss-table"); + DR_LOG(ERR, "Failed to create FG"); goto free_ft; } - tbl->fte = mlx5dr_cmd_set_vport_fte(ctx, ft_attr->type, tbl->ft->id, tbl->fg->id, vport); + tbl->fte = mlx5dr_cmd_set_fte(ctx, ft_attr->type, tbl->ft->id, tbl->fg->id, fte_attr); if (!tbl->fte) { - DR_LOG(ERR, "Failed to create FTE for miss-table"); + DR_LOG(ERR, "Failed to create FTE"); goto free_fg; } return tbl; @@ -238,6 +240,14 @@ mlx5dr_cmd_miss_ft_create(struct ibv_context *ctx, return NULL; } +void mlx5dr_cmd_forward_tbl_destroy(struct mlx5dr_cmd_forward_tbl *tbl) +{ + mlx5dr_cmd_destroy_obj(tbl->fte); + mlx5dr_cmd_destroy_obj(tbl->fg); + mlx5dr_cmd_destroy_obj(tbl->ft); + simple_free(tbl); +} + void mlx5dr_cmd_set_attr_connect_miss_tbl(struct mlx5dr_context *ctx, uint32_t fw_ft_type, enum mlx5dr_table_type type, diff --git a/drivers/net/mlx5/hws/mlx5dr_cmd.h b/drivers/net/mlx5/hws/mlx5dr_cmd.h index 7d03f3d169..e57013c309 100644 --- a/drivers/net/mlx5/hws/mlx5dr_cmd.h +++ b/drivers/net/mlx5/hws/mlx5dr_cmd.h @@ -5,6 +5,13 @@ #ifndef MLX5DR_CMD_H_ #define MLX5DR_CMD_H_ +struct mlx5dr_cmd_set_fte_attr { + uint32_t action_flags; + uint8_t destination_type; + uint32_t destination_id; + uint8_t flow_source; +}; + struct mlx5dr_cmd_ft_create_attr { uint8_t type; uint8_t level; @@ -263,6 +270,20 @@ mlx5dr_cmd_header_modify_pattern_create(struct ibv_context *ctx, uint32_t pattern_length, uint8_t *actions); +struct mlx5dr_devx_obj * +mlx5dr_cmd_set_fte(struct ibv_context *ctx, + uint32_t table_type, + uint32_t table_id, + uint32_t group_id, + struct mlx5dr_cmd_set_fte_attr *fte_attr); + +struct mlx5dr_cmd_forward_tbl * +mlx5dr_cmd_forward_tbl_create(struct ibv_context *ctx, + struct mlx5dr_cmd_ft_create_attr *ft_attr, + struct mlx5dr_cmd_set_fte_attr *fte_attr); + +void mlx5dr_cmd_forward_tbl_destroy(struct mlx5dr_cmd_forward_tbl *tbl); + struct mlx5dr_devx_obj * mlx5dr_cmd_alias_obj_create(struct ibv_context *ctx, struct mlx5dr_cmd_alias_obj_create_attr *alias_attr); @@ -275,13 +296,6 @@ int mlx5dr_cmd_query_ib_port(struct ibv_context *ctx, int mlx5dr_cmd_query_caps(struct ibv_context *ctx, struct mlx5dr_cmd_query_caps *caps); -void mlx5dr_cmd_miss_ft_destroy(struct mlx5dr_cmd_forward_tbl *tbl); - -struct mlx5dr_cmd_forward_tbl * -mlx5dr_cmd_miss_ft_create(struct ibv_context *ctx, - struct mlx5dr_cmd_ft_create_attr *ft_attr, - uint32_t vport); - void mlx5dr_cmd_set_attr_connect_miss_tbl(struct mlx5dr_context *ctx, uint32_t fw_ft_type, enum mlx5dr_table_type type, diff --git a/drivers/net/mlx5/hws/mlx5dr_table.c b/drivers/net/mlx5/hws/mlx5dr_table.c index 327e2ec710..8474a9cf61 100644 --- a/drivers/net/mlx5/hws/mlx5dr_table.c +++ b/drivers/net/mlx5/hws/mlx5dr_table.c @@ -20,6 +20,7 @@ static int mlx5dr_table_up_default_fdb_miss_tbl(struct mlx5dr_table *tbl) { struct mlx5dr_cmd_ft_create_attr ft_attr = {0}; + struct mlx5dr_cmd_set_fte_attr fte_attr = {0}; struct mlx5dr_cmd_forward_tbl *default_miss; struct mlx5dr_context *ctx = tbl->ctx; uint8_t tbl_type = tbl->type; @@ -40,8 +41,12 @@ mlx5dr_table_up_default_fdb_miss_tbl(struct mlx5dr_table *tbl) assert(ctx->caps->eswitch_manager); vport = ctx->caps->eswitch_manager_vport_number; - default_miss = mlx5dr_cmd_miss_ft_create(mlx5dr_context_get_local_ibv(ctx), - &ft_attr, vport); + fte_attr.action_flags = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST; + fte_attr.destination_type = MLX5_FLOW_DESTINATION_TYPE_VPORT; + fte_attr.destination_id = vport; + + default_miss = mlx5dr_cmd_forward_tbl_create(mlx5dr_context_get_local_ibv(ctx), + &ft_attr, &fte_attr); if (!default_miss) { DR_LOG(ERR, "Failed to default miss table type: 0x%x", tbl_type); return rte_errno; @@ -66,9 +71,8 @@ static void mlx5dr_table_down_default_fdb_miss_tbl(struct mlx5dr_table *tbl) if (--default_miss->refcount) return; - mlx5dr_cmd_miss_ft_destroy(default_miss); + mlx5dr_cmd_forward_tbl_destroy(default_miss); - simple_free(default_miss); ctx->common_res[tbl_type].default_miss = NULL; } -- 2.26.3