@@ -1927,6 +1927,11 @@ bnxt_ulp_port_init(struct bnxt *bp)
}
}
+ /* setup the l2 etype tunnel for custom l2 encap/decap */
+ rc = ulp_l2_etype_tunnel_alloc(bp);
+ if (rc)
+ goto jump_to_error;
+
/* Update bnxt driver flags */
rc = ulp_dparms_dev_port_intf_update(bp, bp->ulp_ctx);
if (rc) {
@@ -606,6 +606,38 @@ bnxt_ulp_action_handle_create(struct rte_eth_dev *dev,
BNXT_ULP_DIR_EGRESS);
}
+ /* perform the conversion from dpdk port to bnxt ifindex */
+ if (ulp_port_db_dev_port_to_ulp_index(ulp_ctx,
+ dev->data->port_id,
+ &ifindex)) {
+ BNXT_TF_DBG(ERR, "Port id is not valid\n");
+ goto parse_error;
+ }
+ port_type = ulp_port_db_port_type_get(ulp_ctx, ifindex);
+ if (port_type == BNXT_ULP_INTF_TYPE_INVALID) {
+ BNXT_TF_DBG(ERR, "Port type is not valid\n");
+ goto parse_error;
+ }
+
+ bnxt_ulp_init_parser_cf_defaults(¶ms, dev->data->port_id);
+
+ /* Emulating the match port for direction processing */
+ ULP_COMP_FLD_IDX_WR(¶ms, BNXT_ULP_CF_IDX_MATCH_PORT_TYPE,
+ port_type);
+
+ if ((params.dir_attr & BNXT_ULP_FLOW_ATTR_INGRESS) &&
+ port_type == BNXT_ULP_INTF_TYPE_VF_REP) {
+ ULP_COMP_FLD_IDX_WR(¶ms, BNXT_ULP_CF_IDX_DIRECTION,
+ BNXT_ULP_DIR_EGRESS);
+ } else {
+ /* Assign the input direction */
+ if (params.dir_attr & BNXT_ULP_FLOW_ATTR_INGRESS)
+ ULP_COMP_FLD_IDX_WR(¶ms, BNXT_ULP_CF_IDX_DIRECTION,
+ BNXT_ULP_DIR_INGRESS);
+ else
+ ULP_COMP_FLD_IDX_WR(¶ms, BNXT_ULP_CF_IDX_DIRECTION,
+ BNXT_ULP_DIR_EGRESS);
+ }
/* Parse the shared action */
ret = bnxt_ulp_rte_parser_act_parse(actions, ¶ms);
if (ret != BNXT_TF_RC_SUCCESS)
@@ -12,6 +12,10 @@
#include "ulp_flow_db.h"
#include "ulp_mapper.h"
+static void
+ulp_l2_custom_tunnel_id_update(struct bnxt *bp,
+ struct bnxt_ulp_mapper_create_parms *params);
+
struct bnxt_ulp_def_param_handler {
int32_t (*vfr_func)(struct bnxt_ulp_context *ulp_ctx,
struct ulp_tlv_param *param,
@@ -306,6 +310,7 @@ ulp_default_flow_create(struct rte_eth_dev *eth_dev,
struct ulp_rte_act_bitmap act = { 0 };
struct bnxt_ulp_context *ulp_ctx;
uint32_t type, ulp_flags = 0, fid;
+ struct bnxt *bp = eth_dev->data->dev_private;
int rc = 0;
memset(&mapper_params, 0, sizeof(mapper_params));
@@ -366,6 +371,9 @@ ulp_default_flow_create(struct rte_eth_dev *eth_dev,
ULP_COMP_FLD_IDX_WR(&mapper_params, BNXT_ULP_CF_IDX_VF_META_FID,
BNXT_ULP_META_VF_FLAG | mapper_params.func_id);
+ /* update the upar id */
+ ulp_l2_custom_tunnel_id_update(bp, &mapper_params);
+
BNXT_TF_DBG(DEBUG, "Creating default flow with template id: %u\n",
ulp_class_tid);
@@ -641,3 +649,21 @@ bnxt_ulp_delete_vfr_default_rules(struct bnxt_representor *vfr)
memset(info, 0, sizeof(struct bnxt_ulp_vfr_rule_info));
return 0;
}
+
+static void
+ulp_l2_custom_tunnel_id_update(struct bnxt *bp,
+ struct bnxt_ulp_mapper_create_parms *params)
+{
+ if (!bp->l2_etype_tunnel_cnt)
+ return;
+
+ if (bp->l2_etype_upar_in_use &
+ HWRM_TUNNEL_DST_PORT_QUERY_OUTPUT_UPAR_IN_USE_UPAR0) {
+ ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L2_CUSTOM_UPAR_ID,
+ ULP_WP_SYM_TUN_HDR_TYPE_UPAR1);
+ } else if (bp->l2_etype_upar_in_use &
+ HWRM_TUNNEL_DST_PORT_QUERY_OUTPUT_UPAR_IN_USE_UPAR1) {
+ ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_L2_CUSTOM_UPAR_ID,
+ ULP_WP_SYM_TUN_HDR_TYPE_UPAR2);
+ }
+}
@@ -1073,6 +1073,12 @@ ulp_mapper_field_port_db_process(struct bnxt_ulp_mapper_parms *parms,
return -EINVAL;
}
break;
+ case BNXT_ULP_PORT_TABLE_VF_FUNC_FID:
+ if (ulp_port_db_port_vf_fid_get(parms->ulp_ctx, port_id, val)) {
+ BNXT_TF_DBG(ERR, "Invalid port id %u\n", port_id);
+ return -EINVAL;
+ }
+ break;
default:
BNXT_TF_DBG(ERR, "Invalid port_data %d\n", port_data);
return -EINVAL;
@@ -760,3 +760,35 @@ ulp_port_db_port_meta_data_get(struct bnxt_ulp_context *ulp_ctxt,
}
return -EINVAL;
}
+
+/* Api to get the function id for a given port id
+ *
+ * ulp_ctxt [in] Ptr to ulp context
+ * port_id [in] dpdk port id
+ * fid_data [out] the function id of the given port
+ *
+ * Returns 0 on success or negative number on failure.
+ */
+int32_t
+ulp_port_db_port_vf_fid_get(struct bnxt_ulp_context *ulp_ctxt,
+ uint16_t port_id, uint8_t **fid_data)
+{
+ struct bnxt_ulp_port_db *port_db;
+ uint32_t ifindex;
+
+ port_db = bnxt_ulp_cntxt_ptr2_port_db_get(ulp_ctxt);
+ if (!port_db || port_id >= RTE_MAX_ETHPORTS) {
+ BNXT_TF_DBG(ERR, "Invalid Arguments\n");
+ return -EINVAL;
+ }
+ ifindex = port_db->dev_port_list[port_id];
+ if (!ifindex)
+ return -ENOENT;
+
+ if (port_db->ulp_intf_list[ifindex].type != BNXT_ULP_INTF_TYPE_VF &&
+ port_db->ulp_intf_list[ifindex].type != BNXT_ULP_INTF_TYPE_VF_REP)
+ return -EINVAL;
+
+ *fid_data = (uint8_t *)&port_db->ulp_intf_list[ifindex].vf_func_id;
+ return 0;
+}
@@ -354,4 +354,17 @@ ulp_port_db_port_is_pf_get(struct bnxt_ulp_context *ulp_ctxt,
int32_t
ulp_port_db_port_meta_data_get(struct bnxt_ulp_context *ulp_ctxt,
uint16_t port_id, uint8_t **meta_data);
+
+/* Api to get the function id for a given port id
+ *
+ * ulp_ctxt [in] Ptr to ulp context
+ * port_id [in] dpdk port id
+ * fid_data [out] the function id of the given port
+ *
+ * Returns 0 on success or negative number on failure.
+ */
+int32_t
+ulp_port_db_port_vf_fid_get(struct bnxt_ulp_context *ulp_ctxt,
+ uint16_t port_id, uint8_t **fid_data);
+
#endif /* _ULP_PORT_DB_H_ */