xref: /dpdk/drivers/net/mlx5/hws/mlx5dr_table.h (revision 486f9aac0cbe2598a76c853890c1d557747f71cf)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2022 NVIDIA Corporation & Affiliates
3  */
4 
5 #ifndef MLX5DR_TABLE_H_
6 #define MLX5DR_TABLE_H_
7 
8 #define MLX5DR_ROOT_LEVEL 0
9 
10 struct mlx5dr_default_miss {
11 	/* My miss table */
12 	struct mlx5dr_table *miss_tbl;
13 	LIST_ENTRY(mlx5dr_table) next;
14 	/* Tables missing to my table */
15 	LIST_HEAD(miss_table_head, mlx5dr_table) head;
16 };
17 
18 struct mlx5dr_table {
19 	struct mlx5dr_context *ctx;
20 	struct mlx5dr_devx_obj *ft;
21 	struct mlx5dr_devx_obj *local_ft;
22 	enum mlx5dr_table_type type;
23 	uint32_t fw_ft_type;
24 	uint32_t level;
25 	LIST_HEAD(matcher_head, mlx5dr_matcher) head;
26 	LIST_HEAD(isolated_matchers_head, mlx5dr_matcher) isolated_matchers;
27 	LIST_ENTRY(mlx5dr_table) next;
28 	struct mlx5dr_default_miss default_miss;
29 };
30 
31 static inline
32 uint32_t mlx5dr_table_get_res_fw_ft_type(enum mlx5dr_table_type tbl_type,
33 					 bool is_mirror)
34 {
35 	if (tbl_type == MLX5DR_TABLE_TYPE_NIC_RX)
36 		return FS_FT_NIC_RX;
37 	else if (tbl_type == MLX5DR_TABLE_TYPE_NIC_TX)
38 		return FS_FT_NIC_TX;
39 	else if (tbl_type == MLX5DR_TABLE_TYPE_FDB)
40 		return is_mirror ? FS_FT_FDB_TX : FS_FT_FDB_RX;
41 
42 	assert(0);
43 	return 0;
44 }
45 
46 static inline bool mlx5dr_table_is_root(struct mlx5dr_table *tbl)
47 {
48 	return (tbl->level == MLX5DR_ROOT_LEVEL);
49 }
50 
51 struct mlx5dr_devx_obj *mlx5dr_table_create_default_ft(struct ibv_context *ibv,
52 						       struct mlx5dr_table *tbl);
53 
54 void mlx5dr_table_destroy_default_ft(struct mlx5dr_table *tbl,
55 				     struct mlx5dr_devx_obj *ft_obj);
56 
57 int mlx5dr_table_connect_to_miss_table(struct mlx5dr_table *src_tbl,
58 				       struct mlx5dr_table *dst_tbl,
59 				       bool only_update_last_ft);
60 
61 int mlx5dr_table_update_connected_miss_tables(struct mlx5dr_table *dst_tbl);
62 
63 int mlx5dr_table_ft_set_default_next_ft(struct mlx5dr_table *tbl,
64 					struct mlx5dr_devx_obj *ft_obj);
65 
66 int mlx5dr_table_ft_set_next_rtc(struct mlx5dr_devx_obj *ft,
67 				 uint32_t fw_ft_type,
68 				 struct mlx5dr_devx_obj *rtc_0,
69 				 struct mlx5dr_devx_obj *rtc_1);
70 
71 int mlx5dr_table_connect_src_ft_to_miss_table(struct mlx5dr_table *src_tbl,
72 					      struct mlx5dr_devx_obj *ft,
73 					      struct mlx5dr_table *dst_tbl);
74 
75 #endif /* MLX5DR_TABLE_H_ */
76