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:
Kishore Padmanabha 2020-06-12 18:20:21 +05:30 committed by Ferruh Yigit
parent a465172543
commit c7020c212d
4 changed files with 80 additions and 10 deletions

View File

@ -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)

View File

@ -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:

View File

@ -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) {

View File

@ -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);