1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019-2020 Broadcom
7 #include "tf_device_p4.h"
13 /* Forward declarations */
14 static int tf_dev_unbind_p4(struct tf *tfp);
17 * Device specific bind function, WH+
20 * Pointer to TF handle
23 * Flag controlling shadow copy DB creation
26 * Pointer to resource allocation information
32 * - (0) if successful.
33 * - (-EINVAL) on parameter or internal failure.
36 tf_dev_bind_p4(struct tf *tfp,
38 struct tf_session_resources *resources,
39 struct tf_dev_info *dev_handle)
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;
50 /* Initial function initialization */
51 dev_handle->ops = &tf_dev_ops_p4_init;
53 /* Initialize the modules */
55 ident_cfg.num_elements = TF_IDENT_TYPE_MAX;
56 ident_cfg.cfg = tf_ident_p4;
57 ident_cfg.shadow_copy = shadow_copy;
58 ident_cfg.resources = resources;
59 rc = tf_ident_bind(tfp, &ident_cfg);
62 "Identifier initialization failure\n");
66 tbl_cfg.num_elements = TF_TBL_TYPE_MAX;
67 tbl_cfg.cfg = tf_tbl_p4;
68 tbl_cfg.shadow_copy = shadow_copy;
69 tbl_cfg.resources = resources;
70 rc = tf_tbl_bind(tfp, &tbl_cfg);
73 "Table initialization failure\n");
77 tcam_cfg.num_elements = TF_TCAM_TBL_TYPE_MAX;
78 tcam_cfg.cfg = tf_tcam_p4;
79 tcam_cfg.shadow_copy = shadow_copy;
80 tcam_cfg.resources = resources;
81 rc = tf_tcam_bind(tfp, &tcam_cfg);
84 "TCAM initialization failure\n");
91 em_cfg.num_elements = TF_EM_TBL_TYPE_MAX;
92 if (dev_handle->type == TF_DEVICE_TYPE_WH)
93 em_cfg.cfg = tf_em_ext_p4;
95 em_cfg.cfg = tf_em_ext_p45;
96 em_cfg.resources = resources;
97 em_cfg.mem_type = TF_EEM_MEM_TYPE_HOST;
98 rc = tf_em_ext_common_bind(tfp, &em_cfg);
101 "EEM initialization failure\n");
108 em_cfg.num_elements = TF_EM_TBL_TYPE_MAX;
109 em_cfg.cfg = tf_em_int_p4;
110 em_cfg.resources = resources;
111 em_cfg.mem_type = 0; /* Not used by EM */
113 rc = tf_em_int_bind(tfp, &em_cfg);
116 "EM initialization failure\n");
123 if_tbl_cfg.num_elements = TF_IF_TBL_TYPE_MAX;
124 if_tbl_cfg.cfg = tf_if_tbl_p4;
125 if_tbl_cfg.shadow_copy = shadow_copy;
126 rc = tf_if_tbl_bind(tfp, &if_tbl_cfg);
129 "IF Table initialization failure\n");
136 global_cfg.num_elements = TF_GLOBAL_CFG_TYPE_MAX;
137 global_cfg.cfg = tf_global_cfg_p4;
138 rc = tf_global_cfg_bind(tfp, &global_cfg);
141 "Global Cfg initialization failure\n");
145 /* Final function initialization */
146 dev_handle->ops = &tf_dev_ops_p4;
151 /* Cleanup of already created modules */
152 frc = tf_dev_unbind_p4(tfp);
160 * Device specific unbind function, WH+
163 * Pointer to TF handle
166 * - (0) if successful.
167 * - (-EINVAL) on failure.
170 tf_dev_unbind_p4(struct tf *tfp)
175 /* Unbind all the support modules. As this is only done on
176 * close we only report errors as everything has to be cleaned
179 * In case of residuals TCAMs are cleaned up first as to
180 * invalidate the pipeline in a clean manner.
182 rc = tf_tcam_unbind(tfp);
185 "Device unbind failed, TCAM\n");
189 rc = tf_ident_unbind(tfp);
192 "Device unbind failed, Identifier\n");
196 rc = tf_tbl_unbind(tfp);
199 "Device unbind failed, Table Type\n");
203 rc = tf_em_ext_common_unbind(tfp);
206 "Device unbind failed, EEM\n");
210 rc = tf_em_int_unbind(tfp);
213 "Device unbind failed, EM\n");
217 rc = tf_if_tbl_unbind(tfp);
220 "Device unbind failed, IF Table Type\n");
224 rc = tf_global_cfg_unbind(tfp);
227 "Device unbind failed, Global Cfg Type\n");
238 tf_dev_bind(struct tf *tfp __rte_unused,
239 enum tf_device_type type,
241 struct tf_session_resources *resources,
242 struct tf_dev_info *dev_handle)
245 case TF_DEVICE_TYPE_WH:
246 case TF_DEVICE_TYPE_SR:
247 dev_handle->type = type;
248 return tf_dev_bind_p4(tfp,
260 tf_dev_unbind(struct tf *tfp,
261 struct tf_dev_info *dev_handle)
263 switch (dev_handle->type) {
264 case TF_DEVICE_TYPE_WH:
265 case TF_DEVICE_TYPE_SR:
266 return tf_dev_unbind_p4(tfp);