DPDK patches and discussions
 help / color / mirror / Atom feed
From: Helin Zhang <helin.zhang@intel.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH v2 11/13] i40e: rework of updating/querying reta
Date: Thu, 25 Sep 2014 16:40:25 +0800
Message-ID: <1411634427-746-12-git-send-email-helin.zhang@intel.com> (raw)
In-Reply-To: <1411634427-746-1-git-send-email-helin.zhang@intel.com>

As ethdev has been changed to support multiple sizes of reta,
updating/querying reta should be reworked to support that change.

v2 changes:
* Put rework of updating/querying i40e reta to a single patch.

Signed-off-by: Helin Zhang <helin.zhang@intel.com>
Reviewed-by: Jijiang Liu <jijiang.liu@intel.com>
Reviewed-by: Cunming Liang <cunming.liang@intel.com>
Reviewed-by: Jingjing Wu <jingjing.wu@intel.com>
---
 lib/librte_pmd_i40e/i40e_ethdev.c | 93 ++++++++++++++++++++++-----------------
 lib/librte_pmd_i40e/i40e_ethdev.h | 12 +++++
 2 files changed, 65 insertions(+), 40 deletions(-)

diff --git a/lib/librte_pmd_i40e/i40e_ethdev.c b/lib/librte_pmd_i40e/i40e_ethdev.c
index 9fe3f7a..6338e1b 100644
--- a/lib/librte_pmd_i40e/i40e_ethdev.c
+++ b/lib/librte_pmd_i40e/i40e_ethdev.c
@@ -72,14 +72,6 @@
 /* Maximun number of VSI */
 #define I40E_MAX_NUM_VSIS          (384UL)
 
-/* Bit shift and mask */
-#define I40E_16_BIT_SHIFT 16
-#define I40E_16_BIT_MASK  0xFFFF
-#define I40E_32_BIT_SHIFT 32
-#define I40E_32_BIT_MASK  0xFFFFFFFF
-#define I40E_48_BIT_SHIFT 48
-#define I40E_48_BIT_MASK  0xFFFFFFFFFFFFULL
-
 /* Default queue interrupt throttling time in microseconds*/
 #define I40E_ITR_INDEX_DEFAULT          0
 #define I40E_QUEUE_ITR_INTERVAL_DEFAULT 32 /* 32 us */
@@ -160,9 +152,11 @@ static void i40e_macaddr_add(struct rte_eth_dev *dev,
 			  uint32_t pool);
 static void i40e_macaddr_remove(struct rte_eth_dev *dev, uint32_t index);
 static int i40e_dev_rss_reta_update(struct rte_eth_dev *dev,
-				    struct rte_eth_rss_reta *reta_conf);
+				    struct rte_eth_rss_reta_entry64 *reta_conf,
+				    uint16_t reta_size);
 static int i40e_dev_rss_reta_query(struct rte_eth_dev *dev,
-				   struct rte_eth_rss_reta *reta_conf);
+				   struct rte_eth_rss_reta_entry64 *reta_conf,
+				   uint16_t reta_size);
 
 static int i40e_get_cap(struct i40e_hw *hw);
 static int i40e_pf_parameter_init(struct rte_eth_dev *dev);
