DPDK patches and discussions
 help / color / mirror / Atom feed
From: Hemant Agrawal <hemant.agrawal@nxp.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v2 16/16] net/dpaa: implement scatter offload support
Date: Wed,  4 Jul 2018 15:13:51 +0530	[thread overview]
Message-ID: <1530697431-1244-16-git-send-email-hemant.agrawal@nxp.com> (raw)
In-Reply-To: <1530697431-1244-1-git-send-email-hemant.agrawal@nxp.com>

Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 drivers/net/dpaa/dpaa_ethdev.c | 75 +++++++++++++++++++++++++++++++++++++-----
 drivers/net/dpaa/dpaa_ethdev.h |  3 +-
 drivers/net/dpaa/dpaa_rxtx.c   |  4 +--
 drivers/net/dpaa/dpaa_rxtx.h   |  2 --
 4 files changed, 70 insertions(+), 14 deletions(-)

diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 5c0aafb..c49d3a5 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -47,7 +47,8 @@
 
 /* Supported Rx offloads */
 static uint64_t dev_rx_offloads_sup =
-		DEV_RX_OFFLOAD_JUMBO_FRAME;
+		DEV_RX_OFFLOAD_JUMBO_FRAME |
+		DEV_RX_OFFLOAD_SCATTER;
 
 /* Rx offloads which cannot be disabled */
 static uint64_t dev_rx_offloads_nodis =
@@ -55,8 +56,7 @@ static uint64_t dev_rx_offloads_nodis =
 		DEV_RX_OFFLOAD_UDP_CKSUM |
 		DEV_RX_OFFLOAD_TCP_CKSUM |
 		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-		DEV_RX_OFFLOAD_CRC_STRIP |
-		DEV_RX_OFFLOAD_SCATTER;
+		DEV_RX_OFFLOAD_CRC_STRIP;
 
 /* Supported Tx offloads */
 static uint64_t dev_tx_offloads_sup;
@@ -148,11 +148,30 @@ dpaa_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
 	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN
 				+ VLAN_TAG_SIZE;
+	uint32_t buffsz = dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM;
 
 	PMD_INIT_FUNC_TRACE();
 
 	if (mtu < ETHER_MIN_MTU || frame_size > DPAA_MAX_RX_PKT_LEN)
 		return -EINVAL;
+	/*
+	 * Refuse mtu that requires the support of scattered packets
+	 * when this feature has not been enabled before.
+	 */
+	if (dev->data->min_rx_buf_size &&
+		!dev->data->scattered_rx && frame_size > buffsz) {
+		DPAA_PMD_ERR("SG not enabled, will not fit in one buffer");
+		return -EINVAL;
+	}
+
+	/* check <seg size> * <max_seg>  >= max_frame */
+	if (dev->data->min_rx_buf_size && dev->data->scattered_rx &&
+		(frame_size > buffsz * DPAA_SGT_MAX_ENTRIES)) {
+		DPAA_PMD_ERR("Too big to fit for Max SG list %d",
+				buffsz * DPAA_SGT_MAX_ENTRIES);
+		return -EINVAL;
+	}
+
 	if (frame_size > ETHER_MAX_LEN)
 		dev->data->dev_conf.rxmode.offloads &=
 						DEV_RX_OFFLOAD_JUMBO_FRAME;
@@ -196,13 +215,24 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
 	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
 		if (dev->data->dev_conf.rxmode.max_rx_pkt_len <=
 		    DPAA_MAX_RX_PKT_LEN) {
+			DPAA_PMD_DEBUG("enabling jumbo");
 			fman_if_set_maxfrm(dpaa_intf->fif,
 				dev->data->dev_conf.rxmode.max_rx_pkt_len);
-			return 0;
+			dev->data->mtu =
+				dev->data->dev_conf.rxmode.max_rx_pkt_len -
+				ETHER_HDR_LEN - ETHER_CRC_LEN - VLAN_TAG_SIZE;
 		} else {
-			return -1;
+			DPAA_PMD_ERR("enabling jumbo err conf max len=%d "
+				"supported is %d",
+				dev->data->dev_conf.rxmode.max_rx_pkt_len,
+				DPAA_MAX_RX_PKT_LEN);
 		}
 	}
