1
2
3
4
5
6
7
8
9
10#ifndef _HCAPI_CFA_DEFS_H_
11#define _HCAPI_CFA_DEFS_H_
12
13#include <stdio.h>
14#include <string.h>
15#include <stdbool.h>
16#include <stddef.h>
17#include <stdint.h>
18
19#if !defined(__GNUC__)
20#pragma anon_unions
21#endif
22
23#define CFA_BITS_PER_BYTE (8)
24#define CFA_BITS_PER_WORD (sizeof(uint32_t) * CFA_BITS_PER_BYTE)
25#define __CFA_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
26#define CFA_ALIGN(x, a) __CFA_ALIGN_MASK((x), (a) - 1)
27#define CFA_ALIGN_256(x) CFA_ALIGN(x, 256)
28#define CFA_ALIGN_128(x) CFA_ALIGN(x, 128)
29#define CFA_ALIGN_32(x) CFA_ALIGN(x, 32)
30
31#define NUM_WORDS_ALIGN_32BIT(x) (CFA_ALIGN_32(x) / CFA_BITS_PER_WORD)
32#define NUM_WORDS_ALIGN_128BIT(x) (CFA_ALIGN_128(x) / CFA_BITS_PER_WORD)
33#define NUM_WORDS_ALIGN_256BIT(x) (CFA_ALIGN_256(x) / CFA_BITS_PER_WORD)
34
35
36#define CFA_GLOBAL_CFG_DATA_SZ (100)
37
38#ifndef SUPPORT_CFA_HW_P4
39#define SUPPORT_CFA_HW_P4 (0)
40#endif
41
42#ifndef SUPPORT_CFA_HW_P45
43#define SUPPORT_CFA_HW_P45 (0)
44#endif
45
46#ifndef SUPPORT_CFA_HW_P58
47#define SUPPORT_CFA_HW_P58 (0)
48#endif
49
50#if SUPPORT_CFA_HW_ALL
51#include "hcapi_cfa_p4.h"
52#include "hcapi_cfa_p58.h"
53#endif
54
55
56
57
58#define HCAPI_CFA_LKUP_SEED_MEM_SIZE 512
59
60
61#define ucrc32(ch, crc) (crc32tbl[((crc) ^ (ch)) & 0xff] ^ ((crc) >> 8))
62#define crc32(x, y) crc32i(~0, x, y)
63
64
65
66
67enum hcapi_cfa_ver {
68 HCAPI_CFA_P40 = 0,
69 HCAPI_CFA_P45 = 1,
70 HCAPI_CFA_P58 = 2,
71 HCAPI_CFA_PMAX = 3
72};
73
74
75
76
77enum hcapi_cfa_dir {
78 HCAPI_CFA_DIR_RX = 0,
79 HCAPI_CFA_DIR_TX = 1,
80 HCAPI_CFA_DIR_MAX = 2
81};
82
83
84
85
86enum hcapi_cfa_hwops {
87 HCAPI_CFA_HWOPS_PUT,
88 HCAPI_CFA_HWOPS_GET,
89 HCAPI_CFA_HWOPS_ADD,
90
91
92
93
94
95
96
97
98 HCAPI_CFA_HWOPS_DEL,
99
100
101
102
103 HCAPI_CFA_HWOPS_EVICT,
104
105
106
107 HCAPI_CFA_HWOPS_MAX
108};
109
110
111
112
113enum hcapi_cfa_key_ctrlops {
114 HCAPI_CFA_KEY_CTRLOPS_INSERT,
115 HCAPI_CFA_KEY_CTRLOPS_STRIP,
116 HCAPI_CFA_KEY_CTRLOPS_MAX
117};
118
119
120
121
122struct hcapi_cfa_hw {
123
124
125
126
127
128 uint64_t base_addr;
129
130
131
132
133 void *handle;
134};
135
136
137
138
139
140struct hcapi_cfa_hwop {
141
142 enum hcapi_cfa_hwops opcode;
143
144
145 struct hcapi_cfa_hw hw;
146};
147
148
149
150
151struct hcapi_cfa_data {
152
153
154
155
156
157
158 union {
159 uint32_t index;
160 uint32_t byte_offset;
161 };
162
163 uint8_t *data;
164
165
166
167
168
169 uint8_t *data_mask;
170
171
172 uint16_t data_sz;
173};
174
175
176enum hcapi_cfa_pg_tbl_lvl {
177 TF_PT_LVL_0,
178 TF_PT_LVL_1,
179 TF_PT_LVL_2,
180 TF_PT_LVL_MAX
181};
182
183enum hcapi_cfa_em_table_type {
184 TF_KEY0_TABLE,
185 TF_KEY1_TABLE,
186 TF_RECORD_TABLE,
187 TF_EFC_TABLE,
188 TF_ACTION_TABLE,
189 TF_EM_LKUP_TABLE,
190 TF_MAX_TABLE
191};
192
193struct hcapi_cfa_em_page_tbl {
194 uint32_t pg_count;
195 uint32_t pg_size;
196 void **pg_va_tbl;
197 uint64_t *pg_pa_tbl;
198};
199
200struct hcapi_cfa_em_table {
201 int type;
202 uint32_t num_entries;
203 uint16_t ctx_id;
204 uint32_t entry_size;
205 int num_lvl;
206 uint32_t page_cnt[TF_PT_LVL_MAX];
207 uint64_t num_data_pages;
208 void *l0_addr;
209 uint64_t l0_dma_addr;
210 struct hcapi_cfa_em_page_tbl pg_tbl[TF_PT_LVL_MAX];
211};
212
213struct hcapi_cfa_em_ctx_mem_info {
214 struct hcapi_cfa_em_table em_tables[TF_MAX_TABLE];
215};
216
217
218
219
220
221
222
223struct hcapi_cfa_key_tbl {
224
225
226
227 uint8_t *base0;
228
229
230
231 uint32_t size;
232
233 uint32_t num_buckets;
234
235
236
237
238 uint8_t *base1;
239
240
241
242 struct hcapi_cfa_bs_db *bs_db;
243
244 uint32_t page_size;
245};
246
247
248
249
250struct hcapi_cfa_key_obj {
251
252 uint32_t *data;
253
254 uint32_t len;
255
256 struct hcapi_cfa_key_layout *layout;
257};
258
259
260
261
262struct hcapi_cfa_key_data {
263
264
265
266
267 uint32_t offset;
268
269 uint8_t *data;
270
271 uint16_t size;
272
273 uint8_t tbl_scope;
274
275 uint64_t metadata;
276
277
278
279};
280
281
282
283
284struct hcapi_cfa_key_loc {
285
286 uint64_t bucket_mem_ptr;
287
288 uint64_t mem_ptr;
289
290 uint32_t bucket_mem_idx;
291
292 uint8_t bucket_idx;
293
294 uint32_t mem_idx;
295};
296
297
298
299
300struct hcapi_cfa_action_addr {
301
302
303
304 uint16_t blk_id;
305
306
307
308 uint32_t offset;
309};
310
311
312
313
314struct hcapi_cfa_action_data {
315
316 struct hcapi_cfa_action_addr addr;
317
318 uint32_t *data;
319
320 uint32_t len;
321};
322
323
324
325
326struct hcapi_cfa_action_obj {
327
328 uint32_t *data;
329
330 uint32_t len;
331
332 struct hcapi_cfa_action_layout *layout;
333};
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348uint64_t hcapi_cfa_key_hash(uint64_t *key_data,
349 uint16_t bitlen);
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369int hcapi_cfa_key_hw_op(struct hcapi_cfa_hwop *op,
370 struct hcapi_cfa_key_tbl *key_tbl,
371 struct hcapi_cfa_key_data *key_obj,
372 struct hcapi_cfa_key_loc *key_loc);
373
374uint64_t hcapi_get_table_page(struct hcapi_cfa_em_table *mem,
375 uint32_t page);
376uint32_t hcapi_cfa_crc32i(uint32_t crc, const uint8_t *buf, size_t len);
377uint64_t hcapi_cfa_p4_key_hash(uint64_t *key_data,
378 uint16_t bitlen);
379uint64_t hcapi_cfa_p58_key_hash(uint64_t *key_data,
380 uint16_t bitlen);
381#endif
382