net/bnxt: support shared session
[dpdk.git] / drivers / net / bnxt / tf_core / tf_em.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019-2021 Broadcom
3  * All rights reserved.
4  */
5
6 #ifndef _TF_EM_H_
7 #define _TF_EM_H_
8
9 #include "tf_core.h"
10 #include "tf_session.h"
11
12 #include "tf_em_common.h"
13
14 #include "hcapi_cfa_defs.h"
15
16 #define TF_EM_MIN_ENTRIES     (1 << 15) /* 32K */
17 #define TF_EM_MAX_ENTRIES     (1 << 27) /* 128M */
18
19 #define TF_P4_HW_EM_KEY_MAX_SIZE 52
20 #define TF_P4_EM_KEY_RECORD_SIZE 64
21
22 #define TF_P58_HW_EM_KEY_MAX_SIZE 80
23
24 #define TF_EM_MAX_MASK 0x7FFF
25 #define TF_EM_MAX_ENTRY (128 * 1024 * 1024)
26
27 /**
28  * Hardware Page sizes supported for EEM:
29  *   4K, 8K, 64K, 256K, 1M, 2M, 4M, 1G.
30  *
31  * Round-down other page sizes to the lower hardware page
32  * size supported.
33  */
34 #define TF_EM_PAGE_SIZE_4K 12
35 #define TF_EM_PAGE_SIZE_8K 13
36 #define TF_EM_PAGE_SIZE_64K 16
37 #define TF_EM_PAGE_SIZE_256K 18
38 #define TF_EM_PAGE_SIZE_1M 20
39 #define TF_EM_PAGE_SIZE_2M 21
40 #define TF_EM_PAGE_SIZE_4M 22
41 #define TF_EM_PAGE_SIZE_1G 30
42
43 /* Set page size */
44 #define BNXT_TF_PAGE_SIZE TF_EM_PAGE_SIZE_2M
45
46 #if (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_4K)   /** 4K */
47 #define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_4K
48 #define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_4K
49 #elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_8K) /** 8K */
50 #define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_8K
51 #define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_8K
52 #elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_64K)        /** 64K */
53 #define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_64K
54 #define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_64K
55 #elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_256K)       /** 256K */
56 #define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_256K
57 #define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_256K
58 #elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_1M) /** 1M */
59 #define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_1M
60 #define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_1M
61 #elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_2M) /** 2M */
62 #define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_2M
63 #define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_2M
64 #elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_4M) /** 4M */
65 #define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_4M
66 #define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_4M
67 #elif (BNXT_TF_PAGE_SIZE == TF_EM_PAGE_SIZE_1G) /** 1G */
68 #define TF_EM_PAGE_SHIFT TF_EM_PAGE_SIZE_1G
69 #define TF_EM_PAGE_SIZE_ENUM HWRM_TF_CTXT_MEM_RGTR_INPUT_PAGE_SIZE_1G
70 #else
71 #error "Invalid Page Size specified. Please use a TF_EM_PAGE_SIZE_n define"
72 #endif
73
74 /*
75  * System memory always uses 4K pages
76  */
77 #define TF_EM_PAGE_SIZE (1 << TF_EM_PAGE_SHIFT)
78 #define TF_EM_PAGE_ALIGNMENT (1 << TF_EM_PAGE_SHIFT)
79
80 /*
81  * Used to build GFID:
82  *
83  *   15           2  0
84  *  +--------------+--+
85  *  |   Index      |E |
86  *  +--------------+--+
87  *
88  * E = Entry (bucket inndex)
89  */
90 #define TF_EM_INTERNAL_INDEX_SHIFT 2
91 #define TF_EM_INTERNAL_INDEX_MASK 0xFFFC
92 #define TF_EM_INTERNAL_ENTRY_MASK  0x3
93
94 /** EM Entry
95  *  Each EM entry is 512-bit (64-bytes) but ordered differently to
96  *  EEM.
97  */
98 struct tf_em_64b_entry {
99         /** Header is 8 bytes long */
100         struct cfa_p4_eem_entry_hdr hdr;
101         /** Key is 448 bits - 56 bytes */
102         uint8_t key[TF_P4_EM_KEY_RECORD_SIZE - sizeof(struct cfa_p4_eem_entry_hdr)];
103 };
104
105 /** EEM Memory Type
106  *
107  */
108 enum tf_mem_type {
109         TF_EEM_MEM_TYPE_INVALID,
110         TF_EEM_MEM_TYPE_HOST,
111         TF_EEM_MEM_TYPE_SYSTEM
112 };
113
114 /**
115  * tf_em_cfg_parms definition
116  */
117 struct tf_em_cfg_parms {
118         /**
119          * [in] Num entries in resource config
120          */
121         uint16_t num_elements;
122         /**
123          * [in] Resource config
124          */
125         struct tf_rm_element_cfg *cfg;
126         /**
127          * Session resource allocations
128          */
129         struct tf_session_resources *resources;
130         /**
131          * [in] Memory type.
132          */
133         enum tf_mem_type mem_type;
134 };
135
136 /**
137  * EM database
138  *
139  * EM rm database
140  *
141  */
142 struct em_rm_db {
143         struct rm_db *em_db[TF_DIR_MAX];
144 };
145
146 /**
147  * @page em EM
148  *
149  * @ref tf_alloc_eem_tbl_scope
150  *
151  * @ref tf_free_eem_tbl_scope_cb
152  *
153  * @ref tf_em_insert_int_entry
154  *
155  * @ref tf_em_delete_int_entry
156  *
157  * @ref tf_em_insert_ext_entry
158  *
159  * @ref tf_em_delete_ext_entry
160  *
161  * @ref tf_em_insert_ext_sys_entry
162  *
163  * @ref tf_em_delete_ext_sys_entry
164  *
165  * @ref tf_em_int_bind
166  *
167  * @ref tf_em_int_unbind
168  *
169  * @ref tf_em_ext_common_bind
170  *
171  * @ref tf_em_ext_common_unbind
172  *
173  * @ref tf_em_ext_alloc
174  *
175  * @ref tf_em_ext_free
176  *
177  * @ref tf_em_ext_common_free
178  *
179  * @ref tf_em_ext_common_alloc
180  */
181
182 /**
183  * Insert record in to internal EM table
184  *
185  * [in] tfp
186  *   Pointer to TruFlow handle
187  *
188  * [in] parms
189  *   Pointer to input parameters
190  *
191  * Returns:
192  *   0       - Success
193  *   -EINVAL - Parameter error
194  */
195 int tf_em_insert_int_entry(struct tf *tfp,
196                            struct tf_insert_em_entry_parms *parms);
197
198 /**
199  * Delete record from internal EM table
200  *
201  * [in] tfp
202  *   Pointer to TruFlow handle
203  *
204  * [in] parms
205  *   Pointer to input parameters
206  *
207  * Returns:
208  *   0       - Success
209  *   -EINVAL - Parameter error
210  */
211 int tf_em_delete_int_entry(struct tf *tfp,
212                            struct tf_delete_em_entry_parms *parms);
213
214 /**
215  * Insert record in to internal EM table
216  *
217  * [in] tfp
218  *   Pointer to TruFlow handle
219  *
220  * [in] parms
221  *   Pointer to input parameters
222  *
223  * Returns:
224  *   0       - Success
225  *   -EINVAL - Parameter error
226  */
227 int tf_em_hash_insert_int_entry(struct tf *tfp,
228                                 struct tf_insert_em_entry_parms *parms);
229
230 /**
231  * Delete record from internal EM table
232  *
233  * [in] tfp
234  *   Pointer to TruFlow handle
235  *
236  * [in] parms
237  *   Pointer to input parameters
238  *
239  * Returns:
240  *   0       - Success
241  *   -EINVAL - Parameter error
242  */
243 int tf_em_hash_delete_int_entry(struct tf *tfp,
244                                 struct tf_delete_em_entry_parms *parms);
245
246 /**
247  * Insert record in to external EEM table
248  *
249  * [in] tfp
250  *   Pointer to TruFlow handle
251  *
252  * [in] parms
253  *   Pointer to input parameters
254  *
255  * Returns:
256  *   0       - Success
257  *   -EINVAL - Parameter error
258  */
259 int tf_em_insert_ext_entry(struct tf *tfp,
260                            struct tf_insert_em_entry_parms *parms);
261
262 /**
263  * Insert record from external EEM table
264  *
265  * [in] tfp
266  *   Pointer to TruFlow handle
267  *
268  * [in] parms
269  *   Pointer to input parameters
270  *
271  * Returns:
272  *   0       - Success
273  *   -EINVAL - Parameter error
274  */
275 int tf_em_delete_ext_entry(struct tf *tfp,
276                            struct tf_delete_em_entry_parms *parms);
277
278 /**
279  * Insert record in to external system EEM table
280  *
281  * [in] tfp
282  *   Pointer to TruFlow handle
283  *
284  * [in] parms
285  *   Pointer to input parameters
286  *
287  * Returns:
288  *   0       - Success
289  *   -EINVAL - Parameter error
290  */
291 int tf_em_insert_ext_sys_entry(struct tf *tfp,
292                                struct tf_insert_em_entry_parms *parms);
293
294 /**
295  * Delete record from external system EEM table
296  *
297  * [in] tfp
298  *   Pointer to TruFlow handle
299  *
300  * [in] parms
301  *   Pointer to input parameters
302  *
303  * Returns:
304  *   0       - Success
305  *   -EINVAL - Parameter error
306  */
307 int tf_em_delete_ext_sys_entry(struct tf *tfp,
308                                struct tf_delete_em_entry_parms *parms);
309
310 /**
311  * Bind internal EM device interface
312  *
313  * [in] tfp
314  *   Pointer to TruFlow handle
315  *
316  * [in] parms
317  *   Pointer to input parameters
318  *
319  * Returns:
320  *   0       - Success
321  *   -EINVAL - Parameter error
322  */
323 int tf_em_int_bind(struct tf *tfp,
324                    struct tf_em_cfg_parms *parms);
325
326 /**
327  * Unbind internal EM device interface
328  *
329  * [in] tfp
330  *   Pointer to TruFlow handle
331  *
332  * [in] parms
333  *   Pointer to input parameters
334  *
335  * Returns:
336  *   0       - Success
337  *   -EINVAL - Parameter error
338  */
339 int tf_em_int_unbind(struct tf *tfp);
340
341 /**
342  * Common bind for EEM device interface. Used for both host and
343  * system memory
344  *
345  * [in] tfp
346  *   Pointer to TruFlow handle
347  *
348  * [in] parms
349  *   Pointer to input parameters
350  *
351  * Returns:
352  *   0       - Success
353  *   -EINVAL - Parameter error
354  */
355 int tf_em_ext_common_bind(struct tf *tfp,
356                           struct tf_em_cfg_parms *parms);
357
358 /**
359  * Common unbind for EEM device interface. Used for both host and
360  * system memory
361  *
362  * [in] tfp
363  *   Pointer to TruFlow handle
364  *
365  * [in] parms
366  *   Pointer to input parameters
367  *
368  * Returns:
369  *   0       - Success
370  *   -EINVAL - Parameter error
371  */
372 int tf_em_ext_common_unbind(struct tf *tfp);
373
374 /**
375  * Alloc for external EEM using host memory
376  *
377  * [in] tfp
378  *   Pointer to TruFlow handle
379  *
380  * [in] parms
381  *   Pointer to input parameters
382  *
383  * Returns:
384  *   0       - Success
385  *   -EINVAL - Parameter error
386  */
387 int tf_em_ext_alloc(struct tf *tfp,
388                     struct tf_alloc_tbl_scope_parms *parms);
389
390 /**
391  * Free for external EEM using host memory
392  *
393  * [in] tfp
394  *   Pointer to TruFlow handle
395  *
396  * [in] parms
397  *   Pointer to input parameters
398  *
399  * Returns:
400  *   0       - Success
401  *   -EINVAL - Parameter error
402  */
403 int tf_em_ext_free(struct tf *tfp,
404                    struct tf_free_tbl_scope_parms *parms);
405
406 /**
407  * Common free table scope for external EEM using host or system memory
408  *
409  * [in] tfp
410  *   Pointer to TruFlow handle
411  *
412  * [in] parms
413  *   Pointer to input parameters
414  *
415  * Returns:
416  *   0       - Success
417  *   -EINVAL - Parameter error
418  */
419 int tf_em_ext_common_free(struct tf *tfp,
420                           struct tf_free_tbl_scope_parms *parms);
421
422 /**
423  * Common alloc table scope for external EEM using host or system memory
424  *
425  * [in] tfp
426  *   Pointer to TruFlow handle
427  *
428  * [in] parms
429  *   Pointer to input parameters
430  *
431  * Returns:
432  *   0       - Success
433  *   -EINVAL - Parameter error
434  */
435 int tf_em_ext_common_alloc(struct tf *tfp,
436                            struct tf_alloc_tbl_scope_parms *parms);
437 /**
438  * Map a set of parifs to a set of EEM base addresses (table scope)
439  *
440  * [in] tfp
441  *   Pointer to TruFlow handle
442  *
443  * [in] parms
444  *   Pointer to input parameters
445  *
446  * Returns:
447  *   0       - Success
448  *   -EINVAL - Parameter error
449  */
450 int tf_em_ext_map_tbl_scope(struct tf *tfp,
451                             struct tf_map_tbl_scope_parms *parms);
452
453 /**
454  * Allocate External Tbl entry from the scope pool.
455  *
456  * [in] tfp
457  *   Pointer to Truflow Handle
458  * [in] parms
459  *   Allocation parameters
460  *
461  * Return:
462  *  0       - Success, entry allocated - no search support
463  *  -ENOMEM -EINVAL -EOPNOTSUPP
464  *          - Failure, entry not allocated, out of resources
465  */
466 int
467 tf_tbl_ext_alloc(struct tf *tfp,
468                  struct tf_tbl_alloc_parms *parms);
469
470 /**
471  * Free External Tbl entry to the scope pool.
472  *
473  * [in] tfp
474  *   Pointer to Truflow Handle
475  * [in] parms
476  *   Allocation parameters
477  *
478  * Return:
479  *  0       - Success, entry freed
480  *
481  * - Failure, entry not successfully freed for these reasons
482  *  -ENOMEM
483  *  -EOPNOTSUPP
484  *  -EINVAL
485  */
486 int
487 tf_tbl_ext_free(struct tf *tfp,
488                 struct tf_tbl_free_parms *parms);
489
490 /**
491  * Sets the specified external table type element.
492  *
493  * This API sets the specified element data by invoking the
494  * firmware.
495  *
496  * [in] tfp
497  *   Pointer to TF handle
498  *
499  * [in] parms
500  *   Pointer to table set parameters
501  *
502  * Returns
503  *   - (0) if successful.
504  *   - (-EINVAL) on failure.
505  */
506 int tf_tbl_ext_common_set(struct tf *tfp,
507                           struct tf_tbl_set_parms *parms);
508
509 /**
510  * Sets the specified external table type element.
511  *
512  * This API sets the specified element data by invoking the
513  * firmware.
514  *
515  * [in] tfp
516  *   Pointer to TF handle
517  *
518  * [in] parms
519  *   Pointer to table set parameters
520  *
521  * Returns
522  *   - (0) if successful.
523  *   - (-EINVAL) on failure.
524  */
525 int tf_tbl_ext_set(struct tf *tfp,
526                    struct tf_tbl_set_parms *parms);
527
528 int
529 tf_em_ext_system_bind(struct tf *tfp,
530                       struct tf_em_cfg_parms *parms);
531
532 int offload_system_mmap(struct tf_tbl_scope_cb *tbl_scope_cb);
533
534 /**
535  * Retrieves the allocated resource info
536  *
537  * [in] tfp
538  *   Pointer to TF handle, used for HCAPI communication
539  *
540  * [in] parms
541  *   Pointer to parameters
542  *
543  * Returns
544  *   - (0) if successful.
545  *   - (-EINVAL) on failure.
546  */
547 int
548 tf_em_get_resc_info(struct tf *tfp,
549                     struct tf_em_resource_info *em);
550 #endif /* _TF_EM_H_ */