@@ -4,6 +4,9 @@
; Refer to default.ini for the full list of available PMD features.
;
[Features]
+RSS hash = Y
+RSS key update = Y
+RSS reta update = Y
Linux = Y
ARMv8 = Y
x86-64 = Y
@@ -69,6 +69,33 @@ struct xsc_ioctl_mbox_out {
uint8_t data[];
};
+struct xsc_nic_attr {
+ __be16 caps;
+ __be16 caps_mask;
+ uint8_t mac_addr[6];
+};
+
+struct xsc_rss_modify_attr {
+ uint8_t caps_mask;
+ uint8_t rss_en;
+ __be16 rqn_base;
+ __be16 rqn_num;
+ uint8_t hfunc;
+ __be32 hash_tmpl;
+ uint8_t hash_key[52];
+};
+
+struct xsc_cmd_modify_nic_hca_mbox_in {
+ struct xsc_inbox_hdr hdr;
+ struct xsc_nic_attr nic;
+ struct xsc_rss_modify_attr rss;
+};
+
+struct xsc_cmd_modify_nic_hca_mbox_out {
+ struct xsc_outbox_hdr hdr;
+ uint8_t rsvd0[4];
+};
+
struct xsc_ioctl_data_tl {
uint16_t table;
uint16_t opmod;
@@ -17,6 +17,45 @@ static int
xsc_rss_modify_cmd(struct xsc_ethdev_priv *priv, uint8_t *rss_key,
uint8_t rss_key_len)
{
+ struct xsc_cmd_modify_nic_hca_mbox_in in = {};
+ struct xsc_cmd_modify_nic_hca_mbox_out out = {};
+ uint8_t rss_caps_mask = 0;
+ int ret, key_len = 0;
+
+ in.hdr.opcode = rte_cpu_to_be_16(XSC_CMD_OP_MODIFY_NIC_HCA);
+
+ key_len = RTE_MIN(rss_key_len, XSC_RSS_HASH_KEY_LEN);
+ rte_memcpy(in.rss.hash_key, rss_key, key_len);
+ rss_caps_mask |= BIT(XSC_RSS_HASH_KEY_UPDATE);
+
+ in.rss.caps_mask = rss_caps_mask;
+ in.rss.rss_en = 1;
+ in.nic.caps_mask = rte_cpu_to_be_16(BIT(XSC_TBM_CAP_RSS));
+ in.nic.caps = in.nic.caps_mask;
+
+ ret = xsc_mailbox_exec(priv->xdev, &in, sizeof(in), &out, sizeof(out));
+ if (ret != 0 || out.hdr.status != 0)
+ return -1;
+ return 0;
+}
+
+static int
+xsc_ethdev_rss_hash_conf_get(struct rte_eth_dev *dev,
+ struct rte_eth_rss_conf *rss_conf)
+{
+ struct xsc_ethdev_priv *priv = TO_XSC_ETHDEV_PRIV(dev);
+
+ if (!rss_conf) {
+ rte_errno = EINVAL;
+ return -rte_errno;
+ }
+ if (rss_conf->rss_key != NULL &&
+ rss_conf->rss_key_len >= priv->rss_conf.rss_key_len) {
+ memcpy(rss_conf->rss_key, priv->rss_conf.rss_key,
+ priv->rss_conf.rss_key_len);
+ }
+ rss_conf->rss_key_len = priv->rss_conf.rss_key_len;
+ rss_conf->rss_hf = priv->rss_conf.rss_hf;
return 0;
}
@@ -30,7 +69,7 @@ xsc_ethdev_rss_hash_update(struct rte_eth_dev *dev,
if (rss_conf->rss_key_len > XSC_RSS_HASH_KEY_LEN ||
rss_conf->rss_key == NULL) {
PMD_DRV_LOG(ERR, "Xsc pmd key len is %d bigger than %d",
- rss_conf->rss_key_len, XSC_RSS_HASH_KEY_LEN);
+ rss_conf->rss_key_len, XSC_RSS_HASH_KEY_LEN);
return -EINVAL;
}
@@ -184,6 +223,8 @@ const struct eth_dev_ops xsc_dev_ops = {
.dev_configure = xsc_ethdev_configure,
.rx_queue_setup = xsc_ethdev_rx_queue_setup,
.tx_queue_setup = xsc_ethdev_tx_queue_setup,
+ .rss_hash_update = xsc_ethdev_rss_hash_update,
+ .rss_hash_conf_get = xsc_ethdev_rss_hash_conf_get,
};
static int
@@ -9,6 +9,8 @@
#define XSC_MAX_DESC_NUMBER 1024
#define XSC_RX_FREE_THRESH 32
+#define XSC_CMD_OP_MODIFY_NIC_HCA 0x812
+
struct xsc_dev_config {
uint8_t pph_flag;
unsigned int hw_csum:1;
@@ -51,4 +53,19 @@ struct xsc_ethdev_priv {
#define TO_XSC_ETHDEV_PRIV(dev) \
((struct xsc_ethdev_priv *)(dev)->data->dev_private)
+enum {
+ XSC_TBM_CAP_HASH_PPH = 0,
+ XSC_TBM_CAP_RSS,
+ XSC_TBM_CAP_PP_BYPASS,
+ XSC_TBM_CAP_PCT_DROP_CONFIG,
+};
+
+enum {
+ XSC_RSS_HASH_KEY_UPDATE = 0,
+ XSC_RSS_HASH_TEMP_UPDATE,
+ XSC_RSS_HASH_FUNC_UPDATE,
+ XSC_RSS_RXQ_UPDATE,
+ XSC_RSS_RXQ_DROP,
+};
+
#endif /* _XSC_ETHDEV_H_ */
@@ -9,6 +9,10 @@
#include <ethdev_pci.h>
+#ifndef BIT
+#define BIT(n) (1UL << (n))
+#endif
+
struct ibv_device *xsc_get_ibv_device(const struct rte_pci_addr *addr);
int xsc_get_ifname_by_pci_addr(struct rte_pci_addr *addr, char *ifname);
int xsc_get_ifindex_by_ifname(const char *ifname, int *ifindex);
@@ -19,5 +23,4 @@ int xsc_get_mtu(uint16_t *mtu, uint32_t ifindex);
int xsc_set_mtu(uint16_t mtu, uint32_t ifindex);
int xsc_get_mac(uint8_t *mac, uint32_t ifindex);
-
#endif