xref: /dpdk/drivers/net/mlx5/hws/mlx5dr_debug.c (revision a2ea62bc0e531a45dfb882d98c26f76eff0cbb8a)
178580cf4SHamdan Igbaria /* SPDX-License-Identifier: BSD-3-Clause
278580cf4SHamdan Igbaria  * Copyright (c) 2022 NVIDIA Corporation & Affiliates
378580cf4SHamdan Igbaria  */
478580cf4SHamdan Igbaria 
578580cf4SHamdan Igbaria #include "mlx5dr_internal.h"
678580cf4SHamdan Igbaria 
778580cf4SHamdan Igbaria const char *mlx5dr_debug_action_type_str[] = {
878580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_LAST] = "LAST",
978580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_TNL_L2_TO_L2] = "TNL_L2_TO_L2",
1078580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_L2_TO_TNL_L2] = "L2_TO_TNL_L2",
1178580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_TNL_L3_TO_L2] = "TNL_L3_TO_L2",
1278580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_L2_TO_TNL_L3] = "L2_TO_TNL_L3",
1378580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_DROP] = "DROP",
1478580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_TIR] = "TIR",
1578580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_FT] = "FT",
1678580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_CTR] = "CTR",
1778580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_TAG] = "TAG",
1878580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_MODIFY_HDR] = "MODIFY_HDR",
1978580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_VPORT] = "VPORT",
2078580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_MISS] = "DEFAULT_MISS",
2178580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_POP_VLAN] = "POP_VLAN",
2278580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_PUSH_VLAN] = "PUSH_VLAN",
2378580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_ASO_METER] = "ASO_METER",
2478580cf4SHamdan Igbaria 	[MLX5DR_ACTION_TYP_ASO_CT] = "ASO_CT",
2578580cf4SHamdan Igbaria };
2678580cf4SHamdan Igbaria 
2778580cf4SHamdan Igbaria static_assert(ARRAY_SIZE(mlx5dr_debug_action_type_str) == MLX5DR_ACTION_TYP_MAX,
2878580cf4SHamdan Igbaria 	      "Missing mlx5dr_debug_action_type_str");
2978580cf4SHamdan Igbaria 
3078580cf4SHamdan Igbaria const char *mlx5dr_debug_action_type_to_str(enum mlx5dr_action_type action_type)
3178580cf4SHamdan Igbaria {
3278580cf4SHamdan Igbaria 	return mlx5dr_debug_action_type_str[action_type];
3378580cf4SHamdan Igbaria }
3478580cf4SHamdan Igbaria 
3578580cf4SHamdan Igbaria static int
3678580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_template_definer(FILE *f,
37d6c69bcaSAlex Vesker 					   void *parent_obj,
38d6c69bcaSAlex Vesker 					   struct mlx5dr_definer *definer,
39d6c69bcaSAlex Vesker 					   enum mlx5dr_debug_res_type type)
4078580cf4SHamdan Igbaria {
4178580cf4SHamdan Igbaria 	int i, ret;
4278580cf4SHamdan Igbaria 
43d6c69bcaSAlex Vesker 	if (!definer)
44d6c69bcaSAlex Vesker 		return 0;
45d6c69bcaSAlex Vesker 
4678580cf4SHamdan Igbaria 	ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,",
47d6c69bcaSAlex Vesker 		      type,
4878580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)definer,
49d6c69bcaSAlex Vesker 		      (uint64_t)(uintptr_t)parent_obj,
5078580cf4SHamdan Igbaria 		      definer->obj->id,
5178580cf4SHamdan Igbaria 		      definer->type);
5278580cf4SHamdan Igbaria 	if (ret < 0) {
5378580cf4SHamdan Igbaria 		rte_errno = EINVAL;
5478580cf4SHamdan Igbaria 		return rte_errno;
5578580cf4SHamdan Igbaria 	}
5678580cf4SHamdan Igbaria 
5778580cf4SHamdan Igbaria 	for (i = 0; i < DW_SELECTORS; i++) {
5878580cf4SHamdan Igbaria 		ret = fprintf(f, "0x%x%s", definer->dw_selector[i],
5978580cf4SHamdan Igbaria 			      (i == DW_SELECTORS - 1) ? "," : "-");
6078580cf4SHamdan Igbaria 		if (ret < 0) {
6178580cf4SHamdan Igbaria 			rte_errno = EINVAL;
6278580cf4SHamdan Igbaria 			return rte_errno;
6378580cf4SHamdan Igbaria 		}
6478580cf4SHamdan Igbaria 	}
6578580cf4SHamdan Igbaria 
6678580cf4SHamdan Igbaria 	for (i = 0; i < BYTE_SELECTORS; i++) {
6778580cf4SHamdan Igbaria 		ret = fprintf(f, "0x%x%s", definer->byte_selector[i],
6878580cf4SHamdan Igbaria 			      (i == BYTE_SELECTORS - 1) ? "," : "-");
6978580cf4SHamdan Igbaria 		if (ret < 0) {
7078580cf4SHamdan Igbaria 			rte_errno = EINVAL;
7178580cf4SHamdan Igbaria 			return rte_errno;
7278580cf4SHamdan Igbaria 		}
7378580cf4SHamdan Igbaria 	}
7478580cf4SHamdan Igbaria 
7578580cf4SHamdan Igbaria 	for (i = 0; i < MLX5DR_JUMBO_TAG_SZ; i++) {
7678580cf4SHamdan Igbaria 		ret = fprintf(f, "%02x", definer->mask.jumbo[i]);
7778580cf4SHamdan Igbaria 		if (ret < 0) {
7878580cf4SHamdan Igbaria 			rte_errno = EINVAL;
7978580cf4SHamdan Igbaria 			return rte_errno;
8078580cf4SHamdan Igbaria 		}
8178580cf4SHamdan Igbaria 	}
8278580cf4SHamdan Igbaria 
8378580cf4SHamdan Igbaria 	ret = fprintf(f, "\n");
8478580cf4SHamdan Igbaria 	if (ret < 0) {
8578580cf4SHamdan Igbaria 		rte_errno = EINVAL;
8678580cf4SHamdan Igbaria 		return rte_errno;
8778580cf4SHamdan Igbaria 	}
8878580cf4SHamdan Igbaria 
8978580cf4SHamdan Igbaria 	return 0;
9078580cf4SHamdan Igbaria }
9178580cf4SHamdan Igbaria 
9278580cf4SHamdan Igbaria static int
9378580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_match_template(FILE *f, struct mlx5dr_matcher *matcher)
9478580cf4SHamdan Igbaria {
9578580cf4SHamdan Igbaria 	bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL;
96d6c69bcaSAlex Vesker 	enum mlx5dr_debug_res_type type;
9778580cf4SHamdan Igbaria 	int i, ret;
9878580cf4SHamdan Igbaria 
9978580cf4SHamdan Igbaria 	for (i = 0; i < matcher->num_of_mt; i++) {
100940b0ebaSAlex Vesker 		struct mlx5dr_match_template *mt = &matcher->mt[i];
10178580cf4SHamdan Igbaria 
102d6c69bcaSAlex Vesker 		ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d\n",
10378580cf4SHamdan Igbaria 			      MLX5DR_DEBUG_RES_TYPE_MATCHER_MATCH_TEMPLATE,
10478580cf4SHamdan Igbaria 			      (uint64_t)(uintptr_t)mt,
10578580cf4SHamdan Igbaria 			      (uint64_t)(uintptr_t)matcher,
10678580cf4SHamdan Igbaria 			      is_root ? 0 : mt->fc_sz,
107d6c69bcaSAlex Vesker 			      mt->flags,
108d6c69bcaSAlex Vesker 			      is_root ? 0 : mt->fcr_sz);
10978580cf4SHamdan Igbaria 		if (ret < 0) {
11078580cf4SHamdan Igbaria 			rte_errno = EINVAL;
11178580cf4SHamdan Igbaria 			return rte_errno;
11278580cf4SHamdan Igbaria 		}
11378580cf4SHamdan Igbaria 
114d6c69bcaSAlex Vesker 		type = MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_MATCH_DEFINER;
115d6c69bcaSAlex Vesker 		ret = mlx5dr_debug_dump_matcher_template_definer(f, mt, mt->definer, type);
116d6c69bcaSAlex Vesker 		if (ret)
117d6c69bcaSAlex Vesker 			return ret;
118d6c69bcaSAlex Vesker 
119d6c69bcaSAlex Vesker 		type = MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_RANGE_DEFINER;
120d6c69bcaSAlex Vesker 		ret = mlx5dr_debug_dump_matcher_template_definer(f, mt, mt->range_definer, type);
12178580cf4SHamdan Igbaria 		if (ret)
12278580cf4SHamdan Igbaria 			return ret;
12378580cf4SHamdan Igbaria 	}
124d6c69bcaSAlex Vesker 
125d6c69bcaSAlex Vesker 	type = MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_HASH_DEFINER;
126d6c69bcaSAlex Vesker 	ret = mlx5dr_debug_dump_matcher_template_definer(f, matcher, matcher->hash_definer, type);
127d6c69bcaSAlex Vesker 	if (ret)
128d6c69bcaSAlex Vesker 		return ret;
12978580cf4SHamdan Igbaria 
13078580cf4SHamdan Igbaria 	return 0;
13178580cf4SHamdan Igbaria }
13278580cf4SHamdan Igbaria 
13378580cf4SHamdan Igbaria static int
13478580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_action_template(FILE *f, struct mlx5dr_matcher *matcher)
13578580cf4SHamdan Igbaria {
13678580cf4SHamdan Igbaria 	bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL;
13778580cf4SHamdan Igbaria 	enum mlx5dr_action_type action_type;
13878580cf4SHamdan Igbaria 	int i, j, ret;
13978580cf4SHamdan Igbaria 
14078580cf4SHamdan Igbaria 	for (i = 0; i < matcher->num_of_at; i++) {
141940b0ebaSAlex Vesker 		struct mlx5dr_action_template *at = &matcher->at[i];
14278580cf4SHamdan Igbaria 
14378580cf4SHamdan Igbaria 		ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d",
14478580cf4SHamdan Igbaria 			      MLX5DR_DEBUG_RES_TYPE_MATCHER_ACTION_TEMPLATE,
14578580cf4SHamdan Igbaria 			      (uint64_t)(uintptr_t)at,
14678580cf4SHamdan Igbaria 			      (uint64_t)(uintptr_t)matcher,
14778580cf4SHamdan Igbaria 			      at->only_term ? 0 : 1,
14878580cf4SHamdan Igbaria 			      is_root ? 0 : at->num_of_action_stes,
14978580cf4SHamdan Igbaria 			      at->num_actions);
15078580cf4SHamdan Igbaria 		if (ret < 0) {
15178580cf4SHamdan Igbaria 			rte_errno = EINVAL;
15278580cf4SHamdan Igbaria 			return rte_errno;
15378580cf4SHamdan Igbaria 		}
15478580cf4SHamdan Igbaria 
15578580cf4SHamdan Igbaria 		for (j = 0; j < at->num_actions; j++) {
15678580cf4SHamdan Igbaria 			action_type = at->action_type_arr[j];
15778580cf4SHamdan Igbaria 			ret = fprintf(f, ",%s", mlx5dr_debug_action_type_to_str(action_type));
15878580cf4SHamdan Igbaria 			if (ret < 0) {
15978580cf4SHamdan Igbaria 				rte_errno = EINVAL;
16078580cf4SHamdan Igbaria 				return rte_errno;
16178580cf4SHamdan Igbaria 			}
16278580cf4SHamdan Igbaria 		}
16378580cf4SHamdan Igbaria 
16478580cf4SHamdan Igbaria 		fprintf(f, "\n");
16578580cf4SHamdan Igbaria 	}
16678580cf4SHamdan Igbaria 
16778580cf4SHamdan Igbaria 	return 0;
16878580cf4SHamdan Igbaria }
16978580cf4SHamdan Igbaria 
17078580cf4SHamdan Igbaria static int
17178580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_attr(FILE *f, struct mlx5dr_matcher *matcher)
17278580cf4SHamdan Igbaria {
17378580cf4SHamdan Igbaria 	struct mlx5dr_matcher_attr *attr = &matcher->attr;
17478580cf4SHamdan Igbaria 	int ret;
17578580cf4SHamdan Igbaria 
17638b5bf64SYevgeny Kliteynik 	ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d\n",
17778580cf4SHamdan Igbaria 		      MLX5DR_DEBUG_RES_TYPE_MATCHER_ATTR,
17878580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)matcher,
17978580cf4SHamdan Igbaria 		      attr->priority,
18078580cf4SHamdan Igbaria 		      attr->mode,
18178580cf4SHamdan Igbaria 		      attr->table.sz_row_log,
18278580cf4SHamdan Igbaria 		      attr->table.sz_col_log,
18378580cf4SHamdan Igbaria 		      attr->optimize_using_rule_idx,
18438b5bf64SYevgeny Kliteynik 		      attr->optimize_flow_src,
18538b5bf64SYevgeny Kliteynik 		      attr->insert_mode,
18638b5bf64SYevgeny Kliteynik 		      attr->distribute_mode);
18778580cf4SHamdan Igbaria 	if (ret < 0) {
18878580cf4SHamdan Igbaria 		rte_errno = EINVAL;
18978580cf4SHamdan Igbaria 		return rte_errno;
19078580cf4SHamdan Igbaria 	}
19178580cf4SHamdan Igbaria 
19278580cf4SHamdan Igbaria 	return 0;
19378580cf4SHamdan Igbaria }
19478580cf4SHamdan Igbaria 
19578580cf4SHamdan Igbaria static int mlx5dr_debug_dump_matcher(FILE *f, struct mlx5dr_matcher *matcher)
19678580cf4SHamdan Igbaria {
1971cf83b1fSErez Shitrit 	bool is_shared = mlx5dr_context_shared_gvmi_used(matcher->tbl->ctx);
19878580cf4SHamdan Igbaria 	bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL;
19978580cf4SHamdan Igbaria 	enum mlx5dr_table_type tbl_type = matcher->tbl->type;
20078580cf4SHamdan Igbaria 	struct mlx5dr_devx_obj *ste_0, *ste_1 = NULL;
20178580cf4SHamdan Igbaria 	struct mlx5dr_pool_chunk *ste;
20278580cf4SHamdan Igbaria 	struct mlx5dr_pool *ste_pool;
20378580cf4SHamdan Igbaria 	int ret;
20478580cf4SHamdan Igbaria 
20578580cf4SHamdan Igbaria 	ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,0x%" PRIx64,
20678580cf4SHamdan Igbaria 		      MLX5DR_DEBUG_RES_TYPE_MATCHER,
20778580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)matcher,
20878580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)matcher->tbl,
20978580cf4SHamdan Igbaria 		      matcher->num_of_mt,
21078580cf4SHamdan Igbaria 		      is_root ? 0 : matcher->end_ft->id,
21178580cf4SHamdan Igbaria 		      matcher->col_matcher ? (uint64_t)(uintptr_t)matcher->col_matcher : 0);
21278580cf4SHamdan Igbaria 	if (ret < 0)
21378580cf4SHamdan Igbaria 		goto out_err;
21478580cf4SHamdan Igbaria 
21578580cf4SHamdan Igbaria 	ste = &matcher->match_ste.ste;
21678580cf4SHamdan Igbaria 	ste_pool = matcher->match_ste.pool;
21778580cf4SHamdan Igbaria 	if (ste_pool) {
21878580cf4SHamdan Igbaria 		ste_0 = mlx5dr_pool_chunk_get_base_devx_obj(ste_pool, ste);
21978580cf4SHamdan Igbaria 		if (tbl_type == MLX5DR_TABLE_TYPE_FDB)
22078580cf4SHamdan Igbaria 			ste_1 = mlx5dr_pool_chunk_get_base_devx_obj_mirror(ste_pool, ste);
22178580cf4SHamdan Igbaria 	} else {
22278580cf4SHamdan Igbaria 		ste_0 = NULL;
22378580cf4SHamdan Igbaria 		ste_1 = NULL;
22478580cf4SHamdan Igbaria 	}
22578580cf4SHamdan Igbaria 
226846d281fSHamdan Igbaria 	ret = fprintf(f, ",%d,%d,%d,%d",
22778580cf4SHamdan Igbaria 		      matcher->match_ste.rtc_0 ? matcher->match_ste.rtc_0->id : 0,
22878580cf4SHamdan Igbaria 		      ste_0 ? (int)ste_0->id : -1,
22978580cf4SHamdan Igbaria 		      matcher->match_ste.rtc_1 ? matcher->match_ste.rtc_1->id : 0,
230846d281fSHamdan Igbaria 		      ste_1 ? (int)ste_1->id : -1);
23178580cf4SHamdan Igbaria 	if (ret < 0)
23278580cf4SHamdan Igbaria 		goto out_err;
23378580cf4SHamdan Igbaria 
23478580cf4SHamdan Igbaria 	ste = &matcher->action_ste.ste;
23578580cf4SHamdan Igbaria 	ste_pool = matcher->action_ste.pool;
23678580cf4SHamdan Igbaria 	if (ste_pool) {
23778580cf4SHamdan Igbaria 		ste_0 = mlx5dr_pool_chunk_get_base_devx_obj(ste_pool, ste);
23878580cf4SHamdan Igbaria 		if (tbl_type == MLX5DR_TABLE_TYPE_FDB)
23978580cf4SHamdan Igbaria 			ste_1 = mlx5dr_pool_chunk_get_base_devx_obj_mirror(ste_pool, ste);
24078580cf4SHamdan Igbaria 	} else {
24178580cf4SHamdan Igbaria 		ste_0 = NULL;
24278580cf4SHamdan Igbaria 		ste_1 = NULL;
24378580cf4SHamdan Igbaria 	}
24478580cf4SHamdan Igbaria 
245846d281fSHamdan Igbaria 	ret = fprintf(f, ",%d,%d,%d,%d,%d\n",
24678580cf4SHamdan Igbaria 		      matcher->action_ste.rtc_0 ? matcher->action_ste.rtc_0->id : 0,
24778580cf4SHamdan Igbaria 		      ste_0 ? (int)ste_0->id : -1,
24878580cf4SHamdan Igbaria 		      matcher->action_ste.rtc_1 ? matcher->action_ste.rtc_1->id : 0,
249846d281fSHamdan Igbaria 		      ste_1 ? (int)ste_1->id : -1,
250846d281fSHamdan Igbaria 		      is_shared && !is_root ?
251846d281fSHamdan Igbaria 		      matcher->match_ste.aliased_rtc_0->id : 0);
25278580cf4SHamdan Igbaria 	if (ret < 0)
25378580cf4SHamdan Igbaria 		goto out_err;
25478580cf4SHamdan Igbaria 
25578580cf4SHamdan Igbaria 	ret = mlx5dr_debug_dump_matcher_attr(f, matcher);
25678580cf4SHamdan Igbaria 	if (ret)
25778580cf4SHamdan Igbaria 		return ret;
25878580cf4SHamdan Igbaria 
25978580cf4SHamdan Igbaria 	ret = mlx5dr_debug_dump_matcher_match_template(f, matcher);
26078580cf4SHamdan Igbaria 	if (ret)
26178580cf4SHamdan Igbaria 		return ret;
26278580cf4SHamdan Igbaria 
26378580cf4SHamdan Igbaria 	ret = mlx5dr_debug_dump_matcher_action_template(f, matcher);
26478580cf4SHamdan Igbaria 	if (ret)
26578580cf4SHamdan Igbaria 		return ret;
26678580cf4SHamdan Igbaria 
26778580cf4SHamdan Igbaria 	return 0;
26878580cf4SHamdan Igbaria 
26978580cf4SHamdan Igbaria out_err:
27078580cf4SHamdan Igbaria 	rte_errno = EINVAL;
27178580cf4SHamdan Igbaria 	return rte_errno;
27278580cf4SHamdan Igbaria }
27378580cf4SHamdan Igbaria 
27478580cf4SHamdan Igbaria static int mlx5dr_debug_dump_table(FILE *f, struct mlx5dr_table *tbl)
27578580cf4SHamdan Igbaria {
2761cf83b1fSErez Shitrit 	bool is_shared = mlx5dr_context_shared_gvmi_used(tbl->ctx);
27778580cf4SHamdan Igbaria 	bool is_root = tbl->level == MLX5DR_ROOT_LEVEL;
27878580cf4SHamdan Igbaria 	struct mlx5dr_matcher *matcher;
27978580cf4SHamdan Igbaria 	int ret;
28078580cf4SHamdan Igbaria 
2811cf83b1fSErez Shitrit 	ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d,%d,%d\n",
28278580cf4SHamdan Igbaria 		      MLX5DR_DEBUG_RES_TYPE_TABLE,
28378580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)tbl,
28478580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)tbl->ctx,
28578580cf4SHamdan Igbaria 		      is_root ? 0 : tbl->ft->id,
28678580cf4SHamdan Igbaria 		      tbl->type,
28778580cf4SHamdan Igbaria 		      is_root ? 0 : tbl->fw_ft_type,
2881cf83b1fSErez Shitrit 		      tbl->level,
2891cf83b1fSErez Shitrit 		      is_shared && !is_root ? tbl->local_ft->id : 0);
29078580cf4SHamdan Igbaria 	if (ret < 0) {
29178580cf4SHamdan Igbaria 		rte_errno = EINVAL;
29278580cf4SHamdan Igbaria 		return rte_errno;
29378580cf4SHamdan Igbaria 	}
29478580cf4SHamdan Igbaria 
29578580cf4SHamdan Igbaria 	LIST_FOREACH(matcher, &tbl->head, next) {
29678580cf4SHamdan Igbaria 		ret = mlx5dr_debug_dump_matcher(f, matcher);
29778580cf4SHamdan Igbaria 		if (ret)
29878580cf4SHamdan Igbaria 			return ret;
29978580cf4SHamdan Igbaria 	}
30078580cf4SHamdan Igbaria 
30178580cf4SHamdan Igbaria 	return 0;
30278580cf4SHamdan Igbaria }
30378580cf4SHamdan Igbaria 
30478580cf4SHamdan Igbaria static int
30578580cf4SHamdan Igbaria mlx5dr_debug_dump_context_send_engine(FILE *f, struct mlx5dr_context *ctx)
30678580cf4SHamdan Igbaria {
30778580cf4SHamdan Igbaria 	struct mlx5dr_send_engine *send_queue;
30878580cf4SHamdan Igbaria 	int ret, i, j;
30978580cf4SHamdan Igbaria 
31078580cf4SHamdan Igbaria 	for (i = 0; i < (int)ctx->queues; i++) {
31178580cf4SHamdan Igbaria 		send_queue = &ctx->send_queue[i];
31278580cf4SHamdan Igbaria 		ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
31378580cf4SHamdan Igbaria 			      MLX5DR_DEBUG_RES_TYPE_CONTEXT_SEND_ENGINE,
31478580cf4SHamdan Igbaria 			      (uint64_t)(uintptr_t)ctx,
31578580cf4SHamdan Igbaria 			      i,
31678580cf4SHamdan Igbaria 			      send_queue->used_entries,
31778580cf4SHamdan Igbaria 			      send_queue->th_entries,
31878580cf4SHamdan Igbaria 			      send_queue->rings,
31978580cf4SHamdan Igbaria 			      send_queue->num_entries,
32078580cf4SHamdan Igbaria 			      send_queue->err,
32178580cf4SHamdan Igbaria 			      send_queue->completed.ci,
32278580cf4SHamdan Igbaria 			      send_queue->completed.pi,
32378580cf4SHamdan Igbaria 			      send_queue->completed.mask);
32478580cf4SHamdan Igbaria 		if (ret < 0) {
32578580cf4SHamdan Igbaria 			rte_errno = EINVAL;
32678580cf4SHamdan Igbaria 			return rte_errno;
32778580cf4SHamdan Igbaria 		}
32878580cf4SHamdan Igbaria 
32978580cf4SHamdan Igbaria 		for (j = 0; j < MLX5DR_NUM_SEND_RINGS; j++) {
33078580cf4SHamdan Igbaria 			struct mlx5dr_send_ring *send_ring = &send_queue->send_ring[j];
33178580cf4SHamdan Igbaria 			struct mlx5dr_send_ring_cq *cq = &send_ring->send_cq;
33278580cf4SHamdan Igbaria 			struct mlx5dr_send_ring_sq *sq = &send_ring->send_sq;
33378580cf4SHamdan Igbaria 
33478580cf4SHamdan Igbaria 			ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
33578580cf4SHamdan Igbaria 				      MLX5DR_DEBUG_RES_TYPE_CONTEXT_SEND_RING,
33678580cf4SHamdan Igbaria 				      (uint64_t)(uintptr_t)ctx,
33778580cf4SHamdan Igbaria 				      j,
33878580cf4SHamdan Igbaria 				      i,
33978580cf4SHamdan Igbaria 				      cq->cqn,
34078580cf4SHamdan Igbaria 				      cq->cons_index,
34178580cf4SHamdan Igbaria 				      cq->ncqe_mask,
34278580cf4SHamdan Igbaria 				      cq->buf_sz,
34378580cf4SHamdan Igbaria 				      cq->ncqe,
34478580cf4SHamdan Igbaria 				      cq->cqe_log_sz,
34578580cf4SHamdan Igbaria 				      cq->poll_wqe,
34678580cf4SHamdan Igbaria 				      cq->cqe_sz,
34778580cf4SHamdan Igbaria 				      sq->sqn,
34878580cf4SHamdan Igbaria 				      sq->obj->id,
34978580cf4SHamdan Igbaria 				      sq->cur_post,
35078580cf4SHamdan Igbaria 				      sq->buf_mask);
35178580cf4SHamdan Igbaria 			if (ret < 0) {
35278580cf4SHamdan Igbaria 				rte_errno = EINVAL;
35378580cf4SHamdan Igbaria 				return rte_errno;
35478580cf4SHamdan Igbaria 			}
35578580cf4SHamdan Igbaria 		}
35678580cf4SHamdan Igbaria 	}
35778580cf4SHamdan Igbaria 
35878580cf4SHamdan Igbaria 	return 0;
35978580cf4SHamdan Igbaria }
36078580cf4SHamdan Igbaria 
36178580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_caps(FILE *f, struct mlx5dr_context *ctx)
36278580cf4SHamdan Igbaria {
36378580cf4SHamdan Igbaria 	struct mlx5dr_cmd_query_caps *caps = ctx->caps;
36478580cf4SHamdan Igbaria 	int ret;
36578580cf4SHamdan Igbaria 
36678580cf4SHamdan Igbaria 	ret = fprintf(f, "%d,0x%" PRIx64 ",%s,%d,%d,%d,%d,",
36778580cf4SHamdan Igbaria 		      MLX5DR_DEBUG_RES_TYPE_CONTEXT_CAPS,
36878580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)ctx,
36978580cf4SHamdan Igbaria 		      caps->fw_ver,
37078580cf4SHamdan Igbaria 		      caps->wqe_based_update,
37178580cf4SHamdan Igbaria 		      caps->ste_format,
37278580cf4SHamdan Igbaria 		      caps->ste_alloc_log_max,
37378580cf4SHamdan Igbaria 		      caps->log_header_modify_argument_max_alloc);
37478580cf4SHamdan Igbaria 	if (ret < 0) {
37578580cf4SHamdan Igbaria 		rte_errno = EINVAL;
37678580cf4SHamdan Igbaria 		return rte_errno;
37778580cf4SHamdan Igbaria 	}
37878580cf4SHamdan Igbaria 
37978580cf4SHamdan Igbaria 	ret = fprintf(f, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
38078580cf4SHamdan Igbaria 		      caps->flex_protocols,
38178580cf4SHamdan Igbaria 		      caps->rtc_reparse_mode,
38278580cf4SHamdan Igbaria 		      caps->rtc_index_mode,
38378580cf4SHamdan Igbaria 		      caps->ste_alloc_log_gran,
38478580cf4SHamdan Igbaria 		      caps->stc_alloc_log_max,
38578580cf4SHamdan Igbaria 		      caps->stc_alloc_log_gran,
38678580cf4SHamdan Igbaria 		      caps->rtc_log_depth_max,
38778580cf4SHamdan Igbaria 		      caps->format_select_gtpu_dw_0,
38878580cf4SHamdan Igbaria 		      caps->format_select_gtpu_dw_1,
38978580cf4SHamdan Igbaria 		      caps->format_select_gtpu_dw_2,
39078580cf4SHamdan Igbaria 		      caps->format_select_gtpu_ext_dw_0,
39178580cf4SHamdan Igbaria 		      caps->nic_ft.max_level,
39278580cf4SHamdan Igbaria 		      caps->nic_ft.reparse,
39378580cf4SHamdan Igbaria 		      caps->fdb_ft.max_level,
39478580cf4SHamdan Igbaria 		      caps->fdb_ft.reparse,
39578580cf4SHamdan Igbaria 		      caps->log_header_modify_argument_granularity);
39678580cf4SHamdan Igbaria 	if (ret < 0) {
39778580cf4SHamdan Igbaria 		rte_errno = EINVAL;
39878580cf4SHamdan Igbaria 		return rte_errno;
39978580cf4SHamdan Igbaria 	}
40078580cf4SHamdan Igbaria 
40178580cf4SHamdan Igbaria 	return 0;
40278580cf4SHamdan Igbaria }
40378580cf4SHamdan Igbaria 
40478580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_attr(FILE *f, struct mlx5dr_context *ctx)
40578580cf4SHamdan Igbaria {
40678580cf4SHamdan Igbaria 	int ret;
40778580cf4SHamdan Igbaria 
4081cf83b1fSErez Shitrit 	ret = fprintf(f, "%u,0x%" PRIx64 ",%d,%zu,%d,%s,%d,%d\n",
40978580cf4SHamdan Igbaria 		      MLX5DR_DEBUG_RES_TYPE_CONTEXT_ATTR,
41078580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)ctx,
41178580cf4SHamdan Igbaria 		      ctx->pd_num,
41278580cf4SHamdan Igbaria 		      ctx->queues,
4131cf83b1fSErez Shitrit 		      ctx->send_queue->num_entries,
4141cf83b1fSErez Shitrit 		      mlx5dr_context_shared_gvmi_used(ctx) ?
4151cf83b1fSErez Shitrit 		      mlx5_glue->get_device_name(ctx->ibv_ctx->device) : "None",
4161cf83b1fSErez Shitrit 		      ctx->caps->vhca_id,
4171cf83b1fSErez Shitrit 		      mlx5dr_context_shared_gvmi_used(ctx) ?
4181cf83b1fSErez Shitrit 		      ctx->caps->shared_vhca_id : 0xffff);
41978580cf4SHamdan Igbaria 	if (ret < 0) {
42078580cf4SHamdan Igbaria 		rte_errno = EINVAL;
42178580cf4SHamdan Igbaria 		return rte_errno;
42278580cf4SHamdan Igbaria 	}
42378580cf4SHamdan Igbaria 
42478580cf4SHamdan Igbaria 	return 0;
42578580cf4SHamdan Igbaria }
42678580cf4SHamdan Igbaria 
42778580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_info(FILE *f, struct mlx5dr_context *ctx)
42878580cf4SHamdan Igbaria {
42978580cf4SHamdan Igbaria 	int ret;
43078580cf4SHamdan Igbaria 
43178580cf4SHamdan Igbaria 	ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%s,%s\n",
43278580cf4SHamdan Igbaria 		      MLX5DR_DEBUG_RES_TYPE_CONTEXT,
43378580cf4SHamdan Igbaria 		      (uint64_t)(uintptr_t)ctx,
43478580cf4SHamdan Igbaria 		      ctx->flags & MLX5DR_CONTEXT_FLAG_HWS_SUPPORT,
435ce946c7dSErez Shitrit 		      mlx5_glue->get_device_name(mlx5dr_context_get_local_ibv(ctx)->device),
43678580cf4SHamdan Igbaria 		      DEBUG_VERSION);
43778580cf4SHamdan Igbaria 	if (ret < 0) {
43878580cf4SHamdan Igbaria 		rte_errno = EINVAL;
43978580cf4SHamdan Igbaria 		return rte_errno;
44078580cf4SHamdan Igbaria 	}
44178580cf4SHamdan Igbaria 
44278580cf4SHamdan Igbaria 	ret = mlx5dr_debug_dump_context_attr(f, ctx);
44378580cf4SHamdan Igbaria 	if (ret)
44478580cf4SHamdan Igbaria 		return ret;
44578580cf4SHamdan Igbaria 
44678580cf4SHamdan Igbaria 	ret = mlx5dr_debug_dump_context_caps(f, ctx);
44778580cf4SHamdan Igbaria 	if (ret)
44878580cf4SHamdan Igbaria 		return ret;
44978580cf4SHamdan Igbaria 
45078580cf4SHamdan Igbaria 	return 0;
45178580cf4SHamdan Igbaria }
45278580cf4SHamdan Igbaria 
453*a2ea62bcSHamdan Igbaria static int
454*a2ea62bcSHamdan Igbaria mlx5dr_debug_dump_context_stc_resource(FILE *f,
455*a2ea62bcSHamdan Igbaria 				       struct mlx5dr_context *ctx,
456*a2ea62bcSHamdan Igbaria 				       uint32_t tbl_type,
457*a2ea62bcSHamdan Igbaria 				       struct mlx5dr_pool_resource *resource)
458*a2ea62bcSHamdan Igbaria {
459*a2ea62bcSHamdan Igbaria 	int ret;
460*a2ea62bcSHamdan Igbaria 
461*a2ea62bcSHamdan Igbaria 	ret = fprintf(f, "%d,0x%" PRIx64 ",%u,%u\n",
462*a2ea62bcSHamdan Igbaria 		      MLX5DR_DEBUG_RES_TYPE_CONTEXT_STC,
463*a2ea62bcSHamdan Igbaria 		      (uint64_t)(uintptr_t)ctx,
464*a2ea62bcSHamdan Igbaria 		      tbl_type,
465*a2ea62bcSHamdan Igbaria 		      resource->base_id);
466*a2ea62bcSHamdan Igbaria 	if (ret < 0) {
467*a2ea62bcSHamdan Igbaria 		rte_errno = EINVAL;
468*a2ea62bcSHamdan Igbaria 		return rte_errno;
469*a2ea62bcSHamdan Igbaria 	}
470*a2ea62bcSHamdan Igbaria 
471*a2ea62bcSHamdan Igbaria 	return 0;
472*a2ea62bcSHamdan Igbaria }
473*a2ea62bcSHamdan Igbaria 
474*a2ea62bcSHamdan Igbaria static int mlx5dr_debug_dump_context_stc(FILE *f, struct mlx5dr_context *ctx)
475*a2ea62bcSHamdan Igbaria {
476*a2ea62bcSHamdan Igbaria 	struct mlx5dr_pool *stc_pool;
477*a2ea62bcSHamdan Igbaria 	int ret;
478*a2ea62bcSHamdan Igbaria 	int i;
479*a2ea62bcSHamdan Igbaria 
480*a2ea62bcSHamdan Igbaria 	for (i = 0; i < MLX5DR_TABLE_TYPE_MAX; i++) {
481*a2ea62bcSHamdan Igbaria 		stc_pool = ctx->stc_pool[i];
482*a2ea62bcSHamdan Igbaria 
483*a2ea62bcSHamdan Igbaria 		if (!stc_pool)
484*a2ea62bcSHamdan Igbaria 			continue;
485*a2ea62bcSHamdan Igbaria 
486*a2ea62bcSHamdan Igbaria 		if (stc_pool->resource[0] != NULL) {
487*a2ea62bcSHamdan Igbaria 			ret = mlx5dr_debug_dump_context_stc_resource(f, ctx, i,
488*a2ea62bcSHamdan Igbaria 								     stc_pool->resource[0]);
489*a2ea62bcSHamdan Igbaria 			if (ret)
490*a2ea62bcSHamdan Igbaria 				return ret;
491*a2ea62bcSHamdan Igbaria 		}
492*a2ea62bcSHamdan Igbaria 
493*a2ea62bcSHamdan Igbaria 		if (i == MLX5DR_TABLE_TYPE_FDB && stc_pool->mirror_resource[0] != NULL) {
494*a2ea62bcSHamdan Igbaria 			ret = mlx5dr_debug_dump_context_stc_resource(f, ctx, i,
495*a2ea62bcSHamdan Igbaria 								     stc_pool->mirror_resource[0]);
496*a2ea62bcSHamdan Igbaria 			if (ret)
497*a2ea62bcSHamdan Igbaria 				return ret;
498*a2ea62bcSHamdan Igbaria 		}
499*a2ea62bcSHamdan Igbaria 	}
500*a2ea62bcSHamdan Igbaria 
501*a2ea62bcSHamdan Igbaria 	return 0;
502*a2ea62bcSHamdan Igbaria }
503*a2ea62bcSHamdan Igbaria 
50478580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context(FILE *f, struct mlx5dr_context *ctx)
50578580cf4SHamdan Igbaria {
50678580cf4SHamdan Igbaria 	struct mlx5dr_table *tbl;
50778580cf4SHamdan Igbaria 	int ret;
50878580cf4SHamdan Igbaria 
50978580cf4SHamdan Igbaria 	ret = mlx5dr_debug_dump_context_info(f, ctx);
51078580cf4SHamdan Igbaria 	if (ret)
51178580cf4SHamdan Igbaria 		return ret;
51278580cf4SHamdan Igbaria 
51378580cf4SHamdan Igbaria 	ret = mlx5dr_debug_dump_context_send_engine(f, ctx);
51478580cf4SHamdan Igbaria 	if (ret)
51578580cf4SHamdan Igbaria 		return ret;
51678580cf4SHamdan Igbaria 
517*a2ea62bcSHamdan Igbaria 	ret = mlx5dr_debug_dump_context_stc(f, ctx);
518*a2ea62bcSHamdan Igbaria 	if (ret)
519*a2ea62bcSHamdan Igbaria 		return ret;
520*a2ea62bcSHamdan Igbaria 
52178580cf4SHamdan Igbaria 	LIST_FOREACH(tbl, &ctx->head, next) {
52278580cf4SHamdan Igbaria 		ret = mlx5dr_debug_dump_table(f, tbl);
52378580cf4SHamdan Igbaria 		if (ret)
52478580cf4SHamdan Igbaria 			return ret;
52578580cf4SHamdan Igbaria 	}
52678580cf4SHamdan Igbaria 
52778580cf4SHamdan Igbaria 	return 0;
52878580cf4SHamdan Igbaria }
52978580cf4SHamdan Igbaria 
53078580cf4SHamdan Igbaria int mlx5dr_debug_dump(struct mlx5dr_context *ctx, FILE *f)
53178580cf4SHamdan Igbaria {
53278580cf4SHamdan Igbaria 	int ret;
53378580cf4SHamdan Igbaria 
53478580cf4SHamdan Igbaria 	if (!f || !ctx) {
53578580cf4SHamdan Igbaria 		rte_errno = EINVAL;
53678580cf4SHamdan Igbaria 		return -rte_errno;
53778580cf4SHamdan Igbaria 	}
53878580cf4SHamdan Igbaria 
53978580cf4SHamdan Igbaria 	pthread_spin_lock(&ctx->ctrl_lock);
54078580cf4SHamdan Igbaria 	ret = mlx5dr_debug_dump_context(f, ctx);
54178580cf4SHamdan Igbaria 	pthread_spin_unlock(&ctx->ctrl_lock);
54278580cf4SHamdan Igbaria 
54378580cf4SHamdan Igbaria 	return -ret;
54478580cf4SHamdan Igbaria }
545