1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#ifndef _MLX5_FS_CORE_
34#define _MLX5_FS_CORE_
35
36#include <linux/mlx5/fs.h>
37
38enum fs_node_type {
39 FS_TYPE_NAMESPACE,
40 FS_TYPE_PRIO,
41 FS_TYPE_FLOW_TABLE,
42 FS_TYPE_FLOW_GROUP,
43 FS_TYPE_FLOW_ENTRY,
44 FS_TYPE_FLOW_DEST
45};
46
47enum fs_flow_table_type {
48 FS_FT_NIC_RX = 0x0,
49 FS_FT_FDB = 0X4,
50};
51
52enum fs_fte_status {
53 FS_FTE_STATUS_EXISTING = 1UL << 0,
54};
55
56struct fs_node {
57 struct list_head list;
58 struct list_head children;
59 enum fs_node_type type;
60 struct fs_node *parent;
61 struct fs_node *root;
62
63 struct mutex lock;
64 atomic_t refcount;
65 void (*remove_func)(struct fs_node *);
66};
67
68struct mlx5_flow_rule {
69 struct fs_node node;
70 struct mlx5_flow_destination dest_attr;
71
72
73
74 struct list_head next_ft;
75 u32 sw_action;
76};
77
78
79struct mlx5_flow_table {
80 struct fs_node node;
81 u32 id;
82 unsigned int max_fte;
83 unsigned int level;
84 enum fs_flow_table_type type;
85 struct {
86 bool active;
87 unsigned int required_groups;
88 unsigned int num_groups;
89 } autogroup;
90
91 struct mutex lock;
92
93 struct list_head fwd_rules;
94};
95
96
97struct fs_fte {
98 struct fs_node node;
99 u32 val[MLX5_ST_SZ_DW(fte_match_param)];
100 u32 dests_size;
101 u32 flow_tag;
102 u32 index;
103 u32 action;
104 enum fs_fte_status status;
105};
106
107
108struct fs_prio {
109 struct fs_node node;
110 unsigned int max_ft;
111 unsigned int start_level;
112 unsigned int prio;
113 unsigned int num_ft;
114};
115
116
117struct mlx5_flow_namespace {
118
119 struct fs_node node;
120};
121
122struct mlx5_flow_group_mask {
123 u8 match_criteria_enable;
124 u32 match_criteria[MLX5_ST_SZ_DW(fte_match_param)];
125};
126
127
128struct mlx5_flow_group {
129 struct fs_node node;
130 struct mlx5_flow_group_mask mask;
131 u32 start_index;
132 u32 max_ftes;
133 u32 num_ftes;
134 u32 id;
135};
136
137struct mlx5_flow_root_namespace {
138 struct mlx5_flow_namespace ns;
139 enum fs_flow_table_type table_type;
140 struct mlx5_core_dev *dev;
141 struct mlx5_flow_table *root_ft;
142
143 struct mutex chain_lock;
144};
145
146int mlx5_init_fs(struct mlx5_core_dev *dev);
147void mlx5_cleanup_fs(struct mlx5_core_dev *dev);
148
149#define fs_get_obj(v, _node) {v = container_of((_node), typeof(*v), node); }
150
151#define fs_list_for_each_entry(pos, root) \
152 list_for_each_entry(pos, root, node.list)
153
154#define fs_list_for_each_entry_safe(pos, tmp, root) \
155 list_for_each_entry_safe(pos, tmp, root, node.list)
156
157#define fs_for_each_ns_or_ft_reverse(pos, prio) \
158 list_for_each_entry_reverse(pos, &(prio)->node.children, list)
159
160#define fs_for_each_ns_or_ft(pos, prio) \
161 list_for_each_entry(pos, (&(prio)->node.children), list)
162
163#define fs_for_each_prio(pos, ns) \
164 fs_list_for_each_entry(pos, &(ns)->node.children)
165
166#define fs_for_each_ns(pos, prio) \
167 fs_list_for_each_entry(pos, &(prio)->node.children)
168
169#define fs_for_each_ft(pos, prio) \
170 fs_list_for_each_entry(pos, &(prio)->node.children)
171
172#define fs_for_each_ft_safe(pos, tmp, prio) \
173 fs_list_for_each_entry_safe(pos, tmp, &(prio)->node.children)
174
175#define fs_for_each_fg(pos, ft) \
176 fs_list_for_each_entry(pos, &(ft)->node.children)
177
178#define fs_for_each_fte(pos, fg) \
179 fs_list_for_each_entry(pos, &(fg)->node.children)
180
181#define fs_for_each_dst(pos, fte) \
182 fs_list_for_each_entry(pos, &(fte)->node.children)
183
184#endif
185