net/cxgbe: support getting RSS hash configuration and key

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>
This commit is contained in:
Kumar Sanghvi 2018-02-28 23:34:49 +05:30 committed by Ferruh Yigit
parent 08e21af90d
commit 76aba8d75a
3 changed files with 102 additions and 0 deletions

View 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,

View 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

View 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,
};
/*