1 // SPDX-License-Identifier: GPL-2.0
2 /* Marvell RVU Admin Function driver
3  *
4  * Copyright (C) 2019 Marvell.
5  *
6  */
7 
8 #ifdef CONFIG_DEBUG_FS
9 
10 #include <linux/fs.h>
11 #include <linux/debugfs.h>
12 #include <linux/module.h>
13 #include <linux/pci.h>
14 
15 #include "rvu_struct.h"
16 #include "rvu_reg.h"
17 #include "rvu.h"
18 #include "cgx.h"
19 #include "lmac_common.h"
20 #include "npc.h"
21 
22 #define DEBUGFS_DIR_NAME "octeontx2"
23 
24 enum {
25 	CGX_STAT0,
26 	CGX_STAT1,
27 	CGX_STAT2,
28 	CGX_STAT3,
29 	CGX_STAT4,
30 	CGX_STAT5,
31 	CGX_STAT6,
32 	CGX_STAT7,
33 	CGX_STAT8,
34 	CGX_STAT9,
35 	CGX_STAT10,
36 	CGX_STAT11,
37 	CGX_STAT12,
38 	CGX_STAT13,
39 	CGX_STAT14,
40 	CGX_STAT15,
41 	CGX_STAT16,
42 	CGX_STAT17,
43 	CGX_STAT18,
44 };
45 
46 /* NIX TX stats */
47 enum nix_stat_lf_tx {
48 	TX_UCAST	= 0x0,
49 	TX_BCAST	= 0x1,
50 	TX_MCAST	= 0x2,
51 	TX_DROP		= 0x3,
52 	TX_OCTS		= 0x4,
53 	TX_STATS_ENUM_LAST,
54 };
55 
56 /* NIX RX stats */
57 enum nix_stat_lf_rx {
58 	RX_OCTS		= 0x0,
59 	RX_UCAST	= 0x1,
60 	RX_BCAST	= 0x2,
61 	RX_MCAST	= 0x3,
62 	RX_DROP		= 0x4,
63 	RX_DROP_OCTS	= 0x5,
64 	RX_FCS		= 0x6,
65 	RX_ERR		= 0x7,
66 	RX_DRP_BCAST	= 0x8,
67 	RX_DRP_MCAST	= 0x9,
68 	RX_DRP_L3BCAST	= 0xa,
69 	RX_DRP_L3MCAST	= 0xb,
70 	RX_STATS_ENUM_LAST,
71 };
72 
73 static char *cgx_rx_stats_fields[] = {
74 	[CGX_STAT0]	= "Received packets",
75 	[CGX_STAT1]	= "Octets of received packets",
76 	[CGX_STAT2]	= "Received PAUSE packets",
77 	[CGX_STAT3]	= "Received PAUSE and control packets",
78 	[CGX_STAT4]	= "Filtered DMAC0 (NIX-bound) packets",
79 	[CGX_STAT5]	= "Filtered DMAC0 (NIX-bound) octets",
80 	[CGX_STAT6]	= "Packets dropped due to RX FIFO full",
81 	[CGX_STAT7]	= "Octets dropped due to RX FIFO full",
82 	[CGX_STAT8]	= "Error packets",
83 	[CGX_STAT9]	= "Filtered DMAC1 (NCSI-bound) packets",
84 	[CGX_STAT10]	= "Filtered DMAC1 (NCSI-bound) octets",
85 	[CGX_STAT11]	= "NCSI-bound packets dropped",
86 	[CGX_STAT12]	= "NCSI-bound octets dropped",
87 };
88 
89 static char *cgx_tx_stats_fields[] = {
90 	[CGX_STAT0]	= "Packets dropped due to excessive collisions",
91 	[CGX_STAT1]	= "Packets dropped due to excessive deferral",
92 	[CGX_STAT2]	= "Multiple collisions before successful transmission",
93 	[CGX_STAT3]	= "Single collisions before successful transmission",
94 	[CGX_STAT4]	= "Total octets sent on the interface",
95 	[CGX_STAT5]	= "Total frames sent on the interface",
96 	[CGX_STAT6]	= "Packets sent with an octet count < 64",
97 	[CGX_STAT7]	= "Packets sent with an octet count == 64",
98 	[CGX_STAT8]	= "Packets sent with an octet count of 65-127",
99 	[CGX_STAT9]	= "Packets sent with an octet count of 128-255",
100 	[CGX_STAT10]	= "Packets sent with an octet count of 256-511",
101 	[CGX_STAT11]	= "Packets sent with an octet count of 512-1023",
102 	[CGX_STAT12]	= "Packets sent with an octet count of 1024-1518",
103 	[CGX_STAT13]	= "Packets sent with an octet count of > 1518",
104 	[CGX_STAT14]	= "Packets sent to a broadcast DMAC",
105 	[CGX_STAT15]	= "Packets sent to the multicast DMAC",
106 	[CGX_STAT16]	= "Transmit underflow and were truncated",
107 	[CGX_STAT17]	= "Control/PAUSE packets sent",
108 };
109 
110 static char *rpm_rx_stats_fields[] = {
111 	"Octets of received packets",
112 	"Octets of received packets with out error",
113 	"Received packets with alignment errors",
114 	"Control/PAUSE packets received",
115 	"Packets received with Frame too long Errors",
116 	"Packets received with a1nrange length Errors",
117 	"Received packets",
118 	"Packets received with FrameCheckSequenceErrors",
119 	"Packets received with VLAN header",
120 	"Error packets",
121 	"Packets received with unicast DMAC",
122 	"Packets received with multicast DMAC",
123 	"Packets received with broadcast DMAC",
124 	"Dropped packets",
125 	"Total frames received on interface",
126 	"Packets received with an octet count < 64",
127 	"Packets received with an octet count == 64",
128 	"Packets received with an octet count of 65-127",
129 	"Packets received with an octet count of 128-255",
130 	"Packets received with an octet count of 256-511",
131 	"Packets received with an octet count of 512-1023",
132 	"Packets received with an octet count of 1024-1518",
133 	"Packets received with an octet count of > 1518",
134 	"Oversized Packets",
135 	"Jabber Packets",
136 	"Fragmented Packets",
137 	"CBFC(class based flow control) pause frames received for class 0",
138 	"CBFC pause frames received for class 1",
139 	"CBFC pause frames received for class 2",
140 	"CBFC pause frames received for class 3",
141 	"CBFC pause frames received for class 4",
142 	"CBFC pause frames received for class 5",
143 	"CBFC pause frames received for class 6",
144 	"CBFC pause frames received for class 7",
145 	"CBFC pause frames received for class 8",
146 	"CBFC pause frames received for class 9",
147 	"CBFC pause frames received for class 10",
148 	"CBFC pause frames received for class 11",
149 	"CBFC pause frames received for class 12",
150 	"CBFC pause frames received for class 13",
151 	"CBFC pause frames received for class 14",
152 	"CBFC pause frames received for class 15",
153 	"MAC control packets received",
154 };
155 
156 static char *rpm_tx_stats_fields[] = {
157 	"Total octets sent on the interface",
158 	"Total octets transmitted OK",
159 	"Control/Pause frames sent",
160 	"Total frames transmitted OK",
161 	"Total frames sent with VLAN header",
162 	"Error Packets",
163 	"Packets sent to unicast DMAC",
164 	"Packets sent to the multicast DMAC",
165 	"Packets sent to a broadcast DMAC",
166 	"Packets sent with an octet count == 64",
167 	"Packets sent with an octet count of 65-127",
168 	"Packets sent with an octet count of 128-255",
169 	"Packets sent with an octet count of 256-511",
170 	"Packets sent with an octet count of 512-1023",
171 	"Packets sent with an octet count of 1024-1518",
172 	"Packets sent with an octet count of > 1518",
173 	"CBFC(class based flow control) pause frames transmitted for class 0",
174 	"CBFC pause frames transmitted for class 1",
175 	"CBFC pause frames transmitted for class 2",
176 	"CBFC pause frames transmitted for class 3",
177 	"CBFC pause frames transmitted for class 4",
178 	"CBFC pause frames transmitted for class 5",
179 	"CBFC pause frames transmitted for class 6",
180 	"CBFC pause frames transmitted for class 7",
181 	"CBFC pause frames transmitted for class 8",
182 	"CBFC pause frames transmitted for class 9",
183 	"CBFC pause frames transmitted for class 10",
184 	"CBFC pause frames transmitted for class 11",
185 	"CBFC pause frames transmitted for class 12",
186 	"CBFC pause frames transmitted for class 13",
187 	"CBFC pause frames transmitted for class 14",
188 	"CBFC pause frames transmitted for class 15",
189 	"MAC control packets sent",
190 	"Total frames sent on the interface"
191 };
192 
193 enum cpt_eng_type {
194 	CPT_AE_TYPE = 1,
195 	CPT_SE_TYPE = 2,
196 	CPT_IE_TYPE = 3,
197 };
198 
199 #define NDC_MAX_BANK(rvu, blk_addr) (rvu_read64(rvu, \
200 						blk_addr, NDC_AF_CONST) & 0xFF)
201 
202 #define rvu_dbg_NULL NULL
203 #define rvu_dbg_open_NULL NULL
204 
205 #define RVU_DEBUG_SEQ_FOPS(name, read_op, write_op)	\
206 static int rvu_dbg_open_##name(struct inode *inode, struct file *file) \
207 { \
208 	return single_open(file, rvu_dbg_##read_op, inode->i_private); \
209 } \
210 static const struct file_operations rvu_dbg_##name##_fops = { \
211 	.owner		= THIS_MODULE, \
212 	.open		= rvu_dbg_open_##name, \
213 	.read		= seq_read, \
214 	.write		= rvu_dbg_##write_op, \
215 	.llseek		= seq_lseek, \
216 	.release	= single_release, \
217 }
218 
219 #define RVU_DEBUG_FOPS(name, read_op, write_op) \
220 static const struct file_operations rvu_dbg_##name##_fops = { \
221 	.owner = THIS_MODULE, \
222 	.open = simple_open, \
223 	.read = rvu_dbg_##read_op, \
224 	.write = rvu_dbg_##write_op \
225 }
226 
227 static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf);
228 
229 #define LMT_MAPTBL_ENTRY_SIZE 16
230 /* Dump LMTST map table */
231 static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp,
232 					       char __user *buffer,
233 					       size_t count, loff_t *ppos)
234 {
235 	struct rvu *rvu = filp->private_data;
236 	u64 lmt_addr, val, tbl_base;
237 	int pf, vf, num_vfs, hw_vfs;
238 	void __iomem *lmt_map_base;
239 	int buf_size = 10240;
240 	size_t off = 0;
241 	int index = 0;
242 	char *buf;
243 	int ret;
244 
245 	/* don't allow partial reads */
246 	if (*ppos != 0)
247 		return 0;
248 
249 	buf = kzalloc(buf_size, GFP_KERNEL);
250 	if (!buf)
251 		return -ENOMEM;
252 
253 	tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE);
254 
255 	lmt_map_base = ioremap_wc(tbl_base, 128 * 1024);
256 	if (!lmt_map_base) {
257 		dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n");
258 		kfree(buf);
259 		return false;
260 	}
261 
262 	off +=	scnprintf(&buf[off], buf_size - 1 - off,
263 			  "\n\t\t\t\t\tLmtst Map Table Entries");
264 	off +=	scnprintf(&buf[off], buf_size - 1 - off,
265 			  "\n\t\t\t\t\t=======================");
266 	off +=	scnprintf(&buf[off], buf_size - 1 - off, "\nPcifunc\t\t\t");
267 	off +=	scnprintf(&buf[off], buf_size - 1 - off, "Table Index\t\t");
268 	off +=	scnprintf(&buf[off], buf_size - 1 - off,
269 			  "Lmtline Base (word 0)\t\t");
270 	off +=	scnprintf(&buf[off], buf_size - 1 - off,
271 			  "Lmt Map Entry (word 1)");
272 	off += scnprintf(&buf[off], buf_size - 1 - off, "\n");
273 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
274 		off += scnprintf(&buf[off], buf_size - 1 - off, "PF%d  \t\t\t",
275 				    pf);
276 
277 		index = pf * rvu->hw->total_vfs * LMT_MAPTBL_ENTRY_SIZE;
278 		off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%llx\t\t",
279 				 (tbl_base + index));
280 		lmt_addr = readq(lmt_map_base + index);
281 		off += scnprintf(&buf[off], buf_size - 1 - off,
282 				 " 0x%016llx\t\t", lmt_addr);
283 		index += 8;
284 		val = readq(lmt_map_base + index);
285 		off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%016llx\n",
286 				 val);
287 		/* Reading num of VFs per PF */
288 		rvu_get_pf_numvfs(rvu, pf, &num_vfs, &hw_vfs);
289 		for (vf = 0; vf < num_vfs; vf++) {
290 			index = (pf * rvu->hw->total_vfs * 16) +
291 				((vf + 1)  * LMT_MAPTBL_ENTRY_SIZE);
292 			off += scnprintf(&buf[off], buf_size - 1 - off,
293 					    "PF%d:VF%d  \t\t", pf, vf);
294 			off += scnprintf(&buf[off], buf_size - 1 - off,
295 					 " 0x%llx\t\t", (tbl_base + index));
296 			lmt_addr = readq(lmt_map_base + index);
297 			off += scnprintf(&buf[off], buf_size - 1 - off,
298 					 " 0x%016llx\t\t", lmt_addr);
299 			index += 8;
300 			val = readq(lmt_map_base + index);
301 			off += scnprintf(&buf[off], buf_size - 1 - off,
302 					 " 0x%016llx\n", val);
303 		}
304 	}
305 	off +=	scnprintf(&buf[off], buf_size - 1 - off, "\n");
306 
307 	ret = min(off, count);
308 	if (copy_to_user(buffer, buf, ret))
309 		ret = -EFAULT;
310 	kfree(buf);
311 
312 	iounmap(lmt_map_base);
313 	if (ret < 0)
314 		return ret;
315 
316 	*ppos = ret;
317 	return ret;
318 }
319 
320 RVU_DEBUG_FOPS(lmtst_map_table, lmtst_map_table_display, NULL);
321 
322 static void get_lf_str_list(struct rvu_block block, int pcifunc,
323 			    char *lfs)
324 {
325 	int lf = 0, seq = 0, len = 0, prev_lf = block.lf.max;
326 
327 	for_each_set_bit(lf, block.lf.bmap, block.lf.max) {
328 		if (lf >= block.lf.max)
329 			break;
330 
331 		if (block.fn_map[lf] != pcifunc)
332 			continue;
333 
334 		if (lf == prev_lf + 1) {
335 			prev_lf = lf;
336 			seq = 1;
337 			continue;
338 		}
339 
340 		if (seq)
341 			len += sprintf(lfs + len, "-%d,%d", prev_lf, lf);
342 		else
343 			len += (len ? sprintf(lfs + len, ",%d", lf) :
344 				      sprintf(lfs + len, "%d", lf));
345 
346 		prev_lf = lf;
347 		seq = 0;
348 	}
349 
350 	if (seq)
351 		len += sprintf(lfs + len, "-%d", prev_lf);
352 
353 	lfs[len] = '\0';
354 }
355 
356 static int get_max_column_width(struct rvu *rvu)
357 {
358 	int index, pf, vf, lf_str_size = 12, buf_size = 256;
359 	struct rvu_block block;
360 	u16 pcifunc;
361 	char *buf;
362 
363 	buf = kzalloc(buf_size, GFP_KERNEL);
364 	if (!buf)
365 		return -ENOMEM;
366 
367 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
368 		for (vf = 0; vf <= rvu->hw->total_vfs; vf++) {
369 			pcifunc = pf << 10 | vf;
370 			if (!pcifunc)
371 				continue;
372 
373 			for (index = 0; index < BLK_COUNT; index++) {
374 				block = rvu->hw->block[index];
375 				if (!strlen(block.name))
376 					continue;
377 
378 				get_lf_str_list(block, pcifunc, buf);
379 				if (lf_str_size <= strlen(buf))
380 					lf_str_size = strlen(buf) + 1;
381 			}
382 		}
383 	}
384 
385 	kfree(buf);
386 	return lf_str_size;
387 }
388 
389 /* Dumps current provisioning status of all RVU block LFs */
390 static ssize_t rvu_dbg_rsrc_attach_status(struct file *filp,
391 					  char __user *buffer,
392 					  size_t count, loff_t *ppos)
393 {
394 	int index, off = 0, flag = 0, len = 0, i = 0;
395 	struct rvu *rvu = filp->private_data;
396 	int bytes_not_copied = 0;
397 	struct rvu_block block;
398 	int pf, vf, pcifunc;
399 	int buf_size = 2048;
400 	int lf_str_size;
401 	char *lfs;
402 	char *buf;
403 
404 	/* don't allow partial reads */
405 	if (*ppos != 0)
406 		return 0;
407 
408 	buf = kzalloc(buf_size, GFP_KERNEL);
409 	if (!buf)
410 		return -ENOMEM;
411 
412 	/* Get the maximum width of a column */
413 	lf_str_size = get_max_column_width(rvu);
414 
415 	lfs = kzalloc(lf_str_size, GFP_KERNEL);
416 	if (!lfs) {
417 		kfree(buf);
418 		return -ENOMEM;
419 	}
420 	off +=	scnprintf(&buf[off], buf_size - 1 - off, "%-*s", lf_str_size,
421 			  "pcifunc");
422 	for (index = 0; index < BLK_COUNT; index++)
423 		if (strlen(rvu->hw->block[index].name)) {
424 			off += scnprintf(&buf[off], buf_size - 1 - off,
425 					 "%-*s", lf_str_size,
426 					 rvu->hw->block[index].name);
427 		}
428 
429 	off += scnprintf(&buf[off], buf_size - 1 - off, "\n");
430 	bytes_not_copied = copy_to_user(buffer + (i * off), buf, off);
431 	if (bytes_not_copied)
432 		goto out;
433 
434 	i++;
435 	*ppos += off;
436 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
437 		for (vf = 0; vf <= rvu->hw->total_vfs; vf++) {
438 			off = 0;
439 			flag = 0;
440 			pcifunc = pf << 10 | vf;
441 			if (!pcifunc)
442 				continue;
443 
444 			if (vf) {
445 				sprintf(lfs, "PF%d:VF%d", pf, vf - 1);
446 				off = scnprintf(&buf[off],
447 						buf_size - 1 - off,
448 						"%-*s", lf_str_size, lfs);
449 			} else {
450 				sprintf(lfs, "PF%d", pf);
451 				off = scnprintf(&buf[off],
452 						buf_size - 1 - off,
453 						"%-*s", lf_str_size, lfs);
454 			}
455 
456 			for (index = 0; index < BLK_COUNT; index++) {
457 				block = rvu->hw->block[index];
458 				if (!strlen(block.name))
459 					continue;
460 				len = 0;
461 				lfs[len] = '\0';
462 				get_lf_str_list(block, pcifunc, lfs);
463 				if (strlen(lfs))
464 					flag = 1;
465 
466 				off += scnprintf(&buf[off], buf_size - 1 - off,
467 						 "%-*s", lf_str_size, lfs);
468 			}
469 			if (flag) {
470 				off +=	scnprintf(&buf[off],
471 						  buf_size - 1 - off, "\n");
472 				bytes_not_copied = copy_to_user(buffer +
473 								(i * off),
474 								buf, off);
475 				if (bytes_not_copied)
476 					goto out;
477 
478 				i++;
479 				*ppos += off;
480 			}
481 		}
482 	}
483 
484 out:
485 	kfree(lfs);
486 	kfree(buf);
487 	if (bytes_not_copied)
488 		return -EFAULT;
489 
490 	return *ppos;
491 }
492 
493 RVU_DEBUG_FOPS(rsrc_status, rsrc_attach_status, NULL);
494 
495 static int rvu_dbg_rvu_pf_cgx_map_display(struct seq_file *filp, void *unused)
496 {
497 	struct rvu *rvu = filp->private;
498 	struct pci_dev *pdev = NULL;
499 	struct mac_ops *mac_ops;
500 	char cgx[10], lmac[10];
501 	struct rvu_pfvf *pfvf;
502 	int pf, domain, blkid;
503 	u8 cgx_id, lmac_id;
504 	u16 pcifunc;
505 
506 	domain = 2;
507 	mac_ops = get_mac_ops(rvu_first_cgx_pdata(rvu));
508 	/* There can be no CGX devices at all */
509 	if (!mac_ops)
510 		return 0;
511 	seq_printf(filp, "PCI dev\t\tRVU PF Func\tNIX block\t%s\tLMAC\n",
512 		   mac_ops->name);
513 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
514 		if (!is_pf_cgxmapped(rvu, pf))
515 			continue;
516 
517 		pdev =  pci_get_domain_bus_and_slot(domain, pf + 1, 0);
518 		if (!pdev)
519 			continue;
520 
521 		cgx[0] = 0;
522 		lmac[0] = 0;
523 		pcifunc = pf << 10;
524 		pfvf = rvu_get_pfvf(rvu, pcifunc);
525 
526 		if (pfvf->nix_blkaddr == BLKADDR_NIX0)
527 			blkid = 0;
528 		else
529 			blkid = 1;
530 
531 		rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id,
532 				    &lmac_id);
533 		sprintf(cgx, "%s%d", mac_ops->name, cgx_id);
534 		sprintf(lmac, "LMAC%d", lmac_id);
535 		seq_printf(filp, "%s\t0x%x\t\tNIX%d\t\t%s\t%s\n",
536 			   dev_name(&pdev->dev), pcifunc, blkid, cgx, lmac);
537 	}
538 	return 0;
539 }
540 
541 RVU_DEBUG_SEQ_FOPS(rvu_pf_cgx_map, rvu_pf_cgx_map_display, NULL);
542 
543 static bool rvu_dbg_is_valid_lf(struct rvu *rvu, int blkaddr, int lf,
544 				u16 *pcifunc)
545 {
546 	struct rvu_block *block;
547 	struct rvu_hwinfo *hw;
548 
549 	hw = rvu->hw;
550 	block = &hw->block[blkaddr];
551 
552 	if (lf < 0 || lf >= block->lf.max) {
553 		dev_warn(rvu->dev, "Invalid LF: valid range: 0-%d\n",
554 			 block->lf.max - 1);
555 		return false;
556 	}
557 
558 	*pcifunc = block->fn_map[lf];
559 	if (!*pcifunc) {
560 		dev_warn(rvu->dev,
561 			 "This LF is not attached to any RVU PFFUNC\n");
562 		return false;
563 	}
564 	return true;
565 }
566 
567 static void print_npa_qsize(struct seq_file *m, struct rvu_pfvf *pfvf)
568 {
569 	char *buf;
570 
571 	buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
572 	if (!buf)
573 		return;
574 
575 	if (!pfvf->aura_ctx) {
576 		seq_puts(m, "Aura context is not initialized\n");
577 	} else {
578 		bitmap_print_to_pagebuf(false, buf, pfvf->aura_bmap,
579 					pfvf->aura_ctx->qsize);
580 		seq_printf(m, "Aura count : %d\n", pfvf->aura_ctx->qsize);
581 		seq_printf(m, "Aura context ena/dis bitmap : %s\n", buf);
582 	}
583 
584 	if (!pfvf->pool_ctx) {
585 		seq_puts(m, "Pool context is not initialized\n");
586 	} else {
587 		bitmap_print_to_pagebuf(false, buf, pfvf->pool_bmap,
588 					pfvf->pool_ctx->qsize);
589 		seq_printf(m, "Pool count : %d\n", pfvf->pool_ctx->qsize);
590 		seq_printf(m, "Pool context ena/dis bitmap : %s\n", buf);
591 	}
592 	kfree(buf);
593 }
594 
595 /* The 'qsize' entry dumps current Aura/Pool context Qsize
596  * and each context's current enable/disable status in a bitmap.
597  */
598 static int rvu_dbg_qsize_display(struct seq_file *filp, void *unsused,
599 				 int blktype)
600 {
601 	void (*print_qsize)(struct seq_file *filp,
602 			    struct rvu_pfvf *pfvf) = NULL;
603 	struct dentry *current_dir;
604 	struct rvu_pfvf *pfvf;
605 	struct rvu *rvu;
606 	int qsize_id;
607 	u16 pcifunc;
608 	int blkaddr;
609 
610 	rvu = filp->private;
611 	switch (blktype) {
612 	case BLKTYPE_NPA:
613 		qsize_id = rvu->rvu_dbg.npa_qsize_id;
614 		print_qsize = print_npa_qsize;
615 		break;
616 
617 	case BLKTYPE_NIX:
618 		qsize_id = rvu->rvu_dbg.nix_qsize_id;
619 		print_qsize = print_nix_qsize;
620 		break;
621 
622 	default:
623 		return -EINVAL;
624 	}
625 
626 	if (blktype == BLKTYPE_NPA) {
627 		blkaddr = BLKADDR_NPA;
628 	} else {
629 		current_dir = filp->file->f_path.dentry->d_parent;
630 		blkaddr = (!strcmp(current_dir->d_name.name, "nix1") ?
631 				   BLKADDR_NIX1 : BLKADDR_NIX0);
632 	}
633 
634 	if (!rvu_dbg_is_valid_lf(rvu, blkaddr, qsize_id, &pcifunc))
635 		return -EINVAL;
636 
637 	pfvf = rvu_get_pfvf(rvu, pcifunc);
638 	print_qsize(filp, pfvf);
639 
640 	return 0;
641 }
642 
643 static ssize_t rvu_dbg_qsize_write(struct file *filp,
644 				   const char __user *buffer, size_t count,
645 				   loff_t *ppos, int blktype)
646 {
647 	char *blk_string = (blktype == BLKTYPE_NPA) ? "npa" : "nix";
648 	struct seq_file *seqfile = filp->private_data;
649 	char *cmd_buf, *cmd_buf_tmp, *subtoken;
650 	struct rvu *rvu = seqfile->private;
651 	struct dentry *current_dir;
652 	int blkaddr;
653 	u16 pcifunc;
654 	int ret, lf;
655 
656 	cmd_buf = memdup_user(buffer, count + 1);
657 	if (IS_ERR(cmd_buf))
658 		return -ENOMEM;
659 
660 	cmd_buf[count] = '\0';
661 
662 	cmd_buf_tmp = strchr(cmd_buf, '\n');
663 	if (cmd_buf_tmp) {
664 		*cmd_buf_tmp = '\0';
665 		count = cmd_buf_tmp - cmd_buf + 1;
666 	}
667 
668 	cmd_buf_tmp = cmd_buf;
669 	subtoken = strsep(&cmd_buf, " ");
670 	ret = subtoken ? kstrtoint(subtoken, 10, &lf) : -EINVAL;
671 	if (cmd_buf)
672 		ret = -EINVAL;
673 
674 	if (ret < 0 || !strncmp(subtoken, "help", 4)) {
675 		dev_info(rvu->dev, "Use echo <%s-lf > qsize\n", blk_string);
676 		goto qsize_write_done;
677 	}
678 
679 	if (blktype == BLKTYPE_NPA) {
680 		blkaddr = BLKADDR_NPA;
681 	} else {
682 		current_dir = filp->f_path.dentry->d_parent;
683 		blkaddr = (!strcmp(current_dir->d_name.name, "nix1") ?
684 				   BLKADDR_NIX1 : BLKADDR_NIX0);
685 	}
686 
687 	if (!rvu_dbg_is_valid_lf(rvu, blkaddr, lf, &pcifunc)) {
688 		ret = -EINVAL;
689 		goto qsize_write_done;
690 	}
691 	if (blktype  == BLKTYPE_NPA)
692 		rvu->rvu_dbg.npa_qsize_id = lf;
693 	else
694 		rvu->rvu_dbg.nix_qsize_id = lf;
695 
696 qsize_write_done:
697 	kfree(cmd_buf_tmp);
698 	return ret ? ret : count;
699 }
700 
701 static ssize_t rvu_dbg_npa_qsize_write(struct file *filp,
702 				       const char __user *buffer,
703 				       size_t count, loff_t *ppos)
704 {
705 	return rvu_dbg_qsize_write(filp, buffer, count, ppos,
706 					    BLKTYPE_NPA);
707 }
708 
709 static int rvu_dbg_npa_qsize_display(struct seq_file *filp, void *unused)
710 {
711 	return rvu_dbg_qsize_display(filp, unused, BLKTYPE_NPA);
712 }
713 
714 RVU_DEBUG_SEQ_FOPS(npa_qsize, npa_qsize_display, npa_qsize_write);
715 
716 /* Dumps given NPA Aura's context */
717 static void print_npa_aura_ctx(struct seq_file *m, struct npa_aq_enq_rsp *rsp)
718 {
719 	struct npa_aura_s *aura = &rsp->aura;
720 	struct rvu *rvu = m->private;
721 
722 	seq_printf(m, "W0: Pool addr\t\t%llx\n", aura->pool_addr);
723 
724 	seq_printf(m, "W1: ena\t\t\t%d\nW1: pool caching\t%d\n",
725 		   aura->ena, aura->pool_caching);
726 	seq_printf(m, "W1: pool way mask\t%d\nW1: avg con\t\t%d\n",
727 		   aura->pool_way_mask, aura->avg_con);
728 	seq_printf(m, "W1: pool drop ena\t%d\nW1: aura drop ena\t%d\n",
729 		   aura->pool_drop_ena, aura->aura_drop_ena);
730 	seq_printf(m, "W1: bp_ena\t\t%d\nW1: aura drop\t\t%d\n",
731 		   aura->bp_ena, aura->aura_drop);
732 	seq_printf(m, "W1: aura shift\t\t%d\nW1: avg_level\t\t%d\n",
733 		   aura->shift, aura->avg_level);
734 
735 	seq_printf(m, "W2: count\t\t%llu\nW2: nix0_bpid\t\t%d\nW2: nix1_bpid\t\t%d\n",
736 		   (u64)aura->count, aura->nix0_bpid, aura->nix1_bpid);
737 
738 	seq_printf(m, "W3: limit\t\t%llu\nW3: bp\t\t\t%d\nW3: fc_ena\t\t%d\n",
739 		   (u64)aura->limit, aura->bp, aura->fc_ena);
740 
741 	if (!is_rvu_otx2(rvu))
742 		seq_printf(m, "W3: fc_be\t\t%d\n", aura->fc_be);
743 	seq_printf(m, "W3: fc_up_crossing\t%d\nW3: fc_stype\t\t%d\n",
744 		   aura->fc_up_crossing, aura->fc_stype);
745 	seq_printf(m, "W3: fc_hyst_bits\t%d\n", aura->fc_hyst_bits);
746 
747 	seq_printf(m, "W4: fc_addr\t\t%llx\n", aura->fc_addr);
748 
749 	seq_printf(m, "W5: pool_drop\t\t%d\nW5: update_time\t\t%d\n",
750 		   aura->pool_drop, aura->update_time);
751 	seq_printf(m, "W5: err_int \t\t%d\nW5: err_int_ena\t\t%d\n",
752 		   aura->err_int, aura->err_int_ena);
753 	seq_printf(m, "W5: thresh_int\t\t%d\nW5: thresh_int_ena \t%d\n",
754 		   aura->thresh_int, aura->thresh_int_ena);
755 	seq_printf(m, "W5: thresh_up\t\t%d\nW5: thresh_qint_idx\t%d\n",
756 		   aura->thresh_up, aura->thresh_qint_idx);
757 	seq_printf(m, "W5: err_qint_idx \t%d\n", aura->err_qint_idx);
758 
759 	seq_printf(m, "W6: thresh\t\t%llu\n", (u64)aura->thresh);
760 	if (!is_rvu_otx2(rvu))
761 		seq_printf(m, "W6: fc_msh_dst\t\t%d\n", aura->fc_msh_dst);
762 }
763 
764 /* Dumps given NPA Pool's context */
765 static void print_npa_pool_ctx(struct seq_file *m, struct npa_aq_enq_rsp *rsp)
766 {
767 	struct npa_pool_s *pool = &rsp->pool;
768 	struct rvu *rvu = m->private;
769 
770 	seq_printf(m, "W0: Stack base\t\t%llx\n", pool->stack_base);
771 
772 	seq_printf(m, "W1: ena \t\t%d\nW1: nat_align \t\t%d\n",
773 		   pool->ena, pool->nat_align);
774 	seq_printf(m, "W1: stack_caching\t%d\nW1: stack_way_mask\t%d\n",
775 		   pool->stack_caching, pool->stack_way_mask);
776 	seq_printf(m, "W1: buf_offset\t\t%d\nW1: buf_size\t\t%d\n",
777 		   pool->buf_offset, pool->buf_size);
778 
779 	seq_printf(m, "W2: stack_max_pages \t%d\nW2: stack_pages\t\t%d\n",
780 		   pool->stack_max_pages, pool->stack_pages);
781 
782 	seq_printf(m, "W3: op_pc \t\t%llu\n", (u64)pool->op_pc);
783 
784 	seq_printf(m, "W4: stack_offset\t%d\nW4: shift\t\t%d\nW4: avg_level\t\t%d\n",
785 		   pool->stack_offset, pool->shift, pool->avg_level);
786 	seq_printf(m, "W4: avg_con \t\t%d\nW4: fc_ena\t\t%d\nW4: fc_stype\t\t%d\n",
787 		   pool->avg_con, pool->fc_ena, pool->fc_stype);
788 	seq_printf(m, "W4: fc_hyst_bits\t%d\nW4: fc_up_crossing\t%d\n",
789 		   pool->fc_hyst_bits, pool->fc_up_crossing);
790 	if (!is_rvu_otx2(rvu))
791 		seq_printf(m, "W4: fc_be\t\t%d\n", pool->fc_be);
792 	seq_printf(m, "W4: update_time\t\t%d\n", pool->update_time);
793 
794 	seq_printf(m, "W5: fc_addr\t\t%llx\n", pool->fc_addr);
795 
796 	seq_printf(m, "W6: ptr_start\t\t%llx\n", pool->ptr_start);
797 
798 	seq_printf(m, "W7: ptr_end\t\t%llx\n", pool->ptr_end);
799 
800 	seq_printf(m, "W8: err_int\t\t%d\nW8: err_int_ena\t\t%d\n",
801 		   pool->err_int, pool->err_int_ena);
802 	seq_printf(m, "W8: thresh_int\t\t%d\n", pool->thresh_int);
803 	seq_printf(m, "W8: thresh_int_ena\t%d\nW8: thresh_up\t\t%d\n",
804 		   pool->thresh_int_ena, pool->thresh_up);
805 	seq_printf(m, "W8: thresh_qint_idx\t%d\nW8: err_qint_idx\t%d\n",
806 		   pool->thresh_qint_idx, pool->err_qint_idx);
807 	if (!is_rvu_otx2(rvu))
808 		seq_printf(m, "W8: fc_msh_dst\t\t%d\n", pool->fc_msh_dst);
809 }
810 
811 /* Reads aura/pool's ctx from admin queue */
812 static int rvu_dbg_npa_ctx_display(struct seq_file *m, void *unused, int ctype)
813 {
814 	void (*print_npa_ctx)(struct seq_file *m, struct npa_aq_enq_rsp *rsp);
815 	struct npa_aq_enq_req aq_req;
816 	struct npa_aq_enq_rsp rsp;
817 	struct rvu_pfvf *pfvf;
818 	int aura, rc, max_id;
819 	int npalf, id, all;
820 	struct rvu *rvu;
821 	u16 pcifunc;
822 
823 	rvu = m->private;
824 
825 	switch (ctype) {
826 	case NPA_AQ_CTYPE_AURA:
827 		npalf = rvu->rvu_dbg.npa_aura_ctx.lf;
828 		id = rvu->rvu_dbg.npa_aura_ctx.id;
829 		all = rvu->rvu_dbg.npa_aura_ctx.all;
830 		break;
831 
832 	case NPA_AQ_CTYPE_POOL:
833 		npalf = rvu->rvu_dbg.npa_pool_ctx.lf;
834 		id = rvu->rvu_dbg.npa_pool_ctx.id;
835 		all = rvu->rvu_dbg.npa_pool_ctx.all;
836 		break;
837 	default:
838 		return -EINVAL;
839 	}
840 
841 	if (!rvu_dbg_is_valid_lf(rvu, BLKADDR_NPA, npalf, &pcifunc))
842 		return -EINVAL;
843 
844 	pfvf = rvu_get_pfvf(rvu, pcifunc);
845 	if (ctype == NPA_AQ_CTYPE_AURA && !pfvf->aura_ctx) {
846 		seq_puts(m, "Aura context is not initialized\n");
847 		return -EINVAL;
848 	} else if (ctype == NPA_AQ_CTYPE_POOL && !pfvf->pool_ctx) {
849 		seq_puts(m, "Pool context is not initialized\n");
850 		return -EINVAL;
851 	}
852 
853 	memset(&aq_req, 0, sizeof(struct npa_aq_enq_req));
854 	aq_req.hdr.pcifunc = pcifunc;
855 	aq_req.ctype = ctype;
856 	aq_req.op = NPA_AQ_INSTOP_READ;
857 	if (ctype == NPA_AQ_CTYPE_AURA) {
858 		max_id = pfvf->aura_ctx->qsize;
859 		print_npa_ctx = print_npa_aura_ctx;
860 	} else {
861 		max_id = pfvf->pool_ctx->qsize;
862 		print_npa_ctx = print_npa_pool_ctx;
863 	}
864 
865 	if (id < 0 || id >= max_id) {
866 		seq_printf(m, "Invalid %s, valid range is 0-%d\n",
867 			   (ctype == NPA_AQ_CTYPE_AURA) ? "aura" : "pool",
868 			max_id - 1);
869 		return -EINVAL;
870 	}
871 
872 	if (all)
873 		id = 0;
874 	else
875 		max_id = id + 1;
876 
877 	for (aura = id; aura < max_id; aura++) {
878 		aq_req.aura_id = aura;
879 		seq_printf(m, "======%s : %d=======\n",
880 			   (ctype == NPA_AQ_CTYPE_AURA) ? "AURA" : "POOL",
881 			aq_req.aura_id);
882 		rc = rvu_npa_aq_enq_inst(rvu, &aq_req, &rsp);
883 		if (rc) {
884 			seq_puts(m, "Failed to read context\n");
885 			return -EINVAL;
886 		}
887 		print_npa_ctx(m, &rsp);
888 	}
889 	return 0;
890 }
891 
892 static int write_npa_ctx(struct rvu *rvu, bool all,
893 			 int npalf, int id, int ctype)
894 {
895 	struct rvu_pfvf *pfvf;
896 	int max_id = 0;
897 	u16 pcifunc;
898 
899 	if (!rvu_dbg_is_valid_lf(rvu, BLKADDR_NPA, npalf, &pcifunc))
900 		return -EINVAL;
901 
902 	pfvf = rvu_get_pfvf(rvu, pcifunc);
903 
904 	if (ctype == NPA_AQ_CTYPE_AURA) {
905 		if (!pfvf->aura_ctx) {
906 			dev_warn(rvu->dev, "Aura context is not initialized\n");
907 			return -EINVAL;
908 		}
909 		max_id = pfvf->aura_ctx->qsize;
910 	} else if (ctype == NPA_AQ_CTYPE_POOL) {
911 		if (!pfvf->pool_ctx) {
912 			dev_warn(rvu->dev, "Pool context is not initialized\n");
913 			return -EINVAL;
914 		}
915 		max_id = pfvf->pool_ctx->qsize;
916 	}
917 
918 	if (id < 0 || id >= max_id) {
919 		dev_warn(rvu->dev, "Invalid %s, valid range is 0-%d\n",
920 			 (ctype == NPA_AQ_CTYPE_AURA) ? "aura" : "pool",
921 			max_id - 1);
922 		return -EINVAL;
923 	}
924 
925 	switch (ctype) {
926 	case NPA_AQ_CTYPE_AURA:
927 		rvu->rvu_dbg.npa_aura_ctx.lf = npalf;
928 		rvu->rvu_dbg.npa_aura_ctx.id = id;
929 		rvu->rvu_dbg.npa_aura_ctx.all = all;
930 		break;
931 
932 	case NPA_AQ_CTYPE_POOL:
933 		rvu->rvu_dbg.npa_pool_ctx.lf = npalf;
934 		rvu->rvu_dbg.npa_pool_ctx.id = id;
935 		rvu->rvu_dbg.npa_pool_ctx.all = all;
936 		break;
937 	default:
938 		return -EINVAL;
939 	}
940 	return 0;
941 }
942 
943 static int parse_cmd_buffer_ctx(char *cmd_buf, size_t *count,
944 				const char __user *buffer, int *npalf,
945 				int *id, bool *all)
946 {
947 	int bytes_not_copied;
948 	char *cmd_buf_tmp;
949 	char *subtoken;
950 	int ret;
951 
952 	bytes_not_copied = copy_from_user(cmd_buf, buffer, *count);
953 	if (bytes_not_copied)
954 		return -EFAULT;
955 
956 	cmd_buf[*count] = '\0';
957 	cmd_buf_tmp = strchr(cmd_buf, '\n');
958 
959 	if (cmd_buf_tmp) {
960 		*cmd_buf_tmp = '\0';
961 		*count = cmd_buf_tmp - cmd_buf + 1;
962 	}
963 
964 	subtoken = strsep(&cmd_buf, " ");
965 	ret = subtoken ? kstrtoint(subtoken, 10, npalf) : -EINVAL;
966 	if (ret < 0)
967 		return ret;
968 	subtoken = strsep(&cmd_buf, " ");
969 	if (subtoken && strcmp(subtoken, "all") == 0) {
970 		*all = true;
971 	} else {
972 		ret = subtoken ? kstrtoint(subtoken, 10, id) : -EINVAL;
973 		if (ret < 0)
974 			return ret;
975 	}
976 	if (cmd_buf)
977 		return -EINVAL;
978 	return ret;
979 }
980 
981 static ssize_t rvu_dbg_npa_ctx_write(struct file *filp,
982 				     const char __user *buffer,
983 				     size_t count, loff_t *ppos, int ctype)
984 {
985 	char *cmd_buf, *ctype_string = (ctype == NPA_AQ_CTYPE_AURA) ?
986 					"aura" : "pool";
987 	struct seq_file *seqfp = filp->private_data;
988 	struct rvu *rvu = seqfp->private;
989 	int npalf, id = 0, ret;
990 	bool all = false;
991 
992 	if ((*ppos != 0) || !count)
993 		return -EINVAL;
994 
995 	cmd_buf = kzalloc(count + 1, GFP_KERNEL);
996 	if (!cmd_buf)
997 		return count;
998 	ret = parse_cmd_buffer_ctx(cmd_buf, &count, buffer,
999 				   &npalf, &id, &all);
1000 	if (ret < 0) {
1001 		dev_info(rvu->dev,
1002 			 "Usage: echo <npalf> [%s number/all] > %s_ctx\n",
1003 			 ctype_string, ctype_string);
1004 		goto done;
1005 	} else {
1006 		ret = write_npa_ctx(rvu, all, npalf, id, ctype);
1007 	}
1008 done:
1009 	kfree(cmd_buf);
1010 	return ret ? ret : count;
1011 }
1012 
1013 static ssize_t rvu_dbg_npa_aura_ctx_write(struct file *filp,
1014 					  const char __user *buffer,
1015 					  size_t count, loff_t *ppos)
1016 {
1017 	return rvu_dbg_npa_ctx_write(filp, buffer, count, ppos,
1018 				     NPA_AQ_CTYPE_AURA);
1019 }
1020 
1021 static int rvu_dbg_npa_aura_ctx_display(struct seq_file *filp, void *unused)
1022 {
1023 	return rvu_dbg_npa_ctx_display(filp, unused, NPA_AQ_CTYPE_AURA);
1024 }
1025 
1026 RVU_DEBUG_SEQ_FOPS(npa_aura_ctx, npa_aura_ctx_display, npa_aura_ctx_write);
1027 
1028 static ssize_t rvu_dbg_npa_pool_ctx_write(struct file *filp,
1029 					  const char __user *buffer,
1030 					  size_t count, loff_t *ppos)
1031 {
1032 	return rvu_dbg_npa_ctx_write(filp, buffer, count, ppos,
1033 				     NPA_AQ_CTYPE_POOL);
1034 }
1035 
1036 static int rvu_dbg_npa_pool_ctx_display(struct seq_file *filp, void *unused)
1037 {
1038 	return rvu_dbg_npa_ctx_display(filp, unused, NPA_AQ_CTYPE_POOL);
1039 }
1040 
1041 RVU_DEBUG_SEQ_FOPS(npa_pool_ctx, npa_pool_ctx_display, npa_pool_ctx_write);
1042 
1043 static void ndc_cache_stats(struct seq_file *s, int blk_addr,
1044 			    int ctype, int transaction)
1045 {
1046 	u64 req, out_req, lat, cant_alloc;
1047 	struct nix_hw *nix_hw;
1048 	struct rvu *rvu;
1049 	int port;
1050 
1051 	if (blk_addr == BLKADDR_NDC_NPA0) {
1052 		rvu = s->private;
1053 	} else {
1054 		nix_hw = s->private;
1055 		rvu = nix_hw->rvu;
1056 	}
1057 
1058 	for (port = 0; port < NDC_MAX_PORT; port++) {
1059 		req = rvu_read64(rvu, blk_addr, NDC_AF_PORTX_RTX_RWX_REQ_PC
1060 						(port, ctype, transaction));
1061 		lat = rvu_read64(rvu, blk_addr, NDC_AF_PORTX_RTX_RWX_LAT_PC
1062 						(port, ctype, transaction));
1063 		out_req = rvu_read64(rvu, blk_addr,
1064 				     NDC_AF_PORTX_RTX_RWX_OSTDN_PC
1065 				     (port, ctype, transaction));
1066 		cant_alloc = rvu_read64(rvu, blk_addr,
1067 					NDC_AF_PORTX_RTX_CANT_ALLOC_PC
1068 					(port, transaction));
1069 		seq_printf(s, "\nPort:%d\n", port);
1070 		seq_printf(s, "\tTotal Requests:\t\t%lld\n", req);
1071 		seq_printf(s, "\tTotal Time Taken:\t%lld cycles\n", lat);
1072 		seq_printf(s, "\tAvg Latency:\t\t%lld cycles\n", lat / req);
1073 		seq_printf(s, "\tOutstanding Requests:\t%lld\n", out_req);
1074 		seq_printf(s, "\tCant Alloc Requests:\t%lld\n", cant_alloc);
1075 	}
1076 }
1077 
1078 static int ndc_blk_cache_stats(struct seq_file *s, int idx, int blk_addr)
1079 {
1080 	seq_puts(s, "\n***** CACHE mode read stats *****\n");
1081 	ndc_cache_stats(s, blk_addr, CACHING, NDC_READ_TRANS);
1082 	seq_puts(s, "\n***** CACHE mode write stats *****\n");
1083 	ndc_cache_stats(s, blk_addr, CACHING, NDC_WRITE_TRANS);
1084 	seq_puts(s, "\n***** BY-PASS mode read stats *****\n");
1085 	ndc_cache_stats(s, blk_addr, BYPASS, NDC_READ_TRANS);
1086 	seq_puts(s, "\n***** BY-PASS mode write stats *****\n");
1087 	ndc_cache_stats(s, blk_addr, BYPASS, NDC_WRITE_TRANS);
1088 	return 0;
1089 }
1090 
1091 static int rvu_dbg_npa_ndc_cache_display(struct seq_file *filp, void *unused)
1092 {
1093 	return ndc_blk_cache_stats(filp, NPA0_U, BLKADDR_NDC_NPA0);
1094 }
1095 
1096 RVU_DEBUG_SEQ_FOPS(npa_ndc_cache, npa_ndc_cache_display, NULL);
1097 
1098 static int ndc_blk_hits_miss_stats(struct seq_file *s, int idx, int blk_addr)
1099 {
1100 	struct nix_hw *nix_hw;
1101 	struct rvu *rvu;
1102 	int bank, max_bank;
1103 
1104 	if (blk_addr == BLKADDR_NDC_NPA0) {
1105 		rvu = s->private;
1106 	} else {
1107 		nix_hw = s->private;
1108 		rvu = nix_hw->rvu;
1109 	}
1110 
1111 	max_bank = NDC_MAX_BANK(rvu, blk_addr);
1112 	for (bank = 0; bank < max_bank; bank++) {
1113 		seq_printf(s, "BANK:%d\n", bank);
1114 		seq_printf(s, "\tHits:\t%lld\n",
1115 			   (u64)rvu_read64(rvu, blk_addr,
1116 			   NDC_AF_BANKX_HIT_PC(bank)));
1117 		seq_printf(s, "\tMiss:\t%lld\n",
1118 			   (u64)rvu_read64(rvu, blk_addr,
1119 			    NDC_AF_BANKX_MISS_PC(bank)));
1120 	}
1121 	return 0;
1122 }
1123 
1124 static int rvu_dbg_nix_ndc_rx_cache_display(struct seq_file *filp, void *unused)
1125 {
1126 	struct nix_hw *nix_hw = filp->private;
1127 	int blkaddr = 0;
1128 	int ndc_idx = 0;
1129 
1130 	blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ?
1131 		   BLKADDR_NDC_NIX1_RX : BLKADDR_NDC_NIX0_RX);
1132 	ndc_idx = (nix_hw->blkaddr == BLKADDR_NIX1 ? NIX1_RX : NIX0_RX);
1133 
1134 	return ndc_blk_cache_stats(filp, ndc_idx, blkaddr);
1135 }
1136 
1137 RVU_DEBUG_SEQ_FOPS(nix_ndc_rx_cache, nix_ndc_rx_cache_display, NULL);
1138 
1139 static int rvu_dbg_nix_ndc_tx_cache_display(struct seq_file *filp, void *unused)
1140 {
1141 	struct nix_hw *nix_hw = filp->private;
1142 	int blkaddr = 0;
1143 	int ndc_idx = 0;
1144 
1145 	blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ?
1146 		   BLKADDR_NDC_NIX1_TX : BLKADDR_NDC_NIX0_TX);
1147 	ndc_idx = (nix_hw->blkaddr == BLKADDR_NIX1 ? NIX1_TX : NIX0_TX);
1148 
1149 	return ndc_blk_cache_stats(filp, ndc_idx, blkaddr);
1150 }
1151 
1152 RVU_DEBUG_SEQ_FOPS(nix_ndc_tx_cache, nix_ndc_tx_cache_display, NULL);
1153 
1154 static int rvu_dbg_npa_ndc_hits_miss_display(struct seq_file *filp,
1155 					     void *unused)
1156 {
1157 	return ndc_blk_hits_miss_stats(filp, NPA0_U, BLKADDR_NDC_NPA0);
1158 }
1159 
1160 RVU_DEBUG_SEQ_FOPS(npa_ndc_hits_miss, npa_ndc_hits_miss_display, NULL);
1161 
1162 static int rvu_dbg_nix_ndc_rx_hits_miss_display(struct seq_file *filp,
1163 						void *unused)
1164 {
1165 	struct nix_hw *nix_hw = filp->private;
1166 	int ndc_idx = NPA0_U;
1167 	int blkaddr = 0;
1168 
1169 	blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ?
1170 		   BLKADDR_NDC_NIX1_RX : BLKADDR_NDC_NIX0_RX);
1171 
1172 	return ndc_blk_hits_miss_stats(filp, ndc_idx, blkaddr);
1173 }
1174 
1175 RVU_DEBUG_SEQ_FOPS(nix_ndc_rx_hits_miss, nix_ndc_rx_hits_miss_display, NULL);
1176 
1177 static int rvu_dbg_nix_ndc_tx_hits_miss_display(struct seq_file *filp,
1178 						void *unused)
1179 {
1180 	struct nix_hw *nix_hw = filp->private;
1181 	int ndc_idx = NPA0_U;
1182 	int blkaddr = 0;
1183 
1184 	blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ?
1185 		   BLKADDR_NDC_NIX1_TX : BLKADDR_NDC_NIX0_TX);
1186 
1187 	return ndc_blk_hits_miss_stats(filp, ndc_idx, blkaddr);
1188 }
1189 
1190 RVU_DEBUG_SEQ_FOPS(nix_ndc_tx_hits_miss, nix_ndc_tx_hits_miss_display, NULL);
1191 
1192 static void print_nix_cn10k_sq_ctx(struct seq_file *m,
1193 				   struct nix_cn10k_sq_ctx_s *sq_ctx)
1194 {
1195 	seq_printf(m, "W0: ena \t\t\t%d\nW0: qint_idx \t\t\t%d\n",
1196 		   sq_ctx->ena, sq_ctx->qint_idx);
1197 	seq_printf(m, "W0: substream \t\t\t0x%03x\nW0: sdp_mcast \t\t\t%d\n",
1198 		   sq_ctx->substream, sq_ctx->sdp_mcast);
1199 	seq_printf(m, "W0: cq \t\t\t\t%d\nW0: sqe_way_mask \t\t%d\n\n",
1200 		   sq_ctx->cq, sq_ctx->sqe_way_mask);
1201 
1202 	seq_printf(m, "W1: smq \t\t\t%d\nW1: cq_ena \t\t\t%d\nW1: xoff\t\t\t%d\n",
1203 		   sq_ctx->smq, sq_ctx->cq_ena, sq_ctx->xoff);
1204 	seq_printf(m, "W1: sso_ena \t\t\t%d\nW1: smq_rr_weight\t\t%d\n",
1205 		   sq_ctx->sso_ena, sq_ctx->smq_rr_weight);
1206 	seq_printf(m, "W1: default_chan\t\t%d\nW1: sqb_count\t\t\t%d\n\n",
1207 		   sq_ctx->default_chan, sq_ctx->sqb_count);
1208 
1209 	seq_printf(m, "W2: smq_rr_count_lb \t\t%d\n", sq_ctx->smq_rr_count_lb);
1210 	seq_printf(m, "W2: smq_rr_count_ub \t\t%d\n", sq_ctx->smq_rr_count_ub);
1211 	seq_printf(m, "W2: sqb_aura \t\t\t%d\nW2: sq_int \t\t\t%d\n",
1212 		   sq_ctx->sqb_aura, sq_ctx->sq_int);
1213 	seq_printf(m, "W2: sq_int_ena \t\t\t%d\nW2: sqe_stype \t\t\t%d\n",
1214 		   sq_ctx->sq_int_ena, sq_ctx->sqe_stype);
1215 
1216 	seq_printf(m, "W3: max_sqe_size\t\t%d\nW3: cq_limit\t\t\t%d\n",
1217 		   sq_ctx->max_sqe_size, sq_ctx->cq_limit);
1218 	seq_printf(m, "W3: lmt_dis \t\t\t%d\nW3: mnq_dis \t\t\t%d\n",
1219 		   sq_ctx->mnq_dis, sq_ctx->lmt_dis);
1220 	seq_printf(m, "W3: smq_next_sq\t\t\t%d\nW3: smq_lso_segnum\t\t%d\n",
1221 		   sq_ctx->smq_next_sq, sq_ctx->smq_lso_segnum);
1222 	seq_printf(m, "W3: tail_offset \t\t%d\nW3: smenq_offset\t\t%d\n",
1223 		   sq_ctx->tail_offset, sq_ctx->smenq_offset);
1224 	seq_printf(m, "W3: head_offset\t\t\t%d\nW3: smenq_next_sqb_vld\t\t%d\n\n",
1225 		   sq_ctx->head_offset, sq_ctx->smenq_next_sqb_vld);
1226 
1227 	seq_printf(m, "W3: smq_next_sq_vld\t\t%d\nW3: smq_pend\t\t\t%d\n",
1228 		   sq_ctx->smq_next_sq_vld, sq_ctx->smq_pend);
1229 	seq_printf(m, "W4: next_sqb \t\t\t%llx\n\n", sq_ctx->next_sqb);
1230 	seq_printf(m, "W5: tail_sqb \t\t\t%llx\n\n", sq_ctx->tail_sqb);
1231 	seq_printf(m, "W6: smenq_sqb \t\t\t%llx\n\n", sq_ctx->smenq_sqb);
1232 	seq_printf(m, "W7: smenq_next_sqb \t\t%llx\n\n",
1233 		   sq_ctx->smenq_next_sqb);
1234 
1235 	seq_printf(m, "W8: head_sqb\t\t\t%llx\n\n", sq_ctx->head_sqb);
1236 
1237 	seq_printf(m, "W9: vfi_lso_total\t\t%d\n", sq_ctx->vfi_lso_total);
1238 	seq_printf(m, "W9: vfi_lso_sizem1\t\t%d\nW9: vfi_lso_sb\t\t\t%d\n",
1239 		   sq_ctx->vfi_lso_sizem1, sq_ctx->vfi_lso_sb);
1240 	seq_printf(m, "W9: vfi_lso_mps\t\t\t%d\nW9: vfi_lso_vlan0_ins_ena\t%d\n",
1241 		   sq_ctx->vfi_lso_mps, sq_ctx->vfi_lso_vlan0_ins_ena);
1242 	seq_printf(m, "W9: vfi_lso_vlan1_ins_ena\t%d\nW9: vfi_lso_vld \t\t%d\n\n",
1243 		   sq_ctx->vfi_lso_vld, sq_ctx->vfi_lso_vlan1_ins_ena);
1244 
1245 	seq_printf(m, "W10: scm_lso_rem \t\t%llu\n\n",
1246 		   (u64)sq_ctx->scm_lso_rem);
1247 	seq_printf(m, "W11: octs \t\t\t%llu\n\n", (u64)sq_ctx->octs);
1248 	seq_printf(m, "W12: pkts \t\t\t%llu\n\n", (u64)sq_ctx->pkts);
1249 	seq_printf(m, "W14: dropped_octs \t\t%llu\n\n",
1250 		   (u64)sq_ctx->dropped_octs);
1251 	seq_printf(m, "W15: dropped_pkts \t\t%llu\n\n",
1252 		   (u64)sq_ctx->dropped_pkts);
1253 }
1254 
1255 /* Dumps given nix_sq's context */
1256 static void print_nix_sq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1257 {
1258 	struct nix_sq_ctx_s *sq_ctx = &rsp->sq;
1259 	struct nix_hw *nix_hw = m->private;
1260 	struct rvu *rvu = nix_hw->rvu;
1261 
1262 	if (!is_rvu_otx2(rvu)) {
1263 		print_nix_cn10k_sq_ctx(m, (struct nix_cn10k_sq_ctx_s *)sq_ctx);
1264 		return;
1265 	}
1266 	seq_printf(m, "W0: sqe_way_mask \t\t%d\nW0: cq \t\t\t\t%d\n",
1267 		   sq_ctx->sqe_way_mask, sq_ctx->cq);
1268 	seq_printf(m, "W0: sdp_mcast \t\t\t%d\nW0: substream \t\t\t0x%03x\n",
1269 		   sq_ctx->sdp_mcast, sq_ctx->substream);
1270 	seq_printf(m, "W0: qint_idx \t\t\t%d\nW0: ena \t\t\t%d\n\n",
1271 		   sq_ctx->qint_idx, sq_ctx->ena);
1272 
1273 	seq_printf(m, "W1: sqb_count \t\t\t%d\nW1: default_chan \t\t%d\n",
1274 		   sq_ctx->sqb_count, sq_ctx->default_chan);
1275 	seq_printf(m, "W1: smq_rr_quantum \t\t%d\nW1: sso_ena \t\t\t%d\n",
1276 		   sq_ctx->smq_rr_quantum, sq_ctx->sso_ena);
1277 	seq_printf(m, "W1: xoff \t\t\t%d\nW1: cq_ena \t\t\t%d\nW1: smq\t\t\t\t%d\n\n",
1278 		   sq_ctx->xoff, sq_ctx->cq_ena, sq_ctx->smq);
1279 
1280 	seq_printf(m, "W2: sqe_stype \t\t\t%d\nW2: sq_int_ena \t\t\t%d\n",
1281 		   sq_ctx->sqe_stype, sq_ctx->sq_int_ena);
1282 	seq_printf(m, "W2: sq_int \t\t\t%d\nW2: sqb_aura \t\t\t%d\n",
1283 		   sq_ctx->sq_int, sq_ctx->sqb_aura);
1284 	seq_printf(m, "W2: smq_rr_count \t\t%d\n\n", sq_ctx->smq_rr_count);
1285 
1286 	seq_printf(m, "W3: smq_next_sq_vld\t\t%d\nW3: smq_pend\t\t\t%d\n",
1287 		   sq_ctx->smq_next_sq_vld, sq_ctx->smq_pend);
1288 	seq_printf(m, "W3: smenq_next_sqb_vld \t\t%d\nW3: head_offset\t\t\t%d\n",
1289 		   sq_ctx->smenq_next_sqb_vld, sq_ctx->head_offset);
1290 	seq_printf(m, "W3: smenq_offset\t\t%d\nW3: tail_offset\t\t\t%d\n",
1291 		   sq_ctx->smenq_offset, sq_ctx->tail_offset);
1292 	seq_printf(m, "W3: smq_lso_segnum \t\t%d\nW3: smq_next_sq\t\t\t%d\n",
1293 		   sq_ctx->smq_lso_segnum, sq_ctx->smq_next_sq);
1294 	seq_printf(m, "W3: mnq_dis \t\t\t%d\nW3: lmt_dis \t\t\t%d\n",
1295 		   sq_ctx->mnq_dis, sq_ctx->lmt_dis);
1296 	seq_printf(m, "W3: cq_limit\t\t\t%d\nW3: max_sqe_size\t\t%d\n\n",
1297 		   sq_ctx->cq_limit, sq_ctx->max_sqe_size);
1298 
1299 	seq_printf(m, "W4: next_sqb \t\t\t%llx\n\n", sq_ctx->next_sqb);
1300 	seq_printf(m, "W5: tail_sqb \t\t\t%llx\n\n", sq_ctx->tail_sqb);
1301 	seq_printf(m, "W6: smenq_sqb \t\t\t%llx\n\n", sq_ctx->smenq_sqb);
1302 	seq_printf(m, "W7: smenq_next_sqb \t\t%llx\n\n",
1303 		   sq_ctx->smenq_next_sqb);
1304 
1305 	seq_printf(m, "W8: head_sqb\t\t\t%llx\n\n", sq_ctx->head_sqb);
1306 
1307 	seq_printf(m, "W9: vfi_lso_vld\t\t\t%d\nW9: vfi_lso_vlan1_ins_ena\t%d\n",
1308 		   sq_ctx->vfi_lso_vld, sq_ctx->vfi_lso_vlan1_ins_ena);
1309 	seq_printf(m, "W9: vfi_lso_vlan0_ins_ena\t%d\nW9: vfi_lso_mps\t\t\t%d\n",
1310 		   sq_ctx->vfi_lso_vlan0_ins_ena, sq_ctx->vfi_lso_mps);
1311 	seq_printf(m, "W9: vfi_lso_sb\t\t\t%d\nW9: vfi_lso_sizem1\t\t%d\n",
1312 		   sq_ctx->vfi_lso_sb, sq_ctx->vfi_lso_sizem1);
1313 	seq_printf(m, "W9: vfi_lso_total\t\t%d\n\n", sq_ctx->vfi_lso_total);
1314 
1315 	seq_printf(m, "W10: scm_lso_rem \t\t%llu\n\n",
1316 		   (u64)sq_ctx->scm_lso_rem);
1317 	seq_printf(m, "W11: octs \t\t\t%llu\n\n", (u64)sq_ctx->octs);
1318 	seq_printf(m, "W12: pkts \t\t\t%llu\n\n", (u64)sq_ctx->pkts);
1319 	seq_printf(m, "W14: dropped_octs \t\t%llu\n\n",
1320 		   (u64)sq_ctx->dropped_octs);
1321 	seq_printf(m, "W15: dropped_pkts \t\t%llu\n\n",
1322 		   (u64)sq_ctx->dropped_pkts);
1323 }
1324 
1325 static void print_nix_cn10k_rq_ctx(struct seq_file *m,
1326 				   struct nix_cn10k_rq_ctx_s *rq_ctx)
1327 {
1328 	seq_printf(m, "W0: ena \t\t\t%d\nW0: sso_ena \t\t\t%d\n",
1329 		   rq_ctx->ena, rq_ctx->sso_ena);
1330 	seq_printf(m, "W0: ipsech_ena \t\t\t%d\nW0: ena_wqwd \t\t\t%d\n",
1331 		   rq_ctx->ipsech_ena, rq_ctx->ena_wqwd);
1332 	seq_printf(m, "W0: cq \t\t\t\t%d\nW0: lenerr_dis \t\t\t%d\n",
1333 		   rq_ctx->cq, rq_ctx->lenerr_dis);
1334 	seq_printf(m, "W0: csum_il4_dis \t\t%d\nW0: csum_ol4_dis \t\t%d\n",
1335 		   rq_ctx->csum_il4_dis, rq_ctx->csum_ol4_dis);
1336 	seq_printf(m, "W0: len_il4_dis \t\t%d\nW0: len_il3_dis \t\t%d\n",
1337 		   rq_ctx->len_il4_dis, rq_ctx->len_il3_dis);
1338 	seq_printf(m, "W0: len_ol4_dis \t\t%d\nW0: len_ol3_dis \t\t%d\n",
1339 		   rq_ctx->len_ol4_dis, rq_ctx->len_ol3_dis);
1340 	seq_printf(m, "W0: wqe_aura \t\t\t%d\n\n", rq_ctx->wqe_aura);
1341 
1342 	seq_printf(m, "W1: spb_aura \t\t\t%d\nW1: lpb_aura \t\t\t%d\n",
1343 		   rq_ctx->spb_aura, rq_ctx->lpb_aura);
1344 	seq_printf(m, "W1: spb_aura \t\t\t%d\n", rq_ctx->spb_aura);
1345 	seq_printf(m, "W1: sso_grp \t\t\t%d\nW1: sso_tt \t\t\t%d\n",
1346 		   rq_ctx->sso_grp, rq_ctx->sso_tt);
1347 	seq_printf(m, "W1: pb_caching \t\t\t%d\nW1: wqe_caching \t\t%d\n",
1348 		   rq_ctx->pb_caching, rq_ctx->wqe_caching);
1349 	seq_printf(m, "W1: xqe_drop_ena \t\t%d\nW1: spb_drop_ena \t\t%d\n",
1350 		   rq_ctx->xqe_drop_ena, rq_ctx->spb_drop_ena);
1351 	seq_printf(m, "W1: lpb_drop_ena \t\t%d\nW1: pb_stashing \t\t%d\n",
1352 		   rq_ctx->lpb_drop_ena, rq_ctx->pb_stashing);
1353 	seq_printf(m, "W1: ipsecd_drop_ena \t\t%d\nW1: chi_ena \t\t\t%d\n\n",
1354 		   rq_ctx->ipsecd_drop_ena, rq_ctx->chi_ena);
1355 
1356 	seq_printf(m, "W2: band_prof_id \t\t%d\n", rq_ctx->band_prof_id);
1357 	seq_printf(m, "W2: policer_ena \t\t%d\n", rq_ctx->policer_ena);
1358 	seq_printf(m, "W2: spb_sizem1 \t\t\t%d\n", rq_ctx->spb_sizem1);
1359 	seq_printf(m, "W2: wqe_skip \t\t\t%d\nW2: sqb_ena \t\t\t%d\n",
1360 		   rq_ctx->wqe_skip, rq_ctx->spb_ena);
1361 	seq_printf(m, "W2: lpb_size1 \t\t\t%d\nW2: first_skip \t\t\t%d\n",
1362 		   rq_ctx->lpb_sizem1, rq_ctx->first_skip);
1363 	seq_printf(m, "W2: later_skip\t\t\t%d\nW2: xqe_imm_size\t\t%d\n",
1364 		   rq_ctx->later_skip, rq_ctx->xqe_imm_size);
1365 	seq_printf(m, "W2: xqe_imm_copy \t\t%d\nW2: xqe_hdr_split \t\t%d\n\n",
1366 		   rq_ctx->xqe_imm_copy, rq_ctx->xqe_hdr_split);
1367 
1368 	seq_printf(m, "W3: xqe_drop \t\t\t%d\nW3: xqe_pass \t\t\t%d\n",
1369 		   rq_ctx->xqe_drop, rq_ctx->xqe_pass);
1370 	seq_printf(m, "W3: wqe_pool_drop \t\t%d\nW3: wqe_pool_pass \t\t%d\n",
1371 		   rq_ctx->wqe_pool_drop, rq_ctx->wqe_pool_pass);
1372 	seq_printf(m, "W3: spb_pool_drop \t\t%d\nW3: spb_pool_pass \t\t%d\n",
1373 		   rq_ctx->spb_pool_drop, rq_ctx->spb_pool_pass);
1374 	seq_printf(m, "W3: spb_aura_drop \t\t%d\nW3: spb_aura_pass \t\t%d\n\n",
1375 		   rq_ctx->spb_aura_pass, rq_ctx->spb_aura_drop);
1376 
1377 	seq_printf(m, "W4: lpb_aura_drop \t\t%d\nW3: lpb_aura_pass \t\t%d\n",
1378 		   rq_ctx->lpb_aura_pass, rq_ctx->lpb_aura_drop);
1379 	seq_printf(m, "W4: lpb_pool_drop \t\t%d\nW3: lpb_pool_pass \t\t%d\n",
1380 		   rq_ctx->lpb_pool_drop, rq_ctx->lpb_pool_pass);
1381 	seq_printf(m, "W4: rq_int \t\t\t%d\nW4: rq_int_ena\t\t\t%d\n",
1382 		   rq_ctx->rq_int, rq_ctx->rq_int_ena);
1383 	seq_printf(m, "W4: qint_idx \t\t\t%d\n\n", rq_ctx->qint_idx);
1384 
1385 	seq_printf(m, "W5: ltag \t\t\t%d\nW5: good_utag \t\t\t%d\n",
1386 		   rq_ctx->ltag, rq_ctx->good_utag);
1387 	seq_printf(m, "W5: bad_utag \t\t\t%d\nW5: flow_tagw \t\t\t%d\n",
1388 		   rq_ctx->bad_utag, rq_ctx->flow_tagw);
1389 	seq_printf(m, "W5: ipsec_vwqe \t\t\t%d\nW5: vwqe_ena \t\t\t%d\n",
1390 		   rq_ctx->ipsec_vwqe, rq_ctx->vwqe_ena);
1391 	seq_printf(m, "W5: vwqe_wait \t\t\t%d\nW5: max_vsize_exp\t\t%d\n",
1392 		   rq_ctx->vwqe_wait, rq_ctx->max_vsize_exp);
1393 	seq_printf(m, "W5: vwqe_skip \t\t\t%d\n\n", rq_ctx->vwqe_skip);
1394 
1395 	seq_printf(m, "W6: octs \t\t\t%llu\n\n", (u64)rq_ctx->octs);
1396 	seq_printf(m, "W7: pkts \t\t\t%llu\n\n", (u64)rq_ctx->pkts);
1397 	seq_printf(m, "W8: drop_octs \t\t\t%llu\n\n", (u64)rq_ctx->drop_octs);
1398 	seq_printf(m, "W9: drop_pkts \t\t\t%llu\n\n", (u64)rq_ctx->drop_pkts);
1399 	seq_printf(m, "W10: re_pkts \t\t\t%llu\n", (u64)rq_ctx->re_pkts);
1400 }
1401 
1402 /* Dumps given nix_rq's context */
1403 static void print_nix_rq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1404 {
1405 	struct nix_rq_ctx_s *rq_ctx = &rsp->rq;
1406 	struct nix_hw *nix_hw = m->private;
1407 	struct rvu *rvu = nix_hw->rvu;
1408 
1409 	if (!is_rvu_otx2(rvu)) {
1410 		print_nix_cn10k_rq_ctx(m, (struct nix_cn10k_rq_ctx_s *)rq_ctx);
1411 		return;
1412 	}
1413 
1414 	seq_printf(m, "W0: wqe_aura \t\t\t%d\nW0: substream \t\t\t0x%03x\n",
1415 		   rq_ctx->wqe_aura, rq_ctx->substream);
1416 	seq_printf(m, "W0: cq \t\t\t\t%d\nW0: ena_wqwd \t\t\t%d\n",
1417 		   rq_ctx->cq, rq_ctx->ena_wqwd);
1418 	seq_printf(m, "W0: ipsech_ena \t\t\t%d\nW0: sso_ena \t\t\t%d\n",
1419 		   rq_ctx->ipsech_ena, rq_ctx->sso_ena);
1420 	seq_printf(m, "W0: ena \t\t\t%d\n\n", rq_ctx->ena);
1421 
1422 	seq_printf(m, "W1: lpb_drop_ena \t\t%d\nW1: spb_drop_ena \t\t%d\n",
1423 		   rq_ctx->lpb_drop_ena, rq_ctx->spb_drop_ena);
1424 	seq_printf(m, "W1: xqe_drop_ena \t\t%d\nW1: wqe_caching \t\t%d\n",
1425 		   rq_ctx->xqe_drop_ena, rq_ctx->wqe_caching);
1426 	seq_printf(m, "W1: pb_caching \t\t\t%d\nW1: sso_tt \t\t\t%d\n",
1427 		   rq_ctx->pb_caching, rq_ctx->sso_tt);
1428 	seq_printf(m, "W1: sso_grp \t\t\t%d\nW1: lpb_aura \t\t\t%d\n",
1429 		   rq_ctx->sso_grp, rq_ctx->lpb_aura);
1430 	seq_printf(m, "W1: spb_aura \t\t\t%d\n\n", rq_ctx->spb_aura);
1431 
1432 	seq_printf(m, "W2: xqe_hdr_split \t\t%d\nW2: xqe_imm_copy \t\t%d\n",
1433 		   rq_ctx->xqe_hdr_split, rq_ctx->xqe_imm_copy);
1434 	seq_printf(m, "W2: xqe_imm_size \t\t%d\nW2: later_skip \t\t\t%d\n",
1435 		   rq_ctx->xqe_imm_size, rq_ctx->later_skip);
1436 	seq_printf(m, "W2: first_skip \t\t\t%d\nW2: lpb_sizem1 \t\t\t%d\n",
1437 		   rq_ctx->first_skip, rq_ctx->lpb_sizem1);
1438 	seq_printf(m, "W2: spb_ena \t\t\t%d\nW2: wqe_skip \t\t\t%d\n",
1439 		   rq_ctx->spb_ena, rq_ctx->wqe_skip);
1440 	seq_printf(m, "W2: spb_sizem1 \t\t\t%d\n\n", rq_ctx->spb_sizem1);
1441 
1442 	seq_printf(m, "W3: spb_pool_pass \t\t%d\nW3: spb_pool_drop \t\t%d\n",
1443 		   rq_ctx->spb_pool_pass, rq_ctx->spb_pool_drop);
1444 	seq_printf(m, "W3: spb_aura_pass \t\t%d\nW3: spb_aura_drop \t\t%d\n",
1445 		   rq_ctx->spb_aura_pass, rq_ctx->spb_aura_drop);
1446 	seq_printf(m, "W3: wqe_pool_pass \t\t%d\nW3: wqe_pool_drop \t\t%d\n",
1447 		   rq_ctx->wqe_pool_pass, rq_ctx->wqe_pool_drop);
1448 	seq_printf(m, "W3: xqe_pass \t\t\t%d\nW3: xqe_drop \t\t\t%d\n\n",
1449 		   rq_ctx->xqe_pass, rq_ctx->xqe_drop);
1450 
1451 	seq_printf(m, "W4: qint_idx \t\t\t%d\nW4: rq_int_ena \t\t\t%d\n",
1452 		   rq_ctx->qint_idx, rq_ctx->rq_int_ena);
1453 	seq_printf(m, "W4: rq_int \t\t\t%d\nW4: lpb_pool_pass \t\t%d\n",
1454 		   rq_ctx->rq_int, rq_ctx->lpb_pool_pass);
1455 	seq_printf(m, "W4: lpb_pool_drop \t\t%d\nW4: lpb_aura_pass \t\t%d\n",
1456 		   rq_ctx->lpb_pool_drop, rq_ctx->lpb_aura_pass);
1457 	seq_printf(m, "W4: lpb_aura_drop \t\t%d\n\n", rq_ctx->lpb_aura_drop);
1458 
1459 	seq_printf(m, "W5: flow_tagw \t\t\t%d\nW5: bad_utag \t\t\t%d\n",
1460 		   rq_ctx->flow_tagw, rq_ctx->bad_utag);
1461 	seq_printf(m, "W5: good_utag \t\t\t%d\nW5: ltag \t\t\t%d\n\n",
1462 		   rq_ctx->good_utag, rq_ctx->ltag);
1463 
1464 	seq_printf(m, "W6: octs \t\t\t%llu\n\n", (u64)rq_ctx->octs);
1465 	seq_printf(m, "W7: pkts \t\t\t%llu\n\n", (u64)rq_ctx->pkts);
1466 	seq_printf(m, "W8: drop_octs \t\t\t%llu\n\n", (u64)rq_ctx->drop_octs);
1467 	seq_printf(m, "W9: drop_pkts \t\t\t%llu\n\n", (u64)rq_ctx->drop_pkts);
1468 	seq_printf(m, "W10: re_pkts \t\t\t%llu\n", (u64)rq_ctx->re_pkts);
1469 }
1470 
1471 /* Dumps given nix_cq's context */
1472 static void print_nix_cq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1473 {
1474 	struct nix_cq_ctx_s *cq_ctx = &rsp->cq;
1475 
1476 	seq_printf(m, "W0: base \t\t\t%llx\n\n", cq_ctx->base);
1477 
1478 	seq_printf(m, "W1: wrptr \t\t\t%llx\n", (u64)cq_ctx->wrptr);
1479 	seq_printf(m, "W1: avg_con \t\t\t%d\nW1: cint_idx \t\t\t%d\n",
1480 		   cq_ctx->avg_con, cq_ctx->cint_idx);
1481 	seq_printf(m, "W1: cq_err \t\t\t%d\nW1: qint_idx \t\t\t%d\n",
1482 		   cq_ctx->cq_err, cq_ctx->qint_idx);
1483 	seq_printf(m, "W1: bpid \t\t\t%d\nW1: bp_ena \t\t\t%d\n\n",
1484 		   cq_ctx->bpid, cq_ctx->bp_ena);
1485 
1486 	seq_printf(m, "W2: update_time \t\t%d\nW2:avg_level \t\t\t%d\n",
1487 		   cq_ctx->update_time, cq_ctx->avg_level);
1488 	seq_printf(m, "W2: head \t\t\t%d\nW2:tail \t\t\t%d\n\n",
1489 		   cq_ctx->head, cq_ctx->tail);
1490 
1491 	seq_printf(m, "W3: cq_err_int_ena \t\t%d\nW3:cq_err_int \t\t\t%d\n",
1492 		   cq_ctx->cq_err_int_ena, cq_ctx->cq_err_int);
1493 	seq_printf(m, "W3: qsize \t\t\t%d\nW3:caching \t\t\t%d\n",
1494 		   cq_ctx->qsize, cq_ctx->caching);
1495 	seq_printf(m, "W3: substream \t\t\t0x%03x\nW3: ena \t\t\t%d\n",
1496 		   cq_ctx->substream, cq_ctx->ena);
1497 	seq_printf(m, "W3: drop_ena \t\t\t%d\nW3: drop \t\t\t%d\n",
1498 		   cq_ctx->drop_ena, cq_ctx->drop);
1499 	seq_printf(m, "W3: bp \t\t\t\t%d\n\n", cq_ctx->bp);
1500 }
1501 
1502 static int rvu_dbg_nix_queue_ctx_display(struct seq_file *filp,
1503 					 void *unused, int ctype)
1504 {
1505 	void (*print_nix_ctx)(struct seq_file *filp,
1506 			      struct nix_aq_enq_rsp *rsp) = NULL;
1507 	struct nix_hw *nix_hw = filp->private;
1508 	struct rvu *rvu = nix_hw->rvu;
1509 	struct nix_aq_enq_req aq_req;
1510 	struct nix_aq_enq_rsp rsp;
1511 	char *ctype_string = NULL;
1512 	int qidx, rc, max_id = 0;
1513 	struct rvu_pfvf *pfvf;
1514 	int nixlf, id, all;
1515 	u16 pcifunc;
1516 
1517 	switch (ctype) {
1518 	case NIX_AQ_CTYPE_CQ:
1519 		nixlf = rvu->rvu_dbg.nix_cq_ctx.lf;
1520 		id = rvu->rvu_dbg.nix_cq_ctx.id;
1521 		all = rvu->rvu_dbg.nix_cq_ctx.all;
1522 		break;
1523 
1524 	case NIX_AQ_CTYPE_SQ:
1525 		nixlf = rvu->rvu_dbg.nix_sq_ctx.lf;
1526 		id = rvu->rvu_dbg.nix_sq_ctx.id;
1527 		all = rvu->rvu_dbg.nix_sq_ctx.all;
1528 		break;
1529 
1530 	case NIX_AQ_CTYPE_RQ:
1531 		nixlf = rvu->rvu_dbg.nix_rq_ctx.lf;
1532 		id = rvu->rvu_dbg.nix_rq_ctx.id;
1533 		all = rvu->rvu_dbg.nix_rq_ctx.all;
1534 		break;
1535 
1536 	default:
1537 		return -EINVAL;
1538 	}
1539 
1540 	if (!rvu_dbg_is_valid_lf(rvu, nix_hw->blkaddr, nixlf, &pcifunc))
1541 		return -EINVAL;
1542 
1543 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1544 	if (ctype == NIX_AQ_CTYPE_SQ && !pfvf->sq_ctx) {
1545 		seq_puts(filp, "SQ context is not initialized\n");
1546 		return -EINVAL;
1547 	} else if (ctype == NIX_AQ_CTYPE_RQ && !pfvf->rq_ctx) {
1548 		seq_puts(filp, "RQ context is not initialized\n");
1549 		return -EINVAL;
1550 	} else if (ctype == NIX_AQ_CTYPE_CQ && !pfvf->cq_ctx) {
1551 		seq_puts(filp, "CQ context is not initialized\n");
1552 		return -EINVAL;
1553 	}
1554 
1555 	if (ctype == NIX_AQ_CTYPE_SQ) {
1556 		max_id = pfvf->sq_ctx->qsize;
1557 		ctype_string = "sq";
1558 		print_nix_ctx = print_nix_sq_ctx;
1559 	} else if (ctype == NIX_AQ_CTYPE_RQ) {
1560 		max_id = pfvf->rq_ctx->qsize;
1561 		ctype_string = "rq";
1562 		print_nix_ctx = print_nix_rq_ctx;
1563 	} else if (ctype == NIX_AQ_CTYPE_CQ) {
1564 		max_id = pfvf->cq_ctx->qsize;
1565 		ctype_string = "cq";
1566 		print_nix_ctx = print_nix_cq_ctx;
1567 	}
1568 
1569 	memset(&aq_req, 0, sizeof(struct nix_aq_enq_req));
1570 	aq_req.hdr.pcifunc = pcifunc;
1571 	aq_req.ctype = ctype;
1572 	aq_req.op = NIX_AQ_INSTOP_READ;
1573 	if (all)
1574 		id = 0;
1575 	else
1576 		max_id = id + 1;
1577 	for (qidx = id; qidx < max_id; qidx++) {
1578 		aq_req.qidx = qidx;
1579 		seq_printf(filp, "=====%s_ctx for nixlf:%d and qidx:%d is=====\n",
1580 			   ctype_string, nixlf, aq_req.qidx);
1581 		rc = rvu_mbox_handler_nix_aq_enq(rvu, &aq_req, &rsp);
1582 		if (rc) {
1583 			seq_puts(filp, "Failed to read the context\n");
1584 			return -EINVAL;
1585 		}
1586 		print_nix_ctx(filp, &rsp);
1587 	}
1588 	return 0;
1589 }
1590 
1591 static int write_nix_queue_ctx(struct rvu *rvu, bool all, int nixlf,
1592 			       int id, int ctype, char *ctype_string,
1593 			       struct seq_file *m)
1594 {
1595 	struct nix_hw *nix_hw = m->private;
1596 	struct rvu_pfvf *pfvf;
1597 	int max_id = 0;
1598 	u16 pcifunc;
1599 
1600 	if (!rvu_dbg_is_valid_lf(rvu, nix_hw->blkaddr, nixlf, &pcifunc))
1601 		return -EINVAL;
1602 
1603 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1604 
1605 	if (ctype == NIX_AQ_CTYPE_SQ) {
1606 		if (!pfvf->sq_ctx) {
1607 			dev_warn(rvu->dev, "SQ context is not initialized\n");
1608 			return -EINVAL;
1609 		}
1610 		max_id = pfvf->sq_ctx->qsize;
1611 	} else if (ctype == NIX_AQ_CTYPE_RQ) {
1612 		if (!pfvf->rq_ctx) {
1613 			dev_warn(rvu->dev, "RQ context is not initialized\n");
1614 			return -EINVAL;
1615 		}
1616 		max_id = pfvf->rq_ctx->qsize;
1617 	} else if (ctype == NIX_AQ_CTYPE_CQ) {
1618 		if (!pfvf->cq_ctx) {
1619 			dev_warn(rvu->dev, "CQ context is not initialized\n");
1620 			return -EINVAL;
1621 		}
1622 		max_id = pfvf->cq_ctx->qsize;
1623 	}
1624 
1625 	if (id < 0 || id >= max_id) {
1626 		dev_warn(rvu->dev, "Invalid %s_ctx valid range 0-%d\n",
1627 			 ctype_string, max_id - 1);
1628 		return -EINVAL;
1629 	}
1630 	switch (ctype) {
1631 	case NIX_AQ_CTYPE_CQ:
1632 		rvu->rvu_dbg.nix_cq_ctx.lf = nixlf;
1633 		rvu->rvu_dbg.nix_cq_ctx.id = id;
1634 		rvu->rvu_dbg.nix_cq_ctx.all = all;
1635 		break;
1636 
1637 	case NIX_AQ_CTYPE_SQ:
1638 		rvu->rvu_dbg.nix_sq_ctx.lf = nixlf;
1639 		rvu->rvu_dbg.nix_sq_ctx.id = id;
1640 		rvu->rvu_dbg.nix_sq_ctx.all = all;
1641 		break;
1642 
1643 	case NIX_AQ_CTYPE_RQ:
1644 		rvu->rvu_dbg.nix_rq_ctx.lf = nixlf;
1645 		rvu->rvu_dbg.nix_rq_ctx.id = id;
1646 		rvu->rvu_dbg.nix_rq_ctx.all = all;
1647 		break;
1648 	default:
1649 		return -EINVAL;
1650 	}
1651 	return 0;
1652 }
1653 
1654 static ssize_t rvu_dbg_nix_queue_ctx_write(struct file *filp,
1655 					   const char __user *buffer,
1656 					   size_t count, loff_t *ppos,
1657 					   int ctype)
1658 {
1659 	struct seq_file *m = filp->private_data;
1660 	struct nix_hw *nix_hw = m->private;
1661 	struct rvu *rvu = nix_hw->rvu;
1662 	char *cmd_buf, *ctype_string;
1663 	int nixlf, id = 0, ret;
1664 	bool all = false;
1665 
1666 	if ((*ppos != 0) || !count)
1667 		return -EINVAL;
1668 
1669 	switch (ctype) {
1670 	case NIX_AQ_CTYPE_SQ:
1671 		ctype_string = "sq";
1672 		break;
1673 	case NIX_AQ_CTYPE_RQ:
1674 		ctype_string = "rq";
1675 		break;
1676 	case NIX_AQ_CTYPE_CQ:
1677 		ctype_string = "cq";
1678 		break;
1679 	default:
1680 		return -EINVAL;
1681 	}
1682 
1683 	cmd_buf = kzalloc(count + 1, GFP_KERNEL);
1684 
1685 	if (!cmd_buf)
1686 		return count;
1687 
1688 	ret = parse_cmd_buffer_ctx(cmd_buf, &count, buffer,
1689 				   &nixlf, &id, &all);
1690 	if (ret < 0) {
1691 		dev_info(rvu->dev,
1692 			 "Usage: echo <nixlf> [%s number/all] > %s_ctx\n",
1693 			 ctype_string, ctype_string);
1694 		goto done;
1695 	} else {
1696 		ret = write_nix_queue_ctx(rvu, all, nixlf, id, ctype,
1697 					  ctype_string, m);
1698 	}
1699 done:
1700 	kfree(cmd_buf);
1701 	return ret ? ret : count;
1702 }
1703 
1704 static ssize_t rvu_dbg_nix_sq_ctx_write(struct file *filp,
1705 					const char __user *buffer,
1706 					size_t count, loff_t *ppos)
1707 {
1708 	return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
1709 					    NIX_AQ_CTYPE_SQ);
1710 }
1711 
1712 static int rvu_dbg_nix_sq_ctx_display(struct seq_file *filp, void *unused)
1713 {
1714 	return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_SQ);
1715 }
1716 
1717 RVU_DEBUG_SEQ_FOPS(nix_sq_ctx, nix_sq_ctx_display, nix_sq_ctx_write);
1718 
1719 static ssize_t rvu_dbg_nix_rq_ctx_write(struct file *filp,
1720 					const char __user *buffer,
1721 					size_t count, loff_t *ppos)
1722 {
1723 	return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
1724 					    NIX_AQ_CTYPE_RQ);
1725 }
1726 
1727 static int rvu_dbg_nix_rq_ctx_display(struct seq_file *filp, void  *unused)
1728 {
1729 	return rvu_dbg_nix_queue_ctx_display(filp, unused,  NIX_AQ_CTYPE_RQ);
1730 }
1731 
1732 RVU_DEBUG_SEQ_FOPS(nix_rq_ctx, nix_rq_ctx_display, nix_rq_ctx_write);
1733 
1734 static ssize_t rvu_dbg_nix_cq_ctx_write(struct file *filp,
1735 					const char __user *buffer,
1736 					size_t count, loff_t *ppos)
1737 {
1738 	return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
1739 					    NIX_AQ_CTYPE_CQ);
1740 }
1741 
1742 static int rvu_dbg_nix_cq_ctx_display(struct seq_file *filp, void *unused)
1743 {
1744 	return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_CQ);
1745 }
1746 
1747 RVU_DEBUG_SEQ_FOPS(nix_cq_ctx, nix_cq_ctx_display, nix_cq_ctx_write);
1748 
1749 static void print_nix_qctx_qsize(struct seq_file *filp, int qsize,
1750 				 unsigned long *bmap, char *qtype)
1751 {
1752 	char *buf;
1753 
1754 	buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
1755 	if (!buf)
1756 		return;
1757 
1758 	bitmap_print_to_pagebuf(false, buf, bmap, qsize);
1759 	seq_printf(filp, "%s context count : %d\n", qtype, qsize);
1760 	seq_printf(filp, "%s context ena/dis bitmap : %s\n",
1761 		   qtype, buf);
1762 	kfree(buf);
1763 }
1764 
1765 static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf)
1766 {
1767 	if (!pfvf->cq_ctx)
1768 		seq_puts(filp, "cq context is not initialized\n");
1769 	else
1770 		print_nix_qctx_qsize(filp, pfvf->cq_ctx->qsize, pfvf->cq_bmap,
1771 				     "cq");
1772 
1773 	if (!pfvf->rq_ctx)
1774 		seq_puts(filp, "rq context is not initialized\n");
1775 	else
1776 		print_nix_qctx_qsize(filp, pfvf->rq_ctx->qsize, pfvf->rq_bmap,
1777 				     "rq");
1778 
1779 	if (!pfvf->sq_ctx)
1780 		seq_puts(filp, "sq context is not initialized\n");
1781 	else
1782 		print_nix_qctx_qsize(filp, pfvf->sq_ctx->qsize, pfvf->sq_bmap,
1783 				     "sq");
1784 }
1785 
1786 static ssize_t rvu_dbg_nix_qsize_write(struct file *filp,
1787 				       const char __user *buffer,
1788 				       size_t count, loff_t *ppos)
1789 {
1790 	return rvu_dbg_qsize_write(filp, buffer, count, ppos,
1791 				   BLKTYPE_NIX);
1792 }
1793 
1794 static int rvu_dbg_nix_qsize_display(struct seq_file *filp, void *unused)
1795 {
1796 	return rvu_dbg_qsize_display(filp, unused, BLKTYPE_NIX);
1797 }
1798 
1799 RVU_DEBUG_SEQ_FOPS(nix_qsize, nix_qsize_display, nix_qsize_write);
1800 
1801 static void print_band_prof_ctx(struct seq_file *m,
1802 				struct nix_bandprof_s *prof)
1803 {
1804 	char *str;
1805 
1806 	switch (prof->pc_mode) {
1807 	case NIX_RX_PC_MODE_VLAN:
1808 		str = "VLAN";
1809 		break;
1810 	case NIX_RX_PC_MODE_DSCP:
1811 		str = "DSCP";
1812 		break;
1813 	case NIX_RX_PC_MODE_GEN:
1814 		str = "Generic";
1815 		break;
1816 	case NIX_RX_PC_MODE_RSVD:
1817 		str = "Reserved";
1818 		break;
1819 	}
1820 	seq_printf(m, "W0: pc_mode\t\t%s\n", str);
1821 	str = (prof->icolor == 3) ? "Color blind" :
1822 		(prof->icolor == 0) ? "Green" :
1823 		(prof->icolor == 1) ? "Yellow" : "Red";
1824 	seq_printf(m, "W0: icolor\t\t%s\n", str);
1825 	seq_printf(m, "W0: tnl_ena\t\t%d\n", prof->tnl_ena);
1826 	seq_printf(m, "W0: peir_exponent\t%d\n", prof->peir_exponent);
1827 	seq_printf(m, "W0: pebs_exponent\t%d\n", prof->pebs_exponent);
1828 	seq_printf(m, "W0: cir_exponent\t%d\n", prof->cir_exponent);
1829 	seq_printf(m, "W0: cbs_exponent\t%d\n", prof->cbs_exponent);
1830 	seq_printf(m, "W0: peir_mantissa\t%d\n", prof->peir_mantissa);
1831 	seq_printf(m, "W0: pebs_mantissa\t%d\n", prof->pebs_mantissa);
1832 	seq_printf(m, "W0: cir_mantissa\t%d\n", prof->cir_mantissa);
1833 
1834 	seq_printf(m, "W1: cbs_mantissa\t%d\n", prof->cbs_mantissa);
1835 	str = (prof->lmode == 0) ? "byte" : "packet";
1836 	seq_printf(m, "W1: lmode\t\t%s\n", str);
1837 	seq_printf(m, "W1: l_select\t\t%d\n", prof->l_sellect);
1838 	seq_printf(m, "W1: rdiv\t\t%d\n", prof->rdiv);
1839 	seq_printf(m, "W1: adjust_exponent\t%d\n", prof->adjust_exponent);
1840 	seq_printf(m, "W1: adjust_mantissa\t%d\n", prof->adjust_mantissa);
1841 	str = (prof->gc_action == 0) ? "PASS" :
1842 		(prof->gc_action == 1) ? "DROP" : "RED";
1843 	seq_printf(m, "W1: gc_action\t\t%s\n", str);
1844 	str = (prof->yc_action == 0) ? "PASS" :
1845 		(prof->yc_action == 1) ? "DROP" : "RED";
1846 	seq_printf(m, "W1: yc_action\t\t%s\n", str);
1847 	str = (prof->rc_action == 0) ? "PASS" :
1848 		(prof->rc_action == 1) ? "DROP" : "RED";
1849 	seq_printf(m, "W1: rc_action\t\t%s\n", str);
1850 	seq_printf(m, "W1: meter_algo\t\t%d\n", prof->meter_algo);
1851 	seq_printf(m, "W1: band_prof_id\t%d\n", prof->band_prof_id);
1852 	seq_printf(m, "W1: hl_en\t\t%d\n", prof->hl_en);
1853 
1854 	seq_printf(m, "W2: ts\t\t\t%lld\n", (u64)prof->ts);
1855 	seq_printf(m, "W3: pe_accum\t\t%d\n", prof->pe_accum);
1856 	seq_printf(m, "W3: c_accum\t\t%d\n", prof->c_accum);
1857 	seq_printf(m, "W4: green_pkt_pass\t%lld\n",
1858 		   (u64)prof->green_pkt_pass);
1859 	seq_printf(m, "W5: yellow_pkt_pass\t%lld\n",
1860 		   (u64)prof->yellow_pkt_pass);
1861 	seq_printf(m, "W6: red_pkt_pass\t%lld\n", (u64)prof->red_pkt_pass);
1862 	seq_printf(m, "W7: green_octs_pass\t%lld\n",
1863 		   (u64)prof->green_octs_pass);
1864 	seq_printf(m, "W8: yellow_octs_pass\t%lld\n",
1865 		   (u64)prof->yellow_octs_pass);
1866 	seq_printf(m, "W9: red_octs_pass\t%lld\n", (u64)prof->red_octs_pass);
1867 	seq_printf(m, "W10: green_pkt_drop\t%lld\n",
1868 		   (u64)prof->green_pkt_drop);
1869 	seq_printf(m, "W11: yellow_pkt_drop\t%lld\n",
1870 		   (u64)prof->yellow_pkt_drop);
1871 	seq_printf(m, "W12: red_pkt_drop\t%lld\n", (u64)prof->red_pkt_drop);
1872 	seq_printf(m, "W13: green_octs_drop\t%lld\n",
1873 		   (u64)prof->green_octs_drop);
1874 	seq_printf(m, "W14: yellow_octs_drop\t%lld\n",
1875 		   (u64)prof->yellow_octs_drop);
1876 	seq_printf(m, "W15: red_octs_drop\t%lld\n", (u64)prof->red_octs_drop);
1877 	seq_puts(m, "==============================\n");
1878 }
1879 
1880 static int rvu_dbg_nix_band_prof_ctx_display(struct seq_file *m, void *unused)
1881 {
1882 	struct nix_hw *nix_hw = m->private;
1883 	struct nix_cn10k_aq_enq_req aq_req;
1884 	struct nix_cn10k_aq_enq_rsp aq_rsp;
1885 	struct rvu *rvu = nix_hw->rvu;
1886 	struct nix_ipolicer *ipolicer;
1887 	int layer, prof_idx, idx, rc;
1888 	u16 pcifunc;
1889 	char *str;
1890 
1891 	/* Ingress policers do not exist on all platforms */
1892 	if (!nix_hw->ipolicer)
1893 		return 0;
1894 
1895 	for (layer = 0; layer < BAND_PROF_NUM_LAYERS; layer++) {
1896 		if (layer == BAND_PROF_INVAL_LAYER)
1897 			continue;
1898 		str = (layer == BAND_PROF_LEAF_LAYER) ? "Leaf" :
1899 			(layer == BAND_PROF_MID_LAYER) ? "Mid" : "Top";
1900 
1901 		seq_printf(m, "\n%s bandwidth profiles\n", str);
1902 		seq_puts(m, "=======================\n");
1903 
1904 		ipolicer = &nix_hw->ipolicer[layer];
1905 
1906 		for (idx = 0; idx < ipolicer->band_prof.max; idx++) {
1907 			if (is_rsrc_free(&ipolicer->band_prof, idx))
1908 				continue;
1909 
1910 			prof_idx = (idx & 0x3FFF) | (layer << 14);
1911 			rc = nix_aq_context_read(rvu, nix_hw, &aq_req, &aq_rsp,
1912 						 0x00, NIX_AQ_CTYPE_BANDPROF,
1913 						 prof_idx);
1914 			if (rc) {
1915 				dev_err(rvu->dev,
1916 					"%s: Failed to fetch context of %s profile %d, err %d\n",
1917 					__func__, str, idx, rc);
1918 				return 0;
1919 			}
1920 			seq_printf(m, "\n%s bandwidth profile:: %d\n", str, idx);
1921 			pcifunc = ipolicer->pfvf_map[idx];
1922 			if (!(pcifunc & RVU_PFVF_FUNC_MASK))
1923 				seq_printf(m, "Allocated to :: PF %d\n",
1924 					   rvu_get_pf(pcifunc));
1925 			else
1926 				seq_printf(m, "Allocated to :: PF %d VF %d\n",
1927 					   rvu_get_pf(pcifunc),
1928 					   (pcifunc & RVU_PFVF_FUNC_MASK) - 1);
1929 			print_band_prof_ctx(m, &aq_rsp.prof);
1930 		}
1931 	}
1932 	return 0;
1933 }
1934 
1935 RVU_DEBUG_SEQ_FOPS(nix_band_prof_ctx, nix_band_prof_ctx_display, NULL);
1936 
1937 static int rvu_dbg_nix_band_prof_rsrc_display(struct seq_file *m, void *unused)
1938 {
1939 	struct nix_hw *nix_hw = m->private;
1940 	struct nix_ipolicer *ipolicer;
1941 	int layer;
1942 	char *str;
1943 
1944 	/* Ingress policers do not exist on all platforms */
1945 	if (!nix_hw->ipolicer)
1946 		return 0;
1947 
1948 	seq_puts(m, "\nBandwidth profile resource free count\n");
1949 	seq_puts(m, "=====================================\n");
1950 	for (layer = 0; layer < BAND_PROF_NUM_LAYERS; layer++) {
1951 		if (layer == BAND_PROF_INVAL_LAYER)
1952 			continue;
1953 		str = (layer == BAND_PROF_LEAF_LAYER) ? "Leaf" :
1954 			(layer == BAND_PROF_MID_LAYER) ? "Mid " : "Top ";
1955 
1956 		ipolicer = &nix_hw->ipolicer[layer];
1957 		seq_printf(m, "%s :: Max: %4d  Free: %4d\n", str,
1958 			   ipolicer->band_prof.max,
1959 			   rvu_rsrc_free_count(&ipolicer->band_prof));
1960 	}
1961 	seq_puts(m, "=====================================\n");
1962 
1963 	return 0;
1964 }
1965 
1966 RVU_DEBUG_SEQ_FOPS(nix_band_prof_rsrc, nix_band_prof_rsrc_display, NULL);
1967 
1968 static void rvu_dbg_nix_init(struct rvu *rvu, int blkaddr)
1969 {
1970 	struct nix_hw *nix_hw;
1971 
1972 	if (!is_block_implemented(rvu->hw, blkaddr))
1973 		return;
1974 
1975 	if (blkaddr == BLKADDR_NIX0) {
1976 		rvu->rvu_dbg.nix = debugfs_create_dir("nix", rvu->rvu_dbg.root);
1977 		nix_hw = &rvu->hw->nix[0];
1978 	} else {
1979 		rvu->rvu_dbg.nix = debugfs_create_dir("nix1",
1980 						      rvu->rvu_dbg.root);
1981 		nix_hw = &rvu->hw->nix[1];
1982 	}
1983 
1984 	debugfs_create_file("sq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
1985 			    &rvu_dbg_nix_sq_ctx_fops);
1986 	debugfs_create_file("rq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
1987 			    &rvu_dbg_nix_rq_ctx_fops);
1988 	debugfs_create_file("cq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
1989 			    &rvu_dbg_nix_cq_ctx_fops);
1990 	debugfs_create_file("ndc_tx_cache", 0600, rvu->rvu_dbg.nix, nix_hw,
1991 			    &rvu_dbg_nix_ndc_tx_cache_fops);
1992 	debugfs_create_file("ndc_rx_cache", 0600, rvu->rvu_dbg.nix, nix_hw,
1993 			    &rvu_dbg_nix_ndc_rx_cache_fops);
1994 	debugfs_create_file("ndc_tx_hits_miss", 0600, rvu->rvu_dbg.nix, nix_hw,
1995 			    &rvu_dbg_nix_ndc_tx_hits_miss_fops);
1996 	debugfs_create_file("ndc_rx_hits_miss", 0600, rvu->rvu_dbg.nix, nix_hw,
1997 			    &rvu_dbg_nix_ndc_rx_hits_miss_fops);
1998 	debugfs_create_file("qsize", 0600, rvu->rvu_dbg.nix, rvu,
1999 			    &rvu_dbg_nix_qsize_fops);
2000 	debugfs_create_file("ingress_policer_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
2001 			    &rvu_dbg_nix_band_prof_ctx_fops);
2002 	debugfs_create_file("ingress_policer_rsrc", 0600, rvu->rvu_dbg.nix, nix_hw,
2003 			    &rvu_dbg_nix_band_prof_rsrc_fops);
2004 }
2005 
2006 static void rvu_dbg_npa_init(struct rvu *rvu)
2007 {
2008 	rvu->rvu_dbg.npa = debugfs_create_dir("npa", rvu->rvu_dbg.root);
2009 
2010 	debugfs_create_file("qsize", 0600, rvu->rvu_dbg.npa, rvu,
2011 			    &rvu_dbg_npa_qsize_fops);
2012 	debugfs_create_file("aura_ctx", 0600, rvu->rvu_dbg.npa, rvu,
2013 			    &rvu_dbg_npa_aura_ctx_fops);
2014 	debugfs_create_file("pool_ctx", 0600, rvu->rvu_dbg.npa, rvu,
2015 			    &rvu_dbg_npa_pool_ctx_fops);
2016 	debugfs_create_file("ndc_cache", 0600, rvu->rvu_dbg.npa, rvu,
2017 			    &rvu_dbg_npa_ndc_cache_fops);
2018 	debugfs_create_file("ndc_hits_miss", 0600, rvu->rvu_dbg.npa, rvu,
2019 			    &rvu_dbg_npa_ndc_hits_miss_fops);
2020 }
2021 
2022 #define PRINT_CGX_CUML_NIXRX_STATUS(idx, name)				\
2023 	({								\
2024 		u64 cnt;						\
2025 		err = rvu_cgx_nix_cuml_stats(rvu, cgxd, lmac_id, (idx),	\
2026 					     NIX_STATS_RX, &(cnt));	\
2027 		if (!err)						\
2028 			seq_printf(s, "%s: %llu\n", name, cnt);		\
2029 		cnt;							\
2030 	})
2031 
2032 #define PRINT_CGX_CUML_NIXTX_STATUS(idx, name)			\
2033 	({								\
2034 		u64 cnt;						\
2035 		err = rvu_cgx_nix_cuml_stats(rvu, cgxd, lmac_id, (idx),	\
2036 					  NIX_STATS_TX, &(cnt));	\
2037 		if (!err)						\
2038 			seq_printf(s, "%s: %llu\n", name, cnt);		\
2039 		cnt;							\
2040 	})
2041 
2042 static int cgx_print_stats(struct seq_file *s, int lmac_id)
2043 {
2044 	struct cgx_link_user_info linfo;
2045 	struct mac_ops *mac_ops;
2046 	void *cgxd = s->private;
2047 	u64 ucast, mcast, bcast;
2048 	int stat = 0, err = 0;
2049 	u64 tx_stat, rx_stat;
2050 	struct rvu *rvu;
2051 
2052 	rvu = pci_get_drvdata(pci_get_device(PCI_VENDOR_ID_CAVIUM,
2053 					     PCI_DEVID_OCTEONTX2_RVU_AF, NULL));
2054 	if (!rvu)
2055 		return -ENODEV;
2056 
2057 	mac_ops = get_mac_ops(cgxd);
2058 	/* There can be no CGX devices at all */
2059 	if (!mac_ops)
2060 		return 0;
2061 
2062 	/* Link status */
2063 	seq_puts(s, "\n=======Link Status======\n\n");
2064 	err = cgx_get_link_info(cgxd, lmac_id, &linfo);
2065 	if (err)
2066 		seq_puts(s, "Failed to read link status\n");
2067 	seq_printf(s, "\nLink is %s %d Mbps\n\n",
2068 		   linfo.link_up ? "UP" : "DOWN", linfo.speed);
2069 
2070 	/* Rx stats */
2071 	seq_printf(s, "\n=======NIX RX_STATS(%s port level)======\n\n",
2072 		   mac_ops->name);
2073 	ucast = PRINT_CGX_CUML_NIXRX_STATUS(RX_UCAST, "rx_ucast_frames");
2074 	if (err)
2075 		return err;
2076 	mcast = PRINT_CGX_CUML_NIXRX_STATUS(RX_MCAST, "rx_mcast_frames");
2077 	if (err)
2078 		return err;
2079 	bcast = PRINT_CGX_CUML_NIXRX_STATUS(RX_BCAST, "rx_bcast_frames");
2080 	if (err)
2081 		return err;
2082 	seq_printf(s, "rx_frames: %llu\n", ucast + mcast + bcast);
2083 	PRINT_CGX_CUML_NIXRX_STATUS(RX_OCTS, "rx_bytes");
2084 	if (err)
2085 		return err;
2086 	PRINT_CGX_CUML_NIXRX_STATUS(RX_DROP, "rx_drops");
2087 	if (err)
2088 		return err;
2089 	PRINT_CGX_CUML_NIXRX_STATUS(RX_ERR, "rx_errors");
2090 	if (err)
2091 		return err;
2092 
2093 	/* Tx stats */
2094 	seq_printf(s, "\n=======NIX TX_STATS(%s port level)======\n\n",
2095 		   mac_ops->name);
2096 	ucast = PRINT_CGX_CUML_NIXTX_STATUS(TX_UCAST, "tx_ucast_frames");
2097 	if (err)
2098 		return err;
2099 	mcast = PRINT_CGX_CUML_NIXTX_STATUS(TX_MCAST, "tx_mcast_frames");
2100 	if (err)
2101 		return err;
2102 	bcast = PRINT_CGX_CUML_NIXTX_STATUS(TX_BCAST, "tx_bcast_frames");
2103 	if (err)
2104 		return err;
2105 	seq_printf(s, "tx_frames: %llu\n", ucast + mcast + bcast);
2106 	PRINT_CGX_CUML_NIXTX_STATUS(TX_OCTS, "tx_bytes");
2107 	if (err)
2108 		return err;
2109 	PRINT_CGX_CUML_NIXTX_STATUS(TX_DROP, "tx_drops");
2110 	if (err)
2111 		return err;
2112 
2113 	/* Rx stats */
2114 	seq_printf(s, "\n=======%s RX_STATS======\n\n", mac_ops->name);
2115 	while (stat < mac_ops->rx_stats_cnt) {
2116 		err = mac_ops->mac_get_rx_stats(cgxd, lmac_id, stat, &rx_stat);
2117 		if (err)
2118 			return err;
2119 		if (is_rvu_otx2(rvu))
2120 			seq_printf(s, "%s: %llu\n", cgx_rx_stats_fields[stat],
2121 				   rx_stat);
2122 		else
2123 			seq_printf(s, "%s: %llu\n", rpm_rx_stats_fields[stat],
2124 				   rx_stat);
2125 		stat++;
2126 	}
2127 
2128 	/* Tx stats */
2129 	stat = 0;
2130 	seq_printf(s, "\n=======%s TX_STATS======\n\n", mac_ops->name);
2131 	while (stat < mac_ops->tx_stats_cnt) {
2132 		err = mac_ops->mac_get_tx_stats(cgxd, lmac_id, stat, &tx_stat);
2133 		if (err)
2134 			return err;
2135 
2136 		if (is_rvu_otx2(rvu))
2137 			seq_printf(s, "%s: %llu\n", cgx_tx_stats_fields[stat],
2138 				   tx_stat);
2139 		else
2140 			seq_printf(s, "%s: %llu\n", rpm_tx_stats_fields[stat],
2141 				   tx_stat);
2142 		stat++;
2143 	}
2144 
2145 	return err;
2146 }
2147 
2148 static int rvu_dbg_derive_lmacid(struct seq_file *filp, int *lmac_id)
2149 {
2150 	struct dentry *current_dir;
2151 	char *buf;
2152 
2153 	current_dir = filp->file->f_path.dentry->d_parent;
2154 	buf = strrchr(current_dir->d_name.name, 'c');
2155 	if (!buf)
2156 		return -EINVAL;
2157 
2158 	return kstrtoint(buf + 1, 10, lmac_id);
2159 }
2160 
2161 static int rvu_dbg_cgx_stat_display(struct seq_file *filp, void *unused)
2162 {
2163 	int lmac_id, err;
2164 
2165 	err = rvu_dbg_derive_lmacid(filp, &lmac_id);
2166 	if (!err)
2167 		return cgx_print_stats(filp, lmac_id);
2168 
2169 	return err;
2170 }
2171 
2172 RVU_DEBUG_SEQ_FOPS(cgx_stat, cgx_stat_display, NULL);
2173 
2174 static int cgx_print_dmac_flt(struct seq_file *s, int lmac_id)
2175 {
2176 	struct pci_dev *pdev = NULL;
2177 	void *cgxd = s->private;
2178 	char *bcast, *mcast;
2179 	u16 index, domain;
2180 	u8 dmac[ETH_ALEN];
2181 	struct rvu *rvu;
2182 	u64 cfg, mac;
2183 	int pf;
2184 
2185 	rvu = pci_get_drvdata(pci_get_device(PCI_VENDOR_ID_CAVIUM,
2186 					     PCI_DEVID_OCTEONTX2_RVU_AF, NULL));
2187 	if (!rvu)
2188 		return -ENODEV;
2189 
2190 	pf = cgxlmac_to_pf(rvu, cgx_get_cgxid(cgxd), lmac_id);
2191 	domain = 2;
2192 
2193 	pdev = pci_get_domain_bus_and_slot(domain, pf + 1, 0);
2194 	if (!pdev)
2195 		return 0;
2196 
2197 	cfg = cgx_read_dmac_ctrl(cgxd, lmac_id);
2198 	bcast = cfg & CGX_DMAC_BCAST_MODE ? "ACCEPT" : "REJECT";
2199 	mcast = cfg & CGX_DMAC_MCAST_MODE ? "ACCEPT" : "REJECT";
2200 
2201 	seq_puts(s,
2202 		 "PCI dev       RVUPF   BROADCAST  MULTICAST  FILTER-MODE\n");
2203 	seq_printf(s, "%s  PF%d  %9s  %9s",
2204 		   dev_name(&pdev->dev), pf, bcast, mcast);
2205 	if (cfg & CGX_DMAC_CAM_ACCEPT)
2206 		seq_printf(s, "%12s\n\n", "UNICAST");
2207 	else
2208 		seq_printf(s, "%16s\n\n", "PROMISCUOUS");
2209 
2210 	seq_puts(s, "\nDMAC-INDEX  ADDRESS\n");
2211 
2212 	for (index = 0 ; index < 32 ; index++) {
2213 		cfg = cgx_read_dmac_entry(cgxd, index);
2214 		/* Display enabled dmac entries associated with current lmac */
2215 		if (lmac_id == FIELD_GET(CGX_DMAC_CAM_ENTRY_LMACID, cfg) &&
2216 		    FIELD_GET(CGX_DMAC_CAM_ADDR_ENABLE, cfg)) {
2217 			mac = FIELD_GET(CGX_RX_DMAC_ADR_MASK, cfg);
2218 			u64_to_ether_addr(mac, dmac);
2219 			seq_printf(s, "%7d     %pM\n", index, dmac);
2220 		}
2221 	}
2222 
2223 	return 0;
2224 }
2225 
2226 static int rvu_dbg_cgx_dmac_flt_display(struct seq_file *filp, void *unused)
2227 {
2228 	int err, lmac_id;
2229 
2230 	err = rvu_dbg_derive_lmacid(filp, &lmac_id);
2231 	if (!err)
2232 		return cgx_print_dmac_flt(filp, lmac_id);
2233 
2234 	return err;
2235 }
2236 
2237 RVU_DEBUG_SEQ_FOPS(cgx_dmac_flt, cgx_dmac_flt_display, NULL);
2238 
2239 static void rvu_dbg_cgx_init(struct rvu *rvu)
2240 {
2241 	struct mac_ops *mac_ops;
2242 	unsigned long lmac_bmap;
2243 	int i, lmac_id;
2244 	char dname[20];
2245 	void *cgx;
2246 
2247 	if (!cgx_get_cgxcnt_max())
2248 		return;
2249 
2250 	mac_ops = get_mac_ops(rvu_first_cgx_pdata(rvu));
2251 	if (!mac_ops)
2252 		return;
2253 
2254 	rvu->rvu_dbg.cgx_root = debugfs_create_dir(mac_ops->name,
2255 						   rvu->rvu_dbg.root);
2256 
2257 	for (i = 0; i < cgx_get_cgxcnt_max(); i++) {
2258 		cgx = rvu_cgx_pdata(i, rvu);
2259 		if (!cgx)
2260 			continue;
2261 		lmac_bmap = cgx_get_lmac_bmap(cgx);
2262 		/* cgx debugfs dir */
2263 		sprintf(dname, "%s%d", mac_ops->name, i);
2264 		rvu->rvu_dbg.cgx = debugfs_create_dir(dname,
2265 						      rvu->rvu_dbg.cgx_root);
2266 
2267 		for_each_set_bit(lmac_id, &lmac_bmap, MAX_LMAC_PER_CGX) {
2268 			/* lmac debugfs dir */
2269 			sprintf(dname, "lmac%d", lmac_id);
2270 			rvu->rvu_dbg.lmac =
2271 				debugfs_create_dir(dname, rvu->rvu_dbg.cgx);
2272 
2273 			debugfs_create_file("stats", 0600, rvu->rvu_dbg.lmac,
2274 					    cgx, &rvu_dbg_cgx_stat_fops);
2275 			debugfs_create_file("mac_filter", 0600,
2276 					    rvu->rvu_dbg.lmac, cgx,
2277 					    &rvu_dbg_cgx_dmac_flt_fops);
2278 		}
2279 	}
2280 }
2281 
2282 /* NPC debugfs APIs */
2283 static void rvu_print_npc_mcam_info(struct seq_file *s,
2284 				    u16 pcifunc, int blkaddr)
2285 {
2286 	struct rvu *rvu = s->private;
2287 	int entry_acnt, entry_ecnt;
2288 	int cntr_acnt, cntr_ecnt;
2289 
2290 	rvu_npc_get_mcam_entry_alloc_info(rvu, pcifunc, blkaddr,
2291 					  &entry_acnt, &entry_ecnt);
2292 	rvu_npc_get_mcam_counter_alloc_info(rvu, pcifunc, blkaddr,
2293 					    &cntr_acnt, &cntr_ecnt);
2294 	if (!entry_acnt && !cntr_acnt)
2295 		return;
2296 
2297 	if (!(pcifunc & RVU_PFVF_FUNC_MASK))
2298 		seq_printf(s, "\n\t\t Device \t\t: PF%d\n",
2299 			   rvu_get_pf(pcifunc));
2300 	else
2301 		seq_printf(s, "\n\t\t Device \t\t: PF%d VF%d\n",
2302 			   rvu_get_pf(pcifunc),
2303 			   (pcifunc & RVU_PFVF_FUNC_MASK) - 1);
2304 
2305 	if (entry_acnt) {
2306 		seq_printf(s, "\t\t Entries allocated \t: %d\n", entry_acnt);
2307 		seq_printf(s, "\t\t Entries enabled \t: %d\n", entry_ecnt);
2308 	}
2309 	if (cntr_acnt) {
2310 		seq_printf(s, "\t\t Counters allocated \t: %d\n", cntr_acnt);
2311 		seq_printf(s, "\t\t Counters enabled \t: %d\n", cntr_ecnt);
2312 	}
2313 }
2314 
2315 static int rvu_dbg_npc_mcam_info_display(struct seq_file *filp, void *unsued)
2316 {
2317 	struct rvu *rvu = filp->private;
2318 	int pf, vf, numvfs, blkaddr;
2319 	struct npc_mcam *mcam;
2320 	u16 pcifunc, counters;
2321 	u64 cfg;
2322 
2323 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
2324 	if (blkaddr < 0)
2325 		return -ENODEV;
2326 
2327 	mcam = &rvu->hw->mcam;
2328 	counters = rvu->hw->npc_counters;
2329 
2330 	seq_puts(filp, "\nNPC MCAM info:\n");
2331 	/* MCAM keywidth on receive and transmit sides */
2332 	cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_RX));
2333 	cfg = (cfg >> 32) & 0x07;
2334 	seq_printf(filp, "\t\t RX keywidth \t: %s\n", (cfg == NPC_MCAM_KEY_X1) ?
2335 		   "112bits" : ((cfg == NPC_MCAM_KEY_X2) ?
2336 		   "224bits" : "448bits"));
2337 	cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_TX));
2338 	cfg = (cfg >> 32) & 0x07;
2339 	seq_printf(filp, "\t\t TX keywidth \t: %s\n", (cfg == NPC_MCAM_KEY_X1) ?
2340 		   "112bits" : ((cfg == NPC_MCAM_KEY_X2) ?
2341 		   "224bits" : "448bits"));
2342 
2343 	mutex_lock(&mcam->lock);
2344 	/* MCAM entries */
2345 	seq_printf(filp, "\n\t\t MCAM entries \t: %d\n", mcam->total_entries);
2346 	seq_printf(filp, "\t\t Reserved \t: %d\n",
2347 		   mcam->total_entries - mcam->bmap_entries);
2348 	seq_printf(filp, "\t\t Available \t: %d\n", mcam->bmap_fcnt);
2349 
2350 	/* MCAM counters */
2351 	seq_printf(filp, "\n\t\t MCAM counters \t: %d\n", counters);
2352 	seq_printf(filp, "\t\t Reserved \t: %d\n",
2353 		   counters - mcam->counters.max);
2354 	seq_printf(filp, "\t\t Available \t: %d\n",
2355 		   rvu_rsrc_free_count(&mcam->counters));
2356 
2357 	if (mcam->bmap_entries == mcam->bmap_fcnt) {
2358 		mutex_unlock(&mcam->lock);
2359 		return 0;
2360 	}
2361 
2362 	seq_puts(filp, "\n\t\t Current allocation\n");
2363 	seq_puts(filp, "\t\t====================\n");
2364 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
2365 		pcifunc = (pf << RVU_PFVF_PF_SHIFT);
2366 		rvu_print_npc_mcam_info(filp, pcifunc, blkaddr);
2367 
2368 		cfg = rvu_read64(rvu, BLKADDR_RVUM, RVU_PRIV_PFX_CFG(pf));
2369 		numvfs = (cfg >> 12) & 0xFF;
2370 		for (vf = 0; vf < numvfs; vf++) {
2371 			pcifunc = (pf << RVU_PFVF_PF_SHIFT) | (vf + 1);
2372 			rvu_print_npc_mcam_info(filp, pcifunc, blkaddr);
2373 		}
2374 	}
2375 
2376 	mutex_unlock(&mcam->lock);
2377 	return 0;
2378 }
2379 
2380 RVU_DEBUG_SEQ_FOPS(npc_mcam_info, npc_mcam_info_display, NULL);
2381 
2382 static int rvu_dbg_npc_rx_miss_stats_display(struct seq_file *filp,
2383 					     void *unused)
2384 {
2385 	struct rvu *rvu = filp->private;
2386 	struct npc_mcam *mcam;
2387 	int blkaddr;
2388 
2389 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
2390 	if (blkaddr < 0)
2391 		return -ENODEV;
2392 
2393 	mcam = &rvu->hw->mcam;
2394 
2395 	seq_puts(filp, "\nNPC MCAM RX miss action stats\n");
2396 	seq_printf(filp, "\t\tStat %d: \t%lld\n", mcam->rx_miss_act_cntr,
2397 		   rvu_read64(rvu, blkaddr,
2398 			      NPC_AF_MATCH_STATX(mcam->rx_miss_act_cntr)));
2399 
2400 	return 0;
2401 }
2402 
2403 RVU_DEBUG_SEQ_FOPS(npc_rx_miss_act, npc_rx_miss_stats_display, NULL);
2404 
2405 static void rvu_dbg_npc_mcam_show_flows(struct seq_file *s,
2406 					struct rvu_npc_mcam_rule *rule)
2407 {
2408 	u8 bit;
2409 
2410 	for_each_set_bit(bit, (unsigned long *)&rule->features, 64) {
2411 		seq_printf(s, "\t%s  ", npc_get_field_name(bit));
2412 		switch (bit) {
2413 		case NPC_DMAC:
2414 			seq_printf(s, "%pM ", rule->packet.dmac);
2415 			seq_printf(s, "mask %pM\n", rule->mask.dmac);
2416 			break;
2417 		case NPC_SMAC:
2418 			seq_printf(s, "%pM ", rule->packet.smac);
2419 			seq_printf(s, "mask %pM\n", rule->mask.smac);
2420 			break;
2421 		case NPC_ETYPE:
2422 			seq_printf(s, "0x%x ", ntohs(rule->packet.etype));
2423 			seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.etype));
2424 			break;
2425 		case NPC_OUTER_VID:
2426 			seq_printf(s, "0x%x ", ntohs(rule->packet.vlan_tci));
2427 			seq_printf(s, "mask 0x%x\n",
2428 				   ntohs(rule->mask.vlan_tci));
2429 			break;
2430 		case NPC_TOS:
2431 			seq_printf(s, "%d ", rule->packet.tos);
2432 			seq_printf(s, "mask 0x%x\n", rule->mask.tos);
2433 			break;
2434 		case NPC_SIP_IPV4:
2435 			seq_printf(s, "%pI4 ", &rule->packet.ip4src);
2436 			seq_printf(s, "mask %pI4\n", &rule->mask.ip4src);
2437 			break;
2438 		case NPC_DIP_IPV4:
2439 			seq_printf(s, "%pI4 ", &rule->packet.ip4dst);
2440 			seq_printf(s, "mask %pI4\n", &rule->mask.ip4dst);
2441 			break;
2442 		case NPC_SIP_IPV6:
2443 			seq_printf(s, "%pI6 ", rule->packet.ip6src);
2444 			seq_printf(s, "mask %pI6\n", rule->mask.ip6src);
2445 			break;
2446 		case NPC_DIP_IPV6:
2447 			seq_printf(s, "%pI6 ", rule->packet.ip6dst);
2448 			seq_printf(s, "mask %pI6\n", rule->mask.ip6dst);
2449 			break;
2450 		case NPC_SPORT_TCP:
2451 		case NPC_SPORT_UDP:
2452 		case NPC_SPORT_SCTP:
2453 			seq_printf(s, "%d ", ntohs(rule->packet.sport));
2454 			seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.sport));
2455 			break;
2456 		case NPC_DPORT_TCP:
2457 		case NPC_DPORT_UDP:
2458 		case NPC_DPORT_SCTP:
2459 			seq_printf(s, "%d ", ntohs(rule->packet.dport));
2460 			seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.dport));
2461 			break;
2462 		default:
2463 			seq_puts(s, "\n");
2464 			break;
2465 		}
2466 	}
2467 }
2468 
2469 static void rvu_dbg_npc_mcam_show_action(struct seq_file *s,
2470 					 struct rvu_npc_mcam_rule *rule)
2471 {
2472 	if (is_npc_intf_tx(rule->intf)) {
2473 		switch (rule->tx_action.op) {
2474 		case NIX_TX_ACTIONOP_DROP:
2475 			seq_puts(s, "\taction: Drop\n");
2476 			break;
2477 		case NIX_TX_ACTIONOP_UCAST_DEFAULT:
2478 			seq_puts(s, "\taction: Unicast to default channel\n");
2479 			break;
2480 		case NIX_TX_ACTIONOP_UCAST_CHAN:
2481 			seq_printf(s, "\taction: Unicast to channel %d\n",
2482 				   rule->tx_action.index);
2483 			break;
2484 		case NIX_TX_ACTIONOP_MCAST:
2485 			seq_puts(s, "\taction: Multicast\n");
2486 			break;
2487 		case NIX_TX_ACTIONOP_DROP_VIOL:
2488 			seq_puts(s, "\taction: Lockdown Violation Drop\n");
2489 			break;
2490 		default:
2491 			break;
2492 		}
2493 	} else {
2494 		switch (rule->rx_action.op) {
2495 		case NIX_RX_ACTIONOP_DROP:
2496 			seq_puts(s, "\taction: Drop\n");
2497 			break;
2498 		case NIX_RX_ACTIONOP_UCAST:
2499 			seq_printf(s, "\taction: Direct to queue %d\n",
2500 				   rule->rx_action.index);
2501 			break;
2502 		case NIX_RX_ACTIONOP_RSS:
2503 			seq_puts(s, "\taction: RSS\n");
2504 			break;
2505 		case NIX_RX_ACTIONOP_UCAST_IPSEC:
2506 			seq_puts(s, "\taction: Unicast ipsec\n");
2507 			break;
2508 		case NIX_RX_ACTIONOP_MCAST:
2509 			seq_puts(s, "\taction: Multicast\n");
2510 			break;
2511 		default:
2512 			break;
2513 		}
2514 	}
2515 }
2516 
2517 static const char *rvu_dbg_get_intf_name(int intf)
2518 {
2519 	switch (intf) {
2520 	case NIX_INTFX_RX(0):
2521 		return "NIX0_RX";
2522 	case NIX_INTFX_RX(1):
2523 		return "NIX1_RX";
2524 	case NIX_INTFX_TX(0):
2525 		return "NIX0_TX";
2526 	case NIX_INTFX_TX(1):
2527 		return "NIX1_TX";
2528 	default:
2529 		break;
2530 	}
2531 
2532 	return "unknown";
2533 }
2534 
2535 static int rvu_dbg_npc_mcam_show_rules(struct seq_file *s, void *unused)
2536 {
2537 	struct rvu_npc_mcam_rule *iter;
2538 	struct rvu *rvu = s->private;
2539 	struct npc_mcam *mcam;
2540 	int pf, vf = -1;
2541 	bool enabled;
2542 	int blkaddr;
2543 	u16 target;
2544 	u64 hits;
2545 
2546 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
2547 	if (blkaddr < 0)
2548 		return 0;
2549 
2550 	mcam = &rvu->hw->mcam;
2551 
2552 	mutex_lock(&mcam->lock);
2553 	list_for_each_entry(iter, &mcam->mcam_rules, list) {
2554 		pf = (iter->owner >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
2555 		seq_printf(s, "\n\tInstalled by: PF%d ", pf);
2556 
2557 		if (iter->owner & RVU_PFVF_FUNC_MASK) {
2558 			vf = (iter->owner & RVU_PFVF_FUNC_MASK) - 1;
2559 			seq_printf(s, "VF%d", vf);
2560 		}
2561 		seq_puts(s, "\n");
2562 
2563 		seq_printf(s, "\tdirection: %s\n", is_npc_intf_rx(iter->intf) ?
2564 						    "RX" : "TX");
2565 		seq_printf(s, "\tinterface: %s\n",
2566 			   rvu_dbg_get_intf_name(iter->intf));
2567 		seq_printf(s, "\tmcam entry: %d\n", iter->entry);
2568 
2569 		rvu_dbg_npc_mcam_show_flows(s, iter);
2570 		if (is_npc_intf_rx(iter->intf)) {
2571 			target = iter->rx_action.pf_func;
2572 			pf = (target >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
2573 			seq_printf(s, "\tForward to: PF%d ", pf);
2574 
2575 			if (target & RVU_PFVF_FUNC_MASK) {
2576 				vf = (target & RVU_PFVF_FUNC_MASK) - 1;
2577 				seq_printf(s, "VF%d", vf);
2578 			}
2579 			seq_puts(s, "\n");
2580 			seq_printf(s, "\tchannel: 0x%x\n", iter->chan);
2581 			seq_printf(s, "\tchannel_mask: 0x%x\n", iter->chan_mask);
2582 		}
2583 
2584 		rvu_dbg_npc_mcam_show_action(s, iter);
2585 
2586 		enabled = is_mcam_entry_enabled(rvu, mcam, blkaddr, iter->entry);
2587 		seq_printf(s, "\tenabled: %s\n", enabled ? "yes" : "no");
2588 
2589 		if (!iter->has_cntr)
2590 			continue;
2591 		seq_printf(s, "\tcounter: %d\n", iter->cntr);
2592 
2593 		hits = rvu_read64(rvu, blkaddr, NPC_AF_MATCH_STATX(iter->cntr));
2594 		seq_printf(s, "\thits: %lld\n", hits);
2595 	}
2596 	mutex_unlock(&mcam->lock);
2597 
2598 	return 0;
2599 }
2600 
2601 RVU_DEBUG_SEQ_FOPS(npc_mcam_rules, npc_mcam_show_rules, NULL);
2602 
2603 static void rvu_dbg_npc_init(struct rvu *rvu)
2604 {
2605 	rvu->rvu_dbg.npc = debugfs_create_dir("npc", rvu->rvu_dbg.root);
2606 
2607 	debugfs_create_file("mcam_info", 0444, rvu->rvu_dbg.npc, rvu,
2608 			    &rvu_dbg_npc_mcam_info_fops);
2609 	debugfs_create_file("mcam_rules", 0444, rvu->rvu_dbg.npc, rvu,
2610 			    &rvu_dbg_npc_mcam_rules_fops);
2611 	debugfs_create_file("rx_miss_act_stats", 0444, rvu->rvu_dbg.npc, rvu,
2612 			    &rvu_dbg_npc_rx_miss_act_fops);
2613 }
2614 
2615 static int cpt_eng_sts_display(struct seq_file *filp, u8 eng_type)
2616 {
2617 	struct cpt_ctx *ctx = filp->private;
2618 	u64 busy_sts = 0, free_sts = 0;
2619 	u32 e_min = 0, e_max = 0, e, i;
2620 	u16 max_ses, max_ies, max_aes;
2621 	struct rvu *rvu = ctx->rvu;
2622 	int blkaddr = ctx->blkaddr;
2623 	u64 reg;
2624 
2625 	reg = rvu_read64(rvu, blkaddr, CPT_AF_CONSTANTS1);
2626 	max_ses = reg & 0xffff;
2627 	max_ies = (reg >> 16) & 0xffff;
2628 	max_aes = (reg >> 32) & 0xffff;
2629 
2630 	switch (eng_type) {
2631 	case CPT_AE_TYPE:
2632 		e_min = max_ses + max_ies;
2633 		e_max = max_ses + max_ies + max_aes;
2634 		break;
2635 	case CPT_SE_TYPE:
2636 		e_min = 0;
2637 		e_max = max_ses;
2638 		break;
2639 	case CPT_IE_TYPE:
2640 		e_min = max_ses;
2641 		e_max = max_ses + max_ies;
2642 		break;
2643 	default:
2644 		return -EINVAL;
2645 	}
2646 
2647 	for (e = e_min, i = 0; e < e_max; e++, i++) {
2648 		reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_STS(e));
2649 		if (reg & 0x1)
2650 			busy_sts |= 1ULL << i;
2651 
2652 		if (reg & 0x2)
2653 			free_sts |= 1ULL << i;
2654 	}
2655 	seq_printf(filp, "FREE STS : 0x%016llx\n", free_sts);
2656 	seq_printf(filp, "BUSY STS : 0x%016llx\n", busy_sts);
2657 
2658 	return 0;
2659 }
2660 
2661 static int rvu_dbg_cpt_ae_sts_display(struct seq_file *filp, void *unused)
2662 {
2663 	return cpt_eng_sts_display(filp, CPT_AE_TYPE);
2664 }
2665 
2666 RVU_DEBUG_SEQ_FOPS(cpt_ae_sts, cpt_ae_sts_display, NULL);
2667 
2668 static int rvu_dbg_cpt_se_sts_display(struct seq_file *filp, void *unused)
2669 {
2670 	return cpt_eng_sts_display(filp, CPT_SE_TYPE);
2671 }
2672 
2673 RVU_DEBUG_SEQ_FOPS(cpt_se_sts, cpt_se_sts_display, NULL);
2674 
2675 static int rvu_dbg_cpt_ie_sts_display(struct seq_file *filp, void *unused)
2676 {
2677 	return cpt_eng_sts_display(filp, CPT_IE_TYPE);
2678 }
2679 
2680 RVU_DEBUG_SEQ_FOPS(cpt_ie_sts, cpt_ie_sts_display, NULL);
2681 
2682 static int rvu_dbg_cpt_engines_info_display(struct seq_file *filp, void *unused)
2683 {
2684 	struct cpt_ctx *ctx = filp->private;
2685 	u16 max_ses, max_ies, max_aes;
2686 	struct rvu *rvu = ctx->rvu;
2687 	int blkaddr = ctx->blkaddr;
2688 	u32 e_max, e;
2689 	u64 reg;
2690 
2691 	reg = rvu_read64(rvu, blkaddr, CPT_AF_CONSTANTS1);
2692 	max_ses = reg & 0xffff;
2693 	max_ies = (reg >> 16) & 0xffff;
2694 	max_aes = (reg >> 32) & 0xffff;
2695 
2696 	e_max = max_ses + max_ies + max_aes;
2697 
2698 	seq_puts(filp, "===========================================\n");
2699 	for (e = 0; e < e_max; e++) {
2700 		reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_CTL2(e));
2701 		seq_printf(filp, "CPT Engine[%u] Group Enable   0x%02llx\n", e,
2702 			   reg & 0xff);
2703 		reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_ACTIVE(e));
2704 		seq_printf(filp, "CPT Engine[%u] Active Info    0x%llx\n", e,
2705 			   reg);
2706 		reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_CTL(e));
2707 		seq_printf(filp, "CPT Engine[%u] Control        0x%llx\n", e,
2708 			   reg);
2709 		seq_puts(filp, "===========================================\n");
2710 	}
2711 	return 0;
2712 }
2713 
2714 RVU_DEBUG_SEQ_FOPS(cpt_engines_info, cpt_engines_info_display, NULL);
2715 
2716 static int rvu_dbg_cpt_lfs_info_display(struct seq_file *filp, void *unused)
2717 {
2718 	struct cpt_ctx *ctx = filp->private;
2719 	int blkaddr = ctx->blkaddr;
2720 	struct rvu *rvu = ctx->rvu;
2721 	struct rvu_block *block;
2722 	struct rvu_hwinfo *hw;
2723 	u64 reg;
2724 	u32 lf;
2725 
2726 	hw = rvu->hw;
2727 	block = &hw->block[blkaddr];
2728 	if (!block->lf.bmap)
2729 		return -ENODEV;
2730 
2731 	seq_puts(filp, "===========================================\n");
2732 	for (lf = 0; lf < block->lf.max; lf++) {
2733 		reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_CTL(lf));
2734 		seq_printf(filp, "CPT Lf[%u] CTL          0x%llx\n", lf, reg);
2735 		reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_CTL2(lf));
2736 		seq_printf(filp, "CPT Lf[%u] CTL2         0x%llx\n", lf, reg);
2737 		reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_PTR_CTL(lf));
2738 		seq_printf(filp, "CPT Lf[%u] PTR_CTL      0x%llx\n", lf, reg);
2739 		reg = rvu_read64(rvu, blkaddr, block->lfcfg_reg |
2740 				(lf << block->lfshift));
2741 		seq_printf(filp, "CPT Lf[%u] CFG          0x%llx\n", lf, reg);
2742 		seq_puts(filp, "===========================================\n");
2743 	}
2744 	return 0;
2745 }
2746 
2747 RVU_DEBUG_SEQ_FOPS(cpt_lfs_info, cpt_lfs_info_display, NULL);
2748 
2749 static int rvu_dbg_cpt_err_info_display(struct seq_file *filp, void *unused)
2750 {
2751 	struct cpt_ctx *ctx = filp->private;
2752 	struct rvu *rvu = ctx->rvu;
2753 	int blkaddr = ctx->blkaddr;
2754 	u64 reg0, reg1;
2755 
2756 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_FLTX_INT(0));
2757 	reg1 = rvu_read64(rvu, blkaddr, CPT_AF_FLTX_INT(1));
2758 	seq_printf(filp, "CPT_AF_FLTX_INT:       0x%llx 0x%llx\n", reg0, reg1);
2759 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_EXE(0));
2760 	reg1 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_EXE(1));
2761 	seq_printf(filp, "CPT_AF_PSNX_EXE:       0x%llx 0x%llx\n", reg0, reg1);
2762 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_LF(0));
2763 	seq_printf(filp, "CPT_AF_PSNX_LF:        0x%llx\n", reg0);
2764 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_RVU_INT);
2765 	seq_printf(filp, "CPT_AF_RVU_INT:        0x%llx\n", reg0);
2766 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_RAS_INT);
2767 	seq_printf(filp, "CPT_AF_RAS_INT:        0x%llx\n", reg0);
2768 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_EXE_ERR_INFO);
2769 	seq_printf(filp, "CPT_AF_EXE_ERR_INFO:   0x%llx\n", reg0);
2770 
2771 	return 0;
2772 }
2773 
2774 RVU_DEBUG_SEQ_FOPS(cpt_err_info, cpt_err_info_display, NULL);
2775 
2776 static int rvu_dbg_cpt_pc_display(struct seq_file *filp, void *unused)
2777 {
2778 	struct cpt_ctx *ctx = filp->private;
2779 	struct rvu *rvu = ctx->rvu;
2780 	int blkaddr = ctx->blkaddr;
2781 	u64 reg;
2782 
2783 	reg = rvu_read64(rvu, blkaddr, CPT_AF_INST_REQ_PC);
2784 	seq_printf(filp, "CPT instruction requests   %llu\n", reg);
2785 	reg = rvu_read64(rvu, blkaddr, CPT_AF_INST_LATENCY_PC);
2786 	seq_printf(filp, "CPT instruction latency    %llu\n", reg);
2787 	reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_REQ_PC);
2788 	seq_printf(filp, "CPT NCB read requests      %llu\n", reg);
2789 	reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_LATENCY_PC);
2790 	seq_printf(filp, "CPT NCB read latency       %llu\n", reg);
2791 	reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_UC_PC);
2792 	seq_printf(filp, "CPT read requests caused by UC fills   %llu\n", reg);
2793 	reg = rvu_read64(rvu, blkaddr, CPT_AF_ACTIVE_CYCLES_PC);
2794 	seq_printf(filp, "CPT active cycles pc       %llu\n", reg);
2795 	reg = rvu_read64(rvu, blkaddr, CPT_AF_CPTCLK_CNT);
2796 	seq_printf(filp, "CPT clock count pc         %llu\n", reg);
2797 
2798 	return 0;
2799 }
2800 
2801 RVU_DEBUG_SEQ_FOPS(cpt_pc, cpt_pc_display, NULL);
2802 
2803 static void rvu_dbg_cpt_init(struct rvu *rvu, int blkaddr)
2804 {
2805 	struct cpt_ctx *ctx;
2806 
2807 	if (!is_block_implemented(rvu->hw, blkaddr))
2808 		return;
2809 
2810 	if (blkaddr == BLKADDR_CPT0) {
2811 		rvu->rvu_dbg.cpt = debugfs_create_dir("cpt", rvu->rvu_dbg.root);
2812 		ctx = &rvu->rvu_dbg.cpt_ctx[0];
2813 		ctx->blkaddr = BLKADDR_CPT0;
2814 		ctx->rvu = rvu;
2815 	} else {
2816 		rvu->rvu_dbg.cpt = debugfs_create_dir("cpt1",
2817 						      rvu->rvu_dbg.root);
2818 		ctx = &rvu->rvu_dbg.cpt_ctx[1];
2819 		ctx->blkaddr = BLKADDR_CPT1;
2820 		ctx->rvu = rvu;
2821 	}
2822 
2823 	debugfs_create_file("cpt_pc", 0600, rvu->rvu_dbg.cpt, ctx,
2824 			    &rvu_dbg_cpt_pc_fops);
2825 	debugfs_create_file("cpt_ae_sts", 0600, rvu->rvu_dbg.cpt, ctx,
2826 			    &rvu_dbg_cpt_ae_sts_fops);
2827 	debugfs_create_file("cpt_se_sts", 0600, rvu->rvu_dbg.cpt, ctx,
2828 			    &rvu_dbg_cpt_se_sts_fops);
2829 	debugfs_create_file("cpt_ie_sts", 0600, rvu->rvu_dbg.cpt, ctx,
2830 			    &rvu_dbg_cpt_ie_sts_fops);
2831 	debugfs_create_file("cpt_engines_info", 0600, rvu->rvu_dbg.cpt, ctx,
2832 			    &rvu_dbg_cpt_engines_info_fops);
2833 	debugfs_create_file("cpt_lfs_info", 0600, rvu->rvu_dbg.cpt, ctx,
2834 			    &rvu_dbg_cpt_lfs_info_fops);
2835 	debugfs_create_file("cpt_err_info", 0600, rvu->rvu_dbg.cpt, ctx,
2836 			    &rvu_dbg_cpt_err_info_fops);
2837 }
2838 
2839 static const char *rvu_get_dbg_dir_name(struct rvu *rvu)
2840 {
2841 	if (!is_rvu_otx2(rvu))
2842 		return "cn10k";
2843 	else
2844 		return "octeontx2";
2845 }
2846 
2847 void rvu_dbg_init(struct rvu *rvu)
2848 {
2849 	rvu->rvu_dbg.root = debugfs_create_dir(rvu_get_dbg_dir_name(rvu), NULL);
2850 
2851 	debugfs_create_file("rsrc_alloc", 0444, rvu->rvu_dbg.root, rvu,
2852 			    &rvu_dbg_rsrc_status_fops);
2853 
2854 	if (!is_rvu_otx2(rvu))
2855 		debugfs_create_file("lmtst_map_table", 0444, rvu->rvu_dbg.root,
2856 				    rvu, &rvu_dbg_lmtst_map_table_fops);
2857 
2858 	if (!cgx_get_cgxcnt_max())
2859 		goto create;
2860 
2861 	if (is_rvu_otx2(rvu))
2862 		debugfs_create_file("rvu_pf_cgx_map", 0444, rvu->rvu_dbg.root,
2863 				    rvu, &rvu_dbg_rvu_pf_cgx_map_fops);
2864 	else
2865 		debugfs_create_file("rvu_pf_rpm_map", 0444, rvu->rvu_dbg.root,
2866 				    rvu, &rvu_dbg_rvu_pf_cgx_map_fops);
2867 
2868 create:
2869 	rvu_dbg_npa_init(rvu);
2870 	rvu_dbg_nix_init(rvu, BLKADDR_NIX0);
2871 
2872 	rvu_dbg_nix_init(rvu, BLKADDR_NIX1);
2873 	rvu_dbg_cgx_init(rvu);
2874 	rvu_dbg_npc_init(rvu);
2875 	rvu_dbg_cpt_init(rvu, BLKADDR_CPT0);
2876 	rvu_dbg_cpt_init(rvu, BLKADDR_CPT1);
2877 }
2878 
2879 void rvu_dbg_exit(struct rvu *rvu)
2880 {
2881 	debugfs_remove_recursive(rvu->rvu_dbg.root);
2882 }
2883 
2884 #endif /* CONFIG_DEBUG_FS */
2885