net/mlx5: DR, Pass table flags at creation to lower layer
authorErez Shitrit <erezsh@mellanox.com>
Thu, 2 Jan 2020 14:55:45 +0000 (16:55 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 7 Jan 2020 18:42:23 +0000 (10:42 -0800)
We need to have the flow-table flags when creation sw-steering tables,
this parameter exists in the layer between fs_core to sw_steering, this
patch gives it to the creation function.

Signed-off-by: Erez Shitrit <erezsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_table.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c
drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h

index 7a4e6a4..14ce2d7 100644 (file)
@@ -211,6 +211,8 @@ static int dr_table_destroy_sw_owned_tbl(struct mlx5dr_table *tbl)
 
 static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
 {
+       bool en_encap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT);
+       bool en_decap = !!(tbl->flags & MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
        struct mlx5dr_cmd_create_flow_table_attr ft_attr = {};
        u64 icm_addr_rx = 0;
        u64 icm_addr_tx = 0;
@@ -227,6 +229,8 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
        ft_attr.icm_addr_tx = icm_addr_tx;
        ft_attr.level = tbl->dmn->info.caps.max_ft_level - 1;
        ft_attr.sw_owner = true;
+       ft_attr.decap_en = en_decap;
+       ft_attr.reformat_en = en_encap;
 
        ret = mlx5dr_cmd_create_flow_table(tbl->dmn->mdev, &ft_attr,
                                           NULL, &tbl->table_id);
@@ -234,7 +238,7 @@ static int dr_table_create_sw_owned_tbl(struct mlx5dr_table *tbl)
        return ret;
 }
 
-struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level)
+struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level, u32 flags)
 {
        struct mlx5dr_table *tbl;
        int ret;
@@ -247,6 +251,7 @@ struct mlx5dr_table *mlx5dr_table_create(struct mlx5dr_domain *dmn, u32 level)
 
        tbl->dmn = dmn;
        tbl->level = level;
+       tbl->flags = flags;
        refcount_set(&tbl->refcount, 1);
 
        ret = dr_table_init(tbl);
index c37226a..de6bfa6 100644 (file)
@@ -679,6 +679,7 @@ struct mlx5dr_table {
        u32 level;
        u32 table_type;
        u32 table_id;
+       u32 flags;
        struct list_head matcher_list;
        struct mlx5dr_action *miss_action;
        refcount_t refcount;
index 3d587d0..8ed0f08 100644 (file)
@@ -74,7 +74,7 @@ static int mlx5_cmd_dr_create_flow_table(struct mlx5_flow_root_namespace *ns,
                                                                    next_ft);
 
        tbl = mlx5dr_table_create(ns->fs_dr_domain.dr_domain,
-                                 ft->level);
+                                 ft->level, ft->flags);
        if (!tbl) {
                mlx5_core_err(ns->dev, "Failed creating dr flow_table\n");
                return -EINVAL;
index adda9cb..fb3ac69 100644 (file)
@@ -46,7 +46,7 @@ void mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn,
                            struct mlx5dr_domain *peer_dmn);
 
 struct mlx5dr_table *
-mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level);
+mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags);
 
 int mlx5dr_table_destroy(struct mlx5dr_table *table);
 
@@ -131,7 +131,7 @@ mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn,
                       struct mlx5dr_domain *peer_dmn) { }
 
 static inline struct mlx5dr_table *
-mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level) { return NULL; }
+mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags) { return NULL; }
 
 static inline int
 mlx5dr_table_destroy(struct mlx5dr_table *table) { return 0; }