xref: /dpdk/drivers/net/bnxt/tf_core/tf_ext_flow_handle.h (revision e6e8f03e5459f25153f1e4cd3e9ac30d3e473a61)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019-2023 Broadcom
3  * All rights reserved.
4  */
5 
6 #ifndef _TF_EXT_FLOW_HANDLE_H_
7 #define _TF_EXT_FLOW_HANDLE_H_
8 
9 #define TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK	0x00000000F0000000ULL
10 #define TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT	28
11 #define TF_FLOW_TYPE_FLOW_HANDLE_MASK		0x00000000000000F0ULL
12 #define TF_FLOW_TYPE_FLOW_HANDLE_SFT		4
13 #define TF_FLAGS_FLOW_HANDLE_MASK		0x000000000000000FULL
14 #define TF_FLAGS_FLOW_HANDLE_SFT		0
15 #define TF_INDEX_FLOW_HANDLE_MASK		0xFFFFFFF000000000ULL
16 #define TF_INDEX_FLOW_HANDLE_SFT		36
17 #define TF_ENTRY_NUM_FLOW_HANDLE_MASK		0x0000000E00000000ULL
18 #define TF_ENTRY_NUM_FLOW_HANDLE_SFT		33
19 #define TF_HASH_TYPE_FLOW_HANDLE_MASK		0x0000000100000000ULL
20 #define TF_HASH_TYPE_FLOW_HANDLE_SFT		32
21 
22 #define TF_FLAGS_FLOW_HANDLE_INTERNAL		0x2
23 #define TF_FLAGS_FLOW_HANDLE_EXTERNAL		0x0
24 
25 #define TF_FLOW_HANDLE_MASK (TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK |	\
26 				TF_FLOW_TYPE_FLOW_HANDLE_MASK |		\
27 				TF_FLAGS_FLOW_HANDLE_MASK |		\
28 				TF_INDEX_FLOW_HANDLE_MASK |		\
29 				TF_ENTRY_NUM_FLOW_HANDLE_MASK |		\
30 				TF_HASH_TYPE_FLOW_HANDLE_MASK)
31 
32 #define TF_GET_FIELDS_FROM_FLOW_HANDLE(flow_handle,			\
33 				       num_key_entries,			\
34 				       flow_type,			\
35 				       flags,				\
36 				       index,				\
37 				       entry_num,			\
38 				       hash_type)			\
39 do {									\
40 	(num_key_entries) = \
41 		(((flow_handle) & TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK) >> \
42 		 TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT);			\
43 	(flow_type) = (((flow_handle) & TF_FLOW_TYPE_FLOW_HANDLE_MASK) >> \
44 		     TF_FLOW_TYPE_FLOW_HANDLE_SFT);			\
45 	(flags) = (((flow_handle) & TF_FLAGS_FLOW_HANDLE_MASK) >>	\
46 		     TF_FLAGS_FLOW_HANDLE_SFT);				\
47 	(index) = (((flow_handle) & TF_INDEX_FLOW_HANDLE_MASK) >>	\
48 		     TF_INDEX_FLOW_HANDLE_SFT);				\
49 	(entry_num) = (((flow_handle) & TF_ENTRY_NUM_FLOW_HANDLE_MASK) >> \
50 		     TF_ENTRY_NUM_FLOW_HANDLE_SFT);			\
51 	(hash_type) = (((flow_handle) & TF_HASH_TYPE_FLOW_HANDLE_MASK) >> \
52 		     TF_HASH_TYPE_FLOW_HANDLE_SFT);			\
53 } while (0)
54 
55 #define TF_SET_FIELDS_IN_FLOW_HANDLE(flow_handle,			\
56 				     num_key_entries,			\
57 				     flow_type,				\
58 				     flags,				\
59 				     index,				\
60 				     entry_num,				\
61 				     hash_type)				\
62 do {									\
63 	(flow_handle) &= ~TF_FLOW_HANDLE_MASK;				\
64 	(flow_handle) |= \
65 		(((num_key_entries) << TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT) & \
66 		 TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK);			\
67 	(flow_handle) |= (((flow_type) << TF_FLOW_TYPE_FLOW_HANDLE_SFT) & \
68 			TF_FLOW_TYPE_FLOW_HANDLE_MASK);			\
69 	(flow_handle) |= (((flags) << TF_FLAGS_FLOW_HANDLE_SFT) &	\
70 			TF_FLAGS_FLOW_HANDLE_MASK);			\
71 	(flow_handle) |= ((((uint64_t)index) << TF_INDEX_FLOW_HANDLE_SFT) & \
72 			TF_INDEX_FLOW_HANDLE_MASK);			\
73 	(flow_handle) |=						\
74 		((((uint64_t)entry_num) << TF_ENTRY_NUM_FLOW_HANDLE_SFT) & \
75 		 TF_ENTRY_NUM_FLOW_HANDLE_MASK);			\
76 	(flow_handle) |=						\
77 		((((uint64_t)hash_type) << TF_HASH_TYPE_FLOW_HANDLE_SFT) & \
78 		 TF_HASH_TYPE_FLOW_HANDLE_MASK);			\
79 } while (0)
80 #define TF_SET_FIELDS_IN_WH_FLOW_HANDLE TF_SET_FIELDS_IN_FLOW_HANDLE
81 
82 #define TF_GET_INDEX_FROM_FLOW_HANDLE(flow_handle,			\
83 				      index)				\
84 do {									\
85 	index = (((flow_handle) & TF_INDEX_FLOW_HANDLE_MASK) >>		\
86 		     TF_INDEX_FLOW_HANDLE_SFT);				\
87 } while (0)
88 
89 #define TF_GET_HASH_TYPE_FROM_FLOW_HANDLE(flow_handle,			\
90 					  hash_type)			\
91 do {									\
92 	hash_type = (((flow_handle) & TF_HASH_TYPE_FLOW_HANDLE_MASK) >>	\
93 		     TF_HASH_TYPE_FLOW_HANDLE_SFT);			\
94 } while (0)
95 
96 #define TF_GET_NUM_KEY_ENTRIES_FROM_FLOW_HANDLE(flow_handle,		\
97 					  num_key_entries)		\
98 do {									\
99 	(num_key_entries =						\
100 		(((flow_handle) & TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK) >> \
101 		     TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT));		\
102 } while (0)
103 
104 #define TF_GET_ENTRY_NUM_FROM_FLOW_HANDLE(flow_handle,		\
105 					  entry_num)		\
106 do {									\
107 	(entry_num =						\
108 		(((flow_handle) & TF_ENTRY_NUM_FLOW_HANDLE_MASK) >> \
109 		     TF_ENTRY_NUM_FLOW_HANDLE_SFT));		\
110 } while (0)
111 
112 #define TF_GET_FLAG_FROM_FLOW_HANDLE(flow_handle, flag)		\
113 	(flag =	(((flow_handle) & TF_FLAGS_FLOW_HANDLE_MASK) >>\
114 		     TF_FLAGS_FLOW_HANDLE_SFT))
115 
116 /*
117  * 32 bit Flow ID handlers
118  */
119 #define TF_GFID_FLOW_ID_MASK		0xFFFFFFF0UL
120 #define TF_GFID_FLOW_ID_SFT		4
121 #define TF_FLAG_FLOW_ID_MASK		0x00000002UL
122 #define TF_FLAG_FLOW_ID_SFT		1
123 #define TF_DIR_FLOW_ID_MASK		0x00000001UL
124 #define TF_DIR_FLOW_ID_SFT		0
125 
126 #define TF_SET_FLOW_ID(flow_id, gfid, flag, dir)			\
127 do {									\
128 	(flow_id) &= ~(TF_GFID_FLOW_ID_MASK |				\
129 		     TF_FLAG_FLOW_ID_MASK |				\
130 		     TF_DIR_FLOW_ID_MASK);				\
131 	(flow_id) |= (((gfid) << TF_GFID_FLOW_ID_SFT) &			\
132 		    TF_GFID_FLOW_ID_MASK) |				\
133 		(((flag) << TF_FLAG_FLOW_ID_SFT) &			\
134 		 TF_FLAG_FLOW_ID_MASK) |				\
135 		(((dir) << TF_DIR_FLOW_ID_SFT) &			\
136 		 TF_DIR_FLOW_ID_MASK);					\
137 } while (0)
138 
139 #define TF_GET_GFID_FROM_FLOW_ID(flow_id, gfid)				\
140 do {									\
141 	gfid = (((flow_id) & TF_GFID_FLOW_ID_MASK) >>			\
142 		TF_GFID_FLOW_ID_SFT);					\
143 } while (0)
144 
145 #define TF_GET_DIR_FROM_FLOW_ID(flow_id, dir)				\
146 do {									\
147 	dir = (((flow_id) & TF_DIR_FLOW_ID_MASK) >>			\
148 		TF_DIR_FLOW_ID_SFT);					\
149 } while (0)
150 
151 #define TF_GET_FLAG_FROM_FLOW_ID(flow_id, flag)				\
152 do {									\
153 	flag = (((flow_id) & TF_FLAG_FLOW_ID_MASK) >>			\
154 		TF_FLAG_FLOW_ID_SFT);					\
155 } while (0)
156 
157 /*
158  * 32 bit GFID handlers
159  */
160 #define TF_HASH_INDEX_GFID_MASK	0x07FFFFFFUL
161 #define TF_HASH_INDEX_GFID_SFT	0
162 #define TF_HASH_TYPE_GFID_MASK	0x08000000UL
163 #define TF_HASH_TYPE_GFID_SFT	27
164 
165 #define TF_GFID_TABLE_INTERNAL 0
166 #define TF_GFID_TABLE_EXTERNAL 1
167 
168 #define TF_SET_GFID(gfid, index, type)					\
169 do {									\
170 	gfid = (((index) << TF_HASH_INDEX_GFID_SFT) &			\
171 		TF_HASH_INDEX_GFID_MASK) |				\
172 		(((type) << TF_HASH_TYPE_GFID_SFT) &			\
173 		 TF_HASH_TYPE_GFID_MASK);				\
174 } while (0)
175 
176 #define TF_GET_HASH_INDEX_FROM_GFID(gfid, index)			\
177 do {									\
178 	index = (((gfid) & TF_HASH_INDEX_GFID_MASK) >>			\
179 		TF_HASH_INDEX_GFID_SFT);				\
180 } while (0)
181 
182 #define TF_GET_HASH_TYPE_FROM_GFID(gfid, type)				\
183 do {									\
184 	type = (((gfid) & TF_HASH_TYPE_GFID_MASK) >>			\
185 		TF_HASH_TYPE_GFID_SFT);					\
186 } while (0)
187 #endif /* _TF_EXT_FLOW_HANDLE_H_ */
188