xref: /dpdk/drivers/net/mlx5/mlx5_rss.c (revision 634efbc2c8c05213696c36e103becc48cdbe534c)
12f97422eSNelio Laranjeiro /*-
22f97422eSNelio Laranjeiro  *   BSD LICENSE
32f97422eSNelio Laranjeiro  *
42f97422eSNelio Laranjeiro  *   Copyright 2015 6WIND S.A.
52f97422eSNelio Laranjeiro  *   Copyright 2015 Mellanox.
62f97422eSNelio Laranjeiro  *
72f97422eSNelio Laranjeiro  *   Redistribution and use in source and binary forms, with or without
82f97422eSNelio Laranjeiro  *   modification, are permitted provided that the following conditions
92f97422eSNelio Laranjeiro  *   are met:
102f97422eSNelio Laranjeiro  *
112f97422eSNelio Laranjeiro  *     * Redistributions of source code must retain the above copyright
122f97422eSNelio Laranjeiro  *       notice, this list of conditions and the following disclaimer.
132f97422eSNelio Laranjeiro  *     * Redistributions in binary form must reproduce the above copyright
142f97422eSNelio Laranjeiro  *       notice, this list of conditions and the following disclaimer in
152f97422eSNelio Laranjeiro  *       the documentation and/or other materials provided with the
162f97422eSNelio Laranjeiro  *       distribution.
172f97422eSNelio Laranjeiro  *     * Neither the name of 6WIND S.A. nor the names of its
182f97422eSNelio Laranjeiro  *       contributors may be used to endorse or promote products derived
192f97422eSNelio Laranjeiro  *       from this software without specific prior written permission.
202f97422eSNelio Laranjeiro  *
212f97422eSNelio Laranjeiro  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
222f97422eSNelio Laranjeiro  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
232f97422eSNelio Laranjeiro  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
242f97422eSNelio Laranjeiro  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
252f97422eSNelio Laranjeiro  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
262f97422eSNelio Laranjeiro  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
272f97422eSNelio Laranjeiro  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
282f97422eSNelio Laranjeiro  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
292f97422eSNelio Laranjeiro  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
302f97422eSNelio Laranjeiro  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
312f97422eSNelio Laranjeiro  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
322f97422eSNelio Laranjeiro  */
332f97422eSNelio Laranjeiro 
342f97422eSNelio Laranjeiro #include <stddef.h>
352f97422eSNelio Laranjeiro #include <stdint.h>
362f97422eSNelio Laranjeiro #include <errno.h>
372f97422eSNelio Laranjeiro #include <string.h>
382f97422eSNelio Laranjeiro #include <assert.h>
392f97422eSNelio Laranjeiro 
402f97422eSNelio Laranjeiro /* Verbs header. */
412f97422eSNelio Laranjeiro /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
422f97422eSNelio Laranjeiro #ifdef PEDANTIC
432f97422eSNelio Laranjeiro #pragma GCC diagnostic ignored "-pedantic"
442f97422eSNelio Laranjeiro #endif
452f97422eSNelio Laranjeiro #include <infiniband/verbs.h>
462f97422eSNelio Laranjeiro #ifdef PEDANTIC
472f97422eSNelio Laranjeiro #pragma GCC diagnostic error "-pedantic"
482f97422eSNelio Laranjeiro #endif
492f97422eSNelio Laranjeiro 
502f97422eSNelio Laranjeiro /* DPDK headers don't like -pedantic. */
512f97422eSNelio Laranjeiro #ifdef PEDANTIC
522f97422eSNelio Laranjeiro #pragma GCC diagnostic ignored "-pedantic"
532f97422eSNelio Laranjeiro #endif
542f97422eSNelio Laranjeiro #include <rte_malloc.h>
552f97422eSNelio Laranjeiro #include <rte_ethdev.h>
562f97422eSNelio Laranjeiro #ifdef PEDANTIC
572f97422eSNelio Laranjeiro #pragma GCC diagnostic error "-pedantic"
582f97422eSNelio Laranjeiro #endif
592f97422eSNelio Laranjeiro 
602f97422eSNelio Laranjeiro #include "mlx5.h"
612f97422eSNelio Laranjeiro #include "mlx5_rxtx.h"
622f97422eSNelio Laranjeiro 
632f97422eSNelio Laranjeiro /**
640573873dSNelio Laranjeiro  * Get a RSS configuration hash key.
650573873dSNelio Laranjeiro  *
660573873dSNelio Laranjeiro  * @param priv
670573873dSNelio Laranjeiro  *   Pointer to private structure.
680573873dSNelio Laranjeiro  * @param rss_hf
690573873dSNelio Laranjeiro  *   RSS hash functions configuration must be retrieved for.
700573873dSNelio Laranjeiro  *
710573873dSNelio Laranjeiro  * @return
720573873dSNelio Laranjeiro  *   Pointer to a RSS configuration structure or NULL if rss_hf cannot
730573873dSNelio Laranjeiro  *   be matched.
740573873dSNelio Laranjeiro  */
750573873dSNelio Laranjeiro static struct rte_eth_rss_conf *
760573873dSNelio Laranjeiro rss_hash_get(struct priv *priv, uint64_t rss_hf)
770573873dSNelio Laranjeiro {
780573873dSNelio Laranjeiro 	unsigned int i;
790573873dSNelio Laranjeiro 
800573873dSNelio Laranjeiro 	for (i = 0; (i != hash_rxq_init_n); ++i) {
810573873dSNelio Laranjeiro 		uint64_t dpdk_rss_hf = hash_rxq_init[i].dpdk_rss_hf;
820573873dSNelio Laranjeiro 
830573873dSNelio Laranjeiro 		if (!(dpdk_rss_hf & rss_hf))
840573873dSNelio Laranjeiro 			continue;
850573873dSNelio Laranjeiro 		return (*priv->rss_conf)[i];
860573873dSNelio Laranjeiro 	}
870573873dSNelio Laranjeiro 	return NULL;
880573873dSNelio Laranjeiro }
890573873dSNelio Laranjeiro 
900573873dSNelio Laranjeiro /**
912f97422eSNelio Laranjeiro  * Register a RSS key.
922f97422eSNelio Laranjeiro  *
932f97422eSNelio Laranjeiro  * @param priv
942f97422eSNelio Laranjeiro  *   Pointer to private structure.
952f97422eSNelio Laranjeiro  * @param key
962f97422eSNelio Laranjeiro  *   Hash key to register.
972f97422eSNelio Laranjeiro  * @param key_len
982f97422eSNelio Laranjeiro  *   Hash key length in bytes.
990573873dSNelio Laranjeiro  * @param rss_hf
1000573873dSNelio Laranjeiro  *   RSS hash functions the provided key applies to.
1012f97422eSNelio Laranjeiro  *
1022f97422eSNelio Laranjeiro  * @return
1032f97422eSNelio Laranjeiro  *   0 on success, errno value on failure.
1042f97422eSNelio Laranjeiro  */
1052f97422eSNelio Laranjeiro int
1062f97422eSNelio Laranjeiro rss_hash_rss_conf_new_key(struct priv *priv, const uint8_t *key,
1070573873dSNelio Laranjeiro 			  unsigned int key_len, uint64_t rss_hf)
1082f97422eSNelio Laranjeiro {
1090573873dSNelio Laranjeiro 	unsigned int i;
1102f97422eSNelio Laranjeiro 
1110573873dSNelio Laranjeiro 	for (i = 0; (i != hash_rxq_init_n); ++i) {
1120573873dSNelio Laranjeiro 		struct rte_eth_rss_conf *rss_conf;
1130573873dSNelio Laranjeiro 		uint64_t dpdk_rss_hf = hash_rxq_init[i].dpdk_rss_hf;
1140573873dSNelio Laranjeiro 
1150573873dSNelio Laranjeiro 		if (!(dpdk_rss_hf & rss_hf))
1160573873dSNelio Laranjeiro 			continue;
1170573873dSNelio Laranjeiro 		rss_conf = rte_realloc((*priv->rss_conf)[i],
1182f97422eSNelio Laranjeiro 				       (sizeof(*rss_conf) + key_len),
1192f97422eSNelio Laranjeiro 				       0);
1202f97422eSNelio Laranjeiro 		if (!rss_conf)
1212f97422eSNelio Laranjeiro 			return ENOMEM;
1222f97422eSNelio Laranjeiro 		rss_conf->rss_key = (void *)(rss_conf + 1);
1232f97422eSNelio Laranjeiro 		rss_conf->rss_key_len = key_len;
1240573873dSNelio Laranjeiro 		rss_conf->rss_hf = dpdk_rss_hf;
1252f97422eSNelio Laranjeiro 		memcpy(rss_conf->rss_key, key, key_len);
1260573873dSNelio Laranjeiro 		(*priv->rss_conf)[i] = rss_conf;
1270573873dSNelio Laranjeiro 	}
1282f97422eSNelio Laranjeiro 	return 0;
1292f97422eSNelio Laranjeiro }
1302f97422eSNelio Laranjeiro 
1312f97422eSNelio Laranjeiro /**
1322f97422eSNelio Laranjeiro  * DPDK callback to update the RSS hash configuration.
1332f97422eSNelio Laranjeiro  *
1342f97422eSNelio Laranjeiro  * @param dev
1352f97422eSNelio Laranjeiro  *   Pointer to Ethernet device structure.
1362f97422eSNelio Laranjeiro  * @param[in] rss_conf
1372f97422eSNelio Laranjeiro  *   RSS configuration data.
1382f97422eSNelio Laranjeiro  *
1392f97422eSNelio Laranjeiro  * @return
1402f97422eSNelio Laranjeiro  *   0 on success, negative errno value on failure.
1412f97422eSNelio Laranjeiro  */
1422f97422eSNelio Laranjeiro int
1432f97422eSNelio Laranjeiro mlx5_rss_hash_update(struct rte_eth_dev *dev,
1442f97422eSNelio Laranjeiro 		     struct rte_eth_rss_conf *rss_conf)
1452f97422eSNelio Laranjeiro {
1462f97422eSNelio Laranjeiro 	struct priv *priv = dev->data->dev_private;
1472f97422eSNelio Laranjeiro 	int err = 0;
1482f97422eSNelio Laranjeiro 
1492f97422eSNelio Laranjeiro 	priv_lock(priv);
1502f97422eSNelio Laranjeiro 
1512f97422eSNelio Laranjeiro 	assert(priv->rss_conf != NULL);
1522f97422eSNelio Laranjeiro 
1532f97422eSNelio Laranjeiro 	/* Apply configuration. */
1542f97422eSNelio Laranjeiro 	if (rss_conf->rss_key)
1552f97422eSNelio Laranjeiro 		err = rss_hash_rss_conf_new_key(priv,
1562f97422eSNelio Laranjeiro 						rss_conf->rss_key,
1570573873dSNelio Laranjeiro 						rss_conf->rss_key_len,
1580573873dSNelio Laranjeiro 						rss_conf->rss_hf);
1592f97422eSNelio Laranjeiro 	else
1602f97422eSNelio Laranjeiro 		err = rss_hash_rss_conf_new_key(priv,
1612f97422eSNelio Laranjeiro 						rss_hash_default_key,
1620573873dSNelio Laranjeiro 						rss_hash_default_key_len,
1630573873dSNelio Laranjeiro 						ETH_RSS_PROTO_MASK);
1642f97422eSNelio Laranjeiro 
1652f97422eSNelio Laranjeiro 	/* Store the configuration set into port configure.
1662f97422eSNelio Laranjeiro 	 * This will enable/disable hash RX queues associated to the protocols
1672f97422eSNelio Laranjeiro 	 * enabled/disabled by this update. */
1682f97422eSNelio Laranjeiro 	priv->dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf =
1692f97422eSNelio Laranjeiro 		rss_conf->rss_hf;
1702f97422eSNelio Laranjeiro 	priv_unlock(priv);
1712f97422eSNelio Laranjeiro 	assert(err >= 0);
1722f97422eSNelio Laranjeiro 	return -err;
1732f97422eSNelio Laranjeiro }
1742f97422eSNelio Laranjeiro 
1752f97422eSNelio Laranjeiro /**
1762f97422eSNelio Laranjeiro  * DPDK callback to get the RSS hash configuration.
1772f97422eSNelio Laranjeiro  *
1782f97422eSNelio Laranjeiro  * @param dev
1792f97422eSNelio Laranjeiro  *   Pointer to Ethernet device structure.
1802f97422eSNelio Laranjeiro  * @param[in, out] rss_conf
1812f97422eSNelio Laranjeiro  *   RSS configuration data.
1822f97422eSNelio Laranjeiro  *
1832f97422eSNelio Laranjeiro  * @return
1842f97422eSNelio Laranjeiro  *   0 on success, negative errno value on failure.
1852f97422eSNelio Laranjeiro  */
1862f97422eSNelio Laranjeiro int
1872f97422eSNelio Laranjeiro mlx5_rss_hash_conf_get(struct rte_eth_dev *dev,
1882f97422eSNelio Laranjeiro 		       struct rte_eth_rss_conf *rss_conf)
1892f97422eSNelio Laranjeiro {
1902f97422eSNelio Laranjeiro 	struct priv *priv = dev->data->dev_private;
1910573873dSNelio Laranjeiro 	struct rte_eth_rss_conf *priv_rss_conf;
1922f97422eSNelio Laranjeiro 
1932f97422eSNelio Laranjeiro 	priv_lock(priv);
1942f97422eSNelio Laranjeiro 
1952f97422eSNelio Laranjeiro 	assert(priv->rss_conf != NULL);
1962f97422eSNelio Laranjeiro 
1970573873dSNelio Laranjeiro 	priv_rss_conf = rss_hash_get(priv, rss_conf->rss_hf);
1980573873dSNelio Laranjeiro 	if (!priv_rss_conf) {
1990573873dSNelio Laranjeiro 		rss_conf->rss_hf = 0;
2000573873dSNelio Laranjeiro 		priv_unlock(priv);
2010573873dSNelio Laranjeiro 		return -EINVAL;
2020573873dSNelio Laranjeiro 	}
2032f97422eSNelio Laranjeiro 	if (rss_conf->rss_key &&
2040573873dSNelio Laranjeiro 	    rss_conf->rss_key_len >= priv_rss_conf->rss_key_len)
2052f97422eSNelio Laranjeiro 		memcpy(rss_conf->rss_key,
2060573873dSNelio Laranjeiro 		       priv_rss_conf->rss_key,
2070573873dSNelio Laranjeiro 		       priv_rss_conf->rss_key_len);
2080573873dSNelio Laranjeiro 	rss_conf->rss_key_len = priv_rss_conf->rss_key_len;
2090573873dSNelio Laranjeiro 	rss_conf->rss_hf = priv_rss_conf->rss_hf;
2102f97422eSNelio Laranjeiro 
2112f97422eSNelio Laranjeiro 	priv_unlock(priv);
2122f97422eSNelio Laranjeiro 	return 0;
2132f97422eSNelio Laranjeiro }
214*634efbc2SNelio Laranjeiro 
215*634efbc2SNelio Laranjeiro /**
216*634efbc2SNelio Laranjeiro  * Allocate/reallocate RETA index table.
217*634efbc2SNelio Laranjeiro  *
218*634efbc2SNelio Laranjeiro  * @param priv
219*634efbc2SNelio Laranjeiro  *   Pointer to private structure.
220*634efbc2SNelio Laranjeiro  * @praram reta_size
221*634efbc2SNelio Laranjeiro  *   The size of the array to allocate.
222*634efbc2SNelio Laranjeiro  *
223*634efbc2SNelio Laranjeiro  * @return
224*634efbc2SNelio Laranjeiro  *   0 on success, errno value on failure.
225*634efbc2SNelio Laranjeiro  */
226*634efbc2SNelio Laranjeiro int
227*634efbc2SNelio Laranjeiro priv_rss_reta_index_resize(struct priv *priv, unsigned int reta_size)
228*634efbc2SNelio Laranjeiro {
229*634efbc2SNelio Laranjeiro 	void *mem;
230*634efbc2SNelio Laranjeiro 	unsigned int old_size = priv->reta_idx_n;
231*634efbc2SNelio Laranjeiro 
232*634efbc2SNelio Laranjeiro 	if (priv->reta_idx_n == reta_size)
233*634efbc2SNelio Laranjeiro 		return 0;
234*634efbc2SNelio Laranjeiro 
235*634efbc2SNelio Laranjeiro 	mem = rte_realloc(priv->reta_idx,
236*634efbc2SNelio Laranjeiro 			  reta_size * sizeof((*priv->reta_idx)[0]), 0);
237*634efbc2SNelio Laranjeiro 	if (!mem)
238*634efbc2SNelio Laranjeiro 		return ENOMEM;
239*634efbc2SNelio Laranjeiro 	priv->reta_idx = mem;
240*634efbc2SNelio Laranjeiro 	priv->reta_idx_n = reta_size;
241*634efbc2SNelio Laranjeiro 
242*634efbc2SNelio Laranjeiro 	if (old_size < reta_size)
243*634efbc2SNelio Laranjeiro 		memset(&(*priv->reta_idx)[old_size], 0,
244*634efbc2SNelio Laranjeiro 		       (reta_size - old_size) *
245*634efbc2SNelio Laranjeiro 		       sizeof((*priv->reta_idx)[0]));
246*634efbc2SNelio Laranjeiro 	return 0;
247*634efbc2SNelio Laranjeiro }
248*634efbc2SNelio Laranjeiro 
249*634efbc2SNelio Laranjeiro /**
250*634efbc2SNelio Laranjeiro  * Query RETA table.
251*634efbc2SNelio Laranjeiro  *
252*634efbc2SNelio Laranjeiro  * @param priv
253*634efbc2SNelio Laranjeiro  *   Pointer to private structure.
254*634efbc2SNelio Laranjeiro  * @param[in, out] reta_conf
255*634efbc2SNelio Laranjeiro  *   Pointer to the first RETA configuration structure.
256*634efbc2SNelio Laranjeiro  * @param reta_size
257*634efbc2SNelio Laranjeiro  *   Number of entries.
258*634efbc2SNelio Laranjeiro  *
259*634efbc2SNelio Laranjeiro  * @return
260*634efbc2SNelio Laranjeiro  *   0 on success, errno value on failure.
261*634efbc2SNelio Laranjeiro  */
262*634efbc2SNelio Laranjeiro static int
263*634efbc2SNelio Laranjeiro priv_dev_rss_reta_query(struct priv *priv,
264*634efbc2SNelio Laranjeiro 			struct rte_eth_rss_reta_entry64 *reta_conf,
265*634efbc2SNelio Laranjeiro 			unsigned int reta_size)
266*634efbc2SNelio Laranjeiro {
267*634efbc2SNelio Laranjeiro 	unsigned int idx;
268*634efbc2SNelio Laranjeiro 	unsigned int i;
269*634efbc2SNelio Laranjeiro 	int ret;
270*634efbc2SNelio Laranjeiro 
271*634efbc2SNelio Laranjeiro 	/* See RETA comment in mlx5_dev_infos_get(). */
272*634efbc2SNelio Laranjeiro 	ret = priv_rss_reta_index_resize(priv, priv->ind_table_max_size);
273*634efbc2SNelio Laranjeiro 	if (ret)
274*634efbc2SNelio Laranjeiro 		return ret;
275*634efbc2SNelio Laranjeiro 
276*634efbc2SNelio Laranjeiro 	/* Fill each entry of the table even if its bit is not set. */
277*634efbc2SNelio Laranjeiro 	for (idx = 0, i = 0; (i != reta_size); ++i) {
278*634efbc2SNelio Laranjeiro 		idx = i / RTE_RETA_GROUP_SIZE;
279*634efbc2SNelio Laranjeiro 		reta_conf[idx].reta[i % RTE_RETA_GROUP_SIZE] =
280*634efbc2SNelio Laranjeiro 			(*priv->reta_idx)[i];
281*634efbc2SNelio Laranjeiro 	}
282*634efbc2SNelio Laranjeiro 	return 0;
283*634efbc2SNelio Laranjeiro }
284*634efbc2SNelio Laranjeiro 
285*634efbc2SNelio Laranjeiro /**
286*634efbc2SNelio Laranjeiro  * Update RETA table.
287*634efbc2SNelio Laranjeiro  *
288*634efbc2SNelio Laranjeiro  * @param priv
289*634efbc2SNelio Laranjeiro  *   Pointer to private structure.
290*634efbc2SNelio Laranjeiro  * @param[in] reta_conf
291*634efbc2SNelio Laranjeiro  *   Pointer to the first RETA configuration structure.
292*634efbc2SNelio Laranjeiro  * @param reta_size
293*634efbc2SNelio Laranjeiro  *   Number of entries.
294*634efbc2SNelio Laranjeiro  *
295*634efbc2SNelio Laranjeiro  * @return
296*634efbc2SNelio Laranjeiro  *   0 on success, errno value on failure.
297*634efbc2SNelio Laranjeiro  */
298*634efbc2SNelio Laranjeiro static int
299*634efbc2SNelio Laranjeiro priv_dev_rss_reta_update(struct priv *priv,
300*634efbc2SNelio Laranjeiro 			 struct rte_eth_rss_reta_entry64 *reta_conf,
301*634efbc2SNelio Laranjeiro 			 unsigned int reta_size)
302*634efbc2SNelio Laranjeiro {
303*634efbc2SNelio Laranjeiro 	unsigned int idx;
304*634efbc2SNelio Laranjeiro 	unsigned int i;
305*634efbc2SNelio Laranjeiro 	unsigned int pos;
306*634efbc2SNelio Laranjeiro 	int ret;
307*634efbc2SNelio Laranjeiro 
308*634efbc2SNelio Laranjeiro 	/* See RETA comment in mlx5_dev_infos_get(). */
309*634efbc2SNelio Laranjeiro 	ret = priv_rss_reta_index_resize(priv, priv->ind_table_max_size);
310*634efbc2SNelio Laranjeiro 	if (ret)
311*634efbc2SNelio Laranjeiro 		return ret;
312*634efbc2SNelio Laranjeiro 
313*634efbc2SNelio Laranjeiro 	for (idx = 0, i = 0; (i != reta_size); ++i) {
314*634efbc2SNelio Laranjeiro 		idx = i / RTE_RETA_GROUP_SIZE;
315*634efbc2SNelio Laranjeiro 		pos = i % RTE_RETA_GROUP_SIZE;
316*634efbc2SNelio Laranjeiro 		if (((reta_conf[idx].mask >> i) & 0x1) == 0)
317*634efbc2SNelio Laranjeiro 			continue;
318*634efbc2SNelio Laranjeiro 		assert(reta_conf[idx].reta[pos] < priv->rxqs_n);
319*634efbc2SNelio Laranjeiro 		(*priv->reta_idx)[i] = reta_conf[idx].reta[pos];
320*634efbc2SNelio Laranjeiro 	}
321*634efbc2SNelio Laranjeiro 	return 0;
322*634efbc2SNelio Laranjeiro }
323*634efbc2SNelio Laranjeiro 
324*634efbc2SNelio Laranjeiro /**
325*634efbc2SNelio Laranjeiro  * DPDK callback to get the RETA indirection table.
326*634efbc2SNelio Laranjeiro  *
327*634efbc2SNelio Laranjeiro  * @param dev
328*634efbc2SNelio Laranjeiro  *   Pointer to Ethernet device structure.
329*634efbc2SNelio Laranjeiro  * @param reta_conf
330*634efbc2SNelio Laranjeiro  *   Pointer to RETA configuration structure array.
331*634efbc2SNelio Laranjeiro  * @param reta_size
332*634efbc2SNelio Laranjeiro  *   Size of the RETA table.
333*634efbc2SNelio Laranjeiro  *
334*634efbc2SNelio Laranjeiro  * @return
335*634efbc2SNelio Laranjeiro  *   0 on success, negative errno value on failure.
336*634efbc2SNelio Laranjeiro  */
337*634efbc2SNelio Laranjeiro int
338*634efbc2SNelio Laranjeiro mlx5_dev_rss_reta_query(struct rte_eth_dev *dev,
339*634efbc2SNelio Laranjeiro 			struct rte_eth_rss_reta_entry64 *reta_conf,
340*634efbc2SNelio Laranjeiro 			uint16_t reta_size)
341*634efbc2SNelio Laranjeiro {
342*634efbc2SNelio Laranjeiro 	int ret;
343*634efbc2SNelio Laranjeiro 	struct priv *priv = dev->data->dev_private;
344*634efbc2SNelio Laranjeiro 
345*634efbc2SNelio Laranjeiro 	priv_lock(priv);
346*634efbc2SNelio Laranjeiro 	ret = priv_dev_rss_reta_query(priv, reta_conf, reta_size);
347*634efbc2SNelio Laranjeiro 	priv_unlock(priv);
348*634efbc2SNelio Laranjeiro 	return -ret;
349*634efbc2SNelio Laranjeiro }
350*634efbc2SNelio Laranjeiro 
351*634efbc2SNelio Laranjeiro /**
352*634efbc2SNelio Laranjeiro  * DPDK callback to update the RETA indirection table.
353*634efbc2SNelio Laranjeiro  *
354*634efbc2SNelio Laranjeiro  * @param dev
355*634efbc2SNelio Laranjeiro  *   Pointer to Ethernet device structure.
356*634efbc2SNelio Laranjeiro  * @param reta_conf
357*634efbc2SNelio Laranjeiro  *   Pointer to RETA configuration structure array.
358*634efbc2SNelio Laranjeiro  * @param reta_size
359*634efbc2SNelio Laranjeiro  *   Size of the RETA table.
360*634efbc2SNelio Laranjeiro  *
361*634efbc2SNelio Laranjeiro  * @return
362*634efbc2SNelio Laranjeiro  *   0 on success, negative errno value on failure.
363*634efbc2SNelio Laranjeiro  */
364*634efbc2SNelio Laranjeiro int
365*634efbc2SNelio Laranjeiro mlx5_dev_rss_reta_update(struct rte_eth_dev *dev,
366*634efbc2SNelio Laranjeiro 			 struct rte_eth_rss_reta_entry64 *reta_conf,
367*634efbc2SNelio Laranjeiro 			 uint16_t reta_size)
368*634efbc2SNelio Laranjeiro {
369*634efbc2SNelio Laranjeiro 	int ret;
370*634efbc2SNelio Laranjeiro 	struct priv *priv = dev->data->dev_private;
371*634efbc2SNelio Laranjeiro 
372*634efbc2SNelio Laranjeiro 	priv_lock(priv);
373*634efbc2SNelio Laranjeiro 	ret = priv_dev_rss_reta_update(priv, reta_conf, reta_size);
374*634efbc2SNelio Laranjeiro 	priv_unlock(priv);
375*634efbc2SNelio Laranjeiro 	return -ret;
376*634efbc2SNelio Laranjeiro }
377