net/bnxt: support internal exact match flows
Added support of internal exact match flows and the action mark is supported for these flows. 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>
This commit is contained in:
parent
a465172543
commit
c7020c212d
@ -562,6 +562,7 @@ struct bnxt {
|
||||
#define BNXT_FLAG_FLOW_XSTATS_EN BIT(25)
|
||||
#define BNXT_FLAG_DFLT_MAC_SET BIT(26)
|
||||
#define BNXT_FLAG_TRUFLOW_EN BIT(27)
|
||||
#define BNXT_FLAG_GFID_ENABLE BIT(28)
|
||||
#define BNXT_PF(bp) (!((bp)->flags & BNXT_FLAG_VF))
|
||||
#define BNXT_VF(bp) ((bp)->flags & BNXT_FLAG_VF)
|
||||
#define BNXT_NPAR(bp) ((bp)->flags & BNXT_FLAG_NPAR_PF)
|
||||
@ -577,6 +578,7 @@ struct bnxt {
|
||||
#define BNXT_FLOW_XSTATS_EN(bp) ((bp)->flags & BNXT_FLAG_FLOW_XSTATS_EN)
|
||||
#define BNXT_HAS_DFLT_MAC_SET(bp) ((bp)->flags & BNXT_FLAG_DFLT_MAC_SET)
|
||||
#define BNXT_TRUFLOW_EN(bp) ((bp)->flags & BNXT_FLAG_TRUFLOW_EN)
|
||||
#define BNXT_GFID_ENABLED(bp) ((bp)->flags & BNXT_FLAG_GFID_ENABLE)
|
||||
|
||||
uint32_t fw_cap;
|
||||
#define BNXT_FW_CAP_HOT_RESET BIT(0)
|
||||
|
@ -412,8 +412,13 @@ bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1,
|
||||
bool gfid = false;
|
||||
uint32_t mark_id;
|
||||
uint32_t flags2;
|
||||
uint32_t gfid_support = 0;
|
||||
int rc;
|
||||
|
||||
|
||||
if (BNXT_GFID_ENABLED(bp))
|
||||
gfid_support = 1;
|
||||
|
||||
cfa_code = rte_le_to_cpu_16(rxcmp1->cfa_code);
|
||||
flags2 = rte_le_to_cpu_32(rxcmp1->flags2);
|
||||
meta = rte_le_to_cpu_32(rxcmp1->metadata);
|
||||
@ -427,8 +432,14 @@ bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1,
|
||||
|
||||
switch (meta_fmt) {
|
||||
case 0:
|
||||
/* Not an LFID or GFID, a flush cmd. */
|
||||
goto skip_mark;
|
||||
if (gfid_support) {
|
||||
/* Not an LFID or GFID, a flush cmd. */
|
||||
goto skip_mark;
|
||||
} else {
|
||||
/* LFID mode, no vlan scenario */
|
||||
gfid = false;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
/*
|
||||
@ -437,13 +448,19 @@ bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1,
|
||||
* collisions with EEM. Simply return without setting the mark
|
||||
* in the mbuf.
|
||||
*/
|
||||
if (BNXT_CFA_META_EM_TEST(meta))
|
||||
goto skip_mark;
|
||||
/*
|
||||
* It is a TCAM entry, so it is an LFID. The TCAM IDX and Mode
|
||||
* can also be determined by decoding the meta_data. We are not
|
||||
* using these for now.
|
||||
*/
|
||||
if (BNXT_CFA_META_EM_TEST(meta)) {
|
||||
/*This is EM hit {EM(1), GFID[27:16], 19'd0 or vtag } */
|
||||
gfid = true;
|
||||
meta >>= BNXT_RX_META_CFA_CODE_SHIFT;
|
||||
cfa_code |= meta << BNXT_CFA_CODE_META_SHIFT;
|
||||
} else {
|
||||
/*
|
||||
* It is a TCAM entry, so it is an LFID.
|
||||
* The TCAM IDX and Mode can also be determined
|
||||
* by decoding the meta_data. We are not
|
||||
* using these for now.
|
||||
*/
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
case 7:
|
||||
|
@ -308,6 +308,32 @@ ulp_dparms_init(struct bnxt *bp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The function to initialize bp flags with truflow features */
|
||||
static int32_t
|
||||
ulp_dparms_dev_port_intf_update(struct bnxt *bp,
|
||||
struct bnxt_ulp_context *ulp_ctx)
|
||||
{
|
||||
struct bnxt_ulp_device_params *dparms;
|
||||
uint32_t dev_id;
|
||||
|
||||
if (bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id)) {
|
||||
BNXT_TF_DBG(DEBUG, "Failed to get device id\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dparms = bnxt_ulp_device_params_get(dev_id);
|
||||
if (!dparms) {
|
||||
BNXT_TF_DBG(DEBUG, "Failed to get device parms\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Update the bp flag with gfid flag */
|
||||
if (dparms->global_fid_enable)
|
||||
bp->flags |= BNXT_FLAG_GFID_ENABLE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int32_t
|
||||
ulp_ctx_attach(struct bnxt_ulp_context *ulp_ctx,
|
||||
struct bnxt_ulp_session_state *session)
|
||||
@ -510,6 +536,17 @@ bnxt_ulp_init(struct bnxt *bp)
|
||||
rte_free(bp->ulp_ctx);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Update bnxt driver flags */
|
||||
rc = ulp_dparms_dev_port_intf_update(bp, bp->ulp_ctx);
|
||||
if (rc) {
|
||||
BNXT_TF_DBG(ERR, "Failed to update driver flags\n");
|
||||
ulp_ctx_detach(bp, session);
|
||||
ulp_session_deinit(session);
|
||||
rte_free(bp->ulp_ctx);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* update the port database */
|
||||
rc = ulp_port_db_dev_port_intf_update(bp->ulp_ctx, bp);
|
||||
if (rc) {
|
||||
@ -539,6 +576,13 @@ bnxt_ulp_init(struct bnxt *bp)
|
||||
goto jump_to_error;
|
||||
}
|
||||
|
||||
/* Update bnxt driver flags */
|
||||
rc = ulp_dparms_dev_port_intf_update(bp, bp->ulp_ctx);
|
||||
if (rc) {
|
||||
BNXT_TF_DBG(ERR, "Failed to update driver flags\n");
|
||||
goto jump_to_error;
|
||||
}
|
||||
|
||||
/* update the port database */
|
||||
rc = ulp_port_db_dev_port_intf_update(bp->ulp_ctx, bp);
|
||||
if (rc) {
|
||||
|
@ -804,7 +804,7 @@ ulp_mapper_keymask_field_process(struct bnxt_ulp_mapper_parms *parms,
|
||||
}
|
||||
break;
|
||||
case BNXT_ULP_MAPPER_OPC_SET_TO_ZERO:
|
||||
if (!ulp_blob_pad_push(blob, bitlen)) {
|
||||
if (ulp_blob_pad_push(blob, bitlen) < 0) {
|
||||
BNXT_TF_DBG(ERR, "%s pad too large for blob\n", name);
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -1284,6 +1284,13 @@ ulp_mapper_em_tbl_process(struct bnxt_ulp_mapper_parms *parms,
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG
|
||||
ulp_mapper_result_dump("EEM Result", tbl, &data);
|
||||
#endif
|
||||
|
||||
/* do the transpose for the internal EM keys */
|
||||
if (tbl->resource_type == TF_MEM_INTERNAL)
|
||||
ulp_blob_perform_byte_reverse(&key);
|
||||
|
||||
rc = bnxt_ulp_cntxt_tbl_scope_id_get(parms->ulp_ctx,
|
||||
&iparms.tbl_scope_id);
|
||||
|
Loading…
Reference in New Issue
Block a user