1 // SPDX-License-Identifier: GPL-2.0
2 /* Marvell OcteonTx2 RVU Admin Function driver
3  *
4  * Copyright (C) 2018 Marvell International Ltd.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 
11 #include <linux/module.h>
12 #include <linux/pci.h>
13 
14 #include "rvu_struct.h"
15 #include "rvu_reg.h"
16 #include "rvu.h"
17 #include "npc.h"
18 #include "cgx.h"
19 
20 static int nix_update_bcast_mce_list(struct rvu *rvu, u16 pcifunc, bool add);
21 static int rvu_nix_get_bpid(struct rvu *rvu, struct nix_bp_cfg_req *req,
22 			    int type, int chan_id);
23 
24 enum mc_tbl_sz {
25 	MC_TBL_SZ_256,
26 	MC_TBL_SZ_512,
27 	MC_TBL_SZ_1K,
28 	MC_TBL_SZ_2K,
29 	MC_TBL_SZ_4K,
30 	MC_TBL_SZ_8K,
31 	MC_TBL_SZ_16K,
32 	MC_TBL_SZ_32K,
33 	MC_TBL_SZ_64K,
34 };
35 
36 enum mc_buf_cnt {
37 	MC_BUF_CNT_8,
38 	MC_BUF_CNT_16,
39 	MC_BUF_CNT_32,
40 	MC_BUF_CNT_64,
41 	MC_BUF_CNT_128,
42 	MC_BUF_CNT_256,
43 	MC_BUF_CNT_512,
44 	MC_BUF_CNT_1024,
45 	MC_BUF_CNT_2048,
46 };
47 
48 enum nix_makr_fmt_indexes {
49 	NIX_MARK_CFG_IP_DSCP_RED,
50 	NIX_MARK_CFG_IP_DSCP_YELLOW,
51 	NIX_MARK_CFG_IP_DSCP_YELLOW_RED,
52 	NIX_MARK_CFG_IP_ECN_RED,
53 	NIX_MARK_CFG_IP_ECN_YELLOW,
54 	NIX_MARK_CFG_IP_ECN_YELLOW_RED,
55 	NIX_MARK_CFG_VLAN_DEI_RED,
56 	NIX_MARK_CFG_VLAN_DEI_YELLOW,
57 	NIX_MARK_CFG_VLAN_DEI_YELLOW_RED,
58 	NIX_MARK_CFG_MAX,
59 };
60 
61 /* For now considering MC resources needed for broadcast
62  * pkt replication only. i.e 256 HWVFs + 12 PFs.
63  */
64 #define MC_TBL_SIZE	MC_TBL_SZ_512
65 #define MC_BUF_CNT	MC_BUF_CNT_128
66 
67 struct mce {
68 	struct hlist_node	node;
69 	u16			pcifunc;
70 };
71 
72 bool is_nixlf_attached(struct rvu *rvu, u16 pcifunc)
73 {
74 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
75 	int blkaddr;
76 
77 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
78 	if (!pfvf->nixlf || blkaddr < 0)
79 		return false;
80 	return true;
81 }
82 
83 int rvu_get_nixlf_count(struct rvu *rvu)
84 {
85 	struct rvu_block *block;
86 	int blkaddr;
87 
88 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, 0);
89 	if (blkaddr < 0)
90 		return 0;
91 	block = &rvu->hw->block[blkaddr];
92 	return block->lf.max;
93 }
94 
95 int nix_get_nixlf(struct rvu *rvu, u16 pcifunc, int *nixlf, int *nix_blkaddr)
96 {
97 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
98 	struct rvu_hwinfo *hw = rvu->hw;
99 	int blkaddr;
100 
101 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
102 	if (!pfvf->nixlf || blkaddr < 0)
103 		return NIX_AF_ERR_AF_LF_INVALID;
104 
105 	*nixlf = rvu_get_lf(rvu, &hw->block[blkaddr], pcifunc, 0);
106 	if (*nixlf < 0)
107 		return NIX_AF_ERR_AF_LF_INVALID;
108 
109 	if (nix_blkaddr)
110 		*nix_blkaddr = blkaddr;
111 
112 	return 0;
113 }
114 
115 static void nix_mce_list_init(struct nix_mce_list *list, int max)
116 {
117 	INIT_HLIST_HEAD(&list->head);
118 	list->count = 0;
119 	list->max = max;
120 }
121 
122 static u16 nix_alloc_mce_list(struct nix_mcast *mcast, int count)
123 {
124 	int idx;
125 
126 	if (!mcast)
127 		return 0;
128 
129 	idx = mcast->next_free_mce;
130 	mcast->next_free_mce += count;
131 	return idx;
132 }
133 
134 static inline struct nix_hw *get_nix_hw(struct rvu_hwinfo *hw, int blkaddr)
135 {
136 	if (blkaddr == BLKADDR_NIX0 && hw->nix0)
137 		return hw->nix0;
138 
139 	return NULL;
140 }
141 
142 static void nix_rx_sync(struct rvu *rvu, int blkaddr)
143 {
144 	int err;
145 
146 	/*Sync all in flight RX packets to LLC/DRAM */
147 	rvu_write64(rvu, blkaddr, NIX_AF_RX_SW_SYNC, BIT_ULL(0));
148 	err = rvu_poll_reg(rvu, blkaddr, NIX_AF_RX_SW_SYNC, BIT_ULL(0), true);
149 	if (err)
150 		dev_err(rvu->dev, "NIX RX software sync failed\n");
151 }
152 
153 static bool is_valid_txschq(struct rvu *rvu, int blkaddr,
154 			    int lvl, u16 pcifunc, u16 schq)
155 {
156 	struct rvu_hwinfo *hw = rvu->hw;
157 	struct nix_txsch *txsch;
158 	struct nix_hw *nix_hw;
159 	u16 map_func;
160 
161 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
162 	if (!nix_hw)
163 		return false;
164 
165 	txsch = &nix_hw->txsch[lvl];
166 	/* Check out of bounds */
167 	if (schq >= txsch->schq.max)
168 		return false;
169 
170 	mutex_lock(&rvu->rsrc_lock);
171 	map_func = TXSCH_MAP_FUNC(txsch->pfvf_map[schq]);
172 	mutex_unlock(&rvu->rsrc_lock);
173 
174 	/* TLs aggegating traffic are shared across PF and VFs */
175 	if (lvl >= hw->cap.nix_tx_aggr_lvl) {
176 		if (rvu_get_pf(map_func) != rvu_get_pf(pcifunc))
177 			return false;
178 		else
179 			return true;
180 	}
181 
182 	if (map_func != pcifunc)
183 		return false;
184 
185 	return true;
186 }
187 
188 static int nix_interface_init(struct rvu *rvu, u16 pcifunc, int type, int nixlf)
189 {
190 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
191 	u8 cgx_id, lmac_id;
192 	int pkind, pf, vf;
193 	int err;
194 
195 	pf = rvu_get_pf(pcifunc);
196 	if (!is_pf_cgxmapped(rvu, pf) && type != NIX_INTF_TYPE_LBK)
197 		return 0;
198 
199 	switch (type) {
200 	case NIX_INTF_TYPE_CGX:
201 		pfvf->cgx_lmac = rvu->pf2cgxlmac_map[pf];
202 		rvu_get_cgx_lmac_id(pfvf->cgx_lmac, &cgx_id, &lmac_id);
203 
204 		pkind = rvu_npc_get_pkind(rvu, pf);
205 		if (pkind < 0) {
206 			dev_err(rvu->dev,
207 				"PF_Func 0x%x: Invalid pkind\n", pcifunc);
208 			return -EINVAL;
209 		}
210 		pfvf->rx_chan_base = NIX_CHAN_CGX_LMAC_CHX(cgx_id, lmac_id, 0);
211 		pfvf->tx_chan_base = pfvf->rx_chan_base;
212 		pfvf->rx_chan_cnt = 1;
213 		pfvf->tx_chan_cnt = 1;
214 		cgx_set_pkind(rvu_cgx_pdata(cgx_id, rvu), lmac_id, pkind);
215 		rvu_npc_set_pkind(rvu, pkind, pfvf);
216 
217 		/* By default we enable pause frames */
218 		if ((pcifunc & RVU_PFVF_FUNC_MASK) == 0)
219 			cgx_lmac_set_pause_frm(rvu_cgx_pdata(cgx_id, rvu),
220 					       lmac_id, true, true);
221 		break;
222 	case NIX_INTF_TYPE_LBK:
223 		vf = (pcifunc & RVU_PFVF_FUNC_MASK) - 1;
224 
225 		/* Note that AF's VFs work in pairs and talk over consecutive
226 		 * loopback channels.Therefore if odd number of AF VFs are
227 		 * enabled then the last VF remains with no pair.
228 		 */
229 		pfvf->rx_chan_base = NIX_CHAN_LBK_CHX(0, vf);
230 		pfvf->tx_chan_base = vf & 0x1 ? NIX_CHAN_LBK_CHX(0, vf - 1) :
231 						NIX_CHAN_LBK_CHX(0, vf + 1);
232 		pfvf->rx_chan_cnt = 1;
233 		pfvf->tx_chan_cnt = 1;
234 		rvu_npc_install_promisc_entry(rvu, pcifunc, nixlf,
235 					      pfvf->rx_chan_base, false);
236 		break;
237 	}
238 
239 	/* Add a UCAST forwarding rule in MCAM with this NIXLF attached
240 	 * RVU PF/VF's MAC address.
241 	 */
242 	rvu_npc_install_ucast_entry(rvu, pcifunc, nixlf,
243 				    pfvf->rx_chan_base, pfvf->mac_addr);
244 
245 	/* Add this PF_FUNC to bcast pkt replication list */
246 	err = nix_update_bcast_mce_list(rvu, pcifunc, true);
247 	if (err) {
248 		dev_err(rvu->dev,
249 			"Bcast list, failed to enable PF_FUNC 0x%x\n",
250 			pcifunc);
251 		return err;
252 	}
253 
254 	rvu_npc_install_bcast_match_entry(rvu, pcifunc,
255 					  nixlf, pfvf->rx_chan_base);
256 	pfvf->maxlen = NIC_HW_MIN_FRS;
257 	pfvf->minlen = NIC_HW_MIN_FRS;
258 
259 	return 0;
260 }
261 
262 static void nix_interface_deinit(struct rvu *rvu, u16 pcifunc, u8 nixlf)
263 {
264 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
265 	int err;
266 
267 	pfvf->maxlen = 0;
268 	pfvf->minlen = 0;
269 	pfvf->rxvlan = false;
270 
271 	/* Remove this PF_FUNC from bcast pkt replication list */
272 	err = nix_update_bcast_mce_list(rvu, pcifunc, false);
273 	if (err) {
274 		dev_err(rvu->dev,
275 			"Bcast list, failed to disable PF_FUNC 0x%x\n",
276 			pcifunc);
277 	}
278 
279 	/* Free and disable any MCAM entries used by this NIX LF */
280 	rvu_npc_disable_mcam_entries(rvu, pcifunc, nixlf);
281 }
282 
283 int rvu_mbox_handler_nix_bp_disable(struct rvu *rvu,
284 				    struct nix_bp_cfg_req *req,
285 				    struct msg_rsp *rsp)
286 {
287 	u16 pcifunc = req->hdr.pcifunc;
288 	struct rvu_pfvf *pfvf;
289 	int blkaddr, pf, type;
290 	u16 chan_base, chan;
291 	u64 cfg;
292 
293 	pf = rvu_get_pf(pcifunc);
294 	type = is_afvf(pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
295 	if (!is_pf_cgxmapped(rvu, pf) && type != NIX_INTF_TYPE_LBK)
296 		return 0;
297 
298 	pfvf = rvu_get_pfvf(rvu, pcifunc);
299 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
300 
301 	chan_base = pfvf->rx_chan_base + req->chan_base;
302 	for (chan = chan_base; chan < (chan_base + req->chan_cnt); chan++) {
303 		cfg = rvu_read64(rvu, blkaddr, NIX_AF_RX_CHANX_CFG(chan));
304 		rvu_write64(rvu, blkaddr, NIX_AF_RX_CHANX_CFG(chan),
305 			    cfg & ~BIT_ULL(16));
306 	}
307 	return 0;
308 }
309 
310 static int rvu_nix_get_bpid(struct rvu *rvu, struct nix_bp_cfg_req *req,
311 			    int type, int chan_id)
312 {
313 	int bpid, blkaddr, lmac_chan_cnt;
314 	struct rvu_hwinfo *hw = rvu->hw;
315 	u16 cgx_bpid_cnt, lbk_bpid_cnt;
316 	struct rvu_pfvf *pfvf;
317 	u8 cgx_id, lmac_id;
318 	u64 cfg;
319 
320 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, req->hdr.pcifunc);
321 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST);
322 	lmac_chan_cnt = cfg & 0xFF;
323 
324 	cgx_bpid_cnt = hw->cgx_links * lmac_chan_cnt;
325 	lbk_bpid_cnt = hw->lbk_links * ((cfg >> 16) & 0xFF);
326 
327 	pfvf = rvu_get_pfvf(rvu, req->hdr.pcifunc);
328 
329 	/* Backpressure IDs range division
330 	 * CGX channles are mapped to (0 - 191) BPIDs
331 	 * LBK channles are mapped to (192 - 255) BPIDs
332 	 * SDP channles are mapped to (256 - 511) BPIDs
333 	 *
334 	 * Lmac channles and bpids mapped as follows
335 	 * cgx(0)_lmac(0)_chan(0 - 15) = bpid(0 - 15)
336 	 * cgx(0)_lmac(1)_chan(0 - 15) = bpid(16 - 31) ....
337 	 * cgx(1)_lmac(0)_chan(0 - 15) = bpid(64 - 79) ....
338 	 */
339 	switch (type) {
340 	case NIX_INTF_TYPE_CGX:
341 		if ((req->chan_base + req->chan_cnt) > 15)
342 			return -EINVAL;
343 		rvu_get_cgx_lmac_id(pfvf->cgx_lmac, &cgx_id, &lmac_id);
344 		/* Assign bpid based on cgx, lmac and chan id */
345 		bpid = (cgx_id * hw->lmac_per_cgx * lmac_chan_cnt) +
346 			(lmac_id * lmac_chan_cnt) + req->chan_base;
347 
348 		if (req->bpid_per_chan)
349 			bpid += chan_id;
350 		if (bpid > cgx_bpid_cnt)
351 			return -EINVAL;
352 		break;
353 
354 	case NIX_INTF_TYPE_LBK:
355 		if ((req->chan_base + req->chan_cnt) > 63)
356 			return -EINVAL;
357 		bpid = cgx_bpid_cnt + req->chan_base;
358 		if (req->bpid_per_chan)
359 			bpid += chan_id;
360 		if (bpid > (cgx_bpid_cnt + lbk_bpid_cnt))
361 			return -EINVAL;
362 		break;
363 	default:
364 		return -EINVAL;
365 	}
366 	return bpid;
367 }
368 
369 int rvu_mbox_handler_nix_bp_enable(struct rvu *rvu,
370 				   struct nix_bp_cfg_req *req,
371 				   struct nix_bp_cfg_rsp *rsp)
372 {
373 	int blkaddr, pf, type, chan_id = 0;
374 	u16 pcifunc = req->hdr.pcifunc;
375 	struct rvu_pfvf *pfvf;
376 	u16 chan_base, chan;
377 	s16 bpid, bpid_base;
378 	u64 cfg;
379 
380 	pf = rvu_get_pf(pcifunc);
381 	type = is_afvf(pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
382 
383 	/* Enable backpressure only for CGX mapped PFs and LBK interface */
384 	if (!is_pf_cgxmapped(rvu, pf) && type != NIX_INTF_TYPE_LBK)
385 		return 0;
386 
387 	pfvf = rvu_get_pfvf(rvu, pcifunc);
388 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
389 
390 	bpid_base = rvu_nix_get_bpid(rvu, req, type, chan_id);
391 	chan_base = pfvf->rx_chan_base + req->chan_base;
392 	bpid = bpid_base;
393 
394 	for (chan = chan_base; chan < (chan_base + req->chan_cnt); chan++) {
395 		if (bpid < 0) {
396 			dev_warn(rvu->dev, "Fail to enable backpressure\n");
397 			return -EINVAL;
398 		}
399 
400 		cfg = rvu_read64(rvu, blkaddr, NIX_AF_RX_CHANX_CFG(chan));
401 		rvu_write64(rvu, blkaddr, NIX_AF_RX_CHANX_CFG(chan),
402 			    cfg | (bpid & 0xFF) | BIT_ULL(16));
403 		chan_id++;
404 		bpid = rvu_nix_get_bpid(rvu, req, type, chan_id);
405 	}
406 
407 	for (chan = 0; chan < req->chan_cnt; chan++) {
408 		/* Map channel and bpid assign to it */
409 		rsp->chan_bpid[chan] = ((req->chan_base + chan) & 0x7F) << 10 |
410 					(bpid_base & 0x3FF);
411 		if (req->bpid_per_chan)
412 			bpid_base++;
413 	}
414 	rsp->chan_cnt = req->chan_cnt;
415 
416 	return 0;
417 }
418 
419 static void nix_setup_lso_tso_l3(struct rvu *rvu, int blkaddr,
420 				 u64 format, bool v4, u64 *fidx)
421 {
422 	struct nix_lso_format field = {0};
423 
424 	/* IP's Length field */
425 	field.layer = NIX_TXLAYER_OL3;
426 	/* In ipv4, length field is at offset 2 bytes, for ipv6 it's 4 */
427 	field.offset = v4 ? 2 : 4;
428 	field.sizem1 = 1; /* i.e 2 bytes */
429 	field.alg = NIX_LSOALG_ADD_PAYLEN;
430 	rvu_write64(rvu, blkaddr,
431 		    NIX_AF_LSO_FORMATX_FIELDX(format, (*fidx)++),
432 		    *(u64 *)&field);
433 
434 	/* No ID field in IPv6 header */
435 	if (!v4)
436 		return;
437 
438 	/* IP's ID field */
439 	field.layer = NIX_TXLAYER_OL3;
440 	field.offset = 4;
441 	field.sizem1 = 1; /* i.e 2 bytes */
442 	field.alg = NIX_LSOALG_ADD_SEGNUM;
443 	rvu_write64(rvu, blkaddr,
444 		    NIX_AF_LSO_FORMATX_FIELDX(format, (*fidx)++),
445 		    *(u64 *)&field);
446 }
447 
448 static void nix_setup_lso_tso_l4(struct rvu *rvu, int blkaddr,
449 				 u64 format, u64 *fidx)
450 {
451 	struct nix_lso_format field = {0};
452 
453 	/* TCP's sequence number field */
454 	field.layer = NIX_TXLAYER_OL4;
455 	field.offset = 4;
456 	field.sizem1 = 3; /* i.e 4 bytes */
457 	field.alg = NIX_LSOALG_ADD_OFFSET;
458 	rvu_write64(rvu, blkaddr,
459 		    NIX_AF_LSO_FORMATX_FIELDX(format, (*fidx)++),
460 		    *(u64 *)&field);
461 
462 	/* TCP's flags field */
463 	field.layer = NIX_TXLAYER_OL4;
464 	field.offset = 12;
465 	field.sizem1 = 1; /* 2 bytes */
466 	field.alg = NIX_LSOALG_TCP_FLAGS;
467 	rvu_write64(rvu, blkaddr,
468 		    NIX_AF_LSO_FORMATX_FIELDX(format, (*fidx)++),
469 		    *(u64 *)&field);
470 }
471 
472 static void nix_setup_lso(struct rvu *rvu, struct nix_hw *nix_hw, int blkaddr)
473 {
474 	u64 cfg, idx, fidx = 0;
475 
476 	/* Get max HW supported format indices */
477 	cfg = (rvu_read64(rvu, blkaddr, NIX_AF_CONST1) >> 48) & 0xFF;
478 	nix_hw->lso.total = cfg;
479 
480 	/* Enable LSO */
481 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_LSO_CFG);
482 	/* For TSO, set first and middle segment flags to
483 	 * mask out PSH, RST & FIN flags in TCP packet
484 	 */
485 	cfg &= ~((0xFFFFULL << 32) | (0xFFFFULL << 16));
486 	cfg |= (0xFFF2ULL << 32) | (0xFFF2ULL << 16);
487 	rvu_write64(rvu, blkaddr, NIX_AF_LSO_CFG, cfg | BIT_ULL(63));
488 
489 	/* Setup default static LSO formats
490 	 *
491 	 * Configure format fields for TCPv4 segmentation offload
492 	 */
493 	idx = NIX_LSO_FORMAT_IDX_TSOV4;
494 	nix_setup_lso_tso_l3(rvu, blkaddr, idx, true, &fidx);
495 	nix_setup_lso_tso_l4(rvu, blkaddr, idx, &fidx);
496 
497 	/* Set rest of the fields to NOP */
498 	for (; fidx < 8; fidx++) {
499 		rvu_write64(rvu, blkaddr,
500 			    NIX_AF_LSO_FORMATX_FIELDX(idx, fidx), 0x0ULL);
501 	}
502 	nix_hw->lso.in_use++;
503 
504 	/* Configure format fields for TCPv6 segmentation offload */
505 	idx = NIX_LSO_FORMAT_IDX_TSOV6;
506 	fidx = 0;
507 	nix_setup_lso_tso_l3(rvu, blkaddr, idx, false, &fidx);
508 	nix_setup_lso_tso_l4(rvu, blkaddr, idx, &fidx);
509 
510 	/* Set rest of the fields to NOP */
511 	for (; fidx < 8; fidx++) {
512 		rvu_write64(rvu, blkaddr,
513 			    NIX_AF_LSO_FORMATX_FIELDX(idx, fidx), 0x0ULL);
514 	}
515 	nix_hw->lso.in_use++;
516 }
517 
518 static void nix_ctx_free(struct rvu *rvu, struct rvu_pfvf *pfvf)
519 {
520 	kfree(pfvf->rq_bmap);
521 	kfree(pfvf->sq_bmap);
522 	kfree(pfvf->cq_bmap);
523 	if (pfvf->rq_ctx)
524 		qmem_free(rvu->dev, pfvf->rq_ctx);
525 	if (pfvf->sq_ctx)
526 		qmem_free(rvu->dev, pfvf->sq_ctx);
527 	if (pfvf->cq_ctx)
528 		qmem_free(rvu->dev, pfvf->cq_ctx);
529 	if (pfvf->rss_ctx)
530 		qmem_free(rvu->dev, pfvf->rss_ctx);
531 	if (pfvf->nix_qints_ctx)
532 		qmem_free(rvu->dev, pfvf->nix_qints_ctx);
533 	if (pfvf->cq_ints_ctx)
534 		qmem_free(rvu->dev, pfvf->cq_ints_ctx);
535 
536 	pfvf->rq_bmap = NULL;
537 	pfvf->cq_bmap = NULL;
538 	pfvf->sq_bmap = NULL;
539 	pfvf->rq_ctx = NULL;
540 	pfvf->sq_ctx = NULL;
541 	pfvf->cq_ctx = NULL;
542 	pfvf->rss_ctx = NULL;
543 	pfvf->nix_qints_ctx = NULL;
544 	pfvf->cq_ints_ctx = NULL;
545 }
546 
547 static int nixlf_rss_ctx_init(struct rvu *rvu, int blkaddr,
548 			      struct rvu_pfvf *pfvf, int nixlf,
549 			      int rss_sz, int rss_grps, int hwctx_size,
550 			      u64 way_mask)
551 {
552 	int err, grp, num_indices;
553 
554 	/* RSS is not requested for this NIXLF */
555 	if (!rss_sz)
556 		return 0;
557 	num_indices = rss_sz * rss_grps;
558 
559 	/* Alloc NIX RSS HW context memory and config the base */
560 	err = qmem_alloc(rvu->dev, &pfvf->rss_ctx, num_indices, hwctx_size);
561 	if (err)
562 		return err;
563 
564 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_RSS_BASE(nixlf),
565 		    (u64)pfvf->rss_ctx->iova);
566 
567 	/* Config full RSS table size, enable RSS and caching */
568 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_RSS_CFG(nixlf),
569 		    BIT_ULL(36) | BIT_ULL(4) |
570 		    ilog2(num_indices / MAX_RSS_INDIR_TBL_SIZE) |
571 		    way_mask << 20);
572 	/* Config RSS group offset and sizes */
573 	for (grp = 0; grp < rss_grps; grp++)
574 		rvu_write64(rvu, blkaddr, NIX_AF_LFX_RSS_GRPX(nixlf, grp),
575 			    ((ilog2(rss_sz) - 1) << 16) | (rss_sz * grp));
576 	return 0;
577 }
578 
579 static int nix_aq_enqueue_wait(struct rvu *rvu, struct rvu_block *block,
580 			       struct nix_aq_inst_s *inst)
581 {
582 	struct admin_queue *aq = block->aq;
583 	struct nix_aq_res_s *result;
584 	int timeout = 1000;
585 	u64 reg, head;
586 
587 	result = (struct nix_aq_res_s *)aq->res->base;
588 
589 	/* Get current head pointer where to append this instruction */
590 	reg = rvu_read64(rvu, block->addr, NIX_AF_AQ_STATUS);
591 	head = (reg >> 4) & AQ_PTR_MASK;
592 
593 	memcpy((void *)(aq->inst->base + (head * aq->inst->entry_sz)),
594 	       (void *)inst, aq->inst->entry_sz);
595 	memset(result, 0, sizeof(*result));
596 	/* sync into memory */
597 	wmb();
598 
599 	/* Ring the doorbell and wait for result */
600 	rvu_write64(rvu, block->addr, NIX_AF_AQ_DOOR, 1);
601 	while (result->compcode == NIX_AQ_COMP_NOTDONE) {
602 		cpu_relax();
603 		udelay(1);
604 		timeout--;
605 		if (!timeout)
606 			return -EBUSY;
607 	}
608 
609 	if (result->compcode != NIX_AQ_COMP_GOOD)
610 		/* TODO: Replace this with some error code */
611 		return -EBUSY;
612 
613 	return 0;
614 }
615 
616 static int rvu_nix_aq_enq_inst(struct rvu *rvu, struct nix_aq_enq_req *req,
617 			       struct nix_aq_enq_rsp *rsp)
618 {
619 	struct rvu_hwinfo *hw = rvu->hw;
620 	u16 pcifunc = req->hdr.pcifunc;
621 	int nixlf, blkaddr, rc = 0;
622 	struct nix_aq_inst_s inst;
623 	struct rvu_block *block;
624 	struct admin_queue *aq;
625 	struct rvu_pfvf *pfvf;
626 	void *ctx, *mask;
627 	bool ena;
628 	u64 cfg;
629 
630 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
631 	if (blkaddr < 0)
632 		return NIX_AF_ERR_AF_LF_INVALID;
633 
634 	block = &hw->block[blkaddr];
635 	aq = block->aq;
636 	if (!aq) {
637 		dev_warn(rvu->dev, "%s: NIX AQ not initialized\n", __func__);
638 		return NIX_AF_ERR_AQ_ENQUEUE;
639 	}
640 
641 	pfvf = rvu_get_pfvf(rvu, pcifunc);
642 	nixlf = rvu_get_lf(rvu, block, pcifunc, 0);
643 
644 	/* Skip NIXLF check for broadcast MCE entry init */
645 	if (!(!rsp && req->ctype == NIX_AQ_CTYPE_MCE)) {
646 		if (!pfvf->nixlf || nixlf < 0)
647 			return NIX_AF_ERR_AF_LF_INVALID;
648 	}
649 
650 	switch (req->ctype) {
651 	case NIX_AQ_CTYPE_RQ:
652 		/* Check if index exceeds max no of queues */
653 		if (!pfvf->rq_ctx || req->qidx >= pfvf->rq_ctx->qsize)
654 			rc = NIX_AF_ERR_AQ_ENQUEUE;
655 		break;
656 	case NIX_AQ_CTYPE_SQ:
657 		if (!pfvf->sq_ctx || req->qidx >= pfvf->sq_ctx->qsize)
658 			rc = NIX_AF_ERR_AQ_ENQUEUE;
659 		break;
660 	case NIX_AQ_CTYPE_CQ:
661 		if (!pfvf->cq_ctx || req->qidx >= pfvf->cq_ctx->qsize)
662 			rc = NIX_AF_ERR_AQ_ENQUEUE;
663 		break;
664 	case NIX_AQ_CTYPE_RSS:
665 		/* Check if RSS is enabled and qidx is within range */
666 		cfg = rvu_read64(rvu, blkaddr, NIX_AF_LFX_RSS_CFG(nixlf));
667 		if (!(cfg & BIT_ULL(4)) || !pfvf->rss_ctx ||
668 		    (req->qidx >= (256UL << (cfg & 0xF))))
669 			rc = NIX_AF_ERR_AQ_ENQUEUE;
670 		break;
671 	case NIX_AQ_CTYPE_MCE:
672 		cfg = rvu_read64(rvu, blkaddr, NIX_AF_RX_MCAST_CFG);
673 		/* Check if index exceeds MCE list length */
674 		if (!hw->nix0->mcast.mce_ctx ||
675 		    (req->qidx >= (256UL << (cfg & 0xF))))
676 			rc = NIX_AF_ERR_AQ_ENQUEUE;
677 
678 		/* Adding multicast lists for requests from PF/VFs is not
679 		 * yet supported, so ignore this.
680 		 */
681 		if (rsp)
682 			rc = NIX_AF_ERR_AQ_ENQUEUE;
683 		break;
684 	default:
685 		rc = NIX_AF_ERR_AQ_ENQUEUE;
686 	}
687 
688 	if (rc)
689 		return rc;
690 
691 	/* Check if SQ pointed SMQ belongs to this PF/VF or not */
692 	if (req->ctype == NIX_AQ_CTYPE_SQ &&
693 	    ((req->op == NIX_AQ_INSTOP_INIT && req->sq.ena) ||
694 	     (req->op == NIX_AQ_INSTOP_WRITE &&
695 	      req->sq_mask.ena && req->sq_mask.smq && req->sq.ena))) {
696 		if (!is_valid_txschq(rvu, blkaddr, NIX_TXSCH_LVL_SMQ,
697 				     pcifunc, req->sq.smq))
698 			return NIX_AF_ERR_AQ_ENQUEUE;
699 	}
700 
701 	memset(&inst, 0, sizeof(struct nix_aq_inst_s));
702 	inst.lf = nixlf;
703 	inst.cindex = req->qidx;
704 	inst.ctype = req->ctype;
705 	inst.op = req->op;
706 	/* Currently we are not supporting enqueuing multiple instructions,
707 	 * so always choose first entry in result memory.
708 	 */
709 	inst.res_addr = (u64)aq->res->iova;
710 
711 	/* Hardware uses same aq->res->base for updating result of
712 	 * previous instruction hence wait here till it is done.
713 	 */
714 	spin_lock(&aq->lock);
715 
716 	/* Clean result + context memory */
717 	memset(aq->res->base, 0, aq->res->entry_sz);
718 	/* Context needs to be written at RES_ADDR + 128 */
719 	ctx = aq->res->base + 128;
720 	/* Mask needs to be written at RES_ADDR + 256 */
721 	mask = aq->res->base + 256;
722 
723 	switch (req->op) {
724 	case NIX_AQ_INSTOP_WRITE:
725 		if (req->ctype == NIX_AQ_CTYPE_RQ)
726 			memcpy(mask, &req->rq_mask,
727 			       sizeof(struct nix_rq_ctx_s));
728 		else if (req->ctype == NIX_AQ_CTYPE_SQ)
729 			memcpy(mask, &req->sq_mask,
730 			       sizeof(struct nix_sq_ctx_s));
731 		else if (req->ctype == NIX_AQ_CTYPE_CQ)
732 			memcpy(mask, &req->cq_mask,
733 			       sizeof(struct nix_cq_ctx_s));
734 		else if (req->ctype == NIX_AQ_CTYPE_RSS)
735 			memcpy(mask, &req->rss_mask,
736 			       sizeof(struct nix_rsse_s));
737 		else if (req->ctype == NIX_AQ_CTYPE_MCE)
738 			memcpy(mask, &req->mce_mask,
739 			       sizeof(struct nix_rx_mce_s));
740 		/* Fall through */
741 	case NIX_AQ_INSTOP_INIT:
742 		if (req->ctype == NIX_AQ_CTYPE_RQ)
743 			memcpy(ctx, &req->rq, sizeof(struct nix_rq_ctx_s));
744 		else if (req->ctype == NIX_AQ_CTYPE_SQ)
745 			memcpy(ctx, &req->sq, sizeof(struct nix_sq_ctx_s));
746 		else if (req->ctype == NIX_AQ_CTYPE_CQ)
747 			memcpy(ctx, &req->cq, sizeof(struct nix_cq_ctx_s));
748 		else if (req->ctype == NIX_AQ_CTYPE_RSS)
749 			memcpy(ctx, &req->rss, sizeof(struct nix_rsse_s));
750 		else if (req->ctype == NIX_AQ_CTYPE_MCE)
751 			memcpy(ctx, &req->mce, sizeof(struct nix_rx_mce_s));
752 		break;
753 	case NIX_AQ_INSTOP_NOP:
754 	case NIX_AQ_INSTOP_READ:
755 	case NIX_AQ_INSTOP_LOCK:
756 	case NIX_AQ_INSTOP_UNLOCK:
757 		break;
758 	default:
759 		rc = NIX_AF_ERR_AQ_ENQUEUE;
760 		spin_unlock(&aq->lock);
761 		return rc;
762 	}
763 
764 	/* Submit the instruction to AQ */
765 	rc = nix_aq_enqueue_wait(rvu, block, &inst);
766 	if (rc) {
767 		spin_unlock(&aq->lock);
768 		return rc;
769 	}
770 
771 	/* Set RQ/SQ/CQ bitmap if respective queue hw context is enabled */
772 	if (req->op == NIX_AQ_INSTOP_INIT) {
773 		if (req->ctype == NIX_AQ_CTYPE_RQ && req->rq.ena)
774 			__set_bit(req->qidx, pfvf->rq_bmap);
775 		if (req->ctype == NIX_AQ_CTYPE_SQ && req->sq.ena)
776 			__set_bit(req->qidx, pfvf->sq_bmap);
777 		if (req->ctype == NIX_AQ_CTYPE_CQ && req->cq.ena)
778 			__set_bit(req->qidx, pfvf->cq_bmap);
779 	}
780 
781 	if (req->op == NIX_AQ_INSTOP_WRITE) {
782 		if (req->ctype == NIX_AQ_CTYPE_RQ) {
783 			ena = (req->rq.ena & req->rq_mask.ena) |
784 				(test_bit(req->qidx, pfvf->rq_bmap) &
785 				~req->rq_mask.ena);
786 			if (ena)
787 				__set_bit(req->qidx, pfvf->rq_bmap);
788 			else
789 				__clear_bit(req->qidx, pfvf->rq_bmap);
790 		}
791 		if (req->ctype == NIX_AQ_CTYPE_SQ) {
792 			ena = (req->rq.ena & req->sq_mask.ena) |
793 				(test_bit(req->qidx, pfvf->sq_bmap) &
794 				~req->sq_mask.ena);
795 			if (ena)
796 				__set_bit(req->qidx, pfvf->sq_bmap);
797 			else
798 				__clear_bit(req->qidx, pfvf->sq_bmap);
799 		}
800 		if (req->ctype == NIX_AQ_CTYPE_CQ) {
801 			ena = (req->rq.ena & req->cq_mask.ena) |
802 				(test_bit(req->qidx, pfvf->cq_bmap) &
803 				~req->cq_mask.ena);
804 			if (ena)
805 				__set_bit(req->qidx, pfvf->cq_bmap);
806 			else
807 				__clear_bit(req->qidx, pfvf->cq_bmap);
808 		}
809 	}
810 
811 	if (rsp) {
812 		/* Copy read context into mailbox */
813 		if (req->op == NIX_AQ_INSTOP_READ) {
814 			if (req->ctype == NIX_AQ_CTYPE_RQ)
815 				memcpy(&rsp->rq, ctx,
816 				       sizeof(struct nix_rq_ctx_s));
817 			else if (req->ctype == NIX_AQ_CTYPE_SQ)
818 				memcpy(&rsp->sq, ctx,
819 				       sizeof(struct nix_sq_ctx_s));
820 			else if (req->ctype == NIX_AQ_CTYPE_CQ)
821 				memcpy(&rsp->cq, ctx,
822 				       sizeof(struct nix_cq_ctx_s));
823 			else if (req->ctype == NIX_AQ_CTYPE_RSS)
824 				memcpy(&rsp->rss, ctx,
825 				       sizeof(struct nix_rsse_s));
826 			else if (req->ctype == NIX_AQ_CTYPE_MCE)
827 				memcpy(&rsp->mce, ctx,
828 				       sizeof(struct nix_rx_mce_s));
829 		}
830 	}
831 
832 	spin_unlock(&aq->lock);
833 	return 0;
834 }
835 
836 static const char *nix_get_ctx_name(int ctype)
837 {
838 	switch (ctype) {
839 	case NIX_AQ_CTYPE_CQ:
840 		return "CQ";
841 	case NIX_AQ_CTYPE_SQ:
842 		return "SQ";
843 	case NIX_AQ_CTYPE_RQ:
844 		return "RQ";
845 	case NIX_AQ_CTYPE_RSS:
846 		return "RSS";
847 	}
848 	return "";
849 }
850 
851 static int nix_lf_hwctx_disable(struct rvu *rvu, struct hwctx_disable_req *req)
852 {
853 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, req->hdr.pcifunc);
854 	struct nix_aq_enq_req aq_req;
855 	unsigned long *bmap;
856 	int qidx, q_cnt = 0;
857 	int err = 0, rc;
858 
859 	if (!pfvf->cq_ctx || !pfvf->sq_ctx || !pfvf->rq_ctx)
860 		return NIX_AF_ERR_AQ_ENQUEUE;
861 
862 	memset(&aq_req, 0, sizeof(struct nix_aq_enq_req));
863 	aq_req.hdr.pcifunc = req->hdr.pcifunc;
864 
865 	if (req->ctype == NIX_AQ_CTYPE_CQ) {
866 		aq_req.cq.ena = 0;
867 		aq_req.cq_mask.ena = 1;
868 		aq_req.cq.bp_ena = 0;
869 		aq_req.cq_mask.bp_ena = 1;
870 		q_cnt = pfvf->cq_ctx->qsize;
871 		bmap = pfvf->cq_bmap;
872 	}
873 	if (req->ctype == NIX_AQ_CTYPE_SQ) {
874 		aq_req.sq.ena = 0;
875 		aq_req.sq_mask.ena = 1;
876 		q_cnt = pfvf->sq_ctx->qsize;
877 		bmap = pfvf->sq_bmap;
878 	}
879 	if (req->ctype == NIX_AQ_CTYPE_RQ) {
880 		aq_req.rq.ena = 0;
881 		aq_req.rq_mask.ena = 1;
882 		q_cnt = pfvf->rq_ctx->qsize;
883 		bmap = pfvf->rq_bmap;
884 	}
885 
886 	aq_req.ctype = req->ctype;
887 	aq_req.op = NIX_AQ_INSTOP_WRITE;
888 
889 	for (qidx = 0; qidx < q_cnt; qidx++) {
890 		if (!test_bit(qidx, bmap))
891 			continue;
892 		aq_req.qidx = qidx;
893 		rc = rvu_nix_aq_enq_inst(rvu, &aq_req, NULL);
894 		if (rc) {
895 			err = rc;
896 			dev_err(rvu->dev, "Failed to disable %s:%d context\n",
897 				nix_get_ctx_name(req->ctype), qidx);
898 		}
899 	}
900 
901 	return err;
902 }
903 
904 #ifdef CONFIG_NDC_DIS_DYNAMIC_CACHING
905 static int nix_lf_hwctx_lockdown(struct rvu *rvu, struct nix_aq_enq_req *req)
906 {
907 	struct nix_aq_enq_req lock_ctx_req;
908 	int err;
909 
910 	if (req->op != NIX_AQ_INSTOP_INIT)
911 		return 0;
912 
913 	if (req->ctype == NIX_AQ_CTYPE_MCE ||
914 	    req->ctype == NIX_AQ_CTYPE_DYNO)
915 		return 0;
916 
917 	memset(&lock_ctx_req, 0, sizeof(struct nix_aq_enq_req));
918 	lock_ctx_req.hdr.pcifunc = req->hdr.pcifunc;
919 	lock_ctx_req.ctype = req->ctype;
920 	lock_ctx_req.op = NIX_AQ_INSTOP_LOCK;
921 	lock_ctx_req.qidx = req->qidx;
922 	err = rvu_nix_aq_enq_inst(rvu, &lock_ctx_req, NULL);
923 	if (err)
924 		dev_err(rvu->dev,
925 			"PFUNC 0x%x: Failed to lock NIX %s:%d context\n",
926 			req->hdr.pcifunc,
927 			nix_get_ctx_name(req->ctype), req->qidx);
928 	return err;
929 }
930 
931 int rvu_mbox_handler_nix_aq_enq(struct rvu *rvu,
932 				struct nix_aq_enq_req *req,
933 				struct nix_aq_enq_rsp *rsp)
934 {
935 	int err;
936 
937 	err = rvu_nix_aq_enq_inst(rvu, req, rsp);
938 	if (!err)
939 		err = nix_lf_hwctx_lockdown(rvu, req);
940 	return err;
941 }
942 #else
943 
944 int rvu_mbox_handler_nix_aq_enq(struct rvu *rvu,
945 				struct nix_aq_enq_req *req,
946 				struct nix_aq_enq_rsp *rsp)
947 {
948 	return rvu_nix_aq_enq_inst(rvu, req, rsp);
949 }
950 #endif
951 
952 int rvu_mbox_handler_nix_hwctx_disable(struct rvu *rvu,
953 				       struct hwctx_disable_req *req,
954 				       struct msg_rsp *rsp)
955 {
956 	return nix_lf_hwctx_disable(rvu, req);
957 }
958 
959 int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
960 				  struct nix_lf_alloc_req *req,
961 				  struct nix_lf_alloc_rsp *rsp)
962 {
963 	int nixlf, qints, hwctx_size, intf, err, rc = 0;
964 	struct rvu_hwinfo *hw = rvu->hw;
965 	u16 pcifunc = req->hdr.pcifunc;
966 	struct rvu_block *block;
967 	struct rvu_pfvf *pfvf;
968 	u64 cfg, ctx_cfg;
969 	int blkaddr;
970 
971 	if (!req->rq_cnt || !req->sq_cnt || !req->cq_cnt)
972 		return NIX_AF_ERR_PARAM;
973 
974 	if (req->way_mask)
975 		req->way_mask &= 0xFFFF;
976 
977 	pfvf = rvu_get_pfvf(rvu, pcifunc);
978 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
979 	if (!pfvf->nixlf || blkaddr < 0)
980 		return NIX_AF_ERR_AF_LF_INVALID;
981 
982 	block = &hw->block[blkaddr];
983 	nixlf = rvu_get_lf(rvu, block, pcifunc, 0);
984 	if (nixlf < 0)
985 		return NIX_AF_ERR_AF_LF_INVALID;
986 
987 	/* Check if requested 'NIXLF <=> NPALF' mapping is valid */
988 	if (req->npa_func) {
989 		/* If default, use 'this' NIXLF's PFFUNC */
990 		if (req->npa_func == RVU_DEFAULT_PF_FUNC)
991 			req->npa_func = pcifunc;
992 		if (!is_pffunc_map_valid(rvu, req->npa_func, BLKTYPE_NPA))
993 			return NIX_AF_INVAL_NPA_PF_FUNC;
994 	}
995 
996 	/* Check if requested 'NIXLF <=> SSOLF' mapping is valid */
997 	if (req->sso_func) {
998 		/* If default, use 'this' NIXLF's PFFUNC */
999 		if (req->sso_func == RVU_DEFAULT_PF_FUNC)
1000 			req->sso_func = pcifunc;
1001 		if (!is_pffunc_map_valid(rvu, req->sso_func, BLKTYPE_SSO))
1002 			return NIX_AF_INVAL_SSO_PF_FUNC;
1003 	}
1004 
1005 	/* If RSS is being enabled, check if requested config is valid.
1006 	 * RSS table size should be power of two, otherwise
1007 	 * RSS_GRP::OFFSET + adder might go beyond that group or
1008 	 * won't be able to use entire table.
1009 	 */
1010 	if (req->rss_sz && (req->rss_sz > MAX_RSS_INDIR_TBL_SIZE ||
1011 			    !is_power_of_2(req->rss_sz)))
1012 		return NIX_AF_ERR_RSS_SIZE_INVALID;
1013 
1014 	if (req->rss_sz &&
1015 	    (!req->rss_grps || req->rss_grps > MAX_RSS_GROUPS))
1016 		return NIX_AF_ERR_RSS_GRPS_INVALID;
1017 
1018 	/* Reset this NIX LF */
1019 	err = rvu_lf_reset(rvu, block, nixlf);
1020 	if (err) {
1021 		dev_err(rvu->dev, "Failed to reset NIX%d LF%d\n",
1022 			block->addr - BLKADDR_NIX0, nixlf);
1023 		return NIX_AF_ERR_LF_RESET;
1024 	}
1025 
1026 	ctx_cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST3);
1027 
1028 	/* Alloc NIX RQ HW context memory and config the base */
1029 	hwctx_size = 1UL << ((ctx_cfg >> 4) & 0xF);
1030 	err = qmem_alloc(rvu->dev, &pfvf->rq_ctx, req->rq_cnt, hwctx_size);
1031 	if (err)
1032 		goto free_mem;
1033 
1034 	pfvf->rq_bmap = kcalloc(req->rq_cnt, sizeof(long), GFP_KERNEL);
1035 	if (!pfvf->rq_bmap)
1036 		goto free_mem;
1037 
1038 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_RQS_BASE(nixlf),
1039 		    (u64)pfvf->rq_ctx->iova);
1040 
1041 	/* Set caching and queue count in HW */
1042 	cfg = BIT_ULL(36) | (req->rq_cnt - 1) | req->way_mask << 20;
1043 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_RQS_CFG(nixlf), cfg);
1044 
1045 	/* Alloc NIX SQ HW context memory and config the base */
1046 	hwctx_size = 1UL << (ctx_cfg & 0xF);
1047 	err = qmem_alloc(rvu->dev, &pfvf->sq_ctx, req->sq_cnt, hwctx_size);
1048 	if (err)
1049 		goto free_mem;
1050 
1051 	pfvf->sq_bmap = kcalloc(req->sq_cnt, sizeof(long), GFP_KERNEL);
1052 	if (!pfvf->sq_bmap)
1053 		goto free_mem;
1054 
1055 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_SQS_BASE(nixlf),
1056 		    (u64)pfvf->sq_ctx->iova);
1057 
1058 	cfg = BIT_ULL(36) | (req->sq_cnt - 1) | req->way_mask << 20;
1059 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_SQS_CFG(nixlf), cfg);
1060 
1061 	/* Alloc NIX CQ HW context memory and config the base */
1062 	hwctx_size = 1UL << ((ctx_cfg >> 8) & 0xF);
1063 	err = qmem_alloc(rvu->dev, &pfvf->cq_ctx, req->cq_cnt, hwctx_size);
1064 	if (err)
1065 		goto free_mem;
1066 
1067 	pfvf->cq_bmap = kcalloc(req->cq_cnt, sizeof(long), GFP_KERNEL);
1068 	if (!pfvf->cq_bmap)
1069 		goto free_mem;
1070 
1071 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_CQS_BASE(nixlf),
1072 		    (u64)pfvf->cq_ctx->iova);
1073 
1074 	cfg = BIT_ULL(36) | (req->cq_cnt - 1) | req->way_mask << 20;
1075 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_CQS_CFG(nixlf), cfg);
1076 
1077 	/* Initialize receive side scaling (RSS) */
1078 	hwctx_size = 1UL << ((ctx_cfg >> 12) & 0xF);
1079 	err = nixlf_rss_ctx_init(rvu, blkaddr, pfvf, nixlf, req->rss_sz,
1080 				 req->rss_grps, hwctx_size, req->way_mask);
1081 	if (err)
1082 		goto free_mem;
1083 
1084 	/* Alloc memory for CQINT's HW contexts */
1085 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST2);
1086 	qints = (cfg >> 24) & 0xFFF;
1087 	hwctx_size = 1UL << ((ctx_cfg >> 24) & 0xF);
1088 	err = qmem_alloc(rvu->dev, &pfvf->cq_ints_ctx, qints, hwctx_size);
1089 	if (err)
1090 		goto free_mem;
1091 
1092 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_CINTS_BASE(nixlf),
1093 		    (u64)pfvf->cq_ints_ctx->iova);
1094 
1095 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_CINTS_CFG(nixlf),
1096 		    BIT_ULL(36) | req->way_mask << 20);
1097 
1098 	/* Alloc memory for QINT's HW contexts */
1099 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST2);
1100 	qints = (cfg >> 12) & 0xFFF;
1101 	hwctx_size = 1UL << ((ctx_cfg >> 20) & 0xF);
1102 	err = qmem_alloc(rvu->dev, &pfvf->nix_qints_ctx, qints, hwctx_size);
1103 	if (err)
1104 		goto free_mem;
1105 
1106 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_QINTS_BASE(nixlf),
1107 		    (u64)pfvf->nix_qints_ctx->iova);
1108 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_QINTS_CFG(nixlf),
1109 		    BIT_ULL(36) | req->way_mask << 20);
1110 
1111 	/* Setup VLANX TPID's.
1112 	 * Use VLAN1 for 802.1Q
1113 	 * and VLAN0 for 802.1AD.
1114 	 */
1115 	cfg = (0x8100ULL << 16) | 0x88A8ULL;
1116 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_TX_CFG(nixlf), cfg);
1117 
1118 	/* Enable LMTST for this NIX LF */
1119 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_TX_CFG2(nixlf), BIT_ULL(0));
1120 
1121 	/* Set CQE/WQE size, NPA_PF_FUNC for SQBs and also SSO_PF_FUNC */
1122 	if (req->npa_func)
1123 		cfg = req->npa_func;
1124 	if (req->sso_func)
1125 		cfg |= (u64)req->sso_func << 16;
1126 
1127 	cfg |= (u64)req->xqe_sz << 33;
1128 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_CFG(nixlf), cfg);
1129 
1130 	/* Config Rx pkt length, csum checks and apad  enable / disable */
1131 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_RX_CFG(nixlf), req->rx_cfg);
1132 
1133 	intf = is_afvf(pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
1134 	err = nix_interface_init(rvu, pcifunc, intf, nixlf);
1135 	if (err)
1136 		goto free_mem;
1137 
1138 	/* Disable NPC entries as NIXLF's contexts are not initialized yet */
1139 	rvu_npc_disable_default_entries(rvu, pcifunc, nixlf);
1140 
1141 	goto exit;
1142 
1143 free_mem:
1144 	nix_ctx_free(rvu, pfvf);
1145 	rc = -ENOMEM;
1146 
1147 exit:
1148 	/* Set macaddr of this PF/VF */
1149 	ether_addr_copy(rsp->mac_addr, pfvf->mac_addr);
1150 
1151 	/* set SQB size info */
1152 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_SQ_CONST);
1153 	rsp->sqb_size = (cfg >> 34) & 0xFFFF;
1154 	rsp->rx_chan_base = pfvf->rx_chan_base;
1155 	rsp->tx_chan_base = pfvf->tx_chan_base;
1156 	rsp->rx_chan_cnt = pfvf->rx_chan_cnt;
1157 	rsp->tx_chan_cnt = pfvf->tx_chan_cnt;
1158 	rsp->lso_tsov4_idx = NIX_LSO_FORMAT_IDX_TSOV4;
1159 	rsp->lso_tsov6_idx = NIX_LSO_FORMAT_IDX_TSOV6;
1160 	/* Get HW supported stat count */
1161 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST1);
1162 	rsp->lf_rx_stats = ((cfg >> 32) & 0xFF);
1163 	rsp->lf_tx_stats = ((cfg >> 24) & 0xFF);
1164 	/* Get count of CQ IRQs and error IRQs supported per LF */
1165 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST2);
1166 	rsp->qints = ((cfg >> 12) & 0xFFF);
1167 	rsp->cints = ((cfg >> 24) & 0xFFF);
1168 	return rc;
1169 }
1170 
1171 int rvu_mbox_handler_nix_lf_free(struct rvu *rvu, struct msg_req *req,
1172 				 struct msg_rsp *rsp)
1173 {
1174 	struct rvu_hwinfo *hw = rvu->hw;
1175 	u16 pcifunc = req->hdr.pcifunc;
1176 	struct rvu_block *block;
1177 	int blkaddr, nixlf, err;
1178 	struct rvu_pfvf *pfvf;
1179 
1180 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1181 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
1182 	if (!pfvf->nixlf || blkaddr < 0)
1183 		return NIX_AF_ERR_AF_LF_INVALID;
1184 
1185 	block = &hw->block[blkaddr];
1186 	nixlf = rvu_get_lf(rvu, block, pcifunc, 0);
1187 	if (nixlf < 0)
1188 		return NIX_AF_ERR_AF_LF_INVALID;
1189 
1190 	nix_interface_deinit(rvu, pcifunc, nixlf);
1191 
1192 	/* Reset this NIX LF */
1193 	err = rvu_lf_reset(rvu, block, nixlf);
1194 	if (err) {
1195 		dev_err(rvu->dev, "Failed to reset NIX%d LF%d\n",
1196 			block->addr - BLKADDR_NIX0, nixlf);
1197 		return NIX_AF_ERR_LF_RESET;
1198 	}
1199 
1200 	nix_ctx_free(rvu, pfvf);
1201 
1202 	return 0;
1203 }
1204 
1205 int rvu_mbox_handler_nix_mark_format_cfg(struct rvu *rvu,
1206 					 struct nix_mark_format_cfg  *req,
1207 					 struct nix_mark_format_cfg_rsp *rsp)
1208 {
1209 	u16 pcifunc = req->hdr.pcifunc;
1210 	struct nix_hw *nix_hw;
1211 	struct rvu_pfvf *pfvf;
1212 	int blkaddr, rc;
1213 	u32 cfg;
1214 
1215 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1216 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
1217 	if (!pfvf->nixlf || blkaddr < 0)
1218 		return NIX_AF_ERR_AF_LF_INVALID;
1219 
1220 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
1221 	if (!nix_hw)
1222 		return -EINVAL;
1223 
1224 	cfg = (((u32)req->offset & 0x7) << 16) |
1225 	      (((u32)req->y_mask & 0xF) << 12) |
1226 	      (((u32)req->y_val & 0xF) << 8) |
1227 	      (((u32)req->r_mask & 0xF) << 4) | ((u32)req->r_val & 0xF);
1228 
1229 	rc = rvu_nix_reserve_mark_format(rvu, nix_hw, blkaddr, cfg);
1230 	if (rc < 0) {
1231 		dev_err(rvu->dev, "No mark_format_ctl for (pf:%d, vf:%d)",
1232 			rvu_get_pf(pcifunc), pcifunc & RVU_PFVF_FUNC_MASK);
1233 		return NIX_AF_ERR_MARK_CFG_FAIL;
1234 	}
1235 
1236 	rsp->mark_format_idx = rc;
1237 	return 0;
1238 }
1239 
1240 /* Disable shaping of pkts by a scheduler queue
1241  * at a given scheduler level.
1242  */
1243 static void nix_reset_tx_shaping(struct rvu *rvu, int blkaddr,
1244 				 int lvl, int schq)
1245 {
1246 	u64  cir_reg = 0, pir_reg = 0;
1247 	u64  cfg;
1248 
1249 	switch (lvl) {
1250 	case NIX_TXSCH_LVL_TL1:
1251 		cir_reg = NIX_AF_TL1X_CIR(schq);
1252 		pir_reg = 0; /* PIR not available at TL1 */
1253 		break;
1254 	case NIX_TXSCH_LVL_TL2:
1255 		cir_reg = NIX_AF_TL2X_CIR(schq);
1256 		pir_reg = NIX_AF_TL2X_PIR(schq);
1257 		break;
1258 	case NIX_TXSCH_LVL_TL3:
1259 		cir_reg = NIX_AF_TL3X_CIR(schq);
1260 		pir_reg = NIX_AF_TL3X_PIR(schq);
1261 		break;
1262 	case NIX_TXSCH_LVL_TL4:
1263 		cir_reg = NIX_AF_TL4X_CIR(schq);
1264 		pir_reg = NIX_AF_TL4X_PIR(schq);
1265 		break;
1266 	}
1267 
1268 	if (!cir_reg)
1269 		return;
1270 	cfg = rvu_read64(rvu, blkaddr, cir_reg);
1271 	rvu_write64(rvu, blkaddr, cir_reg, cfg & ~BIT_ULL(0));
1272 
1273 	if (!pir_reg)
1274 		return;
1275 	cfg = rvu_read64(rvu, blkaddr, pir_reg);
1276 	rvu_write64(rvu, blkaddr, pir_reg, cfg & ~BIT_ULL(0));
1277 }
1278 
1279 static void nix_reset_tx_linkcfg(struct rvu *rvu, int blkaddr,
1280 				 int lvl, int schq)
1281 {
1282 	struct rvu_hwinfo *hw = rvu->hw;
1283 	int link;
1284 
1285 	if (lvl >= hw->cap.nix_tx_aggr_lvl)
1286 		return;
1287 
1288 	/* Reset TL4's SDP link config */
1289 	if (lvl == NIX_TXSCH_LVL_TL4)
1290 		rvu_write64(rvu, blkaddr, NIX_AF_TL4X_SDP_LINK_CFG(schq), 0x00);
1291 
1292 	if (lvl != NIX_TXSCH_LVL_TL2)
1293 		return;
1294 
1295 	/* Reset TL2's CGX or LBK link config */
1296 	for (link = 0; link < (hw->cgx_links + hw->lbk_links); link++)
1297 		rvu_write64(rvu, blkaddr,
1298 			    NIX_AF_TL3_TL2X_LINKX_CFG(schq, link), 0x00);
1299 }
1300 
1301 static int nix_get_tx_link(struct rvu *rvu, u16 pcifunc)
1302 {
1303 	struct rvu_hwinfo *hw = rvu->hw;
1304 	int pf = rvu_get_pf(pcifunc);
1305 	u8 cgx_id = 0, lmac_id = 0;
1306 
1307 	if (is_afvf(pcifunc)) {/* LBK links */
1308 		return hw->cgx_links;
1309 	} else if (is_pf_cgxmapped(rvu, pf)) {
1310 		rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id);
1311 		return (cgx_id * hw->lmac_per_cgx) + lmac_id;
1312 	}
1313 
1314 	/* SDP link */
1315 	return hw->cgx_links + hw->lbk_links;
1316 }
1317 
1318 static void nix_get_txschq_range(struct rvu *rvu, u16 pcifunc,
1319 				 int link, int *start, int *end)
1320 {
1321 	struct rvu_hwinfo *hw = rvu->hw;
1322 	int pf = rvu_get_pf(pcifunc);
1323 
1324 	if (is_afvf(pcifunc)) { /* LBK links */
1325 		*start = hw->cap.nix_txsch_per_cgx_lmac * link;
1326 		*end = *start + hw->cap.nix_txsch_per_lbk_lmac;
1327 	} else if (is_pf_cgxmapped(rvu, pf)) { /* CGX links */
1328 		*start = hw->cap.nix_txsch_per_cgx_lmac * link;
1329 		*end = *start + hw->cap.nix_txsch_per_cgx_lmac;
1330 	} else { /* SDP link */
1331 		*start = (hw->cap.nix_txsch_per_cgx_lmac * hw->cgx_links) +
1332 			(hw->cap.nix_txsch_per_lbk_lmac * hw->lbk_links);
1333 		*end = *start + hw->cap.nix_txsch_per_sdp_lmac;
1334 	}
1335 }
1336 
1337 static int nix_check_txschq_alloc_req(struct rvu *rvu, int lvl, u16 pcifunc,
1338 				      struct nix_hw *nix_hw,
1339 				      struct nix_txsch_alloc_req *req)
1340 {
1341 	struct rvu_hwinfo *hw = rvu->hw;
1342 	int schq, req_schq, free_cnt;
1343 	struct nix_txsch *txsch;
1344 	int link, start, end;
1345 
1346 	txsch = &nix_hw->txsch[lvl];
1347 	req_schq = req->schq_contig[lvl] + req->schq[lvl];
1348 
1349 	if (!req_schq)
1350 		return 0;
1351 
1352 	link = nix_get_tx_link(rvu, pcifunc);
1353 
1354 	/* For traffic aggregating scheduler level, one queue is enough */
1355 	if (lvl >= hw->cap.nix_tx_aggr_lvl) {
1356 		if (req_schq != 1)
1357 			return NIX_AF_ERR_TLX_ALLOC_FAIL;
1358 		return 0;
1359 	}
1360 
1361 	/* Get free SCHQ count and check if request can be accomodated */
1362 	if (hw->cap.nix_fixed_txschq_mapping) {
1363 		nix_get_txschq_range(rvu, pcifunc, link, &start, &end);
1364 		schq = start + (pcifunc & RVU_PFVF_FUNC_MASK);
1365 		if (end <= txsch->schq.max && schq < end &&
1366 		    !test_bit(schq, txsch->schq.bmap))
1367 			free_cnt = 1;
1368 		else
1369 			free_cnt = 0;
1370 	} else {
1371 		free_cnt = rvu_rsrc_free_count(&txsch->schq);
1372 	}
1373 
1374 	if (free_cnt < req_schq || req_schq > MAX_TXSCHQ_PER_FUNC)
1375 		return NIX_AF_ERR_TLX_ALLOC_FAIL;
1376 
1377 	/* If contiguous queues are needed, check for availability */
1378 	if (!hw->cap.nix_fixed_txschq_mapping && req->schq_contig[lvl] &&
1379 	    !rvu_rsrc_check_contig(&txsch->schq, req->schq_contig[lvl]))
1380 		return NIX_AF_ERR_TLX_ALLOC_FAIL;
1381 
1382 	return 0;
1383 }
1384 
1385 static void nix_txsch_alloc(struct rvu *rvu, struct nix_txsch *txsch,
1386 			    struct nix_txsch_alloc_rsp *rsp,
1387 			    int lvl, int start, int end)
1388 {
1389 	struct rvu_hwinfo *hw = rvu->hw;
1390 	u16 pcifunc = rsp->hdr.pcifunc;
1391 	int idx, schq;
1392 
1393 	/* For traffic aggregating levels, queue alloc is based
1394 	 * on transmit link to which PF_FUNC is mapped to.
1395 	 */
1396 	if (lvl >= hw->cap.nix_tx_aggr_lvl) {
1397 		/* A single TL queue is allocated */
1398 		if (rsp->schq_contig[lvl]) {
1399 			rsp->schq_contig[lvl] = 1;
1400 			rsp->schq_contig_list[lvl][0] = start;
1401 		}
1402 
1403 		/* Both contig and non-contig reqs doesn't make sense here */
1404 		if (rsp->schq_contig[lvl])
1405 			rsp->schq[lvl] = 0;
1406 
1407 		if (rsp->schq[lvl]) {
1408 			rsp->schq[lvl] = 1;
1409 			rsp->schq_list[lvl][0] = start;
1410 		}
1411 		return;
1412 	}
1413 
1414 	/* Adjust the queue request count if HW supports
1415 	 * only one queue per level configuration.
1416 	 */
1417 	if (hw->cap.nix_fixed_txschq_mapping) {
1418 		idx = pcifunc & RVU_PFVF_FUNC_MASK;
1419 		schq = start + idx;
1420 		if (idx >= (end - start) || test_bit(schq, txsch->schq.bmap)) {
1421 			rsp->schq_contig[lvl] = 0;
1422 			rsp->schq[lvl] = 0;
1423 			return;
1424 		}
1425 
1426 		if (rsp->schq_contig[lvl]) {
1427 			rsp->schq_contig[lvl] = 1;
1428 			set_bit(schq, txsch->schq.bmap);
1429 			rsp->schq_contig_list[lvl][0] = schq;
1430 			rsp->schq[lvl] = 0;
1431 		} else if (rsp->schq[lvl]) {
1432 			rsp->schq[lvl] = 1;
1433 			set_bit(schq, txsch->schq.bmap);
1434 			rsp->schq_list[lvl][0] = schq;
1435 		}
1436 		return;
1437 	}
1438 
1439 	/* Allocate contiguous queue indices requesty first */
1440 	if (rsp->schq_contig[lvl]) {
1441 		schq = bitmap_find_next_zero_area(txsch->schq.bmap,
1442 						  txsch->schq.max, start,
1443 						  rsp->schq_contig[lvl], 0);
1444 		if (schq >= end)
1445 			rsp->schq_contig[lvl] = 0;
1446 		for (idx = 0; idx < rsp->schq_contig[lvl]; idx++) {
1447 			set_bit(schq, txsch->schq.bmap);
1448 			rsp->schq_contig_list[lvl][idx] = schq;
1449 			schq++;
1450 		}
1451 	}
1452 
1453 	/* Allocate non-contiguous queue indices */
1454 	if (rsp->schq[lvl]) {
1455 		idx = 0;
1456 		for (schq = start; schq < end; schq++) {
1457 			if (!test_bit(schq, txsch->schq.bmap)) {
1458 				set_bit(schq, txsch->schq.bmap);
1459 				rsp->schq_list[lvl][idx++] = schq;
1460 			}
1461 			if (idx == rsp->schq[lvl])
1462 				break;
1463 		}
1464 		/* Update how many were allocated */
1465 		rsp->schq[lvl] = idx;
1466 	}
1467 }
1468 
1469 int rvu_mbox_handler_nix_txsch_alloc(struct rvu *rvu,
1470 				     struct nix_txsch_alloc_req *req,
1471 				     struct nix_txsch_alloc_rsp *rsp)
1472 {
1473 	struct rvu_hwinfo *hw = rvu->hw;
1474 	u16 pcifunc = req->hdr.pcifunc;
1475 	int link, blkaddr, rc = 0;
1476 	int lvl, idx, start, end;
1477 	struct nix_txsch *txsch;
1478 	struct rvu_pfvf *pfvf;
1479 	struct nix_hw *nix_hw;
1480 	u32 *pfvf_map;
1481 	u16 schq;
1482 
1483 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1484 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
1485 	if (!pfvf->nixlf || blkaddr < 0)
1486 		return NIX_AF_ERR_AF_LF_INVALID;
1487 
1488 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
1489 	if (!nix_hw)
1490 		return -EINVAL;
1491 
1492 	mutex_lock(&rvu->rsrc_lock);
1493 
1494 	/* Check if request is valid as per HW capabilities
1495 	 * and can be accomodated.
1496 	 */
1497 	for (lvl = 0; lvl < NIX_TXSCH_LVL_CNT; lvl++) {
1498 		rc = nix_check_txschq_alloc_req(rvu, lvl, pcifunc, nix_hw, req);
1499 		if (rc)
1500 			goto err;
1501 	}
1502 
1503 	/* Allocate requested Tx scheduler queues */
1504 	for (lvl = 0; lvl < NIX_TXSCH_LVL_CNT; lvl++) {
1505 		txsch = &nix_hw->txsch[lvl];
1506 		pfvf_map = txsch->pfvf_map;
1507 
1508 		if (!req->schq[lvl] && !req->schq_contig[lvl])
1509 			continue;
1510 
1511 		rsp->schq[lvl] = req->schq[lvl];
1512 		rsp->schq_contig[lvl] = req->schq_contig[lvl];
1513 
1514 		link = nix_get_tx_link(rvu, pcifunc);
1515 
1516 		if (lvl >= hw->cap.nix_tx_aggr_lvl) {
1517 			start = link;
1518 			end = link;
1519 		} else if (hw->cap.nix_fixed_txschq_mapping) {
1520 			nix_get_txschq_range(rvu, pcifunc, link, &start, &end);
1521 		} else {
1522 			start = 0;
1523 			end = txsch->schq.max;
1524 		}
1525 
1526 		nix_txsch_alloc(rvu, txsch, rsp, lvl, start, end);
1527 
1528 		/* Reset queue config */
1529 		for (idx = 0; idx < req->schq_contig[lvl]; idx++) {
1530 			schq = rsp->schq_contig_list[lvl][idx];
1531 			if (!(TXSCH_MAP_FLAGS(pfvf_map[schq]) &
1532 			    NIX_TXSCHQ_CFG_DONE))
1533 				pfvf_map[schq] = TXSCH_MAP(pcifunc, 0);
1534 			nix_reset_tx_linkcfg(rvu, blkaddr, lvl, schq);
1535 			nix_reset_tx_shaping(rvu, blkaddr, lvl, schq);
1536 		}
1537 
1538 		for (idx = 0; idx < req->schq[lvl]; idx++) {
1539 			schq = rsp->schq_list[lvl][idx];
1540 			if (!(TXSCH_MAP_FLAGS(pfvf_map[schq]) &
1541 			    NIX_TXSCHQ_CFG_DONE))
1542 				pfvf_map[schq] = TXSCH_MAP(pcifunc, 0);
1543 			nix_reset_tx_linkcfg(rvu, blkaddr, lvl, schq);
1544 			nix_reset_tx_shaping(rvu, blkaddr, lvl, schq);
1545 		}
1546 	}
1547 
1548 	rsp->aggr_level = hw->cap.nix_tx_aggr_lvl;
1549 	rsp->aggr_lvl_rr_prio = TXSCH_TL1_DFLT_RR_PRIO;
1550 	rsp->link_cfg_lvl = rvu_read64(rvu, blkaddr,
1551 				       NIX_AF_PSE_CHANNEL_LEVEL) & 0x01 ?
1552 				       NIX_TXSCH_LVL_TL3 : NIX_TXSCH_LVL_TL2;
1553 	goto exit;
1554 err:
1555 	rc = NIX_AF_ERR_TLX_ALLOC_FAIL;
1556 exit:
1557 	mutex_unlock(&rvu->rsrc_lock);
1558 	return rc;
1559 }
1560 
1561 static void nix_smq_flush(struct rvu *rvu, int blkaddr,
1562 			  int smq, u16 pcifunc, int nixlf)
1563 {
1564 	int pf = rvu_get_pf(pcifunc);
1565 	u8 cgx_id = 0, lmac_id = 0;
1566 	int err, restore_tx_en = 0;
1567 	u64 cfg;
1568 
1569 	/* enable cgx tx if disabled */
1570 	if (is_pf_cgxmapped(rvu, pf)) {
1571 		rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id);
1572 		restore_tx_en = !cgx_lmac_tx_enable(rvu_cgx_pdata(cgx_id, rvu),
1573 						    lmac_id, true);
1574 	}
1575 
1576 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_SMQX_CFG(smq));
1577 	/* Do SMQ flush and set enqueue xoff */
1578 	cfg |= BIT_ULL(50) | BIT_ULL(49);
1579 	rvu_write64(rvu, blkaddr, NIX_AF_SMQX_CFG(smq), cfg);
1580 
1581 	/* Disable backpressure from physical link,
1582 	 * otherwise SMQ flush may stall.
1583 	 */
1584 	rvu_cgx_enadis_rx_bp(rvu, pf, false);
1585 
1586 	/* Wait for flush to complete */
1587 	err = rvu_poll_reg(rvu, blkaddr,
1588 			   NIX_AF_SMQX_CFG(smq), BIT_ULL(49), true);
1589 	if (err)
1590 		dev_err(rvu->dev,
1591 			"NIXLF%d: SMQ%d flush failed\n", nixlf, smq);
1592 
1593 	rvu_cgx_enadis_rx_bp(rvu, pf, true);
1594 	/* restore cgx tx state */
1595 	if (restore_tx_en)
1596 		cgx_lmac_tx_enable(rvu_cgx_pdata(cgx_id, rvu), lmac_id, false);
1597 }
1598 
1599 static int nix_txschq_free(struct rvu *rvu, u16 pcifunc)
1600 {
1601 	int blkaddr, nixlf, lvl, schq, err;
1602 	struct rvu_hwinfo *hw = rvu->hw;
1603 	struct nix_txsch *txsch;
1604 	struct nix_hw *nix_hw;
1605 
1606 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
1607 	if (blkaddr < 0)
1608 		return NIX_AF_ERR_AF_LF_INVALID;
1609 
1610 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
1611 	if (!nix_hw)
1612 		return -EINVAL;
1613 
1614 	nixlf = rvu_get_lf(rvu, &hw->block[blkaddr], pcifunc, 0);
1615 	if (nixlf < 0)
1616 		return NIX_AF_ERR_AF_LF_INVALID;
1617 
1618 	/* Disable TL2/3 queue links before SMQ flush*/
1619 	mutex_lock(&rvu->rsrc_lock);
1620 	for (lvl = NIX_TXSCH_LVL_TL4; lvl < NIX_TXSCH_LVL_CNT; lvl++) {
1621 		if (lvl != NIX_TXSCH_LVL_TL2 && lvl != NIX_TXSCH_LVL_TL4)
1622 			continue;
1623 
1624 		txsch = &nix_hw->txsch[lvl];
1625 		for (schq = 0; schq < txsch->schq.max; schq++) {
1626 			if (TXSCH_MAP_FUNC(txsch->pfvf_map[schq]) != pcifunc)
1627 				continue;
1628 			nix_reset_tx_linkcfg(rvu, blkaddr, lvl, schq);
1629 		}
1630 	}
1631 
1632 	/* Flush SMQs */
1633 	txsch = &nix_hw->txsch[NIX_TXSCH_LVL_SMQ];
1634 	for (schq = 0; schq < txsch->schq.max; schq++) {
1635 		if (TXSCH_MAP_FUNC(txsch->pfvf_map[schq]) != pcifunc)
1636 			continue;
1637 		nix_smq_flush(rvu, blkaddr, schq, pcifunc, nixlf);
1638 	}
1639 
1640 	/* Now free scheduler queues to free pool */
1641 	for (lvl = 0; lvl < NIX_TXSCH_LVL_CNT; lvl++) {
1642 		 /* TLs above aggregation level are shared across all PF
1643 		  * and it's VFs, hence skip freeing them.
1644 		  */
1645 		if (lvl >= hw->cap.nix_tx_aggr_lvl)
1646 			continue;
1647 
1648 		txsch = &nix_hw->txsch[lvl];
1649 		for (schq = 0; schq < txsch->schq.max; schq++) {
1650 			if (TXSCH_MAP_FUNC(txsch->pfvf_map[schq]) != pcifunc)
1651 				continue;
1652 			rvu_free_rsrc(&txsch->schq, schq);
1653 			txsch->pfvf_map[schq] = TXSCH_MAP(0, NIX_TXSCHQ_FREE);
1654 		}
1655 	}
1656 	mutex_unlock(&rvu->rsrc_lock);
1657 
1658 	/* Sync cached info for this LF in NDC-TX to LLC/DRAM */
1659 	rvu_write64(rvu, blkaddr, NIX_AF_NDC_TX_SYNC, BIT_ULL(12) | nixlf);
1660 	err = rvu_poll_reg(rvu, blkaddr, NIX_AF_NDC_TX_SYNC, BIT_ULL(12), true);
1661 	if (err)
1662 		dev_err(rvu->dev, "NDC-TX sync failed for NIXLF %d\n", nixlf);
1663 
1664 	return 0;
1665 }
1666 
1667 static int nix_txschq_free_one(struct rvu *rvu,
1668 			       struct nix_txsch_free_req *req)
1669 {
1670 	struct rvu_hwinfo *hw = rvu->hw;
1671 	u16 pcifunc = req->hdr.pcifunc;
1672 	int lvl, schq, nixlf, blkaddr;
1673 	struct nix_txsch *txsch;
1674 	struct nix_hw *nix_hw;
1675 	u32 *pfvf_map;
1676 
1677 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
1678 	if (blkaddr < 0)
1679 		return NIX_AF_ERR_AF_LF_INVALID;
1680 
1681 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
1682 	if (!nix_hw)
1683 		return -EINVAL;
1684 
1685 	nixlf = rvu_get_lf(rvu, &hw->block[blkaddr], pcifunc, 0);
1686 	if (nixlf < 0)
1687 		return NIX_AF_ERR_AF_LF_INVALID;
1688 
1689 	lvl = req->schq_lvl;
1690 	schq = req->schq;
1691 	txsch = &nix_hw->txsch[lvl];
1692 
1693 	if (lvl >= hw->cap.nix_tx_aggr_lvl || schq >= txsch->schq.max)
1694 		return 0;
1695 
1696 	pfvf_map = txsch->pfvf_map;
1697 	mutex_lock(&rvu->rsrc_lock);
1698 
1699 	if (TXSCH_MAP_FUNC(pfvf_map[schq]) != pcifunc) {
1700 		mutex_unlock(&rvu->rsrc_lock);
1701 		goto err;
1702 	}
1703 
1704 	/* Flush if it is a SMQ. Onus of disabling
1705 	 * TL2/3 queue links before SMQ flush is on user
1706 	 */
1707 	if (lvl == NIX_TXSCH_LVL_SMQ)
1708 		nix_smq_flush(rvu, blkaddr, schq, pcifunc, nixlf);
1709 
1710 	/* Free the resource */
1711 	rvu_free_rsrc(&txsch->schq, schq);
1712 	txsch->pfvf_map[schq] = TXSCH_MAP(0, NIX_TXSCHQ_FREE);
1713 	mutex_unlock(&rvu->rsrc_lock);
1714 	return 0;
1715 err:
1716 	return NIX_AF_ERR_TLX_INVALID;
1717 }
1718 
1719 int rvu_mbox_handler_nix_txsch_free(struct rvu *rvu,
1720 				    struct nix_txsch_free_req *req,
1721 				    struct msg_rsp *rsp)
1722 {
1723 	if (req->flags & TXSCHQ_FREE_ALL)
1724 		return nix_txschq_free(rvu, req->hdr.pcifunc);
1725 	else
1726 		return nix_txschq_free_one(rvu, req);
1727 }
1728 
1729 static bool is_txschq_hierarchy_valid(struct rvu *rvu, u16 pcifunc, int blkaddr,
1730 				      int lvl, u64 reg, u64 regval)
1731 {
1732 	u64 regbase = reg & 0xFFFF;
1733 	u16 schq, parent;
1734 
1735 	if (!rvu_check_valid_reg(TXSCHQ_HWREGMAP, lvl, reg))
1736 		return false;
1737 
1738 	schq = TXSCHQ_IDX(reg, TXSCHQ_IDX_SHIFT);
1739 	/* Check if this schq belongs to this PF/VF or not */
1740 	if (!is_valid_txschq(rvu, blkaddr, lvl, pcifunc, schq))
1741 		return false;
1742 
1743 	parent = (regval >> 16) & 0x1FF;
1744 	/* Validate MDQ's TL4 parent */
1745 	if (regbase == NIX_AF_MDQX_PARENT(0) &&
1746 	    !is_valid_txschq(rvu, blkaddr, NIX_TXSCH_LVL_TL4, pcifunc, parent))
1747 		return false;
1748 
1749 	/* Validate TL4's TL3 parent */
1750 	if (regbase == NIX_AF_TL4X_PARENT(0) &&
1751 	    !is_valid_txschq(rvu, blkaddr, NIX_TXSCH_LVL_TL3, pcifunc, parent))
1752 		return false;
1753 
1754 	/* Validate TL3's TL2 parent */
1755 	if (regbase == NIX_AF_TL3X_PARENT(0) &&
1756 	    !is_valid_txschq(rvu, blkaddr, NIX_TXSCH_LVL_TL2, pcifunc, parent))
1757 		return false;
1758 
1759 	/* Validate TL2's TL1 parent */
1760 	if (regbase == NIX_AF_TL2X_PARENT(0) &&
1761 	    !is_valid_txschq(rvu, blkaddr, NIX_TXSCH_LVL_TL1, pcifunc, parent))
1762 		return false;
1763 
1764 	return true;
1765 }
1766 
1767 static bool is_txschq_shaping_valid(struct rvu_hwinfo *hw, int lvl, u64 reg)
1768 {
1769 	u64 regbase;
1770 
1771 	if (hw->cap.nix_shaping)
1772 		return true;
1773 
1774 	/* If shaping and coloring is not supported, then
1775 	 * *_CIR and *_PIR registers should not be configured.
1776 	 */
1777 	regbase = reg & 0xFFFF;
1778 
1779 	switch (lvl) {
1780 	case NIX_TXSCH_LVL_TL1:
1781 		if (regbase == NIX_AF_TL1X_CIR(0))
1782 			return false;
1783 		break;
1784 	case NIX_TXSCH_LVL_TL2:
1785 		if (regbase == NIX_AF_TL2X_CIR(0) ||
1786 		    regbase == NIX_AF_TL2X_PIR(0))
1787 			return false;
1788 		break;
1789 	case NIX_TXSCH_LVL_TL3:
1790 		if (regbase == NIX_AF_TL3X_CIR(0) ||
1791 		    regbase == NIX_AF_TL3X_PIR(0))
1792 			return false;
1793 		break;
1794 	case NIX_TXSCH_LVL_TL4:
1795 		if (regbase == NIX_AF_TL4X_CIR(0) ||
1796 		    regbase == NIX_AF_TL4X_PIR(0))
1797 			return false;
1798 		break;
1799 	}
1800 	return true;
1801 }
1802 
1803 static void nix_tl1_default_cfg(struct rvu *rvu, struct nix_hw *nix_hw,
1804 				u16 pcifunc, int blkaddr)
1805 {
1806 	u32 *pfvf_map;
1807 	int schq;
1808 
1809 	schq = nix_get_tx_link(rvu, pcifunc);
1810 	pfvf_map = nix_hw->txsch[NIX_TXSCH_LVL_TL1].pfvf_map;
1811 	/* Skip if PF has already done the config */
1812 	if (TXSCH_MAP_FLAGS(pfvf_map[schq]) & NIX_TXSCHQ_CFG_DONE)
1813 		return;
1814 	rvu_write64(rvu, blkaddr, NIX_AF_TL1X_TOPOLOGY(schq),
1815 		    (TXSCH_TL1_DFLT_RR_PRIO << 1));
1816 	rvu_write64(rvu, blkaddr, NIX_AF_TL1X_SCHEDULE(schq),
1817 		    TXSCH_TL1_DFLT_RR_QTM);
1818 	rvu_write64(rvu, blkaddr, NIX_AF_TL1X_CIR(schq), 0x00);
1819 	pfvf_map[schq] = TXSCH_SET_FLAG(pfvf_map[schq], NIX_TXSCHQ_CFG_DONE);
1820 }
1821 
1822 int rvu_mbox_handler_nix_txschq_cfg(struct rvu *rvu,
1823 				    struct nix_txschq_config *req,
1824 				    struct msg_rsp *rsp)
1825 {
1826 	struct rvu_hwinfo *hw = rvu->hw;
1827 	u16 pcifunc = req->hdr.pcifunc;
1828 	u64 reg, regval, schq_regbase;
1829 	struct nix_txsch *txsch;
1830 	struct nix_hw *nix_hw;
1831 	int blkaddr, idx, err;
1832 	int nixlf, schq;
1833 	u32 *pfvf_map;
1834 
1835 	if (req->lvl >= NIX_TXSCH_LVL_CNT ||
1836 	    req->num_regs > MAX_REGS_PER_MBOX_MSG)
1837 		return NIX_AF_INVAL_TXSCHQ_CFG;
1838 
1839 	err = nix_get_nixlf(rvu, pcifunc, &nixlf, &blkaddr);
1840 	if (err)
1841 		return err;
1842 
1843 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
1844 	if (!nix_hw)
1845 		return -EINVAL;
1846 
1847 	txsch = &nix_hw->txsch[req->lvl];
1848 	pfvf_map = txsch->pfvf_map;
1849 
1850 	if (req->lvl >= hw->cap.nix_tx_aggr_lvl &&
1851 	    pcifunc & RVU_PFVF_FUNC_MASK) {
1852 		mutex_lock(&rvu->rsrc_lock);
1853 		if (req->lvl == NIX_TXSCH_LVL_TL1)
1854 			nix_tl1_default_cfg(rvu, nix_hw, pcifunc, blkaddr);
1855 		mutex_unlock(&rvu->rsrc_lock);
1856 		return 0;
1857 	}
1858 
1859 	for (idx = 0; idx < req->num_regs; idx++) {
1860 		reg = req->reg[idx];
1861 		regval = req->regval[idx];
1862 		schq_regbase = reg & 0xFFFF;
1863 
1864 		if (!is_txschq_hierarchy_valid(rvu, pcifunc, blkaddr,
1865 					       txsch->lvl, reg, regval))
1866 			return NIX_AF_INVAL_TXSCHQ_CFG;
1867 
1868 		/* Check if shaping and coloring is supported */
1869 		if (!is_txschq_shaping_valid(hw, req->lvl, reg))
1870 			continue;
1871 
1872 		/* Replace PF/VF visible NIXLF slot with HW NIXLF id */
1873 		if (schq_regbase == NIX_AF_SMQX_CFG(0)) {
1874 			nixlf = rvu_get_lf(rvu, &hw->block[blkaddr],
1875 					   pcifunc, 0);
1876 			regval &= ~(0x7FULL << 24);
1877 			regval |= ((u64)nixlf << 24);
1878 		}
1879 
1880 		/* Clear 'BP_ENA' config, if it's not allowed */
1881 		if (!hw->cap.nix_tx_link_bp) {
1882 			if (schq_regbase == NIX_AF_TL4X_SDP_LINK_CFG(0) ||
1883 			    (schq_regbase & 0xFF00) ==
1884 			    NIX_AF_TL3_TL2X_LINKX_CFG(0, 0))
1885 				regval &= ~BIT_ULL(13);
1886 		}
1887 
1888 		/* Mark config as done for TL1 by PF */
1889 		if (schq_regbase >= NIX_AF_TL1X_SCHEDULE(0) &&
1890 		    schq_regbase <= NIX_AF_TL1X_GREEN_BYTES(0)) {
1891 			schq = TXSCHQ_IDX(reg, TXSCHQ_IDX_SHIFT);
1892 			mutex_lock(&rvu->rsrc_lock);
1893 			pfvf_map[schq] = TXSCH_SET_FLAG(pfvf_map[schq],
1894 							NIX_TXSCHQ_CFG_DONE);
1895 			mutex_unlock(&rvu->rsrc_lock);
1896 		}
1897 
1898 		/* SMQ flush is special hence split register writes such
1899 		 * that flush first and write rest of the bits later.
1900 		 */
1901 		if (schq_regbase == NIX_AF_SMQX_CFG(0) &&
1902 		    (regval & BIT_ULL(49))) {
1903 			schq = TXSCHQ_IDX(reg, TXSCHQ_IDX_SHIFT);
1904 			nix_smq_flush(rvu, blkaddr, schq, pcifunc, nixlf);
1905 			regval &= ~BIT_ULL(49);
1906 		}
1907 		rvu_write64(rvu, blkaddr, reg, regval);
1908 	}
1909 
1910 	return 0;
1911 }
1912 
1913 static int nix_rx_vtag_cfg(struct rvu *rvu, int nixlf, int blkaddr,
1914 			   struct nix_vtag_config *req)
1915 {
1916 	u64 regval = req->vtag_size;
1917 
1918 	if (req->rx.vtag_type > 7 || req->vtag_size > VTAGSIZE_T8)
1919 		return -EINVAL;
1920 
1921 	if (req->rx.capture_vtag)
1922 		regval |= BIT_ULL(5);
1923 	if (req->rx.strip_vtag)
1924 		regval |= BIT_ULL(4);
1925 
1926 	rvu_write64(rvu, blkaddr,
1927 		    NIX_AF_LFX_RX_VTAG_TYPEX(nixlf, req->rx.vtag_type), regval);
1928 	return 0;
1929 }
1930 
1931 int rvu_mbox_handler_nix_vtag_cfg(struct rvu *rvu,
1932 				  struct nix_vtag_config *req,
1933 				  struct msg_rsp *rsp)
1934 {
1935 	u16 pcifunc = req->hdr.pcifunc;
1936 	int blkaddr, nixlf, err;
1937 
1938 	err = nix_get_nixlf(rvu, pcifunc, &nixlf, &blkaddr);
1939 	if (err)
1940 		return err;
1941 
1942 	if (req->cfg_type) {
1943 		err = nix_rx_vtag_cfg(rvu, nixlf, blkaddr, req);
1944 		if (err)
1945 			return NIX_AF_ERR_PARAM;
1946 	} else {
1947 		/* TODO: handle tx vtag configuration */
1948 		return 0;
1949 	}
1950 
1951 	return 0;
1952 }
1953 
1954 static int nix_setup_mce(struct rvu *rvu, int mce, u8 op,
1955 			 u16 pcifunc, int next, bool eol)
1956 {
1957 	struct nix_aq_enq_req aq_req;
1958 	int err;
1959 
1960 	aq_req.hdr.pcifunc = 0;
1961 	aq_req.ctype = NIX_AQ_CTYPE_MCE;
1962 	aq_req.op = op;
1963 	aq_req.qidx = mce;
1964 
1965 	/* Forward bcast pkts to RQ0, RSS not needed */
1966 	aq_req.mce.op = 0;
1967 	aq_req.mce.index = 0;
1968 	aq_req.mce.eol = eol;
1969 	aq_req.mce.pf_func = pcifunc;
1970 	aq_req.mce.next = next;
1971 
1972 	/* All fields valid */
1973 	*(u64 *)(&aq_req.mce_mask) = ~0ULL;
1974 
1975 	err = rvu_nix_aq_enq_inst(rvu, &aq_req, NULL);
1976 	if (err) {
1977 		dev_err(rvu->dev, "Failed to setup Bcast MCE for PF%d:VF%d\n",
1978 			rvu_get_pf(pcifunc), pcifunc & RVU_PFVF_FUNC_MASK);
1979 		return err;
1980 	}
1981 	return 0;
1982 }
1983 
1984 static int nix_update_mce_list(struct nix_mce_list *mce_list,
1985 			       u16 pcifunc, bool add)
1986 {
1987 	struct mce *mce, *tail = NULL;
1988 	bool delete = false;
1989 
1990 	/* Scan through the current list */
1991 	hlist_for_each_entry(mce, &mce_list->head, node) {
1992 		/* If already exists, then delete */
1993 		if (mce->pcifunc == pcifunc && !add) {
1994 			delete = true;
1995 			break;
1996 		}
1997 		tail = mce;
1998 	}
1999 
2000 	if (delete) {
2001 		hlist_del(&mce->node);
2002 		kfree(mce);
2003 		mce_list->count--;
2004 		return 0;
2005 	}
2006 
2007 	if (!add)
2008 		return 0;
2009 
2010 	/* Add a new one to the list, at the tail */
2011 	mce = kzalloc(sizeof(*mce), GFP_KERNEL);
2012 	if (!mce)
2013 		return -ENOMEM;
2014 	mce->pcifunc = pcifunc;
2015 	if (!tail)
2016 		hlist_add_head(&mce->node, &mce_list->head);
2017 	else
2018 		hlist_add_behind(&mce->node, &tail->node);
2019 	mce_list->count++;
2020 	return 0;
2021 }
2022 
2023 static int nix_update_bcast_mce_list(struct rvu *rvu, u16 pcifunc, bool add)
2024 {
2025 	int err = 0, idx, next_idx, last_idx;
2026 	struct nix_mce_list *mce_list;
2027 	struct nix_mcast *mcast;
2028 	struct nix_hw *nix_hw;
2029 	struct rvu_pfvf *pfvf;
2030 	struct mce *mce;
2031 	int blkaddr;
2032 
2033 	/* Broadcast pkt replication is not needed for AF's VFs, hence skip */
2034 	if (is_afvf(pcifunc))
2035 		return 0;
2036 
2037 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
2038 	if (blkaddr < 0)
2039 		return 0;
2040 
2041 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
2042 	if (!nix_hw)
2043 		return 0;
2044 
2045 	mcast = &nix_hw->mcast;
2046 
2047 	/* Get this PF/VF func's MCE index */
2048 	pfvf = rvu_get_pfvf(rvu, pcifunc & ~RVU_PFVF_FUNC_MASK);
2049 	idx = pfvf->bcast_mce_idx + (pcifunc & RVU_PFVF_FUNC_MASK);
2050 
2051 	mce_list = &pfvf->bcast_mce_list;
2052 	if (idx > (pfvf->bcast_mce_idx + mce_list->max)) {
2053 		dev_err(rvu->dev,
2054 			"%s: Idx %d > max MCE idx %d, for PF%d bcast list\n",
2055 			__func__, idx, mce_list->max,
2056 			pcifunc >> RVU_PFVF_PF_SHIFT);
2057 		return -EINVAL;
2058 	}
2059 
2060 	mutex_lock(&mcast->mce_lock);
2061 
2062 	err = nix_update_mce_list(mce_list, pcifunc, add);
2063 	if (err)
2064 		goto end;
2065 
2066 	/* Disable MCAM entry in NPC */
2067 	if (!mce_list->count) {
2068 		rvu_npc_disable_bcast_entry(rvu, pcifunc);
2069 		goto end;
2070 	}
2071 
2072 	/* Dump the updated list to HW */
2073 	idx = pfvf->bcast_mce_idx;
2074 	last_idx = idx + mce_list->count - 1;
2075 	hlist_for_each_entry(mce, &mce_list->head, node) {
2076 		if (idx > last_idx)
2077 			break;
2078 
2079 		next_idx = idx + 1;
2080 		/* EOL should be set in last MCE */
2081 		err = nix_setup_mce(rvu, idx, NIX_AQ_INSTOP_WRITE,
2082 				    mce->pcifunc, next_idx,
2083 				    (next_idx > last_idx) ? true : false);
2084 		if (err)
2085 			goto end;
2086 		idx++;
2087 	}
2088 
2089 end:
2090 	mutex_unlock(&mcast->mce_lock);
2091 	return err;
2092 }
2093 
2094 static int nix_setup_bcast_tables(struct rvu *rvu, struct nix_hw *nix_hw)
2095 {
2096 	struct nix_mcast *mcast = &nix_hw->mcast;
2097 	int err, pf, numvfs, idx;
2098 	struct rvu_pfvf *pfvf;
2099 	u16 pcifunc;
2100 	u64 cfg;
2101 
2102 	/* Skip PF0 (i.e AF) */
2103 	for (pf = 1; pf < (rvu->cgx_mapped_pfs + 1); pf++) {
2104 		cfg = rvu_read64(rvu, BLKADDR_RVUM, RVU_PRIV_PFX_CFG(pf));
2105 		/* If PF is not enabled, nothing to do */
2106 		if (!((cfg >> 20) & 0x01))
2107 			continue;
2108 		/* Get numVFs attached to this PF */
2109 		numvfs = (cfg >> 12) & 0xFF;
2110 
2111 		pfvf = &rvu->pf[pf];
2112 		/* Save the start MCE */
2113 		pfvf->bcast_mce_idx = nix_alloc_mce_list(mcast, numvfs + 1);
2114 
2115 		nix_mce_list_init(&pfvf->bcast_mce_list, numvfs + 1);
2116 
2117 		for (idx = 0; idx < (numvfs + 1); idx++) {
2118 			/* idx-0 is for PF, followed by VFs */
2119 			pcifunc = (pf << RVU_PFVF_PF_SHIFT);
2120 			pcifunc |= idx;
2121 			/* Add dummy entries now, so that we don't have to check
2122 			 * for whether AQ_OP should be INIT/WRITE later on.
2123 			 * Will be updated when a NIXLF is attached/detached to
2124 			 * these PF/VFs.
2125 			 */
2126 			err = nix_setup_mce(rvu, pfvf->bcast_mce_idx + idx,
2127 					    NIX_AQ_INSTOP_INIT,
2128 					    pcifunc, 0, true);
2129 			if (err)
2130 				return err;
2131 		}
2132 	}
2133 	return 0;
2134 }
2135 
2136 static int nix_setup_mcast(struct rvu *rvu, struct nix_hw *nix_hw, int blkaddr)
2137 {
2138 	struct nix_mcast *mcast = &nix_hw->mcast;
2139 	struct rvu_hwinfo *hw = rvu->hw;
2140 	int err, size;
2141 
2142 	size = (rvu_read64(rvu, blkaddr, NIX_AF_CONST3) >> 16) & 0x0F;
2143 	size = (1ULL << size);
2144 
2145 	/* Alloc memory for multicast/mirror replication entries */
2146 	err = qmem_alloc(rvu->dev, &mcast->mce_ctx,
2147 			 (256UL << MC_TBL_SIZE), size);
2148 	if (err)
2149 		return -ENOMEM;
2150 
2151 	rvu_write64(rvu, blkaddr, NIX_AF_RX_MCAST_BASE,
2152 		    (u64)mcast->mce_ctx->iova);
2153 
2154 	/* Set max list length equal to max no of VFs per PF  + PF itself */
2155 	rvu_write64(rvu, blkaddr, NIX_AF_RX_MCAST_CFG,
2156 		    BIT_ULL(36) | (hw->max_vfs_per_pf << 4) | MC_TBL_SIZE);
2157 
2158 	/* Alloc memory for multicast replication buffers */
2159 	size = rvu_read64(rvu, blkaddr, NIX_AF_MC_MIRROR_CONST) & 0xFFFF;
2160 	err = qmem_alloc(rvu->dev, &mcast->mcast_buf,
2161 			 (8UL << MC_BUF_CNT), size);
2162 	if (err)
2163 		return -ENOMEM;
2164 
2165 	rvu_write64(rvu, blkaddr, NIX_AF_RX_MCAST_BUF_BASE,
2166 		    (u64)mcast->mcast_buf->iova);
2167 
2168 	/* Alloc pkind for NIX internal RX multicast/mirror replay */
2169 	mcast->replay_pkind = rvu_alloc_rsrc(&hw->pkind.rsrc);
2170 
2171 	rvu_write64(rvu, blkaddr, NIX_AF_RX_MCAST_BUF_CFG,
2172 		    BIT_ULL(63) | (mcast->replay_pkind << 24) |
2173 		    BIT_ULL(20) | MC_BUF_CNT);
2174 
2175 	mutex_init(&mcast->mce_lock);
2176 
2177 	return nix_setup_bcast_tables(rvu, nix_hw);
2178 }
2179 
2180 static int nix_setup_txschq(struct rvu *rvu, struct nix_hw *nix_hw, int blkaddr)
2181 {
2182 	struct nix_txsch *txsch;
2183 	int err, lvl, schq;
2184 	u64 cfg, reg;
2185 
2186 	/* Get scheduler queue count of each type and alloc
2187 	 * bitmap for each for alloc/free/attach operations.
2188 	 */
2189 	for (lvl = 0; lvl < NIX_TXSCH_LVL_CNT; lvl++) {
2190 		txsch = &nix_hw->txsch[lvl];
2191 		txsch->lvl = lvl;
2192 		switch (lvl) {
2193 		case NIX_TXSCH_LVL_SMQ:
2194 			reg = NIX_AF_MDQ_CONST;
2195 			break;
2196 		case NIX_TXSCH_LVL_TL4:
2197 			reg = NIX_AF_TL4_CONST;
2198 			break;
2199 		case NIX_TXSCH_LVL_TL3:
2200 			reg = NIX_AF_TL3_CONST;
2201 			break;
2202 		case NIX_TXSCH_LVL_TL2:
2203 			reg = NIX_AF_TL2_CONST;
2204 			break;
2205 		case NIX_TXSCH_LVL_TL1:
2206 			reg = NIX_AF_TL1_CONST;
2207 			break;
2208 		}
2209 		cfg = rvu_read64(rvu, blkaddr, reg);
2210 		txsch->schq.max = cfg & 0xFFFF;
2211 		err = rvu_alloc_bitmap(&txsch->schq);
2212 		if (err)
2213 			return err;
2214 
2215 		/* Allocate memory for scheduler queues to
2216 		 * PF/VF pcifunc mapping info.
2217 		 */
2218 		txsch->pfvf_map = devm_kcalloc(rvu->dev, txsch->schq.max,
2219 					       sizeof(u32), GFP_KERNEL);
2220 		if (!txsch->pfvf_map)
2221 			return -ENOMEM;
2222 		for (schq = 0; schq < txsch->schq.max; schq++)
2223 			txsch->pfvf_map[schq] = TXSCH_MAP(0, NIX_TXSCHQ_FREE);
2224 	}
2225 	return 0;
2226 }
2227 
2228 int rvu_nix_reserve_mark_format(struct rvu *rvu, struct nix_hw *nix_hw,
2229 				int blkaddr, u32 cfg)
2230 {
2231 	int fmt_idx;
2232 
2233 	for (fmt_idx = 0; fmt_idx < nix_hw->mark_format.in_use; fmt_idx++) {
2234 		if (nix_hw->mark_format.cfg[fmt_idx] == cfg)
2235 			return fmt_idx;
2236 	}
2237 	if (fmt_idx >= nix_hw->mark_format.total)
2238 		return -ERANGE;
2239 
2240 	rvu_write64(rvu, blkaddr, NIX_AF_MARK_FORMATX_CTL(fmt_idx), cfg);
2241 	nix_hw->mark_format.cfg[fmt_idx] = cfg;
2242 	nix_hw->mark_format.in_use++;
2243 	return fmt_idx;
2244 }
2245 
2246 static int nix_af_mark_format_setup(struct rvu *rvu, struct nix_hw *nix_hw,
2247 				    int blkaddr)
2248 {
2249 	u64 cfgs[] = {
2250 		[NIX_MARK_CFG_IP_DSCP_RED]         = 0x10003,
2251 		[NIX_MARK_CFG_IP_DSCP_YELLOW]      = 0x11200,
2252 		[NIX_MARK_CFG_IP_DSCP_YELLOW_RED]  = 0x11203,
2253 		[NIX_MARK_CFG_IP_ECN_RED]          = 0x6000c,
2254 		[NIX_MARK_CFG_IP_ECN_YELLOW]       = 0x60c00,
2255 		[NIX_MARK_CFG_IP_ECN_YELLOW_RED]   = 0x60c0c,
2256 		[NIX_MARK_CFG_VLAN_DEI_RED]        = 0x30008,
2257 		[NIX_MARK_CFG_VLAN_DEI_YELLOW]     = 0x30800,
2258 		[NIX_MARK_CFG_VLAN_DEI_YELLOW_RED] = 0x30808,
2259 	};
2260 	int i, rc;
2261 	u64 total;
2262 
2263 	total = (rvu_read64(rvu, blkaddr, NIX_AF_PSE_CONST) & 0xFF00) >> 8;
2264 	nix_hw->mark_format.total = (u8)total;
2265 	nix_hw->mark_format.cfg = devm_kcalloc(rvu->dev, total, sizeof(u32),
2266 					       GFP_KERNEL);
2267 	if (!nix_hw->mark_format.cfg)
2268 		return -ENOMEM;
2269 	for (i = 0; i < NIX_MARK_CFG_MAX; i++) {
2270 		rc = rvu_nix_reserve_mark_format(rvu, nix_hw, blkaddr, cfgs[i]);
2271 		if (rc < 0)
2272 			dev_err(rvu->dev, "Err %d in setup mark format %d\n",
2273 				i, rc);
2274 	}
2275 
2276 	return 0;
2277 }
2278 
2279 int rvu_mbox_handler_nix_stats_rst(struct rvu *rvu, struct msg_req *req,
2280 				   struct msg_rsp *rsp)
2281 {
2282 	u16 pcifunc = req->hdr.pcifunc;
2283 	int i, nixlf, blkaddr, err;
2284 	u64 stats;
2285 
2286 	err = nix_get_nixlf(rvu, pcifunc, &nixlf, &blkaddr);
2287 	if (err)
2288 		return err;
2289 
2290 	/* Get stats count supported by HW */
2291 	stats = rvu_read64(rvu, blkaddr, NIX_AF_CONST1);
2292 
2293 	/* Reset tx stats */
2294 	for (i = 0; i < ((stats >> 24) & 0xFF); i++)
2295 		rvu_write64(rvu, blkaddr, NIX_AF_LFX_TX_STATX(nixlf, i), 0);
2296 
2297 	/* Reset rx stats */
2298 	for (i = 0; i < ((stats >> 32) & 0xFF); i++)
2299 		rvu_write64(rvu, blkaddr, NIX_AF_LFX_RX_STATX(nixlf, i), 0);
2300 
2301 	return 0;
2302 }
2303 
2304 /* Returns the ALG index to be set into NPC_RX_ACTION */
2305 static int get_flowkey_alg_idx(struct nix_hw *nix_hw, u32 flow_cfg)
2306 {
2307 	int i;
2308 
2309 	/* Scan over exiting algo entries to find a match */
2310 	for (i = 0; i < nix_hw->flowkey.in_use; i++)
2311 		if (nix_hw->flowkey.flowkey[i] == flow_cfg)
2312 			return i;
2313 
2314 	return -ERANGE;
2315 }
2316 
2317 static int set_flowkey_fields(struct nix_rx_flowkey_alg *alg, u32 flow_cfg)
2318 {
2319 	int idx, nr_field, key_off, field_marker, keyoff_marker;
2320 	int max_key_off, max_bit_pos, group_member;
2321 	struct nix_rx_flowkey_alg *field;
2322 	struct nix_rx_flowkey_alg tmp;
2323 	u32 key_type, valid_key;
2324 
2325 	if (!alg)
2326 		return -EINVAL;
2327 
2328 #define FIELDS_PER_ALG  5
2329 #define MAX_KEY_OFF	40
2330 	/* Clear all fields */
2331 	memset(alg, 0, sizeof(uint64_t) * FIELDS_PER_ALG);
2332 
2333 	/* Each of the 32 possible flow key algorithm definitions should
2334 	 * fall into above incremental config (except ALG0). Otherwise a
2335 	 * single NPC MCAM entry is not sufficient for supporting RSS.
2336 	 *
2337 	 * If a different definition or combination needed then NPC MCAM
2338 	 * has to be programmed to filter such pkts and it's action should
2339 	 * point to this definition to calculate flowtag or hash.
2340 	 *
2341 	 * The `for loop` goes over _all_ protocol field and the following
2342 	 * variables depicts the state machine forward progress logic.
2343 	 *
2344 	 * keyoff_marker - Enabled when hash byte length needs to be accounted
2345 	 * in field->key_offset update.
2346 	 * field_marker - Enabled when a new field needs to be selected.
2347 	 * group_member - Enabled when protocol is part of a group.
2348 	 */
2349 
2350 	keyoff_marker = 0; max_key_off = 0; group_member = 0;
2351 	nr_field = 0; key_off = 0; field_marker = 1;
2352 	field = &tmp; max_bit_pos = fls(flow_cfg);
2353 	for (idx = 0;
2354 	     idx < max_bit_pos && nr_field < FIELDS_PER_ALG &&
2355 	     key_off < MAX_KEY_OFF; idx++) {
2356 		key_type = BIT(idx);
2357 		valid_key = flow_cfg & key_type;
2358 		/* Found a field marker, reset the field values */
2359 		if (field_marker)
2360 			memset(&tmp, 0, sizeof(tmp));
2361 
2362 		field_marker = true;
2363 		keyoff_marker = true;
2364 		switch (key_type) {
2365 		case NIX_FLOW_KEY_TYPE_PORT:
2366 			field->sel_chan = true;
2367 			/* This should be set to 1, when SEL_CHAN is set */
2368 			field->bytesm1 = 1;
2369 			break;
2370 		case NIX_FLOW_KEY_TYPE_IPV4:
2371 		case NIX_FLOW_KEY_TYPE_INNR_IPV4:
2372 			field->lid = NPC_LID_LC;
2373 			field->ltype_match = NPC_LT_LC_IP;
2374 			if (key_type == NIX_FLOW_KEY_TYPE_INNR_IPV4) {
2375 				field->lid = NPC_LID_LG;
2376 				field->ltype_match = NPC_LT_LG_TU_IP;
2377 			}
2378 			field->hdr_offset = 12; /* SIP offset */
2379 			field->bytesm1 = 7; /* SIP + DIP, 8 bytes */
2380 			field->ltype_mask = 0xF; /* Match only IPv4 */
2381 			keyoff_marker = false;
2382 			break;
2383 		case NIX_FLOW_KEY_TYPE_IPV6:
2384 		case NIX_FLOW_KEY_TYPE_INNR_IPV6:
2385 			field->lid = NPC_LID_LC;
2386 			field->ltype_match = NPC_LT_LC_IP6;
2387 			if (key_type == NIX_FLOW_KEY_TYPE_INNR_IPV6) {
2388 				field->lid = NPC_LID_LG;
2389 				field->ltype_match = NPC_LT_LG_TU_IP6;
2390 			}
2391 			field->hdr_offset = 8; /* SIP offset */
2392 			field->bytesm1 = 31; /* SIP + DIP, 32 bytes */
2393 			field->ltype_mask = 0xF; /* Match only IPv6 */
2394 			break;
2395 		case NIX_FLOW_KEY_TYPE_TCP:
2396 		case NIX_FLOW_KEY_TYPE_UDP:
2397 		case NIX_FLOW_KEY_TYPE_SCTP:
2398 		case NIX_FLOW_KEY_TYPE_INNR_TCP:
2399 		case NIX_FLOW_KEY_TYPE_INNR_UDP:
2400 		case NIX_FLOW_KEY_TYPE_INNR_SCTP:
2401 			field->lid = NPC_LID_LD;
2402 			if (key_type == NIX_FLOW_KEY_TYPE_INNR_TCP ||
2403 			    key_type == NIX_FLOW_KEY_TYPE_INNR_UDP ||
2404 			    key_type == NIX_FLOW_KEY_TYPE_INNR_SCTP)
2405 				field->lid = NPC_LID_LH;
2406 			field->bytesm1 = 3; /* Sport + Dport, 4 bytes */
2407 
2408 			/* Enum values for NPC_LID_LD and NPC_LID_LG are same,
2409 			 * so no need to change the ltype_match, just change
2410 			 * the lid for inner protocols
2411 			 */
2412 			BUILD_BUG_ON((int)NPC_LT_LD_TCP !=
2413 				     (int)NPC_LT_LH_TU_TCP);
2414 			BUILD_BUG_ON((int)NPC_LT_LD_UDP !=
2415 				     (int)NPC_LT_LH_TU_UDP);
2416 			BUILD_BUG_ON((int)NPC_LT_LD_SCTP !=
2417 				     (int)NPC_LT_LH_TU_SCTP);
2418 
2419 			if ((key_type == NIX_FLOW_KEY_TYPE_TCP ||
2420 			     key_type == NIX_FLOW_KEY_TYPE_INNR_TCP) &&
2421 			    valid_key) {
2422 				field->ltype_match |= NPC_LT_LD_TCP;
2423 				group_member = true;
2424 			} else if ((key_type == NIX_FLOW_KEY_TYPE_UDP ||
2425 				    key_type == NIX_FLOW_KEY_TYPE_INNR_UDP) &&
2426 				   valid_key) {
2427 				field->ltype_match |= NPC_LT_LD_UDP;
2428 				group_member = true;
2429 			} else if ((key_type == NIX_FLOW_KEY_TYPE_SCTP ||
2430 				    key_type == NIX_FLOW_KEY_TYPE_INNR_SCTP) &&
2431 				   valid_key) {
2432 				field->ltype_match |= NPC_LT_LD_SCTP;
2433 				group_member = true;
2434 			}
2435 			field->ltype_mask = ~field->ltype_match;
2436 			if (key_type == NIX_FLOW_KEY_TYPE_SCTP ||
2437 			    key_type == NIX_FLOW_KEY_TYPE_INNR_SCTP) {
2438 				/* Handle the case where any of the group item
2439 				 * is enabled in the group but not the final one
2440 				 */
2441 				if (group_member) {
2442 					valid_key = true;
2443 					group_member = false;
2444 				}
2445 			} else {
2446 				field_marker = false;
2447 				keyoff_marker = false;
2448 			}
2449 			break;
2450 		case NIX_FLOW_KEY_TYPE_NVGRE:
2451 			field->lid = NPC_LID_LD;
2452 			field->hdr_offset = 4; /* VSID offset */
2453 			field->bytesm1 = 2;
2454 			field->ltype_match = NPC_LT_LD_NVGRE;
2455 			field->ltype_mask = 0xF;
2456 			break;
2457 		case NIX_FLOW_KEY_TYPE_VXLAN:
2458 		case NIX_FLOW_KEY_TYPE_GENEVE:
2459 			field->lid = NPC_LID_LE;
2460 			field->bytesm1 = 2;
2461 			field->hdr_offset = 4;
2462 			field->ltype_mask = 0xF;
2463 			field_marker = false;
2464 			keyoff_marker = false;
2465 
2466 			if (key_type == NIX_FLOW_KEY_TYPE_VXLAN && valid_key) {
2467 				field->ltype_match |= NPC_LT_LE_VXLAN;
2468 				group_member = true;
2469 			}
2470 
2471 			if (key_type == NIX_FLOW_KEY_TYPE_GENEVE && valid_key) {
2472 				field->ltype_match |= NPC_LT_LE_GENEVE;
2473 				group_member = true;
2474 			}
2475 
2476 			if (key_type == NIX_FLOW_KEY_TYPE_GENEVE) {
2477 				if (group_member) {
2478 					field->ltype_mask = ~field->ltype_match;
2479 					field_marker = true;
2480 					keyoff_marker = true;
2481 					valid_key = true;
2482 					group_member = false;
2483 				}
2484 			}
2485 			break;
2486 		case NIX_FLOW_KEY_TYPE_ETH_DMAC:
2487 		case NIX_FLOW_KEY_TYPE_INNR_ETH_DMAC:
2488 			field->lid = NPC_LID_LA;
2489 			field->ltype_match = NPC_LT_LA_ETHER;
2490 			if (key_type == NIX_FLOW_KEY_TYPE_INNR_ETH_DMAC) {
2491 				field->lid = NPC_LID_LF;
2492 				field->ltype_match = NPC_LT_LF_TU_ETHER;
2493 			}
2494 			field->hdr_offset = 0;
2495 			field->bytesm1 = 5; /* DMAC 6 Byte */
2496 			field->ltype_mask = 0xF;
2497 			break;
2498 		case NIX_FLOW_KEY_TYPE_IPV6_EXT:
2499 			field->lid = NPC_LID_LC;
2500 			field->hdr_offset = 40; /* IPV6 hdr */
2501 			field->bytesm1 = 0; /* 1 Byte ext hdr*/
2502 			field->ltype_match = NPC_LT_LC_IP6_EXT;
2503 			field->ltype_mask = 0xF;
2504 			break;
2505 		case NIX_FLOW_KEY_TYPE_GTPU:
2506 			field->lid = NPC_LID_LE;
2507 			field->hdr_offset = 4;
2508 			field->bytesm1 = 3; /* 4 bytes TID*/
2509 			field->ltype_match = NPC_LT_LE_GTPU;
2510 			field->ltype_mask = 0xF;
2511 			break;
2512 		}
2513 		field->ena = 1;
2514 
2515 		/* Found a valid flow key type */
2516 		if (valid_key) {
2517 			field->key_offset = key_off;
2518 			memcpy(&alg[nr_field], field, sizeof(*field));
2519 			max_key_off = max(max_key_off, field->bytesm1 + 1);
2520 
2521 			/* Found a field marker, get the next field */
2522 			if (field_marker)
2523 				nr_field++;
2524 		}
2525 
2526 		/* Found a keyoff marker, update the new key_off */
2527 		if (keyoff_marker) {
2528 			key_off += max_key_off;
2529 			max_key_off = 0;
2530 		}
2531 	}
2532 	/* Processed all the flow key types */
2533 	if (idx == max_bit_pos && key_off <= MAX_KEY_OFF)
2534 		return 0;
2535 	else
2536 		return NIX_AF_ERR_RSS_NOSPC_FIELD;
2537 }
2538 
2539 static int reserve_flowkey_alg_idx(struct rvu *rvu, int blkaddr, u32 flow_cfg)
2540 {
2541 	u64 field[FIELDS_PER_ALG];
2542 	struct nix_hw *hw;
2543 	int fid, rc;
2544 
2545 	hw = get_nix_hw(rvu->hw, blkaddr);
2546 	if (!hw)
2547 		return -EINVAL;
2548 
2549 	/* No room to add new flow hash algoritham */
2550 	if (hw->flowkey.in_use >= NIX_FLOW_KEY_ALG_MAX)
2551 		return NIX_AF_ERR_RSS_NOSPC_ALGO;
2552 
2553 	/* Generate algo fields for the given flow_cfg */
2554 	rc = set_flowkey_fields((struct nix_rx_flowkey_alg *)field, flow_cfg);
2555 	if (rc)
2556 		return rc;
2557 
2558 	/* Update ALGX_FIELDX register with generated fields */
2559 	for (fid = 0; fid < FIELDS_PER_ALG; fid++)
2560 		rvu_write64(rvu, blkaddr,
2561 			    NIX_AF_RX_FLOW_KEY_ALGX_FIELDX(hw->flowkey.in_use,
2562 							   fid), field[fid]);
2563 
2564 	/* Store the flow_cfg for futher lookup */
2565 	rc = hw->flowkey.in_use;
2566 	hw->flowkey.flowkey[rc] = flow_cfg;
2567 	hw->flowkey.in_use++;
2568 
2569 	return rc;
2570 }
2571 
2572 int rvu_mbox_handler_nix_rss_flowkey_cfg(struct rvu *rvu,
2573 					 struct nix_rss_flowkey_cfg *req,
2574 					 struct nix_rss_flowkey_cfg_rsp *rsp)
2575 {
2576 	u16 pcifunc = req->hdr.pcifunc;
2577 	int alg_idx, nixlf, blkaddr;
2578 	struct nix_hw *nix_hw;
2579 	int err;
2580 
2581 	err = nix_get_nixlf(rvu, pcifunc, &nixlf, &blkaddr);
2582 	if (err)
2583 		return err;
2584 
2585 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
2586 	if (!nix_hw)
2587 		return -EINVAL;
2588 
2589 	alg_idx = get_flowkey_alg_idx(nix_hw, req->flowkey_cfg);
2590 	/* Failed to get algo index from the exiting list, reserve new  */
2591 	if (alg_idx < 0) {
2592 		alg_idx = reserve_flowkey_alg_idx(rvu, blkaddr,
2593 						  req->flowkey_cfg);
2594 		if (alg_idx < 0)
2595 			return alg_idx;
2596 	}
2597 	rsp->alg_idx = alg_idx;
2598 	rvu_npc_update_flowkey_alg_idx(rvu, pcifunc, nixlf, req->group,
2599 				       alg_idx, req->mcam_index);
2600 	return 0;
2601 }
2602 
2603 static int nix_rx_flowkey_alg_cfg(struct rvu *rvu, int blkaddr)
2604 {
2605 	u32 flowkey_cfg, minkey_cfg;
2606 	int alg, fid, rc;
2607 
2608 	/* Disable all flow key algx fieldx */
2609 	for (alg = 0; alg < NIX_FLOW_KEY_ALG_MAX; alg++) {
2610 		for (fid = 0; fid < FIELDS_PER_ALG; fid++)
2611 			rvu_write64(rvu, blkaddr,
2612 				    NIX_AF_RX_FLOW_KEY_ALGX_FIELDX(alg, fid),
2613 				    0);
2614 	}
2615 
2616 	/* IPv4/IPv6 SIP/DIPs */
2617 	flowkey_cfg = NIX_FLOW_KEY_TYPE_IPV4 | NIX_FLOW_KEY_TYPE_IPV6;
2618 	rc = reserve_flowkey_alg_idx(rvu, blkaddr, flowkey_cfg);
2619 	if (rc < 0)
2620 		return rc;
2621 
2622 	/* TCPv4/v6 4-tuple, SIP, DIP, Sport, Dport */
2623 	minkey_cfg = flowkey_cfg;
2624 	flowkey_cfg = minkey_cfg | NIX_FLOW_KEY_TYPE_TCP;
2625 	rc = reserve_flowkey_alg_idx(rvu, blkaddr, flowkey_cfg);
2626 	if (rc < 0)
2627 		return rc;
2628 
2629 	/* UDPv4/v6 4-tuple, SIP, DIP, Sport, Dport */
2630 	flowkey_cfg = minkey_cfg | NIX_FLOW_KEY_TYPE_UDP;
2631 	rc = reserve_flowkey_alg_idx(rvu, blkaddr, flowkey_cfg);
2632 	if (rc < 0)
2633 		return rc;
2634 
2635 	/* SCTPv4/v6 4-tuple, SIP, DIP, Sport, Dport */
2636 	flowkey_cfg = minkey_cfg | NIX_FLOW_KEY_TYPE_SCTP;
2637 	rc = reserve_flowkey_alg_idx(rvu, blkaddr, flowkey_cfg);
2638 	if (rc < 0)
2639 		return rc;
2640 
2641 	/* TCP/UDP v4/v6 4-tuple, rest IP pkts 2-tuple */
2642 	flowkey_cfg = minkey_cfg | NIX_FLOW_KEY_TYPE_TCP |
2643 			NIX_FLOW_KEY_TYPE_UDP;
2644 	rc = reserve_flowkey_alg_idx(rvu, blkaddr, flowkey_cfg);
2645 	if (rc < 0)
2646 		return rc;
2647 
2648 	/* TCP/SCTP v4/v6 4-tuple, rest IP pkts 2-tuple */
2649 	flowkey_cfg = minkey_cfg | NIX_FLOW_KEY_TYPE_TCP |
2650 			NIX_FLOW_KEY_TYPE_SCTP;
2651 	rc = reserve_flowkey_alg_idx(rvu, blkaddr, flowkey_cfg);
2652 	if (rc < 0)
2653 		return rc;
2654 
2655 	/* UDP/SCTP v4/v6 4-tuple, rest IP pkts 2-tuple */
2656 	flowkey_cfg = minkey_cfg | NIX_FLOW_KEY_TYPE_UDP |
2657 			NIX_FLOW_KEY_TYPE_SCTP;
2658 	rc = reserve_flowkey_alg_idx(rvu, blkaddr, flowkey_cfg);
2659 	if (rc < 0)
2660 		return rc;
2661 
2662 	/* TCP/UDP/SCTP v4/v6 4-tuple, rest IP pkts 2-tuple */
2663 	flowkey_cfg = minkey_cfg | NIX_FLOW_KEY_TYPE_TCP |
2664 		      NIX_FLOW_KEY_TYPE_UDP | NIX_FLOW_KEY_TYPE_SCTP;
2665 	rc = reserve_flowkey_alg_idx(rvu, blkaddr, flowkey_cfg);
2666 	if (rc < 0)
2667 		return rc;
2668 
2669 	return 0;
2670 }
2671 
2672 int rvu_mbox_handler_nix_set_mac_addr(struct rvu *rvu,
2673 				      struct nix_set_mac_addr *req,
2674 				      struct msg_rsp *rsp)
2675 {
2676 	u16 pcifunc = req->hdr.pcifunc;
2677 	int blkaddr, nixlf, err;
2678 	struct rvu_pfvf *pfvf;
2679 
2680 	err = nix_get_nixlf(rvu, pcifunc, &nixlf, &blkaddr);
2681 	if (err)
2682 		return err;
2683 
2684 	pfvf = rvu_get_pfvf(rvu, pcifunc);
2685 
2686 	ether_addr_copy(pfvf->mac_addr, req->mac_addr);
2687 
2688 	rvu_npc_install_ucast_entry(rvu, pcifunc, nixlf,
2689 				    pfvf->rx_chan_base, req->mac_addr);
2690 
2691 	rvu_npc_update_rxvlan(rvu, pcifunc, nixlf);
2692 
2693 	return 0;
2694 }
2695 
2696 int rvu_mbox_handler_nix_get_mac_addr(struct rvu *rvu,
2697 				      struct msg_req *req,
2698 				      struct nix_get_mac_addr_rsp *rsp)
2699 {
2700 	u16 pcifunc = req->hdr.pcifunc;
2701 	struct rvu_pfvf *pfvf;
2702 
2703 	if (!is_nixlf_attached(rvu, pcifunc))
2704 		return NIX_AF_ERR_AF_LF_INVALID;
2705 
2706 	pfvf = rvu_get_pfvf(rvu, pcifunc);
2707 
2708 	ether_addr_copy(rsp->mac_addr, pfvf->mac_addr);
2709 
2710 	return 0;
2711 }
2712 
2713 int rvu_mbox_handler_nix_set_rx_mode(struct rvu *rvu, struct nix_rx_mode *req,
2714 				     struct msg_rsp *rsp)
2715 {
2716 	bool allmulti = false, disable_promisc = false;
2717 	u16 pcifunc = req->hdr.pcifunc;
2718 	int blkaddr, nixlf, err;
2719 	struct rvu_pfvf *pfvf;
2720 
2721 	err = nix_get_nixlf(rvu, pcifunc, &nixlf, &blkaddr);
2722 	if (err)
2723 		return err;
2724 
2725 	pfvf = rvu_get_pfvf(rvu, pcifunc);
2726 
2727 	if (req->mode & NIX_RX_MODE_PROMISC)
2728 		allmulti = false;
2729 	else if (req->mode & NIX_RX_MODE_ALLMULTI)
2730 		allmulti = true;
2731 	else
2732 		disable_promisc = true;
2733 
2734 	if (disable_promisc)
2735 		rvu_npc_disable_promisc_entry(rvu, pcifunc, nixlf);
2736 	else
2737 		rvu_npc_install_promisc_entry(rvu, pcifunc, nixlf,
2738 					      pfvf->rx_chan_base, allmulti);
2739 
2740 	rvu_npc_update_rxvlan(rvu, pcifunc, nixlf);
2741 
2742 	return 0;
2743 }
2744 
2745 static void nix_find_link_frs(struct rvu *rvu,
2746 			      struct nix_frs_cfg *req, u16 pcifunc)
2747 {
2748 	int pf = rvu_get_pf(pcifunc);
2749 	struct rvu_pfvf *pfvf;
2750 	int maxlen, minlen;
2751 	int numvfs, hwvf;
2752 	int vf;
2753 
2754 	/* Update with requester's min/max lengths */
2755 	pfvf = rvu_get_pfvf(rvu, pcifunc);
2756 	pfvf->maxlen = req->maxlen;
2757 	if (req->update_minlen)
2758 		pfvf->minlen = req->minlen;
2759 
2760 	maxlen = req->maxlen;
2761 	minlen = req->update_minlen ? req->minlen : 0;
2762 
2763 	/* Get this PF's numVFs and starting hwvf */
2764 	rvu_get_pf_numvfs(rvu, pf, &numvfs, &hwvf);
2765 
2766 	/* For each VF, compare requested max/minlen */
2767 	for (vf = 0; vf < numvfs; vf++) {
2768 		pfvf =  &rvu->hwvf[hwvf + vf];
2769 		if (pfvf->maxlen > maxlen)
2770 			maxlen = pfvf->maxlen;
2771 		if (req->update_minlen &&
2772 		    pfvf->minlen && pfvf->minlen < minlen)
2773 			minlen = pfvf->minlen;
2774 	}
2775 
2776 	/* Compare requested max/minlen with PF's max/minlen */
2777 	pfvf = &rvu->pf[pf];
2778 	if (pfvf->maxlen > maxlen)
2779 		maxlen = pfvf->maxlen;
2780 	if (req->update_minlen &&
2781 	    pfvf->minlen && pfvf->minlen < minlen)
2782 		minlen = pfvf->minlen;
2783 
2784 	/* Update the request with max/min PF's and it's VF's max/min */
2785 	req->maxlen = maxlen;
2786 	if (req->update_minlen)
2787 		req->minlen = minlen;
2788 }
2789 
2790 int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
2791 				    struct msg_rsp *rsp)
2792 {
2793 	struct rvu_hwinfo *hw = rvu->hw;
2794 	u16 pcifunc = req->hdr.pcifunc;
2795 	int pf = rvu_get_pf(pcifunc);
2796 	int blkaddr, schq, link = -1;
2797 	struct nix_txsch *txsch;
2798 	u64 cfg, lmac_fifo_len;
2799 	struct nix_hw *nix_hw;
2800 	u8 cgx = 0, lmac = 0;
2801 
2802 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
2803 	if (blkaddr < 0)
2804 		return NIX_AF_ERR_AF_LF_INVALID;
2805 
2806 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
2807 	if (!nix_hw)
2808 		return -EINVAL;
2809 
2810 	if (!req->sdp_link && req->maxlen > NIC_HW_MAX_FRS)
2811 		return NIX_AF_ERR_FRS_INVALID;
2812 
2813 	if (req->update_minlen && req->minlen < NIC_HW_MIN_FRS)
2814 		return NIX_AF_ERR_FRS_INVALID;
2815 
2816 	/* Check if requester wants to update SMQ's */
2817 	if (!req->update_smq)
2818 		goto rx_frscfg;
2819 
2820 	/* Update min/maxlen in each of the SMQ attached to this PF/VF */
2821 	txsch = &nix_hw->txsch[NIX_TXSCH_LVL_SMQ];
2822 	mutex_lock(&rvu->rsrc_lock);
2823 	for (schq = 0; schq < txsch->schq.max; schq++) {
2824 		if (TXSCH_MAP_FUNC(txsch->pfvf_map[schq]) != pcifunc)
2825 			continue;
2826 		cfg = rvu_read64(rvu, blkaddr, NIX_AF_SMQX_CFG(schq));
2827 		cfg = (cfg & ~(0xFFFFULL << 8)) | ((u64)req->maxlen << 8);
2828 		if (req->update_minlen)
2829 			cfg = (cfg & ~0x7FULL) | ((u64)req->minlen & 0x7F);
2830 		rvu_write64(rvu, blkaddr, NIX_AF_SMQX_CFG(schq), cfg);
2831 	}
2832 	mutex_unlock(&rvu->rsrc_lock);
2833 
2834 rx_frscfg:
2835 	/* Check if config is for SDP link */
2836 	if (req->sdp_link) {
2837 		if (!hw->sdp_links)
2838 			return NIX_AF_ERR_RX_LINK_INVALID;
2839 		link = hw->cgx_links + hw->lbk_links;
2840 		goto linkcfg;
2841 	}
2842 
2843 	/* Check if the request is from CGX mapped RVU PF */
2844 	if (is_pf_cgxmapped(rvu, pf)) {
2845 		/* Get CGX and LMAC to which this PF is mapped and find link */
2846 		rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx, &lmac);
2847 		link = (cgx * hw->lmac_per_cgx) + lmac;
2848 	} else if (pf == 0) {
2849 		/* For VFs of PF0 ingress is LBK port, so config LBK link */
2850 		link = hw->cgx_links;
2851 	}
2852 
2853 	if (link < 0)
2854 		return NIX_AF_ERR_RX_LINK_INVALID;
2855 
2856 	nix_find_link_frs(rvu, req, pcifunc);
2857 
2858 linkcfg:
2859 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link));
2860 	cfg = (cfg & ~(0xFFFFULL << 16)) | ((u64)req->maxlen << 16);
2861 	if (req->update_minlen)
2862 		cfg = (cfg & ~0xFFFFULL) | req->minlen;
2863 	rvu_write64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link), cfg);
2864 
2865 	if (req->sdp_link || pf == 0)
2866 		return 0;
2867 
2868 	/* Update transmit credits for CGX links */
2869 	lmac_fifo_len =
2870 		CGX_FIFO_LEN / cgx_get_lmac_cnt(rvu_cgx_pdata(cgx, rvu));
2871 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_TX_LINKX_NORM_CREDIT(link));
2872 	cfg &= ~(0xFFFFFULL << 12);
2873 	cfg |=  ((lmac_fifo_len - req->maxlen) / 16) << 12;
2874 	rvu_write64(rvu, blkaddr, NIX_AF_TX_LINKX_NORM_CREDIT(link), cfg);
2875 	return 0;
2876 }
2877 
2878 int rvu_mbox_handler_nix_rxvlan_alloc(struct rvu *rvu, struct msg_req *req,
2879 				      struct msg_rsp *rsp)
2880 {
2881 	struct npc_mcam_alloc_entry_req alloc_req = { };
2882 	struct npc_mcam_alloc_entry_rsp alloc_rsp = { };
2883 	struct npc_mcam_free_entry_req free_req = { };
2884 	u16 pcifunc = req->hdr.pcifunc;
2885 	int blkaddr, nixlf, err;
2886 	struct rvu_pfvf *pfvf;
2887 
2888 	/* LBK VFs do not have separate MCAM UCAST entry hence
2889 	 * skip allocating rxvlan for them
2890 	 */
2891 	if (is_afvf(pcifunc))
2892 		return 0;
2893 
2894 	pfvf = rvu_get_pfvf(rvu, pcifunc);
2895 	if (pfvf->rxvlan)
2896 		return 0;
2897 
2898 	/* alloc new mcam entry */
2899 	alloc_req.hdr.pcifunc = pcifunc;
2900 	alloc_req.count = 1;
2901 
2902 	err = rvu_mbox_handler_npc_mcam_alloc_entry(rvu, &alloc_req,
2903 						    &alloc_rsp);
2904 	if (err)
2905 		return err;
2906 
2907 	/* update entry to enable rxvlan offload */
2908 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
2909 	if (blkaddr < 0) {
2910 		err = NIX_AF_ERR_AF_LF_INVALID;
2911 		goto free_entry;
2912 	}
2913 
2914 	nixlf = rvu_get_lf(rvu, &rvu->hw->block[blkaddr], pcifunc, 0);
2915 	if (nixlf < 0) {
2916 		err = NIX_AF_ERR_AF_LF_INVALID;
2917 		goto free_entry;
2918 	}
2919 
2920 	pfvf->rxvlan_index = alloc_rsp.entry_list[0];
2921 	/* all it means is that rxvlan_index is valid */
2922 	pfvf->rxvlan = true;
2923 
2924 	err = rvu_npc_update_rxvlan(rvu, pcifunc, nixlf);
2925 	if (err)
2926 		goto free_entry;
2927 
2928 	return 0;
2929 free_entry:
2930 	free_req.hdr.pcifunc = pcifunc;
2931 	free_req.entry = alloc_rsp.entry_list[0];
2932 	rvu_mbox_handler_npc_mcam_free_entry(rvu, &free_req, rsp);
2933 	pfvf->rxvlan = false;
2934 	return err;
2935 }
2936 
2937 int rvu_mbox_handler_nix_set_rx_cfg(struct rvu *rvu, struct nix_rx_cfg *req,
2938 				    struct msg_rsp *rsp)
2939 {
2940 	int nixlf, blkaddr, err;
2941 	u64 cfg;
2942 
2943 	err = nix_get_nixlf(rvu, req->hdr.pcifunc, &nixlf, &blkaddr);
2944 	if (err)
2945 		return err;
2946 
2947 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_LFX_RX_CFG(nixlf));
2948 	/* Set the interface configuration */
2949 	if (req->len_verify & BIT(0))
2950 		cfg |= BIT_ULL(41);
2951 	else
2952 		cfg &= ~BIT_ULL(41);
2953 
2954 	if (req->len_verify & BIT(1))
2955 		cfg |= BIT_ULL(40);
2956 	else
2957 		cfg &= ~BIT_ULL(40);
2958 
2959 	if (req->csum_verify & BIT(0))
2960 		cfg |= BIT_ULL(37);
2961 	else
2962 		cfg &= ~BIT_ULL(37);
2963 
2964 	rvu_write64(rvu, blkaddr, NIX_AF_LFX_RX_CFG(nixlf), cfg);
2965 
2966 	return 0;
2967 }
2968 
2969 static void nix_link_config(struct rvu *rvu, int blkaddr)
2970 {
2971 	struct rvu_hwinfo *hw = rvu->hw;
2972 	int cgx, lmac_cnt, slink, link;
2973 	u64 tx_credits;
2974 
2975 	/* Set default min/max packet lengths allowed on NIX Rx links.
2976 	 *
2977 	 * With HW reset minlen value of 60byte, HW will treat ARP pkts
2978 	 * as undersize and report them to SW as error pkts, hence
2979 	 * setting it to 40 bytes.
2980 	 */
2981 	for (link = 0; link < (hw->cgx_links + hw->lbk_links); link++) {
2982 		rvu_write64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link),
2983 			    NIC_HW_MAX_FRS << 16 | NIC_HW_MIN_FRS);
2984 	}
2985 
2986 	if (hw->sdp_links) {
2987 		link = hw->cgx_links + hw->lbk_links;
2988 		rvu_write64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link),
2989 			    SDP_HW_MAX_FRS << 16 | NIC_HW_MIN_FRS);
2990 	}
2991 
2992 	/* Set credits for Tx links assuming max packet length allowed.
2993 	 * This will be reconfigured based on MTU set for PF/VF.
2994 	 */
2995 	for (cgx = 0; cgx < hw->cgx; cgx++) {
2996 		lmac_cnt = cgx_get_lmac_cnt(rvu_cgx_pdata(cgx, rvu));
2997 		tx_credits = ((CGX_FIFO_LEN / lmac_cnt) - NIC_HW_MAX_FRS) / 16;
2998 		/* Enable credits and set credit pkt count to max allowed */
2999 		tx_credits =  (tx_credits << 12) | (0x1FF << 2) | BIT_ULL(1);
3000 		slink = cgx * hw->lmac_per_cgx;
3001 		for (link = slink; link < (slink + lmac_cnt); link++) {
3002 			rvu_write64(rvu, blkaddr,
3003 				    NIX_AF_TX_LINKX_NORM_CREDIT(link),
3004 				    tx_credits);
3005 		}
3006 	}
3007 
3008 	/* Set Tx credits for LBK link */
3009 	slink = hw->cgx_links;
3010 	for (link = slink; link < (slink + hw->lbk_links); link++) {
3011 		tx_credits = 1000; /* 10 * max LBK datarate = 10 * 100Gbps */
3012 		/* Enable credits and set credit pkt count to max allowed */
3013 		tx_credits =  (tx_credits << 12) | (0x1FF << 2) | BIT_ULL(1);
3014 		rvu_write64(rvu, blkaddr,
3015 			    NIX_AF_TX_LINKX_NORM_CREDIT(link), tx_credits);
3016 	}
3017 }
3018 
3019 static int nix_calibrate_x2p(struct rvu *rvu, int blkaddr)
3020 {
3021 	int idx, err;
3022 	u64 status;
3023 
3024 	/* Start X2P bus calibration */
3025 	rvu_write64(rvu, blkaddr, NIX_AF_CFG,
3026 		    rvu_read64(rvu, blkaddr, NIX_AF_CFG) | BIT_ULL(9));
3027 	/* Wait for calibration to complete */
3028 	err = rvu_poll_reg(rvu, blkaddr,
3029 			   NIX_AF_STATUS, BIT_ULL(10), false);
3030 	if (err) {
3031 		dev_err(rvu->dev, "NIX X2P bus calibration failed\n");
3032 		return err;
3033 	}
3034 
3035 	status = rvu_read64(rvu, blkaddr, NIX_AF_STATUS);
3036 	/* Check if CGX devices are ready */
3037 	for (idx = 0; idx < rvu->cgx_cnt_max; idx++) {
3038 		/* Skip when cgx port is not available */
3039 		if (!rvu_cgx_pdata(idx, rvu) ||
3040 		    (status & (BIT_ULL(16 + idx))))
3041 			continue;
3042 		dev_err(rvu->dev,
3043 			"CGX%d didn't respond to NIX X2P calibration\n", idx);
3044 		err = -EBUSY;
3045 	}
3046 
3047 	/* Check if LBK is ready */
3048 	if (!(status & BIT_ULL(19))) {
3049 		dev_err(rvu->dev,
3050 			"LBK didn't respond to NIX X2P calibration\n");
3051 		err = -EBUSY;
3052 	}
3053 
3054 	/* Clear 'calibrate_x2p' bit */
3055 	rvu_write64(rvu, blkaddr, NIX_AF_CFG,
3056 		    rvu_read64(rvu, blkaddr, NIX_AF_CFG) & ~BIT_ULL(9));
3057 	if (err || (status & 0x3FFULL))
3058 		dev_err(rvu->dev,
3059 			"NIX X2P calibration failed, status 0x%llx\n", status);
3060 	if (err)
3061 		return err;
3062 	return 0;
3063 }
3064 
3065 static int nix_aq_init(struct rvu *rvu, struct rvu_block *block)
3066 {
3067 	u64 cfg;
3068 	int err;
3069 
3070 	/* Set admin queue endianness */
3071 	cfg = rvu_read64(rvu, block->addr, NIX_AF_CFG);
3072 #ifdef __BIG_ENDIAN
3073 	cfg |= BIT_ULL(8);
3074 	rvu_write64(rvu, block->addr, NIX_AF_CFG, cfg);
3075 #else
3076 	cfg &= ~BIT_ULL(8);
3077 	rvu_write64(rvu, block->addr, NIX_AF_CFG, cfg);
3078 #endif
3079 
3080 	/* Do not bypass NDC cache */
3081 	cfg = rvu_read64(rvu, block->addr, NIX_AF_NDC_CFG);
3082 	cfg &= ~0x3FFEULL;
3083 #ifdef CONFIG_NDC_DIS_DYNAMIC_CACHING
3084 	/* Disable caching of SQB aka SQEs */
3085 	cfg |= 0x04ULL;
3086 #endif
3087 	rvu_write64(rvu, block->addr, NIX_AF_NDC_CFG, cfg);
3088 
3089 	/* Result structure can be followed by RQ/SQ/CQ context at
3090 	 * RES + 128bytes and a write mask at RES + 256 bytes, depending on
3091 	 * operation type. Alloc sufficient result memory for all operations.
3092 	 */
3093 	err = rvu_aq_alloc(rvu, &block->aq,
3094 			   Q_COUNT(AQ_SIZE), sizeof(struct nix_aq_inst_s),
3095 			   ALIGN(sizeof(struct nix_aq_res_s), 128) + 256);
3096 	if (err)
3097 		return err;
3098 
3099 	rvu_write64(rvu, block->addr, NIX_AF_AQ_CFG, AQ_SIZE);
3100 	rvu_write64(rvu, block->addr,
3101 		    NIX_AF_AQ_BASE, (u64)block->aq->inst->iova);
3102 	return 0;
3103 }
3104 
3105 int rvu_nix_init(struct rvu *rvu)
3106 {
3107 	struct rvu_hwinfo *hw = rvu->hw;
3108 	struct rvu_block *block;
3109 	int blkaddr, err;
3110 	u64 cfg;
3111 
3112 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, 0);
3113 	if (blkaddr < 0)
3114 		return 0;
3115 	block = &hw->block[blkaddr];
3116 
3117 	if (is_rvu_96xx_B0(rvu)) {
3118 		/* As per a HW errata in 96xx A0/B0 silicon, NIX may corrupt
3119 		 * internal state when conditional clocks are turned off.
3120 		 * Hence enable them.
3121 		 */
3122 		rvu_write64(rvu, blkaddr, NIX_AF_CFG,
3123 			    rvu_read64(rvu, blkaddr, NIX_AF_CFG) | 0x40ULL);
3124 
3125 		/* Set chan/link to backpressure TL3 instead of TL2 */
3126 		rvu_write64(rvu, blkaddr, NIX_AF_PSE_CHANNEL_LEVEL, 0x01);
3127 
3128 		/* Disable SQ manager's sticky mode operation (set TM6 = 0)
3129 		 * This sticky mode is known to cause SQ stalls when multiple
3130 		 * SQs are mapped to same SMQ and transmitting pkts at a time.
3131 		 */
3132 		cfg = rvu_read64(rvu, blkaddr, NIX_AF_SQM_DBG_CTL_STATUS);
3133 		cfg &= ~BIT_ULL(15);
3134 		rvu_write64(rvu, blkaddr, NIX_AF_SQM_DBG_CTL_STATUS, cfg);
3135 	}
3136 
3137 	/* Calibrate X2P bus to check if CGX/LBK links are fine */
3138 	err = nix_calibrate_x2p(rvu, blkaddr);
3139 	if (err)
3140 		return err;
3141 
3142 	/* Set num of links of each type */
3143 	cfg = rvu_read64(rvu, blkaddr, NIX_AF_CONST);
3144 	hw->cgx = (cfg >> 12) & 0xF;
3145 	hw->lmac_per_cgx = (cfg >> 8) & 0xF;
3146 	hw->cgx_links = hw->cgx * hw->lmac_per_cgx;
3147 	hw->lbk_links = 1;
3148 	hw->sdp_links = 1;
3149 
3150 	/* Initialize admin queue */
3151 	err = nix_aq_init(rvu, block);
3152 	if (err)
3153 		return err;
3154 
3155 	/* Restore CINT timer delay to HW reset values */
3156 	rvu_write64(rvu, blkaddr, NIX_AF_CINT_DELAY, 0x0ULL);
3157 
3158 	if (blkaddr == BLKADDR_NIX0) {
3159 		hw->nix0 = devm_kzalloc(rvu->dev,
3160 					sizeof(struct nix_hw), GFP_KERNEL);
3161 		if (!hw->nix0)
3162 			return -ENOMEM;
3163 
3164 		err = nix_setup_txschq(rvu, hw->nix0, blkaddr);
3165 		if (err)
3166 			return err;
3167 
3168 		err = nix_af_mark_format_setup(rvu, hw->nix0, blkaddr);
3169 		if (err)
3170 			return err;
3171 
3172 		err = nix_setup_mcast(rvu, hw->nix0, blkaddr);
3173 		if (err)
3174 			return err;
3175 
3176 		/* Configure segmentation offload formats */
3177 		nix_setup_lso(rvu, hw->nix0, blkaddr);
3178 
3179 		/* Config Outer/Inner L2, IP, TCP, UDP and SCTP NPC layer info.
3180 		 * This helps HW protocol checker to identify headers
3181 		 * and validate length and checksums.
3182 		 */
3183 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_OL2,
3184 			    (NPC_LID_LA << 8) | (NPC_LT_LA_ETHER << 4) | 0x0F);
3185 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_OIP4,
3186 			    (NPC_LID_LC << 8) | (NPC_LT_LC_IP << 4) | 0x0F);
3187 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_IIP4,
3188 			    (NPC_LID_LG << 8) | (NPC_LT_LG_TU_IP << 4) | 0x0F);
3189 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_OIP6,
3190 			    (NPC_LID_LC << 8) | (NPC_LT_LC_IP6 << 4) | 0x0F);
3191 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_IIP6,
3192 			    (NPC_LID_LG << 8) | (NPC_LT_LG_TU_IP6 << 4) | 0x0F);
3193 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_OTCP,
3194 			    (NPC_LID_LD << 8) | (NPC_LT_LD_TCP << 4) | 0x0F);
3195 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_ITCP,
3196 			    (NPC_LID_LH << 8) | (NPC_LT_LH_TU_TCP << 4) | 0x0F);
3197 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_OUDP,
3198 			    (NPC_LID_LD << 8) | (NPC_LT_LD_UDP << 4) | 0x0F);
3199 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_IUDP,
3200 			    (NPC_LID_LH << 8) | (NPC_LT_LH_TU_UDP << 4) | 0x0F);
3201 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_OSCTP,
3202 			    (NPC_LID_LD << 8) | (NPC_LT_LD_SCTP << 4) | 0x0F);
3203 		rvu_write64(rvu, blkaddr, NIX_AF_RX_DEF_ISCTP,
3204 			    (NPC_LID_LH << 8) | (NPC_LT_LH_TU_SCTP << 4) |
3205 			    0x0F);
3206 
3207 		err = nix_rx_flowkey_alg_cfg(rvu, blkaddr);
3208 		if (err)
3209 			return err;
3210 
3211 		/* Initialize CGX/LBK/SDP link credits, min/max pkt lengths */
3212 		nix_link_config(rvu, blkaddr);
3213 
3214 		/* Enable Channel backpressure */
3215 		rvu_write64(rvu, blkaddr, NIX_AF_RX_CFG, BIT_ULL(0));
3216 	}
3217 	return 0;
3218 }
3219 
3220 void rvu_nix_freemem(struct rvu *rvu)
3221 {
3222 	struct rvu_hwinfo *hw = rvu->hw;
3223 	struct rvu_block *block;
3224 	struct nix_txsch *txsch;
3225 	struct nix_mcast *mcast;
3226 	struct nix_hw *nix_hw;
3227 	int blkaddr, lvl;
3228 
3229 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, 0);
3230 	if (blkaddr < 0)
3231 		return;
3232 
3233 	block = &hw->block[blkaddr];
3234 	rvu_aq_free(rvu, block->aq);
3235 
3236 	if (blkaddr == BLKADDR_NIX0) {
3237 		nix_hw = get_nix_hw(rvu->hw, blkaddr);
3238 		if (!nix_hw)
3239 			return;
3240 
3241 		for (lvl = 0; lvl < NIX_TXSCH_LVL_CNT; lvl++) {
3242 			txsch = &nix_hw->txsch[lvl];
3243 			kfree(txsch->schq.bmap);
3244 		}
3245 
3246 		mcast = &nix_hw->mcast;
3247 		qmem_free(rvu->dev, mcast->mce_ctx);
3248 		qmem_free(rvu->dev, mcast->mcast_buf);
3249 		mutex_destroy(&mcast->mce_lock);
3250 	}
3251 }
3252 
3253 int rvu_mbox_handler_nix_lf_start_rx(struct rvu *rvu, struct msg_req *req,
3254 				     struct msg_rsp *rsp)
3255 {
3256 	u16 pcifunc = req->hdr.pcifunc;
3257 	int nixlf, err;
3258 
3259 	err = nix_get_nixlf(rvu, pcifunc, &nixlf, NULL);
3260 	if (err)
3261 		return err;
3262 
3263 	rvu_npc_enable_default_entries(rvu, pcifunc, nixlf);
3264 
3265 	return rvu_cgx_start_stop_io(rvu, pcifunc, true);
3266 }
3267 
3268 int rvu_mbox_handler_nix_lf_stop_rx(struct rvu *rvu, struct msg_req *req,
3269 				    struct msg_rsp *rsp)
3270 {
3271 	u16 pcifunc = req->hdr.pcifunc;
3272 	int nixlf, err;
3273 
3274 	err = nix_get_nixlf(rvu, pcifunc, &nixlf, NULL);
3275 	if (err)
3276 		return err;
3277 
3278 	rvu_npc_disable_default_entries(rvu, pcifunc, nixlf);
3279 
3280 	return rvu_cgx_start_stop_io(rvu, pcifunc, false);
3281 }
3282 
3283 void rvu_nix_lf_teardown(struct rvu *rvu, u16 pcifunc, int blkaddr, int nixlf)
3284 {
3285 	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
3286 	struct hwctx_disable_req ctx_req;
3287 	int err;
3288 
3289 	ctx_req.hdr.pcifunc = pcifunc;
3290 
3291 	/* Cleanup NPC MCAM entries, free Tx scheduler queues being used */
3292 	nix_interface_deinit(rvu, pcifunc, nixlf);
3293 	nix_rx_sync(rvu, blkaddr);
3294 	nix_txschq_free(rvu, pcifunc);
3295 
3296 	rvu_cgx_start_stop_io(rvu, pcifunc, false);
3297 
3298 	if (pfvf->sq_ctx) {
3299 		ctx_req.ctype = NIX_AQ_CTYPE_SQ;
3300 		err = nix_lf_hwctx_disable(rvu, &ctx_req);
3301 		if (err)
3302 			dev_err(rvu->dev, "SQ ctx disable failed\n");
3303 	}
3304 
3305 	if (pfvf->rq_ctx) {
3306 		ctx_req.ctype = NIX_AQ_CTYPE_RQ;
3307 		err = nix_lf_hwctx_disable(rvu, &ctx_req);
3308 		if (err)
3309 			dev_err(rvu->dev, "RQ ctx disable failed\n");
3310 	}
3311 
3312 	if (pfvf->cq_ctx) {
3313 		ctx_req.ctype = NIX_AQ_CTYPE_CQ;
3314 		err = nix_lf_hwctx_disable(rvu, &ctx_req);
3315 		if (err)
3316 			dev_err(rvu->dev, "CQ ctx disable failed\n");
3317 	}
3318 
3319 	nix_ctx_free(rvu, pfvf);
3320 }
3321 
3322 int rvu_mbox_handler_nix_lso_format_cfg(struct rvu *rvu,
3323 					struct nix_lso_format_cfg *req,
3324 					struct nix_lso_format_cfg_rsp *rsp)
3325 {
3326 	u16 pcifunc = req->hdr.pcifunc;
3327 	struct nix_hw *nix_hw;
3328 	struct rvu_pfvf *pfvf;
3329 	int blkaddr, idx, f;
3330 	u64 reg;
3331 
3332 	pfvf = rvu_get_pfvf(rvu, pcifunc);
3333 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NIX, pcifunc);
3334 	if (!pfvf->nixlf || blkaddr < 0)
3335 		return NIX_AF_ERR_AF_LF_INVALID;
3336 
3337 	nix_hw = get_nix_hw(rvu->hw, blkaddr);
3338 	if (!nix_hw)
3339 		return -EINVAL;
3340 
3341 	/* Find existing matching LSO format, if any */
3342 	for (idx = 0; idx < nix_hw->lso.in_use; idx++) {
3343 		for (f = 0; f < NIX_LSO_FIELD_MAX; f++) {
3344 			reg = rvu_read64(rvu, blkaddr,
3345 					 NIX_AF_LSO_FORMATX_FIELDX(idx, f));
3346 			if (req->fields[f] != (reg & req->field_mask))
3347 				break;
3348 		}
3349 
3350 		if (f == NIX_LSO_FIELD_MAX)
3351 			break;
3352 	}
3353 
3354 	if (idx < nix_hw->lso.in_use) {
3355 		/* Match found */
3356 		rsp->lso_format_idx = idx;
3357 		return 0;
3358 	}
3359 
3360 	if (nix_hw->lso.in_use == nix_hw->lso.total)
3361 		return NIX_AF_ERR_LSO_CFG_FAIL;
3362 
3363 	rsp->lso_format_idx = nix_hw->lso.in_use++;
3364 
3365 	for (f = 0; f < NIX_LSO_FIELD_MAX; f++)
3366 		rvu_write64(rvu, blkaddr,
3367 			    NIX_AF_LSO_FORMATX_FIELDX(rsp->lso_format_idx, f),
3368 			    req->fields[f]);
3369 
3370 	return 0;
3371 }
3372