@@ -1590,32 +1584,41 @@ i40e_macaddr_remove(struct rte_eth_dev *dev, uint32_t index)
 
 static int
 i40e_dev_rss_reta_update(struct rte_eth_dev *dev,
-			 struct rte_eth_rss_reta *reta_conf)
+			 struct rte_eth_rss_reta_entry64 *reta_conf,
+			 uint16_t reta_size)
 {
+	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t lut, l;
-	uint8_t i, j, mask, max = ETH_RSS_RETA_NUM_ENTRIES / 2;
-
-	for (i = 0; i < ETH_RSS_RETA_NUM_ENTRIES; i += 4) {
-		if (i < max)
-			mask = (uint8_t)((reta_conf->mask_lo >> i) & 0xF);
-		else
-			mask = (uint8_t)((reta_conf->mask_hi >>
-						(i - max)) & 0xF);
+	uint16_t i, j, lut_size = pf->hash_lut_size;
+	uint16_t idx, shift;
+	uint8_t mask;
+
+	if (reta_size != lut_size ||
+		reta_size > ETH_RSS_RETA_SIZE_512) {
+		PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
+			"(%d) doesn't match the number hardware can supported "
+					"(%d)\n", reta_size, lut_size);
+		return -EINVAL;
+	}
 
+	for (i = 0; i < reta_size; i += I40E_4_BIT_WIDTH) {
+		idx = i / RTE_BIT_WIDTH_64;
+		shift = i % RTE_BIT_WIDTH_64;
+		mask = (uint8_t)((reta_conf[idx].mask >> shift) &
+						I40E_4_BIT_MASK);
 		if (!mask)
 			continue;
-
-		if (mask == 0xF)
+		if (mask == I40E_4_BIT_MASK)
 			l = 0;
 		else
 			l = I40E_READ_REG(hw, I40E_PFQF_HLUT(i >> 2));
-
-		for (j = 0, lut = 0; j < 4; j++) {
+		for (j = 0, lut = 0; j < I40E_4_BIT_WIDTH; j++) {
 			if (mask & (0x1 << j))
-				lut |= reta_conf->reta[i + j] << (8 * j);
+				lut |= reta_conf[idx].reta[shift + j] <<
+							(CHAR_BIT * j);
 			else
-				lut |= l & (0xFF << (8 * j));
+				lut |= l & (I40E_8_BIT_MASK << (CHAR_BIT * j));
 		}
 		I40E_WRITE_REG(hw, I40E_PFQF_HLUT(i >> 2), lut);
 	}
@@ -1625,27 +1628,37 @@ i40e_dev_rss_reta_update(struct rte_eth_dev *dev,
 
 static int
 i40e_dev_rss_reta_query(struct rte_eth_dev *dev,
-			struct rte_eth_rss_reta *reta_conf)
+			struct rte_eth_rss_reta_entry64 *reta_conf,
+			uint16_t reta_size)
 {
+	struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 	uint32_t lut;
-	uint8_t i, j, mask, max = ETH_RSS_RETA_NUM_ENTRIES / 2;
-
-	for (i = 0; i < ETH_RSS_RETA_NUM_ENTRIES; i += 4) {
-		if (i < max)
-			mask = (uint8_t)((reta_conf->mask_lo >> i) & 0xF);
-		else
-			mask = (uint8_t)((reta_conf->mask_hi >>
-						(i - max)) & 0xF);
+	uint16_t i, j, lut_size = pf->hash_lut_size;
+	uint16_t idx, shift;
+	uint8_t mask;
+
+	if (reta_size != lut_size ||
+		reta_size > ETH_RSS_RETA_SIZE_512) {
+		PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
+			"(%d) doesn't match the number hardware can supported "
+					"(%d)\n", reta_size, lut_size);
+		return -EINVAL;
+	}
 
+	for (i = 0; i < reta_size; i += I40E_4_BIT_WIDTH) {
+		idx = i / RTE_BIT_WIDTH_64;
+		shift = i % RTE_BIT_WIDTH_64;
+		mask = (uint8_t)((reta_conf[idx].mask >> shift) &
+						I40E_4_BIT_MASK);
 		if (!mask)
 			continue;
 
 		lut = I40E_READ_REG(hw, I40E_PFQF_HLUT(i >> 2));
-		for (j = 0; j < 4; j++) {
+		for (j = 0; j < I40E_4_BIT_WIDTH; j++) {
 			if (mask & (0x1 << j))
-				reta_conf->reta[i + j] =
-					(uint8_t)((lut >> (8 * j)) & 0xFF);
+				reta_conf[idx].reta[shift] = ((lut >>
+					(CHAR_BIT * j)) & I40E_8_BIT_MASK);
 		}
 	}
 
@@ -3225,7 +3238,7 @@ i40e_stat_update_32(struct i40e_hw *hw,
 		*stat = (uint64_t)(new_data - *offset);
 	else
 		*stat = (uint64_t)((new_data +
-			((uint64_t)1 << I40E_32_BIT_SHIFT)) - *offset);
+			((uint64_t)1 << I40E_32_BIT_WIDTH)) - *offset);
 }
 
 static void
@@ -3240,7 +3253,7 @@ i40e_stat_update_48(struct i40e_hw *hw,
 
 	new_data = (uint64_t)I40E_READ_REG(hw, loreg);
 	new_data |= ((uint64_t)(I40E_READ_REG(hw, hireg) &
-			I40E_16_BIT_MASK)) << I40E_32_BIT_SHIFT;
+			I40E_16_BIT_MASK)) << I40E_32_BIT_WIDTH;
 
 	if (!offset_loaded)
 		*offset = new_data;
@@ -3249,7 +3262,7 @@ i40e_stat_update_48(struct i40e_hw *hw,
 		*stat = new_data - *offset;
 	else
 		*stat = (uint64_t)((new_data +
-			((uint64_t)1 << I40E_48_BIT_SHIFT)) - *offset);
+			((uint64_t)1 << I40E_48_BIT_WIDTH)) - *offset);
 
 	*stat &= I40E_48_BIT_MASK;
 }
