DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH] net/iavf: support Tx LLDP on scalar and AVX512
@ 2023-12-06  6:08 Zhichao Zeng
  2023-12-14  6:58 ` [PATCH v2 0/3] " Zhichao Zeng
  0 siblings, 1 reply; 27+ messages in thread
From: Zhichao Zeng @ 2023-12-06  6:08 UTC (permalink / raw)
  To: dev
  Cc: qi.z.zhang, Zhichao Zeng, Jingjing Wu, Beilei Xing,
	Bruce Richardson, Konstantin Ananyev

This patch adds a testpmd command "set tx lldp on" which will register
an mbuf dynflag at the application level, currently only supported on.

The IAVF will fills the SWTCH_UPLINK bit in the Tx context descriptor
based on the mbuf dynflag to send the LLDP packets.

For avx512, need to close the Tx port first, then "set tx lldp on",
and reopen the port to select correct path.

Signed-off-by: Zhichao Zeng <zhichaox.zeng@intel.com>
---
 doc/guides/rel_notes/release_24_03.rst  |  3 ++
 drivers/net/iavf/iavf_rxtx.c            | 10 ++++
 drivers/net/iavf/iavf_rxtx.h            |  3 ++
 drivers/net/iavf/iavf_rxtx_vec_avx512.c | 17 +++++++
 drivers/net/iavf/iavf_rxtx_vec_common.h |  6 +++
 drivers/net/iavf/iavf_testpmd.c         | 68 +++++++++++++++++++++++++
 drivers/net/iavf/meson.build            |  3 ++
 drivers/net/iavf/rte_pmd_iavf.h         |  2 +
 8 files changed, 112 insertions(+)
 create mode 100644 drivers/net/iavf/iavf_testpmd.c

diff --git a/doc/guides/rel_notes/release_24_03.rst b/doc/guides/rel_notes/release_24_03.rst
index e9c9717706..46576f62fe 100644
--- a/doc/guides/rel_notes/release_24_03.rst
+++ b/doc/guides/rel_notes/release_24_03.rst
@@ -55,6 +55,9 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Updated Intel iavf driver.**
+
+  * Added support for Tx LLDP packet on scalar and avx512.
 
 Removed Items
 -------------
diff --git a/drivers/net/iavf/iavf_rxtx.c b/drivers/net/iavf/iavf_rxtx.c
index f19aa14646..a588b769a8 100644
--- a/drivers/net/iavf/iavf_rxtx.c
+++ b/drivers/net/iavf/iavf_rxtx.c
@@ -2427,6 +2427,8 @@ iavf_calc_context_desc(uint64_t flags, uint8_t vlan_flag)
 	if (flags & RTE_MBUF_F_TX_VLAN &&
 	    vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2)
 		return 1;
+	if (rte_mbuf_dynflag_lookup(IAVF_TX_LLDP_DYNFLAG, NULL) > 0)
+		return 1;
 	return 0;
 }
 
@@ -2445,6 +2447,9 @@ iavf_fill_ctx_desc_cmd_field(volatile uint64_t *field, struct rte_mbuf *m,
 		cmd |= IAVF_TX_CTX_DESC_IL2TAG2
 			<< IAVF_TXD_CTX_QW1_CMD_SHIFT;
 	}
+	if (rte_mbuf_dynflag_lookup(IAVF_TX_LLDP_DYNFLAG, NULL) > 0)
+		cmd |= IAVF_TX_CTX_DESC_SWTCH_UPLINK
+			<< IAVF_TXD_CTX_QW1_CMD_SHIFT;
 
 	*field |= cmd;
 }
@@ -4039,6 +4044,11 @@ iavf_set_tx_function(struct rte_eth_dev *dev)
 				dev->tx_pkt_prepare = iavf_prep_pkts;
 				PMD_DRV_LOG(DEBUG, "Using AVX512 OFFLOAD Vector Tx (port %d).",
 					    dev->data->port_id);
+			} else if (check_ret == IAVF_VECTOR_CTX_PATH) {
+				dev->tx_pkt_burst = iavf_xmit_pkts_vec_avx512_ctx;
+				dev->tx_pkt_prepare = iavf_prep_pkts;
+				PMD_DRV_LOG(DEBUG, "Using AVX512 CONTEXT Vector Tx (port %d).",
+					    dev->data->port_id);
 			} else {
 				dev->tx_pkt_burst = iavf_xmit_pkts_vec_avx512_ctx_offload;
 				dev->tx_pkt_prepare = iavf_prep_pkts;
diff --git a/drivers/net/iavf/iavf_rxtx.h b/drivers/net/iavf/iavf_rxtx.h
index f432f9d956..ee52864915 100644
--- a/drivers/net/iavf/iavf_rxtx.h
+++ b/drivers/net/iavf/iavf_rxtx.h
@@ -66,6 +66,7 @@
 #define IAVF_VECTOR_PATH 0
 #define IAVF_VECTOR_OFFLOAD_PATH 1
 #define IAVF_VECTOR_CTX_OFFLOAD_PATH 2
+#define IAVF_VECTOR_CTX_PATH 3
 
 #define DEFAULT_TX_RS_THRESH     32
 #define DEFAULT_TX_FREE_THRESH   32
@@ -752,6 +753,8 @@ uint16_t iavf_xmit_pkts_vec_avx512_offload(void *tx_queue,
 					   uint16_t nb_pkts);
 uint16_t iavf_xmit_pkts_vec_avx512_ctx_offload(void *tx_queue, struct rte_mbuf **tx_pkts,
 				  uint16_t nb_pkts);
+uint16_t iavf_xmit_pkts_vec_avx512_ctx(void *tx_queue, struct rte_mbuf **tx_pkts,
+				  uint16_t nb_pkts);
 int iavf_txq_vec_setup_avx512(struct iavf_tx_queue *txq);
 
 uint8_t iavf_proto_xtr_type_to_rxdid(uint8_t xtr_type);
diff --git a/drivers/net/iavf/iavf_rxtx_vec_avx512.c b/drivers/net/iavf/iavf_rxtx_vec_avx512.c
index 7a7df6d258..dc3354f331 100644
--- a/drivers/net/iavf/iavf_rxtx_vec_avx512.c
+++ b/drivers/net/iavf/iavf_rxtx_vec_avx512.c
@@ -2,6 +2,7 @@
  * Copyright(c) 2020 Intel Corporation
  */
 
+#include "rte_pmd_iavf.h"
 #include "iavf_rxtx_vec_common.h"
 
 #include <rte_vect.h>
@@ -2206,6 +2207,9 @@ ctx_vtx1(volatile struct iavf_tx_desc *txdp, struct rte_mbuf *pkt,
 			low_ctx_qw |= (uint64_t)pkt->vlan_tci << IAVF_TXD_CTX_QW0_L2TAG2_PARAM;
 		}
 	}
+	if (rte_mbuf_dynflag_lookup(IAVF_TX_LLDP_DYNFLAG, NULL) > 0)
+		high_ctx_qw |= IAVF_TX_CTX_DESC_SWTCH_UPLINK
+			<< IAVF_TXD_CTX_QW1_CMD_SHIFT;
 	uint64_t high_data_qw = (IAVF_TX_DESC_DTYPE_DATA |
 				((uint64_t)flags  << IAVF_TXD_QW1_CMD_SHIFT) |
 				((uint64_t)pkt->data_len << IAVF_TXD_QW1_TX_BUF_SZ_SHIFT));
@@ -2258,6 +2262,9 @@ ctx_vtx(volatile struct iavf_tx_desc *txdp,
 					(uint64_t)pkt[1]->vlan_tci << IAVF_TXD_QW1_L2TAG1_SHIFT;
 			}
 		}
+		if (rte_mbuf_dynflag_lookup(IAVF_TX_LLDP_DYNFLAG, NULL) > 0)
+			hi_ctx_qw1 |= IAVF_TX_CTX_DESC_SWTCH_UPLINK
+				<< IAVF_TXD_CTX_QW1_CMD_SHIFT;
 
 		if (pkt[0]->ol_flags & RTE_MBUF_F_TX_VLAN) {
 			if (vlan_flag & IAVF_TX_FLAGS_VLAN_TAG_LOC_L2TAG2) {
@@ -2270,6 +2277,9 @@ ctx_vtx(volatile struct iavf_tx_desc *txdp,
 					(uint64_t)pkt[0]->vlan_tci << IAVF_TXD_QW1_L2TAG1_SHIFT;
 			}
 		}
+		if (rte_mbuf_dynflag_lookup(IAVF_TX_LLDP_DYNFLAG, NULL) > 0)
+			hi_ctx_qw0 |= IAVF_TX_CTX_DESC_SWTCH_UPLINK
+				<< IAVF_TXD_CTX_QW1_CMD_SHIFT;
 
 		if (offload) {
 			iavf_txd_enable_offload(pkt[1], &hi_data_qw1);
@@ -2520,3 +2530,10 @@ iavf_xmit_pkts_vec_avx512_ctx_offload(void *tx_queue, struct rte_mbuf **tx_pkts,
 {
 	return iavf_xmit_pkts_vec_avx512_ctx_cmn(tx_queue, tx_pkts, nb_pkts, true);
 }
+
+uint16_t
+iavf_xmit_pkts_vec_avx512_ctx(void *tx_queue, struct rte_mbuf **tx_pkts,
+				  uint16_t nb_pkts)
+{
+	return iavf_xmit_pkts_vec_avx512_ctx_cmn(tx_queue, tx_pkts, nb_pkts, false);
+}
diff --git a/drivers/net/iavf/iavf_rxtx_vec_common.h b/drivers/net/iavf/iavf_rxtx_vec_common.h
index e18cdc3f11..87e1d6c306 100644
--- a/drivers/net/iavf/iavf_rxtx_vec_common.h
+++ b/drivers/net/iavf/iavf_rxtx_vec_common.h
@@ -10,6 +10,7 @@
 
 #include "iavf.h"
 #include "iavf_rxtx.h"
+#include "rte_pmd_iavf.h"
 
 #ifndef __INTEL_COMPILER
 #pragma GCC diagnostic ignored "-Wcast-qual"
@@ -249,6 +250,11 @@ iavf_tx_vec_queue_default(struct iavf_tx_queue *txq)
 	if (txq->offloads & IAVF_TX_NO_VECTOR_FLAGS)
 		return -1;
 
+	if (rte_mbuf_dynflag_lookup(IAVF_TX_LLDP_DYNFLAG, NULL) > 0) {
+		txq->use_ctx = 1;
+		return IAVF_VECTOR_CTX_PATH;
+	}
+
 	/**
 	 * Vlan tci needs to be inserted via ctx desc, if the vlan_flag is L2TAG2.
 	 * Tunneling parameters and other fields need be configured in ctx desc
diff --git a/drivers/net/iavf/iavf_testpmd.c b/drivers/net/iavf/iavf_testpmd.c
new file mode 100644
index 0000000000..11788ac69e
--- /dev/null
+++ b/drivers/net/iavf/iavf_testpmd.c
@@ -0,0 +1,68 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2016 Intel Corporation.
+ */
+
+#include <stdlib.h>
+
+#include <rte_pmd_iavf.h>
+
+#include <cmdline_parse_num.h>
+#include <cmdline_parse_string.h>
+
+#include "testpmd.h"
+
+struct cmd_enable_tx_lldp_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t tx;
+	cmdline_fixed_string_t lldp;
+	cmdline_fixed_string_t what;
+};
+
+static cmdline_parse_token_string_t cmd_enable_tx_lldp_set =
+	TOKEN_STRING_INITIALIZER(struct cmd_enable_tx_lldp_result,
+		set, "set");
+static cmdline_parse_token_string_t cmd_enable_tx_lldp_tx =
+	TOKEN_STRING_INITIALIZER(struct cmd_enable_tx_lldp_result,
+		tx, "tx");
+static cmdline_parse_token_string_t cmd_enable_tx_lldp_lldp =
+	TOKEN_STRING_INITIALIZER(struct cmd_enable_tx_lldp_result,
+		lldp, "lldp");
+static cmdline_parse_token_string_t cmd_enable_tx_lldp_what =
+	TOKEN_STRING_INITIALIZER(struct cmd_enable_tx_lldp_result,
+		what, "on#off");
+
+static void
+cmd_enable_tx_lldp_parsed(void *parsed_result,
+	__rte_unused struct cmdline *cl, __rte_unused void *data)
+{
+	struct cmd_enable_tx_lldp_result *res = parsed_result;
+	const struct rte_mbuf_dynflag iavf_tx_lldp = { .name = { IAVF_TX_LLDP_DYNFLAG } };
+
+	if (strcmp(res->what, "on") == 0)
+		rte_mbuf_dynflag_register(&iavf_tx_lldp);
+}
+
+static cmdline_parse_inst_t cmd_enable_tx_lldp = {
+	.f = cmd_enable_tx_lldp_parsed,
+	.data = NULL,
+	.help_str = "set iavf tx lldp on|off",
+	.tokens = {
+		(void *)&cmd_enable_tx_lldp_set,
+		(void *)&cmd_enable_tx_lldp_tx,
+		(void *)&cmd_enable_tx_lldp_lldp,
+		(void *)&cmd_enable_tx_lldp_what,
+		NULL,
+	},
+};
+
+static struct testpmd_driver_commands iavf_cmds = {
+	.commands = {
+	{
+		&cmd_enable_tx_lldp,
+		"set tx lldp (on|off)\n"
+		"    Set iavf Tx lldp packet(currently only supported on)\n\n",
+	},
+	{ NULL, NULL },
+	},
+};
+TESTPMD_ADD_DRIVER_COMMANDS(iavf_cmds)
diff --git a/drivers/net/iavf/meson.build b/drivers/net/iavf/meson.build
index a6ce2725c3..83aebd5596 100644
--- a/drivers/net/iavf/meson.build
+++ b/drivers/net/iavf/meson.build
@@ -8,6 +8,9 @@ endif
 cflags += ['-Wno-strict-aliasing']
 
 includes += include_directories('../../common/iavf')
+
+testpmd_sources = files('iavf_testpmd.c')
+
 deps += ['common_iavf', 'security', 'cryptodev']
 
 sources = files(
diff --git a/drivers/net/iavf/rte_pmd_iavf.h b/drivers/net/iavf/rte_pmd_iavf.h
index 56d453fc4c..2c442b6a05 100644
--- a/drivers/net/iavf/rte_pmd_iavf.h
+++ b/drivers/net/iavf/rte_pmd_iavf.h
@@ -23,6 +23,8 @@
 extern "C" {
 #endif
 
+#define IAVF_TX_LLDP_DYNFLAG "intel_pmd_dynflag_tx_lldp"
+
 /**
  * The supported network flexible descriptor's extraction metadata format.
  */
-- 
2.34.1


^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2024-01-04  0:26 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-06  6:08 [PATCH] net/iavf: support Tx LLDP on scalar and AVX512 Zhichao Zeng
2023-12-14  6:58 ` [PATCH v2 0/3] " Zhichao Zeng
2023-12-14  6:58   ` [PATCH v2 1/3] net/iavf: support Tx LLDP on scalar Zhichao Zeng
2023-12-14  6:58   ` [PATCH v2 2/3] net/iavf: support Tx LLDP on AVX512 Zhichao Zeng
2023-12-14  6:58   ` [PATCH v2 3/3] net/iavf: add Tx LLDP command Zhichao Zeng
2023-12-20  9:32   ` [PATCH v3 0/3] net/iavf: support Tx LLDP on scalar and AVX512 Zhichao Zeng
2023-12-20  9:32     ` [PATCH v3 1/3] net/iavf: support Tx LLDP on scalar Zhichao Zeng
2023-12-21  7:28       ` [PATCH v4 0/3] net/iavf: support Tx LLDP on scalar and AVX512 Zhichao Zeng
2023-12-21  7:28         ` [PATCH v4 1/3] net/iavf: support Tx LLDP on scalar Zhichao Zeng
2023-12-27  4:34           ` Zhang, Qi Z
2023-12-21  7:28         ` [PATCH v4 2/3] net/iavf: support Tx LLDP on AVX512 Zhichao Zeng
2023-12-21  7:28         ` [PATCH v4 3/3] net/iavf: add Tx LLDP command Zhichao Zeng
2023-12-25  3:14         ` [PATCH v4 0/3] net/iavf: support Tx LLDP on scalar and AVX512 Zhichao Zeng
2023-12-25  3:14           ` [PATCH v4 1/3] net/iavf: support Tx LLDP on scalar Zhichao Zeng
2023-12-25  3:14           ` [PATCH v4 2/3] net/iavf: support Tx LLDP on AVX512 Zhichao Zeng
2023-12-25  3:14           ` [PATCH v4 3/3] net/iavf: add Tx LLDP command Zhichao Zeng
2023-12-28  3:22           ` [PATCH v5 0/3] net/iavf: support Tx LLDP on scalar and AVX512 Zhichao Zeng
2023-12-28  3:22             ` [PATCH v5 1/3] net/iavf: support Tx LLDP on scalar Zhichao Zeng
2023-12-28  3:22             ` [PATCH v5 2/3] net/iavf: support Tx LLDP on AVX512 Zhichao Zeng
2023-12-28  3:22             ` [PATCH v5 3/3] net/iavf: add Tx LLDP command Zhichao Zeng
2024-01-03  7:47             ` [PATCH v6 0/3] net/iavf: support Tx LLDP on scalar and AVX512 Zhichao Zeng
2024-01-03  7:47               ` [PATCH v6 1/3] net/iavf: support Tx LLDP on scalar Zhichao Zeng
2024-01-03  7:47               ` [PATCH v6 2/3] net/iavf: support Tx LLDP on AVX512 Zhichao Zeng
2024-01-03  7:47               ` [PATCH v6 3/3] net/iavf: add Tx LLDP command Zhichao Zeng
2024-01-04  0:26             ` [PATCH v5 0/3] net/iavf: support Tx LLDP on scalar and AVX512 Zhang, Qi Z
2023-12-20  9:32     ` [PATCH v3 2/3] net/iavf: support Tx LLDP on AVX512 Zhichao Zeng
2023-12-20  9:32     ` [PATCH v3 3/3] net/iavf: add Tx LLDP command Zhichao Zeng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).