net/mlx5: fix mutex unlock in Tx packet pacing cleanup
[dpdk.git] / drivers / net / octeontx2 / otx2_rss.c
index 7a8c8f3..68cef1c 100644 (file)
@@ -33,6 +33,29 @@ otx2_nix_rss_tbl_init(struct otx2_eth_dev *dev,
                req->qidx = (group * rss->rss_size) + idx;
                req->ctype = NIX_AQ_CTYPE_RSS;
                req->op = NIX_AQ_INSTOP_INIT;
+
+               if (!dev->lock_rx_ctx)
+                       continue;
+
+               req = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
+               if (!req) {
+                       /* The shared memory buffer can be full.
+                        * Flush it and retry
+                        */
+                       otx2_mbox_msg_send(mbox, 0);
+                       rc = otx2_mbox_wait_for_rsp(mbox, 0);
+                       if (rc < 0)
+                               return rc;
+
+                       req = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
+                       if (!req)
+                               return -ENOMEM;
+               }
+               req->rss.rq = ind_tbl[idx];
+               /* Fill AQ info */
+               req->qidx = (group * rss->rss_size) + idx;
+               req->ctype = NIX_AQ_CTYPE_RSS;
+               req->op = NIX_AQ_INSTOP_LOCK;
        }
 
        otx2_mbox_msg_send(mbox, 0);
@@ -62,8 +85,8 @@ otx2_nix_dev_reta_update(struct rte_eth_dev *eth_dev,
        }
 
        /* Copy RETA table */
-       for (i = 0; i < (dev->rss_info.rss_size / RTE_RETA_GROUP_SIZE); i++) {
-               for (j = 0; j < RTE_RETA_GROUP_SIZE; j++) {
+       for (i = 0; i < (dev->rss_info.rss_size / RTE_ETH_RETA_GROUP_SIZE); i++) {
+               for (j = 0; j < RTE_ETH_RETA_GROUP_SIZE; j++) {
                        if ((reta_conf[i].mask >> j) & 0x01)
                                rss->ind_tbl[idx] = reta_conf[i].reta[j];
                        idx++;
@@ -95,8 +118,8 @@ otx2_nix_dev_reta_query(struct rte_eth_dev *eth_dev,
        }
 
        /* Copy RETA table */
-       for (i = 0; i < (dev->rss_info.rss_size / RTE_RETA_GROUP_SIZE); i++) {
-               for (j = 0; j < RTE_RETA_GROUP_SIZE; j++)
+       for (i = 0; i < (dev->rss_info.rss_size / RTE_ETH_RETA_GROUP_SIZE); i++) {
+               for (j = 0; j < RTE_ETH_RETA_GROUP_SIZE; j++)
                        if ((reta_conf[i].mask >> j) & 0x01)
                                reta_conf[i].reta[j] = rss->ind_tbl[j];
        }
@@ -155,23 +178,23 @@ rss_get_key(struct otx2_eth_dev *dev, uint8_t *key)
 }
 
 #define RSS_IPV4_ENABLE ( \
-                         ETH_RSS_IPV4 | \
-                         ETH_RSS_FRAG_IPV4 | \
-                         ETH_RSS_NONFRAG_IPV4_UDP | \
-                         ETH_RSS_NONFRAG_IPV4_TCP | \
-                         ETH_RSS_NONFRAG_IPV4_SCTP)
+                         RTE_ETH_RSS_IPV4 | \
+                         RTE_ETH_RSS_FRAG_IPV4 | \
+                         RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
+                         RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
+                         RTE_ETH_RSS_NONFRAG_IPV4_SCTP)
 
 #define RSS_IPV6_ENABLE ( \
-                         ETH_RSS_IPV6 | \
-                         ETH_RSS_FRAG_IPV6 | \
-                         ETH_RSS_NONFRAG_IPV6_UDP | \
-                         ETH_RSS_NONFRAG_IPV6_TCP | \
-                         ETH_RSS_NONFRAG_IPV6_SCTP)
+                         RTE_ETH_RSS_IPV6 | \
+                         RTE_ETH_RSS_FRAG_IPV6 | \
+                         RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
+                         RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
+                         RTE_ETH_RSS_NONFRAG_IPV6_SCTP)
 
 #define RSS_IPV6_EX_ENABLE ( \