diff --git a/lib/librte_pmd_i40e/i40e_ethdev.h b/lib/librte_pmd_i40e/i40e_ethdev.h
index a1a2e75..336e936 100644
--- a/lib/librte_pmd_i40e/i40e_ethdev.h
+++ b/lib/librte_pmd_i40e/i40e_ethdev.h
@@ -52,6 +52,18 @@
 /* Default TC traffic in case DCB is not enabled */
 #define I40E_DEFAULT_TCMAP        0x1
 
+/* Bit shift and mask */
+#define I40E_4_BIT_WIDTH  (CHAR_BIT / 2)
+#define I40E_4_BIT_MASK   ((1 << I40E_4_BIT_WIDTH) - 1)
+#define I40E_8_BIT_WIDTH  CHAR_BIT
+#define I40E_8_BIT_MASK   ((1 << I40E_8_BIT_WIDTH) - 1)
+#define I40E_16_BIT_WIDTH (CHAR_BIT * 2)
+#define I40E_16_BIT_MASK  ((1 << I40E_16_BIT_WIDTH) - 1)
+#define I40E_32_BIT_WIDTH (CHAR_BIT * 4)
+#define I40E_32_BIT_MASK  ((1 << I40E_32_BIT_WIDTH) - 1)
+#define I40E_48_BIT_WIDTH (CHAR_BIT * 6)
+#define I40E_48_BIT_MASK  ((1ULL << I40E_48_BIT_WIDTH) - 1)
+
 /* i40e flags */
 #define I40E_FLAG_RSS                   (1ULL << 0)
 #define I40E_FLAG_DCB                   (1ULL << 1)
-- 
1.8.1.4

  parent reply	other threads:[~2014-09-25  8:35 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-25  8:40 [dpdk-dev] [PATCH v2 00/13] support of multiple sizes of redirection table Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 01/13] app/testpmd: code style fix Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 02/13] i40evf: " Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 03/13] ethdev: add more annotation Helin Zhang
