1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2019-2020 Broadcom
6 #include "bnxt_tf_common.h"
7 #include "ulp_template_struct.h"
8 #include "ulp_template_db_enum.h"
9 #include "ulp_template_db_field.h"
10 #include "ulp_utils.h"
11 #include "ulp_port_db.h"
12 #include "ulp_flow_db.h"
13 #include "ulp_mapper.h"
15 #define BNXT_ULP_FREE_PARIF_BASE 11
17 struct bnxt_ulp_def_param_handler {
18 int32_t (*vfr_func)(struct bnxt_ulp_context *ulp_ctx,
19 struct ulp_tlv_param *param,
20 struct bnxt_ulp_mapper_create_parms *mapper_params);
24 ulp_set_svif_in_comp_fld(struct bnxt_ulp_context *ulp_ctx,
25 uint32_t ifindex, uint8_t svif_type,
26 struct bnxt_ulp_mapper_create_parms *mapper_params)
32 rc = ulp_port_db_svif_get(ulp_ctx, ifindex, svif_type, &svif);
36 if (svif_type == BNXT_ULP_PHY_PORT_SVIF)
37 idx = BNXT_ULP_CF_IDX_PHY_PORT_SVIF;
38 else if (svif_type == BNXT_ULP_DRV_FUNC_SVIF)
39 idx = BNXT_ULP_CF_IDX_DRV_FUNC_SVIF;
41 idx = BNXT_ULP_CF_IDX_VF_FUNC_SVIF;
43 ULP_COMP_FLD_IDX_WR(mapper_params, idx, svif);
49 ulp_set_spif_in_comp_fld(struct bnxt_ulp_context *ulp_ctx,
50 uint32_t ifindex, uint8_t spif_type,
51 struct bnxt_ulp_mapper_create_parms *mapper_params)
57 rc = ulp_port_db_spif_get(ulp_ctx, ifindex, spif_type, &spif);
61 if (spif_type == BNXT_ULP_PHY_PORT_SPIF)
62 idx = BNXT_ULP_CF_IDX_PHY_PORT_SPIF;
63 else if (spif_type == BNXT_ULP_DRV_FUNC_SPIF)
64 idx = BNXT_ULP_CF_IDX_DRV_FUNC_SPIF;
66 idx = BNXT_ULP_CF_IDX_VF_FUNC_SPIF;
68 ULP_COMP_FLD_IDX_WR(mapper_params, idx, spif);
74 ulp_set_parif_in_comp_fld(struct bnxt_ulp_context *ulp_ctx,
75 uint32_t ifindex, uint8_t parif_type,
76 struct bnxt_ulp_mapper_create_parms *mapper_params)
82 rc = ulp_port_db_parif_get(ulp_ctx, ifindex, parif_type, &parif);
86 if (parif_type == BNXT_ULP_PHY_PORT_PARIF) {
87 idx = BNXT_ULP_CF_IDX_PHY_PORT_PARIF;
88 } else if (parif_type == BNXT_ULP_DRV_FUNC_PARIF) {
89 idx = BNXT_ULP_CF_IDX_DRV_FUNC_PARIF;
90 /* Parif needs to be reset to a free partition */
91 parif += BNXT_ULP_FREE_PARIF_BASE;
93 idx = BNXT_ULP_CF_IDX_VF_FUNC_PARIF;
96 ULP_COMP_FLD_IDX_WR(mapper_params, idx, parif);
102 ulp_set_vport_in_comp_fld(struct bnxt_ulp_context *ulp_ctx, uint32_t ifindex,
103 struct bnxt_ulp_mapper_create_parms *mapper_params)
108 rc = ulp_port_db_vport_get(ulp_ctx, ifindex, &vport);
112 ULP_COMP_FLD_IDX_WR(mapper_params, BNXT_ULP_CF_IDX_PHY_PORT_VPORT,
118 ulp_set_vnic_in_comp_fld(struct bnxt_ulp_context *ulp_ctx,
119 uint32_t ifindex, uint8_t vnic_type,
120 struct bnxt_ulp_mapper_create_parms *mapper_params)
126 rc = ulp_port_db_default_vnic_get(ulp_ctx, ifindex, vnic_type, &vnic);
130 if (vnic_type == BNXT_ULP_DRV_FUNC_VNIC)
131 idx = BNXT_ULP_CF_IDX_DRV_FUNC_VNIC;
133 idx = BNXT_ULP_CF_IDX_VF_FUNC_VNIC;
135 ULP_COMP_FLD_IDX_WR(mapper_params, idx, vnic);
141 ulp_set_vlan_in_act_prop(uint16_t port_id,
142 struct bnxt_ulp_mapper_create_parms *mapper_params)
144 struct ulp_rte_act_prop *act_prop = mapper_params->act_prop;
146 if (ULP_BITMAP_ISSET(mapper_params->act->bits,
147 BNXT_ULP_ACTION_BIT_SET_VLAN_VID)) {
149 "VLAN already set, multiple VLANs unsupported\n");
150 return BNXT_TF_RC_ERROR;
153 port_id = rte_cpu_to_be_16(port_id);
155 ULP_BITMAP_SET(mapper_params->act->bits,
156 BNXT_ULP_ACTION_BIT_SET_VLAN_VID);
158 memcpy(&act_prop->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG],
159 &port_id, sizeof(port_id));
165 ulp_set_mark_in_act_prop(uint16_t port_id,
166 struct bnxt_ulp_mapper_create_parms *mapper_params)
168 if (ULP_BITMAP_ISSET(mapper_params->act->bits,
169 BNXT_ULP_ACTION_BIT_MARK)) {
171 "MARK already set, multiple MARKs unsupported\n");
172 return BNXT_TF_RC_ERROR;
175 ULP_COMP_FLD_IDX_WR(mapper_params, BNXT_ULP_CF_IDX_DEV_PORT_ID,
182 ulp_df_dev_port_handler(struct bnxt_ulp_context *ulp_ctx,
183 struct ulp_tlv_param *param,
184 struct bnxt_ulp_mapper_create_parms *mapper_params)
190 port_id = param->value[0] | param->value[1];
192 rc = ulp_port_db_dev_port_to_ulp_index(ulp_ctx, port_id, &ifindex);
195 "Invalid port id\n");
196 return BNXT_TF_RC_ERROR;
200 rc = ulp_set_svif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_PHY_PORT_SVIF,
205 /* Set DRV Func SVIF */
206 rc = ulp_set_svif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_DRV_FUNC_SVIF,
211 /* Set VF Func SVIF */
212 rc = ulp_set_svif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_VF_FUNC_SVIF,
218 rc = ulp_set_spif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_PHY_PORT_SPIF,
223 /* Set DRV Func SPIF */
224 rc = ulp_set_spif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_DRV_FUNC_SPIF,
229 /* Set VF Func SPIF */
230 rc = ulp_set_spif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_DRV_FUNC_SPIF,
236 rc = ulp_set_parif_in_comp_fld(ulp_ctx, ifindex,
237 BNXT_ULP_PHY_PORT_PARIF, mapper_params);
241 /* Set DRV Func PARIF */
242 rc = ulp_set_parif_in_comp_fld(ulp_ctx, ifindex,
243 BNXT_ULP_DRV_FUNC_PARIF, mapper_params);
247 /* Set VF Func PARIF */
248 rc = ulp_set_parif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_VF_FUNC_PARIF,
253 /* Set uplink VNIC */
254 rc = ulp_set_vnic_in_comp_fld(ulp_ctx, ifindex, true, mapper_params);
259 rc = ulp_set_vnic_in_comp_fld(ulp_ctx, ifindex, false, mapper_params);
264 rc = ulp_set_vport_in_comp_fld(ulp_ctx, ifindex, mapper_params);
269 rc = ulp_set_vlan_in_act_prop(port_id, mapper_params);
274 rc = ulp_set_mark_in_act_prop(port_id, mapper_params);
281 struct bnxt_ulp_def_param_handler ulp_def_handler_tbl[] = {
282 [BNXT_ULP_DF_PARAM_TYPE_DEV_PORT_ID] = {
283 .vfr_func = ulp_df_dev_port_handler }
287 * Function to create default rules for the following paths
288 * 1) Device PORT to DPDK App
289 * 2) DPDK App to Device PORT
290 * 3) VF Representor to VF
291 * 4) VF to VF Representor
293 * eth_dev [in] Ptr to rte eth device.
294 * param_list [in] Ptr to a list of parameters (Currently, only DPDK port_id).
295 * ulp_class_tid [in] Class template ID number.
296 * flow_id [out] Ptr to flow identifier.
298 * Returns 0 on success or negative number on failure.
301 ulp_default_flow_create(struct rte_eth_dev *eth_dev,
302 struct ulp_tlv_param *param_list,
303 uint32_t ulp_class_tid,
306 struct ulp_rte_hdr_field hdr_field[BNXT_ULP_PROTO_HDR_MAX];
307 uint32_t comp_fld[BNXT_ULP_CF_IDX_LAST];
308 struct bnxt_ulp_mapper_create_parms mapper_params = { 0 };
309 struct ulp_rte_act_prop act_prop;
310 struct ulp_rte_act_bitmap act = { 0 };
311 struct bnxt_ulp_context *ulp_ctx;
312 uint32_t type, ulp_flags = 0;
315 memset(&mapper_params, 0, sizeof(mapper_params));
316 memset(hdr_field, 0, sizeof(hdr_field));
317 memset(comp_fld, 0, sizeof(comp_fld));
318 memset(&act_prop, 0, sizeof(act_prop));
320 mapper_params.hdr_field = hdr_field;
321 mapper_params.act = &act;
322 mapper_params.act_prop = &act_prop;
323 mapper_params.comp_fld = comp_fld;
325 ulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(eth_dev);
327 BNXT_TF_DBG(ERR, "ULP context is not initialized. "
328 "Failed to create default flow.\n");
332 /* update the vf rep flag */
333 if (bnxt_ulp_cntxt_ptr2_ulp_flags_get(ulp_ctx, &ulp_flags)) {
334 BNXT_TF_DBG(ERR, "Error in getting ULP context flags\n");
337 if (ULP_VF_REP_IS_ENABLED(ulp_flags))
338 ULP_COMP_FLD_IDX_WR(&mapper_params,
339 BNXT_ULP_CF_IDX_VFR_MODE, 1);
341 type = param_list->type;
342 while (type != BNXT_ULP_DF_PARAM_TYPE_LAST) {
343 if (ulp_def_handler_tbl[type].vfr_func) {
344 rc = ulp_def_handler_tbl[type].vfr_func(ulp_ctx,
349 "Failed to create default flow.\n");
355 type = param_list->type;
358 mapper_params.class_tid = ulp_class_tid;
360 rc = ulp_mapper_flow_create(ulp_ctx, &mapper_params, flow_id);
362 BNXT_TF_DBG(ERR, "Failed to create default flow.\n");
370 * Function to destroy default rules for the following paths
371 * 1) Device PORT to DPDK App
372 * 2) DPDK App to Device PORT
373 * 3) VF Representor to VF
374 * 4) VF to VF Representor
376 * eth_dev [in] Ptr to rte eth device.
377 * flow_id [in] Flow identifier.
379 * Returns 0 on success or negative number on failure.
382 ulp_default_flow_destroy(struct rte_eth_dev *eth_dev, uint32_t flow_id)
384 struct bnxt_ulp_context *ulp_ctx;
387 ulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(eth_dev);
389 BNXT_TF_DBG(ERR, "ULP context is not initialized\n");
393 rc = ulp_mapper_flow_destroy(ulp_ctx, flow_id,
394 BNXT_ULP_DEFAULT_FLOW_TABLE);
396 BNXT_TF_DBG(ERR, "Failed to destroy flow.\n");