LCOV - code coverage report
Current view: top level - drivers/net/sxe2 - sxe2_rss.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 284 0.0 %
Date: 2026-08-01 17:54:00 Functions: 0 14 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 127 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright (C), 2025, Wuxi Stars Micro System Technologies Co., Ltd.
       3                 :            :  */
       4                 :            : 
       5                 :            : #include "sxe2_rss.h"
       6                 :            : #include "sxe2_common_log.h"
       7                 :            : #include "sxe2_ethdev.h"
       8                 :            : #include "sxe2_cmd_chnl.h"
       9                 :            : 
      10                 :          0 : void sxe2_sw_rss_ctx_hw_cap_set(struct sxe2_adapter *adapter,
      11                 :            :                 struct sxe2_drv_rss_hash_caps *rss_caps)
      12                 :            : {
      13                 :          0 :         adapter->rss_ctxt.rss_key_size = rss_caps->hash_key_size;
      14                 :          0 :         adapter->rss_ctxt.rss_lut_size = rss_caps->lut_key_size;
      15                 :          0 : }
      16                 :            : 
      17                 :          0 : int32_t sxe2_rss_hash_key_init(struct rte_eth_dev *dev)
      18                 :            : {
      19                 :          0 :         struct rte_eth_rss_conf *rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf;
      20                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
      21                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
      22                 :          0 :         int32_t ret = 0;
      23                 :          0 :         uint16_t i = 0;
      24                 :            : 
      25         [ #  # ]:          0 :         if (rss_ctxt->rss_key == NULL) {
      26                 :          0 :                 rss_ctxt->rss_key = (uint8_t *)rte_zmalloc("rss_key", rss_ctxt->rss_key_size, 0);
      27         [ #  # ]:          0 :                 if (rss_ctxt->rss_key == NULL) {
      28                 :          0 :                         PMD_LOG_ERR(INIT, "Failed to allocate rss key");
      29                 :          0 :                         ret = -ENOMEM;
      30                 :          0 :                         goto l_end;
      31                 :            :                 }
      32                 :            :         }
      33                 :            : 
      34         [ #  # ]:          0 :         if (!rss_conf->rss_key) {
      35         [ #  # ]:          0 :                 for (i = 0; i < rss_ctxt->rss_key_size; i++)
      36                 :          0 :                         rss_ctxt->rss_key[i] = (uint8_t)rte_rand();
      37                 :            :         } else {
      38         [ #  # ]:          0 :                 rte_memcpy(rss_ctxt->rss_key, rss_conf->rss_key,
      39         [ #  # ]:          0 :                            RTE_MIN(rss_conf->rss_key_len, rss_ctxt->rss_key_size));
      40                 :            :         }
      41                 :            : 
      42                 :          0 :         ret = sxe2_drv_rss_key_set(adapter, rss_ctxt->rss_key,
      43                 :          0 :                                    rss_ctxt->rss_key_size);
      44         [ #  # ]:          0 :         if (ret) {
      45                 :          0 :                 PMD_DEV_LOG_ERR(adapter, INIT, "Failed to set rss key, ret:%d", ret);
      46                 :          0 :                 rte_free(rss_ctxt->rss_key);
      47                 :          0 :                 rss_ctxt->rss_key = NULL;
      48                 :          0 :                 goto l_end;
      49                 :            :         }
      50                 :            : 
      51                 :          0 : l_end:
      52                 :          0 :         return ret;
      53                 :            : }
      54                 :            : 
      55                 :          0 : void sxe2_rss_hash_key_uninit(struct rte_eth_dev *dev)
      56                 :            : {
      57                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
      58                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
      59                 :            : 
      60         [ #  # ]:          0 :         if (rss_ctxt->rss_key) {
      61                 :          0 :                 rte_free(rss_ctxt->rss_key);
      62                 :          0 :                 rss_ctxt->rss_key = NULL;
      63                 :            :         }
      64                 :          0 : }
      65                 :            : 
      66                 :          0 : int32_t sxe2_rss_lut_init(struct rte_eth_dev *dev)
      67                 :            : {
      68                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
      69                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
      70                 :          0 :         int32_t ret = 0;
      71                 :          0 :         uint16_t i;
      72                 :            : 
      73         [ #  # ]:          0 :         if (rss_ctxt->rss_lut == NULL) {
      74                 :          0 :                 rss_ctxt->rss_lut = (uint8_t *)rte_zmalloc("rss_lut", rss_ctxt->rss_lut_size, 0);
      75         [ #  # ]:          0 :                 if (rss_ctxt->rss_lut == NULL) {
      76                 :          0 :                         PMD_DEV_LOG_ERR(adapter, INIT, "Failed to allocate rss lut");
      77                 :          0 :                         ret = -ENOMEM;
      78                 :          0 :                         goto l_end;
      79                 :            :                 }
      80                 :            :         }
      81                 :            : 
      82         [ #  # ]:          0 :         for (i = 0; i < rss_ctxt->rss_lut_size; i++)
      83                 :          0 :                 rss_ctxt->rss_lut[i] = (uint8_t)(i % dev->data->nb_rx_queues);
      84                 :            : 
      85                 :          0 :         ret = sxe2_drv_rss_lut_set(adapter, rss_ctxt->rss_lut, rss_ctxt->rss_lut_size);
      86         [ #  # ]:          0 :         if (ret) {
      87                 :          0 :                 PMD_DEV_LOG_ERR(adapter, INIT, "Failed to set rss lut, ret:%d", ret);
      88                 :          0 :                 rte_free(rss_ctxt->rss_lut);
      89                 :          0 :                 rss_ctxt->rss_lut = NULL;
      90                 :          0 :                 goto l_end;
      91                 :            :         }
      92                 :            : 
      93                 :          0 : l_end:
      94                 :          0 :         return ret;
      95                 :            : }
      96                 :            : 
      97                 :          0 : void sxe2_rss_lut_uninit(struct rte_eth_dev *dev)
      98                 :            : {
      99                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     100                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
     101                 :            : 
     102         [ #  # ]:          0 :         if (rss_ctxt->rss_lut) {
     103                 :          0 :                 rte_free(rss_ctxt->rss_lut);
     104                 :          0 :                 rss_ctxt->rss_lut = NULL;
     105                 :            :         }
     106                 :          0 : }
     107                 :            : 
     108                 :            : static struct sxe2_rss_hf_config sxe2_rss_default_hf_config[] = {
     109                 :            :         {
     110                 :            :                 .rss_hf = RTE_ETH_RSS_L2_PAYLOAD,
     111                 :            :                 .hdrs = {SXE2_FLOW_HDR_ETH,
     112                 :            :                                  SXE2_FLOW_END},
     113                 :            :                 .flds = {SXE2_FLOW_FLD_ID_ETH_TYPE,
     114                 :            :                                  SXE2_FLOW_END},
     115                 :            :         },
     116                 :            :         {
     117                 :            :                 .rss_hf = RTE_ETH_RSS_IPV4,
     118                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV4,
     119                 :            :                                  SXE2_FLOW_END},
     120                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV4_SA,
     121                 :            :                                  SXE2_FLOW_FLD_ID_IPV4_DA,
     122                 :            :                                  SXE2_FLOW_END},
     123                 :            :         },
     124                 :            :         {
     125                 :            :                 .rss_hf = RTE_ETH_RSS_IPV6,
     126                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV6,
     127                 :            :                                  SXE2_FLOW_END},
     128                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV6_SA,
     129                 :            :                                  SXE2_FLOW_FLD_ID_IPV6_DA,
     130                 :            :                                  SXE2_FLOW_END},
     131                 :            :         },
     132                 :            :         {
     133                 :            :                 .rss_hf = RTE_ETH_RSS_FRAG_IPV4,
     134                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV4,
     135                 :            :                                  SXE2_FLOW_HDR_IPV_FRAG,
     136                 :            :                                  SXE2_FLOW_END},
     137                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV4_SA,
     138                 :            :                                  SXE2_FLOW_FLD_ID_IPV4_DA,
     139                 :            :                                  SXE2_FLOW_END},
     140                 :            :         },
     141                 :            :         {
     142                 :            :                 .rss_hf = RTE_ETH_RSS_FRAG_IPV6,
     143                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV6,
     144                 :            :                                  SXE2_FLOW_HDR_IPV_FRAG,
     145                 :            :                                  SXE2_FLOW_END},
     146                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV6_SA,
     147                 :            :                                  SXE2_FLOW_FLD_ID_IPV6_DA,
     148                 :            :                                  SXE2_FLOW_END},
     149                 :            :         },
     150                 :            :         {
     151                 :            :                 .rss_hf = RTE_ETH_RSS_NONFRAG_IPV4_OTHER,
     152                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV4,
     153                 :            :                                  SXE2_FLOW_HDR_IPV_OTHER,
     154                 :            :                                  SXE2_FLOW_END},
     155                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV4_SA,
     156                 :            :                                  SXE2_FLOW_FLD_ID_IPV4_DA,
     157                 :            :                                  SXE2_FLOW_END},
     158                 :            :         },
     159                 :            :         {
     160                 :            :                 .rss_hf = RTE_ETH_RSS_NONFRAG_IPV6_OTHER,
     161                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV6,
     162                 :            :                                  SXE2_FLOW_HDR_IPV_OTHER,
     163                 :            :                                  SXE2_FLOW_END},
     164                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV6_SA,
     165                 :            :                                  SXE2_FLOW_FLD_ID_IPV6_DA,
     166                 :            :                                  SXE2_FLOW_END},
     167                 :            :         },
     168                 :            :         {
     169                 :            :                 .rss_hf = RTE_ETH_RSS_NONFRAG_IPV4_UDP,
     170                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV4,
     171                 :            :                                  SXE2_FLOW_HDR_UDP,
     172                 :            :                                  SXE2_FLOW_END},
     173                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV4_SA,
     174                 :            :                                  SXE2_FLOW_FLD_ID_IPV4_DA,
     175                 :            :                                  SXE2_FLOW_FLD_ID_UDP_SRC_PORT,
     176                 :            :                                  SXE2_FLOW_FLD_ID_UDP_DST_PORT,
     177                 :            :                                  SXE2_FLOW_END},
     178                 :            :         },
     179                 :            :         {
     180                 :            :                 .rss_hf = RTE_ETH_RSS_NONFRAG_IPV6_UDP,
     181                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV6,
     182                 :            :                                  SXE2_FLOW_HDR_UDP,
     183                 :            :                                  SXE2_FLOW_END},
     184                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV6_SA,
     185                 :            :                                  SXE2_FLOW_FLD_ID_IPV6_DA,
     186                 :            :                                  SXE2_FLOW_FLD_ID_UDP_SRC_PORT,
     187                 :            :                                  SXE2_FLOW_FLD_ID_UDP_DST_PORT,
     188                 :            :                                  SXE2_FLOW_END},
     189                 :            :         },
     190                 :            :         {
     191                 :            :                 .rss_hf = RTE_ETH_RSS_NONFRAG_IPV4_TCP,
     192                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV4,
     193                 :            :                                  SXE2_FLOW_HDR_TCP,
     194                 :            :                                  SXE2_FLOW_END},
     195                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV4_SA,
     196                 :            :                                  SXE2_FLOW_FLD_ID_IPV4_DA,
     197                 :            :                                  SXE2_FLOW_FLD_ID_TCP_SRC_PORT,
     198                 :            :                                  SXE2_FLOW_FLD_ID_TCP_DST_PORT,
     199                 :            :                                  SXE2_FLOW_END},
     200                 :            :         },
     201                 :            :         {
     202                 :            :                 .rss_hf = RTE_ETH_RSS_NONFRAG_IPV6_TCP,
     203                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV6,
     204                 :            :                                  SXE2_FLOW_HDR_TCP,
     205                 :            :                                  SXE2_FLOW_END},
     206                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV6_SA,
     207                 :            :                                  SXE2_FLOW_FLD_ID_IPV6_DA,
     208                 :            :                                  SXE2_FLOW_FLD_ID_TCP_SRC_PORT,
     209                 :            :                                  SXE2_FLOW_FLD_ID_TCP_DST_PORT,
     210                 :            :                                  SXE2_FLOW_END},
     211                 :            :         },
     212                 :            :         {
     213                 :            :                 .rss_hf = RTE_ETH_RSS_NONFRAG_IPV4_SCTP,
     214                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV4,
     215                 :            :                                  SXE2_FLOW_HDR_SCTP,
     216                 :            :                                  SXE2_FLOW_END},
     217                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV4_SA,
     218                 :            :                                  SXE2_FLOW_FLD_ID_IPV4_DA,
     219                 :            :                                  SXE2_FLOW_FLD_ID_SCTP_SRC_PORT,
     220                 :            :                                  SXE2_FLOW_FLD_ID_SCTP_DST_PORT,
     221                 :            :                                  SXE2_FLOW_END},
     222                 :            :         },
     223                 :            :         {
     224                 :            :                 .rss_hf = RTE_ETH_RSS_NONFRAG_IPV6_SCTP,
     225                 :            :                 .hdrs = {SXE2_FLOW_HDR_IPV6,
     226                 :            :                                  SXE2_FLOW_HDR_SCTP,
     227                 :            :                                  SXE2_FLOW_END},
     228                 :            :                 .flds = {SXE2_FLOW_FLD_ID_IPV6_SA,
     229                 :            :                                  SXE2_FLOW_FLD_ID_IPV6_DA,
     230                 :            :                                  SXE2_FLOW_FLD_ID_SCTP_SRC_PORT,
     231                 :            :                                  SXE2_FLOW_FLD_ID_SCTP_DST_PORT,
     232                 :            :                                  SXE2_FLOW_END},
     233                 :            :         },
     234                 :            : };
     235                 :            : 
     236                 :          0 : int32_t sxe2_rss_hf_type_set(struct rte_eth_dev *dev, uint64_t rss_hf)
     237                 :            : {
     238                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     239                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
     240                 :          0 :         int32_t ret = 0;
     241                 :          0 :         uint32_t i;
     242                 :          0 :         uint8_t symm = 0;
     243                 :            : 
     244   [ #  #  #  # ]:          0 :         if (0 == (rss_hf & SXE2_RSS_HF_SUPPORT_ALL) && rss_hf != 0) {
     245                 :          0 :                 PMD_DEV_LOG_ERR(adapter, DRV,
     246                 :            :                         "Failed to set unsupported rss_hf:0x%016" PRIx64,
     247                 :            :                         rss_hf);
     248                 :          0 :                 ret = -EINVAL;
     249                 :          0 :                 goto l_end;
     250                 :            :         }
     251                 :            : 
     252         [ #  # ]:          0 :         for (i = 0; i < RTE_DIM(sxe2_rss_default_hf_config); i++) {
     253         [ #  # ]:          0 :                 if (rss_ctxt->rss_hf & sxe2_rss_default_hf_config[i].rss_hf) {
     254                 :          0 :                         sxe2_rss_default_hf_config[i].symm = rss_ctxt->symm;
     255                 :          0 :                         ret = sxe2_drv_rss_hf_del(adapter, &sxe2_rss_default_hf_config[i]);
     256         [ #  # ]:          0 :                         if (ret) {
     257                 :          0 :                                 PMD_DEV_LOG_ERR(adapter, INIT,
     258                 :            :                                         "Failed to del rss hf cfg[%d], ret:%d", i, ret);
     259                 :          0 :                                 goto l_end;
     260                 :            :                         }
     261                 :            :                 }
     262                 :            :         }
     263                 :            : 
     264         [ #  # ]:          0 :         if (rss_ctxt->hash_func == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
     265                 :          0 :                 symm = 1;
     266                 :            : 
     267         [ #  # ]:          0 :         for (i = 0; i < RTE_DIM(sxe2_rss_default_hf_config); i++) {
     268         [ #  # ]:          0 :                 if (rss_hf & sxe2_rss_default_hf_config[i].rss_hf) {
     269                 :          0 :                         sxe2_rss_default_hf_config[i].symm = symm;
     270                 :          0 :                         ret = sxe2_drv_rss_hf_add(adapter, &sxe2_rss_default_hf_config[i]);
     271         [ #  # ]:          0 :                         if (ret) {
     272                 :          0 :                                 PMD_DEV_LOG_ERR(adapter, INIT,
     273                 :            :                                         "Failed to add rss hf cfg[%d], ret:%d", i, ret);
     274                 :          0 :                                 goto l_end;
     275                 :            :                         }
     276                 :            :                 }
     277                 :            :         }
     278                 :            : 
     279                 :          0 :         rss_ctxt->rss_hf = rss_hf & SXE2_RSS_HF_SUPPORT_ALL;
     280                 :          0 :         rss_ctxt->symm = symm;
     281                 :          0 : l_end:
     282                 :          0 :         return ret;
     283                 :            : }
     284                 :            : 
     285                 :          0 : int32_t sxe2_rss_hash_function_set(struct rte_eth_dev *dev, enum rte_eth_hash_function func)
     286                 :            : {
     287                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     288                 :          0 :         enum sxe2_rss_hash_key_func hash_func = SXE2_RSS_HASH_FUNC_SYM_TOEPLITZ;
     289                 :          0 :         int32_t ret = 0;
     290                 :            : 
     291      [ #  #  # ]:          0 :         switch (func) {
     292                 :            :         case RTE_ETH_HASH_FUNCTION_DEFAULT:
     293                 :            :         case RTE_ETH_HASH_FUNCTION_TOEPLITZ:
     294                 :            :         case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
     295                 :            :                 hash_func = SXE2_RSS_HASH_FUNC_SYM_TOEPLITZ;
     296                 :            :                 break;
     297                 :          0 :         case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
     298                 :          0 :                 hash_func = SXE2_RSS_HASH_FUNC_XOR;
     299                 :          0 :                 break;
     300                 :          0 :         default:
     301                 :          0 :                 PMD_DEV_LOG_ERR(adapter, DRV, "RSS hash function[%d] not support.", func);
     302                 :          0 :                 ret = -EINVAL;
     303                 :          0 :                 goto l_end;
     304                 :            :         }
     305                 :            : 
     306                 :          0 :         ret = sxe2_drv_rss_hash_ctrl_func(adapter, hash_func);
     307         [ #  # ]:          0 :         if (ret) {
     308                 :          0 :                 PMD_DEV_LOG_ERR(adapter, INIT, "Failed to set rss hash function, ret=[%d]", ret);
     309                 :          0 :                 goto l_end;
     310                 :            :         }
     311                 :            : 
     312                 :          0 : l_end:
     313                 :          0 :         return ret;
     314                 :            : }
     315                 :            : 
     316                 :          0 : int32_t sxe2_rss_init(struct rte_eth_dev *dev)
     317                 :            : {
     318                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     319                 :          0 :         struct rte_eth_rss_conf *rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf;
     320                 :          0 :         enum rte_eth_hash_function rss_func = RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ;
     321                 :          0 :         int32_t ret = 0;
     322                 :            : 
     323                 :          0 :         adapter->rss_ctxt.inited = false;
     324                 :            : 
     325         [ #  # ]:          0 :         if (dev->data->nb_rx_queues <= 1) {
     326                 :          0 :                 PMD_DEV_LOG_DEBUG(adapter, INIT, "No need to init rss, rx queues %d.",
     327                 :            :                                 dev->data->nb_rx_queues);
     328                 :          0 :                 goto l_end;
     329                 :            :         }
     330                 :            : 
     331         [ #  # ]:          0 :         if ((adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_RSS) == 0) {
     332                 :          0 :                 PMD_DEV_LOG_WARN(adapter, INIT, "RSS not supported");
     333                 :          0 :                 goto l_end;
     334                 :            :         }
     335                 :            : 
     336                 :          0 :         ret = sxe2_rss_hash_key_init(dev);
     337         [ #  # ]:          0 :         if (ret) {
     338                 :          0 :                 PMD_DEV_LOG_ERR(adapter, INIT, "Failed to init rss key");
     339                 :          0 :                 goto l_end;
     340                 :            :         }
     341                 :            : 
     342                 :          0 :         ret = sxe2_rss_lut_init(dev);
     343         [ #  # ]:          0 :         if (ret) {
     344                 :          0 :                 PMD_DEV_LOG_ERR(adapter, INIT, "Failed to init rss lut");
     345                 :          0 :                 goto l_err_key;
     346                 :            :         }
     347                 :            : 
     348                 :          0 :         rss_func = rss_conf->algorithm;
     349                 :          0 :         ret = sxe2_rss_hash_function_set(dev, rss_func);
     350         [ #  # ]:          0 :         if (ret) {
     351                 :          0 :                 PMD_DEV_LOG_ERR(adapter, INIT, "Failed to init rss hash function");
     352                 :          0 :                 goto l_err_lut;
     353                 :            :         }
     354                 :          0 :         ret = sxe2_rss_hf_type_set(dev, rss_conf->rss_hf);
     355         [ #  # ]:          0 :         if (ret) {
     356                 :          0 :                 PMD_DEV_LOG_ERR(adapter, INIT, "Failed to set rss hf type");
     357                 :          0 :                 goto l_err_lut;
     358                 :            :         }
     359                 :          0 :         adapter->rss_ctxt.inited = true;
     360                 :          0 :         goto l_end;
     361                 :            : 
     362                 :          0 : l_err_lut:
     363                 :          0 :         sxe2_rss_lut_uninit(dev);
     364                 :          0 : l_err_key:
     365                 :          0 :         sxe2_rss_hash_key_uninit(dev);
     366                 :          0 : l_end:
     367                 :          0 :         return ret;
     368                 :            : }
     369                 :            : 
     370                 :          0 : int32_t sxe2_rss_disable(struct rte_eth_dev *dev)
     371                 :            : {
     372                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     373                 :          0 :         int32_t ret = 0;
     374                 :            : 
     375                 :          0 :         PMD_INIT_FUNC_TRACE();
     376                 :            : 
     377         [ #  # ]:          0 :         if ((adapter->cap_flags & SXE2_DEV_CAPS_OFFLOAD_RSS) == 0)
     378                 :          0 :                 goto l_end;
     379                 :            : 
     380                 :          0 :         ret = sxe2_drv_rss_hf_clear(adapter);
     381         [ #  # ]:          0 :         if (ret)
     382                 :          0 :                 PMD_LOG_ERR(INIT, "Failed to clear rss hf");
     383                 :            : 
     384                 :          0 :         sxe2_rss_hash_key_uninit(dev);
     385                 :            : 
     386                 :          0 :         sxe2_rss_lut_uninit(dev);
     387                 :            : 
     388                 :          0 : l_end:
     389                 :          0 :         return ret;
     390                 :            : }
     391                 :            : 
     392                 :          0 : int32_t sxe2_dev_rss_reta_update(struct rte_eth_dev *dev,
     393                 :            :                 struct rte_eth_rss_reta_entry64 *reta_conf,
     394                 :            :                 uint16_t reta_size)
     395                 :            : {
     396                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     397                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
     398                 :          0 :         uint8_t *lut_tmp = NULL;
     399                 :          0 :         int32_t ret = 0;
     400                 :          0 :         uint16_t i;
     401                 :          0 :         uint16_t shift;
     402                 :          0 :         uint16_t idx;
     403                 :            : 
     404         [ #  # ]:          0 :         if (!adapter->rss_ctxt.inited) {
     405                 :          0 :                 PMD_DEV_LOG_INFO(adapter, DRV, "RSS not inited.");
     406                 :          0 :                 ret = -ENOTSUP;
     407                 :          0 :                 goto l_end;
     408                 :            :         }
     409                 :            : 
     410         [ #  # ]:          0 :         if (reta_size != rss_ctxt->rss_lut_size) {
     411                 :          0 :                 PMD_DEV_LOG_ERR(adapter, DRV, "The size of hash lookup table configured "
     412                 :            :                                 "(%d) doesn't match the number of hardware can "
     413                 :            :                         "support (%d)", reta_size, rss_ctxt->rss_lut_size);
     414                 :          0 :                 ret = -EINVAL;
     415                 :          0 :                 goto l_end;
     416                 :            :         }
     417                 :            : 
     418                 :          0 :         lut_tmp = rte_zmalloc("rss_lut_temp", reta_size, 0);
     419         [ #  # ]:          0 :         if (!lut_tmp) {
     420                 :          0 :                 PMD_DEV_LOG_ERR(adapter, DRV, "No memory can be allocated");
     421                 :          0 :                 ret = -ENOMEM;
     422                 :          0 :                 goto l_end;
     423                 :            :         }
     424         [ #  # ]:          0 :         rte_memcpy(lut_tmp, rss_ctxt->rss_lut, reta_size);
     425                 :            : 
     426         [ #  # ]:          0 :         for (i = 0; i < reta_size; i++) {
     427                 :          0 :                 idx = i / RTE_ETH_RETA_GROUP_SIZE;
     428                 :          0 :                 shift = i % RTE_ETH_RETA_GROUP_SIZE;
     429         [ #  # ]:          0 :                 if (reta_conf[idx].mask & (1ULL << shift))
     430                 :          0 :                         lut_tmp[i] = reta_conf[idx].reta[shift];
     431                 :            :         }
     432                 :            : 
     433                 :          0 :         ret = sxe2_drv_rss_lut_set(adapter, lut_tmp, reta_size);
     434         [ #  # ]:          0 :         if (ret) {
     435                 :          0 :                 PMD_DEV_LOG_ERR(adapter, DRV, "Failed to set rss lut");
     436                 :          0 :                 goto l_end;
     437                 :            :         }
     438                 :            : 
     439         [ #  # ]:          0 :         rte_memcpy(rss_ctxt->rss_lut, lut_tmp, reta_size);
     440                 :            : 
     441         [ #  # ]:          0 : l_end:
     442         [ #  # ]:          0 :         if (lut_tmp)
     443                 :          0 :                 rte_free(lut_tmp);
     444                 :          0 :         return ret;
     445                 :            : }
     446                 :            : 
     447                 :          0 : int32_t sxe2_dev_rss_reta_query(struct rte_eth_dev *dev,
     448                 :            :                 struct rte_eth_rss_reta_entry64 *reta_conf,
     449                 :            :                 uint16_t reta_size)
     450                 :            : {
     451                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     452                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
     453                 :          0 :         int32_t ret = 0;
     454                 :          0 :         uint16_t i;
     455                 :          0 :         uint16_t shift;
     456                 :          0 :         uint16_t idx;
     457                 :            : 
     458         [ #  # ]:          0 :         if (!adapter->rss_ctxt.inited) {
     459                 :          0 :                 PMD_DEV_LOG_INFO(adapter, DRV, "RSS not inited.");
     460                 :          0 :                 ret = -ENOTSUP;
     461                 :          0 :                 goto l_end;
     462                 :            :         }
     463                 :            : 
     464         [ #  # ]:          0 :         if (reta_size != rss_ctxt->rss_lut_size) {
     465                 :          0 :                 PMD_LOG_ERR(INIT, "The size of hash lookup table configured "
     466                 :            :                         "(%d) doesn't match the number of hardware can "
     467                 :            :                         "support (%d)", reta_size, rss_ctxt->rss_lut_size);
     468                 :          0 :                 ret = -EINVAL;
     469                 :          0 :                 goto l_end;
     470                 :            :         }
     471                 :            : 
     472         [ #  # ]:          0 :         for (i = 0; i < reta_size; i++) {
     473                 :          0 :                 idx = i / RTE_ETH_RETA_GROUP_SIZE;
     474                 :          0 :                 shift = i % RTE_ETH_RETA_GROUP_SIZE;
     475         [ #  # ]:          0 :                 if (reta_conf[idx].mask & (1ULL << shift))
     476                 :          0 :                         reta_conf[idx].reta[shift] = rss_ctxt->rss_lut[i];
     477                 :            :         }
     478                 :            : 
     479                 :          0 : l_end:
     480                 :          0 :         return ret;
     481                 :            : }
     482                 :            : 
     483                 :          0 : static int32_t sxe2_rss_hash_key_update(struct rte_eth_dev *dev,
     484                 :            :                 struct rte_eth_rss_conf *rss_conf)
     485                 :            : {
     486                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     487                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
     488                 :          0 :         int32_t ret = 0;
     489                 :          0 :         uint16_t i;
     490                 :            : 
     491   [ #  #  #  # ]:          0 :         if (rss_conf->rss_key_len == 0 || rss_conf->rss_key == NULL)
     492                 :          0 :                 goto l_end;
     493                 :            : 
     494         [ #  # ]:          0 :         if (rss_conf->rss_key_len != rss_ctxt->rss_key_size) {
     495                 :          0 :                 PMD_DEV_LOG_ERR(adapter, DRV, "The size of hash key configured "
     496                 :            :                         "(%d) doesn't match the size of hardware can "
     497                 :            :                         "support (%d)", rss_conf->rss_key_len,
     498                 :            :                         rss_ctxt->rss_key_size);
     499                 :          0 :                 ret = -EINVAL;
     500                 :          0 :                 goto l_end;
     501                 :            :         }
     502                 :            : 
     503         [ #  # ]:          0 :         for (i = 0; i < rss_conf->rss_key_len; i++) {
     504         [ #  # ]:          0 :                 if (rss_conf->rss_key[i] != rss_ctxt->rss_key[i])
     505                 :            :                         break;
     506                 :            :         }
     507         [ #  # ]:          0 :         if (i == rss_conf->rss_key_len)
     508                 :          0 :                 goto l_end;
     509                 :            : 
     510                 :          0 :         ret = sxe2_drv_rss_key_set(adapter, rss_conf->rss_key,
     511                 :            :                                    rss_conf->rss_key_len);
     512         [ #  # ]:          0 :         if (ret) {
     513                 :          0 :                 PMD_DEV_LOG_ERR(adapter, DRV, "Failed to set rss key");
     514                 :          0 :                 goto l_end;
     515                 :            :         }
     516                 :            : 
     517         [ #  # ]:          0 :         rte_memcpy(rss_ctxt->rss_key, rss_conf->rss_key, rss_conf->rss_key_len);
     518                 :          0 : l_end:
     519                 :          0 :         return ret;
     520                 :            : }
     521                 :            : 
     522                 :          0 : int32_t sxe2_dev_rss_hash_update(struct rte_eth_dev *dev,
     523                 :            :                 struct rte_eth_rss_conf *rss_conf)
     524                 :            : {
     525                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     526                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
     527                 :          0 :         int32_t ret = -1;
     528                 :            : 
     529         [ #  # ]:          0 :         if (!adapter->rss_ctxt.inited) {
     530                 :          0 :                 PMD_DEV_LOG_INFO(adapter, DRV, "RSS not inited.");
     531                 :          0 :                 ret = -ENOTSUP;
     532                 :          0 :                 goto l_end;
     533                 :            :         }
     534                 :            : 
     535                 :          0 :         ret = sxe2_rss_hash_key_update(dev, rss_conf);
     536         [ #  # ]:          0 :         if (ret) {
     537                 :          0 :                 PMD_DEV_LOG_ERR(adapter, DRV, "Failed to set rss hash key");
     538                 :          0 :                 goto l_end;
     539                 :            :         }
     540                 :            : 
     541         [ #  # ]:          0 :         if (rss_conf->algorithm != rss_ctxt->hash_func) {
     542                 :          0 :                 ret = sxe2_rss_hash_function_set(dev, rss_conf->algorithm);
     543         [ #  # ]:          0 :                 if (ret) {
     544                 :          0 :                         PMD_DEV_LOG_ERR(adapter, DRV, "Failed to set rss hash function");
     545                 :          0 :                         goto l_end;
     546                 :            :                 }
     547                 :          0 :                 rss_ctxt->hash_func = rss_conf->algorithm;
     548                 :            :         }
     549                 :            : 
     550                 :          0 :         if ((rss_conf->rss_hf & SXE2_RSS_HF_SUPPORT_ALL)
     551         [ #  # ]:          0 :                         != rss_ctxt->rss_hf) {
     552                 :          0 :                 ret = sxe2_rss_hf_type_set(dev, rss_conf->rss_hf);
     553         [ #  # ]:          0 :                 if (ret) {
     554                 :          0 :                         PMD_DEV_LOG_ERR(adapter, DRV, "Failed to set rss hf type");
     555                 :          0 :                         goto l_end;
     556                 :            :                 }
     557                 :            :         }
     558                 :            :         ret = 0;
     559                 :          0 : l_end:
     560                 :          0 :         return ret;
     561                 :            : }
     562                 :            : 
     563                 :          0 : int32_t sxe2_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
     564                 :            :                 struct rte_eth_rss_conf *rss_conf)
     565                 :            : {
     566                 :          0 :         struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
     567                 :          0 :         struct sxe2_rss_context *rss_ctxt = &adapter->rss_ctxt;
     568                 :          0 :         int32_t ret = 0;
     569                 :            : 
     570         [ #  # ]:          0 :         if (adapter->rss_ctxt.inited == 0) {
     571                 :          0 :                 PMD_DEV_LOG_INFO(adapter, DRV, "RSS not inited.");
     572                 :          0 :                 ret = -ENOTSUP;
     573                 :          0 :                 goto l_end;
     574                 :            :         }
     575                 :            : 
     576         [ #  # ]:          0 :         if (rss_conf->rss_key) {
     577                 :          0 :                 rss_conf->rss_key_len = rss_ctxt->rss_key_size;
     578         [ #  # ]:          0 :                 rte_memcpy(rss_conf->rss_key, rss_ctxt->rss_key, rss_ctxt->rss_key_size);
     579                 :            :         }
     580                 :          0 :         rss_conf->rss_hf = rss_ctxt->rss_hf;
     581                 :          0 :         rss_conf->algorithm = rss_ctxt->hash_func;
     582                 :          0 : l_end:
     583                 :          0 :         return ret;
     584                 :            : }

Generated by: LCOV version 1.14