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 ixgbe reta to a single patch.

Signed-off-by: Helin Zhang <helin.zhang at intel.com>
Reviewed-by: Jijiang Liu <jijiang.liu at intel.com>
Reviewed-by: Cunming Liang <cunming.liang at intel.com>
Reviewed-by: Jingjing Wu <jingjing.wu at intel.com>
---
 lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 108 +++++++++++++++++++-----------------
 1 file changed, 57 insertions(+), 51 deletions(-)

diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c 
b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
index 56b3293..fc17fa2 100644
--- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
+++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
@@ -145,9 +145,11 @@ static int ixgbe_flow_ctrl_set(struct rte_eth_dev *dev,
 static int ixgbe_priority_flow_ctrl_set(struct rte_eth_dev *dev,
                struct rte_eth_pfc_conf *pfc_conf);
 static int ixgbe_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 ixgbe_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 void ixgbe_dev_link_status_print(struct rte_eth_dev *dev);
 static int ixgbe_dev_lsc_interrupt_setup(struct rte_eth_dev *dev);
 static int ixgbe_dev_interrupt_get_status(struct rte_eth_dev *dev);
@@ -2650,38 +2652,40 @@ ixgbe_priority_flow_ctrl_set(struct rte_eth_dev *dev, 
struct rte_eth_pfc_conf *p

 static int
 ixgbe_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)
 {
-       uint8_t i,j,mask;
-       uint32_t reta;
-       struct ixgbe_hw *hw =
-                       IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint8_t i, j, mask;
+       uint32_t reta, r;
+       uint16_t idx, shift;
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);

        PMD_INIT_FUNC_TRACE();
-       /*
-       * Update Redirection Table RETA[n],n=0...31,The redirection table has
-       * 128-entries in 32 registers
-        */
-       for(i = 0; i < ETH_RSS_RETA_NUM_ENTRIES; i += 4) {
-               if (i < ETH_RSS_RETA_NUM_ENTRIES/2)
-                       mask = (uint8_t)((reta_conf->mask_lo >> i) & 0xF);
+       if (reta_size != ETH_RSS_RETA_SIZE_128) {
+               PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
+                       "(%d) doesn't match the number hardware can supported "
+                       "(%d)\n", reta_size, ETH_RSS_RETA_SIZE_128);
+               return -EINVAL;
+       }
+
+       for (i = 0; i < reta_size; i += 4) {
+               idx = i / RTE_BIT_WIDTH_64;
+               shift = i % RTE_BIT_WIDTH_64;
+               mask = (uint8_t)((reta_conf[idx].mask >> shift) & 0xf);
+               if (!mask)
+                       continue;
+               if (mask == 0xf)
+                       r = 0;
                else
-                       mask = (uint8_t)((reta_conf->mask_hi >>
-                               (i - ETH_RSS_RETA_NUM_ENTRIES/2)) & 0xF);
-               if (mask != 0) {
-                       reta = 0;
-                       if (mask != 0xF)
-                               reta = IXGBE_READ_REG(hw,IXGBE_RETA(i >> 2));
-
-                       for (j = 0; j < 4; j++) {
-                               if (mask & (0x1 << j)) {
-                                       if (mask != 0xF)
-                                               reta &= ~(0xFF << 8 * j);
-                                       reta |= reta_conf->reta[i + j] << 8*j;
-                               }
-                       }
-                       IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2),reta);
+                       r = IXGBE_READ_REG(hw, IXGBE_RETA(i >> 2));
+               for (j = 0, reta = 0; j < 4; j++) {
+                       if (mask & (0x1 << j))
+                               reta |= reta_conf[idx].reta[shift + j] <<
+                                                       (CHAR_BIT * j);
+                       else
+                               reta |= r & (0xff << (CHAR_BIT * j));
                }
+               IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
        }

        return 0;
@@ -2689,32 +2693,34 @@ ixgbe_dev_rss_reta_update(struct rte_eth_dev *dev,

 static int
 ixgbe_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)
 {
-       uint8_t i,j,mask;
+       uint8_t i, j, mask;
        uint32_t reta;
-       struct ixgbe_hw *hw =
-                       IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       uint16_t idx, shift;
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);

        PMD_INIT_FUNC_TRACE();
-       /*
-        * Read Redirection Table RETA[n],n=0...31,The redirection table has
-        * 128-entries in 32 registers
-        */
-       for(i = 0; i < ETH_RSS_RETA_NUM_ENTRIES; i += 4) {
-               if (i < ETH_RSS_RETA_NUM_ENTRIES/2)
-                       mask = (uint8_t)((reta_conf->mask_lo >> i) & 0xF);
-               else
-                       mask = (uint8_t)((reta_conf->mask_hi >>
-                               (i - ETH_RSS_RETA_NUM_ENTRIES/2)) & 0xF);
-
-               if (mask != 0) {
-                       reta = IXGBE_READ_REG(hw,IXGBE_RETA(i >> 2));
-                       for (j = 0; j < 4; j++) {
-                               if (mask & (0x1 << j))
-                                       reta_conf->reta[i + j] =
-                                               (uint8_t)((reta >> 8 * j) & 
0xFF);
-                       }
+       if (reta_size != ETH_RSS_RETA_SIZE_128) {
+               PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
+                       "(%d) doesn't match the number hardware can supported "
+                               "(%d)\n", reta_size, ETH_RSS_RETA_SIZE_128);
+               return -EINVAL;
+       }
+
+       for (i = 0; i < ETH_RSS_RETA_SIZE_128; i += 4) {
+               idx = i / RTE_BIT_WIDTH_64;
+               shift = i % RTE_BIT_WIDTH_64;
+               mask = (uint8_t)((reta_conf[idx].mask >> shift) & 0xf);
+               if (!mask)
+                       continue;
+
+               reta = IXGBE_READ_REG(hw, IXGBE_RETA(i >> 2));
+               for (j = 0; j < 4; j++) {
+                       if (mask & (0x1 << j))
+                               reta_conf[idx].reta[shift + j] =
+                                       ((reta >> (CHAR_BIT * j)) & 0xff);
                }
        }

-- 
1.8.1.4

Reply via email to