+	if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
+		DPAA_PMD_DEBUG("enabling scatter mode");
+		fman_if_set_sg(dpaa_intf->fif, 1);
+		dev->data->scattered_rx = 1;
+	}
 	return 0;
 }
 
@@ -300,7 +330,6 @@ static void dpaa_eth_dev_info(struct rte_eth_dev *dev,
 
 	dev_info->max_rx_queues = dpaa_intf->nb_rx_queues;
 	dev_info->max_tx_queues = dpaa_intf->nb_tx_queues;
-	dev_info->min_rx_bufsize = DPAA_MIN_RX_BUF_SIZE;
 	dev_info->max_rx_pktlen = DPAA_MAX_RX_PKT_LEN;
 	dev_info->max_mac_addrs = DPAA_MAX_MAC_FILTER;
 	dev_info->max_hash_mac_addrs = 0;
@@ -514,6 +543,7 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 	struct qm_mcc_initfq opts = {0};
 	u32 flags = 0;
 	int ret;
+	u32 buffsz = rte_pktmbuf_data_room_size(mp) - RTE_PKTMBUF_HEADROOM;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -527,6 +557,27 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 	DPAA_PMD_INFO("Rx queue setup for queue index: %d fq_id (0x%x)",
 			queue_idx, rxq->fqid);
 
+	/* Max packet can fit in single buffer */
+	if (dev->data->dev_conf.rxmode.max_rx_pkt_len <= buffsz) {
+		;
+	} else if (dev->data->dev_conf.rxmode.enable_scatter) {
+		if (dev->data->dev_conf.rxmode.max_rx_pkt_len >
+			buffsz * DPAA_SGT_MAX_ENTRIES) {
+			DPAA_PMD_ERR("max RxPkt size %d too big to fit "
+				"MaxSGlist %d",
+				dev->data->dev_conf.rxmode.max_rx_pkt_len,
+				buffsz * DPAA_SGT_MAX_ENTRIES);
+			rte_errno = EOVERFLOW;
+			return -rte_errno;
+		}
+	} else {
+		DPAA_PMD_WARN("The requested maximum Rx packet size (%u) is"
+		     " larger than a single mbuf (%u) and scattered"
+		     " mode has not been requested",
+		     dev->data->dev_conf.rxmode.max_rx_pkt_len,
+		     buffsz - RTE_PKTMBUF_HEADROOM);
+	}
+
 	if (!dpaa_intf->bp_info || dpaa_intf->bp_info->mp != mp) {
 		struct fman_if_ic_params icp;
 		uint32_t fd_offset;
@@ -553,10 +604,13 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 		fman_if_set_bp(dpaa_intf->fif, mp->size,
 			       dpaa_intf->bp_info->bpid, bp_size);
 		dpaa_intf->valid = 1;
-		DPAA_PMD_INFO("if =%s - fd_offset = %d offset = %d",
-			    dpaa_intf->name, fd_offset,
-			fman_if_get_fdoff(dpaa_intf->fif));
+		DPAA_PMD_DEBUG("if:%s fd_offset = %d offset = %d",
+				dpaa_intf->name, fd_offset,
+				fman_if_get_fdoff(dpaa_intf->fif));
 	}
+	DPAA_PMD_DEBUG("if:%s sg_on = %d, max_frm =%d", dpaa_intf->name,
+		fman_if_get_sg_enable(dpaa_intf->fif),
+		dev->data->dev_conf.rxmode.max_rx_pkt_len);
 	/* checking if push mode only, no error check for now */
 	if (dpaa_push_mode_max_queue > dpaa_push_queue_idx) {
 		dpaa_push_queue_idx++;
@@ -1304,6 +1358,9 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)
 	fman_if_reset_mcast_filter_table(fman_intf);
 	/* Reset interface statistics */
 	fman_if_stats_reset(fman_intf);
+	/* Disable SG by default */
+	fman_if_set_sg(fman_intf, 0);
+	fman_if_set_maxfrm(fman_intf, ETHER_MAX_LEN + VLAN_TAG_SIZE);
 
 	return 0;
 
diff --git a/drivers/net/dpaa/dpaa_ethdev.h b/drivers/net/dpaa/dpaa_ethdev.h
index c79b9f8..1e7a656 100644
--- a/drivers/net/dpaa/dpaa_ethdev.h
+++ b/drivers/net/dpaa/dpaa_ethdev.h
@@ -39,9 +39,10 @@
 /* Alignment to use for cpu-local structs to avoid coherency problems. */
 #define MAX_CACHELINE			64
 
-#define DPAA_MIN_RX_BUF_SIZE 512
 #define DPAA_MAX_RX_PKT_LEN  10240
 
+#define DPAA_SGT_MAX_ENTRIES 16 /* maximum number of entries in SG Table */
+
 /* RX queue tail drop threshold (CGR Based) in frame count */
 #define CGR_RX_PERFQ_THRESH 256
 
diff --git a/drivers/net/dpaa/dpaa_rxtx.c b/drivers/net/dpaa/dpaa_rxtx.c
index 168b77e..6e96a80 100644
--- a/drivers/net/dpaa/dpaa_rxtx.c
+++ b/drivers/net/dpaa/dpaa_rxtx.c
@@ -306,8 +306,6 @@ dpaa_eth_sg_to_mbuf(const struct qm_fd *fd, uint32_t ifid)
 	int i = 0;
 	uint8_t fd_offset = fd->offset;
 
-	DPAA_DP_LOG(DEBUG, "Received an SG frame");
-
 	vaddr = DPAA_MEMPOOL_PTOV(bp_info, qm_fd_addr(fd));
 	if (!vaddr) {
 		DPAA_PMD_ERR("unable to convert physical address");
@@ -349,6 +347,8 @@ dpaa_eth_sg_to_mbuf(const struct qm_fd *fd, uint32_t ifid)
 		}
 		prev_seg = cur_seg;
 	}
