net/cxgbe: support getting RSS hash configuration and key
authorKumar Sanghvi <kumaras@chelsio.com>
Wed, 28 Feb 2018 18:04:49 +0000 (23:34 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 30 Mar 2018 12:08:43 +0000 (14:08 +0200)
Original work by Surendra Mobiya <surendra@chelsio.com>

Signed-off-by: Kumar Sanghvi <kumaras@chelsio.com>
Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
drivers/net/cxgbe/base/common.h
drivers/net/cxgbe/base/t4_hw.c
drivers/net/cxgbe/cxgbe_ethdev.c

index 5301f74..dd282a9 100644 (file)
@@ -410,9 +410,12 @@ int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid,
                        int start, int n, const u16 *rspq, unsigned int nrspq);
 int t4_config_vi_rss(struct adapter *adapter, int mbox, unsigned int viid,
                     unsigned int flags, unsigned int defq);
+int t4_read_config_vi_rss(struct adapter *adapter, int mbox, unsigned int viid,
+                         u64 *flags, unsigned int *defq);
 void t4_fw_tp_pio_rw(struct adapter *adap, u32 *vals, unsigned int nregs,
                     unsigned int start_index, unsigned int rw);
 void t4_write_rss_key(struct adapter *adap, u32 *key, int idx);
+void t4_read_rss_key(struct adapter *adap, u32 *key);
 
 enum t4_bar2_qtype { T4_BAR2_QTYPE_EGRESS, T4_BAR2_QTYPE_INGRESS };
 int t4_bar2_sge_qregs(struct adapter *adapter, unsigned int qid,
index 9eb83fd..2d72146 100644 (file)
@@ -2203,6 +2203,18 @@ void t4_fw_tp_pio_rw(struct adapter *adap, u32 *vals, unsigned int nregs,
        }
 }
 
+/**
+ * t4_read_rss_key - read the global RSS key
+ * @adap: the adapter
+ * @key: 10-entry array holding the 320-bit RSS key
+ *
+ * Reads the global 320-bit RSS key.
+ */
+void t4_read_rss_key(struct adapter *adap, u32 *key)
+{
+       t4_fw_tp_pio_rw(adap, key, 10, A_TP_RSS_SECRET_KEY0, 1);
+}
+
 /**
  * t4_write_rss_key - program one of the RSS keys
  * @adap: the adapter
@@ -2363,6 +2375,40 @@ int t4_config_vi_rss(struct adapter *adapter, int mbox, unsigned int viid,
        return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
 }
 
+/**
+ * t4_read_config_vi_rss - read the configured per VI RSS settings
+ * @adapter: the adapter
+ * @mbox: mbox to use for the FW command
+ * @viid: the VI id
+ * @flags: where to place the configured flags
+ * @defq: where to place the id of the default RSS queue for the VI.
+ *
+ * Read configured VI-specific RSS properties.
+ */
+int t4_read_config_vi_rss(struct adapter *adapter, int mbox, unsigned int viid,
+                         u64 *flags, unsigned int *defq)
+{
+       struct fw_rss_vi_config_cmd c;
+       unsigned int result;
+       int ret;
+
+       memset(&c, 0, sizeof(c));
+       c.op_to_viid = cpu_to_be32(V_FW_CMD_OP(FW_RSS_VI_CONFIG_CMD) |
+                                  F_FW_CMD_REQUEST | F_FW_CMD_READ |
+                                  V_FW_RSS_VI_CONFIG_CMD_VIID(viid));
+       c.retval_len16 = cpu_to_be32(FW_LEN16(c));
+       ret = t4_wr_mbox(adapter, mbox, &c, sizeof(c), &c);
+       if (!ret) {
+               result = be32_to_cpu(c.u.basicvirtual.defaultq_to_udpen);
+               if (defq)
+                       *defq = G_FW_RSS_VI_CONFIG_CMD_DEFAULTQ(result);
+               if (flags)
+                       *flags = result & M_FW_RSS_VI_CONFIG_CMD_DEFAULTQ;
+       }
+
+       return ret;
+}
+
 /**
  * init_cong_ctrl - initialize congestion control parameters
  * @a: the alpha values for congestion control
index b67dcb7..a38ef56 100644 (file)
@@ -819,6 +819,58 @@ static int cxgbe_dev_rss_hash_update(struct rte_eth_dev *dev,
        return 0;
 }
 
+/* Get RSS hash configuration
+ */
+static int cxgbe_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
+                                      struct rte_eth_rss_conf *rss_conf)
+{
+       struct port_info *pi = (struct port_info *)(dev->data->dev_private);
+       struct adapter *adapter = pi->adapter;
+       u64 rss_hf = 0;
+       u64 flags = 0;
+       int err;
+
+       err = t4_read_config_vi_rss(adapter, adapter->mbox, pi->viid,
+                                   &flags, NULL);
+
+       if (err)
+               return err;
+
+       if (flags & F_FW_RSS_VI_CONFIG_CMD_IP6FOURTUPEN) {
+               rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
+               if (flags & F_FW_RSS_VI_CONFIG_CMD_UDPEN)
+                       rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
+       }
+
+       if (flags & F_FW_RSS_VI_CONFIG_CMD_IP6TWOTUPEN)
+               rss_hf |= ETH_RSS_IPV6;
+
+       if (flags & F_FW_RSS_VI_CONFIG_CMD_IP4FOURTUPEN) {
+               rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
+               if (flags & F_FW_RSS_VI_CONFIG_CMD_UDPEN)
+                       rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
+       }
+
+       if (flags & F_FW_RSS_VI_CONFIG_CMD_IP4TWOTUPEN)
+               rss_hf |= ETH_RSS_IPV4;
+
+       rss_conf->rss_hf = rss_hf;
+
+       if (rss_conf->rss_key) {
+               u32 key[10], mod_key[10];
+               int i, j;
+
+               t4_read_rss_key(adapter, key);
+
+               for (i = 9, j = 0; i >= 0; i--, j++)
+                       mod_key[j] = be32_to_cpu(key[i]);
+
+               memcpy(rss_conf->rss_key, mod_key, CXGBE_DEFAULT_RSS_KEY_LEN);
+       }
+
+       return 0;
+}
+
 static int cxgbe_get_eeprom_length(struct rte_eth_dev *dev)
 {
        RTE_SET_USED(dev);
@@ -1018,6 +1070,7 @@ static const struct eth_dev_ops cxgbe_eth_dev_ops = {
        .set_eeprom             = cxgbe_set_eeprom,
        .get_reg                = cxgbe_get_regs,
        .rss_hash_update        = cxgbe_dev_rss_hash_update,
+       .rss_hash_conf_get      = cxgbe_dev_rss_hash_conf_get,
 };
 
 /*