1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019-2021 Broadcom
6 #ifndef _TF_EXT_FLOW_HANDLE_H_
7 #define _TF_EXT_FLOW_HANDLE_H_
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
22 #define TF_FLAGS_FLOW_HANDLE_INTERNAL 0x2
23 #define TF_FLAGS_FLOW_HANDLE_EXTERNAL 0x0
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)
32 #define TF_GET_FIELDS_FROM_FLOW_HANDLE(flow_handle, \
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); \
55 #define TF_SET_FIELDS_IN_FLOW_HANDLE(flow_handle, \
63 (flow_handle) &= ~TF_FLOW_HANDLE_MASK; \
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); \
74 ((((uint64_t)entry_num) << TF_ENTRY_NUM_FLOW_HANDLE_SFT) & \
75 TF_ENTRY_NUM_FLOW_HANDLE_MASK); \
77 ((((uint64_t)hash_type) << TF_HASH_TYPE_FLOW_HANDLE_SFT) & \
78 TF_HASH_TYPE_FLOW_HANDLE_MASK); \
80 #define TF_SET_FIELDS_IN_WH_FLOW_HANDLE TF_SET_FIELDS_IN_FLOW_HANDLE
82 #define TF_GET_INDEX_FROM_FLOW_HANDLE(flow_handle, \
85 index = (((flow_handle) & TF_INDEX_FLOW_HANDLE_MASK) >> \
86 TF_INDEX_FLOW_HANDLE_SFT); \
89 #define TF_GET_HASH_TYPE_FROM_FLOW_HANDLE(flow_handle, \
92 hash_type = (((flow_handle) & TF_HASH_TYPE_FLOW_HANDLE_MASK) >> \
93 TF_HASH_TYPE_FLOW_HANDLE_SFT); \
96 #define TF_GET_NUM_KEY_ENTRIES_FROM_FLOW_HANDLE(flow_handle, \
100 (((flow_handle) & TF_NUM_KEY_ENTRIES_FLOW_HANDLE_MASK) >> \
101 TF_NUM_KEY_ENTRIES_FLOW_HANDLE_SFT)); \
104 #define TF_GET_ENTRY_NUM_FROM_FLOW_HANDLE(flow_handle, \
108 (((flow_handle) & TF_ENTRY_NUM_FLOW_HANDLE_MASK) >> \
109 TF_ENTRY_NUM_FLOW_HANDLE_SFT)); \
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))
117 * 32 bit Flow ID handlers
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
126 #define TF_SET_FLOW_ID(flow_id, gfid, flag, dir) \
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); \
139 #define TF_GET_GFID_FROM_FLOW_ID(flow_id, gfid) \
141 gfid = (((flow_id) & TF_GFID_FLOW_ID_MASK) >> \
142 TF_GFID_FLOW_ID_SFT); \
145 #define TF_GET_DIR_FROM_FLOW_ID(flow_id, dir) \
147 dir = (((flow_id) & TF_DIR_FLOW_ID_MASK) >> \
148 TF_DIR_FLOW_ID_SFT); \
151 #define TF_GET_FLAG_FROM_FLOW_ID(flow_id, flag) \
153 flag = (((flow_id) & TF_FLAG_FLOW_ID_MASK) >> \
154 TF_FLAG_FLOW_ID_SFT); \
158 * 32 bit GFID handlers
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
165 #define TF_GFID_TABLE_INTERNAL 0
166 #define TF_GFID_TABLE_EXTERNAL 1
168 #define TF_SET_GFID(gfid, index, type) \
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); \
176 #define TF_GET_HASH_INDEX_FROM_GFID(gfid, index) \
178 index = (((gfid) & TF_HASH_INDEX_GFID_MASK) >> \
179 TF_HASH_INDEX_GFID_SFT); \
182 #define TF_GET_HASH_TYPE_FROM_GFID(gfid, type) \
184 type = (((gfid) & TF_HASH_TYPE_GFID_MASK) >> \
185 TF_HASH_TYPE_GFID_SFT); \
189 #endif /* _TF_EXT_FLOW_HANDLE_H_ */