[dpdk-dev] [PATCH 33/36] net/bnxt: add support for internal exact match flows

Somnath Kotur somnath.kotur at broadcom.com
Wed Jun 10 08:57:30 CEST 2020


From: Kishore Padmanabha <kishore.padmanabha at broadcom.com>

Added support of internal exact match flows and the action
mark is supported for these flows.

Signed-off-by: Kishore Padmanabha <kishore.padmanabha at broadcom.com>
Reviewed-by: Michael Baucom <michael.baucom at broadcom.com>
Signed-off-by: Somnath Kotur <somnath.kotur at broadcom.com>
---
 drivers/net/bnxt/bnxt.h              |  2 ++
 drivers/net/bnxt/bnxt_rxr.c          | 36 +++++++++++++++++++++--------
 drivers/net/bnxt/tf_ulp/bnxt_ulp.c   | 44 ++++++++++++++++++++++++++++++++++++
 drivers/net/bnxt/tf_ulp/ulp_mapper.c |  9 +++++++-
 drivers/net/bnxt/tf_ulp/ulp_utils.c  | 35 +++++++++++++++++++++++++---
 drivers/net/bnxt/tf_ulp/ulp_utils.h  | 16 +++++++++++--
 6 files changed, 126 insertions(+), 16 deletions(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 79e9b28..d455f8d 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -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)
diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index bd452b7..3bcc624 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -412,8 +412,12 @@ 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;
-	int rc;
+	uint32_t gfid_support = 0;
 	uint32_t vfr_flag;
+	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);
@@ -428,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:
 		/*
@@ -438,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:
diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
index 10183ac..fd3f61b 100644
--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
@@ -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) {
diff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c
index f35a99e..56c1f13 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c
@@ -797,7 +797,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;
 		}
@@ -1289,6 +1289,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);
diff --git a/drivers/net/bnxt/tf_ulp/ulp_utils.c b/drivers/net/bnxt/tf_ulp/ulp_utils.c
index bd267b6..c6e4dc7 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_utils.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_utils.c
@@ -403,15 +403,15 @@ ulp_blob_push_encap(struct ulp_blob *blob,
  *
  * datalen [in] The number of bits of pad to add
  *
- * returns the number of pad bits added, zero on failure
+ * returns the number of pad bits added, -1 on failure
  */
-uint32_t
+int32_t
 ulp_blob_pad_push(struct ulp_blob *blob,
 		  uint32_t datalen)
 {
 	if (datalen > (uint32_t)(blob->bitlen - blob->write_idx)) {
 		BNXT_TF_DBG(ERR, "Pad too large for blob\n");
-		return 0;
+		return -1;
 	}
 
 	blob->write_idx += datalen;
@@ -495,6 +495,35 @@ ulp_blob_perform_encap_swap(struct ulp_blob *blob)
 }
 
 /*
+ * Perform the blob buffer reversal byte wise.
+ * This api makes the first byte the last and
+ * vice-versa.
+ *
+ * blob [in] The blob's data to be used for swap.
+ *
+ * returns void.
+ */
+void
+ulp_blob_perform_byte_reverse(struct ulp_blob *blob)
+{
+	uint32_t idx = 0, num = 0;
+	uint8_t xchar;
+
+	/* validate the arguments */
+	if (!blob) {
+		BNXT_TF_DBG(ERR, "invalid argument\n");
+		return; /* failure */
+	}
+
+	num = ULP_BITS_2_BYTE_NR(blob->write_idx);
+	for (idx = 0; idx < (num / 2); idx++) {
+		xchar = blob->data[idx];
+		blob->data[idx] = blob->data[(num - 1) - idx];
+		blob->data[(num - 1) - idx] = xchar;
+	}
+}
+
+/*
  * Read data from the operand
  *
  * operand [in] A pointer to a 16 Byte operand
diff --git a/drivers/net/bnxt/tf_ulp/ulp_utils.h b/drivers/net/bnxt/tf_ulp/ulp_utils.h
index 13d9e88..97c7750 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_utils.h
+++ b/drivers/net/bnxt/tf_ulp/ulp_utils.h
@@ -236,9 +236,9 @@ ulp_blob_data_get(struct ulp_blob *blob,
  *
  * datalen [in] The number of bits of pad to add
  *
- * returns the number of pad bits added, zero on failure
+ * returns the number of pad bits added, -1 on failure
  */
-uint32_t
+int32_t
 ulp_blob_pad_push(struct ulp_blob *blob,
 		  uint32_t datalen);
 
@@ -264,6 +264,18 @@ void
 ulp_blob_perform_encap_swap(struct ulp_blob *blob);
 
 /*
+ * Perform the blob buffer reversal byte wise.
+ * This api makes the first byte the last and
+ * vice-versa.
+ *
+ * blob [in] The blob's data to be used for swap.
+ *
+ * returns void.
+ */
+void
+ulp_blob_perform_byte_reverse(struct ulp_blob *blob);
+
+/*
  * Read data from the operand
  *
  * operand [in] A pointer to a 16 Byte operand
-- 
2.7.4



More information about the dev mailing list