From: Erez Shitrit <ere...@nvidia.com> Take care of table creation from one of the new types that now exposed to the user (FDB_RX, FDB_TX and FDB_UNIFIED)
Signed-off-by: Erez Shitrit <ere...@nvidia.com> Signed-off-by: Hamdan Igbaria <hamd...@nvidia.com> Acked-by: Matan Azrad <ma...@nvidia.com> --- drivers/net/mlx5/hws/mlx5dr_action.c | 6 ++--- drivers/net/mlx5/hws/mlx5dr_cmd.c | 4 ++-- drivers/net/mlx5/hws/mlx5dr_table.c | 35 ++++++++++++++++++++-------- drivers/net/mlx5/hws/mlx5dr_table.h | 20 ++++++++++++++++ 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/drivers/net/mlx5/hws/mlx5dr_action.c b/drivers/net/mlx5/hws/mlx5dr_action.c index b038ca6879..8e95abf7da 100644 --- a/drivers/net/mlx5/hws/mlx5dr_action.c +++ b/drivers/net/mlx5/hws/mlx5dr_action.c @@ -801,7 +801,7 @@ mlx5dr_action_fixup_stc_attr(struct mlx5dr_context *ctx, break; case MLX5_IFC_STC_ACTION_TYPE_ALLOW: - if (fw_tbl_type == FS_FT_FDB_TX || fw_tbl_type == FS_FT_FDB_RX) { + if (mlx5dr_table_is_fw_fdb_any(fw_tbl_type)) { fixup_stc_attr->action_type = MLX5_IFC_STC_ACTION_TYPE_JUMP_TO_VPORT; fixup_stc_attr->action_offset = stc_attr->action_offset; fixup_stc_attr->stc_offset = stc_attr->stc_offset; @@ -817,8 +817,8 @@ mlx5dr_action_fixup_stc_attr(struct mlx5dr_context *ctx, if (stc_attr->vport.vport_num != WIRE_PORT) break; - if (fw_tbl_type == FS_FT_FDB_TX || fw_tbl_type == FS_FT_FDB_RX) { - /*The FW doesn't allow to go to wire in the TX/RX by JUMP_TO_VPORT*/ + if (mlx5dr_table_is_fw_fdb_any(fw_tbl_type)) { + /* The FW doesn't allow to go to wire in the TX/RX by JUMP_TO_VPORT */ fixup_stc_attr->action_type = MLX5_IFC_STC_ACTION_TYPE_JUMP_TO_UPLINK; fixup_stc_attr->action_offset = stc_attr->action_offset; fixup_stc_attr->stc_offset = stc_attr->stc_offset; diff --git a/drivers/net/mlx5/hws/mlx5dr_cmd.c b/drivers/net/mlx5/hws/mlx5dr_cmd.c index 8a788709b5..f609135ccb 100644 --- a/drivers/net/mlx5/hws/mlx5dr_cmd.c +++ b/drivers/net/mlx5/hws/mlx5dr_cmd.c @@ -328,14 +328,14 @@ void mlx5dr_cmd_set_attr_connect_miss_tbl(struct mlx5dr_context *ctx, { struct mlx5dr_devx_obj *default_miss_tbl; - if (type != MLX5DR_TABLE_TYPE_FDB && !mlx5dr_context_shared_gvmi_used(ctx)) + if (!mlx5dr_table_is_fdb_any(type) && !mlx5dr_context_shared_gvmi_used(ctx)) return; ft_attr->modify_fs = MLX5_IFC_MODIFY_FLOW_TABLE_MISS_ACTION; ft_attr->type = fw_ft_type; ft_attr->table_miss_action = MLX5_IFC_MODIFY_FLOW_TABLE_MISS_ACTION_GOTO_TBL; - if (type == MLX5DR_TABLE_TYPE_FDB) { + if (mlx5dr_table_is_fdb_any(type)) { default_miss_tbl = ctx->common_res[type].default_miss->ft; if (!default_miss_tbl) { assert(false); diff --git a/drivers/net/mlx5/hws/mlx5dr_table.c b/drivers/net/mlx5/hws/mlx5dr_table.c index d0df40a6c1..b371f420e6 100644 --- a/drivers/net/mlx5/hws/mlx5dr_table.c +++ b/drivers/net/mlx5/hws/mlx5dr_table.c @@ -8,7 +8,7 @@ static void mlx5dr_table_init_next_ft_attr(struct mlx5dr_table *tbl, struct mlx5dr_cmd_ft_create_attr *ft_attr) { ft_attr->type = tbl->fw_ft_type; - if (tbl->type == MLX5DR_TABLE_TYPE_FDB) + if (mlx5dr_table_is_fdb_any(tbl->type)) ft_attr->level = tbl->ctx->caps->fdb_ft.max_level - 1; else ft_attr->level = tbl->ctx->caps->nic_ft.max_level - 1; @@ -26,7 +26,7 @@ mlx5dr_table_up_default_fdb_miss_tbl(struct mlx5dr_table *tbl) struct mlx5dr_context *ctx = tbl->ctx; uint8_t tbl_type = tbl->type; - if (tbl->type != MLX5DR_TABLE_TYPE_FDB) + if (!mlx5dr_table_is_fdb_any(tbl_type)) return 0; if (ctx->common_res[tbl_type].default_miss) { @@ -63,7 +63,7 @@ static void mlx5dr_table_down_default_fdb_miss_tbl(struct mlx5dr_table *tbl) struct mlx5dr_context *ctx = tbl->ctx; uint8_t tbl_type = tbl->type; - if (tbl->type != MLX5DR_TABLE_TYPE_FDB) + if (!mlx5dr_table_is_fdb_any(tbl->type)) return; default_miss = ctx->common_res[tbl_type].default_miss; @@ -81,7 +81,7 @@ mlx5dr_table_connect_to_default_miss_tbl(struct mlx5dr_table *tbl, struct mlx5dr_cmd_ft_modify_attr ft_attr = {0}; int ret; - assert(tbl->type == MLX5DR_TABLE_TYPE_FDB); + assert(mlx5dr_table_is_fdb_any(tbl->type)); mlx5dr_cmd_set_attr_connect_miss_tbl(tbl->ctx, tbl->fw_ft_type, @@ -109,16 +109,18 @@ mlx5dr_table_create_default_ft(struct ibv_context *ibv, mlx5dr_table_init_next_ft_attr(tbl, &ft_attr); ft_obj = mlx5dr_cmd_flow_table_create(ibv, &ft_attr); - if (ft_obj && tbl->type == MLX5DR_TABLE_TYPE_FDB) { + if (ft_obj && mlx5dr_table_is_fdb_any(tbl->type)) { /* Take/create ref over the default miss */ ret = mlx5dr_table_up_default_fdb_miss_tbl(tbl); if (ret) { - DR_LOG(ERR, "Failed to get default fdb miss"); + DR_LOG(ERR, "Failed to get default fdb miss for type: %d\n", + tbl->type); goto free_ft_obj; } ret = mlx5dr_table_connect_to_default_miss_tbl(tbl, ft_obj); if (ret) { - DR_LOG(ERR, "Failed connecting to default miss tbl"); + DR_LOG(ERR, "Failed connecting to default miss tbl (type: %d)", + tbl->type); goto down_miss_tbl; } } @@ -142,7 +144,7 @@ mlx5dr_table_init_check_hws_support(struct mlx5dr_context *ctx, return rte_errno; } - if (mlx5dr_context_shared_gvmi_used(ctx) && tbl->type == MLX5DR_TABLE_TYPE_FDB) { + if (mlx5dr_context_shared_gvmi_used(ctx) && mlx5dr_table_is_fdb_any(tbl->type)) { DR_LOG(ERR, "FDB with shared port resources is not supported"); rte_errno = EOPNOTSUPP; return rte_errno; @@ -380,11 +382,24 @@ struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_context *ctx, struct mlx5dr_table *tbl; int ret; - if (attr->type > MLX5DR_TABLE_TYPE_FDB) { + if (attr->type >= MLX5DR_TABLE_TYPE_MAX) { DR_LOG(ERR, "Invalid table type %d", attr->type); return NULL; } + if (attr->type == MLX5DR_TABLE_TYPE_FDB_UNIFIED && !ctx->caps->fdb_unified_en) { + DR_LOG(ERR, "Table type %d not supported by current FW", attr->type); + rte_errno = ENOTSUP; + return NULL; + } + + if ((mlx5dr_table_is_fdb_any(attr->type) && attr->type != MLX5DR_TABLE_TYPE_FDB) && + !attr->level) { + DR_LOG(ERR, "Table type %d not supported by root table", attr->type); + rte_errno = ENOTSUP; + return NULL; + } + tbl = simple_calloc(1, sizeof(*tbl)); if (!tbl) { rte_errno = ENOMEM; @@ -464,7 +479,7 @@ int mlx5dr_table_ft_set_default_next_ft(struct mlx5dr_table *tbl, if (!tbl->ctx->caps->nic_ft.ignore_flow_level_rtc_valid) return 0; - if (tbl->type == MLX5DR_TABLE_TYPE_FDB) + if (mlx5dr_table_is_fdb_any(tbl->type)) return mlx5dr_table_connect_to_default_miss_tbl(tbl, ft_obj); ft_attr.type = tbl->fw_ft_type; diff --git a/drivers/net/mlx5/hws/mlx5dr_table.h b/drivers/net/mlx5/hws/mlx5dr_table.h index 1c0eb6adf8..6996a90d9b 100644 --- a/drivers/net/mlx5/hws/mlx5dr_table.h +++ b/drivers/net/mlx5/hws/mlx5dr_table.h @@ -28,6 +28,26 @@ struct mlx5dr_table { struct mlx5dr_default_miss default_miss; }; +static inline bool mlx5dr_table_is_fw_fdb_any(uint32_t fw_tbl_type) +{ + if (fw_tbl_type == FS_FT_FDB_TX || fw_tbl_type == FS_FT_FDB_RX || + fw_tbl_type == FS_FT_FDB_UNIFIED) + return true; + + return false; +} + +static inline bool mlx5dr_table_is_fdb_any(enum mlx5dr_table_type tbl_type) +{ + if (tbl_type == MLX5DR_TABLE_TYPE_FDB || + tbl_type == MLX5DR_TABLE_TYPE_FDB_TX || + tbl_type == MLX5DR_TABLE_TYPE_FDB_RX || + tbl_type == MLX5DR_TABLE_TYPE_FDB_UNIFIED) + return true; + + return false; +} + static inline uint32_t mlx5dr_table_get_res_fw_ft_type(enum mlx5dr_table_type tbl_type, bool is_mirror) -- 2.21.0