Add the support for query FT command.
Use the query FT command to dump the ICM
addresses of table start anchor and matcher
end anchor.

Signed-off-by: Hamdan Igbaria <hamd...@nvidia.com>
Reviewed-by: Alex Vesker <va...@nvidia.com>
---
 drivers/common/mlx5/mlx5_prm.h      | 50 ++++++++++++++++++++---
 drivers/net/mlx5/hws/mlx5dr_cmd.c   | 28 +++++++++++++
 drivers/net/mlx5/hws/mlx5dr_cmd.h   |  9 +++++
 drivers/net/mlx5/hws/mlx5dr_debug.c | 62 ++++++++++++++++++++++++++---
 drivers/net/mlx5/hws/mlx5dr_debug.h |  6 +++
 5 files changed, 144 insertions(+), 11 deletions(-)

diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
index 4b0a56f4e5..6b72039bdd 100644
--- a/drivers/common/mlx5/mlx5_prm.h
+++ b/drivers/common/mlx5/mlx5_prm.h
@@ -1156,6 +1156,7 @@ enum {
        MLX5_CMD_OP_CREATE_RQT = 0x916,
        MLX5_CMD_OP_MODIFY_RQT = 0x917,
        MLX5_CMD_OP_CREATE_FLOW_TABLE = 0x930,
+       MLX5_CMD_OP_QUERY_FLOW_TABLE = 0x932,
        MLX5_CMD_OP_CREATE_FLOW_GROUP = 0x933,
        MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY = 0x936,
        MLX5_CMD_OP_MODIFY_FLOW_TABLE = 0x93c,
@@ -4872,11 +4873,17 @@ struct mlx5_ifc_flow_table_context_bits {
 
        u8 reserved_at_60[0x60];
 
-       u8 rtc_id_0[0x20];
-
-       u8 rtc_id_1[0x20];
-
-       u8 reserved_at_100[0x40];
+       union {
+               struct {
+                       u8 rtc_id_0[0x20];
+                       u8 rtc_id_1[0x20];
+                       u8 reserved_at_100[0x40];
+               };
+               struct {
+                       u8 sw_owner_icm_root_1[0x40];
+                       u8 sw_owner_icm_root_0[0x40];
+               };
+       };
 };
 
 struct mlx5_ifc_create_flow_table_in_bits {
@@ -4909,6 +4916,39 @@ struct mlx5_ifc_create_flow_table_out_bits {
        u8 icm_address_31_0[0x20];
 };
 
+struct mlx5_ifc_query_flow_table_in_bits {
+       u8 opcode[0x10];
+       u8 uid[0x10];
+
+       u8 vhca_tunnel_id[0x10];
+       u8 op_mod[0x10];
+
+       u8 other_vport[0x1];
+       u8 reserved_at_41[0xf];
+       u8 vport_number[0x10];
+
+       u8 reserved_at_60[0x20];
+
+       u8 table_type[0x8];
+       u8 reserved_at_88[0x18];
+
+       u8 reserved_at_a0[0x8];
+       u8 table_id[0x18];
+
+       u8 reserved_at_c0[0x140];
+};
+
+struct mlx5_ifc_query_flow_table_out_bits {
+       u8 status[0x8];
+       u8 reserved_at_8[0x18];
+
+       u8 syndrome[0x20];
+
+       u8 reserved_at_40[0x80];
+
+       struct mlx5_ifc_flow_table_context_bits flow_table_context;
+};
+
 enum mlx5_flow_destination_type {
        MLX5_FLOW_DESTINATION_TYPE_VPORT = 0x0,
 };
diff --git a/drivers/net/mlx5/hws/mlx5dr_cmd.c 
b/drivers/net/mlx5/hws/mlx5dr_cmd.c
index a444fb4438..6e7d6eb1ac 100644
--- a/drivers/net/mlx5/hws/mlx5dr_cmd.c
+++ b/drivers/net/mlx5/hws/mlx5dr_cmd.c
@@ -80,6 +80,34 @@ mlx5dr_cmd_flow_table_modify(struct mlx5dr_devx_obj 
*devx_obj,
        return ret;
 }
 
+int
+mlx5dr_cmd_flow_table_query(struct mlx5dr_devx_obj *devx_obj,
+                           struct mlx5dr_cmd_ft_query_attr *ft_attr,
+                           uint64_t *icm_addr_0, uint64_t *icm_addr_1)
+{
+       uint32_t out[MLX5_ST_SZ_DW(query_flow_table_out)] = {0};
+       uint32_t in[MLX5_ST_SZ_DW(query_flow_table_in)] = {0};
+       void *ft_ctx;
+       int ret;
+
+       MLX5_SET(query_flow_table_in, in, opcode, MLX5_CMD_OP_QUERY_FLOW_TABLE);
+       MLX5_SET(query_flow_table_in, in, table_type, ft_attr->type);
+       MLX5_SET(query_flow_table_in, in, table_id, devx_obj->id);
+
+       ret = mlx5_glue->devx_obj_query(devx_obj->obj, in, sizeof(in), out, 
sizeof(out));
+       if (ret) {
+               DR_LOG(ERR, "Failed to query FT");
+               rte_errno = errno;
+               return ret;
+       }
+
+       ft_ctx = MLX5_ADDR_OF(query_flow_table_out, out, flow_table_context);
+       *icm_addr_0 = MLX5_GET64(flow_table_context, ft_ctx, 
sw_owner_icm_root_0);
+       *icm_addr_1 = MLX5_GET64(flow_table_context, ft_ctx, 
sw_owner_icm_root_1);
+
+       return ret;
+}
+
 static struct mlx5dr_devx_obj *
 mlx5dr_cmd_flow_group_create(struct ibv_context *ctx,
                             struct mlx5dr_cmd_fg_attr *fg_attr)
diff --git a/drivers/net/mlx5/hws/mlx5dr_cmd.h 
b/drivers/net/mlx5/hws/mlx5dr_cmd.h
index 3f40c085be..7d03f3d169 100644
--- a/drivers/net/mlx5/hws/mlx5dr_cmd.h
+++ b/drivers/net/mlx5/hws/mlx5dr_cmd.h
@@ -22,6 +22,10 @@ struct mlx5dr_cmd_ft_modify_attr {
        uint64_t modify_fs;
 };
 
+struct mlx5dr_cmd_ft_query_attr {
+       uint8_t type;
+};
+
 struct mlx5dr_cmd_fg_attr {
        uint32_t table_id;
        uint32_t table_type;
@@ -215,6 +219,11 @@ int
 mlx5dr_cmd_flow_table_modify(struct mlx5dr_devx_obj *devx_obj,
                             struct mlx5dr_cmd_ft_modify_attr *ft_attr);
 
+int
+mlx5dr_cmd_flow_table_query(struct mlx5dr_devx_obj *devx_obj,
+                           struct mlx5dr_cmd_ft_query_attr *ft_attr,
+                           uint64_t *icm_addr_0, uint64_t *icm_addr_1);
+
 struct mlx5dr_devx_obj *
 mlx5dr_cmd_rtc_create(struct ibv_context *ctx,
                      struct mlx5dr_cmd_rtc_create_attr *rtc_attr);
diff --git a/drivers/net/mlx5/hws/mlx5dr_debug.c 
b/drivers/net/mlx5/hws/mlx5dr_debug.c
index e29122aa98..c49b504317 100644
--- a/drivers/net/mlx5/hws/mlx5dr_debug.c
+++ b/drivers/net/mlx5/hws/mlx5dr_debug.c
@@ -198,9 +198,12 @@ static int mlx5dr_debug_dump_matcher(FILE *f, struct 
mlx5dr_matcher *matcher)
        bool is_shared = mlx5dr_context_shared_gvmi_used(matcher->tbl->ctx);
        bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL;
        enum mlx5dr_table_type tbl_type = matcher->tbl->type;
+       struct mlx5dr_cmd_ft_query_attr ft_attr = {0};
        struct mlx5dr_devx_obj *ste_0, *ste_1 = NULL;
        struct mlx5dr_pool_chunk *ste;
        struct mlx5dr_pool *ste_pool;
+       uint64_t icm_addr_0 = 0;
+       uint64_t icm_addr_1 = 0;
        int ret;
 
        ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,0x%" PRIx64,
@@ -243,13 +246,25 @@ static int mlx5dr_debug_dump_matcher(FILE *f, struct 
mlx5dr_matcher *matcher)
                ste_1 = NULL;
        }
 
-       ret = fprintf(f, ",%d,%d,%d,%d,%d\n",
+       if (!is_root) {
+               ft_attr.type = matcher->tbl->fw_ft_type;
+               ret = mlx5dr_cmd_flow_table_query(matcher->end_ft,
+                                                 &ft_attr,
+                                                 &icm_addr_0,
+                                                 &icm_addr_1);
+               if (ret)
+                       return ret;
+       }
+
+       ret = fprintf(f, ",%d,%d,%d,%d,%d,0x%" PRIx64 ",0x%" PRIx64 "\n",
                      matcher->action_ste.rtc_0 ? matcher->action_ste.rtc_0->id 
: 0,
                      ste_0 ? (int)ste_0->id : -1,
                      matcher->action_ste.rtc_1 ? matcher->action_ste.rtc_1->id 
: 0,
                      ste_1 ? (int)ste_1->id : -1,
                      is_shared && !is_root ?
-                     matcher->match_ste.aliased_rtc_0->id : 0);
+                     matcher->match_ste.aliased_rtc_0->id : 0,
+                     mlx5dr_debug_icm_to_idx(icm_addr_0),
+                     mlx5dr_debug_icm_to_idx(icm_addr_1));
        if (ret < 0)
                goto out_err;
 
@@ -276,10 +291,15 @@ static int mlx5dr_debug_dump_table(FILE *f, struct 
mlx5dr_table *tbl)
 {
        bool is_shared = mlx5dr_context_shared_gvmi_used(tbl->ctx);
        bool is_root = tbl->level == MLX5DR_ROOT_LEVEL;
+       struct mlx5dr_cmd_ft_query_attr ft_attr = {0};
        struct mlx5dr_matcher *matcher;
+       uint64_t local_icm_addr_0 = 0;
+       uint64_t local_icm_addr_1 = 0;
+       uint64_t icm_addr_0 = 0;
+       uint64_t icm_addr_1 = 0;
        int ret;
 
-       ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d,%d,%d\n",
+       ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d,%d,%d",
                      MLX5DR_DEBUG_RES_TYPE_TABLE,
                      (uint64_t)(uintptr_t)tbl,
                      (uint64_t)(uintptr_t)tbl->ctx,
@@ -288,11 +308,37 @@ static int mlx5dr_debug_dump_table(FILE *f, struct 
mlx5dr_table *tbl)
                      is_root ? 0 : tbl->fw_ft_type,
                      tbl->level,
                      is_shared && !is_root ? tbl->local_ft->id : 0);
-       if (ret < 0) {
-               rte_errno = EINVAL;
-               return rte_errno;
+       if (ret < 0)
+               goto out_err;
+
+       if (!is_root) {
+               ft_attr.type = tbl->fw_ft_type;
+               ret = mlx5dr_cmd_flow_table_query(tbl->ft,
+                                                 &ft_attr,
+                                                 &icm_addr_0,
+                                                 &icm_addr_1);
+               if (ret)
+                       return ret;
+
+               if (is_shared) {
+                       ft_attr.type = tbl->fw_ft_type;
+                       ret = mlx5dr_cmd_flow_table_query(tbl->local_ft,
+                                                         &ft_attr,
+                                                         &local_icm_addr_0,
+                                                         &local_icm_addr_1);
+                       if (ret)
+                               return ret;
+               }
        }
 
+       ret = fprintf(f, ",0x%" PRIx64 ",0x%" PRIx64 ",0x%" PRIx64 ",0x%" 
PRIx64 "\n",
+                     mlx5dr_debug_icm_to_idx(icm_addr_0),
+                     mlx5dr_debug_icm_to_idx(icm_addr_1),
+                     mlx5dr_debug_icm_to_idx(local_icm_addr_0),
+                     mlx5dr_debug_icm_to_idx(local_icm_addr_1));
+       if (ret < 0)
+               goto out_err;
+
        LIST_FOREACH(matcher, &tbl->head, next) {
                ret = mlx5dr_debug_dump_matcher(f, matcher);
                if (ret)
@@ -300,6 +346,10 @@ static int mlx5dr_debug_dump_table(FILE *f, struct 
mlx5dr_table *tbl)
        }
 
        return 0;
+
+out_err:
+       rte_errno = EINVAL;
+       return rte_errno;
 }
 
 static int
diff --git a/drivers/net/mlx5/hws/mlx5dr_debug.h 
b/drivers/net/mlx5/hws/mlx5dr_debug.h
index 0f88e73186..5cffdb10b5 100644
--- a/drivers/net/mlx5/hws/mlx5dr_debug.h
+++ b/drivers/net/mlx5/hws/mlx5dr_debug.h
@@ -26,6 +26,12 @@ enum mlx5dr_debug_res_type {
        MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_RANGE_DEFINER = 4206,
 };
 
+static inline uint64_t
+mlx5dr_debug_icm_to_idx(uint64_t icm_addr)
+{
+       return (icm_addr >> 6) & 0xffffffff;
+}
+
 const char *mlx5dr_debug_action_type_to_str(enum mlx5dr_action_type 
action_type);
 
 #endif /* MLX5DR_DEBUG_H_ */
-- 
2.26.3

Reply via email to