Add support for the vfr flag to the mark manager.
The vf representor flag is added to class table so it can be set in
the template details.
Also added the vfr flag process in mark database.
Signed-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Mike Baucom <michael.baucom@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
uint32_t flags2;
uint32_t gfid_support = 0;
int rc;
+ uint32_t vfr_flag;
if (BNXT_GFID_ENABLED(bp))
}
rc = ulp_mark_db_mark_get(bp->ulp_ctx, gfid,
- cfa_code, &mark_id);
+ cfa_code, &vfr_flag, &mark_id);
if (!rc) {
/* Got the mark, write it to the mbuf and return */
mbuf->hash.fdir.hi = mark_id;
struct bnxt_ulp_mapper_tbl_info *tbl,
uint64_t flow_id)
{
+ enum bnxt_ulp_mark_db_opcode mark_op = tbl->mark_db_opcode;
struct ulp_flow_db_res_params fid_parms;
uint32_t mark, gfid, mark_flag;
int32_t rc = 0;
- if (!(tbl->mark_enable &&
+ if (mark_op == BNXT_ULP_MARK_DB_OPCODE_NOP ||
+ !(mark_op == BNXT_ULP_MARK_DB_OPCODE_SET_IF_MARK_ACTION &&
ULP_BITMAP_ISSET(parms->act_bitmap->bits,
- BNXT_ULP_ACTION_BIT_MARK)))
+ BNXT_ULP_ACTION_BIT_MARK)))
return rc; /* no need to perform gfid process */
/* Get the mark id details from action property */
ulp_mapper_mark_act_ptr_process(struct bnxt_ulp_mapper_parms *parms,
struct bnxt_ulp_mapper_tbl_info *tbl)
{
+ enum bnxt_ulp_mark_db_opcode mark_op = tbl->mark_db_opcode;
struct ulp_flow_db_res_params fid_parms;
uint32_t act_idx, mark, mark_flag;
uint64_t val64;
int32_t rc = 0;
- if (!(tbl->mark_enable &&
+ if (mark_op == BNXT_ULP_MARK_DB_OPCODE_NOP ||
+ !(mark_op == BNXT_ULP_MARK_DB_OPCODE_SET_IF_MARK_ACTION &&
ULP_BITMAP_ISSET(parms->act_bitmap->bits,
- BNXT_ULP_ACTION_BIT_MARK)))
+ BNXT_ULP_ACTION_BIT_MARK)))
return rc; /* no need to perform mark action process */
/* Get the mark id details from action property */
return rc;
}
+static int32_t
+ulp_mapper_mark_vfr_idx_process(struct bnxt_ulp_mapper_parms *parms,
+ struct bnxt_ulp_mapper_tbl_info *tbl)
+{
+ struct ulp_flow_db_res_params fid_parms;
+ uint32_t act_idx, mark, mark_flag;
+ uint64_t val64;
+ enum bnxt_ulp_mark_db_opcode mark_op = tbl->mark_db_opcode;
+ int32_t rc = 0;
+
+ if (mark_op == BNXT_ULP_MARK_DB_OPCODE_NOP ||
+ mark_op == BNXT_ULP_MARK_DB_OPCODE_SET_IF_MARK_ACTION)
+ return rc; /* no need to perform mark action process */
+
+ /* Get the mark id details from the computed field of dev port id */
+ mark = ULP_COMP_FLD_IDX_RD(parms, BNXT_ULP_CF_IDX_DEV_PORT_ID);
+
+ /* Get the main action pointer */
+ if (!ulp_regfile_read(parms->regfile,
+ BNXT_ULP_REGFILE_INDEX_MAIN_ACTION_PTR,
+ &val64)) {
+ BNXT_TF_DBG(ERR, "read action ptr main failed\n");
+ return -EINVAL;
+ }
+ act_idx = tfp_be_to_cpu_64(val64);
+
+ /* Set the mark flag to local fid and vfr flag */
+ mark_flag = BNXT_ULP_MARK_LOCAL_HW_FID | BNXT_ULP_MARK_VFR_ID;
+
+ rc = ulp_mark_db_mark_add(parms->ulp_ctx, mark_flag,
+ act_idx, mark);
+ if (rc) {
+ BNXT_TF_DBG(ERR, "Failed to add mark to flow\n");
+ return rc;
+ }
+ fid_parms.direction = tbl->direction;
+ fid_parms.resource_func = BNXT_ULP_RESOURCE_FUNC_HW_FID;
+ fid_parms.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO;
+ fid_parms.resource_type = mark_flag;
+ fid_parms.resource_hndl = act_idx;
+ rc = ulp_flow_db_resource_add(parms->ulp_ctx,
+ parms->tbl_idx,
+ parms->fid,
+ &fid_parms);
+ if (rc)
+ BNXT_TF_DBG(ERR, "Fail to link res to flow rc = %d\n", rc);
+ return rc;
+}
+
static int32_t
ulp_mapper_tcam_tbl_process(struct bnxt_ulp_mapper_parms *parms,
struct bnxt_ulp_mapper_tbl_info *tbl)
goto error;
}
+ /* Perform the VF rep action */
+ rc = ulp_mapper_mark_vfr_idx_process(parms, tbl);
+ if (rc) {
+ BNXT_TF_DBG(ERR, "Failed to add vfr mark rc = %d\n", rc);
+ goto error;
+ }
return rc;
error:
/*
BNXT_ULP_MARK_VALID)
#define ULP_MARK_DB_ENTRY_IS_INVALID(mark_info) (!((mark_info)->flags &\
BNXT_ULP_MARK_VALID))
+#define ULP_MARK_DB_ENTRY_IS_VFR_ID(mark_info) ((mark_info)->flags &\
+ BNXT_ULP_MARK_VFR_ID)
#define ULP_MARK_DB_ENTRY_IS_GLOBAL_HW_FID(mark_info) ((mark_info)->flags &\
BNXT_ULP_MARK_GLOBAL_HW_FID)
*
* fid [in] The flow id that is returned by HW in BD
*
+ * vfr_flag [out].it indicatesif mark is vfr_id or mark id
+ *
* mark [out] The mark that is associated with the FID
*
*/
ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
bool is_gfid,
uint32_t fid,
+ uint32_t *vfr_flag,
uint32_t *mark)
{
struct bnxt_ulp_mark_tbl *mtbl;
BNXT_TF_DBG(DEBUG, "Get GFID[0x%0x] = 0x%0x\n",
idx, mtbl->gfid_tbl[idx].mark_id);
+ *vfr_flag = ULP_MARK_DB_ENTRY_IS_VFR_ID(&mtbl->gfid_tbl[idx]);
*mark = mtbl->gfid_tbl[idx].mark_id;
} else {
if (idx >= mtbl->lfid_num_entries ||
BNXT_TF_DBG(DEBUG, "Get LFID[0x%0x] = 0x%0x\n",
idx, mtbl->lfid_tbl[idx].mark_id);
+ *vfr_flag = ULP_MARK_DB_ENTRY_IS_VFR_ID(&mtbl->lfid_tbl[idx]);
*mark = mtbl->lfid_tbl[idx].mark_id;
}
*
* fid [in] The flow id that is returned by HW in BD
*
+ * vfr_flag [out].it indicatesif mark is vfr_id or mark id
+ *
* mark [out] The mark that is associated with the FID
*
*/
ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
bool is_gfid,
uint32_t fid,
+ uint32_t *vfr_flag,
uint32_t *mark);
/*
.mark_enable = BNXT_ULP_MARK_ENABLE_NO,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
+ .vfr_flag = BNXT_ULP_VFR_FLAG_NO,
+ .regfile_wr_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
{
.resource_func = BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE,
.mark_enable = BNXT_ULP_MARK_ENABLE_NO,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
+ .vfr_flag = BNXT_ULP_VFR_FLAG_NO,
},
{
.resource_func = BNXT_ULP_RESOURCE_FUNC_CACHE_TABLE,
.mark_enable = BNXT_ULP_MARK_ENABLE_NO,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
+ .vfr_flag = BNXT_ULP_VFR_FLAG_NO,
},
{
.resource_func = BNXT_ULP_RESOURCE_FUNC_TCAM_TABLE,
.mark_enable = BNXT_ULP_MARK_ENABLE_NO,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
+ .vfr_flag = BNXT_ULP_VFR_FLAG_NO,
},
{
.resource_func = BNXT_ULP_RESOURCE_FUNC_EM_TABLE,
BNXT_ULP_CF_IDX_PHY_PORT_SPIF = 25,
BNXT_ULP_CF_IDX_PHY_PORT_PARIF = 26,
BNXT_ULP_CF_IDX_PHY_PORT_VPORT = 27,
- BNXT_ULP_CF_IDX_VFR_FLAG = 28,
- BNXT_ULP_CF_IDX_LAST = 29
+ BNXT_ULP_CF_IDX_LAST = 28
};
enum bnxt_ulp_critical_resource {
BNXT_ULP_ENCAP_VTAG_ENCODING_STAG_REMAP_DIFFSERV = 3
};
+enum bnxt_ulp_vfr_flag {
+ BNXT_ULP_VFR_FLAG_NO = 0,
+ BNXT_ULP_VFR_FLAG_YES = 1,
+ BNXT_ULP_VFR_FLAG_LAST = 2
+};
+
enum bnxt_ulp_fdb_resource_flags {
BNXT_ULP_FDB_RESOURCE_FLAGS_DIR_EGR = 0x01,
BNXT_ULP_FDB_RESOURCE_FLAGS_DIR_INGR = 0x00
.encap_num_fields = 0,
.ident_start_idx = 0,
.ident_nums = 1,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 1,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 1,
.ident_nums = 1,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 2,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 2,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_YES,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_SET_IF_MARK_ACTION,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_YES,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 2,
.ident_nums = 1,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 3,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 3,
.ident_nums = 1,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 4,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 4,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_YES,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_SET_IF_MARK_ACTION,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_YES,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 4,
.ident_nums = 1,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_SET_IF_MARK_ACTION,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 5,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 5,
.ident_nums = 1,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 6,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_NOP,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
},
.encap_num_fields = 0,
.ident_start_idx = 6,
.ident_nums = 0,
- .mark_enable = BNXT_ULP_MARK_ENABLE_YES,
+ .mark_db_opcode = BNXT_ULP_MARK_DB_OPCODE_SET_IF_MARK_ACTION,
.critical_resource = BNXT_ULP_CRITICAL_RESOURCE_YES,
.regfile_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
}
BNXT_ULP_HDR_TYPE_LAST = 3
};
-enum bnxt_ulp_mark_enable {
- BNXT_ULP_MARK_ENABLE_NO = 0,
- BNXT_ULP_MARK_ENABLE_YES = 1,
- BNXT_ULP_MARK_ENABLE_LAST = 2
+enum bnxt_ulp_mark_db_opcode {
+ BNXT_ULP_MARK_DB_OPCODE_NOP = 0,
+ BNXT_ULP_MARK_DB_OPCODE_SET_IF_MARK_ACTION = 1,
+ BNXT_ULP_MARK_DB_OPCODE_SET_VFR_FLAG = 2,
+ BNXT_ULP_MARK_DB_OPCODE_LAST = 3
};
enum bnxt_ulp_mapper_opc {
BNXT_ULP_SEARCH_BEFORE_ALLOC_LAST = 2
};
-enum bnxt_ulp_vfr_flag {
- BNXT_ULP_VFR_FLAG_NO = 0,
- BNXT_ULP_VFR_FLAG_YES = 1,
- BNXT_ULP_VFR_FLAG_LAST = 2
-};
-
enum bnxt_ulp_fdb_resource_flags {
BNXT_ULP_FDB_RESOURCE_FLAGS_DIR_EGR = 0x01,
BNXT_ULP_FDB_RESOURCE_FLAGS_DIR_INGR = 0x00
uint32_t ident_start_idx;
uint16_t ident_nums;
- uint8_t mark_enable;
- enum bnxt_ulp_regfile_index regfile_wr_idx;
enum bnxt_ulp_regfile_index regfile_idx;
+ enum bnxt_ulp_mark_db_opcode mark_db_opcode;
};
struct bnxt_ulp_mapper_class_key_field_info {