xref: /dpdk/drivers/net/bnxt/tf_ulp/ulp_def_rules.c (revision d4b36fc5f0dc59b256441c82e5a9395054026496)
1d0eaabd4SVenkat Duvvuru /* SPDX-License-Identifier: BSD-3-Clause
2d9e70b1dSRandy Schacher  * Copyright(c) 2019-2023 Broadcom
3d0eaabd4SVenkat Duvvuru  * All rights reserved.
4d0eaabd4SVenkat Duvvuru  */
5d0eaabd4SVenkat Duvvuru 
6d0eaabd4SVenkat Duvvuru #include "bnxt_tf_common.h"
70c036a14SPeter Spreadborough #include "bnxt_ulp_utils.h"
8d0eaabd4SVenkat Duvvuru #include "ulp_template_struct.h"
9d0eaabd4SVenkat Duvvuru #include "ulp_template_db_enum.h"
10d0eaabd4SVenkat Duvvuru #include "ulp_template_db_field.h"
11d0eaabd4SVenkat Duvvuru #include "ulp_utils.h"
12d0eaabd4SVenkat Duvvuru #include "ulp_port_db.h"
13d0eaabd4SVenkat Duvvuru #include "ulp_flow_db.h"
14d0eaabd4SVenkat Duvvuru #include "ulp_mapper.h"
15*d4b36fc5SKishore Padmanabha #include "ulp_rte_parser.h"
16032d49efSKishore Padmanabha static void
17032d49efSKishore Padmanabha ulp_l2_custom_tunnel_id_update(struct bnxt *bp,
18dd0191d5SShuanglin Wang 			       struct bnxt_ulp_mapper_parms *params);
19032d49efSKishore Padmanabha 
20d0eaabd4SVenkat Duvvuru struct bnxt_ulp_def_param_handler {
21d0eaabd4SVenkat Duvvuru 	int32_t (*vfr_func)(struct bnxt_ulp_context *ulp_ctx,
22d0eaabd4SVenkat Duvvuru 			    struct ulp_tlv_param *param,
23dd0191d5SShuanglin Wang 			    struct bnxt_ulp_mapper_parms *mapper_params);
24d0eaabd4SVenkat Duvvuru };
25d0eaabd4SVenkat Duvvuru 
26d0eaabd4SVenkat Duvvuru static int32_t
27d0eaabd4SVenkat Duvvuru ulp_set_svif_in_comp_fld(struct bnxt_ulp_context *ulp_ctx,
28d0eaabd4SVenkat Duvvuru 			 uint32_t  ifindex, uint8_t svif_type,
29dd0191d5SShuanglin Wang 			 struct bnxt_ulp_mapper_parms *mapper_params)
30d0eaabd4SVenkat Duvvuru {
31d0eaabd4SVenkat Duvvuru 	uint16_t svif;
32d0eaabd4SVenkat Duvvuru 	uint8_t idx;
33d0eaabd4SVenkat Duvvuru 	int rc;
34d0eaabd4SVenkat Duvvuru 
35d0eaabd4SVenkat Duvvuru 	rc = ulp_port_db_svif_get(ulp_ctx, ifindex, svif_type, &svif);
36d0eaabd4SVenkat Duvvuru 	if (rc)
37d0eaabd4SVenkat Duvvuru 		return rc;
38d0eaabd4SVenkat Duvvuru 
39d0eaabd4SVenkat Duvvuru 	if (svif_type == BNXT_ULP_PHY_PORT_SVIF)
40d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_PHY_PORT_SVIF;
41d0eaabd4SVenkat Duvvuru 	else if (svif_type == BNXT_ULP_DRV_FUNC_SVIF)
42d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_DRV_FUNC_SVIF;
43d0eaabd4SVenkat Duvvuru 	else
44d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_VF_FUNC_SVIF;
45d0eaabd4SVenkat Duvvuru 
46d0eaabd4SVenkat Duvvuru 	ULP_COMP_FLD_IDX_WR(mapper_params, idx, svif);
47d0eaabd4SVenkat Duvvuru 
48d0eaabd4SVenkat Duvvuru 	return 0;
49d0eaabd4SVenkat Duvvuru }
50d0eaabd4SVenkat Duvvuru 
51d0eaabd4SVenkat Duvvuru static int32_t
52d0eaabd4SVenkat Duvvuru ulp_set_spif_in_comp_fld(struct bnxt_ulp_context *ulp_ctx,
53d0eaabd4SVenkat Duvvuru 			 uint32_t  ifindex, uint8_t spif_type,
54dd0191d5SShuanglin Wang 			 struct bnxt_ulp_mapper_parms *mapper_params)
55d0eaabd4SVenkat Duvvuru {
56d0eaabd4SVenkat Duvvuru 	uint16_t spif;
57d0eaabd4SVenkat Duvvuru 	uint8_t idx;
58d0eaabd4SVenkat Duvvuru 	int rc;
59d0eaabd4SVenkat Duvvuru 
60d0eaabd4SVenkat Duvvuru 	rc = ulp_port_db_spif_get(ulp_ctx, ifindex, spif_type, &spif);
61d0eaabd4SVenkat Duvvuru 	if (rc)
62d0eaabd4SVenkat Duvvuru 		return rc;
63d0eaabd4SVenkat Duvvuru 
64d0eaabd4SVenkat Duvvuru 	if (spif_type == BNXT_ULP_PHY_PORT_SPIF)
65d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_PHY_PORT_SPIF;
66d0eaabd4SVenkat Duvvuru 	else if (spif_type == BNXT_ULP_DRV_FUNC_SPIF)
67d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_DRV_FUNC_SPIF;
68d0eaabd4SVenkat Duvvuru 	else
69d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_VF_FUNC_SPIF;
70d0eaabd4SVenkat Duvvuru 
71d0eaabd4SVenkat Duvvuru 	ULP_COMP_FLD_IDX_WR(mapper_params, idx, spif);
72d0eaabd4SVenkat Duvvuru 
73d0eaabd4SVenkat Duvvuru 	return 0;
74d0eaabd4SVenkat Duvvuru }
75d0eaabd4SVenkat Duvvuru 
76d0eaabd4SVenkat Duvvuru static int32_t
77d0eaabd4SVenkat Duvvuru ulp_set_parif_in_comp_fld(struct bnxt_ulp_context *ulp_ctx,
78d0eaabd4SVenkat Duvvuru 			  uint32_t  ifindex, uint8_t parif_type,
79dd0191d5SShuanglin Wang 			  struct bnxt_ulp_mapper_parms *mapper_params)
80d0eaabd4SVenkat Duvvuru {
81d0eaabd4SVenkat Duvvuru 	uint16_t parif;
82d0eaabd4SVenkat Duvvuru 	uint8_t idx;
83d0eaabd4SVenkat Duvvuru 	int rc;
84d0eaabd4SVenkat Duvvuru 
85d0eaabd4SVenkat Duvvuru 	rc = ulp_port_db_parif_get(ulp_ctx, ifindex, parif_type, &parif);
86d0eaabd4SVenkat Duvvuru 	if (rc)
87d0eaabd4SVenkat Duvvuru 		return rc;
88d0eaabd4SVenkat Duvvuru 
89f7df1c75SKishore Padmanabha 	if (parif_type == BNXT_ULP_PHY_PORT_PARIF)
90d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_PHY_PORT_PARIF;
91f7df1c75SKishore Padmanabha 	else if (parif_type == BNXT_ULP_DRV_FUNC_PARIF)
92d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_DRV_FUNC_PARIF;
93f7df1c75SKishore Padmanabha 	else
94d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_VF_FUNC_PARIF;
95d0eaabd4SVenkat Duvvuru 
96d0eaabd4SVenkat Duvvuru 	ULP_COMP_FLD_IDX_WR(mapper_params, idx, parif);
97d0eaabd4SVenkat Duvvuru 
98d0eaabd4SVenkat Duvvuru 	return 0;
99d0eaabd4SVenkat Duvvuru }
100d0eaabd4SVenkat Duvvuru 
101d0eaabd4SVenkat Duvvuru static int32_t
102d0eaabd4SVenkat Duvvuru ulp_set_vport_in_comp_fld(struct bnxt_ulp_context *ulp_ctx, uint32_t ifindex,
103dd0191d5SShuanglin Wang 			  struct bnxt_ulp_mapper_parms *mapper_params)
104d0eaabd4SVenkat Duvvuru {
105d0eaabd4SVenkat Duvvuru 	uint16_t vport;
106d0eaabd4SVenkat Duvvuru 	int rc;
107d0eaabd4SVenkat Duvvuru 
108d0eaabd4SVenkat Duvvuru 	rc = ulp_port_db_vport_get(ulp_ctx, ifindex, &vport);
109d0eaabd4SVenkat Duvvuru 	if (rc)
110d0eaabd4SVenkat Duvvuru 		return rc;
111d0eaabd4SVenkat Duvvuru 
112d0eaabd4SVenkat Duvvuru 	ULP_COMP_FLD_IDX_WR(mapper_params, BNXT_ULP_CF_IDX_PHY_PORT_VPORT,
113d0eaabd4SVenkat Duvvuru 			    vport);
114d0eaabd4SVenkat Duvvuru 	return 0;
115d0eaabd4SVenkat Duvvuru }
116d0eaabd4SVenkat Duvvuru 
117d0eaabd4SVenkat Duvvuru static int32_t
118d0eaabd4SVenkat Duvvuru ulp_set_vnic_in_comp_fld(struct bnxt_ulp_context *ulp_ctx,
119d0eaabd4SVenkat Duvvuru 			 uint32_t  ifindex, uint8_t vnic_type,
120dd0191d5SShuanglin Wang 			 struct bnxt_ulp_mapper_parms *mapper_params)
121d0eaabd4SVenkat Duvvuru {
122d0eaabd4SVenkat Duvvuru 	uint16_t vnic;
123d0eaabd4SVenkat Duvvuru 	uint8_t idx;
124d0eaabd4SVenkat Duvvuru 	int rc;
125d0eaabd4SVenkat Duvvuru 
126d0eaabd4SVenkat Duvvuru 	rc = ulp_port_db_default_vnic_get(ulp_ctx, ifindex, vnic_type, &vnic);
127d0eaabd4SVenkat Duvvuru 	if (rc)
128d0eaabd4SVenkat Duvvuru 		return rc;
129d0eaabd4SVenkat Duvvuru 
130d0eaabd4SVenkat Duvvuru 	if (vnic_type == BNXT_ULP_DRV_FUNC_VNIC)
131d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_DRV_FUNC_VNIC;
132d0eaabd4SVenkat Duvvuru 	else
133d0eaabd4SVenkat Duvvuru 		idx = BNXT_ULP_CF_IDX_VF_FUNC_VNIC;
134d0eaabd4SVenkat Duvvuru 
135d0eaabd4SVenkat Duvvuru 	ULP_COMP_FLD_IDX_WR(mapper_params, idx, vnic);
136d0eaabd4SVenkat Duvvuru 
137d0eaabd4SVenkat Duvvuru 	return 0;
138d0eaabd4SVenkat Duvvuru }
139d0eaabd4SVenkat Duvvuru 
140d0eaabd4SVenkat Duvvuru static int32_t
141d0eaabd4SVenkat Duvvuru ulp_set_vlan_in_act_prop(uint16_t port_id,
142dd0191d5SShuanglin Wang 			 struct bnxt_ulp_mapper_parms *mapper_params)
143d0eaabd4SVenkat Duvvuru {
144d0eaabd4SVenkat Duvvuru 	struct ulp_rte_act_prop *act_prop = mapper_params->act_prop;
145d0eaabd4SVenkat Duvvuru 
146dd0191d5SShuanglin Wang 	if (ULP_BITMAP_ISSET(mapper_params->act_bitmap->bits,
14759ae4961SKishore Padmanabha 			     BNXT_ULP_ACT_BIT_SET_VLAN_VID)) {
148dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR,
149d0eaabd4SVenkat Duvvuru 			     "VLAN already set, multiple VLANs unsupported\n");
150d0eaabd4SVenkat Duvvuru 		return BNXT_TF_RC_ERROR;
151d0eaabd4SVenkat Duvvuru 	}
152d0eaabd4SVenkat Duvvuru 
153d0eaabd4SVenkat Duvvuru 	port_id = rte_cpu_to_be_16(port_id);
154d0eaabd4SVenkat Duvvuru 
155dd0191d5SShuanglin Wang 	ULP_BITMAP_SET(mapper_params->act_bitmap->bits,
15659ae4961SKishore Padmanabha 		       BNXT_ULP_ACT_BIT_SET_VLAN_VID);
157d0eaabd4SVenkat Duvvuru 
158d0eaabd4SVenkat Duvvuru 	memcpy(&act_prop->act_details[BNXT_ULP_ACT_PROP_IDX_ENCAP_VTAG],
159d0eaabd4SVenkat Duvvuru 	       &port_id, sizeof(port_id));
160d0eaabd4SVenkat Duvvuru 
161d0eaabd4SVenkat Duvvuru 	return 0;
162d0eaabd4SVenkat Duvvuru }
163d0eaabd4SVenkat Duvvuru 
164d0eaabd4SVenkat Duvvuru static int32_t
165d0eaabd4SVenkat Duvvuru ulp_set_mark_in_act_prop(uint16_t port_id,
166dd0191d5SShuanglin Wang 			 struct bnxt_ulp_mapper_parms *mapper_params)
167d0eaabd4SVenkat Duvvuru {
168dd0191d5SShuanglin Wang 	if (ULP_BITMAP_ISSET(mapper_params->act_bitmap->bits,
16959ae4961SKishore Padmanabha 			     BNXT_ULP_ACT_BIT_MARK)) {
170dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR,
171d0eaabd4SVenkat Duvvuru 			     "MARK already set, multiple MARKs unsupported\n");
172d0eaabd4SVenkat Duvvuru 		return BNXT_TF_RC_ERROR;
173d0eaabd4SVenkat Duvvuru 	}
174d0eaabd4SVenkat Duvvuru 
175d0eaabd4SVenkat Duvvuru 	ULP_COMP_FLD_IDX_WR(mapper_params, BNXT_ULP_CF_IDX_DEV_PORT_ID,
176d0eaabd4SVenkat Duvvuru 			    port_id);
177d0eaabd4SVenkat Duvvuru 
178d0eaabd4SVenkat Duvvuru 	return 0;
179d0eaabd4SVenkat Duvvuru }
180d0eaabd4SVenkat Duvvuru 
181d0eaabd4SVenkat Duvvuru static int32_t
182d0eaabd4SVenkat Duvvuru ulp_df_dev_port_handler(struct bnxt_ulp_context *ulp_ctx,
183d0eaabd4SVenkat Duvvuru 			struct ulp_tlv_param *param,
184dd0191d5SShuanglin Wang 			struct bnxt_ulp_mapper_parms *mapper_params)
185d0eaabd4SVenkat Duvvuru {
186d0eaabd4SVenkat Duvvuru 	uint16_t port_id;
1872921498cSMike Baucom 	uint16_t parif;
188d0eaabd4SVenkat Duvvuru 	uint32_t ifindex;
189d0eaabd4SVenkat Duvvuru 	int rc;
190d0eaabd4SVenkat Duvvuru 
191d0eaabd4SVenkat Duvvuru 	port_id = param->value[0] | param->value[1];
192d0eaabd4SVenkat Duvvuru 
193d0eaabd4SVenkat Duvvuru 	rc = ulp_port_db_dev_port_to_ulp_index(ulp_ctx, port_id, &ifindex);
194d0eaabd4SVenkat Duvvuru 	if (rc) {
195dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Invalid port id\n");
196d0eaabd4SVenkat Duvvuru 		return BNXT_TF_RC_ERROR;
197d0eaabd4SVenkat Duvvuru 	}
198d0eaabd4SVenkat Duvvuru 
199d0eaabd4SVenkat Duvvuru 	/* Set port SVIF */
200d0eaabd4SVenkat Duvvuru 	rc = ulp_set_svif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_PHY_PORT_SVIF,
201d0eaabd4SVenkat Duvvuru 				      mapper_params);
202d0eaabd4SVenkat Duvvuru 	if (rc)
203d0eaabd4SVenkat Duvvuru 		return rc;
204d0eaabd4SVenkat Duvvuru 
205d0eaabd4SVenkat Duvvuru 	/* Set DRV Func SVIF */
206d0eaabd4SVenkat Duvvuru 	rc = ulp_set_svif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_DRV_FUNC_SVIF,
207d0eaabd4SVenkat Duvvuru 				      mapper_params);
208d0eaabd4SVenkat Duvvuru 	if (rc)
209d0eaabd4SVenkat Duvvuru 		return rc;
210d0eaabd4SVenkat Duvvuru 
211d0eaabd4SVenkat Duvvuru 	/* Set VF Func SVIF */
212d0eaabd4SVenkat Duvvuru 	rc = ulp_set_svif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_VF_FUNC_SVIF,
213d0eaabd4SVenkat Duvvuru 				      mapper_params);
214d0eaabd4SVenkat Duvvuru 	if (rc)
215d0eaabd4SVenkat Duvvuru 		return rc;
216d0eaabd4SVenkat Duvvuru 
217d0eaabd4SVenkat Duvvuru 	/* Set port SPIF */
218d0eaabd4SVenkat Duvvuru 	rc = ulp_set_spif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_PHY_PORT_SPIF,
219d0eaabd4SVenkat Duvvuru 				      mapper_params);
220d0eaabd4SVenkat Duvvuru 	if (rc)
221d0eaabd4SVenkat Duvvuru 		return rc;
222d0eaabd4SVenkat Duvvuru 
223d0eaabd4SVenkat Duvvuru 	/* Set DRV Func SPIF */
224d0eaabd4SVenkat Duvvuru 	rc = ulp_set_spif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_DRV_FUNC_SPIF,
225d0eaabd4SVenkat Duvvuru 				      mapper_params);
226d0eaabd4SVenkat Duvvuru 	if (rc)
227d0eaabd4SVenkat Duvvuru 		return rc;
228d0eaabd4SVenkat Duvvuru 
229d0eaabd4SVenkat Duvvuru 	/* Set VF Func SPIF */
230d0eaabd4SVenkat Duvvuru 	rc = ulp_set_spif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_DRV_FUNC_SPIF,
231d0eaabd4SVenkat Duvvuru 				      mapper_params);
232d0eaabd4SVenkat Duvvuru 	if (rc)
233d0eaabd4SVenkat Duvvuru 		return rc;
234d0eaabd4SVenkat Duvvuru 
235d0eaabd4SVenkat Duvvuru 	/* Set port PARIF */
236d0eaabd4SVenkat Duvvuru 	rc = ulp_set_parif_in_comp_fld(ulp_ctx, ifindex,
237d0eaabd4SVenkat Duvvuru 				       BNXT_ULP_PHY_PORT_PARIF, mapper_params);
238d0eaabd4SVenkat Duvvuru 	if (rc)
239d0eaabd4SVenkat Duvvuru 		return rc;
240d0eaabd4SVenkat Duvvuru 
241d0eaabd4SVenkat Duvvuru 	/* Set DRV Func PARIF */
242d0eaabd4SVenkat Duvvuru 	rc = ulp_set_parif_in_comp_fld(ulp_ctx, ifindex,
243d0eaabd4SVenkat Duvvuru 				       BNXT_ULP_DRV_FUNC_PARIF, mapper_params);
244d0eaabd4SVenkat Duvvuru 	if (rc)
245d0eaabd4SVenkat Duvvuru 		return rc;
246d0eaabd4SVenkat Duvvuru 
2472921498cSMike Baucom 	/* Note:
2482921498cSMike Baucom 	 * We save the drv_func_parif into CF_IDX of phy_port_parif,
2492921498cSMike Baucom 	 * since that index is currently referenced by ingress templates
2502921498cSMike Baucom 	 * for datapath flows. If in the future we change the parser to
2512921498cSMike Baucom 	 * save it in the CF_IDX of drv_func_parif we also need to update
2522921498cSMike Baucom 	 * the template.
2532921498cSMike Baucom 	 * WARNING: Two VFs on same parent PF will not work, as the parif is
2542921498cSMike Baucom 	 * based on fw fid of the parent PF.
2552921498cSMike Baucom 	 */
2562921498cSMike Baucom 	parif = ULP_COMP_FLD_IDX_RD(mapper_params, BNXT_ULP_CF_IDX_DRV_FUNC_PARIF);
2572921498cSMike Baucom 	ULP_COMP_FLD_IDX_WR(mapper_params, BNXT_ULP_CF_IDX_PHY_PORT_PARIF, parif);
2582921498cSMike Baucom 
259d0eaabd4SVenkat Duvvuru 	/* Set VF Func PARIF */
260d0eaabd4SVenkat Duvvuru 	rc = ulp_set_parif_in_comp_fld(ulp_ctx, ifindex, BNXT_ULP_VF_FUNC_PARIF,
261d0eaabd4SVenkat Duvvuru 				       mapper_params);
262d0eaabd4SVenkat Duvvuru 	if (rc)
263d0eaabd4SVenkat Duvvuru 		return rc;
264d0eaabd4SVenkat Duvvuru 
265d0eaabd4SVenkat Duvvuru 	/* Set uplink VNIC */
266d0eaabd4SVenkat Duvvuru 	rc = ulp_set_vnic_in_comp_fld(ulp_ctx, ifindex, true, mapper_params);
267d0eaabd4SVenkat Duvvuru 	if (rc)
268d0eaabd4SVenkat Duvvuru 		return rc;
269d0eaabd4SVenkat Duvvuru 
270d0eaabd4SVenkat Duvvuru 	/* Set VF VNIC */
271d0eaabd4SVenkat Duvvuru 	rc = ulp_set_vnic_in_comp_fld(ulp_ctx, ifindex, false, mapper_params);
272d0eaabd4SVenkat Duvvuru 	if (rc)
273d0eaabd4SVenkat Duvvuru 		return rc;
274d0eaabd4SVenkat Duvvuru 
275d0eaabd4SVenkat Duvvuru 	/* Set VPORT */
276d0eaabd4SVenkat Duvvuru 	rc = ulp_set_vport_in_comp_fld(ulp_ctx, ifindex, mapper_params);
277d0eaabd4SVenkat Duvvuru 	if (rc)
278d0eaabd4SVenkat Duvvuru 		return rc;
279d0eaabd4SVenkat Duvvuru 
280d0eaabd4SVenkat Duvvuru 	/* Set VLAN */
281d0eaabd4SVenkat Duvvuru 	rc = ulp_set_vlan_in_act_prop(port_id, mapper_params);
282d0eaabd4SVenkat Duvvuru 	if (rc)
283d0eaabd4SVenkat Duvvuru 		return rc;
284d0eaabd4SVenkat Duvvuru 
285d0eaabd4SVenkat Duvvuru 	/* Set MARK */
286d0eaabd4SVenkat Duvvuru 	rc = ulp_set_mark_in_act_prop(port_id, mapper_params);
287d0eaabd4SVenkat Duvvuru 	if (rc)
288d0eaabd4SVenkat Duvvuru 		return rc;
289d0eaabd4SVenkat Duvvuru 
290d0eaabd4SVenkat Duvvuru 	return 0;
291d0eaabd4SVenkat Duvvuru }
292d0eaabd4SVenkat Duvvuru 
293d0eaabd4SVenkat Duvvuru struct bnxt_ulp_def_param_handler ulp_def_handler_tbl[] = {
294d0eaabd4SVenkat Duvvuru 	[BNXT_ULP_DF_PARAM_TYPE_DEV_PORT_ID] = {
295d0eaabd4SVenkat Duvvuru 			.vfr_func = ulp_df_dev_port_handler }
296d0eaabd4SVenkat Duvvuru };
297d0eaabd4SVenkat Duvvuru 
298d0eaabd4SVenkat Duvvuru /*
299d0eaabd4SVenkat Duvvuru  * Function to create default rules for the following paths
300d0eaabd4SVenkat Duvvuru  * 1) Device PORT to DPDK App
301d0eaabd4SVenkat Duvvuru  * 2) DPDK App to Device PORT
302d0eaabd4SVenkat Duvvuru  * 3) VF Representor to VF
303d0eaabd4SVenkat Duvvuru  * 4) VF to VF Representor
304d0eaabd4SVenkat Duvvuru  *
305d0eaabd4SVenkat Duvvuru  * eth_dev [in] Ptr to rte eth device.
306d0eaabd4SVenkat Duvvuru  * param_list [in] Ptr to a list of parameters (Currently, only DPDK port_id).
307d0eaabd4SVenkat Duvvuru  * ulp_class_tid [in] Class template ID number.
308d0eaabd4SVenkat Duvvuru  * flow_id [out] Ptr to flow identifier.
309d0eaabd4SVenkat Duvvuru  *
310d0eaabd4SVenkat Duvvuru  * Returns 0 on success or negative number on failure.
311d0eaabd4SVenkat Duvvuru  */
312d0eaabd4SVenkat Duvvuru int32_t
313d0eaabd4SVenkat Duvvuru ulp_default_flow_create(struct rte_eth_dev *eth_dev,
314d0eaabd4SVenkat Duvvuru 			struct ulp_tlv_param *param_list,
315d0eaabd4SVenkat Duvvuru 			uint32_t ulp_class_tid,
316d9e70b1dSRandy Schacher 			uint16_t port_id,
317d0eaabd4SVenkat Duvvuru 			uint32_t *flow_id)
318d0eaabd4SVenkat Duvvuru {
319d0eaabd4SVenkat Duvvuru 	struct ulp_rte_hdr_field	hdr_field[BNXT_ULP_PROTO_HDR_MAX];
3201993b267SShahaji Bhosle 	uint64_t			comp_fld[BNXT_ULP_CF_IDX_LAST];
321dd0191d5SShuanglin Wang 	struct bnxt_ulp_mapper_parms mapper_params = { 0 };
322d0eaabd4SVenkat Duvvuru 	struct ulp_rte_act_prop		act_prop;
323d0eaabd4SVenkat Duvvuru 	struct ulp_rte_act_bitmap	act = { 0 };
324d0eaabd4SVenkat Duvvuru 	struct bnxt_ulp_context		*ulp_ctx;
325188bf91dSVenkat Duvvuru 	uint32_t type, ulp_flags = 0, fid;
326032d49efSKishore Padmanabha 	struct bnxt *bp = eth_dev->data->dev_private;
32794dbd6cfSKishore Padmanabha 	uint16_t static_port = 0;
328188bf91dSVenkat Duvvuru 	int rc = 0;
329d0eaabd4SVenkat Duvvuru 
330d0eaabd4SVenkat Duvvuru 	memset(&mapper_params, 0, sizeof(mapper_params));
331d0eaabd4SVenkat Duvvuru 	memset(hdr_field, 0, sizeof(hdr_field));
332d0eaabd4SVenkat Duvvuru 	memset(comp_fld, 0, sizeof(comp_fld));
333d0eaabd4SVenkat Duvvuru 	memset(&act_prop, 0, sizeof(act_prop));
334d0eaabd4SVenkat Duvvuru 
335d0eaabd4SVenkat Duvvuru 	mapper_params.hdr_field = hdr_field;
336dd0191d5SShuanglin Wang 	mapper_params.act_bitmap = &act;
337d0eaabd4SVenkat Duvvuru 	mapper_params.act_prop = &act_prop;
338d0eaabd4SVenkat Duvvuru 	mapper_params.comp_fld = comp_fld;
339188bf91dSVenkat Duvvuru 	mapper_params.class_tid = ulp_class_tid;
340188bf91dSVenkat Duvvuru 	mapper_params.flow_type = BNXT_ULP_FDB_TYPE_DEFAULT;
3411993b267SShahaji Bhosle 	mapper_params.port_id = eth_dev->data->port_id;
342d0eaabd4SVenkat Duvvuru 
343d0eaabd4SVenkat Duvvuru 	ulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(eth_dev);
344d0eaabd4SVenkat Duvvuru 	if (!ulp_ctx) {
345dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR,
3466639a8b6SKishore Padmanabha 			     "ULP is not init'ed. Fail to create dflt flow.\n");
347d0eaabd4SVenkat Duvvuru 		return -EINVAL;
348d0eaabd4SVenkat Duvvuru 	}
349d0eaabd4SVenkat Duvvuru 
3506eb4ccffSKishore Padmanabha 	/* update the vf rep flag */
3516eb4ccffSKishore Padmanabha 	if (bnxt_ulp_cntxt_ptr2_ulp_flags_get(ulp_ctx, &ulp_flags)) {
352dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Error in getting ULP context flags\n");
3536eb4ccffSKishore Padmanabha 		return -EINVAL;
3546eb4ccffSKishore Padmanabha 	}
3556eb4ccffSKishore Padmanabha 	if (ULP_VF_REP_IS_ENABLED(ulp_flags))
3566eb4ccffSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(&mapper_params,
3576eb4ccffSKishore Padmanabha 				    BNXT_ULP_CF_IDX_VFR_MODE, 1);
3586eb4ccffSKishore Padmanabha 
359d0eaabd4SVenkat Duvvuru 	type = param_list->type;
360d0eaabd4SVenkat Duvvuru 	while (type != BNXT_ULP_DF_PARAM_TYPE_LAST) {
361d0eaabd4SVenkat Duvvuru 		if (ulp_def_handler_tbl[type].vfr_func) {
362d0eaabd4SVenkat Duvvuru 			rc = ulp_def_handler_tbl[type].vfr_func(ulp_ctx,
363d0eaabd4SVenkat Duvvuru 								param_list,
364d0eaabd4SVenkat Duvvuru 								&mapper_params);
365d0eaabd4SVenkat Duvvuru 			if (rc) {
366dd0191d5SShuanglin Wang 				BNXT_DRV_DBG(ERR,
367d0eaabd4SVenkat Duvvuru 					    "Failed to create default flow.\n");
368d0eaabd4SVenkat Duvvuru 				return rc;
369d0eaabd4SVenkat Duvvuru 			}
370d0eaabd4SVenkat Duvvuru 		}
371d0eaabd4SVenkat Duvvuru 
372d0eaabd4SVenkat Duvvuru 		param_list++;
373d0eaabd4SVenkat Duvvuru 		type = param_list->type;
374d0eaabd4SVenkat Duvvuru 	}
375d0eaabd4SVenkat Duvvuru 
376188bf91dSVenkat Duvvuru 	/* Get the function id */
377188bf91dSVenkat Duvvuru 	if (ulp_port_db_port_func_id_get(ulp_ctx,
378d9e70b1dSRandy Schacher 					 port_id,
379188bf91dSVenkat Duvvuru 					 &mapper_params.func_id)) {
380dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "conversion of port to func id failed\n");
381188bf91dSVenkat Duvvuru 		goto err1;
382d0eaabd4SVenkat Duvvuru 	}
383d0eaabd4SVenkat Duvvuru 
384d9e70b1dSRandy Schacher 	/* update the VF meta function id  */
385d9e70b1dSRandy Schacher 	ULP_COMP_FLD_IDX_WR(&mapper_params, BNXT_ULP_CF_IDX_VF_META_FID,
386d9e70b1dSRandy Schacher 			    BNXT_ULP_META_VF_FLAG | mapper_params.func_id);
387d9e70b1dSRandy Schacher 
388032d49efSKishore Padmanabha 	/* update the upar id */
389032d49efSKishore Padmanabha 	ulp_l2_custom_tunnel_id_update(bp, &mapper_params);
390032d49efSKishore Padmanabha 
39194dbd6cfSKishore Padmanabha 	/* update the vxlan port */
39294dbd6cfSKishore Padmanabha 	if (ULP_APP_STATIC_VXLAN_PORT_EN(ulp_ctx)) {
39394dbd6cfSKishore Padmanabha 		static_port = bnxt_ulp_cntxt_vxlan_port_get(ulp_ctx);
39494dbd6cfSKishore Padmanabha 		if (static_port) {
39594dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(&mapper_params,
39694dbd6cfSKishore Padmanabha 					    BNXT_ULP_CF_IDX_TUNNEL_PORT,
39794dbd6cfSKishore Padmanabha 					    static_port);
39894dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(mapper_params.cf_bitmap,
39994dbd6cfSKishore Padmanabha 				       BNXT_ULP_CF_BIT_STATIC_VXLAN_PORT);
40094dbd6cfSKishore Padmanabha 		} else {
40194dbd6cfSKishore Padmanabha 			static_port = bnxt_ulp_cntxt_vxlan_ip_port_get(ulp_ctx);
40294dbd6cfSKishore Padmanabha 			ULP_COMP_FLD_IDX_WR(&mapper_params,
40394dbd6cfSKishore Padmanabha 					    BNXT_ULP_CF_IDX_TUNNEL_PORT,
40494dbd6cfSKishore Padmanabha 					    static_port);
40594dbd6cfSKishore Padmanabha 			ULP_BITMAP_SET(mapper_params.cf_bitmap,
40694dbd6cfSKishore Padmanabha 				       BNXT_ULP_CF_BIT_STATIC_VXLAN_IP_PORT);
40794dbd6cfSKishore Padmanabha 		}
40894dbd6cfSKishore Padmanabha 	}
40994dbd6cfSKishore Padmanabha 
410dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(DEBUG, "Creating default flow with template id: %u\n",
411255add67SKishore Padmanabha 		     ulp_class_tid);
412255add67SKishore Padmanabha 
413188bf91dSVenkat Duvvuru 	/* Protect flow creation */
414188bf91dSVenkat Duvvuru 	if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) {
415dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Flow db lock acquire failed\n");
416188bf91dSVenkat Duvvuru 		goto err1;
417188bf91dSVenkat Duvvuru 	}
418188bf91dSVenkat Duvvuru 
419a2417601SKishore Padmanabha 	rc = ulp_flow_db_fid_alloc(ulp_ctx, mapper_params.flow_type,
420188bf91dSVenkat Duvvuru 				   mapper_params.func_id, &fid);
421188bf91dSVenkat Duvvuru 	if (rc) {
422dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Unable to allocate flow table entry\n");
423188bf91dSVenkat Duvvuru 		goto err2;
424188bf91dSVenkat Duvvuru 	}
425188bf91dSVenkat Duvvuru 
426188bf91dSVenkat Duvvuru 	mapper_params.flow_id = fid;
427dd0191d5SShuanglin Wang 	rc = ulp_mapper_flow_create(ulp_ctx, &mapper_params,
428dd0191d5SShuanglin Wang 				    NULL);
429188bf91dSVenkat Duvvuru 	if (rc)
430188bf91dSVenkat Duvvuru 		goto err3;
431188bf91dSVenkat Duvvuru 
432188bf91dSVenkat Duvvuru 	bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
433188bf91dSVenkat Duvvuru 	*flow_id = fid;
434d0eaabd4SVenkat Duvvuru 	return 0;
435188bf91dSVenkat Duvvuru 
436188bf91dSVenkat Duvvuru err3:
437a2417601SKishore Padmanabha 	ulp_flow_db_fid_free(ulp_ctx, mapper_params.flow_type, fid);
438188bf91dSVenkat Duvvuru err2:
439188bf91dSVenkat Duvvuru 	bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
440188bf91dSVenkat Duvvuru err1:
441dd0191d5SShuanglin Wang 	BNXT_DRV_DBG(ERR, "Failed to create default flow.\n");
442188bf91dSVenkat Duvvuru 	return rc;
443d0eaabd4SVenkat Duvvuru }
444d0eaabd4SVenkat Duvvuru 
445d0eaabd4SVenkat Duvvuru /*
446d0eaabd4SVenkat Duvvuru  * Function to destroy default rules for the following paths
447d0eaabd4SVenkat Duvvuru  * 1) Device PORT to DPDK App
448d0eaabd4SVenkat Duvvuru  * 2) DPDK App to Device PORT
449d0eaabd4SVenkat Duvvuru  * 3) VF Representor to VF
450d0eaabd4SVenkat Duvvuru  * 4) VF to VF Representor
451d0eaabd4SVenkat Duvvuru  *
452d0eaabd4SVenkat Duvvuru  * eth_dev [in] Ptr to rte eth device.
453d0eaabd4SVenkat Duvvuru  * flow_id [in] Flow identifier.
454d0eaabd4SVenkat Duvvuru  *
455d0eaabd4SVenkat Duvvuru  * Returns 0 on success or negative number on failure.
456d0eaabd4SVenkat Duvvuru  */
457d0eaabd4SVenkat Duvvuru int32_t
458d0eaabd4SVenkat Duvvuru ulp_default_flow_destroy(struct rte_eth_dev *eth_dev, uint32_t flow_id)
459d0eaabd4SVenkat Duvvuru {
460d0eaabd4SVenkat Duvvuru 	struct bnxt_ulp_context *ulp_ctx;
46109b23f8bSKishore Padmanabha 	int rc = 0;
462d0eaabd4SVenkat Duvvuru 
463d0eaabd4SVenkat Duvvuru 	ulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(eth_dev);
464d0eaabd4SVenkat Duvvuru 	if (!ulp_ctx) {
465dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "ULP context is not initialized\n");
466d0eaabd4SVenkat Duvvuru 		return -EINVAL;
467d0eaabd4SVenkat Duvvuru 	}
468d0eaabd4SVenkat Duvvuru 
46909b23f8bSKishore Padmanabha 	if (!flow_id) {
470dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(DEBUG, "invalid flow id zero\n");
47109b23f8bSKishore Padmanabha 		return rc;
47209b23f8bSKishore Padmanabha 	}
47309b23f8bSKishore Padmanabha 
474188bf91dSVenkat Duvvuru 	if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) {
475dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Flow db lock acquire failed\n");
476188bf91dSVenkat Duvvuru 		return -EINVAL;
477188bf91dSVenkat Duvvuru 	}
47830683082SKishore Padmanabha 	rc = ulp_mapper_flow_destroy(ulp_ctx, BNXT_ULP_FDB_TYPE_DEFAULT,
479dd0191d5SShuanglin Wang 				     flow_id,
480dd0191d5SShuanglin Wang 				     NULL);
481d0eaabd4SVenkat Duvvuru 	if (rc)
482dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to destroy flow.\n");
483188bf91dSVenkat Duvvuru 	bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
484d0eaabd4SVenkat Duvvuru 
485d0eaabd4SVenkat Duvvuru 	return rc;
486d0eaabd4SVenkat Duvvuru }
487769de168SVenkat Duvvuru 
488*d4b36fc5SKishore Padmanabha static void
489*d4b36fc5SKishore Padmanabha bnxt_ulp_destroy_group_rules(struct bnxt *bp, uint16_t port_id)
490*d4b36fc5SKishore Padmanabha {
491*d4b36fc5SKishore Padmanabha 	struct bnxt_ulp_grp_rule_info *info;
492*d4b36fc5SKishore Padmanabha 	struct bnxt_ulp_grp_rule_info *grp_rules;
493*d4b36fc5SKishore Padmanabha 	uint16_t idx;
494*d4b36fc5SKishore Padmanabha 
495*d4b36fc5SKishore Padmanabha 	grp_rules = bp->ulp_ctx->cfg_data->df_rule_info[port_id].grp_df_rule;
496*d4b36fc5SKishore Padmanabha 
497*d4b36fc5SKishore Padmanabha 	for (idx = 0; idx < BNXT_ULP_MAX_GROUP_CNT; idx++) {
498*d4b36fc5SKishore Padmanabha 		info = &grp_rules[idx];
499*d4b36fc5SKishore Padmanabha 		if (!info->valid)
500*d4b36fc5SKishore Padmanabha 			continue;
501*d4b36fc5SKishore Padmanabha 		ulp_default_flow_destroy(bp->eth_dev, info->flow_id);
502*d4b36fc5SKishore Padmanabha 		memset(info, 0, sizeof(struct bnxt_ulp_grp_rule_info));
503*d4b36fc5SKishore Padmanabha 	}
504*d4b36fc5SKishore Padmanabha }
505*d4b36fc5SKishore Padmanabha 
506769de168SVenkat Duvvuru void
507769de168SVenkat Duvvuru bnxt_ulp_destroy_df_rules(struct bnxt *bp, bool global)
508769de168SVenkat Duvvuru {
509769de168SVenkat Duvvuru 	struct bnxt_ulp_df_rule_info *info;
5103d372e8dSShahaji Bhosle 	uint16_t port_id;
511769de168SVenkat Duvvuru 
512769de168SVenkat Duvvuru 	if (!BNXT_TRUFLOW_EN(bp) ||
513c99e1db8SLong Wu 	    rte_eth_dev_is_repr(bp->eth_dev))
514769de168SVenkat Duvvuru 		return;
515769de168SVenkat Duvvuru 
516769de168SVenkat Duvvuru 	if (!bp->ulp_ctx || !bp->ulp_ctx->cfg_data)
517769de168SVenkat Duvvuru 		return;
518769de168SVenkat Duvvuru 
519769de168SVenkat Duvvuru 	/* Delete default rules per port */
520769de168SVenkat Duvvuru 	if (!global) {
521769de168SVenkat Duvvuru 		port_id = bp->eth_dev->data->port_id;
522769de168SVenkat Duvvuru 		info = &bp->ulp_ctx->cfg_data->df_rule_info[port_id];
523769de168SVenkat Duvvuru 		if (!info->valid)
524769de168SVenkat Duvvuru 			return;
525769de168SVenkat Duvvuru 
526*d4b36fc5SKishore Padmanabha 		/* Delete the group default rules */
527*d4b36fc5SKishore Padmanabha 		bnxt_ulp_destroy_group_rules(bp, port_id);
528*d4b36fc5SKishore Padmanabha 
529769de168SVenkat Duvvuru 		ulp_default_flow_destroy(bp->eth_dev,
5303fe124d2SKishore Padmanabha 					 info->def_port_flow_id);
531*d4b36fc5SKishore Padmanabha 		if (info->promisc_flow_id)
532*d4b36fc5SKishore Padmanabha 			ulp_default_flow_destroy(bp->eth_dev,
533*d4b36fc5SKishore Padmanabha 						 info->promisc_flow_id);
53409b23f8bSKishore Padmanabha 		memset(info, 0, sizeof(struct bnxt_ulp_df_rule_info));
535769de168SVenkat Duvvuru 		return;
536769de168SVenkat Duvvuru 	}
537769de168SVenkat Duvvuru 
538769de168SVenkat Duvvuru 	/* Delete default rules for all ports */
539769de168SVenkat Duvvuru 	for (port_id = 0; port_id < RTE_MAX_ETHPORTS; port_id++) {
540769de168SVenkat Duvvuru 		info = &bp->ulp_ctx->cfg_data->df_rule_info[port_id];
541769de168SVenkat Duvvuru 		if (!info->valid)
542769de168SVenkat Duvvuru 			continue;
543769de168SVenkat Duvvuru 
544*d4b36fc5SKishore Padmanabha 		/* Delete the group default rules */
545*d4b36fc5SKishore Padmanabha 		bnxt_ulp_destroy_group_rules(bp, port_id);
546*d4b36fc5SKishore Padmanabha 
547769de168SVenkat Duvvuru 		ulp_default_flow_destroy(bp->eth_dev,
5483fe124d2SKishore Padmanabha 					 info->def_port_flow_id);
549*d4b36fc5SKishore Padmanabha 		if (info->promisc_flow_id)
550*d4b36fc5SKishore Padmanabha 			ulp_default_flow_destroy(bp->eth_dev,
551*d4b36fc5SKishore Padmanabha 						 info->promisc_flow_id);
55209b23f8bSKishore Padmanabha 		memset(info, 0, sizeof(struct bnxt_ulp_df_rule_info));
553769de168SVenkat Duvvuru 	}
554769de168SVenkat Duvvuru }
555769de168SVenkat Duvvuru 
556769de168SVenkat Duvvuru static int32_t
557769de168SVenkat Duvvuru bnxt_create_port_app_df_rule(struct bnxt *bp, uint8_t flow_type,
558769de168SVenkat Duvvuru 			     uint32_t *flow_id)
559769de168SVenkat Duvvuru {
560769de168SVenkat Duvvuru 	uint16_t port_id = bp->eth_dev->data->port_id;
561769de168SVenkat Duvvuru 	struct ulp_tlv_param param_list[] = {
562769de168SVenkat Duvvuru 		{
563769de168SVenkat Duvvuru 			.type = BNXT_ULP_DF_PARAM_TYPE_DEV_PORT_ID,
564769de168SVenkat Duvvuru 			.length = 2,
565769de168SVenkat Duvvuru 			.value = {(port_id >> 8) & 0xff, port_id & 0xff}
566769de168SVenkat Duvvuru 		},
567769de168SVenkat Duvvuru 		{
568769de168SVenkat Duvvuru 			.type = BNXT_ULP_DF_PARAM_TYPE_LAST,
569769de168SVenkat Duvvuru 			.length = 0,
570769de168SVenkat Duvvuru 			.value = {0}
571769de168SVenkat Duvvuru 		}
572769de168SVenkat Duvvuru 	};
573769de168SVenkat Duvvuru 
5743fe124d2SKishore Padmanabha 	if (!flow_type) {
5753fe124d2SKishore Padmanabha 		*flow_id = 0;
5763fe124d2SKishore Padmanabha 		return 0;
5773fe124d2SKishore Padmanabha 	}
578769de168SVenkat Duvvuru 	return ulp_default_flow_create(bp->eth_dev, param_list, flow_type,
579d9e70b1dSRandy Schacher 				       port_id, flow_id);
580769de168SVenkat Duvvuru }
581769de168SVenkat Duvvuru 
582769de168SVenkat Duvvuru int32_t
583769de168SVenkat Duvvuru bnxt_ulp_create_df_rules(struct bnxt *bp)
584769de168SVenkat Duvvuru {
585*d4b36fc5SKishore Padmanabha 	struct rte_eth_dev *dev = bp->eth_dev;
586769de168SVenkat Duvvuru 	struct bnxt_ulp_df_rule_info *info;
5873d372e8dSShahaji Bhosle 	uint16_t port_id;
5883fe124d2SKishore Padmanabha 	int rc = 0;
589769de168SVenkat Duvvuru 
590769de168SVenkat Duvvuru 	if (!BNXT_TRUFLOW_EN(bp) ||
591c99e1db8SLong Wu 	    rte_eth_dev_is_repr(bp->eth_dev) || !bp->ulp_ctx)
592769de168SVenkat Duvvuru 		return 0;
593769de168SVenkat Duvvuru 
594769de168SVenkat Duvvuru 	port_id = bp->eth_dev->data->port_id;
595769de168SVenkat Duvvuru 	info = &bp->ulp_ctx->cfg_data->df_rule_info[port_id];
5963fe124d2SKishore Padmanabha 	rc = bnxt_create_port_app_df_rule(bp,
5973fe124d2SKishore Padmanabha 					  BNXT_ULP_DF_TPL_DEFAULT_UPLINK_PORT,
5983fe124d2SKishore Padmanabha 					  &info->def_port_flow_id);
599769de168SVenkat Duvvuru 	if (rc) {
600dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR,
601769de168SVenkat Duvvuru 			     "Failed to create port to app default rule\n");
602769de168SVenkat Duvvuru 		return rc;
603769de168SVenkat Duvvuru 	}
604769de168SVenkat Duvvuru 
605dd0191d5SShuanglin Wang 	/* If the template already set the bd_action, skip this */
606dd0191d5SShuanglin Wang 	if (!bp->tx_cfa_action) {
607769de168SVenkat Duvvuru 		rc = ulp_default_flow_db_cfa_action_get(bp->ulp_ctx,
6083fe124d2SKishore Padmanabha 							info->def_port_flow_id,
609769de168SVenkat Duvvuru 							&bp->tx_cfa_action);
610dd0191d5SShuanglin Wang 	}
611d9e70b1dSRandy Schacher 
612d9e70b1dSRandy Schacher 	if (rc || BNXT_TESTPMD_EN(bp))
6133fe124d2SKishore Padmanabha 		bp->tx_cfa_action = 0;
614d9e70b1dSRandy Schacher 
615*d4b36fc5SKishore Padmanabha 	/* set or reset the promiscuous rule */
616*d4b36fc5SKishore Padmanabha 	bnxt_ulp_promisc_mode_set(bp, dev->data->promiscuous);
617*d4b36fc5SKishore Padmanabha 
618769de168SVenkat Duvvuru 	info->valid = true;
619769de168SVenkat Duvvuru 	return 0;
620769de168SVenkat Duvvuru }
62109b23f8bSKishore Padmanabha 
62209b23f8bSKishore Padmanabha static int32_t
62309b23f8bSKishore Padmanabha bnxt_create_port_vfr_default_rule(struct bnxt *bp,
62409b23f8bSKishore Padmanabha 				  uint8_t flow_type,
62509b23f8bSKishore Padmanabha 				  uint16_t vfr_port_id,
62609b23f8bSKishore Padmanabha 				  uint32_t *flow_id)
62709b23f8bSKishore Padmanabha {
62809b23f8bSKishore Padmanabha 	struct ulp_tlv_param param_list[] = {
62909b23f8bSKishore Padmanabha 		{
63009b23f8bSKishore Padmanabha 			.type = BNXT_ULP_DF_PARAM_TYPE_DEV_PORT_ID,
63109b23f8bSKishore Padmanabha 			.length = 2,
63209b23f8bSKishore Padmanabha 			.value = {(vfr_port_id >> 8) & 0xff, vfr_port_id & 0xff}
63309b23f8bSKishore Padmanabha 		},
63409b23f8bSKishore Padmanabha 		{
63509b23f8bSKishore Padmanabha 			.type = BNXT_ULP_DF_PARAM_TYPE_LAST,
63609b23f8bSKishore Padmanabha 			.length = 0,
63709b23f8bSKishore Padmanabha 			.value = {0}
63809b23f8bSKishore Padmanabha 		}
63909b23f8bSKishore Padmanabha 	};
64009b23f8bSKishore Padmanabha 	return ulp_default_flow_create(bp->eth_dev, param_list, flow_type,
641d9e70b1dSRandy Schacher 				       vfr_port_id,
64209b23f8bSKishore Padmanabha 				       flow_id);
64309b23f8bSKishore Padmanabha }
64409b23f8bSKishore Padmanabha 
64509b23f8bSKishore Padmanabha int32_t
64609b23f8bSKishore Padmanabha bnxt_ulp_create_vfr_default_rules(struct rte_eth_dev *vfr_ethdev)
64709b23f8bSKishore Padmanabha {
64809b23f8bSKishore Padmanabha 	struct bnxt_ulp_vfr_rule_info *info;
649ce9875d7SSomnath Kotur 	struct bnxt_representor *vfr = vfr_ethdev->data->dev_private;
65009b23f8bSKishore Padmanabha 	struct rte_eth_dev *parent_dev = vfr->parent_dev;
65109b23f8bSKishore Padmanabha 	struct bnxt *bp = parent_dev->data->dev_private;
65209b23f8bSKishore Padmanabha 	uint16_t vfr_port_id = vfr_ethdev->data->port_id;
6533d372e8dSShahaji Bhosle 	uint16_t port_id;
65409b23f8bSKishore Padmanabha 	int rc;
65509b23f8bSKishore Padmanabha 
65609b23f8bSKishore Padmanabha 	if (!bp || !BNXT_TRUFLOW_EN(bp))
65709b23f8bSKishore Padmanabha 		return 0;
65809b23f8bSKishore Padmanabha 
65909b23f8bSKishore Padmanabha 	port_id = vfr_ethdev->data->port_id;
66009b23f8bSKishore Padmanabha 	info = bnxt_ulp_cntxt_ptr2_ulp_vfr_info_get(bp->ulp_ctx, port_id);
66109b23f8bSKishore Padmanabha 
66209b23f8bSKishore Padmanabha 	if (!info) {
663dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to get vfr ulp context\n");
66409b23f8bSKishore Padmanabha 		return -EINVAL;
66509b23f8bSKishore Padmanabha 	}
66609b23f8bSKishore Padmanabha 
66709b23f8bSKishore Padmanabha 	if (info->valid) {
668dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "VFR already allocated\n");
66909b23f8bSKishore Padmanabha 		return -EINVAL;
67009b23f8bSKishore Padmanabha 	}
67109b23f8bSKishore Padmanabha 
67209b23f8bSKishore Padmanabha 	memset(info, 0, sizeof(struct bnxt_ulp_vfr_rule_info));
6733fe124d2SKishore Padmanabha 	rc = bnxt_create_port_vfr_default_rule(bp, BNXT_ULP_DF_TPL_DEFAULT_VFR,
67409b23f8bSKishore Padmanabha 					       vfr_port_id,
6753fe124d2SKishore Padmanabha 					       &info->vfr_flow_id);
67609b23f8bSKishore Padmanabha 	if (rc) {
677dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to create VFR default rule\n");
67809b23f8bSKishore Padmanabha 		goto error;
67909b23f8bSKishore Padmanabha 	}
680dd0191d5SShuanglin Wang 
681dd0191d5SShuanglin Wang 	/* If the template already set the bd action, skip this */
682dd0191d5SShuanglin Wang 	if (!vfr->vfr_tx_cfa_action) {
68309b23f8bSKishore Padmanabha 		rc = ulp_default_flow_db_cfa_action_get(bp->ulp_ctx,
6843fe124d2SKishore Padmanabha 							info->vfr_flow_id,
68509b23f8bSKishore Padmanabha 							&vfr->vfr_tx_cfa_action);
68609b23f8bSKishore Padmanabha 		if (rc) {
687dd0191d5SShuanglin Wang 			BNXT_DRV_DBG(ERR, "Failed to get the tx cfa action\n");
68809b23f8bSKishore Padmanabha 			goto error;
68909b23f8bSKishore Padmanabha 		}
690dd0191d5SShuanglin Wang 	}
69109b23f8bSKishore Padmanabha 
69209b23f8bSKishore Padmanabha 	/* Update the other details */
69309b23f8bSKishore Padmanabha 	info->valid = true;
69409b23f8bSKishore Padmanabha 	info->parent_port_id =  bp->eth_dev->data->port_id;
69509b23f8bSKishore Padmanabha 	return 0;
69609b23f8bSKishore Padmanabha 
69709b23f8bSKishore Padmanabha error:
6983fe124d2SKishore Padmanabha 	if (info->vfr_flow_id)
6993fe124d2SKishore Padmanabha 		ulp_default_flow_destroy(bp->eth_dev, info->vfr_flow_id);
70009b23f8bSKishore Padmanabha 	return rc;
70109b23f8bSKishore Padmanabha }
70209b23f8bSKishore Padmanabha 
70309b23f8bSKishore Padmanabha int32_t
704ce9875d7SSomnath Kotur bnxt_ulp_delete_vfr_default_rules(struct bnxt_representor *vfr)
70509b23f8bSKishore Padmanabha {
70609b23f8bSKishore Padmanabha 	struct bnxt_ulp_vfr_rule_info *info;
70709b23f8bSKishore Padmanabha 	struct rte_eth_dev *parent_dev = vfr->parent_dev;
70809b23f8bSKishore Padmanabha 	struct bnxt *bp = parent_dev->data->dev_private;
70909b23f8bSKishore Padmanabha 
71009b23f8bSKishore Padmanabha 	if (!bp || !BNXT_TRUFLOW_EN(bp))
71109b23f8bSKishore Padmanabha 		return 0;
71209b23f8bSKishore Padmanabha 	info = bnxt_ulp_cntxt_ptr2_ulp_vfr_info_get(bp->ulp_ctx,
71309b23f8bSKishore Padmanabha 						    vfr->dpdk_port_id);
71409b23f8bSKishore Padmanabha 	if (!info) {
715dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "Failed to get vfr ulp context\n");
71609b23f8bSKishore Padmanabha 		return -EINVAL;
71709b23f8bSKishore Padmanabha 	}
71809b23f8bSKishore Padmanabha 
71909b23f8bSKishore Padmanabha 	if (!info->valid) {
720dd0191d5SShuanglin Wang 		BNXT_DRV_DBG(ERR, "VFR already freed\n");
72109b23f8bSKishore Padmanabha 		return -EINVAL;
72209b23f8bSKishore Padmanabha 	}
7233fe124d2SKishore Padmanabha 	ulp_default_flow_destroy(bp->eth_dev, info->vfr_flow_id);
72409b23f8bSKishore Padmanabha 	vfr->vfr_tx_cfa_action = 0;
72509b23f8bSKishore Padmanabha 	memset(info, 0, sizeof(struct bnxt_ulp_vfr_rule_info));
72609b23f8bSKishore Padmanabha 	return 0;
72709b23f8bSKishore Padmanabha }
728032d49efSKishore Padmanabha 
729032d49efSKishore Padmanabha static void
730032d49efSKishore Padmanabha ulp_l2_custom_tunnel_id_update(struct bnxt *bp,
731dd0191d5SShuanglin Wang 			       struct bnxt_ulp_mapper_parms *params)
732032d49efSKishore Padmanabha {
733032d49efSKishore Padmanabha 	if (!bp->l2_etype_tunnel_cnt)
734032d49efSKishore Padmanabha 		return;
735032d49efSKishore Padmanabha 
736032d49efSKishore Padmanabha 	if (bp->l2_etype_upar_in_use &
737032d49efSKishore Padmanabha 	    HWRM_TUNNEL_DST_PORT_QUERY_OUTPUT_UPAR_IN_USE_UPAR0) {
738032d49efSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L2_CUSTOM_UPAR_ID,
739032d49efSKishore Padmanabha 				    ULP_WP_SYM_TUN_HDR_TYPE_UPAR1);
740032d49efSKishore Padmanabha 	} else if (bp->l2_etype_upar_in_use &
741032d49efSKishore Padmanabha 		   HWRM_TUNNEL_DST_PORT_QUERY_OUTPUT_UPAR_IN_USE_UPAR1) {
742032d49efSKishore Padmanabha 		ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L2_CUSTOM_UPAR_ID,
743032d49efSKishore Padmanabha 				    ULP_WP_SYM_TUN_HDR_TYPE_UPAR2);
744032d49efSKishore Padmanabha 	}
745032d49efSKishore Padmanabha }
746*d4b36fc5SKishore Padmanabha 
747*d4b36fc5SKishore Padmanabha /*
748*d4b36fc5SKishore Padmanabha  * Function to execute a specific template, this does not create flow id
749*d4b36fc5SKishore Padmanabha  *
750*d4b36fc5SKishore Padmanabha  * bp [in] Ptr to bnxt
751*d4b36fc5SKishore Padmanabha  * param_list [in] Ptr to a list of parameters (Currently, only DPDK port_id).
752*d4b36fc5SKishore Padmanabha  * ulp_class_tid [in] Class template ID number.
753*d4b36fc5SKishore Padmanabha  *
754*d4b36fc5SKishore Padmanabha  * Returns 0 on success or negative number on failure.
755*d4b36fc5SKishore Padmanabha  */
756*d4b36fc5SKishore Padmanabha static int32_t
757*d4b36fc5SKishore Padmanabha ulp_flow_template_process(struct bnxt *bp,
758*d4b36fc5SKishore Padmanabha 			  struct ulp_tlv_param *param_list,
759*d4b36fc5SKishore Padmanabha 			  uint32_t ulp_class_tid,
760*d4b36fc5SKishore Padmanabha 			  uint16_t port_id,
761*d4b36fc5SKishore Padmanabha 			  uint32_t flow_id)
762*d4b36fc5SKishore Padmanabha {
763*d4b36fc5SKishore Padmanabha 	struct ulp_rte_hdr_field	hdr_field[BNXT_ULP_PROTO_HDR_MAX];
764*d4b36fc5SKishore Padmanabha 	uint64_t			comp_fld[BNXT_ULP_CF_IDX_LAST];
765*d4b36fc5SKishore Padmanabha 	struct bnxt_ulp_mapper_parms mapper_params = { 0 };
766*d4b36fc5SKishore Padmanabha 	struct ulp_rte_act_prop		act_prop;
767*d4b36fc5SKishore Padmanabha 	struct ulp_rte_act_bitmap	act = { 0 };
768*d4b36fc5SKishore Padmanabha 	struct bnxt_ulp_context		*ulp_ctx;
769*d4b36fc5SKishore Padmanabha 	uint32_t type;
770*d4b36fc5SKishore Padmanabha 	int rc = 0;
771*d4b36fc5SKishore Padmanabha 
772*d4b36fc5SKishore Padmanabha 	memset(&mapper_params, 0, sizeof(mapper_params));
773*d4b36fc5SKishore Padmanabha 	memset(hdr_field, 0, sizeof(hdr_field));
774*d4b36fc5SKishore Padmanabha 	memset(comp_fld, 0, sizeof(comp_fld));
775*d4b36fc5SKishore Padmanabha 	memset(&act_prop, 0, sizeof(act_prop));
776*d4b36fc5SKishore Padmanabha 
777*d4b36fc5SKishore Padmanabha 	mapper_params.hdr_field = hdr_field;
778*d4b36fc5SKishore Padmanabha 	mapper_params.act_bitmap = &act;
779*d4b36fc5SKishore Padmanabha 	mapper_params.act_prop = &act_prop;
780*d4b36fc5SKishore Padmanabha 	mapper_params.comp_fld = comp_fld;
781*d4b36fc5SKishore Padmanabha 	mapper_params.class_tid = ulp_class_tid;
782*d4b36fc5SKishore Padmanabha 	mapper_params.port_id = port_id;
783*d4b36fc5SKishore Padmanabha 
784*d4b36fc5SKishore Padmanabha 	ulp_ctx = bp->ulp_ctx;
785*d4b36fc5SKishore Padmanabha 	if (!ulp_ctx) {
786*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(ERR,
787*d4b36fc5SKishore Padmanabha 			     "ULP is not init'ed. Fail to create dflt flow.\n");
788*d4b36fc5SKishore Padmanabha 		return -EINVAL;
789*d4b36fc5SKishore Padmanabha 	}
790*d4b36fc5SKishore Padmanabha 
791*d4b36fc5SKishore Padmanabha 	type = param_list->type;
792*d4b36fc5SKishore Padmanabha 	while (type != BNXT_ULP_DF_PARAM_TYPE_LAST) {
793*d4b36fc5SKishore Padmanabha 		if (ulp_def_handler_tbl[type].vfr_func) {
794*d4b36fc5SKishore Padmanabha 			rc = ulp_def_handler_tbl[type].vfr_func(ulp_ctx,
795*d4b36fc5SKishore Padmanabha 								param_list,
796*d4b36fc5SKishore Padmanabha 								&mapper_params);
797*d4b36fc5SKishore Padmanabha 			if (rc) {
798*d4b36fc5SKishore Padmanabha 				BNXT_DRV_DBG(ERR,
799*d4b36fc5SKishore Padmanabha 					     "Failed to create default flow\n");
800*d4b36fc5SKishore Padmanabha 				return rc;
801*d4b36fc5SKishore Padmanabha 			}
802*d4b36fc5SKishore Padmanabha 		}
803*d4b36fc5SKishore Padmanabha 
804*d4b36fc5SKishore Padmanabha 		param_list++;
805*d4b36fc5SKishore Padmanabha 		type = param_list->type;
806*d4b36fc5SKishore Padmanabha 	}
807*d4b36fc5SKishore Padmanabha 	/* Protect flow creation */
808*d4b36fc5SKishore Padmanabha 	if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) {
809*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(ERR, "Flow db lock acquire failed\n");
810*d4b36fc5SKishore Padmanabha 		return -EINVAL;
811*d4b36fc5SKishore Padmanabha 	}
812*d4b36fc5SKishore Padmanabha 
813*d4b36fc5SKishore Padmanabha 	mapper_params.flow_id = flow_id;
814*d4b36fc5SKishore Padmanabha 	rc = ulp_mapper_flow_create(ulp_ctx, &mapper_params,
815*d4b36fc5SKishore Padmanabha 				    NULL);
816*d4b36fc5SKishore Padmanabha 	bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
817*d4b36fc5SKishore Padmanabha 	return rc;
818*d4b36fc5SKishore Padmanabha }
819*d4b36fc5SKishore Padmanabha 
820*d4b36fc5SKishore Padmanabha int32_t
821*d4b36fc5SKishore Padmanabha bnxt_ulp_promisc_mode_set(struct bnxt *bp, uint8_t enable)
822*d4b36fc5SKishore Padmanabha {
823*d4b36fc5SKishore Padmanabha 	uint32_t flow_type;
824*d4b36fc5SKishore Padmanabha 	struct bnxt_ulp_df_rule_info *info;
825*d4b36fc5SKishore Padmanabha 	uint16_t port_id;
826*d4b36fc5SKishore Padmanabha 	int rc = 0;
827*d4b36fc5SKishore Padmanabha 
828*d4b36fc5SKishore Padmanabha 	if (!BNXT_TRUFLOW_EN(bp) || BNXT_ETH_DEV_IS_REPRESENTOR(bp->eth_dev) ||
829*d4b36fc5SKishore Padmanabha 	    !bp->ulp_ctx)
830*d4b36fc5SKishore Padmanabha 		return rc;
831*d4b36fc5SKishore Padmanabha 
832*d4b36fc5SKishore Padmanabha 	if (!BNXT_CHIP_P5(bp))
833*d4b36fc5SKishore Padmanabha 		return rc;
834*d4b36fc5SKishore Padmanabha 
835*d4b36fc5SKishore Padmanabha 	port_id = bp->eth_dev->data->port_id;
836*d4b36fc5SKishore Padmanabha 	info = &bp->ulp_ctx->cfg_data->df_rule_info[port_id];
837*d4b36fc5SKishore Padmanabha 
838*d4b36fc5SKishore Padmanabha 	/* create the promiscuous rule */
839*d4b36fc5SKishore Padmanabha 	if (enable && !info->promisc_flow_id) {
840*d4b36fc5SKishore Padmanabha 		flow_type = BNXT_ULP_TEMPLATE_PROMISCUOUS_ENABLE;
841*d4b36fc5SKishore Padmanabha 		rc = bnxt_create_port_app_df_rule(bp, flow_type,
842*d4b36fc5SKishore Padmanabha 						  &info->promisc_flow_id);
843*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(DEBUG, "enable ulp promisc mode on port %u:%u\n",
844*d4b36fc5SKishore Padmanabha 			     port_id, info->promisc_flow_id);
845*d4b36fc5SKishore Padmanabha 	} else if (!enable && info->promisc_flow_id) {
846*d4b36fc5SKishore Padmanabha 		struct ulp_tlv_param param_list[] = {
847*d4b36fc5SKishore Padmanabha 			{
848*d4b36fc5SKishore Padmanabha 				.type = BNXT_ULP_DF_PARAM_TYPE_DEV_PORT_ID,
849*d4b36fc5SKishore Padmanabha 				.length = 2,
850*d4b36fc5SKishore Padmanabha 				.value = {(port_id >> 8) & 0xff, port_id & 0xff}
851*d4b36fc5SKishore Padmanabha 			},
852*d4b36fc5SKishore Padmanabha 			{
853*d4b36fc5SKishore Padmanabha 				.type = BNXT_ULP_DF_PARAM_TYPE_LAST,
854*d4b36fc5SKishore Padmanabha 				.length = 0,
855*d4b36fc5SKishore Padmanabha 				.value = {0}
856*d4b36fc5SKishore Padmanabha 			}
857*d4b36fc5SKishore Padmanabha 		};
858*d4b36fc5SKishore Padmanabha 
859*d4b36fc5SKishore Padmanabha 		flow_type = BNXT_ULP_TEMPLATE_PROMISCUOUS_DISABLE;
860*d4b36fc5SKishore Padmanabha 		if (ulp_flow_template_process(bp, param_list, flow_type,
861*d4b36fc5SKishore Padmanabha 					      port_id, 0))
862*d4b36fc5SKishore Padmanabha 			return -EIO;
863*d4b36fc5SKishore Padmanabha 
864*d4b36fc5SKishore Padmanabha 		rc = ulp_default_flow_destroy(bp->eth_dev,
865*d4b36fc5SKishore Padmanabha 					      info->promisc_flow_id);
866*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(DEBUG, "disable ulp promisc mode on port %u:%u\n",
867*d4b36fc5SKishore Padmanabha 			     port_id, info->promisc_flow_id);
868*d4b36fc5SKishore Padmanabha 		info->promisc_flow_id = 0;
869*d4b36fc5SKishore Padmanabha 	}
870*d4b36fc5SKishore Padmanabha 	return rc;
871*d4b36fc5SKishore Padmanabha }
872*d4b36fc5SKishore Padmanabha 
873*d4b36fc5SKishore Padmanabha /* Function to create the rte flow for miss action. */
874*d4b36fc5SKishore Padmanabha int32_t
875*d4b36fc5SKishore Padmanabha bnxt_ulp_grp_miss_act_set(struct rte_eth_dev *dev,
876*d4b36fc5SKishore Padmanabha 			  const struct rte_flow_attr *attr,
877*d4b36fc5SKishore Padmanabha 			  const struct rte_flow_action actions[],
878*d4b36fc5SKishore Padmanabha 			  uint32_t *flow_id)
879*d4b36fc5SKishore Padmanabha {
880*d4b36fc5SKishore Padmanabha 	struct bnxt_ulp_mapper_parms mparms = { 0 };
881*d4b36fc5SKishore Padmanabha 	struct ulp_rte_parser_params params;
882*d4b36fc5SKishore Padmanabha 	struct bnxt_ulp_context *ulp_ctx;
883*d4b36fc5SKishore Padmanabha 	int ret = BNXT_TF_RC_ERROR;
884*d4b36fc5SKishore Padmanabha 	uint16_t func_id;
885*d4b36fc5SKishore Padmanabha 	uint32_t fid;
886*d4b36fc5SKishore Padmanabha 	uint32_t group_id;
887*d4b36fc5SKishore Padmanabha 
888*d4b36fc5SKishore Padmanabha 	ulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(dev);
889*d4b36fc5SKishore Padmanabha 	if (unlikely(!ulp_ctx)) {
890*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(ERR, "ULP context is not initialized\n");
891*d4b36fc5SKishore Padmanabha 		goto flow_error;
892*d4b36fc5SKishore Padmanabha 	}
893*d4b36fc5SKishore Padmanabha 
894*d4b36fc5SKishore Padmanabha 	/* Initialize the parser params */
895*d4b36fc5SKishore Padmanabha 	memset(&params, 0, sizeof(struct ulp_rte_parser_params));
896*d4b36fc5SKishore Padmanabha 	params.ulp_ctx = ulp_ctx;
897*d4b36fc5SKishore Padmanabha 	params.port_id = dev->data->port_id;
898*d4b36fc5SKishore Padmanabha 	/* classid is the group action template*/
899*d4b36fc5SKishore Padmanabha 	params.class_id = BNXT_ULP_TEMPLATE_GROUP_MISS_ACTION;
900*d4b36fc5SKishore Padmanabha 
901*d4b36fc5SKishore Padmanabha 	if (unlikely(bnxt_ulp_cntxt_app_id_get(params.ulp_ctx, &params.app_id))) {
902*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(ERR, "failed to get the app id\n");
903*d4b36fc5SKishore Padmanabha 		goto flow_error;
904*d4b36fc5SKishore Padmanabha 	}
905*d4b36fc5SKishore Padmanabha 
906*d4b36fc5SKishore Padmanabha 	/* Set the flow attributes */
907*d4b36fc5SKishore Padmanabha 	bnxt_ulp_set_dir_attributes(&params, attr);
908*d4b36fc5SKishore Padmanabha 
909*d4b36fc5SKishore Padmanabha 	if (unlikely(bnxt_ulp_set_prio_attribute(&params, attr)))
910*d4b36fc5SKishore Padmanabha 		goto flow_error;
911*d4b36fc5SKishore Padmanabha 
912*d4b36fc5SKishore Padmanabha 	bnxt_ulp_init_parser_cf_defaults(&params, params.port_id);
913*d4b36fc5SKishore Padmanabha 
914*d4b36fc5SKishore Padmanabha 	/* Get the function id */
915*d4b36fc5SKishore Padmanabha 	if (unlikely(ulp_port_db_port_func_id_get(ulp_ctx,
916*d4b36fc5SKishore Padmanabha 						  params.port_id,
917*d4b36fc5SKishore Padmanabha 						  &func_id))) {
918*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(ERR, "conversion of port to func id failed\n");
919*d4b36fc5SKishore Padmanabha 		goto flow_error;
920*d4b36fc5SKishore Padmanabha 	}
921*d4b36fc5SKishore Padmanabha 
922*d4b36fc5SKishore Padmanabha 	/* Protect flow creation */
923*d4b36fc5SKishore Padmanabha 	if (unlikely(bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx))) {
924*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(ERR, "Flow db lock acquire failed\n");
925*d4b36fc5SKishore Padmanabha 		goto flow_error;
926*d4b36fc5SKishore Padmanabha 	}
927*d4b36fc5SKishore Padmanabha 
928*d4b36fc5SKishore Padmanabha 	/* Allocate a Flow ID for attaching all resources for the flow to.
929*d4b36fc5SKishore Padmanabha 	 * Once allocated, all errors have to walk the list of resources and
930*d4b36fc5SKishore Padmanabha 	 * free each of them.
931*d4b36fc5SKishore Padmanabha 	 */
932*d4b36fc5SKishore Padmanabha 	ret = ulp_flow_db_fid_alloc(ulp_ctx, BNXT_ULP_FDB_TYPE_DEFAULT,
933*d4b36fc5SKishore Padmanabha 				   func_id, &fid);
934*d4b36fc5SKishore Padmanabha 	if (unlikely(ret)) {
935*d4b36fc5SKishore Padmanabha 		BNXT_DRV_DBG(ERR, "Unable to allocate flow table entry\n");
936*d4b36fc5SKishore Padmanabha 		goto release_lock;
937*d4b36fc5SKishore Padmanabha 	}
938*d4b36fc5SKishore Padmanabha 
939*d4b36fc5SKishore Padmanabha 	/* Update the implied SVIF */
940*d4b36fc5SKishore Padmanabha 	ulp_rte_parser_implicit_match_port_process(&params);
941*d4b36fc5SKishore Padmanabha 
942*d4b36fc5SKishore Padmanabha 	/* Parse the rte flow action */
943*d4b36fc5SKishore Padmanabha 	ret = bnxt_ulp_rte_parser_act_parse(actions, &params);
944*d4b36fc5SKishore Padmanabha 	if (unlikely(ret != BNXT_TF_RC_SUCCESS))
945*d4b36fc5SKishore Padmanabha 		goto free_fid;
946*d4b36fc5SKishore Padmanabha 
947*d4b36fc5SKishore Padmanabha 	/* Verify the jump target group id */
948*d4b36fc5SKishore Padmanabha 	if (ULP_BITMAP_ISSET(params.act_bitmap.bits, BNXT_ULP_ACT_BIT_JUMP)) {
949*d4b36fc5SKishore Padmanabha 		memcpy(&group_id,
950*d4b36fc5SKishore Padmanabha 		       &params.act_prop.act_details[BNXT_ULP_ACT_PROP_IDX_JUMP],
951*d4b36fc5SKishore Padmanabha 		       BNXT_ULP_ACT_PROP_SZ_JUMP);
952*d4b36fc5SKishore Padmanabha 		if (rte_cpu_to_be_32(group_id) == attr->group) {
953*d4b36fc5SKishore Padmanabha 			BNXT_DRV_DBG(ERR, "Jump action cannot jump to its own group.\n");
954*d4b36fc5SKishore Padmanabha 			ret = BNXT_TF_RC_ERROR;
955*d4b36fc5SKishore Padmanabha 			goto free_fid;
956*d4b36fc5SKishore Padmanabha 		}
957*d4b36fc5SKishore Padmanabha 	}
958*d4b36fc5SKishore Padmanabha 
959*d4b36fc5SKishore Padmanabha 	mparms.flow_id = fid;
960*d4b36fc5SKishore Padmanabha 	mparms.func_id = func_id;
961*d4b36fc5SKishore Padmanabha 	mparms.port_id = params.port_id;
962*d4b36fc5SKishore Padmanabha 
963*d4b36fc5SKishore Padmanabha 	/* Perform the rte flow post process */
964*d4b36fc5SKishore Padmanabha 	bnxt_ulp_rte_parser_post_process(&params);
965*d4b36fc5SKishore Padmanabha 
966*d4b36fc5SKishore Padmanabha #ifdef	RTE_LIBRTE_BNXT_TRUFLOW_DEBUG
967*d4b36fc5SKishore Padmanabha #ifdef	RTE_LIBRTE_BNXT_TRUFLOW_DEBUG_PARSER
968*d4b36fc5SKishore Padmanabha 	/* Dump the rte flow action */
969*d4b36fc5SKishore Padmanabha 	ulp_parser_act_info_dump(&params);
970*d4b36fc5SKishore Padmanabha #endif
971*d4b36fc5SKishore Padmanabha #endif
972*d4b36fc5SKishore Padmanabha 
973*d4b36fc5SKishore Padmanabha 	ret = ulp_matcher_action_match(&params, &params.act_tmpl);
974*d4b36fc5SKishore Padmanabha 	if (unlikely(ret != BNXT_TF_RC_SUCCESS))
975*d4b36fc5SKishore Padmanabha 		goto free_fid;
976*d4b36fc5SKishore Padmanabha 
977*d4b36fc5SKishore Padmanabha 	bnxt_ulp_init_mapper_params(&mparms, &params,
978*d4b36fc5SKishore Padmanabha 				    BNXT_ULP_FDB_TYPE_DEFAULT);
979*d4b36fc5SKishore Padmanabha 	/* Call the ulp mapper to create the flow in the hardware. */
980*d4b36fc5SKishore Padmanabha 	ret = ulp_mapper_flow_create(ulp_ctx, &mparms, NULL);
981*d4b36fc5SKishore Padmanabha 	if (unlikely(ret))
982*d4b36fc5SKishore Padmanabha 		goto free_fid;
983*d4b36fc5SKishore Padmanabha 
984*d4b36fc5SKishore Padmanabha 	bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
985*d4b36fc5SKishore Padmanabha 
986*d4b36fc5SKishore Padmanabha 	*flow_id = fid;
987*d4b36fc5SKishore Padmanabha 	return 0;
988*d4b36fc5SKishore Padmanabha 
989*d4b36fc5SKishore Padmanabha free_fid:
990*d4b36fc5SKishore Padmanabha 	ulp_flow_db_fid_free(ulp_ctx, BNXT_ULP_FDB_TYPE_DEFAULT, fid);
991*d4b36fc5SKishore Padmanabha release_lock:
992*d4b36fc5SKishore Padmanabha 	bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
993*d4b36fc5SKishore Padmanabha flow_error:
994*d4b36fc5SKishore Padmanabha 	return ret;
995*d4b36fc5SKishore Padmanabha }
996