net/bnxt: remove EEM system memory support
[dpdk.git] / drivers / net / bnxt / tf_core / tf_device.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019-2020 Broadcom
3  * All rights reserved.
4  */
5
6 #include "tf_device.h"
7 #include "tf_device_p4.h"
8 #include "tfp.h"
9 #include "tf_em.h"
10
11 struct tf;
12
13 /* Forward declarations */
14 static int tf_dev_unbind_p4(struct tf *tfp);
15
16 /**
17  * Device specific bind function, WH+
18  *
19  * [in] tfp
20  *   Pointer to TF handle
21  *
22  * [in] shadow_copy
23  *   Flag controlling shadow copy DB creation
24  *
25  * [in] resources
26  *   Pointer to resource allocation information
27  *
28  * [out] dev_handle
29  *   Device handle
30  *
31  * Returns
32  *   - (0) if successful.
33  *   - (-EINVAL) on parameter or internal failure.
34  */
35 static int
36 tf_dev_bind_p4(struct tf *tfp,
37                bool shadow_copy,
38                struct tf_session_resources *resources,
39                struct tf_dev_info *dev_handle)
40 {
41         int rc;
42         int frc;
43         struct tf_ident_cfg_parms ident_cfg;
44         struct tf_tbl_cfg_parms tbl_cfg;
45         struct tf_tcam_cfg_parms tcam_cfg;
46         struct tf_em_cfg_parms em_cfg;
47         struct tf_if_tbl_cfg_parms if_tbl_cfg;
48         struct tf_global_cfg_cfg_parms global_cfg;
49
50         dev_handle->type = TF_DEVICE_TYPE_WH;
51         /* Initial function initialization */
52         dev_handle->ops = &tf_dev_ops_p4_init;
53
54         /* Initialize the modules */
55
56         ident_cfg.num_elements = TF_IDENT_TYPE_MAX;
57         ident_cfg.cfg = tf_ident_p4;
58         ident_cfg.shadow_copy = shadow_copy;
59         ident_cfg.resources = resources;
60         rc = tf_ident_bind(tfp, &ident_cfg);
61         if (rc) {
62                 TFP_DRV_LOG(ERR,
63                             "Identifier initialization failure\n");
64                 goto fail;
65         }
66
67         tbl_cfg.num_elements = TF_TBL_TYPE_MAX;
68         tbl_cfg.cfg = tf_tbl_p4;
69         tbl_cfg.shadow_copy = shadow_copy;
70         tbl_cfg.resources = resources;
71         rc = tf_tbl_bind(tfp, &tbl_cfg);
72         if (rc) {
73                 TFP_DRV_LOG(ERR,
74                             "Table initialization failure\n");
75                 goto fail;
76         }
77
78         tcam_cfg.num_elements = TF_TCAM_TBL_TYPE_MAX;
79         tcam_cfg.cfg = tf_tcam_p4;
80         tcam_cfg.shadow_copy = shadow_copy;
81         tcam_cfg.resources = resources;
82         rc = tf_tcam_bind(tfp, &tcam_cfg);
83         if (rc) {
84                 TFP_DRV_LOG(ERR,
85                             "TCAM initialization failure\n");
86                 goto fail;
87         }
88
89         /*
90          * EEM
91          */
92         em_cfg.num_elements = TF_EM_TBL_TYPE_MAX;
93         em_cfg.cfg = tf_em_ext_p4;
94         em_cfg.resources = resources;
95         em_cfg.mem_type = TF_EEM_MEM_TYPE_HOST;
96         rc = tf_em_ext_common_bind(tfp, &em_cfg);
97         if (rc) {
98                 TFP_DRV_LOG(ERR,
99                             "EEM initialization failure\n");
100                 goto fail;
101         }
102
103         /*
104          * EM
105          */
106         em_cfg.num_elements = TF_EM_TBL_TYPE_MAX;
107         em_cfg.cfg = tf_em_int_p4;
108         em_cfg.resources = resources;
109         em_cfg.mem_type = 0; /* Not used by EM */
110
111         rc = tf_em_int_bind(tfp, &em_cfg);
112         if (rc) {
113                 TFP_DRV_LOG(ERR,
114                             "EM initialization failure\n");
115                 goto fail;
116         }
117
118         /*
119          * IF_TBL
120          */
121         if_tbl_cfg.num_elements = TF_IF_TBL_TYPE_MAX;
122         if_tbl_cfg.cfg = tf_if_tbl_p4;
123         if_tbl_cfg.shadow_copy = shadow_copy;
124         rc = tf_if_tbl_bind(tfp, &if_tbl_cfg);
125         if (rc) {
126                 TFP_DRV_LOG(ERR,
127                             "IF Table initialization failure\n");
128                 goto fail;
129         }
130
131         /*
132          * GLOBAL_CFG
133          */
134         global_cfg.num_elements = TF_GLOBAL_CFG_TYPE_MAX;
135         global_cfg.cfg = tf_global_cfg_p4;
136         rc = tf_global_cfg_bind(tfp, &global_cfg);
137         if (rc) {
138                 TFP_DRV_LOG(ERR,
139                             "Global Cfg initialization failure\n");
140                 goto fail;
141         }
142
143         /* Final function initialization */
144         dev_handle->ops = &tf_dev_ops_p4;
145
146         return 0;
147
148  fail:
149         /* Cleanup of already created modules */
150         frc = tf_dev_unbind_p4(tfp);
151         if (frc)
152                 return frc;
153
154         return rc;
155 }
156
157 /**
158  * Device specific unbind function, WH+
159  *
160  * [in] tfp
161  *   Pointer to TF handle
162  *
163  * Returns
164  *   - (0) if successful.
165  *   - (-EINVAL) on failure.
166  */
167 static int
168 tf_dev_unbind_p4(struct tf *tfp)
169 {
170         int rc = 0;
171         bool fail = false;
172
173         /* Unbind all the support modules. As this is only done on
174          * close we only report errors as everything has to be cleaned
175          * up regardless.
176          *
177          * In case of residuals TCAMs are cleaned up first as to
178          * invalidate the pipeline in a clean manner.
179          */
180         rc = tf_tcam_unbind(tfp);
181         if (rc) {
182                 TFP_DRV_LOG(ERR,
183                             "Device unbind failed, TCAM\n");
184                 fail = true;
185         }
186
187         rc = tf_ident_unbind(tfp);
188         if (rc) {
189                 TFP_DRV_LOG(ERR,
190                             "Device unbind failed, Identifier\n");
191                 fail = true;
192         }
193
194         rc = tf_tbl_unbind(tfp);
195         if (rc) {
196                 TFP_DRV_LOG(ERR,
197                             "Device unbind failed, Table Type\n");
198                 fail = true;
199         }
200
201         rc = tf_em_ext_common_unbind(tfp);
202         if (rc) {
203                 TFP_DRV_LOG(ERR,
204                             "Device unbind failed, EEM\n");
205                 fail = true;
206         }
207
208         rc = tf_em_int_unbind(tfp);
209         if (rc) {
210                 TFP_DRV_LOG(ERR,
211                             "Device unbind failed, EM\n");
212                 fail = true;
213         }
214
215         rc = tf_if_tbl_unbind(tfp);
216         if (rc) {
217                 TFP_DRV_LOG(ERR,
218                             "Device unbind failed, IF Table Type\n");
219                 fail = true;
220         }
221
222         rc = tf_global_cfg_unbind(tfp);
223         if (rc) {
224                 TFP_DRV_LOG(ERR,
225                             "Device unbind failed, Global Cfg Type\n");
226                 fail = true;
227         }
228
229         if (fail)
230                 return -1;
231
232         return rc;
233 }
234
235 int
236 tf_dev_bind(struct tf *tfp __rte_unused,
237             enum tf_device_type type,
238             bool shadow_copy,
239             struct tf_session_resources *resources,
240             struct tf_dev_info *dev_handle)
241 {
242         switch (type) {
243         case TF_DEVICE_TYPE_WH:
244                 return tf_dev_bind_p4(tfp,
245                                       shadow_copy,
246                                       resources,
247                                       dev_handle);
248         default:
249                 TFP_DRV_LOG(ERR,
250                             "No such device\n");
251                 return -ENODEV;
252         }
253 }
254
255 int
256 tf_dev_unbind(struct tf *tfp,
257               struct tf_dev_info *dev_handle)
258 {
259         switch (dev_handle->type) {
260         case TF_DEVICE_TYPE_WH:
261                 return tf_dev_unbind_p4(tfp);
262         default:
263                 TFP_DRV_LOG(ERR,
264                             "No such device\n");
265                 return -ENODEV;
266         }
267 }