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