-                            ETH_RSS_IPV6_EX | \
-                            ETH_RSS_IPV6_TCP_EX | \
-                            ETH_RSS_IPV6_UDP_EX)
+                            RTE_ETH_RSS_IPV6_EX | \
+                            RTE_ETH_RSS_IPV6_TCP_EX | \
+                            RTE_ETH_RSS_IPV6_UDP_EX)
 
 #define RSS_MAX_LEVELS   3
 
@@ -210,16 +233,24 @@ otx2_rss_ethdev_to_nix(struct otx2_eth_dev *dev, uint64_t ethdev_rss,
 
        dev->rss_info.nix_rss = ethdev_rss;
 
-       if (ethdev_rss & ETH_RSS_L3_SRC_ONLY)
+       if (ethdev_rss & RTE_ETH_RSS_L2_PAYLOAD &&
+           dev->npc_flow.switch_header_type == OTX2_PRIV_FLAGS_CH_LEN_90B) {
+               flowkey_cfg |= FLOW_KEY_TYPE_CH_LEN_90B;
+       }
+
+       if (ethdev_rss & RTE_ETH_RSS_C_VLAN)
+               flowkey_cfg |= FLOW_KEY_TYPE_VLAN;
+
+       if (ethdev_rss & RTE_ETH_RSS_L3_SRC_ONLY)
                flowkey_cfg |= FLOW_KEY_TYPE_L3_SRC;
 
-       if (ethdev_rss & ETH_RSS_L3_DST_ONLY)
+       if (ethdev_rss & RTE_ETH_RSS_L3_DST_ONLY)
                flowkey_cfg |= FLOW_KEY_TYPE_L3_DST;
 
-       if (ethdev_rss & ETH_RSS_L4_SRC_ONLY)
+       if (ethdev_rss & RTE_ETH_RSS_L4_SRC_ONLY)
                flowkey_cfg |= FLOW_KEY_TYPE_L4_SRC;
 
-       if (ethdev_rss & ETH_RSS_L4_DST_ONLY)
+       if (ethdev_rss & RTE_ETH_RSS_L4_DST_ONLY)
                flowkey_cfg |= FLOW_KEY_TYPE_L4_DST;
 
        if (ethdev_rss & RSS_IPV4_ENABLE)
@@ -228,34 +259,34 @@ otx2_rss_ethdev_to_nix(struct otx2_eth_dev *dev, uint64_t ethdev_rss,
        if (ethdev_rss & RSS_IPV6_ENABLE)
                flowkey_cfg |= flow_key_type[rss_level][RSS_IPV6_INDEX];
 
-       if (ethdev_rss & ETH_RSS_TCP)
+       if (ethdev_rss & RTE_ETH_RSS_TCP)
                flowkey_cfg |= flow_key_type[rss_level][RSS_TCP_INDEX];
 
-       if (ethdev_rss & ETH_RSS_UDP)
+       if (ethdev_rss & RTE_ETH_RSS_UDP)
                flowkey_cfg |= flow_key_type[rss_level][RSS_UDP_INDEX];
 
-       if (ethdev_rss & ETH_RSS_SCTP)
+       if (ethdev_rss & RTE_ETH_RSS_SCTP)
                flowkey_cfg |= flow_key_type[rss_level][RSS_SCTP_INDEX];
 
-       if (ethdev_rss & ETH_RSS_L2_PAYLOAD)
+       if (ethdev_rss & RTE_ETH_RSS_L2_PAYLOAD)
                flowkey_cfg |= flow_key_type[rss_level][RSS_DMAC_INDEX];
 
        if (ethdev_rss & RSS_IPV6_EX_ENABLE)
                flowkey_cfg |= FLOW_KEY_TYPE_IPV6_EXT;
 
-       if (ethdev_rss & ETH_RSS_PORT)
+       if (ethdev_rss & RTE_ETH_RSS_PORT)
                flowkey_cfg |= FLOW_KEY_TYPE_PORT;
 
-       if (ethdev_rss & ETH_RSS_NVGRE)
+       if (ethdev_rss & RTE_ETH_RSS_NVGRE)
                flowkey_cfg |= FLOW_KEY_TYPE_NVGRE;
 
-       if (ethdev_rss & ETH_RSS_VXLAN)
+       if (ethdev_rss & RTE_ETH_RSS_VXLAN)
                flowkey_cfg |= FLOW_KEY_TYPE_VXLAN;
 
-       if (ethdev_rss & ETH_RSS_GENEVE)
+       if (ethdev_rss & RTE_ETH_RSS_GENEVE)
                flowkey_cfg |= FLOW_KEY_TYPE_GENEVE;
 
-       if (ethdev_rss & ETH_RSS_GTPU)
+       if (ethdev_rss & RTE_ETH_RSS_GTPU)
                flowkey_cfg |= FLOW_KEY_TYPE_GTPU;
 
        return flowkey_cfg;
@@ -295,6 +326,7 @@ otx2_nix_rss_hash_update(struct rte_eth_dev *eth_dev,
                         struct rte_eth_rss_conf *rss_conf)
 {
        struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
+       uint8_t rss_hash_level;
        uint32_t flowkey_cfg;
        uint8_t alg_idx;
        int rc;
@@ -311,7 +343,11 @@ otx2_nix_rss_hash_update(struct rte_eth_dev *eth_dev,
                otx2_nix_rss_set_key(dev, rss_conf->rss_key,
                                     (uint32_t)rss_conf->rss_key_len);
 
-       flowkey_cfg = otx2_rss_ethdev_to_nix(dev, rss_conf->rss_hf, 0);
+       rss_hash_level = RTE_ETH_RSS_LEVEL(rss_conf->rss_hf);
+       if (rss_hash_level)
+               rss_hash_level -= 1;
+       flowkey_cfg =
+               otx2_rss_ethdev_to_nix(dev, rss_conf->rss_hf, rss_hash_level);
 
        rc = otx2_rss_set_hf(dev, flowkey_cfg, &alg_idx,
                             NIX_DEFAULT_RSS_CTX_GROUP,
@@ -347,13 +383,14 @@ otx2_nix_rss_config(struct rte_eth_dev *eth_dev)
 {
        struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
        uint32_t idx, qcnt = eth_dev->data->nb_rx_queues;
+       uint8_t rss_hash_level;
        uint32_t flowkey_cfg;
        uint64_t rss_hf;
        uint8_t alg_idx;
        int rc;
 
        /* Skip further configuration if selected mode is not RSS */
-       if (eth_dev->data->dev_conf.rxmode.mq_mode != ETH_MQ_RX_RSS)
+       if (eth_dev->data->dev_conf.rxmode.mq_mode != RTE_ETH_MQ_RX_RSS || !qcnt)
                return 0;
 
        /* Update default RSS key and cfg */
@@ -371,7 +408,10 @@ otx2_nix_rss_config(struct rte_eth_dev *eth_dev)
        }
 
        rss_hf = eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf;
-       flowkey_cfg = otx2_rss_ethdev_to_nix(dev, rss_hf, 0);
+       rss_hash_level = RTE_ETH_RSS_LEVEL(rss_hf);
+       if (rss_hash_level)
+               rss_hash_level -= 1;
+       flowkey_cfg = otx2_rss_ethdev_to_nix(dev, rss_hf, rss_hash_level);
 
        rc = otx2_rss_set_hf(dev, flowkey_cfg, &alg_idx,
                             NIX_DEFAULT_RSS_CTX_GROUP,