xref: /dpdk/drivers/net/bnxt/tf_core/tf_device.c (revision 3cc6ecfdfe85d2577fef30e1791bb7534e3d60b3)
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 }
268