2014-10-21 20:38   ` Thomas Monjalon
2014-10-21 22:20     ` Zhang, Helin
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 04/13] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-10-21 20:53   ` Thomas Monjalon
2014-10-28  0:33     ` Zhang, Helin
2014-10-28 10:10       ` Thomas Monjalon
2014-10-28 10:18         ` Richardson, Bruce
2014-10-28 13:20           ` Zhang, Helin
2014-10-28 14:22             ` Thomas Monjalon
2014-10-29  8:18               ` Zhang, Helin
2014-10-28 12:00         ` Zhang, Helin
2014-10-28 12:13           ` Thomas Monjalon
2014-10-28 12:36             ` Zhang, Helin
2014-10-29  8:24           ` Zhang, Helin
2014-10-29 10:00             ` Thomas Monjalon
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 05/13] igb: add new function for VF ops of 'dev_infos_get' Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 06/13] igb: rework of updating/querying reta Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 07/13] ixgbe: add new function for VF ops of 'dev_infos_get' Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 08/13] ixgbe: rework of updating/querying reta Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 09/13] i40e: support of setting hash lookup table size Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 10/13] i40e: support of getting redirection " Helin Zhang
2014-09-25  8:40 ` Helin Zhang [this message]
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 12/13] i40evf: support of updating/querying redirection table Helin Zhang
2014-09-25  8:40 ` [dpdk-dev] [PATCH v2 13/13] app/testpmd: rework of commands for updating/querying reta Helin Zhang
2014-10-10  3:11 ` [dpdk-dev] [PATCH v2 00/13] support of multiple sizes of redirection table Liang, Cunming
2014-10-22 11:53 ` [dpdk-dev] [PATCH v3 0/8] " Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 1/8] app/testpmd: code style fix Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 2/8] i40evf: " Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 3/8] i40e: support of setting hash lookup table size Helin Zhang
2014-10-27 14:13     ` Thomas Monjalon
2014-10-27 20:21       ` Matthew Hall
2014-10-27 21:41         ` Thomas Monjalon
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 4/8] igb: implement ops of 'dev_infos_get' for PF and VF respectively Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 5/8] ixgbe: " Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 6/8] i40e: rework of ops of 'dev_infos_get' for both PF and VF Helin Zhang
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 7/8] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-10-27 14:23     ` Thomas Monjalon
2014-10-28  0:37       ` Zhang, Helin
2014-10-28 10:04         ` Thomas Monjalon
2014-10-31  1:39           ` Zhang, Helin
2014-10-31  8:46             ` Thomas Monjalon
2014-10-22 11:53   ` [dpdk-dev] [PATCH v3 8/8] i40evf: support of updating/querying " Helin Zhang
2014-10-31  9:03   ` [dpdk-dev] [PATCH v4 0/8] support of multiple sizes of " Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 1/8] app/testpmd: code style fix Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 2/8] i40evf: " Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 3/8] i40e: support of setting hash lookup table size Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 4/8] igb: implement ops of 'dev_infos_get' for PF and VF respectively Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 5/8] ixgbe: " Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 6/8] i40e: rework of ops of 'dev_infos_get' for both PF and VF Helin Zhang
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 7/8] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-11-05 20:52       ` Thomas Monjalon
2014-11-06  1:02         ` Zhang, Helin
2014-11-06  8:33           ` Thomas Monjalon
2014-11-06  8:52             ` Zhang, Helin
2014-10-31  9:03     ` [dpdk-dev] [PATCH v4 8/8] i40evf: support of updating/querying " Helin Zhang
2014-11-06 14:25     ` [dpdk-dev] [PATCH v5 0/8] support of multiple sizes of " Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 1/8] app/testpmd: code style fix Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 2/8] i40evf: " Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 3/8] i40e: support of setting hash lookup table size Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 4/8] igb: implement ops of 'dev_infos_get' for PF and VF respectively Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 5/8] ixgbe: " Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 6/8] i40e: rework of ops of 'dev_infos_get' for both PF and VF Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 7/8] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-11-06 14:25       ` [dpdk-dev] [PATCH v5 8/8] i40evf: support of updating/querying " Helin Zhang
2014-11-15 16:03       ` [dpdk-dev] [PATCH v6 0/8] support of multiple sizes of " Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 1/8] app/testpmd: code style fix Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 2/8] i40evf: " Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 3/8] i40e: support of setting hash lookup table size Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 4/8] igb: implement ops of 'dev_infos_get' for PF and VF respectively Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 5/8] ixgbe: " Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 6/8] i40e: rework of ops of 'dev_infos_get' for both PF and VF Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 7/8] ethdev: support of multiple sizes of redirection table Helin Zhang
2014-11-15 16:03         ` [dpdk-dev] [PATCH v6 8/8] i40evf: support of updating/querying " Helin Zhang
2014-11-24 22:20           ` Thomas Monjalon
2014-11-25  0:28             ` Zhang, Helin
2014-11-17 13:39         ` [dpdk-dev] [PATCH v6 0/8] support of multiple sizes of " Ananyev, Konstantin
2014-11-24 22:00           ` Thomas Monjalon
2014-11-19  9:28         ` Chen, Erlu

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=1411634427-746-12-git-send-email-helin.zhang@intel.com \
    --to=helin.zhang@intel.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

DPDK patches and discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \
		dev@dpdk.org
	public-inbox-index dev

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.dpdk.org/inbox.dpdk.dev


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git