xref: /dpdk/drivers/common/cnxk/roc_nix_rss.c (revision 29a8df5cb664feb6f182c07868c49c0f5c9a4c46)
11bf6746eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
21bf6746eSJerin Jacob  * Copyright(C) 2021 Marvell.
31bf6746eSJerin Jacob  */
41bf6746eSJerin Jacob 
51bf6746eSJerin Jacob #include "roc_api.h"
61bf6746eSJerin Jacob #include "roc_priv.h"
71bf6746eSJerin Jacob 
81bf6746eSJerin Jacob void
91bf6746eSJerin Jacob roc_nix_rss_key_default_fill(struct roc_nix *roc_nix,
101bf6746eSJerin Jacob 			     uint8_t key[ROC_NIX_RSS_KEY_LEN])
111bf6746eSJerin Jacob {
121bf6746eSJerin Jacob 	PLT_SET_USED(roc_nix);
131bf6746eSJerin Jacob 	const uint8_t default_key[ROC_NIX_RSS_KEY_LEN] = {
141bf6746eSJerin Jacob 		0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED,
151bf6746eSJerin Jacob 		0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD,
161bf6746eSJerin Jacob 		0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED,
171bf6746eSJerin Jacob 		0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD,
181bf6746eSJerin Jacob 		0xFE, 0xED, 0x0B, 0xAD, 0xFE, 0xED, 0x0B, 0xAD};
191bf6746eSJerin Jacob 
201bf6746eSJerin Jacob 	memcpy(key, default_key, ROC_NIX_RSS_KEY_LEN);
211bf6746eSJerin Jacob }
221bf6746eSJerin Jacob 
231bf6746eSJerin Jacob void
241bf6746eSJerin Jacob roc_nix_rss_key_set(struct roc_nix *roc_nix,
251bf6746eSJerin Jacob 		    const uint8_t key[ROC_NIX_RSS_KEY_LEN])
261bf6746eSJerin Jacob {
271bf6746eSJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
281bf6746eSJerin Jacob 	const uint64_t *keyptr;
291bf6746eSJerin Jacob 	uint64_t val;
301bf6746eSJerin Jacob 	uint32_t idx;
311bf6746eSJerin Jacob 
321bf6746eSJerin Jacob 	keyptr = (const uint64_t *)key;
331bf6746eSJerin Jacob 	for (idx = 0; idx < (ROC_NIX_RSS_KEY_LEN >> 3); idx++) {
341bf6746eSJerin Jacob 		val = plt_cpu_to_be_64(keyptr[idx]);
351bf6746eSJerin Jacob 		plt_write64(val, nix->base + NIX_LF_RX_SECRETX(idx));
361bf6746eSJerin Jacob 	}
371bf6746eSJerin Jacob }
381bf6746eSJerin Jacob 
391bf6746eSJerin Jacob void
401bf6746eSJerin Jacob roc_nix_rss_key_get(struct roc_nix *roc_nix, uint8_t key[ROC_NIX_RSS_KEY_LEN])
411bf6746eSJerin Jacob {
421bf6746eSJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
431bf6746eSJerin Jacob 	uint64_t *keyptr = (uint64_t *)key;
441bf6746eSJerin Jacob 	uint64_t val;
451bf6746eSJerin Jacob 	uint32_t idx;
461bf6746eSJerin Jacob 
471bf6746eSJerin Jacob 	for (idx = 0; idx < (ROC_NIX_RSS_KEY_LEN >> 3); idx++) {
481bf6746eSJerin Jacob 		val = plt_read64(nix->base + NIX_LF_RX_SECRETX(idx));
491bf6746eSJerin Jacob 		keyptr[idx] = plt_be_to_cpu_64(val);
501bf6746eSJerin Jacob 	}
511bf6746eSJerin Jacob }
521bf6746eSJerin Jacob 
531bf6746eSJerin Jacob static int
541bf6746eSJerin Jacob nix_cn9k_rss_reta_set(struct nix *nix, uint8_t group,
556b7fcb7aSSatha Rao 		      uint16_t reta[ROC_NIX_RSS_RETA_MAX], uint8_t lock_rx_ctx)
561bf6746eSJerin Jacob {
5744a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get((&nix->dev)->mbox);
581bf6746eSJerin Jacob 	struct nix_aq_enq_req *req;
591bf6746eSJerin Jacob 	uint16_t idx;
601bf6746eSJerin Jacob 	int rc;
611bf6746eSJerin Jacob 
621bf6746eSJerin Jacob 	for (idx = 0; idx < nix->reta_sz; idx++) {
631bf6746eSJerin Jacob 		req = mbox_alloc_msg_nix_aq_enq(mbox);
641bf6746eSJerin Jacob 		if (!req) {
651bf6746eSJerin Jacob 			/* The shared memory buffer can be full.
661bf6746eSJerin Jacob 			 * Flush it and retry
671bf6746eSJerin Jacob 			 */
681bf6746eSJerin Jacob 			rc = mbox_process(mbox);
691bf6746eSJerin Jacob 			if (rc < 0)
7044a9307cSRakesh Kudurumalla 				goto exit;
711bf6746eSJerin Jacob 			req = mbox_alloc_msg_nix_aq_enq(mbox);
7244a9307cSRakesh Kudurumalla 			if (!req) {
7344a9307cSRakesh Kudurumalla 				rc = NIX_ERR_NO_MEM;
7444a9307cSRakesh Kudurumalla 				goto exit;
7544a9307cSRakesh Kudurumalla 			}
761bf6746eSJerin Jacob 		}
771bf6746eSJerin Jacob 		req->rss.rq = reta[idx];
781bf6746eSJerin Jacob 		/* Fill AQ info */
791bf6746eSJerin Jacob 		req->qidx = (group * nix->reta_sz) + idx;
801bf6746eSJerin Jacob 		req->ctype = NIX_AQ_CTYPE_RSS;
811bf6746eSJerin Jacob 		req->op = NIX_AQ_INSTOP_INIT;
826b7fcb7aSSatha Rao 
836b7fcb7aSSatha Rao 		if (!lock_rx_ctx)
846b7fcb7aSSatha Rao 			continue;
856b7fcb7aSSatha Rao 
866b7fcb7aSSatha Rao 		req = mbox_alloc_msg_nix_aq_enq(mbox);
876b7fcb7aSSatha Rao 		if (!req) {
886b7fcb7aSSatha Rao 			/* The shared memory buffer can be full.
896b7fcb7aSSatha Rao 			 * Flush it and retry
906b7fcb7aSSatha Rao 			 */
916b7fcb7aSSatha Rao 			rc = mbox_process(mbox);
926b7fcb7aSSatha Rao 			if (rc < 0)
9344a9307cSRakesh Kudurumalla 				goto exit;
946b7fcb7aSSatha Rao 			req = mbox_alloc_msg_nix_aq_enq(mbox);
9544a9307cSRakesh Kudurumalla 			if (!req) {
9644a9307cSRakesh Kudurumalla 				rc = NIX_ERR_NO_MEM;
9744a9307cSRakesh Kudurumalla 				goto exit;
9844a9307cSRakesh Kudurumalla 			}
996b7fcb7aSSatha Rao 		}
1006b7fcb7aSSatha Rao 		req->rss.rq = reta[idx];
1016b7fcb7aSSatha Rao 		/* Fill AQ info */
1026b7fcb7aSSatha Rao 		req->qidx = (group * nix->reta_sz) + idx;
1036b7fcb7aSSatha Rao 		req->ctype = NIX_AQ_CTYPE_RSS;
1046b7fcb7aSSatha Rao 		req->op = NIX_AQ_INSTOP_LOCK;
1051bf6746eSJerin Jacob 	}
1061bf6746eSJerin Jacob 
1071bf6746eSJerin Jacob 	rc = mbox_process(mbox);
1081bf6746eSJerin Jacob 	if (rc < 0)
10944a9307cSRakesh Kudurumalla 		goto exit;
1101bf6746eSJerin Jacob 
11144a9307cSRakesh Kudurumalla 	rc = 0;
11244a9307cSRakesh Kudurumalla exit:
11344a9307cSRakesh Kudurumalla 	mbox_put(mbox);
11444a9307cSRakesh Kudurumalla 	return rc;
1151bf6746eSJerin Jacob }
1161bf6746eSJerin Jacob 
1171bf6746eSJerin Jacob static int
11886667e89SSatha Rao nix_cn10k_rss_reta_set(struct nix *nix, uint8_t group, uint16_t reta[ROC_NIX_RSS_RETA_MAX],
119*29a8df5cSHarman Kalra 		       uint8_t lock_rx_ctx, uint16_t pf_func)
1201bf6746eSJerin Jacob {
12144a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get((&nix->dev)->mbox);
1221bf6746eSJerin Jacob 	struct nix_cn10k_aq_enq_req *req;
1231bf6746eSJerin Jacob 	uint16_t idx;
1241bf6746eSJerin Jacob 	int rc;
1251bf6746eSJerin Jacob 
1261bf6746eSJerin Jacob 	for (idx = 0; idx < nix->reta_sz; idx++) {
1271bf6746eSJerin Jacob 		req = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
1281bf6746eSJerin Jacob 		if (!req) {
1291bf6746eSJerin Jacob 			/* The shared memory buffer can be full.
1301bf6746eSJerin Jacob 			 * Flush it and retry
1311bf6746eSJerin Jacob 			 */
1321bf6746eSJerin Jacob 			rc = mbox_process(mbox);
1331bf6746eSJerin Jacob 			if (rc < 0)
13444a9307cSRakesh Kudurumalla 				goto exit;
1351bf6746eSJerin Jacob 			req = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
13644a9307cSRakesh Kudurumalla 			if (!req) {
13744a9307cSRakesh Kudurumalla 				rc =  NIX_ERR_NO_MEM;
13844a9307cSRakesh Kudurumalla 				goto exit;
13944a9307cSRakesh Kudurumalla 			}
1401bf6746eSJerin Jacob 		}
141*29a8df5cSHarman Kalra 		if (pf_func)
142*29a8df5cSHarman Kalra 			req->hdr.pcifunc = pf_func;
143*29a8df5cSHarman Kalra 
1441bf6746eSJerin Jacob 		req->rss.rq = reta[idx];
1451bf6746eSJerin Jacob 		/* Fill AQ info */
1461bf6746eSJerin Jacob 		req->qidx = (group * nix->reta_sz) + idx;
1471bf6746eSJerin Jacob 		req->ctype = NIX_AQ_CTYPE_RSS;
1481bf6746eSJerin Jacob 		req->op = NIX_AQ_INSTOP_INIT;
1496b7fcb7aSSatha Rao 
1506b7fcb7aSSatha Rao 		if (!lock_rx_ctx)
1516b7fcb7aSSatha Rao 			continue;
1526b7fcb7aSSatha Rao 
1536b7fcb7aSSatha Rao 		req = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
1546b7fcb7aSSatha Rao 		if (!req) {
1556b7fcb7aSSatha Rao 			/* The shared memory buffer can be full.
1566b7fcb7aSSatha Rao 			 * Flush it and retry
1576b7fcb7aSSatha Rao 			 */
1586b7fcb7aSSatha Rao 			rc = mbox_process(mbox);
1596b7fcb7aSSatha Rao 			if (rc < 0)
16044a9307cSRakesh Kudurumalla 				goto exit;
1616b7fcb7aSSatha Rao 			req = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
16244a9307cSRakesh Kudurumalla 			if (!req) {
16344a9307cSRakesh Kudurumalla 				rc =  NIX_ERR_NO_MEM;
16444a9307cSRakesh Kudurumalla 				goto exit;
16544a9307cSRakesh Kudurumalla 			}
1666b7fcb7aSSatha Rao 		}
167*29a8df5cSHarman Kalra 		if (pf_func)
168*29a8df5cSHarman Kalra 			req->hdr.pcifunc = pf_func;
1696b7fcb7aSSatha Rao 		req->rss.rq = reta[idx];
1706b7fcb7aSSatha Rao 		/* Fill AQ info */
1716b7fcb7aSSatha Rao 		req->qidx = (group * nix->reta_sz) + idx;
1726b7fcb7aSSatha Rao 		req->ctype = NIX_AQ_CTYPE_RSS;
1736b7fcb7aSSatha Rao 		req->op = NIX_AQ_INSTOP_LOCK;
1741bf6746eSJerin Jacob 	}
1751bf6746eSJerin Jacob 
1761bf6746eSJerin Jacob 	rc = mbox_process(mbox);
1771bf6746eSJerin Jacob 	if (rc < 0)
17844a9307cSRakesh Kudurumalla 		goto exit;
1791bf6746eSJerin Jacob 
18044a9307cSRakesh Kudurumalla 	rc = 0;
18144a9307cSRakesh Kudurumalla exit:
18244a9307cSRakesh Kudurumalla 	mbox_put(mbox);
18344a9307cSRakesh Kudurumalla 	return rc;
1841bf6746eSJerin Jacob }
1851bf6746eSJerin Jacob 
18686667e89SSatha Rao static int
18786667e89SSatha Rao nix_rss_reta_set(struct nix *nix, uint8_t group, uint16_t reta[ROC_NIX_RSS_RETA_MAX],
188*29a8df5cSHarman Kalra 		 uint8_t lock_rx_ctx, uint16_t pf_func)
18986667e89SSatha Rao {
19086667e89SSatha Rao 	struct mbox *mbox = mbox_get((&nix->dev)->mbox);
19186667e89SSatha Rao 	struct nix_cn20k_aq_enq_req *req;
19286667e89SSatha Rao 	uint16_t idx;
19386667e89SSatha Rao 	int rc;
19486667e89SSatha Rao 
19586667e89SSatha Rao 	for (idx = 0; idx < nix->reta_sz; idx++) {
19686667e89SSatha Rao 		req = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
19786667e89SSatha Rao 		if (!req) {
19886667e89SSatha Rao 			/* The shared memory buffer can be full.
19986667e89SSatha Rao 			 * Flush it and retry
20086667e89SSatha Rao 			 */
20186667e89SSatha Rao 			rc = mbox_process(mbox);
20286667e89SSatha Rao 			if (rc < 0)
20386667e89SSatha Rao 				goto exit;
20486667e89SSatha Rao 			req = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
20586667e89SSatha Rao 			if (!req) {
20686667e89SSatha Rao 				rc =  NIX_ERR_NO_MEM;
20786667e89SSatha Rao 				goto exit;
20886667e89SSatha Rao 			}
20986667e89SSatha Rao 		}
21086667e89SSatha Rao 		req->rss.rq = reta[idx];
21186667e89SSatha Rao 		/* Fill AQ info */
21286667e89SSatha Rao 		req->qidx = (group * nix->reta_sz) + idx;
21386667e89SSatha Rao 		req->ctype = NIX_AQ_CTYPE_RSS;
21486667e89SSatha Rao 		req->op = NIX_AQ_INSTOP_INIT;
21586667e89SSatha Rao 
21686667e89SSatha Rao 		if (!lock_rx_ctx)
21786667e89SSatha Rao 			continue;
21886667e89SSatha Rao 
21986667e89SSatha Rao 		req = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
22086667e89SSatha Rao 		if (!req) {
22186667e89SSatha Rao 			/* The shared memory buffer can be full.
22286667e89SSatha Rao 			 * Flush it and retry
22386667e89SSatha Rao 			 */
22486667e89SSatha Rao 			rc = mbox_process(mbox);
22586667e89SSatha Rao 			if (rc < 0)
22686667e89SSatha Rao 				goto exit;
22786667e89SSatha Rao 			req = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
22886667e89SSatha Rao 			if (!req) {
22986667e89SSatha Rao 				rc =  NIX_ERR_NO_MEM;
23086667e89SSatha Rao 				goto exit;
23186667e89SSatha Rao 			}
23286667e89SSatha Rao 		}
233*29a8df5cSHarman Kalra 		if (pf_func)
234*29a8df5cSHarman Kalra 			req->hdr.pcifunc = pf_func;
23586667e89SSatha Rao 		req->rss.rq = reta[idx];
23686667e89SSatha Rao 		/* Fill AQ info */
23786667e89SSatha Rao 		req->qidx = (group * nix->reta_sz) + idx;
23886667e89SSatha Rao 		req->ctype = NIX_AQ_CTYPE_RSS;
23986667e89SSatha Rao 		req->op = NIX_AQ_INSTOP_LOCK;
24086667e89SSatha Rao 	}
24186667e89SSatha Rao 
24286667e89SSatha Rao 	rc = mbox_process(mbox);
24386667e89SSatha Rao 	if (rc < 0)
24486667e89SSatha Rao 		goto exit;
24586667e89SSatha Rao 
24686667e89SSatha Rao 	rc = 0;
24786667e89SSatha Rao exit:
24886667e89SSatha Rao 	mbox_put(mbox);
24986667e89SSatha Rao 	return rc;
25086667e89SSatha Rao }
25186667e89SSatha Rao 
2521bf6746eSJerin Jacob int
253*29a8df5cSHarman Kalra nix_rss_reta_pffunc_set(struct roc_nix *roc_nix, uint8_t group, uint16_t reta[ROC_NIX_RSS_RETA_MAX],
254*29a8df5cSHarman Kalra 			uint16_t pf_func)
2551bf6746eSJerin Jacob {
2561bf6746eSJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
2571bf6746eSJerin Jacob 	int rc;
2581bf6746eSJerin Jacob 
2591bf6746eSJerin Jacob 	if (group >= ROC_NIX_RSS_GRPS)
2601bf6746eSJerin Jacob 		return NIX_ERR_PARAM;
2611bf6746eSJerin Jacob 
2621bf6746eSJerin Jacob 	if (roc_model_is_cn9k())
263*29a8df5cSHarman Kalra 		rc = nix_cn9k_rss_reta_set(nix, group, reta, roc_nix->lock_rx_ctx);
26486667e89SSatha Rao 	else if (roc_model_is_cn10k())
265*29a8df5cSHarman Kalra 		rc = nix_cn10k_rss_reta_set(nix, group, reta, roc_nix->lock_rx_ctx, pf_func);
2661bf6746eSJerin Jacob 	else
267*29a8df5cSHarman Kalra 		rc = nix_rss_reta_set(nix, group, reta, roc_nix->lock_rx_ctx, pf_func);
2681bf6746eSJerin Jacob 	if (rc)
2691bf6746eSJerin Jacob 		return rc;
2701bf6746eSJerin Jacob 
271dce7f0c2SKommula Shiva Shankar 	memcpy(&nix->reta[group], reta, sizeof(uint16_t) * ROC_NIX_RSS_RETA_MAX);
2721bf6746eSJerin Jacob 	return 0;
2731bf6746eSJerin Jacob }
2741bf6746eSJerin Jacob 
2751bf6746eSJerin Jacob int
276*29a8df5cSHarman Kalra roc_nix_rss_reta_set(struct roc_nix *roc_nix, uint8_t group, uint16_t reta[ROC_NIX_RSS_RETA_MAX])
277*29a8df5cSHarman Kalra {
278*29a8df5cSHarman Kalra 	return nix_rss_reta_pffunc_set(roc_nix, group, reta, 0);
279*29a8df5cSHarman Kalra }
280*29a8df5cSHarman Kalra 
281*29a8df5cSHarman Kalra int
282*29a8df5cSHarman Kalra roc_nix_rss_reta_get(struct roc_nix *roc_nix, uint8_t group, uint16_t reta[ROC_NIX_RSS_RETA_MAX])
2831bf6746eSJerin Jacob {
2841bf6746eSJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
2851bf6746eSJerin Jacob 
2861bf6746eSJerin Jacob 	if (group >= ROC_NIX_RSS_GRPS)
2871bf6746eSJerin Jacob 		return NIX_ERR_PARAM;
2881bf6746eSJerin Jacob 
289dce7f0c2SKommula Shiva Shankar 	memcpy(reta, &nix->reta[group], sizeof(uint16_t) * ROC_NIX_RSS_RETA_MAX);
2901bf6746eSJerin Jacob 	return 0;
2911bf6746eSJerin Jacob }
2921bf6746eSJerin Jacob 
2931bf6746eSJerin Jacob int
294*29a8df5cSHarman Kalra nix_rss_flowkey_pffunc_set(struct roc_nix *roc_nix, uint8_t *alg_idx, uint32_t flowkey,
295*29a8df5cSHarman Kalra 			   uint8_t group, int mcam_index, uint16_t pf_func)
2961bf6746eSJerin Jacob {
2971bf6746eSJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
2981bf6746eSJerin Jacob 	struct nix_rss_flowkey_cfg_rsp *rss_rsp;
29944a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get((&nix->dev)->mbox);
3001bf6746eSJerin Jacob 	struct nix_rss_flowkey_cfg *cfg;
3011bf6746eSJerin Jacob 	int rc = -ENOSPC;
3021bf6746eSJerin Jacob 
30344a9307cSRakesh Kudurumalla 	if (group >= ROC_NIX_RSS_GRPS) {
30444a9307cSRakesh Kudurumalla 		rc = NIX_ERR_PARAM;
30544a9307cSRakesh Kudurumalla 		goto exit;
30644a9307cSRakesh Kudurumalla 	}
3071bf6746eSJerin Jacob 
3081bf6746eSJerin Jacob 	cfg = mbox_alloc_msg_nix_rss_flowkey_cfg(mbox);
3091bf6746eSJerin Jacob 	if (cfg == NULL)
31044a9307cSRakesh Kudurumalla 		goto exit;
311*29a8df5cSHarman Kalra 	if (pf_func)
312*29a8df5cSHarman Kalra 		cfg->hdr.pcifunc = pf_func;
313*29a8df5cSHarman Kalra 
3141bf6746eSJerin Jacob 	cfg->flowkey_cfg = flowkey;
3151bf6746eSJerin Jacob 	cfg->mcam_index = mcam_index; /* -1 indicates default group */
3161bf6746eSJerin Jacob 	cfg->group = group;	      /* 0 is default group */
3171bf6746eSJerin Jacob 	rc = mbox_process_msg(mbox, (void *)&rss_rsp);
3181bf6746eSJerin Jacob 	if (rc)
31944a9307cSRakesh Kudurumalla 		goto exit;
3201bf6746eSJerin Jacob 	if (alg_idx)
3211bf6746eSJerin Jacob 		*alg_idx = rss_rsp->alg_idx;
3221bf6746eSJerin Jacob 
32344a9307cSRakesh Kudurumalla exit:
32444a9307cSRakesh Kudurumalla 	mbox_put(mbox);
3251bf6746eSJerin Jacob 	return rc;
3261bf6746eSJerin Jacob }
3271bf6746eSJerin Jacob 
3281bf6746eSJerin Jacob int
329*29a8df5cSHarman Kalra roc_nix_rss_flowkey_set(struct roc_nix *roc_nix, uint8_t *alg_idx, uint32_t flowkey, uint8_t group,
330*29a8df5cSHarman Kalra 			int mcam_index)
331*29a8df5cSHarman Kalra {
332*29a8df5cSHarman Kalra 	return nix_rss_flowkey_pffunc_set(roc_nix, alg_idx, flowkey, group, mcam_index, 0);
333*29a8df5cSHarman Kalra }
334*29a8df5cSHarman Kalra 
335*29a8df5cSHarman Kalra int
3361bf6746eSJerin Jacob roc_nix_rss_default_setup(struct roc_nix *roc_nix, uint32_t flowkey)
3371bf6746eSJerin Jacob {
3381bf6746eSJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
3391bf6746eSJerin Jacob 	uint16_t idx, qcnt = nix->nb_rx_queues;
3401bf6746eSJerin Jacob 	uint16_t reta[ROC_NIX_RSS_RETA_MAX];
3411bf6746eSJerin Jacob 	uint8_t key[ROC_NIX_RSS_KEY_LEN];
3421bf6746eSJerin Jacob 	uint8_t alg_idx;
3431bf6746eSJerin Jacob 	int rc;
3441bf6746eSJerin Jacob 
3451bf6746eSJerin Jacob 	roc_nix_rss_key_default_fill(roc_nix, key);
3461bf6746eSJerin Jacob 	roc_nix_rss_key_set(roc_nix, key);
3471bf6746eSJerin Jacob 
3481bf6746eSJerin Jacob 	/* Update default RSS RETA */
3491bf6746eSJerin Jacob 	for (idx = 0; idx < nix->reta_sz; idx++)
3501bf6746eSJerin Jacob 		reta[idx] = idx % qcnt;
3511bf6746eSJerin Jacob 	rc = roc_nix_rss_reta_set(roc_nix, 0, reta);
3521bf6746eSJerin Jacob 	if (rc) {
3531bf6746eSJerin Jacob 		plt_err("Failed to set RSS reta table rc=%d", rc);
3541bf6746eSJerin Jacob 		goto fail;
3551bf6746eSJerin Jacob 	}
3561bf6746eSJerin Jacob 
3571bf6746eSJerin Jacob 	/* Update the default flowkey */
3581bf6746eSJerin Jacob 	rc = roc_nix_rss_flowkey_set(roc_nix, &alg_idx, flowkey,
3591bf6746eSJerin Jacob 				     ROC_NIX_RSS_GROUP_DEFAULT, -1);
3601bf6746eSJerin Jacob 	if (rc) {
3611bf6746eSJerin Jacob 		plt_err("Failed to set RSS flowkey rc=%d", rc);
3621bf6746eSJerin Jacob 		goto fail;
3631bf6746eSJerin Jacob 	}
3641bf6746eSJerin Jacob 
3651bf6746eSJerin Jacob 	nix->rss_alg_idx = alg_idx;
3661bf6746eSJerin Jacob fail:
3671bf6746eSJerin Jacob 	return rc;
3681bf6746eSJerin Jacob }
369