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, 3778580cf4SHamdan Igbaria struct mlx5dr_match_template *mt) 3878580cf4SHamdan Igbaria { 3978580cf4SHamdan Igbaria struct mlx5dr_definer *definer = mt->definer; 4078580cf4SHamdan Igbaria int i, ret; 4178580cf4SHamdan Igbaria 4278580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,", 4378580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_DEFINER, 4478580cf4SHamdan Igbaria (uint64_t)(uintptr_t)definer, 4578580cf4SHamdan Igbaria (uint64_t)(uintptr_t)mt, 4678580cf4SHamdan Igbaria definer->obj->id, 4778580cf4SHamdan Igbaria definer->type); 4878580cf4SHamdan Igbaria if (ret < 0) { 4978580cf4SHamdan Igbaria rte_errno = EINVAL; 5078580cf4SHamdan Igbaria return rte_errno; 5178580cf4SHamdan Igbaria } 5278580cf4SHamdan Igbaria 5378580cf4SHamdan Igbaria for (i = 0; i < DW_SELECTORS; i++) { 5478580cf4SHamdan Igbaria ret = fprintf(f, "0x%x%s", definer->dw_selector[i], 5578580cf4SHamdan Igbaria (i == DW_SELECTORS - 1) ? "," : "-"); 5678580cf4SHamdan Igbaria if (ret < 0) { 5778580cf4SHamdan Igbaria rte_errno = EINVAL; 5878580cf4SHamdan Igbaria return rte_errno; 5978580cf4SHamdan Igbaria } 6078580cf4SHamdan Igbaria } 6178580cf4SHamdan Igbaria 6278580cf4SHamdan Igbaria for (i = 0; i < BYTE_SELECTORS; i++) { 6378580cf4SHamdan Igbaria ret = fprintf(f, "0x%x%s", definer->byte_selector[i], 6478580cf4SHamdan Igbaria (i == BYTE_SELECTORS - 1) ? "," : "-"); 6578580cf4SHamdan Igbaria if (ret < 0) { 6678580cf4SHamdan Igbaria rte_errno = EINVAL; 6778580cf4SHamdan Igbaria return rte_errno; 6878580cf4SHamdan Igbaria } 6978580cf4SHamdan Igbaria } 7078580cf4SHamdan Igbaria 7178580cf4SHamdan Igbaria for (i = 0; i < MLX5DR_JUMBO_TAG_SZ; i++) { 7278580cf4SHamdan Igbaria ret = fprintf(f, "%02x", definer->mask.jumbo[i]); 7378580cf4SHamdan Igbaria if (ret < 0) { 7478580cf4SHamdan Igbaria rte_errno = EINVAL; 7578580cf4SHamdan Igbaria return rte_errno; 7678580cf4SHamdan Igbaria } 7778580cf4SHamdan Igbaria } 7878580cf4SHamdan Igbaria 7978580cf4SHamdan Igbaria ret = fprintf(f, "\n"); 8078580cf4SHamdan Igbaria if (ret < 0) { 8178580cf4SHamdan Igbaria rte_errno = EINVAL; 8278580cf4SHamdan Igbaria return rte_errno; 8378580cf4SHamdan Igbaria } 8478580cf4SHamdan Igbaria 8578580cf4SHamdan Igbaria return 0; 8678580cf4SHamdan Igbaria } 8778580cf4SHamdan Igbaria 8878580cf4SHamdan Igbaria static int 8978580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_match_template(FILE *f, struct mlx5dr_matcher *matcher) 9078580cf4SHamdan Igbaria { 9178580cf4SHamdan Igbaria bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL; 9278580cf4SHamdan Igbaria int i, ret; 9378580cf4SHamdan Igbaria 9478580cf4SHamdan Igbaria for (i = 0; i < matcher->num_of_mt; i++) { 95*940b0ebaSAlex Vesker struct mlx5dr_match_template *mt = &matcher->mt[i]; 9678580cf4SHamdan Igbaria 9778580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d\n", 9878580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_MATCH_TEMPLATE, 9978580cf4SHamdan Igbaria (uint64_t)(uintptr_t)mt, 10078580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 10178580cf4SHamdan Igbaria is_root ? 0 : mt->fc_sz, 10278580cf4SHamdan Igbaria mt->flags); 10378580cf4SHamdan Igbaria if (ret < 0) { 10478580cf4SHamdan Igbaria rte_errno = EINVAL; 10578580cf4SHamdan Igbaria return rte_errno; 10678580cf4SHamdan Igbaria } 10778580cf4SHamdan Igbaria 10878580cf4SHamdan Igbaria if (!is_root) { 10978580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher_template_definer(f, mt); 11078580cf4SHamdan Igbaria if (ret) 11178580cf4SHamdan Igbaria return ret; 11278580cf4SHamdan Igbaria } 11378580cf4SHamdan Igbaria } 11478580cf4SHamdan Igbaria 11578580cf4SHamdan Igbaria return 0; 11678580cf4SHamdan Igbaria } 11778580cf4SHamdan Igbaria 11878580cf4SHamdan Igbaria static int 11978580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_action_template(FILE *f, struct mlx5dr_matcher *matcher) 12078580cf4SHamdan Igbaria { 12178580cf4SHamdan Igbaria bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL; 12278580cf4SHamdan Igbaria enum mlx5dr_action_type action_type; 12378580cf4SHamdan Igbaria int i, j, ret; 12478580cf4SHamdan Igbaria 12578580cf4SHamdan Igbaria for (i = 0; i < matcher->num_of_at; i++) { 126*940b0ebaSAlex Vesker struct mlx5dr_action_template *at = &matcher->at[i]; 12778580cf4SHamdan Igbaria 12878580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d", 12978580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_ACTION_TEMPLATE, 13078580cf4SHamdan Igbaria (uint64_t)(uintptr_t)at, 13178580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 13278580cf4SHamdan Igbaria at->only_term ? 0 : 1, 13378580cf4SHamdan Igbaria is_root ? 0 : at->num_of_action_stes, 13478580cf4SHamdan Igbaria at->num_actions); 13578580cf4SHamdan Igbaria if (ret < 0) { 13678580cf4SHamdan Igbaria rte_errno = EINVAL; 13778580cf4SHamdan Igbaria return rte_errno; 13878580cf4SHamdan Igbaria } 13978580cf4SHamdan Igbaria 14078580cf4SHamdan Igbaria for (j = 0; j < at->num_actions; j++) { 14178580cf4SHamdan Igbaria action_type = at->action_type_arr[j]; 14278580cf4SHamdan Igbaria ret = fprintf(f, ",%s", mlx5dr_debug_action_type_to_str(action_type)); 14378580cf4SHamdan Igbaria if (ret < 0) { 14478580cf4SHamdan Igbaria rte_errno = EINVAL; 14578580cf4SHamdan Igbaria return rte_errno; 14678580cf4SHamdan Igbaria } 14778580cf4SHamdan Igbaria } 14878580cf4SHamdan Igbaria 14978580cf4SHamdan Igbaria fprintf(f, "\n"); 15078580cf4SHamdan Igbaria } 15178580cf4SHamdan Igbaria 15278580cf4SHamdan Igbaria return 0; 15378580cf4SHamdan Igbaria } 15478580cf4SHamdan Igbaria 15578580cf4SHamdan Igbaria static int 15678580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_attr(FILE *f, struct mlx5dr_matcher *matcher) 15778580cf4SHamdan Igbaria { 15878580cf4SHamdan Igbaria struct mlx5dr_matcher_attr *attr = &matcher->attr; 15978580cf4SHamdan Igbaria int ret; 16078580cf4SHamdan Igbaria 16138b5bf64SYevgeny Kliteynik ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d\n", 16278580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_ATTR, 16378580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 16478580cf4SHamdan Igbaria attr->priority, 16578580cf4SHamdan Igbaria attr->mode, 16678580cf4SHamdan Igbaria attr->table.sz_row_log, 16778580cf4SHamdan Igbaria attr->table.sz_col_log, 16878580cf4SHamdan Igbaria attr->optimize_using_rule_idx, 16938b5bf64SYevgeny Kliteynik attr->optimize_flow_src, 17038b5bf64SYevgeny Kliteynik attr->insert_mode, 17138b5bf64SYevgeny Kliteynik attr->distribute_mode); 17278580cf4SHamdan Igbaria if (ret < 0) { 17378580cf4SHamdan Igbaria rte_errno = EINVAL; 17478580cf4SHamdan Igbaria return rte_errno; 17578580cf4SHamdan Igbaria } 17678580cf4SHamdan Igbaria 17778580cf4SHamdan Igbaria return 0; 17878580cf4SHamdan Igbaria } 17978580cf4SHamdan Igbaria 18078580cf4SHamdan Igbaria static int mlx5dr_debug_dump_matcher(FILE *f, struct mlx5dr_matcher *matcher) 18178580cf4SHamdan Igbaria { 1821cf83b1fSErez Shitrit bool is_shared = mlx5dr_context_shared_gvmi_used(matcher->tbl->ctx); 18378580cf4SHamdan Igbaria bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL; 18478580cf4SHamdan Igbaria enum mlx5dr_table_type tbl_type = matcher->tbl->type; 18578580cf4SHamdan Igbaria struct mlx5dr_devx_obj *ste_0, *ste_1 = NULL; 18678580cf4SHamdan Igbaria struct mlx5dr_pool_chunk *ste; 18778580cf4SHamdan Igbaria struct mlx5dr_pool *ste_pool; 18878580cf4SHamdan Igbaria int ret; 18978580cf4SHamdan Igbaria 19078580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,0x%" PRIx64, 19178580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER, 19278580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 19378580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher->tbl, 19478580cf4SHamdan Igbaria matcher->num_of_mt, 19578580cf4SHamdan Igbaria is_root ? 0 : matcher->end_ft->id, 19678580cf4SHamdan Igbaria matcher->col_matcher ? (uint64_t)(uintptr_t)matcher->col_matcher : 0); 19778580cf4SHamdan Igbaria if (ret < 0) 19878580cf4SHamdan Igbaria goto out_err; 19978580cf4SHamdan Igbaria 20078580cf4SHamdan Igbaria ste = &matcher->match_ste.ste; 20178580cf4SHamdan Igbaria ste_pool = matcher->match_ste.pool; 20278580cf4SHamdan Igbaria if (ste_pool) { 20378580cf4SHamdan Igbaria ste_0 = mlx5dr_pool_chunk_get_base_devx_obj(ste_pool, ste); 20478580cf4SHamdan Igbaria if (tbl_type == MLX5DR_TABLE_TYPE_FDB) 20578580cf4SHamdan Igbaria ste_1 = mlx5dr_pool_chunk_get_base_devx_obj_mirror(ste_pool, ste); 20678580cf4SHamdan Igbaria } else { 20778580cf4SHamdan Igbaria ste_0 = NULL; 20878580cf4SHamdan Igbaria ste_1 = NULL; 20978580cf4SHamdan Igbaria } 21078580cf4SHamdan Igbaria 2111cf83b1fSErez Shitrit ret = fprintf(f, ",%d,%d,%d,%d,%d", 21278580cf4SHamdan Igbaria matcher->match_ste.rtc_0 ? matcher->match_ste.rtc_0->id : 0, 21378580cf4SHamdan Igbaria ste_0 ? (int)ste_0->id : -1, 21478580cf4SHamdan Igbaria matcher->match_ste.rtc_1 ? matcher->match_ste.rtc_1->id : 0, 2151cf83b1fSErez Shitrit ste_1 ? (int)ste_1->id : -1, 2161cf83b1fSErez Shitrit is_shared && !is_root ? 2171cf83b1fSErez Shitrit matcher->match_ste.aliased_rtc_0->id : 0); 21878580cf4SHamdan Igbaria if (ret < 0) 21978580cf4SHamdan Igbaria goto out_err; 22078580cf4SHamdan Igbaria 22178580cf4SHamdan Igbaria ste = &matcher->action_ste.ste; 22278580cf4SHamdan Igbaria ste_pool = matcher->action_ste.pool; 22378580cf4SHamdan Igbaria if (ste_pool) { 22478580cf4SHamdan Igbaria ste_0 = mlx5dr_pool_chunk_get_base_devx_obj(ste_pool, ste); 22578580cf4SHamdan Igbaria if (tbl_type == MLX5DR_TABLE_TYPE_FDB) 22678580cf4SHamdan Igbaria ste_1 = mlx5dr_pool_chunk_get_base_devx_obj_mirror(ste_pool, ste); 22778580cf4SHamdan Igbaria } else { 22878580cf4SHamdan Igbaria ste_0 = NULL; 22978580cf4SHamdan Igbaria ste_1 = NULL; 23078580cf4SHamdan Igbaria } 23178580cf4SHamdan Igbaria 23278580cf4SHamdan Igbaria ret = fprintf(f, ",%d,%d,%d,%d\n", 23378580cf4SHamdan Igbaria matcher->action_ste.rtc_0 ? matcher->action_ste.rtc_0->id : 0, 23478580cf4SHamdan Igbaria ste_0 ? (int)ste_0->id : -1, 23578580cf4SHamdan Igbaria matcher->action_ste.rtc_1 ? matcher->action_ste.rtc_1->id : 0, 23678580cf4SHamdan Igbaria ste_1 ? (int)ste_1->id : -1); 23778580cf4SHamdan Igbaria if (ret < 0) 23878580cf4SHamdan Igbaria goto out_err; 23978580cf4SHamdan Igbaria 24078580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher_attr(f, matcher); 24178580cf4SHamdan Igbaria if (ret) 24278580cf4SHamdan Igbaria return ret; 24378580cf4SHamdan Igbaria 24478580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher_match_template(f, matcher); 24578580cf4SHamdan Igbaria if (ret) 24678580cf4SHamdan Igbaria return ret; 24778580cf4SHamdan Igbaria 24878580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher_action_template(f, matcher); 24978580cf4SHamdan Igbaria if (ret) 25078580cf4SHamdan Igbaria return ret; 25178580cf4SHamdan Igbaria 25278580cf4SHamdan Igbaria return 0; 25378580cf4SHamdan Igbaria 25478580cf4SHamdan Igbaria out_err: 25578580cf4SHamdan Igbaria rte_errno = EINVAL; 25678580cf4SHamdan Igbaria return rte_errno; 25778580cf4SHamdan Igbaria } 25878580cf4SHamdan Igbaria 25978580cf4SHamdan Igbaria static int mlx5dr_debug_dump_table(FILE *f, struct mlx5dr_table *tbl) 26078580cf4SHamdan Igbaria { 2611cf83b1fSErez Shitrit bool is_shared = mlx5dr_context_shared_gvmi_used(tbl->ctx); 26278580cf4SHamdan Igbaria bool is_root = tbl->level == MLX5DR_ROOT_LEVEL; 26378580cf4SHamdan Igbaria struct mlx5dr_matcher *matcher; 26478580cf4SHamdan Igbaria int ret; 26578580cf4SHamdan Igbaria 2661cf83b1fSErez Shitrit ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d,%d,%d\n", 26778580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_TABLE, 26878580cf4SHamdan Igbaria (uint64_t)(uintptr_t)tbl, 26978580cf4SHamdan Igbaria (uint64_t)(uintptr_t)tbl->ctx, 27078580cf4SHamdan Igbaria is_root ? 0 : tbl->ft->id, 27178580cf4SHamdan Igbaria tbl->type, 27278580cf4SHamdan Igbaria is_root ? 0 : tbl->fw_ft_type, 2731cf83b1fSErez Shitrit tbl->level, 2741cf83b1fSErez Shitrit is_shared && !is_root ? tbl->local_ft->id : 0); 27578580cf4SHamdan Igbaria if (ret < 0) { 27678580cf4SHamdan Igbaria rte_errno = EINVAL; 27778580cf4SHamdan Igbaria return rte_errno; 27878580cf4SHamdan Igbaria } 27978580cf4SHamdan Igbaria 28078580cf4SHamdan Igbaria LIST_FOREACH(matcher, &tbl->head, next) { 28178580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher(f, matcher); 28278580cf4SHamdan Igbaria if (ret) 28378580cf4SHamdan Igbaria return ret; 28478580cf4SHamdan Igbaria } 28578580cf4SHamdan Igbaria 28678580cf4SHamdan Igbaria return 0; 28778580cf4SHamdan Igbaria } 28878580cf4SHamdan Igbaria 28978580cf4SHamdan Igbaria static int 29078580cf4SHamdan Igbaria mlx5dr_debug_dump_context_send_engine(FILE *f, struct mlx5dr_context *ctx) 29178580cf4SHamdan Igbaria { 29278580cf4SHamdan Igbaria struct mlx5dr_send_engine *send_queue; 29378580cf4SHamdan Igbaria int ret, i, j; 29478580cf4SHamdan Igbaria 29578580cf4SHamdan Igbaria for (i = 0; i < (int)ctx->queues; i++) { 29678580cf4SHamdan Igbaria send_queue = &ctx->send_queue[i]; 29778580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 29878580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_SEND_ENGINE, 29978580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 30078580cf4SHamdan Igbaria i, 30178580cf4SHamdan Igbaria send_queue->used_entries, 30278580cf4SHamdan Igbaria send_queue->th_entries, 30378580cf4SHamdan Igbaria send_queue->rings, 30478580cf4SHamdan Igbaria send_queue->num_entries, 30578580cf4SHamdan Igbaria send_queue->err, 30678580cf4SHamdan Igbaria send_queue->completed.ci, 30778580cf4SHamdan Igbaria send_queue->completed.pi, 30878580cf4SHamdan Igbaria send_queue->completed.mask); 30978580cf4SHamdan Igbaria if (ret < 0) { 31078580cf4SHamdan Igbaria rte_errno = EINVAL; 31178580cf4SHamdan Igbaria return rte_errno; 31278580cf4SHamdan Igbaria } 31378580cf4SHamdan Igbaria 31478580cf4SHamdan Igbaria for (j = 0; j < MLX5DR_NUM_SEND_RINGS; j++) { 31578580cf4SHamdan Igbaria struct mlx5dr_send_ring *send_ring = &send_queue->send_ring[j]; 31678580cf4SHamdan Igbaria struct mlx5dr_send_ring_cq *cq = &send_ring->send_cq; 31778580cf4SHamdan Igbaria struct mlx5dr_send_ring_sq *sq = &send_ring->send_sq; 31878580cf4SHamdan Igbaria 31978580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 32078580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_SEND_RING, 32178580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 32278580cf4SHamdan Igbaria j, 32378580cf4SHamdan Igbaria i, 32478580cf4SHamdan Igbaria cq->cqn, 32578580cf4SHamdan Igbaria cq->cons_index, 32678580cf4SHamdan Igbaria cq->ncqe_mask, 32778580cf4SHamdan Igbaria cq->buf_sz, 32878580cf4SHamdan Igbaria cq->ncqe, 32978580cf4SHamdan Igbaria cq->cqe_log_sz, 33078580cf4SHamdan Igbaria cq->poll_wqe, 33178580cf4SHamdan Igbaria cq->cqe_sz, 33278580cf4SHamdan Igbaria sq->sqn, 33378580cf4SHamdan Igbaria sq->obj->id, 33478580cf4SHamdan Igbaria sq->cur_post, 33578580cf4SHamdan Igbaria sq->buf_mask); 33678580cf4SHamdan Igbaria if (ret < 0) { 33778580cf4SHamdan Igbaria rte_errno = EINVAL; 33878580cf4SHamdan Igbaria return rte_errno; 33978580cf4SHamdan Igbaria } 34078580cf4SHamdan Igbaria } 34178580cf4SHamdan Igbaria } 34278580cf4SHamdan Igbaria 34378580cf4SHamdan Igbaria return 0; 34478580cf4SHamdan Igbaria } 34578580cf4SHamdan Igbaria 34678580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_caps(FILE *f, struct mlx5dr_context *ctx) 34778580cf4SHamdan Igbaria { 34878580cf4SHamdan Igbaria struct mlx5dr_cmd_query_caps *caps = ctx->caps; 34978580cf4SHamdan Igbaria int ret; 35078580cf4SHamdan Igbaria 35178580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%s,%d,%d,%d,%d,", 35278580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_CAPS, 35378580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 35478580cf4SHamdan Igbaria caps->fw_ver, 35578580cf4SHamdan Igbaria caps->wqe_based_update, 35678580cf4SHamdan Igbaria caps->ste_format, 35778580cf4SHamdan Igbaria caps->ste_alloc_log_max, 35878580cf4SHamdan Igbaria caps->log_header_modify_argument_max_alloc); 35978580cf4SHamdan Igbaria if (ret < 0) { 36078580cf4SHamdan Igbaria rte_errno = EINVAL; 36178580cf4SHamdan Igbaria return rte_errno; 36278580cf4SHamdan Igbaria } 36378580cf4SHamdan Igbaria 36478580cf4SHamdan Igbaria ret = fprintf(f, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 36578580cf4SHamdan Igbaria caps->flex_protocols, 36678580cf4SHamdan Igbaria caps->rtc_reparse_mode, 36778580cf4SHamdan Igbaria caps->rtc_index_mode, 36878580cf4SHamdan Igbaria caps->ste_alloc_log_gran, 36978580cf4SHamdan Igbaria caps->stc_alloc_log_max, 37078580cf4SHamdan Igbaria caps->stc_alloc_log_gran, 37178580cf4SHamdan Igbaria caps->rtc_log_depth_max, 37278580cf4SHamdan Igbaria caps->format_select_gtpu_dw_0, 37378580cf4SHamdan Igbaria caps->format_select_gtpu_dw_1, 37478580cf4SHamdan Igbaria caps->format_select_gtpu_dw_2, 37578580cf4SHamdan Igbaria caps->format_select_gtpu_ext_dw_0, 37678580cf4SHamdan Igbaria caps->nic_ft.max_level, 37778580cf4SHamdan Igbaria caps->nic_ft.reparse, 37878580cf4SHamdan Igbaria caps->fdb_ft.max_level, 37978580cf4SHamdan Igbaria caps->fdb_ft.reparse, 38078580cf4SHamdan Igbaria caps->log_header_modify_argument_granularity); 38178580cf4SHamdan Igbaria if (ret < 0) { 38278580cf4SHamdan Igbaria rte_errno = EINVAL; 38378580cf4SHamdan Igbaria return rte_errno; 38478580cf4SHamdan Igbaria } 38578580cf4SHamdan Igbaria 38678580cf4SHamdan Igbaria return 0; 38778580cf4SHamdan Igbaria } 38878580cf4SHamdan Igbaria 38978580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_attr(FILE *f, struct mlx5dr_context *ctx) 39078580cf4SHamdan Igbaria { 39178580cf4SHamdan Igbaria int ret; 39278580cf4SHamdan Igbaria 3931cf83b1fSErez Shitrit ret = fprintf(f, "%u,0x%" PRIx64 ",%d,%zu,%d,%s,%d,%d\n", 39478580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_ATTR, 39578580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 39678580cf4SHamdan Igbaria ctx->pd_num, 39778580cf4SHamdan Igbaria ctx->queues, 3981cf83b1fSErez Shitrit ctx->send_queue->num_entries, 3991cf83b1fSErez Shitrit mlx5dr_context_shared_gvmi_used(ctx) ? 4001cf83b1fSErez Shitrit mlx5_glue->get_device_name(ctx->ibv_ctx->device) : "None", 4011cf83b1fSErez Shitrit ctx->caps->vhca_id, 4021cf83b1fSErez Shitrit mlx5dr_context_shared_gvmi_used(ctx) ? 4031cf83b1fSErez Shitrit ctx->caps->shared_vhca_id : 0xffff); 40478580cf4SHamdan Igbaria if (ret < 0) { 40578580cf4SHamdan Igbaria rte_errno = EINVAL; 40678580cf4SHamdan Igbaria return rte_errno; 40778580cf4SHamdan Igbaria } 40878580cf4SHamdan Igbaria 40978580cf4SHamdan Igbaria return 0; 41078580cf4SHamdan Igbaria } 41178580cf4SHamdan Igbaria 41278580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_info(FILE *f, struct mlx5dr_context *ctx) 41378580cf4SHamdan Igbaria { 41478580cf4SHamdan Igbaria int ret; 41578580cf4SHamdan Igbaria 41678580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%s,%s\n", 41778580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT, 41878580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 41978580cf4SHamdan Igbaria ctx->flags & MLX5DR_CONTEXT_FLAG_HWS_SUPPORT, 420ce946c7dSErez Shitrit mlx5_glue->get_device_name(mlx5dr_context_get_local_ibv(ctx)->device), 42178580cf4SHamdan Igbaria DEBUG_VERSION); 42278580cf4SHamdan Igbaria if (ret < 0) { 42378580cf4SHamdan Igbaria rte_errno = EINVAL; 42478580cf4SHamdan Igbaria return rte_errno; 42578580cf4SHamdan Igbaria } 42678580cf4SHamdan Igbaria 42778580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context_attr(f, ctx); 42878580cf4SHamdan Igbaria if (ret) 42978580cf4SHamdan Igbaria return ret; 43078580cf4SHamdan Igbaria 43178580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context_caps(f, ctx); 43278580cf4SHamdan Igbaria if (ret) 43378580cf4SHamdan Igbaria return ret; 43478580cf4SHamdan Igbaria 43578580cf4SHamdan Igbaria return 0; 43678580cf4SHamdan Igbaria } 43778580cf4SHamdan Igbaria 43878580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context(FILE *f, struct mlx5dr_context *ctx) 43978580cf4SHamdan Igbaria { 44078580cf4SHamdan Igbaria struct mlx5dr_table *tbl; 44178580cf4SHamdan Igbaria int ret; 44278580cf4SHamdan Igbaria 44378580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context_info(f, ctx); 44478580cf4SHamdan Igbaria if (ret) 44578580cf4SHamdan Igbaria return ret; 44678580cf4SHamdan Igbaria 44778580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context_send_engine(f, ctx); 44878580cf4SHamdan Igbaria if (ret) 44978580cf4SHamdan Igbaria return ret; 45078580cf4SHamdan Igbaria 45178580cf4SHamdan Igbaria LIST_FOREACH(tbl, &ctx->head, next) { 45278580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_table(f, tbl); 45378580cf4SHamdan Igbaria if (ret) 45478580cf4SHamdan Igbaria return ret; 45578580cf4SHamdan Igbaria } 45678580cf4SHamdan Igbaria 45778580cf4SHamdan Igbaria return 0; 45878580cf4SHamdan Igbaria } 45978580cf4SHamdan Igbaria 46078580cf4SHamdan Igbaria int mlx5dr_debug_dump(struct mlx5dr_context *ctx, FILE *f) 46178580cf4SHamdan Igbaria { 46278580cf4SHamdan Igbaria int ret; 46378580cf4SHamdan Igbaria 46478580cf4SHamdan Igbaria if (!f || !ctx) { 46578580cf4SHamdan Igbaria rte_errno = EINVAL; 46678580cf4SHamdan Igbaria return -rte_errno; 46778580cf4SHamdan Igbaria } 46878580cf4SHamdan Igbaria 46978580cf4SHamdan Igbaria pthread_spin_lock(&ctx->ctrl_lock); 47078580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context(f, ctx); 47178580cf4SHamdan Igbaria pthread_spin_unlock(&ctx->ctrl_lock); 47278580cf4SHamdan Igbaria 47378580cf4SHamdan Igbaria return -ret; 47478580cf4SHamdan Igbaria } 475