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", 9236b7277SShun Hao [MLX5DR_ACTION_TYP_REFORMAT_TNL_L2_TO_L2] = "TNL_L2_TO_L2", 10236b7277SShun Hao [MLX5DR_ACTION_TYP_REFORMAT_L2_TO_TNL_L2] = "L2_TO_TNL_L2", 11236b7277SShun Hao [MLX5DR_ACTION_TYP_REFORMAT_TNL_L3_TO_L2] = "TNL_L3_TO_L2", 12236b7277SShun Hao [MLX5DR_ACTION_TYP_REFORMAT_L2_TO_TNL_L3] = "L2_TO_TNL_L3", 1378580cf4SHamdan Igbaria [MLX5DR_ACTION_TYP_DROP] = "DROP", 1478580cf4SHamdan Igbaria [MLX5DR_ACTION_TYP_TIR] = "TIR", 15e90a60daSItamar Gozlan [MLX5DR_ACTION_TYP_TBL] = "TBL", 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", 2572fc5064SItamar Gozlan [MLX5DR_ACTION_TYP_DEST_ROOT] = "DEST_ROOT", 26eefaf43dSShun Hao [MLX5DR_ACTION_TYP_DEST_ARRAY] = "DEST_ARRAY", 2713769225SHamdan Igbaria [MLX5DR_ACTION_TYP_INSERT_HEADER] = "INSERT_HEADER", 2870ee833aSHamdan Igbaria [MLX5DR_ACTION_TYP_REMOVE_HEADER] = "REMOVE_HEADER", 290891355dSRongwei Liu [MLX5DR_ACTION_TYP_POP_IPV6_ROUTE_EXT] = "POP_IPV6_ROUTE_EXT", 300891355dSRongwei Liu [MLX5DR_ACTION_TYP_PUSH_IPV6_ROUTE_EXT] = "PUSH_IPV6_ROUTE_EXT", 3106d969a8SErez Shitrit [MLX5DR_ACTION_TYP_NAT64] = "NAT64", 32*efb62499SHamdan Igbaria [MLX5DR_ACTION_TYP_JUMP_TO_MATCHER] = "JUMP_TO_MATCHER", 3378580cf4SHamdan Igbaria }; 3478580cf4SHamdan Igbaria 3578580cf4SHamdan Igbaria static_assert(ARRAY_SIZE(mlx5dr_debug_action_type_str) == MLX5DR_ACTION_TYP_MAX, 3678580cf4SHamdan Igbaria "Missing mlx5dr_debug_action_type_str"); 3778580cf4SHamdan Igbaria 3878580cf4SHamdan Igbaria const char *mlx5dr_debug_action_type_to_str(enum mlx5dr_action_type action_type) 3978580cf4SHamdan Igbaria { 4078580cf4SHamdan Igbaria return mlx5dr_debug_action_type_str[action_type]; 4178580cf4SHamdan Igbaria } 4278580cf4SHamdan Igbaria 4378580cf4SHamdan Igbaria static int 4478580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_template_definer(FILE *f, 45d6c69bcaSAlex Vesker void *parent_obj, 46d6c69bcaSAlex Vesker struct mlx5dr_definer *definer, 47d6c69bcaSAlex Vesker enum mlx5dr_debug_res_type type) 4878580cf4SHamdan Igbaria { 4978580cf4SHamdan Igbaria int i, ret; 5078580cf4SHamdan Igbaria 51d6c69bcaSAlex Vesker if (!definer) 52d6c69bcaSAlex Vesker return 0; 53d6c69bcaSAlex Vesker 5478580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,", 55d6c69bcaSAlex Vesker type, 5678580cf4SHamdan Igbaria (uint64_t)(uintptr_t)definer, 57d6c69bcaSAlex Vesker (uint64_t)(uintptr_t)parent_obj, 5878580cf4SHamdan Igbaria definer->obj->id, 5978580cf4SHamdan Igbaria definer->type); 6078580cf4SHamdan Igbaria if (ret < 0) { 6178580cf4SHamdan Igbaria rte_errno = EINVAL; 6278580cf4SHamdan Igbaria return rte_errno; 6378580cf4SHamdan Igbaria } 6478580cf4SHamdan Igbaria 6578580cf4SHamdan Igbaria for (i = 0; i < DW_SELECTORS; i++) { 6678580cf4SHamdan Igbaria ret = fprintf(f, "0x%x%s", definer->dw_selector[i], 6778580cf4SHamdan Igbaria (i == DW_SELECTORS - 1) ? "," : "-"); 6878580cf4SHamdan Igbaria if (ret < 0) { 6978580cf4SHamdan Igbaria rte_errno = EINVAL; 7078580cf4SHamdan Igbaria return rte_errno; 7178580cf4SHamdan Igbaria } 7278580cf4SHamdan Igbaria } 7378580cf4SHamdan Igbaria 7478580cf4SHamdan Igbaria for (i = 0; i < BYTE_SELECTORS; i++) { 7578580cf4SHamdan Igbaria ret = fprintf(f, "0x%x%s", definer->byte_selector[i], 7678580cf4SHamdan Igbaria (i == BYTE_SELECTORS - 1) ? "," : "-"); 7778580cf4SHamdan Igbaria if (ret < 0) { 7878580cf4SHamdan Igbaria rte_errno = EINVAL; 7978580cf4SHamdan Igbaria return rte_errno; 8078580cf4SHamdan Igbaria } 8178580cf4SHamdan Igbaria } 8278580cf4SHamdan Igbaria 8378580cf4SHamdan Igbaria for (i = 0; i < MLX5DR_JUMBO_TAG_SZ; i++) { 8478580cf4SHamdan Igbaria ret = fprintf(f, "%02x", definer->mask.jumbo[i]); 8578580cf4SHamdan Igbaria if (ret < 0) { 8678580cf4SHamdan Igbaria rte_errno = EINVAL; 8778580cf4SHamdan Igbaria return rte_errno; 8878580cf4SHamdan Igbaria } 8978580cf4SHamdan Igbaria } 9078580cf4SHamdan Igbaria 9178580cf4SHamdan Igbaria ret = fprintf(f, "\n"); 9278580cf4SHamdan Igbaria if (ret < 0) { 9378580cf4SHamdan Igbaria rte_errno = EINVAL; 9478580cf4SHamdan Igbaria return rte_errno; 9578580cf4SHamdan Igbaria } 9678580cf4SHamdan Igbaria 9778580cf4SHamdan Igbaria return 0; 9878580cf4SHamdan Igbaria } 9978580cf4SHamdan Igbaria 10078580cf4SHamdan Igbaria static int 10178580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_match_template(FILE *f, struct mlx5dr_matcher *matcher) 10278580cf4SHamdan Igbaria { 10378580cf4SHamdan Igbaria bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL; 104a5230507SHamdan Igbaria bool is_compare = mlx5dr_matcher_is_compare(matcher); 105d6c69bcaSAlex Vesker enum mlx5dr_debug_res_type type; 10678580cf4SHamdan Igbaria int i, ret; 10778580cf4SHamdan Igbaria 10878580cf4SHamdan Igbaria for (i = 0; i < matcher->num_of_mt; i++) { 109940b0ebaSAlex Vesker struct mlx5dr_match_template *mt = &matcher->mt[i]; 11078580cf4SHamdan Igbaria 111d6c69bcaSAlex Vesker ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d\n", 11278580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_MATCH_TEMPLATE, 11378580cf4SHamdan Igbaria (uint64_t)(uintptr_t)mt, 11478580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 11578580cf4SHamdan Igbaria is_root ? 0 : mt->fc_sz, 116d6c69bcaSAlex Vesker mt->flags, 117d6c69bcaSAlex Vesker is_root ? 0 : mt->fcr_sz); 11878580cf4SHamdan Igbaria if (ret < 0) { 11978580cf4SHamdan Igbaria rte_errno = EINVAL; 12078580cf4SHamdan Igbaria return rte_errno; 12178580cf4SHamdan Igbaria } 12278580cf4SHamdan Igbaria 123a5230507SHamdan Igbaria type = is_compare ? MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_COMPARE_MATCH_DEFINER : 124a5230507SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_MATCH_DEFINER; 125d6c69bcaSAlex Vesker ret = mlx5dr_debug_dump_matcher_template_definer(f, mt, mt->definer, type); 126d6c69bcaSAlex Vesker if (ret) 127d6c69bcaSAlex Vesker return ret; 128d6c69bcaSAlex Vesker 129d6c69bcaSAlex Vesker type = MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_RANGE_DEFINER; 130d6c69bcaSAlex Vesker ret = mlx5dr_debug_dump_matcher_template_definer(f, mt, mt->range_definer, type); 13178580cf4SHamdan Igbaria if (ret) 13278580cf4SHamdan Igbaria return ret; 13378580cf4SHamdan Igbaria } 134d6c69bcaSAlex Vesker 135d6c69bcaSAlex Vesker type = MLX5DR_DEBUG_RES_TYPE_MATCHER_TEMPLATE_HASH_DEFINER; 136d6c69bcaSAlex Vesker ret = mlx5dr_debug_dump_matcher_template_definer(f, matcher, matcher->hash_definer, type); 137d6c69bcaSAlex Vesker if (ret) 138d6c69bcaSAlex Vesker return ret; 13978580cf4SHamdan Igbaria 14078580cf4SHamdan Igbaria return 0; 14178580cf4SHamdan Igbaria } 14278580cf4SHamdan Igbaria 14378580cf4SHamdan Igbaria static int 14478580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_action_template(FILE *f, struct mlx5dr_matcher *matcher) 14578580cf4SHamdan Igbaria { 14678580cf4SHamdan Igbaria bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL; 14778580cf4SHamdan Igbaria enum mlx5dr_action_type action_type; 14878580cf4SHamdan Igbaria int i, j, ret; 14978580cf4SHamdan Igbaria 15078580cf4SHamdan Igbaria for (i = 0; i < matcher->num_of_at; i++) { 151940b0ebaSAlex Vesker struct mlx5dr_action_template *at = &matcher->at[i]; 15278580cf4SHamdan Igbaria 15378580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d", 15478580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_ACTION_TEMPLATE, 15578580cf4SHamdan Igbaria (uint64_t)(uintptr_t)at, 15678580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 15798638051SHamdan Igbaria at->only_term, 15878580cf4SHamdan Igbaria is_root ? 0 : at->num_of_action_stes, 15978580cf4SHamdan Igbaria at->num_actions); 16078580cf4SHamdan Igbaria if (ret < 0) { 16178580cf4SHamdan Igbaria rte_errno = EINVAL; 16278580cf4SHamdan Igbaria return rte_errno; 16378580cf4SHamdan Igbaria } 16478580cf4SHamdan Igbaria 16578580cf4SHamdan Igbaria for (j = 0; j < at->num_actions; j++) { 16678580cf4SHamdan Igbaria action_type = at->action_type_arr[j]; 16778580cf4SHamdan Igbaria ret = fprintf(f, ",%s", mlx5dr_debug_action_type_to_str(action_type)); 16878580cf4SHamdan Igbaria if (ret < 0) { 16978580cf4SHamdan Igbaria rte_errno = EINVAL; 17078580cf4SHamdan Igbaria return rte_errno; 17178580cf4SHamdan Igbaria } 17278580cf4SHamdan Igbaria } 17378580cf4SHamdan Igbaria 17478580cf4SHamdan Igbaria fprintf(f, "\n"); 17578580cf4SHamdan Igbaria } 17678580cf4SHamdan Igbaria 17778580cf4SHamdan Igbaria return 0; 17878580cf4SHamdan Igbaria } 17978580cf4SHamdan Igbaria 18078580cf4SHamdan Igbaria static int 18178580cf4SHamdan Igbaria mlx5dr_debug_dump_matcher_attr(FILE *f, struct mlx5dr_matcher *matcher) 18278580cf4SHamdan Igbaria { 18378580cf4SHamdan Igbaria struct mlx5dr_matcher_attr *attr = &matcher->attr; 18478580cf4SHamdan Igbaria int ret; 18578580cf4SHamdan Igbaria 186486f9aacSHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 18778580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_ATTR, 18878580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 18978580cf4SHamdan Igbaria attr->priority, 19078580cf4SHamdan Igbaria attr->mode, 19178580cf4SHamdan Igbaria attr->table.sz_row_log, 19278580cf4SHamdan Igbaria attr->table.sz_col_log, 19378580cf4SHamdan Igbaria attr->optimize_using_rule_idx, 19438b5bf64SYevgeny Kliteynik attr->optimize_flow_src, 19538b5bf64SYevgeny Kliteynik attr->insert_mode, 196486f9aacSHamdan Igbaria attr->distribute_mode, 197486f9aacSHamdan Igbaria attr->match_mode, 198486f9aacSHamdan Igbaria attr->isolated); 19978580cf4SHamdan Igbaria if (ret < 0) { 20078580cf4SHamdan Igbaria rte_errno = EINVAL; 20178580cf4SHamdan Igbaria return rte_errno; 20278580cf4SHamdan Igbaria } 20378580cf4SHamdan Igbaria 20478580cf4SHamdan Igbaria return 0; 20578580cf4SHamdan Igbaria } 20678580cf4SHamdan Igbaria 20778580cf4SHamdan Igbaria static int mlx5dr_debug_dump_matcher(FILE *f, struct mlx5dr_matcher *matcher) 20878580cf4SHamdan Igbaria { 2091cf83b1fSErez Shitrit bool is_shared = mlx5dr_context_shared_gvmi_used(matcher->tbl->ctx); 21078580cf4SHamdan Igbaria bool is_root = matcher->tbl->level == MLX5DR_ROOT_LEVEL; 21178580cf4SHamdan Igbaria enum mlx5dr_table_type tbl_type = matcher->tbl->type; 212fd821625SHamdan Igbaria struct mlx5dr_matcher_resize_data *resize_data; 213004edb48SHamdan Igbaria struct mlx5dr_cmd_ft_query_attr ft_attr = {0}; 21478580cf4SHamdan Igbaria struct mlx5dr_devx_obj *ste_0, *ste_1 = NULL; 21578580cf4SHamdan Igbaria struct mlx5dr_pool_chunk *ste; 21678580cf4SHamdan Igbaria struct mlx5dr_pool *ste_pool; 217004edb48SHamdan Igbaria uint64_t icm_addr_0 = 0; 218004edb48SHamdan Igbaria uint64_t icm_addr_1 = 0; 21978580cf4SHamdan Igbaria int ret; 22078580cf4SHamdan Igbaria 22178580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,0x%" PRIx64, 22278580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER, 22378580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 22478580cf4SHamdan Igbaria (uint64_t)(uintptr_t)matcher->tbl, 22578580cf4SHamdan Igbaria matcher->num_of_mt, 22678580cf4SHamdan Igbaria is_root ? 0 : matcher->end_ft->id, 22778580cf4SHamdan Igbaria matcher->col_matcher ? (uint64_t)(uintptr_t)matcher->col_matcher : 0); 22878580cf4SHamdan Igbaria if (ret < 0) 22978580cf4SHamdan Igbaria goto out_err; 23078580cf4SHamdan Igbaria 23178580cf4SHamdan Igbaria ste = &matcher->match_ste.ste; 23278580cf4SHamdan Igbaria ste_pool = matcher->match_ste.pool; 23378580cf4SHamdan Igbaria if (ste_pool) { 23478580cf4SHamdan Igbaria ste_0 = mlx5dr_pool_chunk_get_base_devx_obj(ste_pool, ste); 23578580cf4SHamdan Igbaria if (tbl_type == MLX5DR_TABLE_TYPE_FDB) 23678580cf4SHamdan Igbaria ste_1 = mlx5dr_pool_chunk_get_base_devx_obj_mirror(ste_pool, ste); 23778580cf4SHamdan Igbaria } else { 23878580cf4SHamdan Igbaria ste_0 = NULL; 23978580cf4SHamdan Igbaria ste_1 = NULL; 24078580cf4SHamdan Igbaria } 24178580cf4SHamdan Igbaria 242846d281fSHamdan Igbaria ret = fprintf(f, ",%d,%d,%d,%d", 24378580cf4SHamdan Igbaria matcher->match_ste.rtc_0 ? matcher->match_ste.rtc_0->id : 0, 24478580cf4SHamdan Igbaria ste_0 ? (int)ste_0->id : -1, 24578580cf4SHamdan Igbaria matcher->match_ste.rtc_1 ? matcher->match_ste.rtc_1->id : 0, 246846d281fSHamdan Igbaria ste_1 ? (int)ste_1->id : -1); 24778580cf4SHamdan Igbaria if (ret < 0) 24878580cf4SHamdan Igbaria goto out_err; 24978580cf4SHamdan Igbaria 25078580cf4SHamdan Igbaria ste = &matcher->action_ste.ste; 25178580cf4SHamdan Igbaria ste_pool = matcher->action_ste.pool; 25278580cf4SHamdan Igbaria if (ste_pool) { 25378580cf4SHamdan Igbaria ste_0 = mlx5dr_pool_chunk_get_base_devx_obj(ste_pool, ste); 25478580cf4SHamdan Igbaria if (tbl_type == MLX5DR_TABLE_TYPE_FDB) 25578580cf4SHamdan Igbaria ste_1 = mlx5dr_pool_chunk_get_base_devx_obj_mirror(ste_pool, ste); 25678580cf4SHamdan Igbaria } else { 25778580cf4SHamdan Igbaria ste_0 = NULL; 25878580cf4SHamdan Igbaria ste_1 = NULL; 25978580cf4SHamdan Igbaria } 26078580cf4SHamdan Igbaria 261004edb48SHamdan Igbaria if (!is_root) { 262004edb48SHamdan Igbaria ft_attr.type = matcher->tbl->fw_ft_type; 263004edb48SHamdan Igbaria ret = mlx5dr_cmd_flow_table_query(matcher->end_ft, 264004edb48SHamdan Igbaria &ft_attr, 265004edb48SHamdan Igbaria &icm_addr_0, 266004edb48SHamdan Igbaria &icm_addr_1); 267004edb48SHamdan Igbaria if (ret) 268004edb48SHamdan Igbaria return ret; 269004edb48SHamdan Igbaria } 270004edb48SHamdan Igbaria 271004edb48SHamdan Igbaria ret = fprintf(f, ",%d,%d,%d,%d,%d,0x%" PRIx64 ",0x%" PRIx64 "\n", 27278580cf4SHamdan Igbaria matcher->action_ste.rtc_0 ? matcher->action_ste.rtc_0->id : 0, 27378580cf4SHamdan Igbaria ste_0 ? (int)ste_0->id : -1, 27478580cf4SHamdan Igbaria matcher->action_ste.rtc_1 ? matcher->action_ste.rtc_1->id : 0, 275846d281fSHamdan Igbaria ste_1 ? (int)ste_1->id : -1, 276846d281fSHamdan Igbaria is_shared && !is_root ? 277004edb48SHamdan Igbaria matcher->match_ste.aliased_rtc_0->id : 0, 278004edb48SHamdan Igbaria mlx5dr_debug_icm_to_idx(icm_addr_0), 279004edb48SHamdan Igbaria mlx5dr_debug_icm_to_idx(icm_addr_1)); 28078580cf4SHamdan Igbaria if (ret < 0) 28178580cf4SHamdan Igbaria goto out_err; 28278580cf4SHamdan Igbaria 28378580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher_attr(f, matcher); 28478580cf4SHamdan Igbaria if (ret) 28578580cf4SHamdan Igbaria return ret; 28678580cf4SHamdan Igbaria 28778580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher_match_template(f, matcher); 28878580cf4SHamdan Igbaria if (ret) 28978580cf4SHamdan Igbaria return ret; 29078580cf4SHamdan Igbaria 29178580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher_action_template(f, matcher); 29278580cf4SHamdan Igbaria if (ret) 29378580cf4SHamdan Igbaria return ret; 29478580cf4SHamdan Igbaria 295fd821625SHamdan Igbaria LIST_FOREACH(resize_data, &matcher->resize_data, next) { 296fd821625SHamdan Igbaria ste = &resize_data->ste; 297fd821625SHamdan Igbaria ste_pool = resize_data->action_ste_pool; 298fd821625SHamdan Igbaria if (ste_pool) { 299fd821625SHamdan Igbaria ste_0 = mlx5dr_pool_chunk_get_base_devx_obj(ste_pool, ste); 300fd821625SHamdan Igbaria if (tbl_type == MLX5DR_TABLE_TYPE_FDB) 301fd821625SHamdan Igbaria ste_1 = mlx5dr_pool_chunk_get_base_devx_obj_mirror(ste_pool, ste); 302fd821625SHamdan Igbaria } else { 303fd821625SHamdan Igbaria ste_0 = NULL; 304fd821625SHamdan Igbaria ste_1 = NULL; 305fd821625SHamdan Igbaria } 306fd821625SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d\n", 307fd821625SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_MATCHER_RESIZABLE_ACTION_ARRAY, 308fd821625SHamdan Igbaria (uint64_t)(uintptr_t)matcher, 309fd821625SHamdan Igbaria resize_data->action_ste_rtc_0 ? resize_data->action_ste_rtc_0->id : 0, 310fd821625SHamdan Igbaria ste_0 ? (int)ste_0->id : -1, 311fd821625SHamdan Igbaria resize_data->action_ste_rtc_1 ? resize_data->action_ste_rtc_1->id : 0, 312fd821625SHamdan Igbaria ste_1 ? (int)ste_1->id : -1); 313fd821625SHamdan Igbaria if (ret < 0) 314fd821625SHamdan Igbaria return ret; 315fd821625SHamdan Igbaria } 316fd821625SHamdan Igbaria 31778580cf4SHamdan Igbaria return 0; 31878580cf4SHamdan Igbaria 31978580cf4SHamdan Igbaria out_err: 32078580cf4SHamdan Igbaria rte_errno = EINVAL; 32178580cf4SHamdan Igbaria return rte_errno; 32278580cf4SHamdan Igbaria } 32378580cf4SHamdan Igbaria 32478580cf4SHamdan Igbaria static int mlx5dr_debug_dump_table(FILE *f, struct mlx5dr_table *tbl) 32578580cf4SHamdan Igbaria { 3261cf83b1fSErez Shitrit bool is_shared = mlx5dr_context_shared_gvmi_used(tbl->ctx); 32778580cf4SHamdan Igbaria bool is_root = tbl->level == MLX5DR_ROOT_LEVEL; 328004edb48SHamdan Igbaria struct mlx5dr_cmd_ft_query_attr ft_attr = {0}; 32978580cf4SHamdan Igbaria struct mlx5dr_matcher *matcher; 330004edb48SHamdan Igbaria uint64_t local_icm_addr_0 = 0; 331004edb48SHamdan Igbaria uint64_t local_icm_addr_1 = 0; 332004edb48SHamdan Igbaria uint64_t icm_addr_0 = 0; 333004edb48SHamdan Igbaria uint64_t icm_addr_1 = 0; 33478580cf4SHamdan Igbaria int ret; 33578580cf4SHamdan Igbaria 336004edb48SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,%d,%d,%d,%d", 33778580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_TABLE, 33878580cf4SHamdan Igbaria (uint64_t)(uintptr_t)tbl, 33978580cf4SHamdan Igbaria (uint64_t)(uintptr_t)tbl->ctx, 34078580cf4SHamdan Igbaria is_root ? 0 : tbl->ft->id, 34178580cf4SHamdan Igbaria tbl->type, 34278580cf4SHamdan Igbaria is_root ? 0 : tbl->fw_ft_type, 3431cf83b1fSErez Shitrit tbl->level, 3441cf83b1fSErez Shitrit is_shared && !is_root ? tbl->local_ft->id : 0); 345004edb48SHamdan Igbaria if (ret < 0) 346004edb48SHamdan Igbaria goto out_err; 347004edb48SHamdan Igbaria 348004edb48SHamdan Igbaria if (!is_root) { 349004edb48SHamdan Igbaria ft_attr.type = tbl->fw_ft_type; 350004edb48SHamdan Igbaria ret = mlx5dr_cmd_flow_table_query(tbl->ft, 351004edb48SHamdan Igbaria &ft_attr, 352004edb48SHamdan Igbaria &icm_addr_0, 353004edb48SHamdan Igbaria &icm_addr_1); 354004edb48SHamdan Igbaria if (ret) 355004edb48SHamdan Igbaria return ret; 356004edb48SHamdan Igbaria 357004edb48SHamdan Igbaria if (is_shared) { 358004edb48SHamdan Igbaria ft_attr.type = tbl->fw_ft_type; 359004edb48SHamdan Igbaria ret = mlx5dr_cmd_flow_table_query(tbl->local_ft, 360004edb48SHamdan Igbaria &ft_attr, 361004edb48SHamdan Igbaria &local_icm_addr_0, 362004edb48SHamdan Igbaria &local_icm_addr_1); 363004edb48SHamdan Igbaria if (ret) 364004edb48SHamdan Igbaria return ret; 36578580cf4SHamdan Igbaria } 366004edb48SHamdan Igbaria } 367004edb48SHamdan Igbaria 368b81f95caSItamar Gozlan ret = fprintf(f, ",0x%" PRIx64 ",0x%" PRIx64 ",0x%" PRIx64 ",0x%" PRIx64 ",0x%" PRIx64 "\n", 369004edb48SHamdan Igbaria mlx5dr_debug_icm_to_idx(icm_addr_0), 370004edb48SHamdan Igbaria mlx5dr_debug_icm_to_idx(icm_addr_1), 371004edb48SHamdan Igbaria mlx5dr_debug_icm_to_idx(local_icm_addr_0), 372b81f95caSItamar Gozlan mlx5dr_debug_icm_to_idx(local_icm_addr_1), 373b81f95caSItamar Gozlan (uint64_t)(uintptr_t)tbl->default_miss.miss_tbl); 374004edb48SHamdan Igbaria if (ret < 0) 375004edb48SHamdan Igbaria goto out_err; 37678580cf4SHamdan Igbaria 37778580cf4SHamdan Igbaria LIST_FOREACH(matcher, &tbl->head, next) { 37878580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_matcher(f, matcher); 37978580cf4SHamdan Igbaria if (ret) 38078580cf4SHamdan Igbaria return ret; 38178580cf4SHamdan Igbaria } 38278580cf4SHamdan Igbaria 383486f9aacSHamdan Igbaria LIST_FOREACH(matcher, &tbl->isolated_matchers, next) { 384486f9aacSHamdan Igbaria ret = mlx5dr_debug_dump_matcher(f, matcher); 385486f9aacSHamdan Igbaria if (ret) 386486f9aacSHamdan Igbaria return ret; 387486f9aacSHamdan Igbaria } 388486f9aacSHamdan Igbaria 38978580cf4SHamdan Igbaria return 0; 390004edb48SHamdan Igbaria 391004edb48SHamdan Igbaria out_err: 392004edb48SHamdan Igbaria rte_errno = EINVAL; 393004edb48SHamdan Igbaria return rte_errno; 39478580cf4SHamdan Igbaria } 39578580cf4SHamdan Igbaria 39678580cf4SHamdan Igbaria static int 39778580cf4SHamdan Igbaria mlx5dr_debug_dump_context_send_engine(FILE *f, struct mlx5dr_context *ctx) 39878580cf4SHamdan Igbaria { 39978580cf4SHamdan Igbaria struct mlx5dr_send_engine *send_queue; 40078580cf4SHamdan Igbaria int ret, i, j; 40178580cf4SHamdan Igbaria 40278580cf4SHamdan Igbaria for (i = 0; i < (int)ctx->queues; i++) { 40378580cf4SHamdan Igbaria send_queue = &ctx->send_queue[i]; 40478580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 40578580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_SEND_ENGINE, 40678580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 40778580cf4SHamdan Igbaria i, 40878580cf4SHamdan Igbaria send_queue->used_entries, 40978580cf4SHamdan Igbaria send_queue->th_entries, 41078580cf4SHamdan Igbaria send_queue->rings, 41178580cf4SHamdan Igbaria send_queue->num_entries, 41278580cf4SHamdan Igbaria send_queue->err, 41378580cf4SHamdan Igbaria send_queue->completed.ci, 41478580cf4SHamdan Igbaria send_queue->completed.pi, 41578580cf4SHamdan Igbaria send_queue->completed.mask); 41678580cf4SHamdan Igbaria if (ret < 0) { 41778580cf4SHamdan Igbaria rte_errno = EINVAL; 41878580cf4SHamdan Igbaria return rte_errno; 41978580cf4SHamdan Igbaria } 42078580cf4SHamdan Igbaria 42178580cf4SHamdan Igbaria for (j = 0; j < MLX5DR_NUM_SEND_RINGS; j++) { 42278580cf4SHamdan Igbaria struct mlx5dr_send_ring *send_ring = &send_queue->send_ring[j]; 42378580cf4SHamdan Igbaria struct mlx5dr_send_ring_cq *cq = &send_ring->send_cq; 42478580cf4SHamdan Igbaria struct mlx5dr_send_ring_sq *sq = &send_ring->send_sq; 42578580cf4SHamdan Igbaria 42678580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 42778580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_SEND_RING, 42878580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 42978580cf4SHamdan Igbaria j, 43078580cf4SHamdan Igbaria i, 43178580cf4SHamdan Igbaria cq->cqn, 43278580cf4SHamdan Igbaria cq->cons_index, 43378580cf4SHamdan Igbaria cq->ncqe_mask, 43478580cf4SHamdan Igbaria cq->buf_sz, 43578580cf4SHamdan Igbaria cq->ncqe, 43678580cf4SHamdan Igbaria cq->cqe_log_sz, 43778580cf4SHamdan Igbaria cq->poll_wqe, 43878580cf4SHamdan Igbaria cq->cqe_sz, 43978580cf4SHamdan Igbaria sq->sqn, 44078580cf4SHamdan Igbaria sq->obj->id, 44178580cf4SHamdan Igbaria sq->cur_post, 44278580cf4SHamdan Igbaria sq->buf_mask); 44378580cf4SHamdan Igbaria if (ret < 0) { 44478580cf4SHamdan Igbaria rte_errno = EINVAL; 44578580cf4SHamdan Igbaria return rte_errno; 44678580cf4SHamdan Igbaria } 44778580cf4SHamdan Igbaria } 44878580cf4SHamdan Igbaria } 44978580cf4SHamdan Igbaria 45078580cf4SHamdan Igbaria return 0; 45178580cf4SHamdan Igbaria } 45278580cf4SHamdan Igbaria 45378580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_caps(FILE *f, struct mlx5dr_context *ctx) 45478580cf4SHamdan Igbaria { 45578580cf4SHamdan Igbaria struct mlx5dr_cmd_query_caps *caps = ctx->caps; 45678580cf4SHamdan Igbaria int ret; 45778580cf4SHamdan Igbaria 45878580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%s,%d,%d,%d,%d,", 45978580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_CAPS, 46078580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 46178580cf4SHamdan Igbaria caps->fw_ver, 46278580cf4SHamdan Igbaria caps->wqe_based_update, 46378580cf4SHamdan Igbaria caps->ste_format, 46478580cf4SHamdan Igbaria caps->ste_alloc_log_max, 46578580cf4SHamdan Igbaria caps->log_header_modify_argument_max_alloc); 46678580cf4SHamdan Igbaria if (ret < 0) { 46778580cf4SHamdan Igbaria rte_errno = EINVAL; 46878580cf4SHamdan Igbaria return rte_errno; 46978580cf4SHamdan Igbaria } 47078580cf4SHamdan Igbaria 47178580cf4SHamdan Igbaria ret = fprintf(f, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", 47278580cf4SHamdan Igbaria caps->flex_protocols, 47378580cf4SHamdan Igbaria caps->rtc_reparse_mode, 47478580cf4SHamdan Igbaria caps->rtc_index_mode, 47578580cf4SHamdan Igbaria caps->ste_alloc_log_gran, 47678580cf4SHamdan Igbaria caps->stc_alloc_log_max, 47778580cf4SHamdan Igbaria caps->stc_alloc_log_gran, 47878580cf4SHamdan Igbaria caps->rtc_log_depth_max, 47978580cf4SHamdan Igbaria caps->format_select_gtpu_dw_0, 48078580cf4SHamdan Igbaria caps->format_select_gtpu_dw_1, 48178580cf4SHamdan Igbaria caps->format_select_gtpu_dw_2, 48278580cf4SHamdan Igbaria caps->format_select_gtpu_ext_dw_0, 48378580cf4SHamdan Igbaria caps->nic_ft.max_level, 48478580cf4SHamdan Igbaria caps->nic_ft.reparse, 48578580cf4SHamdan Igbaria caps->fdb_ft.max_level, 48678580cf4SHamdan Igbaria caps->fdb_ft.reparse, 48778580cf4SHamdan Igbaria caps->log_header_modify_argument_granularity); 48878580cf4SHamdan Igbaria if (ret < 0) { 48978580cf4SHamdan Igbaria rte_errno = EINVAL; 49078580cf4SHamdan Igbaria return rte_errno; 49178580cf4SHamdan Igbaria } 49278580cf4SHamdan Igbaria 49378580cf4SHamdan Igbaria return 0; 49478580cf4SHamdan Igbaria } 49578580cf4SHamdan Igbaria 49678580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_attr(FILE *f, struct mlx5dr_context *ctx) 49778580cf4SHamdan Igbaria { 49878580cf4SHamdan Igbaria int ret; 49978580cf4SHamdan Igbaria 5001cf83b1fSErez Shitrit ret = fprintf(f, "%u,0x%" PRIx64 ",%d,%zu,%d,%s,%d,%d\n", 50178580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_ATTR, 50278580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 50378580cf4SHamdan Igbaria ctx->pd_num, 50478580cf4SHamdan Igbaria ctx->queues, 5051cf83b1fSErez Shitrit ctx->send_queue->num_entries, 5061cf83b1fSErez Shitrit mlx5dr_context_shared_gvmi_used(ctx) ? 5071cf83b1fSErez Shitrit mlx5_glue->get_device_name(ctx->ibv_ctx->device) : "None", 5081cf83b1fSErez Shitrit ctx->caps->vhca_id, 5091cf83b1fSErez Shitrit mlx5dr_context_shared_gvmi_used(ctx) ? 5101cf83b1fSErez Shitrit ctx->caps->shared_vhca_id : 0xffff); 51178580cf4SHamdan Igbaria if (ret < 0) { 51278580cf4SHamdan Igbaria rte_errno = EINVAL; 51378580cf4SHamdan Igbaria return rte_errno; 51478580cf4SHamdan Igbaria } 51578580cf4SHamdan Igbaria 51678580cf4SHamdan Igbaria return 0; 51778580cf4SHamdan Igbaria } 51878580cf4SHamdan Igbaria 51978580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context_info(FILE *f, struct mlx5dr_context *ctx) 52078580cf4SHamdan Igbaria { 52178580cf4SHamdan Igbaria int ret; 52278580cf4SHamdan Igbaria 52378580cf4SHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%d,%s,%s\n", 52478580cf4SHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT, 52578580cf4SHamdan Igbaria (uint64_t)(uintptr_t)ctx, 52678580cf4SHamdan Igbaria ctx->flags & MLX5DR_CONTEXT_FLAG_HWS_SUPPORT, 527ce946c7dSErez Shitrit mlx5_glue->get_device_name(mlx5dr_context_get_local_ibv(ctx)->device), 52878580cf4SHamdan Igbaria DEBUG_VERSION); 52978580cf4SHamdan Igbaria if (ret < 0) { 53078580cf4SHamdan Igbaria rte_errno = EINVAL; 53178580cf4SHamdan Igbaria return rte_errno; 53278580cf4SHamdan Igbaria } 53378580cf4SHamdan Igbaria 53478580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context_attr(f, ctx); 53578580cf4SHamdan Igbaria if (ret) 53678580cf4SHamdan Igbaria return ret; 53778580cf4SHamdan Igbaria 53878580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context_caps(f, ctx); 53978580cf4SHamdan Igbaria if (ret) 54078580cf4SHamdan Igbaria return ret; 54178580cf4SHamdan Igbaria 54278580cf4SHamdan Igbaria return 0; 54378580cf4SHamdan Igbaria } 54478580cf4SHamdan Igbaria 545a2ea62bcSHamdan Igbaria static int 546a2ea62bcSHamdan Igbaria mlx5dr_debug_dump_context_stc_resource(FILE *f, 547a2ea62bcSHamdan Igbaria struct mlx5dr_context *ctx, 548a2ea62bcSHamdan Igbaria uint32_t tbl_type, 549a2ea62bcSHamdan Igbaria struct mlx5dr_pool_resource *resource) 550a2ea62bcSHamdan Igbaria { 551a2ea62bcSHamdan Igbaria int ret; 552a2ea62bcSHamdan Igbaria 553a2ea62bcSHamdan Igbaria ret = fprintf(f, "%d,0x%" PRIx64 ",%u,%u\n", 554a2ea62bcSHamdan Igbaria MLX5DR_DEBUG_RES_TYPE_CONTEXT_STC, 555a2ea62bcSHamdan Igbaria (uint64_t)(uintptr_t)ctx, 556a2ea62bcSHamdan Igbaria tbl_type, 557a2ea62bcSHamdan Igbaria resource->base_id); 558a2ea62bcSHamdan Igbaria if (ret < 0) { 559a2ea62bcSHamdan Igbaria rte_errno = EINVAL; 560a2ea62bcSHamdan Igbaria return rte_errno; 561a2ea62bcSHamdan Igbaria } 562a2ea62bcSHamdan Igbaria 563a2ea62bcSHamdan Igbaria return 0; 564a2ea62bcSHamdan Igbaria } 565a2ea62bcSHamdan Igbaria 566a2ea62bcSHamdan Igbaria static int mlx5dr_debug_dump_context_stc(FILE *f, struct mlx5dr_context *ctx) 567a2ea62bcSHamdan Igbaria { 568a2ea62bcSHamdan Igbaria struct mlx5dr_pool *stc_pool; 569a2ea62bcSHamdan Igbaria int ret; 570a2ea62bcSHamdan Igbaria int i; 571a2ea62bcSHamdan Igbaria 572a2ea62bcSHamdan Igbaria for (i = 0; i < MLX5DR_TABLE_TYPE_MAX; i++) { 573a2ea62bcSHamdan Igbaria stc_pool = ctx->stc_pool[i]; 574a2ea62bcSHamdan Igbaria 575a2ea62bcSHamdan Igbaria if (!stc_pool) 576a2ea62bcSHamdan Igbaria continue; 577a2ea62bcSHamdan Igbaria 578a2ea62bcSHamdan Igbaria if (stc_pool->resource[0] != NULL) { 579a2ea62bcSHamdan Igbaria ret = mlx5dr_debug_dump_context_stc_resource(f, ctx, i, 580a2ea62bcSHamdan Igbaria stc_pool->resource[0]); 581a2ea62bcSHamdan Igbaria if (ret) 582a2ea62bcSHamdan Igbaria return ret; 583a2ea62bcSHamdan Igbaria } 584a2ea62bcSHamdan Igbaria 585a2ea62bcSHamdan Igbaria if (i == MLX5DR_TABLE_TYPE_FDB && stc_pool->mirror_resource[0] != NULL) { 586a2ea62bcSHamdan Igbaria ret = mlx5dr_debug_dump_context_stc_resource(f, ctx, i, 587a2ea62bcSHamdan Igbaria stc_pool->mirror_resource[0]); 588a2ea62bcSHamdan Igbaria if (ret) 589a2ea62bcSHamdan Igbaria return ret; 590a2ea62bcSHamdan Igbaria } 591a2ea62bcSHamdan Igbaria } 592a2ea62bcSHamdan Igbaria 593a2ea62bcSHamdan Igbaria return 0; 594a2ea62bcSHamdan Igbaria } 595a2ea62bcSHamdan Igbaria 59678580cf4SHamdan Igbaria static int mlx5dr_debug_dump_context(FILE *f, struct mlx5dr_context *ctx) 59778580cf4SHamdan Igbaria { 59878580cf4SHamdan Igbaria struct mlx5dr_table *tbl; 59978580cf4SHamdan Igbaria int ret; 60078580cf4SHamdan Igbaria 60178580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context_info(f, ctx); 60278580cf4SHamdan Igbaria if (ret) 60378580cf4SHamdan Igbaria return ret; 60478580cf4SHamdan Igbaria 60578580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context_send_engine(f, ctx); 60678580cf4SHamdan Igbaria if (ret) 60778580cf4SHamdan Igbaria return ret; 60878580cf4SHamdan Igbaria 609a2ea62bcSHamdan Igbaria ret = mlx5dr_debug_dump_context_stc(f, ctx); 610a2ea62bcSHamdan Igbaria if (ret) 611a2ea62bcSHamdan Igbaria return ret; 612a2ea62bcSHamdan Igbaria 61378580cf4SHamdan Igbaria LIST_FOREACH(tbl, &ctx->head, next) { 61478580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_table(f, tbl); 61578580cf4SHamdan Igbaria if (ret) 61678580cf4SHamdan Igbaria return ret; 61778580cf4SHamdan Igbaria } 61878580cf4SHamdan Igbaria 61978580cf4SHamdan Igbaria return 0; 62078580cf4SHamdan Igbaria } 62178580cf4SHamdan Igbaria 62278580cf4SHamdan Igbaria int mlx5dr_debug_dump(struct mlx5dr_context *ctx, FILE *f) 62378580cf4SHamdan Igbaria { 62478580cf4SHamdan Igbaria int ret; 62578580cf4SHamdan Igbaria 62678580cf4SHamdan Igbaria if (!f || !ctx) { 62778580cf4SHamdan Igbaria rte_errno = EINVAL; 62878580cf4SHamdan Igbaria return -rte_errno; 62978580cf4SHamdan Igbaria } 63078580cf4SHamdan Igbaria 63178580cf4SHamdan Igbaria pthread_spin_lock(&ctx->ctrl_lock); 63278580cf4SHamdan Igbaria ret = mlx5dr_debug_dump_context(f, ctx); 63378580cf4SHamdan Igbaria pthread_spin_unlock(&ctx->ctrl_lock); 63478580cf4SHamdan Igbaria 63578580cf4SHamdan Igbaria return -ret; 63678580cf4SHamdan Igbaria } 637