+	DPAA_DP_LOG(DEBUG, "Received an SG frame len =%d, num_sg =%d",
+			first_seg->pkt_len, first_seg->nb_segs);
 
 	dpaa_eth_packet_info(first_seg, vaddr);
 	rte_pktmbuf_free_seg(temp);
diff --git a/drivers/net/dpaa/dpaa_rxtx.h b/drivers/net/dpaa/dpaa_rxtx.h
index d3e6351..6de70a7 100644
--- a/drivers/net/dpaa/dpaa_rxtx.h
+++ b/drivers/net/dpaa/dpaa_rxtx.h
@@ -32,8 +32,6 @@
 /* L4 Type field: TCP */
 #define DPAA_L4_PARSE_RESULT_TCP	0x20
 
-#define DPAA_SGT_MAX_ENTRIES 16 /* maximum number of entries in SG Table */
-
 #define DPAA_MAX_DEQUEUE_NUM_FRAMES    63
 	/** <Maximum number of frames to be dequeued in a single rx call*/
 
-- 
2.7.4

  parent reply	other threads:[~2018-07-04  9:45 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-21  9:43 [dpdk-dev] [PATCH 01/10] bus/dpaa: fix phandle support for kernel 4.16 Hemant Agrawal
2018-06-21  9:43 ` [dpdk-dev] [PATCH 02/10] bus/dpaa: fix svr id fetch location Hemant Agrawal
2018-06-21  9:43 ` [dpdk-dev] [PATCH 03/10] bus/dpaa: optimize the fq callback routine Hemant Agrawal
2018-06-21  9:43 ` [dpdk-dev] [PATCH 04/10] bus/dpaa: implement new of API to get MAC address Hemant Agrawal
2018-06-21  9:43 ` [dpdk-dev] [PATCH 05/10] bus/dpaa: make vdqcr configurable Hemant Agrawal
2018-06-21  9:44 ` [dpdk-dev] [PATCH 06/10] net/dpaa: support default queue mode Hemant Agrawal
2018-06-21  9:44 ` [dpdk-dev] [PATCH 07/10] net/dpaa: remove experimental tag from PMD APIs Hemant Agrawal
2018-06-21  9:44 ` [dpdk-dev] [PATCH 08/10] net/dpaa2: fix the prefetch Rx to honor nb pkts Hemant Agrawal
2018-06-21  9:44 ` [dpdk-dev] [PATCH 09/10] bus/dpaa: cleanup unnecessary global variables Hemant Agrawal
2018-06-21  9:44 ` [dpdk-dev] [PATCH 10/10] bus/fslmc: " Hemant Agrawal
2018-07-04  9:43 ` [dpdk-dev] [PATCH v2 01/16] bus/dpaa: fix phandle support for kernel 4.16 Hemant Agrawal
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 02/16] bus/dpaa: fix svr id fetch location Hemant Agrawal
2018-07-06  4:44     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 03/16] bus/dpaa: fix the buffer offset setting in FMAN Hemant Agrawal
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 04/16] net/dpaa: fix the queue err handling and logs Hemant Agrawal
2018-07-06  4:56     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 05/16] net/dpaa2: fix the prefetch Rx to honor nb pkts Hemant Agrawal
2018-07-06  5:01     ` Shreyansh Jain
2018-07-06  8:13       ` Hemant Agrawal
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 06/16] bus/dpaa: optimize the fq callback routine Hemant Agrawal
2018-07-06  5:07     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 07/16] bus/dpaa: implement new of API to get MAC address Hemant Agrawal
2018-07-06  5:24     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 08/16] bus/dpaa: make vdqcr configurable Hemant Agrawal
2018-07-06  5:24     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 09/16] net/dpaa: support default queue mode Hemant Agrawal
2018-07-06  5:28     ` Shreyansh Jain
2018-07-06  8:13       ` Hemant Agrawal
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 10/16] net/dpaa: remove experimental tag from PMD APIs Hemant Agrawal
2018-07-06  5:29     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 11/16] bus/dpaa: cleanup unnecessary global variables Hemant Agrawal
2018-07-06  4:36     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 12/16] bus/fslmc: " Hemant Agrawal
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 13/16] drivers: support function name in logs trace Hemant Agrawal
2018-07-06  6:34     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 14/16] net/dpaa: move the push queue set to global init Hemant Agrawal
2018-07-06  6:35     ` Shreyansh Jain
2018-07-04  9:43   ` [dpdk-dev] [PATCH v2 15/16] bus/dpaa: add support for SG config Hemant Agrawal
2018-07-06  4:38     ` Shreyansh Jain
2018-07-04  9:43   ` Hemant Agrawal [this message]
2018-07-06  6:41     ` [dpdk-dev] [PATCH v2 16/16] net/dpaa: implement scatter offload support Shreyansh Jain
2018-07-04 10:59   ` [dpdk-dev] [PATCH v2 01/16] bus/dpaa: fix phandle support for kernel 4.16 Shreyansh Jain
2018-07-06  8:09   ` [dpdk-dev] [PATCH v3 " Hemant Agrawal
2018-07-06  8:09     ` [dpdk-dev] [PATCH v3 02/16] bus/dpaa: fix svr id fetch location Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 03/16] bus/dpaa: fix the buffer offset setting in FMAN Hemant Agrawal
2018-07-06 12:28       ` Shreyansh Jain
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 04/16] net/dpaa: fix the queue err handling and logs Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 05/16] net/dpaa2: fix the prefetch Rx to honor nb pkts Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 06/16] bus/dpaa: optimize the fq callback routine Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 07/16] bus/dpaa: implement new of API to get MAC address Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 08/16] bus/dpaa: make vdqcr configurable Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 09/16] net/dpaa: support default queue mode Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 10/16] net/dpaa: remove experimental tag from PMD APIs Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 11/16] bus/dpaa: cleanup unnecessary global variables Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 12/16] bus/fslmc: " Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 13/16] drivers: support function name in logs trace Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 14/16] net/dpaa: move the push queue set to global init Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 15/16] bus/dpaa: add support for SG config Hemant Agrawal
2018-07-06  8:10     ` [dpdk-dev] [PATCH v3 16/16] net/dpaa: implement scatter offload support Hemant Agrawal
2018-07-12 12:23       ` Thomas Monjalon
2018-07-13  6:32         ` Shreyansh Jain
2018-07-12 12:49     ` [dpdk-dev] [PATCH v3 01/16] bus/dpaa: fix phandle support for kernel 4.16 Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1530697431-1244-16-git-send-email-hemant.agrawal@nxp.com \
    --to=hemant.agrawal@nxp.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).