1491539caa566b2f979588a6f447ff81a61e09fe
[dpdk.git] / drivers / net / bnxt / tf_core / tf_ext_flow_handle.h
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_ */