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:
parent
08e21af90d
commit
76aba8d75a
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user