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(¶ms, 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, ¶ms.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(¶ms, attr); 908*d4b36fc5SKishore Padmanabha 909*d4b36fc5SKishore Padmanabha if (unlikely(bnxt_ulp_set_prio_attribute(¶ms, attr))) 910*d4b36fc5SKishore Padmanabha goto flow_error; 911*d4b36fc5SKishore Padmanabha 912*d4b36fc5SKishore Padmanabha bnxt_ulp_init_parser_cf_defaults(¶ms, 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(¶ms); 941*d4b36fc5SKishore Padmanabha 942*d4b36fc5SKishore Padmanabha /* Parse the rte flow action */ 943*d4b36fc5SKishore Padmanabha ret = bnxt_ulp_rte_parser_act_parse(actions, ¶ms); 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 ¶ms.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(¶ms); 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(¶ms); 970*d4b36fc5SKishore Padmanabha #endif 971*d4b36fc5SKishore Padmanabha #endif 972*d4b36fc5SKishore Padmanabha 973*d4b36fc5SKishore Padmanabha ret = ulp_matcher_action_match(¶ms, ¶ms.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, ¶ms, 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