From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from dpdk.org (dpdk.org [92.243.14.124])
	by inbox.dpdk.org (Postfix) with ESMTP id B79EFA0565;
	Tue, 17 Mar 2020 16:46:50 +0100 (CET)
Received: from [92.243.14.124] (localhost [127.0.0.1])
	by dpdk.org (Postfix) with ESMTP id 5E8E21C1FA;
	Tue, 17 Mar 2020 16:40:14 +0100 (CET)
Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com
 [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id 946B01C05C
 for <dev@dpdk.org>; Tue, 17 Mar 2020 16:40:11 +0100 (CET)
Received: by mail-wr1-f67.google.com with SMTP id 6so26288804wre.4
 for <dev@dpdk.org>; Tue, 17 Mar 2020 08:40:11 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google;
 h=from:to:cc:subject:date:message-id:in-reply-to:references
 :mime-version:content-transfer-encoding;
 bh=l8huj0Q8rSlYItRwtwFgAAVV5qJ4r48rXuZHfgQbCR8=;
 b=D6dfQ3bvyEEKpid9FkZHJZXMlLG2oU5g1tbsW+bXanvyOCOLkKr/qfRzoKQKhivPH2
 VvT9PKdnSNcQVwMZcUmQ1KRxZTz36V35tMOofebXWfZgZASm3SWuqOzztHGICJuIZS/D
 JmpeI/AAT8q1Q3Z0WwXEKXEz3PFdv8OS21B/w=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
 :references:mime-version:content-transfer-encoding;
 bh=l8huj0Q8rSlYItRwtwFgAAVV5qJ4r48rXuZHfgQbCR8=;
 b=n0bo9h1ynqmm2jyGx3i+71BsG+7PkENbdIMVHZrJDd/DT5cfveItk7ivI7DCF/3aCn
 ezD72HnAqAo+MEAxjO26zuTD+EWFgQ1AAsrF+Dt9nBZv4zWE6qhT4Wiu2SqRh4mJrU5g
 g5cA7UzQEMi+x8yxofLIdONSEUyHmSiTKRTSUEHzMc4xipTi/OHXgM6VES04hUzzMVUr
 o70yN1v98nhKxfSxn9FZsGRMkndHgcK4M34FHfYASiGBtWNIAN1UbvJtAetb6GSTK2IV
 vAycC10QofUf/QF0gAJ62bzzkn3ro3KA3G9JX+kfN35FJ7HuJCwm+3wht3tGf/+DmOxI
 B9OA==
X-Gm-Message-State: ANhLgQ0K/v0UWkNcrCZcreN6Srj1iCeBoMsI4SlZHpuX7EBdda25WAve
 JDboc9cWgVLz0LvKrkShR1eUuOqUqMYs1CDakC7KE3ZMzLwR3loK2CZkRiOa9ClpgvS+uLZbrsT
 8ym+HMwK1nVS5NA/Trnr4xCfSrgggDCkRAFn6K+ymcmiNMzp1L/NDT88//Gs269jKJ6j8
X-Google-Smtp-Source: ADFU+vuuSs/uENBUtFfy+otHcrSg+3gCPEZAbpL6zNxR8DD/8jFxOm05HcnawjZ13Ne1GKi51H5COg==
X-Received: by 2002:adf:fa4c:: with SMTP id y12mr7111805wrr.392.1584459610893; 
 Tue, 17 Mar 2020 08:40:10 -0700 (PDT)
Received: from S60.dhcp.broadcom.net ([192.19.234.250])
 by smtp.gmail.com with ESMTPSA id q4sm5052142wro.56.2020.03.17.08.40.08
 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
 Tue, 17 Mar 2020 08:40:10 -0700 (PDT)
From: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
To: dev@dpdk.org
Cc: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>,
 Mike Baucom <michael.baucom@broadcom.com>
Date: Tue, 17 Mar 2020 21:08:30 +0530
Message-Id: <1584459511-5353-33-git-send-email-venkatkumar.duvvuru@broadcom.com>
X-Mailer: git-send-email 2.7.4
In-Reply-To: <1584459511-5353-1-git-send-email-venkatkumar.duvvuru@broadcom.com>
References: <1584459511-5353-1-git-send-email-venkatkumar.duvvuru@broadcom.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Subject: [dpdk-dev] =?utf-8?q?=5BPATCH_32/33=5D_net/bnxt=3A_add_support_fo?=
	=?utf-8?q?r_injecting_mark_into_packet=E2=80=99s_mbuf?=
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

When a flow is offloaded with MARK action (RTE_FLOW_ACTION_TYPE_MARK),
each packet of that flow will have metadata set in its completion.
This metadata will be used to fetch an index into a mark table where
the actual MARK for that flow is stored. Fetch the MARK from the mark
table and inject it into packet’s mbuf.

Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Signed-off-by: Mike Baucom <michael.baucom@broadcom.com>
Reviewed-by: Lance Richardson <lance.richardson@broadcom.com>
Reviewed-by: Ajit Kumar Khaparde <ajit.khaparde@broadcom.com>
---
 drivers/net/bnxt/bnxt_rxr.c            | 156 ++++++++++++++++++++++++---------
 drivers/net/bnxt/tf_ulp/ulp_mark_mgr.c |  55 +++++++++++-
 drivers/net/bnxt/tf_ulp/ulp_mark_mgr.h |  18 ++++
 3 files changed, 186 insertions(+), 43 deletions(-)

diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c
index bef9720..e3c677e 100644
--- a/drivers/net/bnxt/bnxt_rxr.c
+++ b/drivers/net/bnxt/bnxt_rxr.c
@@ -19,6 +19,10 @@
 #ifdef RTE_LIBRTE_IEEE1588
 #include "bnxt_hwrm.h"
 #endif
+#ifdef RTE_LIBRTE_BNXT_TRUFLOW
+#include <bnxt_tf_common.h>
+#include <ulp_mark_mgr.h>
+#endif
 
 /*
  * RX Ring handling
@@ -399,6 +403,112 @@ bnxt_get_rx_ts_thor(struct bnxt *bp, uint32_t rx_ts_cmpl)
 }
 #endif
 
+#ifdef RTE_LIBRTE_BNXT_TRUFLOW
+static void
+bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1,
+			  struct rte_mbuf *mbuf)
+{
+	uint32_t cfa_code;
+	uint32_t meta_fmt;
+	uint32_t meta;
+	uint32_t eem = 0;
+	uint32_t mark_id;
+	uint32_t flags2;
+	int rc;
+
+	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);
+	if (meta) {
+		meta >>= BNXT_RX_META_CFA_CODE_SHIFT;
+
+		/* The flags field holds extra bits of info from [6:4]
+		 * which indicate if the flow is in TCAM or EM or EEM
+		 */
+		meta_fmt = (flags2 & BNXT_CFA_META_FMT_MASK) >>
+			    BNXT_CFA_META_FMT_SHFT;
+		/* meta_fmt == 4 => 'b100 => 'b10x => EM.
+		 * meta_fmt == 5 => 'b101 => 'b10x => EM + VLAN
+		 * meta_fmt == 6 => 'b110 => 'b11x => EEM
+		 * meta_fmt == 7 => 'b111 => 'b11x => EEM + VLAN.
+		 */
+		meta_fmt >>= BNXT_CFA_META_FMT_EM_EEM_SHFT;
+
+		eem = meta_fmt == BNXT_CFA_META_FMT_EEM;
+
+		/* For EEM flows, The first part of cfa_code is 16 bits.
+		 * The second part is embedded in the
+		 * metadata field from bit 19 onwards. The driver needs to
+		 * ignore the first 19 bits of metadata and use the next 12
+		 * bits as higher 12 bits of cfa_code.
+		 */
+		if (eem)
+			cfa_code |= meta << BNXT_CFA_CODE_META_SHIFT;
+	}
+
+	if (cfa_code) {
+		mbuf->hash.fdir.hi = 0;
+		mbuf->hash.fdir.id = 0;
+		if (eem)
+			rc = ulp_mark_db_mark_get(&bp->ulp_ctx, true,
+						  cfa_code, &mark_id);
+		else
+			rc = ulp_mark_db_mark_get(&bp->ulp_ctx, false,
+						  cfa_code, &mark_id);
+		/* If the above fails, simply return and don't add the mark to
+		 * mbuf
+		 */
+		if (rc)
+			return;
+
+		mbuf->hash.fdir.hi	= mark_id;
+		mbuf->udata64		= (cfa_code & 0xffffffffull) << 32;
+		mbuf->hash.fdir.id	= rxcmp1->cfa_code;
+		mbuf->ol_flags		|= PKT_RX_FDIR | PKT_RX_FDIR_ID;
+	}
+}
+
+#else
+void bnxt_set_mark_in_mbuf(struct bnxt *bp,
+			   struct rx_pkt_cmpl_hi *rxcmp1,
+			   struct rte_mbuf *mbuf)
+{
+	uint32_t cfa_code = 0;
+	uint8_t meta_fmt = 0;
+	uint16_t flags2 = 0;
+	uint32_t meta =  0;
+
+	cfa_code = rte_le_to_cpu_16(rxcmp1->cfa_code);
+	if (!cfa_code)
+		return;
+
+	if (cfa_code && !bp->mark_table[cfa_code].valid)
+		return;
+
+	flags2 = rte_le_to_cpu_16(rxcmp1->flags2);
+	meta = rte_le_to_cpu_32(rxcmp1->metadata);
+	if (meta) {
+		meta >>= BNXT_RX_META_CFA_CODE_SHIFT;
+
+		/* The flags field holds extra bits of info from [6:4]
+		 * which indicate if the flow is in TCAM or EM or EEM
+		 */
+		meta_fmt = (flags2 & BNXT_CFA_META_FMT_MASK) >>
+			   BNXT_CFA_META_FMT_SHFT;
+
+		/* meta_fmt == 4 => 'b100 => 'b10x => EM.
+		 * meta_fmt == 5 => 'b101 => 'b10x => EM + VLAN
+		 * meta_fmt == 6 => 'b110 => 'b11x => EEM
+		 * meta_fmt == 7 => 'b111 => 'b11x => EEM + VLAN.
+		 */
+		meta_fmt >>= BNXT_CFA_META_FMT_EM_EEM_SHFT;
+	}
+
+	mbuf->hash.fdir.hi = bp->mark_table[cfa_code].mark_id;
+	mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID;
+}
+#endif
+
 static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
 			    struct bnxt_rx_queue *rxq, uint32_t *raw_cons)
 {
@@ -489,8 +599,11 @@ static int bnxt_rx_pkt(struct rte_mbuf **rx_pkt,
 		mbuf->hash.rss = rxcmp->rss_hash;
 		mbuf->ol_flags |= PKT_RX_RSS_HASH;
 	}
-
+#ifdef RTE_LIBRTE_BNXT_TRUFLOW
+	bnxt_ulp_set_mark_in_mbuf(rxq->bp, rxcmp1, mbuf);
+#else
 	bnxt_set_mark_in_mbuf(rxq->bp, rxcmp1, mbuf);
+#endif
 
 #ifdef RTE_LIBRTE_IEEE1588
 	if (unlikely((flags_type & RX_PKT_CMPL_FLAGS_MASK) ==
@@ -896,44 +1009,3 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq)
 
 	return 0;
 }
-
-void bnxt_set_mark_in_mbuf(struct bnxt *bp,
-			   struct rx_pkt_cmpl_hi *rxcmp1,
-			   struct rte_mbuf *mbuf)
-{
-	uint32_t cfa_code = 0;
-	uint8_t meta_fmt =  0;
-	uint16_t flags2 = 0;
-	uint32_t meta =  0;
-
-	cfa_code = rte_le_to_cpu_16(rxcmp1->cfa_code);
-	if (!cfa_code)
-		return;
-
-	if (cfa_code && !bp->mark_table[cfa_code].valid)
-		return;
-
-	flags2 = rte_le_to_cpu_16(rxcmp1->flags2);
-	meta = rte_le_to_cpu_32(rxcmp1->metadata);
-	if (meta) {
-		meta >>= BNXT_RX_META_CFA_CODE_SHIFT;
-
-		/*
-		 * The flags field holds extra bits of info from [6:4]
-		 * which indicate if the flow is in TCAM or EM or EEM
-		 */
-		meta_fmt = (flags2 & BNXT_CFA_META_FMT_MASK) >>
-			   BNXT_CFA_META_FMT_SHFT;
-
-		/*
-		 * meta_fmt == 4 => 'b100 => 'b10x => EM.
-		 * meta_fmt == 5 => 'b101 => 'b10x => EM + VLAN
-		 * meta_fmt == 6 => 'b110 => 'b11x => EEM
-		 * meta_fmt == 7 => 'b111 => 'b11x => EEM + VLAN.
-		 */
-		meta_fmt >>= BNXT_CFA_META_FMT_EM_EEM_SHFT;
-	}
-
-	mbuf->hash.fdir.hi = bp->mark_table[cfa_code].mark_id;
-	mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID;
-}
diff --git a/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.c b/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.c
index 566668e..ad83531 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.c
@@ -58,7 +58,7 @@ ulp_mark_db_mark_set(struct bnxt_ulp_context *ctxt,
 	idx = ulp_mark_db_idx_get(is_gfid, fid, mtbl);
 
 	if (is_gfid) {
-		BNXT_TF_DBG(ERR, "Set GFID[0x%0x] = 0x%0x\n", idx, mark);
+		BNXT_TF_DBG(DEBUG, "Set GFID[0x%0x] = 0x%0x\n", idx, mark);
 
 		mtbl->gfid_tbl[idx].mark_id = mark;
 		mtbl->gfid_tbl[idx].valid = true;
@@ -176,6 +176,59 @@ ulp_mark_db_deinit(struct bnxt_ulp_context *ctxt)
 }
 
 /*
+ * Get a Mark from the Mark Manager
+ *
+ * ctxt [in] The ulp context for the mark manager
+ *
+ * is_gfid [in] The type of fid (GFID or LFID)
+ *
+ * fid [in] The flow id that is returned by HW in BD
+ *
+ * mark [out] The mark that is associated with the FID
+ *
+ */
+int32_t
+ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
+		     bool is_gfid,
+		     uint32_t fid,
+		     uint32_t *mark)
+{
+	struct bnxt_ulp_mark_tbl *mtbl;
+	uint32_t idx = 0;
+
+	if (!ctxt || !mark)
+		return -EINVAL;
+
+	mtbl = bnxt_ulp_cntxt_ptr2_mark_db_get(ctxt);
+	if (!mtbl) {
+		BNXT_TF_DBG(ERR, "Unable to get Mark Table\n");
+		return -EINVAL;
+	}
+
+	idx = ulp_mark_db_idx_get(is_gfid, fid, mtbl);
+
+	if (is_gfid) {
+		if (!mtbl->gfid_tbl[idx].valid)
+			return -EINVAL;
+
+		BNXT_TF_DBG(DEBUG, "Get GFID[0x%0x] = 0x%0x\n",
+			    idx, mtbl->gfid_tbl[idx].mark_id);
+
+		*mark = mtbl->gfid_tbl[idx].mark_id;
+	} else {
+		if (!mtbl->gfid_tbl[idx].valid)
+			return -EINVAL;
+
+		BNXT_TF_DBG(DEBUG, "Get LFID[0x%0x] = 0x%0x\n",
+			    idx, mtbl->lfid_tbl[idx].mark_id);
+
+		*mark = mtbl->lfid_tbl[idx].mark_id;
+	}
+
+	return 0;
+}
+
+/*
  * Adds a Mark to the Mark Manager
  *
  * ctxt [in] The ulp context for the mark manager
diff --git a/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.h b/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.h
index f0d1515..0f8a5e5 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.h
+++ b/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.h
@@ -55,6 +55,24 @@ int32_t
 ulp_mark_db_deinit(struct bnxt_ulp_context *ctxt);
 
 /*
+ * Get a Mark from the Mark Manager
+ *
+ * ctxt [in] The ulp context for the mark manager
+ *
+ * is_gfid [in] The type of fid (GFID or LFID)
+ *
+ * fid [in] The flow id that is returned by HW in BD
+ *
+ * mark [out] The mark that is associated with the FID
+ *
+ */
+int32_t
+ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
+		     bool is_gfid,
+		     uint32_t fid,
+		     uint32_t *mark);
+
+/*
  * Adds a Mark to the Mark Manager
  *
  * ctxt [in] The ulp context for the mark manager
-- 
2.7.4