net/bnxt: add shadow and search capability to TCAM
[dpdk.git] / drivers / net / bnxt / tf_core / tf_shadow_tcam.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019-2020 Broadcom
3  * All rights reserved.
4  */
5
6 #ifndef _TF_SHADOW_TCAM_H_
7 #define _TF_SHADOW_TCAM_H_
8
9 #include "tf_core.h"
10
11 /**
12  * Shadow DB configuration information
13  *
14  * The shadow configuration is for all tcam table types for a direction
15  */
16 struct tf_shadow_tcam_cfg_parms {
17         /**
18          * [in] The number of elements in the alloc_cnt and base_addr
19          * For now, it should always be equal to TF_TCAM_TBL_TYPE_MAX
20          */
21         int num_entries;
22         /**
23          * [in] Resource allocation count array
24          * This array content originates from the tf_session_resources
25          * that is passed in on session open
26          * Array size is TF_TCAM_TBL_TYPE_MAX
27          */
28         uint16_t *alloc_cnt;
29         /**
30          * [in] The base index for each tcam table
31          */
32         uint16_t base_addr[TF_TCAM_TBL_TYPE_MAX];
33 };
34
35 /**
36  * Shadow TCAM  DB creation parameters.  The shadow db for this direction
37  * is returned
38  */
39 struct tf_shadow_tcam_create_db_parms {
40         /**
41          * [in] Receive or transmit direction
42          */
43         enum tf_dir dir;
44         /**
45          * [in] Configuration information for the shadow db
46          */
47         struct tf_shadow_tcam_cfg_parms *cfg;
48         /**
49          * [out] Shadow tcam DB handle
50          */
51         void **shadow_db;
52 };
53
54 /**
55  * Create the shadow db for a single direction
56  *
57  * The returned shadow db must be free using the free db API when no longer
58  * needed
59  */
60 int
61 tf_shadow_tcam_create_db(struct tf_shadow_tcam_create_db_parms *parms);
62
63 /**
64  * Shadow TCAM free parameters
65  */
66 struct tf_shadow_tcam_free_db_parms {
67         /**
68          * [in] Shadow tcam DB handle
69          */
70         void *shadow_db;
71 };
72
73 /**
74  * Free all resources associated with the shadow db
75  */
76 int
77 tf_shadow_tcam_free_db(struct tf_shadow_tcam_free_db_parms *parms);
78
79 /**
80  * Shadow TCAM bind index parameters
81  */
82 struct tf_shadow_tcam_bind_index_parms {
83         /**
84          * [in] Shadow tcam DB handle
85          */
86         void *shadow_db;
87         /**
88          * [in] receive or transmit direction
89          */
90         enum tf_dir dir;
91         /**
92          * [in] TCAM table type
93          */
94         enum tf_tcam_tbl_type type;
95         /**
96          * [in] index of the entry to program
97          */
98         uint16_t idx;
99         /**
100          * [in] struct containing key
101          */
102         uint8_t *key;
103         /**
104          * [in] struct containing mask fields
105          */
106         uint8_t *mask;
107         /**
108          * [in] key size in bits (if search)
109          */
110         uint16_t key_size;
111         /**
112          * [in] The hash bucket handled returned from the search
113          */
114         uint32_t hb_handle;
115 };
116
117 /**
118  * Binds the allocated tcam index with the hash and shadow tables
119  */
120 int
121 tf_shadow_tcam_bind_index(struct tf_shadow_tcam_bind_index_parms *parms);
122
123 /**
124  * Shadow TCAM insert parameters
125  */
126 struct  tf_shadow_tcam_insert_parms {
127         /**
128          * [in] Shadow tcam DB handle
129          */
130         void *shadow_db;
131         /**
132          * [in] The set parms from tf core
133          */
134         struct tf_tcam_set_parms *sparms;
135 };
136
137 /**
138  * Set the entry into the tcam manager hash and shadow tables
139  *
140  * The search must have been used prior to setting the entry so that the
141  * hash has been calculated and duplicate entries will not be added
142  */
143 int
144 tf_shadow_tcam_insert(struct tf_shadow_tcam_insert_parms *parms);
145
146 /**
147  * Shadow TCAM remove parameters
148  */
149 struct tf_shadow_tcam_remove_parms {
150         /**
151          * [in] Shadow tcam DB handle
152          */
153         void *shadow_db;
154         /**
155          * [in,out] The set parms from tf core
156          */
157         struct tf_tcam_free_parms *fparms;
158 };
159
160 /**
161  * Remove the entry from the tcam hash and shadow tables
162  *
163  * The search must have been used prior to setting the entry so that the
164  * hash has been calculated and duplicate entries will not be added
165  */
166 int
167 tf_shadow_tcam_remove(struct tf_shadow_tcam_remove_parms *parms);
168
169 /**
170  * Shadow TCAM search parameters
171  */
172 struct tf_shadow_tcam_search_parms {
173         /**
174          * [in] Shadow tcam DB handle
175          */
176         void *shadow_db;
177         /**
178          * [in,out] The search parameters from tf core
179          */
180         struct tf_tcam_alloc_search_parms *sparms;
181         /**
182          * [out] The hash handle to use for the set
183          */
184         uint32_t hb_handle;
185 };
186
187 /**
188  * Search for an entry in the tcam hash/shadow tables
189  *
190  * If there is a miss, but there is room for insertion, the hb_handle returned
191  * is used for insertion during the bind index API
192  */
193 int
194 tf_shadow_tcam_search(struct tf_shadow_tcam_search_parms *parms);
195 #endif