1c37ca66fSWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause 253e6f86cSMin Hu (Connor) * Copyright(c) 2018-2021 HiSilicon Limited. 3c37ca66fSWei Hu (Xavier) */ 4c37ca66fSWei Hu (Xavier) 5c37ca66fSWei Hu (Xavier) #include <rte_ethdev.h> 6c37ca66fSWei Hu (Xavier) #include <rte_io.h> 7c37ca66fSWei Hu (Xavier) #include <rte_malloc.h> 8c37ca66fSWei Hu (Xavier) 9c37ca66fSWei Hu (Xavier) #include "hns3_ethdev.h" 10c37ca66fSWei Hu (Xavier) #include "hns3_logs.h" 11c37ca66fSWei Hu (Xavier) 12d7050da8SHuisong Li /* Default hash keys */ 1382c2ca6dSMin Hu (Connor) const uint8_t hns3_hash_key[HNS3_RSS_KEY_SIZE] = { 14c37ca66fSWei Hu (Xavier) 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, 15c37ca66fSWei Hu (Xavier) 0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0, 16c37ca66fSWei Hu (Xavier) 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4, 17c37ca66fSWei Hu (Xavier) 0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C, 18c37ca66fSWei Hu (Xavier) 0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA 19c37ca66fSWei Hu (Xavier) }; 20c37ca66fSWei Hu (Xavier) 21806f1d5aSLijun Ou enum hns3_tuple_field { 22806f1d5aSLijun Ou /* IPV4_TCP ENABLE FIELD */ 23806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D = 0, 24806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S, 25806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D, 26806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S, 27806f1d5aSLijun Ou 28806f1d5aSLijun Ou /* IPV4_UDP ENABLE FIELD */ 29806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D = 8, 30806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S, 31806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D, 32806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S, 33806f1d5aSLijun Ou 34806f1d5aSLijun Ou /* IPV4_SCTP ENABLE FIELD */ 35806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D = 16, 36806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S, 37806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D, 38806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S, 39806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER, 40806f1d5aSLijun Ou 41806f1d5aSLijun Ou /* IPV4 ENABLE FIELD */ 42806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D = 24, 43806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S, 44806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D, 45806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S, 46806f1d5aSLijun Ou 47806f1d5aSLijun Ou /* IPV6_TCP ENABLE FIELD */ 48806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D = 32, 49806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S, 50806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D, 51806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S, 52806f1d5aSLijun Ou 53806f1d5aSLijun Ou /* IPV6_UDP ENABLE FIELD */ 54806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D = 40, 55806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S, 56806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D, 57806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S, 58806f1d5aSLijun Ou 591bc633c3SLijun Ou /* IPV6_SCTP ENABLE FIELD */ 602ecfc36cSHuisong Li HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D = 48, 612ecfc36cSHuisong Li HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S, 621bc633c3SLijun Ou HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D, 63806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S, 64806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER, 65806f1d5aSLijun Ou 66806f1d5aSLijun Ou /* IPV6 ENABLE FIELD */ 67806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D = 56, 68806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S, 69806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_FRAG_IP_D, 70806f1d5aSLijun Ou HNS3_RSS_FIELD_IPV6_FRAG_IP_S 71806f1d5aSLijun Ou }; 72806f1d5aSLijun Ou 732bd90635SHuisong Li enum hns3_rss_tuple_type { 742bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 752bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 76806f1d5aSLijun Ou }; 77806f1d5aSLijun Ou 78806f1d5aSLijun Ou static const struct { 79806f1d5aSLijun Ou uint64_t rss_types; 802bd90635SHuisong Li uint16_t tuple_type; 81806f1d5aSLijun Ou uint64_t rss_field; 822bd90635SHuisong Li } hns3_set_tuple_table[] = { 832bd90635SHuisong Li /* IPV4-FRAG */ 842bd90635SHuisong Li { RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY, 852bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 86806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) }, 872bd90635SHuisong Li { RTE_ETH_RSS_FRAG_IPV4 | RTE_ETH_RSS_L3_DST_ONLY, 882bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 892bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) }, 902bd90635SHuisong Li { RTE_ETH_RSS_FRAG_IPV4, 912bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 922bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S) | 932bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D) }, 942bd90635SHuisong Li 952bd90635SHuisong Li /* IPV4 */ 962bd90635SHuisong Li { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_SRC_ONLY, 972bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 982bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, 992bd90635SHuisong Li { RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_L3_DST_ONLY, 1002bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1012bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, 1022bd90635SHuisong Li { RTE_ETH_RSS_IPV4, 1032bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1042bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | 1052bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, 1062bd90635SHuisong Li 1072bd90635SHuisong Li /* IPV4-OTHER */ 1082bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, 1092bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1102bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) }, 1112bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_OTHER | RTE_ETH_RSS_L3_DST_ONLY, 1122bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1132bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, 1142bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_OTHER, 1152bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1162bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S) | 1172bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D) }, 1182bd90635SHuisong Li 1192bd90635SHuisong Li /* IPV4-TCP */ 1202bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L3_SRC_ONLY, 1212bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1222bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) }, 1232bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L3_DST_ONLY, 1242bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1252bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) }, 1262bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L4_SRC_ONLY, 1272bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1282bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) }, 1292bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_L4_DST_ONLY, 1302bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1312bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, 1322bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_TCP, 1332bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1342bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S) | 135806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D) | 136806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S) | 137806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D) }, 1382bd90635SHuisong Li 1392bd90635SHuisong Li /* IPV4-UDP */ 1402bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L3_SRC_ONLY, 1412bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1422bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) }, 1432bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L3_DST_ONLY, 1442bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1452bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) }, 1462bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L4_SRC_ONLY, 1472bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1482bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) }, 1492bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_L4_DST_ONLY, 1502bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1512bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) }, 1522bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_UDP, 1532bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1542bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S) | 155806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D) | 156806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S) | 157806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D) }, 1582bd90635SHuisong Li 1592bd90635SHuisong Li /* IPV4-SCTP */ 1602bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L3_SRC_ONLY, 1612bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1622bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) }, 1632bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L3_DST_ONLY, 1642bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1652bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) }, 1662bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_SRC_ONLY, 1672bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1682bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) }, 1692bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_SCTP | RTE_ETH_RSS_L4_DST_ONLY, 1702bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1712bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) }, 1722bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV4_SCTP, 1732bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 1742bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S) | 175806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D) | 176806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S) | 177806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D) | 178806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_VER) }, 1792bd90635SHuisong Li 1802bd90635SHuisong Li /* IPV6-FRAG */ 1812bd90635SHuisong Li { RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, 1822bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1832bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) }, 1842bd90635SHuisong Li { RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, 1852bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 186806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) }, 1872bd90635SHuisong Li { RTE_ETH_RSS_FRAG_IPV6, 1882bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1892bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_S) | 1902bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_FRAG_IP_D) }, 1912bd90635SHuisong Li 1922bd90635SHuisong Li /* IPV6 */ 1932bd90635SHuisong Li { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_SRC_ONLY, 1942bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1952bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, 1962bd90635SHuisong Li { RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_L3_DST_ONLY, 1972bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 1982bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, 1992bd90635SHuisong Li { RTE_ETH_RSS_IPV6, 2002bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 2012bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | 2022bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, 2032bd90635SHuisong Li 2042bd90635SHuisong Li /* IPV6-OTHER */ 2052bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_SRC_ONLY, 2062bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 2072bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, 2082bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_OTHER | RTE_ETH_RSS_L3_DST_ONLY, 2092bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 2102bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, 2112bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_OTHER, 2122bd90635SHuisong Li HNS3_RSS_IP_TUPLE, 2132bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | 2142bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D) }, 2152bd90635SHuisong Li 2162bd90635SHuisong Li /* IPV6-TCP */ 2172bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L3_SRC_ONLY, 2182bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2192bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) }, 2202bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L3_DST_ONLY, 2212bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2222bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) }, 2232bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L4_SRC_ONLY, 2242bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2252bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) }, 2262bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_TCP | RTE_ETH_RSS_L4_DST_ONLY, 2272bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2282bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) }, 2292bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_TCP, 2302bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2312bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S) | 232806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D) | 233806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S) | 234806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D) }, 2352bd90635SHuisong Li 2362bd90635SHuisong Li /* IPV6-UDP */ 2372bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L3_SRC_ONLY, 2382bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2392bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) }, 2402bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L3_DST_ONLY, 2412bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2422bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) }, 2432bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L4_SRC_ONLY, 2442bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2452bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) }, 2462bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_L4_DST_ONLY, 2472bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2482bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, 2492bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_UDP, 2502bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2512bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S) | 252806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D) | 253806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S) | 254806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, 2552bd90635SHuisong Li 2562bd90635SHuisong Li /* IPV6-SCTP */ 2572bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_SRC_ONLY, 2582bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2592bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) }, 2602bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L3_DST_ONLY, 2612bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2622bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) }, 2632bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_SRC_ONLY, 2642bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2652bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) }, 2662bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_SCTP | RTE_ETH_RSS_L4_DST_ONLY, 2672bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2682bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) }, 2692bd90635SHuisong Li { RTE_ETH_RSS_NONFRAG_IPV6_SCTP, 2702bd90635SHuisong Li HNS3_RSS_IP_L4_TUPLE, 2712bd90635SHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) | 272806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) | 2732ecfc36cSHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D) | 2742ecfc36cSHuisong Li BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S) | 275806f1d5aSLijun Ou BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER) }, 276806f1d5aSLijun Ou }; 277806f1d5aSLijun Ou 278c37ca66fSWei Hu (Xavier) /* 279c37ca66fSWei Hu (Xavier) * rss_generic_config command function, opcode:0x0D01. 28088347111SHuisong Li * Used to set algorithm and hash key of RSS. 281c37ca66fSWei Hu (Xavier) */ 282c37ca66fSWei Hu (Xavier) int 28388347111SHuisong Li hns3_rss_set_algo_key(struct hns3_hw *hw, uint8_t hash_algo, 28488347111SHuisong Li const uint8_t *key, uint8_t key_len) 285c37ca66fSWei Hu (Xavier) { 286c37ca66fSWei Hu (Xavier) struct hns3_rss_generic_config_cmd *req; 287c37ca66fSWei Hu (Xavier) struct hns3_cmd_desc desc; 28888347111SHuisong Li const uint8_t *cur_key; 28988347111SHuisong Li uint16_t cur_key_size; 29088347111SHuisong Li uint16_t max_bd_num; 29188347111SHuisong Li uint16_t idx; 292c37ca66fSWei Hu (Xavier) int ret; 293c37ca66fSWei Hu (Xavier) 294c37ca66fSWei Hu (Xavier) req = (struct hns3_rss_generic_config_cmd *)desc.data; 295c37ca66fSWei Hu (Xavier) 29688347111SHuisong Li max_bd_num = DIV_ROUND_UP(key_len, HNS3_RSS_HASH_KEY_NUM); 29788347111SHuisong Li for (idx = 0; idx < max_bd_num; idx++) { 298c37ca66fSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_GENERIC_CONFIG, 299c37ca66fSWei Hu (Xavier) false); 300c37ca66fSWei Hu (Xavier) 30188347111SHuisong Li req->hash_config |= (hash_algo & HNS3_RSS_HASH_ALGO_MASK); 30288347111SHuisong Li req->hash_config |= (idx << HNS3_RSS_HASH_KEY_OFFSET_B); 303c37ca66fSWei Hu (Xavier) 304bb38316eSHuisong Li if (idx == max_bd_num - 1 && 305bb38316eSHuisong Li (key_len % HNS3_RSS_HASH_KEY_NUM) != 0) 30688347111SHuisong Li cur_key_size = key_len % HNS3_RSS_HASH_KEY_NUM; 307c37ca66fSWei Hu (Xavier) else 30888347111SHuisong Li cur_key_size = HNS3_RSS_HASH_KEY_NUM; 309c37ca66fSWei Hu (Xavier) 31088347111SHuisong Li cur_key = key + idx * HNS3_RSS_HASH_KEY_NUM; 31188347111SHuisong Li memcpy(req->hash_key, cur_key, cur_key_size); 312c37ca66fSWei Hu (Xavier) 313c37ca66fSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 314c37ca66fSWei Hu (Xavier) if (ret) { 315c37ca66fSWei Hu (Xavier) hns3_err(hw, "Configure RSS algo key failed %d", ret); 316c37ca66fSWei Hu (Xavier) return ret; 317c37ca66fSWei Hu (Xavier) } 318c37ca66fSWei Hu (Xavier) } 319c37ca66fSWei Hu (Xavier) /* Update the shadow RSS key with user specified */ 3205172f9c4SHuisong Li memcpy(hw->rss_info.key, key, hw->rss_key_size); 321c37ca66fSWei Hu (Xavier) return 0; 322c37ca66fSWei Hu (Xavier) } 323c37ca66fSWei Hu (Xavier) 324*7da415d2SHuisong Li int 325*7da415d2SHuisong Li hns3_rss_get_algo_key(struct hns3_hw *hw, uint8_t *hash_algo, 326*7da415d2SHuisong Li uint8_t *key, uint8_t key_len) 327*7da415d2SHuisong Li { 328*7da415d2SHuisong Li struct hns3_rss_generic_config_cmd *req; 329*7da415d2SHuisong Li struct hns3_cmd_desc desc; 330*7da415d2SHuisong Li uint16_t cur_key_size; 331*7da415d2SHuisong Li uint16_t max_bd_num; 332*7da415d2SHuisong Li uint8_t *cur_key; 333*7da415d2SHuisong Li uint16_t idx; 334*7da415d2SHuisong Li int ret; 335*7da415d2SHuisong Li 336*7da415d2SHuisong Li req = (struct hns3_rss_generic_config_cmd *)desc.data; 337*7da415d2SHuisong Li max_bd_num = DIV_ROUND_UP(key_len, HNS3_RSS_HASH_KEY_NUM); 338*7da415d2SHuisong Li for (idx = 0; idx < max_bd_num; idx++) { 339*7da415d2SHuisong Li hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_GENERIC_CONFIG, 340*7da415d2SHuisong Li true); 341*7da415d2SHuisong Li 342*7da415d2SHuisong Li req->hash_config |= (idx << HNS3_RSS_HASH_KEY_OFFSET_B); 343*7da415d2SHuisong Li ret = hns3_cmd_send(hw, &desc, 1); 344*7da415d2SHuisong Li if (ret) { 345*7da415d2SHuisong Li hns3_err(hw, "fail to obtain RSS algo and key from firmware, ret = %d", 346*7da415d2SHuisong Li ret); 347*7da415d2SHuisong Li return ret; 348*7da415d2SHuisong Li } 349*7da415d2SHuisong Li 350*7da415d2SHuisong Li if (idx == 0) 351*7da415d2SHuisong Li *hash_algo = req->hash_config & HNS3_RSS_HASH_ALGO_MASK; 352*7da415d2SHuisong Li 353*7da415d2SHuisong Li if (idx == max_bd_num - 1 && 354*7da415d2SHuisong Li (key_len % HNS3_RSS_HASH_KEY_NUM) != 0) 355*7da415d2SHuisong Li cur_key_size = key_len % HNS3_RSS_HASH_KEY_NUM; 356*7da415d2SHuisong Li else 357*7da415d2SHuisong Li cur_key_size = HNS3_RSS_HASH_KEY_NUM; 358*7da415d2SHuisong Li 359*7da415d2SHuisong Li cur_key = key + idx * HNS3_RSS_HASH_KEY_NUM; 360*7da415d2SHuisong Li memcpy(cur_key, req->hash_key, cur_key_size); 361*7da415d2SHuisong Li } 362*7da415d2SHuisong Li 363*7da415d2SHuisong Li return 0; 364*7da415d2SHuisong Li } 365*7da415d2SHuisong Li 366c37ca66fSWei Hu (Xavier) /* 367c37ca66fSWei Hu (Xavier) * rss_indirection_table command function, opcode:0x0D07. 368c37ca66fSWei Hu (Xavier) * Used to configure the indirection table of rss. 369c37ca66fSWei Hu (Xavier) */ 370c37ca66fSWei Hu (Xavier) int 3719a7d3af2SHuisong Li hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, uint16_t size) 372c37ca66fSWei Hu (Xavier) { 373c37ca66fSWei Hu (Xavier) struct hns3_rss_indirection_table_cmd *req; 3744729376eSHuisong Li uint16_t max_bd_num, cfg_tbl_size; 375c37ca66fSWei Hu (Xavier) struct hns3_cmd_desc desc; 3769a7d3af2SHuisong Li uint8_t qid_msb_off; 3779a7d3af2SHuisong Li uint8_t qid_msb_val; 3789a7d3af2SHuisong Li uint16_t q_id; 3799a7d3af2SHuisong Li uint16_t i, j; 3809a7d3af2SHuisong Li int ret; 381c37ca66fSWei Hu (Xavier) 382c37ca66fSWei Hu (Xavier) req = (struct hns3_rss_indirection_table_cmd *)desc.data; 3834729376eSHuisong Li max_bd_num = DIV_ROUND_UP(size, HNS3_RSS_CFG_TBL_SIZE); 3844729376eSHuisong Li for (i = 0; i < max_bd_num; i++) { 385c37ca66fSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INDIR_TABLE, 386c37ca66fSWei Hu (Xavier) false); 387c37ca66fSWei Hu (Xavier) req->start_table_index = 388c37ca66fSWei Hu (Xavier) rte_cpu_to_le_16(i * HNS3_RSS_CFG_TBL_SIZE); 389c37ca66fSWei Hu (Xavier) req->rss_set_bitmap = rte_cpu_to_le_16(HNS3_RSS_SET_BITMAP_MSK); 3904729376eSHuisong Li 3914729376eSHuisong Li if (i == max_bd_num - 1 && (size % HNS3_RSS_CFG_TBL_SIZE) != 0) 3924729376eSHuisong Li cfg_tbl_size = size % HNS3_RSS_CFG_TBL_SIZE; 3934729376eSHuisong Li else 3944729376eSHuisong Li cfg_tbl_size = HNS3_RSS_CFG_TBL_SIZE; 3954729376eSHuisong Li 3964729376eSHuisong Li for (j = 0; j < cfg_tbl_size; j++) { 3979a7d3af2SHuisong Li q_id = indir[i * HNS3_RSS_CFG_TBL_SIZE + j]; 3989a7d3af2SHuisong Li req->rss_result_l[j] = q_id & 0xff; 3999a7d3af2SHuisong Li 4009a7d3af2SHuisong Li qid_msb_off = 4019a7d3af2SHuisong Li j * HNS3_RSS_CFG_TBL_BW_H / HNS3_BITS_PER_BYTE; 4029a7d3af2SHuisong Li qid_msb_val = (q_id >> HNS3_RSS_CFG_TBL_BW_L & 0x1) 4039a7d3af2SHuisong Li << (j * HNS3_RSS_CFG_TBL_BW_H % 4049a7d3af2SHuisong Li HNS3_BITS_PER_BYTE); 4059a7d3af2SHuisong Li req->rss_result_h[qid_msb_off] |= qid_msb_val; 406c37ca66fSWei Hu (Xavier) } 4079a7d3af2SHuisong Li 408c37ca66fSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 409c37ca66fSWei Hu (Xavier) if (ret) { 410c37ca66fSWei Hu (Xavier) hns3_err(hw, 411c37ca66fSWei Hu (Xavier) "Sets RSS indirection table failed %d size %u", 412c37ca66fSWei Hu (Xavier) ret, size); 413c37ca66fSWei Hu (Xavier) return ret; 414c37ca66fSWei Hu (Xavier) } 415c37ca66fSWei Hu (Xavier) } 416c37ca66fSWei Hu (Xavier) 417c37ca66fSWei Hu (Xavier) /* Update redirection table of hw */ 4189a7d3af2SHuisong Li memcpy(hw->rss_info.rss_indirection_tbl, indir, 4190fce2c46SLijun Ou sizeof(uint16_t) * size); 420c37ca66fSWei Hu (Xavier) 421c37ca66fSWei Hu (Xavier) return 0; 422c37ca66fSWei Hu (Xavier) } 423c37ca66fSWei Hu (Xavier) 424c37ca66fSWei Hu (Xavier) int 425c37ca66fSWei Hu (Xavier) hns3_rss_reset_indir_table(struct hns3_hw *hw) 426c37ca66fSWei Hu (Xavier) { 4279a7d3af2SHuisong Li uint16_t *lut; 428c37ca66fSWei Hu (Xavier) int ret; 429c37ca66fSWei Hu (Xavier) 4309a7d3af2SHuisong Li lut = rte_zmalloc("hns3_rss_lut", 4310fce2c46SLijun Ou hw->rss_ind_tbl_size * sizeof(uint16_t), 0); 432c37ca66fSWei Hu (Xavier) if (lut == NULL) { 433c37ca66fSWei Hu (Xavier) hns3_err(hw, "No hns3_rss_lut memory can be allocated"); 434c37ca66fSWei Hu (Xavier) return -ENOMEM; 435c37ca66fSWei Hu (Xavier) } 436c37ca66fSWei Hu (Xavier) 4370fce2c46SLijun Ou ret = hns3_set_rss_indir_table(hw, lut, hw->rss_ind_tbl_size); 438c37ca66fSWei Hu (Xavier) if (ret) 439c37ca66fSWei Hu (Xavier) hns3_err(hw, "RSS uninit indir table failed: %d", ret); 440c37ca66fSWei Hu (Xavier) rte_free(lut); 441c37ca66fSWei Hu (Xavier) 442c37ca66fSWei Hu (Xavier) return ret; 443c37ca66fSWei Hu (Xavier) } 444c37ca66fSWei Hu (Xavier) 44513c39932SHuisong Li static void 44613c39932SHuisong Li hns3_rss_check_l3l4_types(struct hns3_hw *hw, uint64_t rss_hf) 44713c39932SHuisong Li { 44813c39932SHuisong Li uint64_t ip_mask = RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4 | 44913c39932SHuisong Li RTE_ETH_RSS_NONFRAG_IPV4_OTHER | 45013c39932SHuisong Li RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 | 45113c39932SHuisong Li RTE_ETH_RSS_NONFRAG_IPV6_OTHER; 45213c39932SHuisong Li uint64_t l4_mask = RTE_ETH_RSS_NONFRAG_IPV4_TCP | 45313c39932SHuisong Li RTE_ETH_RSS_NONFRAG_IPV4_UDP | 45413c39932SHuisong Li RTE_ETH_RSS_NONFRAG_IPV4_SCTP | 45513c39932SHuisong Li RTE_ETH_RSS_NONFRAG_IPV6_TCP | 45613c39932SHuisong Li RTE_ETH_RSS_NONFRAG_IPV6_UDP | 45713c39932SHuisong Li RTE_ETH_RSS_NONFRAG_IPV6_SCTP; 45813c39932SHuisong Li uint64_t l3_src_dst_mask = RTE_ETH_RSS_L3_SRC_ONLY | 45913c39932SHuisong Li RTE_ETH_RSS_L3_DST_ONLY; 46013c39932SHuisong Li uint64_t l4_src_dst_mask = RTE_ETH_RSS_L4_SRC_ONLY | 46113c39932SHuisong Li RTE_ETH_RSS_L4_DST_ONLY; 46213c39932SHuisong Li 46313c39932SHuisong Li if (rss_hf & l3_src_dst_mask && 46413c39932SHuisong Li !(rss_hf & ip_mask || rss_hf & l4_mask)) 46513c39932SHuisong Li hns3_warn(hw, "packet type isn't specified, L3_SRC/DST_ONLY is ignored."); 46613c39932SHuisong Li 46713c39932SHuisong Li if (rss_hf & l4_src_dst_mask && !(rss_hf & l4_mask)) 46813c39932SHuisong Li hns3_warn(hw, "packet type isn't specified, L4_SRC/DST_ONLY is ignored."); 46913c39932SHuisong Li } 47013c39932SHuisong Li 4712bd90635SHuisong Li static uint64_t 47213c39932SHuisong Li hns3_rss_calc_tuple_filed(struct hns3_hw *hw, uint64_t rss_hf) 4732bd90635SHuisong Li { 4742bd90635SHuisong Li uint64_t l3_only_mask = RTE_ETH_RSS_L3_SRC_ONLY | 4752bd90635SHuisong Li RTE_ETH_RSS_L3_DST_ONLY; 4762bd90635SHuisong Li uint64_t l4_only_mask = RTE_ETH_RSS_L4_SRC_ONLY | 4772bd90635SHuisong Li RTE_ETH_RSS_L4_DST_ONLY; 4782bd90635SHuisong Li uint64_t l3_l4_only_mask = l3_only_mask | l4_only_mask; 4792bd90635SHuisong Li bool has_l3_l4_only = !!(rss_hf & l3_l4_only_mask); 4802bd90635SHuisong Li bool has_l3_only = !!(rss_hf & l3_only_mask); 4812bd90635SHuisong Li uint64_t tuple = 0; 4822bd90635SHuisong Li uint32_t i; 4832bd90635SHuisong Li 4842bd90635SHuisong Li for (i = 0; i < RTE_DIM(hns3_set_tuple_table); i++) { 4852bd90635SHuisong Li if ((rss_hf & hns3_set_tuple_table[i].rss_types) != 4862bd90635SHuisong Li hns3_set_tuple_table[i].rss_types) 4872bd90635SHuisong Li continue; 4882bd90635SHuisong Li 4892bd90635SHuisong Li if (hns3_set_tuple_table[i].tuple_type == HNS3_RSS_IP_TUPLE) { 4902bd90635SHuisong Li if (hns3_set_tuple_table[i].rss_types & l3_only_mask || 4912bd90635SHuisong Li !has_l3_only) 4922bd90635SHuisong Li tuple |= hns3_set_tuple_table[i].rss_field; 4932bd90635SHuisong Li continue; 4942bd90635SHuisong Li } 4952bd90635SHuisong Li 4962bd90635SHuisong Li /* For IP types with L4, we need check both L3 and L4 */ 4972bd90635SHuisong Li if (hns3_set_tuple_table[i].rss_types & l3_l4_only_mask || 4982bd90635SHuisong Li !has_l3_l4_only) 4992bd90635SHuisong Li tuple |= hns3_set_tuple_table[i].rss_field; 5002bd90635SHuisong Li } 50113c39932SHuisong Li hns3_rss_check_l3l4_types(hw, rss_hf); 5022bd90635SHuisong Li 5032bd90635SHuisong Li return tuple; 5042bd90635SHuisong Li } 5052bd90635SHuisong Li 506c37ca66fSWei Hu (Xavier) int 507bfd0b54dSHuisong Li hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf) 508c37ca66fSWei Hu (Xavier) { 509c37ca66fSWei Hu (Xavier) struct hns3_rss_input_tuple_cmd *req; 510c37ca66fSWei Hu (Xavier) struct hns3_cmd_desc desc; 5112bd90635SHuisong Li uint64_t tuple_field; 512c37ca66fSWei Hu (Xavier) int ret; 513c37ca66fSWei Hu (Xavier) 514c37ca66fSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, false); 515c37ca66fSWei Hu (Xavier) req = (struct hns3_rss_input_tuple_cmd *)desc.data; 516c37ca66fSWei Hu (Xavier) 51713c39932SHuisong Li tuple_field = hns3_rss_calc_tuple_filed(hw, rss_hf); 5182bd90635SHuisong Li req->tuple_field = rte_cpu_to_le_64(tuple_field); 519c37ca66fSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 520c37ca66fSWei Hu (Xavier) if (ret) { 521c37ca66fSWei Hu (Xavier) hns3_err(hw, "Update RSS flow types tuples failed %d", ret); 522c37ca66fSWei Hu (Xavier) return ret; 523c37ca66fSWei Hu (Xavier) } 524c37ca66fSWei Hu (Xavier) 52575ccc3f3SHuisong Li /* Update supported flow types when set tuple success */ 52675ccc3f3SHuisong Li hw->rss_info.conf.types = rss_hf; 527c37ca66fSWei Hu (Xavier) 528c37ca66fSWei Hu (Xavier) return 0; 529c37ca66fSWei Hu (Xavier) } 530c37ca66fSWei Hu (Xavier) 531c37ca66fSWei Hu (Xavier) /* 532c37ca66fSWei Hu (Xavier) * Configure RSS hash protocols and hash key. 533c37ca66fSWei Hu (Xavier) * @param dev 534c37ca66fSWei Hu (Xavier) * Pointer to Ethernet device. 535c37ca66fSWei Hu (Xavier) * @praram rss_conf 536c37ca66fSWei Hu (Xavier) * The configuration select of rss key size and tuple flow_types. 537c37ca66fSWei Hu (Xavier) * @return 538c37ca66fSWei Hu (Xavier) * 0 on success, a negative errno value otherwise is set. 539c37ca66fSWei Hu (Xavier) */ 540c37ca66fSWei Hu (Xavier) int 541c37ca66fSWei Hu (Xavier) hns3_dev_rss_hash_update(struct rte_eth_dev *dev, 542c37ca66fSWei Hu (Xavier) struct rte_eth_rss_conf *rss_conf) 543c37ca66fSWei Hu (Xavier) { 54407f64b5fSHuisong Li struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); 54507f64b5fSHuisong Li uint64_t rss_hf_bk = hw->rss_info.conf.types; 546c37ca66fSWei Hu (Xavier) uint8_t key_len = rss_conf->rss_key_len; 547c37ca66fSWei Hu (Xavier) uint64_t rss_hf = rss_conf->rss_hf; 548c37ca66fSWei Hu (Xavier) uint8_t *key = rss_conf->rss_key; 549c37ca66fSWei Hu (Xavier) int ret; 550c37ca66fSWei Hu (Xavier) 5515172f9c4SHuisong Li if (key && key_len != hw->rss_key_size) { 55207f64b5fSHuisong Li hns3_err(hw, "the hash key len(%u) is invalid, must be %u", 5535172f9c4SHuisong Li key_len, hw->rss_key_size); 55407f64b5fSHuisong Li return -EINVAL; 55507f64b5fSHuisong Li } 55607f64b5fSHuisong Li 557c37ca66fSWei Hu (Xavier) rte_spinlock_lock(&hw->lock); 558bfd0b54dSHuisong Li ret = hns3_set_rss_tuple_by_rss_hf(hw, rss_hf); 559c37ca66fSWei Hu (Xavier) if (ret) 56007f64b5fSHuisong Li goto set_tuple_fail; 561c37ca66fSWei Hu (Xavier) 562c37ca66fSWei Hu (Xavier) if (key) { 56388347111SHuisong Li ret = hns3_rss_set_algo_key(hw, hw->rss_info.hash_algo, 5645172f9c4SHuisong Li key, hw->rss_key_size); 565c37ca66fSWei Hu (Xavier) if (ret) 56607f64b5fSHuisong Li goto set_algo_key_fail; 567c37ca66fSWei Hu (Xavier) } 568c37ca66fSWei Hu (Xavier) rte_spinlock_unlock(&hw->lock); 569c37ca66fSWei Hu (Xavier) 570c37ca66fSWei Hu (Xavier) return 0; 571c37ca66fSWei Hu (Xavier) 57207f64b5fSHuisong Li set_algo_key_fail: 573bfd0b54dSHuisong Li (void)hns3_set_rss_tuple_by_rss_hf(hw, rss_hf_bk); 57407f64b5fSHuisong Li set_tuple_fail: 575c37ca66fSWei Hu (Xavier) rte_spinlock_unlock(&hw->lock); 576c37ca66fSWei Hu (Xavier) return ret; 577c37ca66fSWei Hu (Xavier) } 578c37ca66fSWei Hu (Xavier) 579c37ca66fSWei Hu (Xavier) /* 580c37ca66fSWei Hu (Xavier) * Get rss key and rss_hf types set of RSS hash configuration. 581c37ca66fSWei Hu (Xavier) * @param dev 582c37ca66fSWei Hu (Xavier) * Pointer to Ethernet device. 583c37ca66fSWei Hu (Xavier) * @praram rss_conf 584c37ca66fSWei Hu (Xavier) * The buffer to get rss key size and tuple types. 585c37ca66fSWei Hu (Xavier) * @return 586c37ca66fSWei Hu (Xavier) * 0 on success. 587c37ca66fSWei Hu (Xavier) */ 588c37ca66fSWei Hu (Xavier) int 589c37ca66fSWei Hu (Xavier) hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev, 590c37ca66fSWei Hu (Xavier) struct rte_eth_rss_conf *rss_conf) 591c37ca66fSWei Hu (Xavier) { 592c37ca66fSWei Hu (Xavier) struct hns3_adapter *hns = dev->data->dev_private; 593c37ca66fSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 594c37ca66fSWei Hu (Xavier) struct hns3_rss_conf *rss_cfg = &hw->rss_info; 595*7da415d2SHuisong Li uint8_t hash_algo; 596*7da415d2SHuisong Li int ret; 597c37ca66fSWei Hu (Xavier) 598c37ca66fSWei Hu (Xavier) rte_spinlock_lock(&hw->lock); 599c37ca66fSWei Hu (Xavier) rss_conf->rss_hf = rss_cfg->conf.types; 600c37ca66fSWei Hu (Xavier) 601c37ca66fSWei Hu (Xavier) /* Get the RSS Key required by the user */ 6025172f9c4SHuisong Li if (rss_conf->rss_key && rss_conf->rss_key_len >= hw->rss_key_size) { 603*7da415d2SHuisong Li ret = hns3_rss_get_algo_key(hw, &hash_algo, rss_conf->rss_key, 604*7da415d2SHuisong Li hw->rss_key_size); 605*7da415d2SHuisong Li if (ret != 0) { 606*7da415d2SHuisong Li rte_spinlock_unlock(&hw->lock); 607*7da415d2SHuisong Li hns3_err(hw, "obtain hash algo and key failed, ret = %d", 608*7da415d2SHuisong Li ret); 609*7da415d2SHuisong Li return ret; 610*7da415d2SHuisong Li } 6115172f9c4SHuisong Li rss_conf->rss_key_len = hw->rss_key_size; 612708e60a4SLijun Ou } 613c37ca66fSWei Hu (Xavier) rte_spinlock_unlock(&hw->lock); 614c37ca66fSWei Hu (Xavier) 615c37ca66fSWei Hu (Xavier) return 0; 616c37ca66fSWei Hu (Xavier) } 617c37ca66fSWei Hu (Xavier) 618c37ca66fSWei Hu (Xavier) /* 619c37ca66fSWei Hu (Xavier) * Update rss redirection table of RSS. 620c37ca66fSWei Hu (Xavier) * @param dev 621c37ca66fSWei Hu (Xavier) * Pointer to Ethernet device. 622c37ca66fSWei Hu (Xavier) * @praram reta_conf 623c37ca66fSWei Hu (Xavier) * Pointer to the configuration select of mask and redirection tables. 624c37ca66fSWei Hu (Xavier) * @param reta_size 625c37ca66fSWei Hu (Xavier) * Redirection table size. 626c37ca66fSWei Hu (Xavier) * @return 627c37ca66fSWei Hu (Xavier) * 0 on success, a negative errno value otherwise is set. 628c37ca66fSWei Hu (Xavier) */ 629c37ca66fSWei Hu (Xavier) int 630c37ca66fSWei Hu (Xavier) hns3_dev_rss_reta_update(struct rte_eth_dev *dev, 631c37ca66fSWei Hu (Xavier) struct rte_eth_rss_reta_entry64 *reta_conf, 632c37ca66fSWei Hu (Xavier) uint16_t reta_size) 633c37ca66fSWei Hu (Xavier) { 634c37ca66fSWei Hu (Xavier) struct hns3_adapter *hns = dev->data->dev_private; 635c37ca66fSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 636c37ca66fSWei Hu (Xavier) struct hns3_rss_conf *rss_cfg = &hw->rss_info; 6370fce2c46SLijun Ou uint16_t indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX]; 6385e76dfc3SHuisong Li uint16_t idx, shift; 6390fce2c46SLijun Ou uint16_t i; 640c37ca66fSWei Hu (Xavier) int ret; 641c37ca66fSWei Hu (Xavier) 6420fce2c46SLijun Ou if (reta_size != hw->rss_ind_tbl_size) { 643c37ca66fSWei Hu (Xavier) hns3_err(hw, "The size of hash lookup table configured (%u)" 644c37ca66fSWei Hu (Xavier) "doesn't match the number hardware can supported" 6450fce2c46SLijun Ou "(%u)", reta_size, hw->rss_ind_tbl_size); 646c37ca66fSWei Hu (Xavier) return -EINVAL; 647c37ca66fSWei Hu (Xavier) } 648c37ca66fSWei Hu (Xavier) rte_spinlock_lock(&hw->lock); 649c37ca66fSWei Hu (Xavier) memcpy(indirection_tbl, rss_cfg->rss_indirection_tbl, 6509a7d3af2SHuisong Li sizeof(rss_cfg->rss_indirection_tbl)); 651c37ca66fSWei Hu (Xavier) for (i = 0; i < reta_size; i++) { 652295968d1SFerruh Yigit idx = i / RTE_ETH_RETA_GROUP_SIZE; 653295968d1SFerruh Yigit shift = i % RTE_ETH_RETA_GROUP_SIZE; 6545e76dfc3SHuisong Li if (reta_conf[idx].reta[shift] >= hw->alloc_rss_size) { 655c37ca66fSWei Hu (Xavier) rte_spinlock_unlock(&hw->lock); 6565e76dfc3SHuisong Li hns3_err(hw, "queue id(%u) set to redirection table " 6575e76dfc3SHuisong Li "exceeds queue number(%u) allocated to a TC", 6585e76dfc3SHuisong Li reta_conf[idx].reta[shift], 6595e76dfc3SHuisong Li hw->alloc_rss_size); 660c37ca66fSWei Hu (Xavier) return -EINVAL; 661c37ca66fSWei Hu (Xavier) } 662c37ca66fSWei Hu (Xavier) 663c37ca66fSWei Hu (Xavier) if (reta_conf[idx].mask & (1ULL << shift)) 664c37ca66fSWei Hu (Xavier) indirection_tbl[i] = reta_conf[idx].reta[shift]; 665c37ca66fSWei Hu (Xavier) } 666c37ca66fSWei Hu (Xavier) 667c37ca66fSWei Hu (Xavier) ret = hns3_set_rss_indir_table(hw, indirection_tbl, 6680fce2c46SLijun Ou hw->rss_ind_tbl_size); 669c37ca66fSWei Hu (Xavier) 670c37ca66fSWei Hu (Xavier) rte_spinlock_unlock(&hw->lock); 671c37ca66fSWei Hu (Xavier) return ret; 672c37ca66fSWei Hu (Xavier) } 673c37ca66fSWei Hu (Xavier) 674c37ca66fSWei Hu (Xavier) /* 675c37ca66fSWei Hu (Xavier) * Get rss redirection table of RSS hash configuration. 676c37ca66fSWei Hu (Xavier) * @param dev 677c37ca66fSWei Hu (Xavier) * Pointer to Ethernet device. 678c37ca66fSWei Hu (Xavier) * @praram reta_conf 679c37ca66fSWei Hu (Xavier) * Pointer to the configuration select of mask and redirection tables. 680c37ca66fSWei Hu (Xavier) * @param reta_size 681c37ca66fSWei Hu (Xavier) * Redirection table size. 682c37ca66fSWei Hu (Xavier) * @return 683c37ca66fSWei Hu (Xavier) * 0 on success, a negative errno value otherwise is set. 684c37ca66fSWei Hu (Xavier) */ 685c37ca66fSWei Hu (Xavier) int 686c37ca66fSWei Hu (Xavier) hns3_dev_rss_reta_query(struct rte_eth_dev *dev, 687c37ca66fSWei Hu (Xavier) struct rte_eth_rss_reta_entry64 *reta_conf, 688c37ca66fSWei Hu (Xavier) uint16_t reta_size) 689c37ca66fSWei Hu (Xavier) { 690c37ca66fSWei Hu (Xavier) struct hns3_adapter *hns = dev->data->dev_private; 691c37ca66fSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 692c37ca66fSWei Hu (Xavier) struct hns3_rss_conf *rss_cfg = &hw->rss_info; 693c37ca66fSWei Hu (Xavier) uint16_t idx, shift; 6940fce2c46SLijun Ou uint16_t i; 695c37ca66fSWei Hu (Xavier) 6960fce2c46SLijun Ou if (reta_size != hw->rss_ind_tbl_size) { 697c37ca66fSWei Hu (Xavier) hns3_err(hw, "The size of hash lookup table configured (%u)" 698c37ca66fSWei Hu (Xavier) " doesn't match the number hardware can supported" 6990fce2c46SLijun Ou "(%u)", reta_size, hw->rss_ind_tbl_size); 700c37ca66fSWei Hu (Xavier) return -EINVAL; 701c37ca66fSWei Hu (Xavier) } 702c37ca66fSWei Hu (Xavier) rte_spinlock_lock(&hw->lock); 703c37ca66fSWei Hu (Xavier) for (i = 0; i < reta_size; i++) { 704295968d1SFerruh Yigit idx = i / RTE_ETH_RETA_GROUP_SIZE; 705295968d1SFerruh Yigit shift = i % RTE_ETH_RETA_GROUP_SIZE; 706c37ca66fSWei Hu (Xavier) if (reta_conf[idx].mask & (1ULL << shift)) 707c37ca66fSWei Hu (Xavier) reta_conf[idx].reta[shift] = 708920be799SLijun Ou rss_cfg->rss_indirection_tbl[i]; 709c37ca66fSWei Hu (Xavier) } 710c37ca66fSWei Hu (Xavier) rte_spinlock_unlock(&hw->lock); 711c37ca66fSWei Hu (Xavier) return 0; 712c37ca66fSWei Hu (Xavier) } 713c37ca66fSWei Hu (Xavier) 71487f9628eSHuisong Li static void 71587f9628eSHuisong Li hns3_set_rss_tc_mode_entry(struct hns3_hw *hw, uint8_t *tc_valid, 71687f9628eSHuisong Li uint16_t *tc_size, uint16_t *tc_offset, 71787f9628eSHuisong Li uint8_t tc_num) 71887f9628eSHuisong Li { 71987f9628eSHuisong Li struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); 72087f9628eSHuisong Li uint16_t rss_size = hw->alloc_rss_size; 72187f9628eSHuisong Li uint16_t roundup_size; 72287f9628eSHuisong Li uint16_t i; 72387f9628eSHuisong Li 72487f9628eSHuisong Li roundup_size = roundup_pow_of_two(rss_size); 72587f9628eSHuisong Li roundup_size = ilog2(roundup_size); 72687f9628eSHuisong Li 72787f9628eSHuisong Li for (i = 0; i < tc_num; i++) { 72887f9628eSHuisong Li if (hns->is_vf) { 729c37ca66fSWei Hu (Xavier) /* 73087f9628eSHuisong Li * For packets with VLAN priorities destined for the VF, 73187f9628eSHuisong Li * hardware still assign Rx queue based on the Up-to-TC 73287f9628eSHuisong Li * mapping PF configured. But VF has only one TC. If 73387f9628eSHuisong Li * other TC don't enable, it causes that the priority 73487f9628eSHuisong Li * packets that aren't destined for TC0 aren't received 73587f9628eSHuisong Li * by RSS hash but is destined for queue 0. So driver 73687f9628eSHuisong Li * has to enable the unused TC by using TC0 queue 73787f9628eSHuisong Li * mapping configuration. 738c37ca66fSWei Hu (Xavier) */ 73987f9628eSHuisong Li tc_valid[i] = (hw->hw_tc_map & BIT(i)) ? 74087f9628eSHuisong Li !!(hw->hw_tc_map & BIT(i)) : 1; 74187f9628eSHuisong Li tc_size[i] = roundup_size; 74287f9628eSHuisong Li tc_offset[i] = (hw->hw_tc_map & BIT(i)) ? 74387f9628eSHuisong Li rss_size * i : 0; 74487f9628eSHuisong Li } else { 74587f9628eSHuisong Li tc_valid[i] = !!(hw->hw_tc_map & BIT(i)); 74687f9628eSHuisong Li tc_size[i] = tc_valid[i] ? roundup_size : 0; 74787f9628eSHuisong Li tc_offset[i] = tc_valid[i] ? rss_size * i : 0; 74887f9628eSHuisong Li } 74987f9628eSHuisong Li } 75087f9628eSHuisong Li } 75187f9628eSHuisong Li 752c37ca66fSWei Hu (Xavier) static int 753c37ca66fSWei Hu (Xavier) hns3_set_rss_tc_mode(struct hns3_hw *hw) 754c37ca66fSWei Hu (Xavier) { 755c37ca66fSWei Hu (Xavier) struct hns3_rss_tc_mode_cmd *req; 756c37ca66fSWei Hu (Xavier) uint16_t tc_offset[HNS3_MAX_TC_NUM]; 757c37ca66fSWei Hu (Xavier) uint8_t tc_valid[HNS3_MAX_TC_NUM]; 758c37ca66fSWei Hu (Xavier) uint16_t tc_size[HNS3_MAX_TC_NUM]; 759c37ca66fSWei Hu (Xavier) struct hns3_cmd_desc desc; 760c37ca66fSWei Hu (Xavier) uint16_t i; 761c37ca66fSWei Hu (Xavier) int ret; 762c37ca66fSWei Hu (Xavier) 76387f9628eSHuisong Li hns3_set_rss_tc_mode_entry(hw, tc_valid, tc_size, 76487f9628eSHuisong Li tc_offset, HNS3_MAX_TC_NUM); 76587f9628eSHuisong Li 766c37ca66fSWei Hu (Xavier) req = (struct hns3_rss_tc_mode_cmd *)desc.data; 767c37ca66fSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_TC_MODE, false); 768c37ca66fSWei Hu (Xavier) for (i = 0; i < HNS3_MAX_TC_NUM; i++) { 769c37ca66fSWei Hu (Xavier) uint16_t mode = 0; 770c37ca66fSWei Hu (Xavier) 771c37ca66fSWei Hu (Xavier) hns3_set_bit(mode, HNS3_RSS_TC_VALID_B, (tc_valid[i] & 0x1)); 772c37ca66fSWei Hu (Xavier) hns3_set_field(mode, HNS3_RSS_TC_SIZE_M, HNS3_RSS_TC_SIZE_S, 773c37ca66fSWei Hu (Xavier) tc_size[i]); 7749a7d3af2SHuisong Li if (tc_size[i] >> HNS3_RSS_TC_SIZE_MSB_OFFSET > 0) 7759a7d3af2SHuisong Li hns3_set_bit(mode, HNS3_RSS_TC_SIZE_MSB_S, 1); 776c37ca66fSWei Hu (Xavier) hns3_set_field(mode, HNS3_RSS_TC_OFFSET_M, HNS3_RSS_TC_OFFSET_S, 777c37ca66fSWei Hu (Xavier) tc_offset[i]); 778c37ca66fSWei Hu (Xavier) 779c37ca66fSWei Hu (Xavier) req->rss_tc_mode[i] = rte_cpu_to_le_16(mode); 780c37ca66fSWei Hu (Xavier) } 781c37ca66fSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 782c37ca66fSWei Hu (Xavier) if (ret) 783c37ca66fSWei Hu (Xavier) hns3_err(hw, "Sets rss tc mode failed %d", ret); 784c37ca66fSWei Hu (Xavier) 785c37ca66fSWei Hu (Xavier) return ret; 786c37ca66fSWei Hu (Xavier) } 787c37ca66fSWei Hu (Xavier) 788c37ca66fSWei Hu (Xavier) static void 789c37ca66fSWei Hu (Xavier) hns3_rss_tuple_uninit(struct hns3_hw *hw) 790c37ca66fSWei Hu (Xavier) { 791c37ca66fSWei Hu (Xavier) struct hns3_cmd_desc desc; 792c37ca66fSWei Hu (Xavier) int ret; 793c37ca66fSWei Hu (Xavier) 794c37ca66fSWei Hu (Xavier) hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, false); 795c37ca66fSWei Hu (Xavier) 796c37ca66fSWei Hu (Xavier) ret = hns3_cmd_send(hw, &desc, 1); 797c37ca66fSWei Hu (Xavier) if (ret) { 798c37ca66fSWei Hu (Xavier) hns3_err(hw, "RSS uninit tuple failed %d", ret); 799c37ca66fSWei Hu (Xavier) return; 800c37ca66fSWei Hu (Xavier) } 801c37ca66fSWei Hu (Xavier) } 802c37ca66fSWei Hu (Xavier) 803c37ca66fSWei Hu (Xavier) /* 804c37ca66fSWei Hu (Xavier) * Set the default rss configuration in the init of driver. 805c37ca66fSWei Hu (Xavier) */ 806c37ca66fSWei Hu (Xavier) void 807a39e67ffSLijun Ou hns3_rss_set_default_args(struct hns3_hw *hw) 808c37ca66fSWei Hu (Xavier) { 809c37ca66fSWei Hu (Xavier) struct hns3_rss_conf *rss_cfg = &hw->rss_info; 810c37ca66fSWei Hu (Xavier) uint16_t queue_num = hw->alloc_rss_size; 81167d01034SHuisong Li uint16_t i; 812c37ca66fSWei Hu (Xavier) 813c37ca66fSWei Hu (Xavier) /* Default hash algorithm */ 8148834849aSHao Chen rss_cfg->conf.func = RTE_ETH_HASH_FUNCTION_TOEPLITZ; 8158834849aSHao Chen 8165172f9c4SHuisong Li memcpy(rss_cfg->key, hns3_hash_key, 8175172f9c4SHuisong Li RTE_MIN(sizeof(hns3_hash_key), hw->rss_key_size)); 818c37ca66fSWei Hu (Xavier) 819c37ca66fSWei Hu (Xavier) /* Initialize RSS indirection table */ 8200fce2c46SLijun Ou for (i = 0; i < hw->rss_ind_tbl_size; i++) 821c37ca66fSWei Hu (Xavier) rss_cfg->rss_indirection_tbl[i] = i % queue_num; 822c37ca66fSWei Hu (Xavier) } 823c37ca66fSWei Hu (Xavier) 824c37ca66fSWei Hu (Xavier) /* 825f8dbaebbSSean Morrissey * RSS initialization for hns3 PMD. 826c37ca66fSWei Hu (Xavier) */ 827c37ca66fSWei Hu (Xavier) int 828c37ca66fSWei Hu (Xavier) hns3_config_rss(struct hns3_adapter *hns) 829c37ca66fSWei Hu (Xavier) { 830c37ca66fSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 831c37ca66fSWei Hu (Xavier) struct hns3_rss_conf *rss_cfg = &hw->rss_info; 832c37ca66fSWei Hu (Xavier) uint8_t *hash_key = rss_cfg->key; 83375ccc3f3SHuisong Li uint64_t rss_hf; 83475ccc3f3SHuisong Li int ret; 835c37ca66fSWei Hu (Xavier) 836c37ca66fSWei Hu (Xavier) enum rte_eth_rx_mq_mode mq_mode = hw->data->dev_conf.rxmode.mq_mode; 837c37ca66fSWei Hu (Xavier) 83878b37190SLijun Ou switch (hw->rss_info.conf.func) { 83978b37190SLijun Ou case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: 84078b37190SLijun Ou hw->rss_info.hash_algo = HNS3_RSS_HASH_ALGO_SIMPLE; 84178b37190SLijun Ou break; 84278b37190SLijun Ou case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ: 84378b37190SLijun Ou hw->rss_info.hash_algo = HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP; 84478b37190SLijun Ou break; 84578b37190SLijun Ou default: 84678b37190SLijun Ou hw->rss_info.hash_algo = HNS3_RSS_HASH_ALGO_TOEPLITZ; 84778b37190SLijun Ou break; 84878b37190SLijun Ou } 84978b37190SLijun Ou 8505172f9c4SHuisong Li ret = hns3_rss_set_algo_key(hw, rss_cfg->hash_algo, 8515172f9c4SHuisong Li hash_key, hw->rss_key_size); 852c37ca66fSWei Hu (Xavier) if (ret) 853c37ca66fSWei Hu (Xavier) return ret; 854c37ca66fSWei Hu (Xavier) 85575ccc3f3SHuisong Li ret = hns3_set_rss_indir_table(hw, rss_cfg->rss_indirection_tbl, 85675ccc3f3SHuisong Li hw->rss_ind_tbl_size); 85775ccc3f3SHuisong Li if (ret) 85875ccc3f3SHuisong Li return ret; 85975ccc3f3SHuisong Li 86075ccc3f3SHuisong Li ret = hns3_set_rss_tc_mode(hw); 861c37ca66fSWei Hu (Xavier) if (ret) 862c37ca66fSWei Hu (Xavier) return ret; 863c37ca66fSWei Hu (Xavier) 864920be799SLijun Ou /* 86575ccc3f3SHuisong Li * When muli-queue RSS mode flag is not set or unsupported tuples are 86675ccc3f3SHuisong Li * set, disable all tuples. 867920be799SLijun Ou */ 86875ccc3f3SHuisong Li rss_hf = hw->rss_info.conf.types; 86975ccc3f3SHuisong Li if (!((uint32_t)mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) || 87075ccc3f3SHuisong Li !(rss_hf & HNS3_ETH_RSS_SUPPORT)) 87175ccc3f3SHuisong Li rss_hf = 0; 872c37ca66fSWei Hu (Xavier) 873bfd0b54dSHuisong Li return hns3_set_rss_tuple_by_rss_hf(hw, rss_hf); 874c37ca66fSWei Hu (Xavier) } 875c37ca66fSWei Hu (Xavier) 876c37ca66fSWei Hu (Xavier) /* 877f8dbaebbSSean Morrissey * RSS uninitialization for hns3 PMD. 878c37ca66fSWei Hu (Xavier) */ 879c37ca66fSWei Hu (Xavier) void 880c37ca66fSWei Hu (Xavier) hns3_rss_uninit(struct hns3_adapter *hns) 881c37ca66fSWei Hu (Xavier) { 882c37ca66fSWei Hu (Xavier) struct hns3_hw *hw = &hns->hw; 883c37ca66fSWei Hu (Xavier) int ret; 884c37ca66fSWei Hu (Xavier) 885c37ca66fSWei Hu (Xavier) hns3_rss_tuple_uninit(hw); 886c37ca66fSWei Hu (Xavier) ret = hns3_rss_reset_indir_table(hw); 887c37ca66fSWei Hu (Xavier) if (ret != 0) 888c37ca66fSWei Hu (Xavier) return; 889c37ca66fSWei Hu (Xavier) 890c37ca66fSWei Hu (Xavier) /* Disable RSS */ 891c37ca66fSWei Hu (Xavier) hw->rss_info.conf.types = 0; 892c37ca66fSWei Hu (Xavier) } 893