1
2
3
4
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
24enum {
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
47enum 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
57enum 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
73static 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
89static 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
110static 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
156static 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
193enum 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) \
206static 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} \
210static 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) \
220static 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
227static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf);
228
229#define LMT_MAPTBL_ENTRY_SIZE 16
230
231static 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
246 if (*ppos != 0)
247 return 0;
248
249 buf = kzalloc(buf_size, GFP_KERNEL);
250 if (!buf)
251 return -ENOSPC;
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
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
320RVU_DEBUG_FOPS(lmtst_map_table, lmtst_map_table_display, NULL);
321
322static 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
356static 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
390static 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
405 if (*ppos != 0)
406 return 0;
407
408 buf = kzalloc(buf_size, GFP_KERNEL);
409 if (!buf)
410 return -ENOSPC;
411
412
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
484out:
485 kfree(lfs);
486 kfree(buf);
487 if (bytes_not_copied)
488 return -EFAULT;
489
490 return *ppos;
491}
492
493RVU_DEBUG_FOPS(rsrc_status, rsrc_attach_status, NULL);
494
495static 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
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
541RVU_DEBUG_SEQ_FOPS(rvu_pf_cgx_map, rvu_pf_cgx_map_display, NULL);
542
543static 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
567static 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
596
597
598static 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
643static 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
696qsize_write_done:
697 kfree(cmd_buf_tmp);
698 return ret ? ret : count;
699}
700
701static 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
709static 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
714RVU_DEBUG_SEQ_FOPS(npa_qsize, npa_qsize_display, npa_qsize_write);
715
716
717static 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
765static 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
812static 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
892static 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
943static 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
981static 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 }
1008done:
1009 kfree(cmd_buf);
1010 return ret ? ret : count;
1011}
1012
1013static 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
1021static 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
1026RVU_DEBUG_SEQ_FOPS(npa_aura_ctx, npa_aura_ctx_display, npa_aura_ctx_write);
1027
1028static 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
1036static 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
1041RVU_DEBUG_SEQ_FOPS(npa_pool_ctx, npa_pool_ctx_display, npa_pool_ctx_write);
1042
1043static 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
1078static 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
1091static 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
1096RVU_DEBUG_SEQ_FOPS(npa_ndc_cache, npa_ndc_cache_display, NULL);
1097
1098static 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
1124static 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
1137RVU_DEBUG_SEQ_FOPS(nix_ndc_rx_cache, nix_ndc_rx_cache_display, NULL);
1138
1139static 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
1152RVU_DEBUG_SEQ_FOPS(nix_ndc_tx_cache, nix_ndc_tx_cache_display, NULL);
1153
1154static 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
1160RVU_DEBUG_SEQ_FOPS(npa_ndc_hits_miss, npa_ndc_hits_miss_display, NULL);
1161
1162static 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
1175RVU_DEBUG_SEQ_FOPS(nix_ndc_rx_hits_miss, nix_ndc_rx_hits_miss_display, NULL);
1176
1177static 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
1190RVU_DEBUG_SEQ_FOPS(nix_ndc_tx_hits_miss, nix_ndc_tx_hits_miss_display, NULL);
1191
1192static 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, "W4: next_sqb \t\t\t%llx\n\n", sq_ctx->next_sqb);
1228 seq_printf(m, "W5: tail_sqb \t\t\t%llx\n\n", sq_ctx->tail_sqb);
1229 seq_printf(m, "W6: smenq_sqb \t\t\t%llx\n\n", sq_ctx->smenq_sqb);
1230 seq_printf(m, "W7: smenq_next_sqb \t\t%llx\n\n",
1231 sq_ctx->smenq_next_sqb);
1232
1233 seq_printf(m, "W8: head_sqb\t\t\t%llx\n\n", sq_ctx->head_sqb);
1234
1235 seq_printf(m, "W9: vfi_lso_total\t\t%d\n", sq_ctx->vfi_lso_total);
1236 seq_printf(m, "W9: vfi_lso_sizem1\t\t%d\nW9: vfi_lso_sb\t\t\t%d\n",
1237 sq_ctx->vfi_lso_sizem1, sq_ctx->vfi_lso_sb);
1238 seq_printf(m, "W9: vfi_lso_mps\t\t\t%d\nW9: vfi_lso_vlan0_ins_ena\t%d\n",
1239 sq_ctx->vfi_lso_mps, sq_ctx->vfi_lso_vlan0_ins_ena);
1240 seq_printf(m, "W9: vfi_lso_vlan1_ins_ena\t%d\nW9: vfi_lso_vld \t\t%d\n\n",
1241 sq_ctx->vfi_lso_vld, sq_ctx->vfi_lso_vlan1_ins_ena);
1242
1243 seq_printf(m, "W10: scm_lso_rem \t\t%llu\n\n",
1244 (u64)sq_ctx->scm_lso_rem);
1245 seq_printf(m, "W11: octs \t\t\t%llu\n\n", (u64)sq_ctx->octs);
1246 seq_printf(m, "W12: pkts \t\t\t%llu\n\n", (u64)sq_ctx->pkts);
1247 seq_printf(m, "W14: dropped_octs \t\t%llu\n\n",
1248 (u64)sq_ctx->dropped_octs);
1249 seq_printf(m, "W15: dropped_pkts \t\t%llu\n\n",
1250 (u64)sq_ctx->dropped_pkts);
1251}
1252
1253
1254static void print_nix_sq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1255{
1256 struct nix_sq_ctx_s *sq_ctx = &rsp->sq;
1257 struct nix_hw *nix_hw = m->private;
1258 struct rvu *rvu = nix_hw->rvu;
1259
1260 if (!is_rvu_otx2(rvu)) {
1261 print_nix_cn10k_sq_ctx(m, (struct nix_cn10k_sq_ctx_s *)sq_ctx);
1262 return;
1263 }
1264 seq_printf(m, "W0: sqe_way_mask \t\t%d\nW0: cq \t\t\t\t%d\n",
1265 sq_ctx->sqe_way_mask, sq_ctx->cq);
1266 seq_printf(m, "W0: sdp_mcast \t\t\t%d\nW0: substream \t\t\t0x%03x\n",
1267 sq_ctx->sdp_mcast, sq_ctx->substream);
1268 seq_printf(m, "W0: qint_idx \t\t\t%d\nW0: ena \t\t\t%d\n\n",
1269 sq_ctx->qint_idx, sq_ctx->ena);
1270
1271 seq_printf(m, "W1: sqb_count \t\t\t%d\nW1: default_chan \t\t%d\n",
1272 sq_ctx->sqb_count, sq_ctx->default_chan);
1273 seq_printf(m, "W1: smq_rr_quantum \t\t%d\nW1: sso_ena \t\t\t%d\n",
1274 sq_ctx->smq_rr_quantum, sq_ctx->sso_ena);
1275 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",
1276 sq_ctx->xoff, sq_ctx->cq_ena, sq_ctx->smq);
1277
1278 seq_printf(m, "W2: sqe_stype \t\t\t%d\nW2: sq_int_ena \t\t\t%d\n",
1279 sq_ctx->sqe_stype, sq_ctx->sq_int_ena);
1280 seq_printf(m, "W2: sq_int \t\t\t%d\nW2: sqb_aura \t\t\t%d\n",
1281 sq_ctx->sq_int, sq_ctx->sqb_aura);
1282 seq_printf(m, "W2: smq_rr_count \t\t%d\n\n", sq_ctx->smq_rr_count);
1283
1284 seq_printf(m, "W3: smq_next_sq_vld\t\t%d\nW3: smq_pend\t\t\t%d\n",
1285 sq_ctx->smq_next_sq_vld, sq_ctx->smq_pend);
1286 seq_printf(m, "W3: smenq_next_sqb_vld \t\t%d\nW3: head_offset\t\t\t%d\n",
1287 sq_ctx->smenq_next_sqb_vld, sq_ctx->head_offset);
1288 seq_printf(m, "W3: smenq_offset\t\t%d\nW3: tail_offset\t\t\t%d\n",
1289 sq_ctx->smenq_offset, sq_ctx->tail_offset);
1290 seq_printf(m, "W3: smq_lso_segnum \t\t%d\nW3: smq_next_sq\t\t\t%d\n",
1291 sq_ctx->smq_lso_segnum, sq_ctx->smq_next_sq);
1292 seq_printf(m, "W3: mnq_dis \t\t\t%d\nW3: lmt_dis \t\t\t%d\n",
1293 sq_ctx->mnq_dis, sq_ctx->lmt_dis);
1294 seq_printf(m, "W3: cq_limit\t\t\t%d\nW3: max_sqe_size\t\t%d\n\n",
1295 sq_ctx->cq_limit, sq_ctx->max_sqe_size);
1296
1297 seq_printf(m, "W4: next_sqb \t\t\t%llx\n\n", sq_ctx->next_sqb);
1298 seq_printf(m, "W5: tail_sqb \t\t\t%llx\n\n", sq_ctx->tail_sqb);
1299 seq_printf(m, "W6: smenq_sqb \t\t\t%llx\n\n", sq_ctx->smenq_sqb);
1300 seq_printf(m, "W7: smenq_next_sqb \t\t%llx\n\n",
1301 sq_ctx->smenq_next_sqb);
1302
1303 seq_printf(m, "W8: head_sqb\t\t\t%llx\n\n", sq_ctx->head_sqb);
1304
1305 seq_printf(m, "W9: vfi_lso_vld\t\t\t%d\nW9: vfi_lso_vlan1_ins_ena\t%d\n",
1306 sq_ctx->vfi_lso_vld, sq_ctx->vfi_lso_vlan1_ins_ena);
1307 seq_printf(m, "W9: vfi_lso_vlan0_ins_ena\t%d\nW9: vfi_lso_mps\t\t\t%d\n",
1308 sq_ctx->vfi_lso_vlan0_ins_ena, sq_ctx->vfi_lso_mps);
1309 seq_printf(m, "W9: vfi_lso_sb\t\t\t%d\nW9: vfi_lso_sizem1\t\t%d\n",
1310 sq_ctx->vfi_lso_sb, sq_ctx->vfi_lso_sizem1);
1311 seq_printf(m, "W9: vfi_lso_total\t\t%d\n\n", sq_ctx->vfi_lso_total);
1312
1313 seq_printf(m, "W10: scm_lso_rem \t\t%llu\n\n",
1314 (u64)sq_ctx->scm_lso_rem);
1315 seq_printf(m, "W11: octs \t\t\t%llu\n\n", (u64)sq_ctx->octs);
1316 seq_printf(m, "W12: pkts \t\t\t%llu\n\n", (u64)sq_ctx->pkts);
1317 seq_printf(m, "W14: dropped_octs \t\t%llu\n\n",
1318 (u64)sq_ctx->dropped_octs);
1319 seq_printf(m, "W15: dropped_pkts \t\t%llu\n\n",
1320 (u64)sq_ctx->dropped_pkts);
1321}
1322
1323static void print_nix_cn10k_rq_ctx(struct seq_file *m,
1324 struct nix_cn10k_rq_ctx_s *rq_ctx)
1325{
1326 seq_printf(m, "W0: ena \t\t\t%d\nW0: sso_ena \t\t\t%d\n",
1327 rq_ctx->ena, rq_ctx->sso_ena);
1328 seq_printf(m, "W0: ipsech_ena \t\t\t%d\nW0: ena_wqwd \t\t\t%d\n",
1329 rq_ctx->ipsech_ena, rq_ctx->ena_wqwd);
1330 seq_printf(m, "W0: cq \t\t\t\t%d\nW0: lenerr_dis \t\t\t%d\n",
1331 rq_ctx->cq, rq_ctx->lenerr_dis);
1332 seq_printf(m, "W0: csum_il4_dis \t\t%d\nW0: csum_ol4_dis \t\t%d\n",
1333 rq_ctx->csum_il4_dis, rq_ctx->csum_ol4_dis);
1334 seq_printf(m, "W0: len_il4_dis \t\t%d\nW0: len_il3_dis \t\t%d\n",
1335 rq_ctx->len_il4_dis, rq_ctx->len_il3_dis);
1336 seq_printf(m, "W0: len_ol4_dis \t\t%d\nW0: len_ol3_dis \t\t%d\n",
1337 rq_ctx->len_ol4_dis, rq_ctx->len_ol3_dis);
1338 seq_printf(m, "W0: wqe_aura \t\t\t%d\n\n", rq_ctx->wqe_aura);
1339
1340 seq_printf(m, "W1: spb_aura \t\t\t%d\nW1: lpb_aura \t\t\t%d\n",
1341 rq_ctx->spb_aura, rq_ctx->lpb_aura);
1342 seq_printf(m, "W1: spb_aura \t\t\t%d\n", rq_ctx->spb_aura);
1343 seq_printf(m, "W1: sso_grp \t\t\t%d\nW1: sso_tt \t\t\t%d\n",
1344 rq_ctx->sso_grp, rq_ctx->sso_tt);
1345 seq_printf(m, "W1: pb_caching \t\t\t%d\nW1: wqe_caching \t\t%d\n",
1346 rq_ctx->pb_caching, rq_ctx->wqe_caching);
1347 seq_printf(m, "W1: xqe_drop_ena \t\t%d\nW1: spb_drop_ena \t\t%d\n",
1348 rq_ctx->xqe_drop_ena, rq_ctx->spb_drop_ena);
1349 seq_printf(m, "W1: lpb_drop_ena \t\t%d\nW1: pb_stashing \t\t%d\n",
1350 rq_ctx->lpb_drop_ena, rq_ctx->pb_stashing);
1351 seq_printf(m, "W1: ipsecd_drop_ena \t\t%d\nW1: chi_ena \t\t\t%d\n\n",
1352 rq_ctx->ipsecd_drop_ena, rq_ctx->chi_ena);
1353
1354 seq_printf(m, "W2: band_prof_id \t\t%d\n", rq_ctx->band_prof_id);
1355 seq_printf(m, "W2: policer_ena \t\t%d\n", rq_ctx->policer_ena);
1356 seq_printf(m, "W2: spb_sizem1 \t\t\t%d\n", rq_ctx->spb_sizem1);
1357 seq_printf(m, "W2: wqe_skip \t\t\t%d\nW2: sqb_ena \t\t\t%d\n",
1358 rq_ctx->wqe_skip, rq_ctx->spb_ena);
1359 seq_printf(m, "W2: lpb_size1 \t\t\t%d\nW2: first_skip \t\t\t%d\n",
1360 rq_ctx->lpb_sizem1, rq_ctx->first_skip);
1361 seq_printf(m, "W2: later_skip\t\t\t%d\nW2: xqe_imm_size\t\t%d\n",
1362 rq_ctx->later_skip, rq_ctx->xqe_imm_size);
1363 seq_printf(m, "W2: xqe_imm_copy \t\t%d\nW2: xqe_hdr_split \t\t%d\n\n",
1364 rq_ctx->xqe_imm_copy, rq_ctx->xqe_hdr_split);
1365
1366 seq_printf(m, "W3: xqe_drop \t\t\t%d\nW3: xqe_pass \t\t\t%d\n",
1367 rq_ctx->xqe_drop, rq_ctx->xqe_pass);
1368 seq_printf(m, "W3: wqe_pool_drop \t\t%d\nW3: wqe_pool_pass \t\t%d\n",
1369 rq_ctx->wqe_pool_drop, rq_ctx->wqe_pool_pass);
1370 seq_printf(m, "W3: spb_pool_drop \t\t%d\nW3: spb_pool_pass \t\t%d\n",
1371 rq_ctx->spb_pool_drop, rq_ctx->spb_pool_pass);
1372 seq_printf(m, "W3: spb_aura_drop \t\t%d\nW3: spb_aura_pass \t\t%d\n\n",
1373 rq_ctx->spb_aura_pass, rq_ctx->spb_aura_drop);
1374
1375 seq_printf(m, "W4: lpb_aura_drop \t\t%d\nW3: lpb_aura_pass \t\t%d\n",
1376 rq_ctx->lpb_aura_pass, rq_ctx->lpb_aura_drop);
1377 seq_printf(m, "W4: lpb_pool_drop \t\t%d\nW3: lpb_pool_pass \t\t%d\n",
1378 rq_ctx->lpb_pool_drop, rq_ctx->lpb_pool_pass);
1379 seq_printf(m, "W4: rq_int \t\t\t%d\nW4: rq_int_ena\t\t\t%d\n",
1380 rq_ctx->rq_int, rq_ctx->rq_int_ena);
1381 seq_printf(m, "W4: qint_idx \t\t\t%d\n\n", rq_ctx->qint_idx);
1382
1383 seq_printf(m, "W5: ltag \t\t\t%d\nW5: good_utag \t\t\t%d\n",
1384 rq_ctx->ltag, rq_ctx->good_utag);
1385 seq_printf(m, "W5: bad_utag \t\t\t%d\nW5: flow_tagw \t\t\t%d\n",
1386 rq_ctx->bad_utag, rq_ctx->flow_tagw);
1387 seq_printf(m, "W5: ipsec_vwqe \t\t\t%d\nW5: vwqe_ena \t\t\t%d\n",
1388 rq_ctx->ipsec_vwqe, rq_ctx->vwqe_ena);
1389 seq_printf(m, "W5: vwqe_wait \t\t\t%d\nW5: max_vsize_exp\t\t%d\n",
1390 rq_ctx->vwqe_wait, rq_ctx->max_vsize_exp);
1391 seq_printf(m, "W5: vwqe_skip \t\t\t%d\n\n", rq_ctx->vwqe_skip);
1392
1393 seq_printf(m, "W6: octs \t\t\t%llu\n\n", (u64)rq_ctx->octs);
1394 seq_printf(m, "W7: pkts \t\t\t%llu\n\n", (u64)rq_ctx->pkts);
1395 seq_printf(m, "W8: drop_octs \t\t\t%llu\n\n", (u64)rq_ctx->drop_octs);
1396 seq_printf(m, "W9: drop_pkts \t\t\t%llu\n\n", (u64)rq_ctx->drop_pkts);
1397 seq_printf(m, "W10: re_pkts \t\t\t%llu\n", (u64)rq_ctx->re_pkts);
1398}
1399
1400
1401static void print_nix_rq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1402{
1403 struct nix_rq_ctx_s *rq_ctx = &rsp->rq;
1404 struct nix_hw *nix_hw = m->private;
1405 struct rvu *rvu = nix_hw->rvu;
1406
1407 if (!is_rvu_otx2(rvu)) {
1408 print_nix_cn10k_rq_ctx(m, (struct nix_cn10k_rq_ctx_s *)rq_ctx);
1409 return;
1410 }
1411
1412 seq_printf(m, "W0: wqe_aura \t\t\t%d\nW0: substream \t\t\t0x%03x\n",
1413 rq_ctx->wqe_aura, rq_ctx->substream);
1414 seq_printf(m, "W0: cq \t\t\t\t%d\nW0: ena_wqwd \t\t\t%d\n",
1415 rq_ctx->cq, rq_ctx->ena_wqwd);
1416 seq_printf(m, "W0: ipsech_ena \t\t\t%d\nW0: sso_ena \t\t\t%d\n",
1417 rq_ctx->ipsech_ena, rq_ctx->sso_ena);
1418 seq_printf(m, "W0: ena \t\t\t%d\n\n", rq_ctx->ena);
1419
1420 seq_printf(m, "W1: lpb_drop_ena \t\t%d\nW1: spb_drop_ena \t\t%d\n",
1421 rq_ctx->lpb_drop_ena, rq_ctx->spb_drop_ena);
1422 seq_printf(m, "W1: xqe_drop_ena \t\t%d\nW1: wqe_caching \t\t%d\n",
1423 rq_ctx->xqe_drop_ena, rq_ctx->wqe_caching);
1424 seq_printf(m, "W1: pb_caching \t\t\t%d\nW1: sso_tt \t\t\t%d\n",
1425 rq_ctx->pb_caching, rq_ctx->sso_tt);
1426 seq_printf(m, "W1: sso_grp \t\t\t%d\nW1: lpb_aura \t\t\t%d\n",
1427 rq_ctx->sso_grp, rq_ctx->lpb_aura);
1428 seq_printf(m, "W1: spb_aura \t\t\t%d\n\n", rq_ctx->spb_aura);
1429
1430 seq_printf(m, "W2: xqe_hdr_split \t\t%d\nW2: xqe_imm_copy \t\t%d\n",
1431 rq_ctx->xqe_hdr_split, rq_ctx->xqe_imm_copy);
1432 seq_printf(m, "W2: xqe_imm_size \t\t%d\nW2: later_skip \t\t\t%d\n",
1433 rq_ctx->xqe_imm_size, rq_ctx->later_skip);
1434 seq_printf(m, "W2: first_skip \t\t\t%d\nW2: lpb_sizem1 \t\t\t%d\n",
1435 rq_ctx->first_skip, rq_ctx->lpb_sizem1);
1436 seq_printf(m, "W2: spb_ena \t\t\t%d\nW2: wqe_skip \t\t\t%d\n",
1437 rq_ctx->spb_ena, rq_ctx->wqe_skip);
1438 seq_printf(m, "W2: spb_sizem1 \t\t\t%d\n\n", rq_ctx->spb_sizem1);
1439
1440 seq_printf(m, "W3: spb_pool_pass \t\t%d\nW3: spb_pool_drop \t\t%d\n",
1441 rq_ctx->spb_pool_pass, rq_ctx->spb_pool_drop);
1442 seq_printf(m, "W3: spb_aura_pass \t\t%d\nW3: spb_aura_drop \t\t%d\n",
1443 rq_ctx->spb_aura_pass, rq_ctx->spb_aura_drop);
1444 seq_printf(m, "W3: wqe_pool_pass \t\t%d\nW3: wqe_pool_drop \t\t%d\n",
1445 rq_ctx->wqe_pool_pass, rq_ctx->wqe_pool_drop);
1446 seq_printf(m, "W3: xqe_pass \t\t\t%d\nW3: xqe_drop \t\t\t%d\n\n",
1447 rq_ctx->xqe_pass, rq_ctx->xqe_drop);
1448
1449 seq_printf(m, "W4: qint_idx \t\t\t%d\nW4: rq_int_ena \t\t\t%d\n",
1450 rq_ctx->qint_idx, rq_ctx->rq_int_ena);
1451 seq_printf(m, "W4: rq_int \t\t\t%d\nW4: lpb_pool_pass \t\t%d\n",
1452 rq_ctx->rq_int, rq_ctx->lpb_pool_pass);
1453 seq_printf(m, "W4: lpb_pool_drop \t\t%d\nW4: lpb_aura_pass \t\t%d\n",
1454 rq_ctx->lpb_pool_drop, rq_ctx->lpb_aura_pass);
1455 seq_printf(m, "W4: lpb_aura_drop \t\t%d\n\n", rq_ctx->lpb_aura_drop);
1456
1457 seq_printf(m, "W5: flow_tagw \t\t\t%d\nW5: bad_utag \t\t\t%d\n",
1458 rq_ctx->flow_tagw, rq_ctx->bad_utag);
1459 seq_printf(m, "W5: good_utag \t\t\t%d\nW5: ltag \t\t\t%d\n\n",
1460 rq_ctx->good_utag, rq_ctx->ltag);
1461
1462 seq_printf(m, "W6: octs \t\t\t%llu\n\n", (u64)rq_ctx->octs);
1463 seq_printf(m, "W7: pkts \t\t\t%llu\n\n", (u64)rq_ctx->pkts);
1464 seq_printf(m, "W8: drop_octs \t\t\t%llu\n\n", (u64)rq_ctx->drop_octs);
1465 seq_printf(m, "W9: drop_pkts \t\t\t%llu\n\n", (u64)rq_ctx->drop_pkts);
1466 seq_printf(m, "W10: re_pkts \t\t\t%llu\n", (u64)rq_ctx->re_pkts);
1467}
1468
1469
1470static void print_nix_cq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1471{
1472 struct nix_cq_ctx_s *cq_ctx = &rsp->cq;
1473
1474 seq_printf(m, "W0: base \t\t\t%llx\n\n", cq_ctx->base);
1475
1476 seq_printf(m, "W1: wrptr \t\t\t%llx\n", (u64)cq_ctx->wrptr);
1477 seq_printf(m, "W1: avg_con \t\t\t%d\nW1: cint_idx \t\t\t%d\n",
1478 cq_ctx->avg_con, cq_ctx->cint_idx);
1479 seq_printf(m, "W1: cq_err \t\t\t%d\nW1: qint_idx \t\t\t%d\n",
1480 cq_ctx->cq_err, cq_ctx->qint_idx);
1481 seq_printf(m, "W1: bpid \t\t\t%d\nW1: bp_ena \t\t\t%d\n\n",
1482 cq_ctx->bpid, cq_ctx->bp_ena);
1483
1484 seq_printf(m, "W2: update_time \t\t%d\nW2:avg_level \t\t\t%d\n",
1485 cq_ctx->update_time, cq_ctx->avg_level);
1486 seq_printf(m, "W2: head \t\t\t%d\nW2:tail \t\t\t%d\n\n",
1487 cq_ctx->head, cq_ctx->tail);
1488
1489 seq_printf(m, "W3: cq_err_int_ena \t\t%d\nW3:cq_err_int \t\t\t%d\n",
1490 cq_ctx->cq_err_int_ena, cq_ctx->cq_err_int);
1491 seq_printf(m, "W3: qsize \t\t\t%d\nW3:caching \t\t\t%d\n",
1492 cq_ctx->qsize, cq_ctx->caching);
1493 seq_printf(m, "W3: substream \t\t\t0x%03x\nW3: ena \t\t\t%d\n",
1494 cq_ctx->substream, cq_ctx->ena);
1495 seq_printf(m, "W3: drop_ena \t\t\t%d\nW3: drop \t\t\t%d\n",
1496 cq_ctx->drop_ena, cq_ctx->drop);
1497 seq_printf(m, "W3: bp \t\t\t\t%d\n\n", cq_ctx->bp);
1498}
1499
1500static int rvu_dbg_nix_queue_ctx_display(struct seq_file *filp,
1501 void *unused, int ctype)
1502{
1503 void (*print_nix_ctx)(struct seq_file *filp,
1504 struct nix_aq_enq_rsp *rsp) = NULL;
1505 struct nix_hw *nix_hw = filp->private;
1506 struct rvu *rvu = nix_hw->rvu;
1507 struct nix_aq_enq_req aq_req;
1508 struct nix_aq_enq_rsp rsp;
1509 char *ctype_string = NULL;
1510 int qidx, rc, max_id = 0;
1511 struct rvu_pfvf *pfvf;
1512 int nixlf, id, all;
1513 u16 pcifunc;
1514
1515 switch (ctype) {
1516 case NIX_AQ_CTYPE_CQ:
1517 nixlf = rvu->rvu_dbg.nix_cq_ctx.lf;
1518 id = rvu->rvu_dbg.nix_cq_ctx.id;
1519 all = rvu->rvu_dbg.nix_cq_ctx.all;
1520 break;
1521
1522 case NIX_AQ_CTYPE_SQ:
1523 nixlf = rvu->rvu_dbg.nix_sq_ctx.lf;
1524 id = rvu->rvu_dbg.nix_sq_ctx.id;
1525 all = rvu->rvu_dbg.nix_sq_ctx.all;
1526 break;
1527
1528 case NIX_AQ_CTYPE_RQ:
1529 nixlf = rvu->rvu_dbg.nix_rq_ctx.lf;
1530 id = rvu->rvu_dbg.nix_rq_ctx.id;
1531 all = rvu->rvu_dbg.nix_rq_ctx.all;
1532 break;
1533
1534 default:
1535 return -EINVAL;
1536 }
1537
1538 if (!rvu_dbg_is_valid_lf(rvu, nix_hw->blkaddr, nixlf, &pcifunc))
1539 return -EINVAL;
1540
1541 pfvf = rvu_get_pfvf(rvu, pcifunc);
1542 if (ctype == NIX_AQ_CTYPE_SQ && !pfvf->sq_ctx) {
1543 seq_puts(filp, "SQ context is not initialized\n");
1544 return -EINVAL;
1545 } else if (ctype == NIX_AQ_CTYPE_RQ && !pfvf->rq_ctx) {
1546 seq_puts(filp, "RQ context is not initialized\n");
1547 return -EINVAL;
1548 } else if (ctype == NIX_AQ_CTYPE_CQ && !pfvf->cq_ctx) {
1549 seq_puts(filp, "CQ context is not initialized\n");
1550 return -EINVAL;
1551 }
1552
1553 if (ctype == NIX_AQ_CTYPE_SQ) {
1554 max_id = pfvf->sq_ctx->qsize;
1555 ctype_string = "sq";
1556 print_nix_ctx = print_nix_sq_ctx;
1557 } else if (ctype == NIX_AQ_CTYPE_RQ) {
1558 max_id = pfvf->rq_ctx->qsize;
1559 ctype_string = "rq";
1560 print_nix_ctx = print_nix_rq_ctx;
1561 } else if (ctype == NIX_AQ_CTYPE_CQ) {
1562 max_id = pfvf->cq_ctx->qsize;
1563 ctype_string = "cq";
1564 print_nix_ctx = print_nix_cq_ctx;
1565 }
1566
1567 memset(&aq_req, 0, sizeof(struct nix_aq_enq_req));
1568 aq_req.hdr.pcifunc = pcifunc;
1569 aq_req.ctype = ctype;
1570 aq_req.op = NIX_AQ_INSTOP_READ;
1571 if (all)
1572 id = 0;
1573 else
1574 max_id = id + 1;
1575 for (qidx = id; qidx < max_id; qidx++) {
1576 aq_req.qidx = qidx;
1577 seq_printf(filp, "=====%s_ctx for nixlf:%d and qidx:%d is=====\n",
1578 ctype_string, nixlf, aq_req.qidx);
1579 rc = rvu_mbox_handler_nix_aq_enq(rvu, &aq_req, &rsp);
1580 if (rc) {
1581 seq_puts(filp, "Failed to read the context\n");
1582 return -EINVAL;
1583 }
1584 print_nix_ctx(filp, &rsp);
1585 }
1586 return 0;
1587}
1588
1589static int write_nix_queue_ctx(struct rvu *rvu, bool all, int nixlf,
1590 int id, int ctype, char *ctype_string,
1591 struct seq_file *m)
1592{
1593 struct nix_hw *nix_hw = m->private;
1594 struct rvu_pfvf *pfvf;
1595 int max_id = 0;
1596 u16 pcifunc;
1597
1598 if (!rvu_dbg_is_valid_lf(rvu, nix_hw->blkaddr, nixlf, &pcifunc))
1599 return -EINVAL;
1600
1601 pfvf = rvu_get_pfvf(rvu, pcifunc);
1602
1603 if (ctype == NIX_AQ_CTYPE_SQ) {
1604 if (!pfvf->sq_ctx) {
1605 dev_warn(rvu->dev, "SQ context is not initialized\n");
1606 return -EINVAL;
1607 }
1608 max_id = pfvf->sq_ctx->qsize;
1609 } else if (ctype == NIX_AQ_CTYPE_RQ) {
1610 if (!pfvf->rq_ctx) {
1611 dev_warn(rvu->dev, "RQ context is not initialized\n");
1612 return -EINVAL;
1613 }
1614 max_id = pfvf->rq_ctx->qsize;
1615 } else if (ctype == NIX_AQ_CTYPE_CQ) {
1616 if (!pfvf->cq_ctx) {
1617 dev_warn(rvu->dev, "CQ context is not initialized\n");
1618 return -EINVAL;
1619 }
1620 max_id = pfvf->cq_ctx->qsize;
1621 }
1622
1623 if (id < 0 || id >= max_id) {
1624 dev_warn(rvu->dev, "Invalid %s_ctx valid range 0-%d\n",
1625 ctype_string, max_id - 1);
1626 return -EINVAL;
1627 }
1628 switch (ctype) {
1629 case NIX_AQ_CTYPE_CQ:
1630 rvu->rvu_dbg.nix_cq_ctx.lf = nixlf;
1631 rvu->rvu_dbg.nix_cq_ctx.id = id;
1632 rvu->rvu_dbg.nix_cq_ctx.all = all;
1633 break;
1634
1635 case NIX_AQ_CTYPE_SQ:
1636 rvu->rvu_dbg.nix_sq_ctx.lf = nixlf;
1637 rvu->rvu_dbg.nix_sq_ctx.id = id;
1638 rvu->rvu_dbg.nix_sq_ctx.all = all;
1639 break;
1640
1641 case NIX_AQ_CTYPE_RQ:
1642 rvu->rvu_dbg.nix_rq_ctx.lf = nixlf;
1643 rvu->rvu_dbg.nix_rq_ctx.id = id;
1644 rvu->rvu_dbg.nix_rq_ctx.all = all;
1645 break;
1646 default:
1647 return -EINVAL;
1648 }
1649 return 0;
1650}
1651
1652static ssize_t rvu_dbg_nix_queue_ctx_write(struct file *filp,
1653 const char __user *buffer,
1654 size_t count, loff_t *ppos,
1655 int ctype)
1656{
1657 struct seq_file *m = filp->private_data;
1658 struct nix_hw *nix_hw = m->private;
1659 struct rvu *rvu = nix_hw->rvu;
1660 char *cmd_buf, *ctype_string;
1661 int nixlf, id = 0, ret;
1662 bool all = false;
1663
1664 if ((*ppos != 0) || !count)
1665 return -EINVAL;
1666
1667 switch (ctype) {
1668 case NIX_AQ_CTYPE_SQ:
1669 ctype_string = "sq";
1670 break;
1671 case NIX_AQ_CTYPE_RQ:
1672 ctype_string = "rq";
1673 break;
1674 case NIX_AQ_CTYPE_CQ:
1675 ctype_string = "cq";
1676 break;
1677 default:
1678 return -EINVAL;
1679 }
1680
1681 cmd_buf = kzalloc(count + 1, GFP_KERNEL);
1682
1683 if (!cmd_buf)
1684 return count;
1685
1686 ret = parse_cmd_buffer_ctx(cmd_buf, &count, buffer,
1687 &nixlf, &id, &all);
1688 if (ret < 0) {
1689 dev_info(rvu->dev,
1690 "Usage: echo <nixlf> [%s number/all] > %s_ctx\n",
1691 ctype_string, ctype_string);
1692 goto done;
1693 } else {
1694 ret = write_nix_queue_ctx(rvu, all, nixlf, id, ctype,
1695 ctype_string, m);
1696 }
1697done:
1698 kfree(cmd_buf);
1699 return ret ? ret : count;
1700}
1701
1702static ssize_t rvu_dbg_nix_sq_ctx_write(struct file *filp,
1703 const char __user *buffer,
1704 size_t count, loff_t *ppos)
1705{
1706 return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
1707 NIX_AQ_CTYPE_SQ);
1708}
1709
1710static int rvu_dbg_nix_sq_ctx_display(struct seq_file *filp, void *unused)
1711{
1712 return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_SQ);
1713}
1714
1715RVU_DEBUG_SEQ_FOPS(nix_sq_ctx, nix_sq_ctx_display, nix_sq_ctx_write);
1716
1717static ssize_t rvu_dbg_nix_rq_ctx_write(struct file *filp,
1718 const char __user *buffer,
1719 size_t count, loff_t *ppos)
1720{
1721 return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
1722 NIX_AQ_CTYPE_RQ);
1723}
1724
1725static int rvu_dbg_nix_rq_ctx_display(struct seq_file *filp, void *unused)
1726{
1727 return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_RQ);
1728}
1729
1730RVU_DEBUG_SEQ_FOPS(nix_rq_ctx, nix_rq_ctx_display, nix_rq_ctx_write);
1731
1732static ssize_t rvu_dbg_nix_cq_ctx_write(struct file *filp,
1733 const char __user *buffer,
1734 size_t count, loff_t *ppos)
1735{
1736 return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
1737 NIX_AQ_CTYPE_CQ);
1738}
1739
1740static int rvu_dbg_nix_cq_ctx_display(struct seq_file *filp, void *unused)
1741{
1742 return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_CQ);
1743}
1744
1745RVU_DEBUG_SEQ_FOPS(nix_cq_ctx, nix_cq_ctx_display, nix_cq_ctx_write);
1746
1747static void print_nix_qctx_qsize(struct seq_file *filp, int qsize,
1748 unsigned long *bmap, char *qtype)
1749{
1750 char *buf;
1751
1752 buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
1753 if (!buf)
1754 return;
1755
1756 bitmap_print_to_pagebuf(false, buf, bmap, qsize);
1757 seq_printf(filp, "%s context count : %d\n", qtype, qsize);
1758 seq_printf(filp, "%s context ena/dis bitmap : %s\n",
1759 qtype, buf);
1760 kfree(buf);
1761}
1762
1763static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf)
1764{
1765 if (!pfvf->cq_ctx)
1766 seq_puts(filp, "cq context is not initialized\n");
1767 else
1768 print_nix_qctx_qsize(filp, pfvf->cq_ctx->qsize, pfvf->cq_bmap,
1769 "cq");
1770
1771 if (!pfvf->rq_ctx)
1772 seq_puts(filp, "rq context is not initialized\n");
1773 else
1774 print_nix_qctx_qsize(filp, pfvf->rq_ctx->qsize, pfvf->rq_bmap,
1775 "rq");
1776
1777 if (!pfvf->sq_ctx)
1778 seq_puts(filp, "sq context is not initialized\n");
1779 else
1780 print_nix_qctx_qsize(filp, pfvf->sq_ctx->qsize, pfvf->sq_bmap,
1781 "sq");
1782}
1783
1784static ssize_t rvu_dbg_nix_qsize_write(struct file *filp,
1785 const char __user *buffer,
1786 size_t count, loff_t *ppos)
1787{
1788 return rvu_dbg_qsize_write(filp, buffer, count, ppos,
1789 BLKTYPE_NIX);
1790}
1791
1792static int rvu_dbg_nix_qsize_display(struct seq_file *filp, void *unused)
1793{
1794 return rvu_dbg_qsize_display(filp, unused, BLKTYPE_NIX);
1795}
1796
1797RVU_DEBUG_SEQ_FOPS(nix_qsize, nix_qsize_display, nix_qsize_write);
1798
1799static void print_band_prof_ctx(struct seq_file *m,
1800 struct nix_bandprof_s *prof)
1801{
1802 char *str;
1803
1804 switch (prof->pc_mode) {
1805 case NIX_RX_PC_MODE_VLAN:
1806 str = "VLAN";
1807 break;
1808 case NIX_RX_PC_MODE_DSCP:
1809 str = "DSCP";
1810 break;
1811 case NIX_RX_PC_MODE_GEN:
1812 str = "Generic";
1813 break;
1814 case NIX_RX_PC_MODE_RSVD:
1815 str = "Reserved";
1816 break;
1817 }
1818 seq_printf(m, "W0: pc_mode\t\t%s\n", str);
1819 str = (prof->icolor == 3) ? "Color blind" :
1820 (prof->icolor == 0) ? "Green" :
1821 (prof->icolor == 1) ? "Yellow" : "Red";
1822 seq_printf(m, "W0: icolor\t\t%s\n", str);
1823 seq_printf(m, "W0: tnl_ena\t\t%d\n", prof->tnl_ena);
1824 seq_printf(m, "W0: peir_exponent\t%d\n", prof->peir_exponent);
1825 seq_printf(m, "W0: pebs_exponent\t%d\n", prof->pebs_exponent);
1826 seq_printf(m, "W0: cir_exponent\t%d\n", prof->cir_exponent);
1827 seq_printf(m, "W0: cbs_exponent\t%d\n", prof->cbs_exponent);
1828 seq_printf(m, "W0: peir_mantissa\t%d\n", prof->peir_mantissa);
1829 seq_printf(m, "W0: pebs_mantissa\t%d\n", prof->pebs_mantissa);
1830 seq_printf(m, "W0: cir_mantissa\t%d\n", prof->cir_mantissa);
1831
1832 seq_printf(m, "W1: cbs_mantissa\t%d\n", prof->cbs_mantissa);
1833 str = (prof->lmode == 0) ? "byte" : "packet";
1834 seq_printf(m, "W1: lmode\t\t%s\n", str);
1835 seq_printf(m, "W1: l_select\t\t%d\n", prof->l_sellect);
1836 seq_printf(m, "W1: rdiv\t\t%d\n", prof->rdiv);
1837 seq_printf(m, "W1: adjust_exponent\t%d\n", prof->adjust_exponent);
1838 seq_printf(m, "W1: adjust_mantissa\t%d\n", prof->adjust_mantissa);
1839 str = (prof->gc_action == 0) ? "PASS" :
1840 (prof->gc_action == 1) ? "DROP" : "RED";
1841 seq_printf(m, "W1: gc_action\t\t%s\n", str);
1842 str = (prof->yc_action == 0) ? "PASS" :
1843 (prof->yc_action == 1) ? "DROP" : "RED";
1844 seq_printf(m, "W1: yc_action\t\t%s\n", str);
1845 str = (prof->rc_action == 0) ? "PASS" :
1846 (prof->rc_action == 1) ? "DROP" : "RED";
1847 seq_printf(m, "W1: rc_action\t\t%s\n", str);
1848 seq_printf(m, "W1: meter_algo\t\t%d\n", prof->meter_algo);
1849 seq_printf(m, "W1: band_prof_id\t%d\n", prof->band_prof_id);
1850 seq_printf(m, "W1: hl_en\t\t%d\n", prof->hl_en);
1851
1852 seq_printf(m, "W2: ts\t\t\t%lld\n", (u64)prof->ts);
1853 seq_printf(m, "W3: pe_accum\t\t%d\n", prof->pe_accum);
1854 seq_printf(m, "W3: c_accum\t\t%d\n", prof->c_accum);
1855 seq_printf(m, "W4: green_pkt_pass\t%lld\n",
1856 (u64)prof->green_pkt_pass);
1857 seq_printf(m, "W5: yellow_pkt_pass\t%lld\n",
1858 (u64)prof->yellow_pkt_pass);
1859 seq_printf(m, "W6: red_pkt_pass\t%lld\n", (u64)prof->red_pkt_pass);
1860 seq_printf(m, "W7: green_octs_pass\t%lld\n",
1861 (u64)prof->green_octs_pass);
1862 seq_printf(m, "W8: yellow_octs_pass\t%lld\n",
1863 (u64)prof->yellow_octs_pass);
1864 seq_printf(m, "W9: red_octs_pass\t%lld\n", (u64)prof->red_octs_pass);
1865 seq_printf(m, "W10: green_pkt_drop\t%lld\n",
1866 (u64)prof->green_pkt_drop);
1867 seq_printf(m, "W11: yellow_pkt_drop\t%lld\n",
1868 (u64)prof->yellow_pkt_drop);
1869 seq_printf(m, "W12: red_pkt_drop\t%lld\n", (u64)prof->red_pkt_drop);
1870 seq_printf(m, "W13: green_octs_drop\t%lld\n",
1871 (u64)prof->green_octs_drop);
1872 seq_printf(m, "W14: yellow_octs_drop\t%lld\n",
1873 (u64)prof->yellow_octs_drop);
1874 seq_printf(m, "W15: red_octs_drop\t%lld\n", (u64)prof->red_octs_drop);
1875 seq_puts(m, "==============================\n");
1876}
1877
1878static int rvu_dbg_nix_band_prof_ctx_display(struct seq_file *m, void *unused)
1879{
1880 struct nix_hw *nix_hw = m->private;
1881 struct nix_cn10k_aq_enq_req aq_req;
1882 struct nix_cn10k_aq_enq_rsp aq_rsp;
1883 struct rvu *rvu = nix_hw->rvu;
1884 struct nix_ipolicer *ipolicer;
1885 int layer, prof_idx, idx, rc;
1886 u16 pcifunc;
1887 char *str;
1888
1889
1890 if (!nix_hw->ipolicer)
1891 return 0;
1892
1893 for (layer = 0; layer < BAND_PROF_NUM_LAYERS; layer++) {
1894 if (layer == BAND_PROF_INVAL_LAYER)
1895 continue;
1896 str = (layer == BAND_PROF_LEAF_LAYER) ? "Leaf" :
1897 (layer == BAND_PROF_MID_LAYER) ? "Mid" : "Top";
1898
1899 seq_printf(m, "\n%s bandwidth profiles\n", str);
1900 seq_puts(m, "=======================\n");
1901
1902 ipolicer = &nix_hw->ipolicer[layer];
1903
1904 for (idx = 0; idx < ipolicer->band_prof.max; idx++) {
1905 if (is_rsrc_free(&ipolicer->band_prof, idx))
1906 continue;
1907
1908 prof_idx = (idx & 0x3FFF) | (layer << 14);
1909 rc = nix_aq_context_read(rvu, nix_hw, &aq_req, &aq_rsp,
1910 0x00, NIX_AQ_CTYPE_BANDPROF,
1911 prof_idx);
1912 if (rc) {
1913 dev_err(rvu->dev,
1914 "%s: Failed to fetch context of %s profile %d, err %d\n",
1915 __func__, str, idx, rc);
1916 return 0;
1917 }
1918 seq_printf(m, "\n%s bandwidth profile:: %d\n", str, idx);
1919 pcifunc = ipolicer->pfvf_map[idx];
1920 if (!(pcifunc & RVU_PFVF_FUNC_MASK))
1921 seq_printf(m, "Allocated to :: PF %d\n",
1922 rvu_get_pf(pcifunc));
1923 else
1924 seq_printf(m, "Allocated to :: PF %d VF %d\n",
1925 rvu_get_pf(pcifunc),
1926 (pcifunc & RVU_PFVF_FUNC_MASK) - 1);
1927 print_band_prof_ctx(m, &aq_rsp.prof);
1928 }
1929 }
1930 return 0;
1931}
1932
1933RVU_DEBUG_SEQ_FOPS(nix_band_prof_ctx, nix_band_prof_ctx_display, NULL);
1934
1935static int rvu_dbg_nix_band_prof_rsrc_display(struct seq_file *m, void *unused)
1936{
1937 struct nix_hw *nix_hw = m->private;
1938 struct nix_ipolicer *ipolicer;
1939 int layer;
1940 char *str;
1941
1942
1943 if (!nix_hw->ipolicer)
1944 return 0;
1945
1946 seq_puts(m, "\nBandwidth profile resource free count\n");
1947 seq_puts(m, "=====================================\n");
1948 for (layer = 0; layer < BAND_PROF_NUM_LAYERS; layer++) {
1949 if (layer == BAND_PROF_INVAL_LAYER)
1950 continue;
1951 str = (layer == BAND_PROF_LEAF_LAYER) ? "Leaf" :
1952 (layer == BAND_PROF_MID_LAYER) ? "Mid " : "Top ";
1953
1954 ipolicer = &nix_hw->ipolicer[layer];
1955 seq_printf(m, "%s :: Max: %4d Free: %4d\n", str,
1956 ipolicer->band_prof.max,
1957 rvu_rsrc_free_count(&ipolicer->band_prof));
1958 }
1959 seq_puts(m, "=====================================\n");
1960
1961 return 0;
1962}
1963
1964RVU_DEBUG_SEQ_FOPS(nix_band_prof_rsrc, nix_band_prof_rsrc_display, NULL);
1965
1966static void rvu_dbg_nix_init(struct rvu *rvu, int blkaddr)
1967{
1968 struct nix_hw *nix_hw;
1969
1970 if (!is_block_implemented(rvu->hw, blkaddr))
1971 return;
1972
1973 if (blkaddr == BLKADDR_NIX0) {
1974 rvu->rvu_dbg.nix = debugfs_create_dir("nix", rvu->rvu_dbg.root);
1975 nix_hw = &rvu->hw->nix[0];
1976 } else {
1977 rvu->rvu_dbg.nix = debugfs_create_dir("nix1",
1978 rvu->rvu_dbg.root);
1979 nix_hw = &rvu->hw->nix[1];
1980 }
1981
1982 debugfs_create_file("sq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
1983 &rvu_dbg_nix_sq_ctx_fops);
1984 debugfs_create_file("rq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
1985 &rvu_dbg_nix_rq_ctx_fops);
1986 debugfs_create_file("cq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
1987 &rvu_dbg_nix_cq_ctx_fops);
1988 debugfs_create_file("ndc_tx_cache", 0600, rvu->rvu_dbg.nix, nix_hw,
1989 &rvu_dbg_nix_ndc_tx_cache_fops);
1990 debugfs_create_file("ndc_rx_cache", 0600, rvu->rvu_dbg.nix, nix_hw,
1991 &rvu_dbg_nix_ndc_rx_cache_fops);
1992 debugfs_create_file("ndc_tx_hits_miss", 0600, rvu->rvu_dbg.nix, nix_hw,
1993 &rvu_dbg_nix_ndc_tx_hits_miss_fops);
1994 debugfs_create_file("ndc_rx_hits_miss", 0600, rvu->rvu_dbg.nix, nix_hw,
1995 &rvu_dbg_nix_ndc_rx_hits_miss_fops);
1996 debugfs_create_file("qsize", 0600, rvu->rvu_dbg.nix, rvu,
1997 &rvu_dbg_nix_qsize_fops);
1998 debugfs_create_file("ingress_policer_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
1999 &rvu_dbg_nix_band_prof_ctx_fops);
2000 debugfs_create_file("ingress_policer_rsrc", 0600, rvu->rvu_dbg.nix, nix_hw,
2001 &rvu_dbg_nix_band_prof_rsrc_fops);
2002}
2003
2004static void rvu_dbg_npa_init(struct rvu *rvu)
2005{
2006 rvu->rvu_dbg.npa = debugfs_create_dir("npa", rvu->rvu_dbg.root);
2007
2008 debugfs_create_file("qsize", 0600, rvu->rvu_dbg.npa, rvu,
2009 &rvu_dbg_npa_qsize_fops);
2010 debugfs_create_file("aura_ctx", 0600, rvu->rvu_dbg.npa, rvu,
2011 &rvu_dbg_npa_aura_ctx_fops);
2012 debugfs_create_file("pool_ctx", 0600, rvu->rvu_dbg.npa, rvu,
2013 &rvu_dbg_npa_pool_ctx_fops);
2014 debugfs_create_file("ndc_cache", 0600, rvu->rvu_dbg.npa, rvu,
2015 &rvu_dbg_npa_ndc_cache_fops);
2016 debugfs_create_file("ndc_hits_miss", 0600, rvu->rvu_dbg.npa, rvu,
2017 &rvu_dbg_npa_ndc_hits_miss_fops);
2018}
2019
2020#define PRINT_CGX_CUML_NIXRX_STATUS(idx, name) \
2021 ({ \
2022 u64 cnt; \
2023 err = rvu_cgx_nix_cuml_stats(rvu, cgxd, lmac_id, (idx), \
2024 NIX_STATS_RX, &(cnt)); \
2025 if (!err) \
2026 seq_printf(s, "%s: %llu\n", name, cnt); \
2027 cnt; \
2028 })
2029
2030#define PRINT_CGX_CUML_NIXTX_STATUS(idx, name) \
2031 ({ \
2032 u64 cnt; \
2033 err = rvu_cgx_nix_cuml_stats(rvu, cgxd, lmac_id, (idx), \
2034 NIX_STATS_TX, &(cnt)); \
2035 if (!err) \
2036 seq_printf(s, "%s: %llu\n", name, cnt); \
2037 cnt; \
2038 })
2039
2040static int cgx_print_stats(struct seq_file *s, int lmac_id)
2041{
2042 struct cgx_link_user_info linfo;
2043 struct mac_ops *mac_ops;
2044 void *cgxd = s->private;
2045 u64 ucast, mcast, bcast;
2046 int stat = 0, err = 0;
2047 u64 tx_stat, rx_stat;
2048 struct rvu *rvu;
2049
2050 rvu = pci_get_drvdata(pci_get_device(PCI_VENDOR_ID_CAVIUM,
2051 PCI_DEVID_OCTEONTX2_RVU_AF, NULL));
2052 if (!rvu)
2053 return -ENODEV;
2054
2055 mac_ops = get_mac_ops(cgxd);
2056
2057 if (!mac_ops)
2058 return 0;
2059
2060
2061 seq_puts(s, "\n=======Link Status======\n\n");
2062 err = cgx_get_link_info(cgxd, lmac_id, &linfo);
2063 if (err)
2064 seq_puts(s, "Failed to read link status\n");
2065 seq_printf(s, "\nLink is %s %d Mbps\n\n",
2066 linfo.link_up ? "UP" : "DOWN", linfo.speed);
2067
2068
2069 seq_printf(s, "\n=======NIX RX_STATS(%s port level)======\n\n",
2070 mac_ops->name);
2071 ucast = PRINT_CGX_CUML_NIXRX_STATUS(RX_UCAST, "rx_ucast_frames");
2072 if (err)
2073 return err;
2074 mcast = PRINT_CGX_CUML_NIXRX_STATUS(RX_MCAST, "rx_mcast_frames");
2075 if (err)
2076 return err;
2077 bcast = PRINT_CGX_CUML_NIXRX_STATUS(RX_BCAST, "rx_bcast_frames");
2078 if (err)
2079 return err;
2080 seq_printf(s, "rx_frames: %llu\n", ucast + mcast + bcast);
2081 PRINT_CGX_CUML_NIXRX_STATUS(RX_OCTS, "rx_bytes");
2082 if (err)
2083 return err;
2084 PRINT_CGX_CUML_NIXRX_STATUS(RX_DROP, "rx_drops");
2085 if (err)
2086 return err;
2087 PRINT_CGX_CUML_NIXRX_STATUS(RX_ERR, "rx_errors");
2088 if (err)
2089 return err;
2090
2091
2092 seq_printf(s, "\n=======NIX TX_STATS(%s port level)======\n\n",
2093 mac_ops->name);
2094 ucast = PRINT_CGX_CUML_NIXTX_STATUS(TX_UCAST, "tx_ucast_frames");
2095 if (err)
2096 return err;
2097 mcast = PRINT_CGX_CUML_NIXTX_STATUS(TX_MCAST, "tx_mcast_frames");
2098 if (err)
2099 return err;
2100 bcast = PRINT_CGX_CUML_NIXTX_STATUS(TX_BCAST, "tx_bcast_frames");
2101 if (err)
2102 return err;
2103 seq_printf(s, "tx_frames: %llu\n", ucast + mcast + bcast);
2104 PRINT_CGX_CUML_NIXTX_STATUS(TX_OCTS, "tx_bytes");
2105 if (err)
2106 return err;
2107 PRINT_CGX_CUML_NIXTX_STATUS(TX_DROP, "tx_drops");
2108 if (err)
2109 return err;
2110
2111
2112 seq_printf(s, "\n=======%s RX_STATS======\n\n", mac_ops->name);
2113 while (stat < mac_ops->rx_stats_cnt) {
2114 err = mac_ops->mac_get_rx_stats(cgxd, lmac_id, stat, &rx_stat);
2115 if (err)
2116 return err;
2117 if (is_rvu_otx2(rvu))
2118 seq_printf(s, "%s: %llu\n", cgx_rx_stats_fields[stat],
2119 rx_stat);
2120 else
2121 seq_printf(s, "%s: %llu\n", rpm_rx_stats_fields[stat],
2122 rx_stat);
2123 stat++;
2124 }
2125
2126
2127 stat = 0;
2128 seq_printf(s, "\n=======%s TX_STATS======\n\n", mac_ops->name);
2129 while (stat < mac_ops->tx_stats_cnt) {
2130 err = mac_ops->mac_get_tx_stats(cgxd, lmac_id, stat, &tx_stat);
2131 if (err)
2132 return err;
2133
2134 if (is_rvu_otx2(rvu))
2135 seq_printf(s, "%s: %llu\n", cgx_tx_stats_fields[stat],
2136 tx_stat);
2137 else
2138 seq_printf(s, "%s: %llu\n", rpm_tx_stats_fields[stat],
2139 tx_stat);
2140 stat++;
2141 }
2142
2143 return err;
2144}
2145
2146static int rvu_dbg_derive_lmacid(struct seq_file *filp, int *lmac_id)
2147{
2148 struct dentry *current_dir;
2149 char *buf;
2150
2151 current_dir = filp->file->f_path.dentry->d_parent;
2152 buf = strrchr(current_dir->d_name.name, 'c');
2153 if (!buf)
2154 return -EINVAL;
2155
2156 return kstrtoint(buf + 1, 10, lmac_id);
2157}
2158
2159static int rvu_dbg_cgx_stat_display(struct seq_file *filp, void *unused)
2160{
2161 int lmac_id, err;
2162
2163 err = rvu_dbg_derive_lmacid(filp, &lmac_id);
2164 if (!err)
2165 return cgx_print_stats(filp, lmac_id);
2166
2167 return err;
2168}
2169
2170RVU_DEBUG_SEQ_FOPS(cgx_stat, cgx_stat_display, NULL);
2171
2172static int cgx_print_dmac_flt(struct seq_file *s, int lmac_id)
2173{
2174 struct pci_dev *pdev = NULL;
2175 void *cgxd = s->private;
2176 char *bcast, *mcast;
2177 u16 index, domain;
2178 u8 dmac[ETH_ALEN];
2179 struct rvu *rvu;
2180 u64 cfg, mac;
2181 int pf;
2182
2183 rvu = pci_get_drvdata(pci_get_device(PCI_VENDOR_ID_CAVIUM,
2184 PCI_DEVID_OCTEONTX2_RVU_AF, NULL));
2185 if (!rvu)
2186 return -ENODEV;
2187
2188 pf = cgxlmac_to_pf(rvu, cgx_get_cgxid(cgxd), lmac_id);
2189 domain = 2;
2190
2191 pdev = pci_get_domain_bus_and_slot(domain, pf + 1, 0);
2192 if (!pdev)
2193 return 0;
2194
2195 cfg = cgx_read_dmac_ctrl(cgxd, lmac_id);
2196 bcast = cfg & CGX_DMAC_BCAST_MODE ? "ACCEPT" : "REJECT";
2197 mcast = cfg & CGX_DMAC_MCAST_MODE ? "ACCEPT" : "REJECT";
2198
2199 seq_puts(s,
2200 "PCI dev RVUPF BROADCAST MULTICAST FILTER-MODE\n");
2201 seq_printf(s, "%s PF%d %9s %9s",
2202 dev_name(&pdev->dev), pf, bcast, mcast);
2203 if (cfg & CGX_DMAC_CAM_ACCEPT)
2204 seq_printf(s, "%12s\n\n", "UNICAST");
2205 else
2206 seq_printf(s, "%16s\n\n", "PROMISCUOUS");
2207
2208 seq_puts(s, "\nDMAC-INDEX ADDRESS\n");
2209
2210 for (index = 0 ; index < 32 ; index++) {
2211 cfg = cgx_read_dmac_entry(cgxd, index);
2212
2213 if (lmac_id == FIELD_GET(CGX_DMAC_CAM_ENTRY_LMACID, cfg) &&
2214 FIELD_GET(CGX_DMAC_CAM_ADDR_ENABLE, cfg)) {
2215 mac = FIELD_GET(CGX_RX_DMAC_ADR_MASK, cfg);
2216 u64_to_ether_addr(mac, dmac);
2217 seq_printf(s, "%7d %pM\n", index, dmac);
2218 }
2219 }
2220
2221 return 0;
2222}
2223
2224static int rvu_dbg_cgx_dmac_flt_display(struct seq_file *filp, void *unused)
2225{
2226 int err, lmac_id;
2227
2228 err = rvu_dbg_derive_lmacid(filp, &lmac_id);
2229 if (!err)
2230 return cgx_print_dmac_flt(filp, lmac_id);
2231
2232 return err;
2233}
2234
2235RVU_DEBUG_SEQ_FOPS(cgx_dmac_flt, cgx_dmac_flt_display, NULL);
2236
2237static void rvu_dbg_cgx_init(struct rvu *rvu)
2238{
2239 struct mac_ops *mac_ops;
2240 unsigned long lmac_bmap;
2241 int i, lmac_id;
2242 char dname[20];
2243 void *cgx;
2244
2245 if (!cgx_get_cgxcnt_max())
2246 return;
2247
2248 mac_ops = get_mac_ops(rvu_first_cgx_pdata(rvu));
2249 if (!mac_ops)
2250 return;
2251
2252 rvu->rvu_dbg.cgx_root = debugfs_create_dir(mac_ops->name,
2253 rvu->rvu_dbg.root);
2254
2255 for (i = 0; i < cgx_get_cgxcnt_max(); i++) {
2256 cgx = rvu_cgx_pdata(i, rvu);
2257 if (!cgx)
2258 continue;
2259 lmac_bmap = cgx_get_lmac_bmap(cgx);
2260
2261 sprintf(dname, "%s%d", mac_ops->name, i);
2262 rvu->rvu_dbg.cgx = debugfs_create_dir(dname,
2263 rvu->rvu_dbg.cgx_root);
2264
2265 for_each_set_bit(lmac_id, &lmac_bmap, MAX_LMAC_PER_CGX) {
2266
2267 sprintf(dname, "lmac%d", lmac_id);
2268 rvu->rvu_dbg.lmac =
2269 debugfs_create_dir(dname, rvu->rvu_dbg.cgx);
2270
2271 debugfs_create_file("stats", 0600, rvu->rvu_dbg.lmac,
2272 cgx, &rvu_dbg_cgx_stat_fops);
2273 debugfs_create_file("mac_filter", 0600,
2274 rvu->rvu_dbg.lmac, cgx,
2275 &rvu_dbg_cgx_dmac_flt_fops);
2276 }
2277 }
2278}
2279
2280
2281static void rvu_print_npc_mcam_info(struct seq_file *s,
2282 u16 pcifunc, int blkaddr)
2283{
2284 struct rvu *rvu = s->private;
2285 int entry_acnt, entry_ecnt;
2286 int cntr_acnt, cntr_ecnt;
2287
2288 rvu_npc_get_mcam_entry_alloc_info(rvu, pcifunc, blkaddr,
2289 &entry_acnt, &entry_ecnt);
2290 rvu_npc_get_mcam_counter_alloc_info(rvu, pcifunc, blkaddr,
2291 &cntr_acnt, &cntr_ecnt);
2292 if (!entry_acnt && !cntr_acnt)
2293 return;
2294
2295 if (!(pcifunc & RVU_PFVF_FUNC_MASK))
2296 seq_printf(s, "\n\t\t Device \t\t: PF%d\n",
2297 rvu_get_pf(pcifunc));
2298 else
2299 seq_printf(s, "\n\t\t Device \t\t: PF%d VF%d\n",
2300 rvu_get_pf(pcifunc),
2301 (pcifunc & RVU_PFVF_FUNC_MASK) - 1);
2302
2303 if (entry_acnt) {
2304 seq_printf(s, "\t\t Entries allocated \t: %d\n", entry_acnt);
2305 seq_printf(s, "\t\t Entries enabled \t: %d\n", entry_ecnt);
2306 }
2307 if (cntr_acnt) {
2308 seq_printf(s, "\t\t Counters allocated \t: %d\n", cntr_acnt);
2309 seq_printf(s, "\t\t Counters enabled \t: %d\n", cntr_ecnt);
2310 }
2311}
2312
2313static int rvu_dbg_npc_mcam_info_display(struct seq_file *filp, void *unsued)
2314{
2315 struct rvu *rvu = filp->private;
2316 int pf, vf, numvfs, blkaddr;
2317 struct npc_mcam *mcam;
2318 u16 pcifunc, counters;
2319 u64 cfg;
2320
2321 blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
2322 if (blkaddr < 0)
2323 return -ENODEV;
2324
2325 mcam = &rvu->hw->mcam;
2326 counters = rvu->hw->npc_counters;
2327
2328 seq_puts(filp, "\nNPC MCAM info:\n");
2329
2330 cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_RX));
2331 cfg = (cfg >> 32) & 0x07;
2332 seq_printf(filp, "\t\t RX keywidth \t: %s\n", (cfg == NPC_MCAM_KEY_X1) ?
2333 "112bits" : ((cfg == NPC_MCAM_KEY_X2) ?
2334 "224bits" : "448bits"));
2335 cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_TX));
2336 cfg = (cfg >> 32) & 0x07;
2337 seq_printf(filp, "\t\t TX keywidth \t: %s\n", (cfg == NPC_MCAM_KEY_X1) ?
2338 "112bits" : ((cfg == NPC_MCAM_KEY_X2) ?
2339 "224bits" : "448bits"));
2340
2341 mutex_lock(&mcam->lock);
2342
2343 seq_printf(filp, "\n\t\t MCAM entries \t: %d\n", mcam->total_entries);
2344 seq_printf(filp, "\t\t Reserved \t: %d\n",
2345 mcam->total_entries - mcam->bmap_entries);
2346 seq_printf(filp, "\t\t Available \t: %d\n", mcam->bmap_fcnt);
2347
2348
2349 seq_printf(filp, "\n\t\t MCAM counters \t: %d\n", counters);
2350 seq_printf(filp, "\t\t Reserved \t: %d\n",
2351 counters - mcam->counters.max);
2352 seq_printf(filp, "\t\t Available \t: %d\n",
2353 rvu_rsrc_free_count(&mcam->counters));
2354
2355 if (mcam->bmap_entries == mcam->bmap_fcnt) {
2356 mutex_unlock(&mcam->lock);
2357 return 0;
2358 }
2359
2360 seq_puts(filp, "\n\t\t Current allocation\n");
2361 seq_puts(filp, "\t\t====================\n");
2362 for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
2363 pcifunc = (pf << RVU_PFVF_PF_SHIFT);
2364 rvu_print_npc_mcam_info(filp, pcifunc, blkaddr);
2365
2366 cfg = rvu_read64(rvu, BLKADDR_RVUM, RVU_PRIV_PFX_CFG(pf));
2367 numvfs = (cfg >> 12) & 0xFF;
2368 for (vf = 0; vf < numvfs; vf++) {
2369 pcifunc = (pf << RVU_PFVF_PF_SHIFT) | (vf + 1);
2370 rvu_print_npc_mcam_info(filp, pcifunc, blkaddr);
2371 }
2372 }
2373
2374 mutex_unlock(&mcam->lock);
2375 return 0;
2376}
2377
2378RVU_DEBUG_SEQ_FOPS(npc_mcam_info, npc_mcam_info_display, NULL);
2379
2380static int rvu_dbg_npc_rx_miss_stats_display(struct seq_file *filp,
2381 void *unused)
2382{
2383 struct rvu *rvu = filp->private;
2384 struct npc_mcam *mcam;
2385 int blkaddr;
2386
2387 blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
2388 if (blkaddr < 0)
2389 return -ENODEV;
2390
2391 mcam = &rvu->hw->mcam;
2392
2393 seq_puts(filp, "\nNPC MCAM RX miss action stats\n");
2394 seq_printf(filp, "\t\tStat %d: \t%lld\n", mcam->rx_miss_act_cntr,
2395 rvu_read64(rvu, blkaddr,
2396 NPC_AF_MATCH_STATX(mcam->rx_miss_act_cntr)));
2397
2398 return 0;
2399}
2400
2401RVU_DEBUG_SEQ_FOPS(npc_rx_miss_act, npc_rx_miss_stats_display, NULL);
2402
2403static void rvu_dbg_npc_mcam_show_flows(struct seq_file *s,
2404 struct rvu_npc_mcam_rule *rule)
2405{
2406 u8 bit;
2407
2408 for_each_set_bit(bit, (unsigned long *)&rule->features, 64) {
2409 seq_printf(s, "\t%s ", npc_get_field_name(bit));
2410 switch (bit) {
2411 case NPC_DMAC:
2412 seq_printf(s, "%pM ", rule->packet.dmac);
2413 seq_printf(s, "mask %pM\n", rule->mask.dmac);
2414 break;
2415 case NPC_SMAC:
2416 seq_printf(s, "%pM ", rule->packet.smac);
2417 seq_printf(s, "mask %pM\n", rule->mask.smac);
2418 break;
2419 case NPC_ETYPE:
2420 seq_printf(s, "0x%x ", ntohs(rule->packet.etype));
2421 seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.etype));
2422 break;
2423 case NPC_OUTER_VID:
2424 seq_printf(s, "0x%x ", ntohs(rule->packet.vlan_tci));
2425 seq_printf(s, "mask 0x%x\n",
2426 ntohs(rule->mask.vlan_tci));
2427 break;
2428 case NPC_TOS:
2429 seq_printf(s, "%d ", rule->packet.tos);
2430 seq_printf(s, "mask 0x%x\n", rule->mask.tos);
2431 break;
2432 case NPC_SIP_IPV4:
2433 seq_printf(s, "%pI4 ", &rule->packet.ip4src);
2434 seq_printf(s, "mask %pI4\n", &rule->mask.ip4src);
2435 break;
2436 case NPC_DIP_IPV4:
2437 seq_printf(s, "%pI4 ", &rule->packet.ip4dst);
2438 seq_printf(s, "mask %pI4\n", &rule->mask.ip4dst);
2439 break;
2440 case NPC_SIP_IPV6:
2441 seq_printf(s, "%pI6 ", rule->packet.ip6src);
2442 seq_printf(s, "mask %pI6\n", rule->mask.ip6src);
2443 break;
2444 case NPC_DIP_IPV6:
2445 seq_printf(s, "%pI6 ", rule->packet.ip6dst);
2446 seq_printf(s, "mask %pI6\n", rule->mask.ip6dst);
2447 break;
2448 case NPC_SPORT_TCP:
2449 case NPC_SPORT_UDP:
2450 case NPC_SPORT_SCTP:
2451 seq_printf(s, "%d ", ntohs(rule->packet.sport));
2452 seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.sport));
2453 break;
2454 case NPC_DPORT_TCP:
2455 case NPC_DPORT_UDP:
2456 case NPC_DPORT_SCTP:
2457 seq_printf(s, "%d ", ntohs(rule->packet.dport));
2458 seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.dport));
2459 break;
2460 default:
2461 seq_puts(s, "\n");
2462 break;
2463 }
2464 }
2465}
2466
2467static void rvu_dbg_npc_mcam_show_action(struct seq_file *s,
2468 struct rvu_npc_mcam_rule *rule)
2469{
2470 if (is_npc_intf_tx(rule->intf)) {
2471 switch (rule->tx_action.op) {
2472 case NIX_TX_ACTIONOP_DROP:
2473 seq_puts(s, "\taction: Drop\n");
2474 break;
2475 case NIX_TX_ACTIONOP_UCAST_DEFAULT:
2476 seq_puts(s, "\taction: Unicast to default channel\n");
2477 break;
2478 case NIX_TX_ACTIONOP_UCAST_CHAN:
2479 seq_printf(s, "\taction: Unicast to channel %d\n",
2480 rule->tx_action.index);
2481 break;
2482 case NIX_TX_ACTIONOP_MCAST:
2483 seq_puts(s, "\taction: Multicast\n");
2484 break;
2485 case NIX_TX_ACTIONOP_DROP_VIOL:
2486 seq_puts(s, "\taction: Lockdown Violation Drop\n");
2487 break;
2488 default:
2489 break;
2490 }
2491 } else {
2492 switch (rule->rx_action.op) {
2493 case NIX_RX_ACTIONOP_DROP:
2494 seq_puts(s, "\taction: Drop\n");
2495 break;
2496 case NIX_RX_ACTIONOP_UCAST:
2497 seq_printf(s, "\taction: Direct to queue %d\n",
2498 rule->rx_action.index);
2499 break;
2500 case NIX_RX_ACTIONOP_RSS:
2501 seq_puts(s, "\taction: RSS\n");
2502 break;
2503 case NIX_RX_ACTIONOP_UCAST_IPSEC:
2504 seq_puts(s, "\taction: Unicast ipsec\n");
2505 break;
2506 case NIX_RX_ACTIONOP_MCAST:
2507 seq_puts(s, "\taction: Multicast\n");
2508 break;
2509 default:
2510 break;
2511 }
2512 }
2513}
2514
2515static const char *rvu_dbg_get_intf_name(int intf)
2516{
2517 switch (intf) {
2518 case NIX_INTFX_RX(0):
2519 return "NIX0_RX";
2520 case NIX_INTFX_RX(1):
2521 return "NIX1_RX";
2522 case NIX_INTFX_TX(0):
2523 return "NIX0_TX";
2524 case NIX_INTFX_TX(1):
2525 return "NIX1_TX";
2526 default:
2527 break;
2528 }
2529
2530 return "unknown";
2531}
2532
2533static int rvu_dbg_npc_mcam_show_rules(struct seq_file *s, void *unused)
2534{
2535 struct rvu_npc_mcam_rule *iter;
2536 struct rvu *rvu = s->private;
2537 struct npc_mcam *mcam;
2538 int pf, vf = -1;
2539 bool enabled;
2540 int blkaddr;
2541 u16 target;
2542 u64 hits;
2543
2544 blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
2545 if (blkaddr < 0)
2546 return 0;
2547
2548 mcam = &rvu->hw->mcam;
2549
2550 mutex_lock(&mcam->lock);
2551 list_for_each_entry(iter, &mcam->mcam_rules, list) {
2552 pf = (iter->owner >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
2553 seq_printf(s, "\n\tInstalled by: PF%d ", pf);
2554
2555 if (iter->owner & RVU_PFVF_FUNC_MASK) {
2556 vf = (iter->owner & RVU_PFVF_FUNC_MASK) - 1;
2557 seq_printf(s, "VF%d", vf);
2558 }
2559 seq_puts(s, "\n");
2560
2561 seq_printf(s, "\tdirection: %s\n", is_npc_intf_rx(iter->intf) ?
2562 "RX" : "TX");
2563 seq_printf(s, "\tinterface: %s\n",
2564 rvu_dbg_get_intf_name(iter->intf));
2565 seq_printf(s, "\tmcam entry: %d\n", iter->entry);
2566
2567 rvu_dbg_npc_mcam_show_flows(s, iter);
2568 if (is_npc_intf_rx(iter->intf)) {
2569 target = iter->rx_action.pf_func;
2570 pf = (target >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
2571 seq_printf(s, "\tForward to: PF%d ", pf);
2572
2573 if (target & RVU_PFVF_FUNC_MASK) {
2574 vf = (target & RVU_PFVF_FUNC_MASK) - 1;
2575 seq_printf(s, "VF%d", vf);
2576 }
2577 seq_puts(s, "\n");
2578 seq_printf(s, "\tchannel: 0x%x\n", iter->chan);
2579 seq_printf(s, "\tchannel_mask: 0x%x\n", iter->chan_mask);
2580 }
2581
2582 rvu_dbg_npc_mcam_show_action(s, iter);
2583
2584 enabled = is_mcam_entry_enabled(rvu, mcam, blkaddr, iter->entry);
2585 seq_printf(s, "\tenabled: %s\n", enabled ? "yes" : "no");
2586
2587 if (!iter->has_cntr)
2588 continue;
2589 seq_printf(s, "\tcounter: %d\n", iter->cntr);
2590
2591 hits = rvu_read64(rvu, blkaddr, NPC_AF_MATCH_STATX(iter->cntr));
2592 seq_printf(s, "\thits: %lld\n", hits);
2593 }
2594 mutex_unlock(&mcam->lock);
2595
2596 return 0;
2597}
2598
2599RVU_DEBUG_SEQ_FOPS(npc_mcam_rules, npc_mcam_show_rules, NULL);
2600
2601static void rvu_dbg_npc_init(struct rvu *rvu)
2602{
2603 rvu->rvu_dbg.npc = debugfs_create_dir("npc", rvu->rvu_dbg.root);
2604
2605 debugfs_create_file("mcam_info", 0444, rvu->rvu_dbg.npc, rvu,
2606 &rvu_dbg_npc_mcam_info_fops);
2607 debugfs_create_file("mcam_rules", 0444, rvu->rvu_dbg.npc, rvu,
2608 &rvu_dbg_npc_mcam_rules_fops);
2609 debugfs_create_file("rx_miss_act_stats", 0444, rvu->rvu_dbg.npc, rvu,
2610 &rvu_dbg_npc_rx_miss_act_fops);
2611}
2612
2613static int cpt_eng_sts_display(struct seq_file *filp, u8 eng_type)
2614{
2615 struct cpt_ctx *ctx = filp->private;
2616 u64 busy_sts = 0, free_sts = 0;
2617 u32 e_min = 0, e_max = 0, e, i;
2618 u16 max_ses, max_ies, max_aes;
2619 struct rvu *rvu = ctx->rvu;
2620 int blkaddr = ctx->blkaddr;
2621 u64 reg;
2622
2623 reg = rvu_read64(rvu, blkaddr, CPT_AF_CONSTANTS1);
2624 max_ses = reg & 0xffff;
2625 max_ies = (reg >> 16) & 0xffff;
2626 max_aes = (reg >> 32) & 0xffff;
2627
2628 switch (eng_type) {
2629 case CPT_AE_TYPE:
2630 e_min = max_ses + max_ies;
2631 e_max = max_ses + max_ies + max_aes;
2632 break;
2633 case CPT_SE_TYPE:
2634 e_min = 0;
2635 e_max = max_ses;
2636 break;
2637 case CPT_IE_TYPE:
2638 e_min = max_ses;
2639 e_max = max_ses + max_ies;
2640 break;
2641 default:
2642 return -EINVAL;
2643 }
2644
2645 for (e = e_min, i = 0; e < e_max; e++, i++) {
2646 reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_STS(e));
2647 if (reg & 0x1)
2648 busy_sts |= 1ULL << i;
2649
2650 if (reg & 0x2)
2651 free_sts |= 1ULL << i;
2652 }
2653 seq_printf(filp, "FREE STS : 0x%016llx\n", free_sts);
2654 seq_printf(filp, "BUSY STS : 0x%016llx\n", busy_sts);
2655
2656 return 0;
2657}
2658
2659static int rvu_dbg_cpt_ae_sts_display(struct seq_file *filp, void *unused)
2660{
2661 return cpt_eng_sts_display(filp, CPT_AE_TYPE);
2662}
2663
2664RVU_DEBUG_SEQ_FOPS(cpt_ae_sts, cpt_ae_sts_display, NULL);
2665
2666static int rvu_dbg_cpt_se_sts_display(struct seq_file *filp, void *unused)
2667{
2668 return cpt_eng_sts_display(filp, CPT_SE_TYPE);
2669}
2670
2671RVU_DEBUG_SEQ_FOPS(cpt_se_sts, cpt_se_sts_display, NULL);
2672
2673static int rvu_dbg_cpt_ie_sts_display(struct seq_file *filp, void *unused)
2674{
2675 return cpt_eng_sts_display(filp, CPT_IE_TYPE);
2676}
2677
2678RVU_DEBUG_SEQ_FOPS(cpt_ie_sts, cpt_ie_sts_display, NULL);
2679
2680static int rvu_dbg_cpt_engines_info_display(struct seq_file *filp, void *unused)
2681{
2682 struct cpt_ctx *ctx = filp->private;
2683 u16 max_ses, max_ies, max_aes;
2684 struct rvu *rvu = ctx->rvu;
2685 int blkaddr = ctx->blkaddr;
2686 u32 e_max, e;
2687 u64 reg;
2688
2689 reg = rvu_read64(rvu, blkaddr, CPT_AF_CONSTANTS1);
2690 max_ses = reg & 0xffff;
2691 max_ies = (reg >> 16) & 0xffff;
2692 max_aes = (reg >> 32) & 0xffff;
2693
2694 e_max = max_ses + max_ies + max_aes;
2695
2696 seq_puts(filp, "===========================================\n");
2697 for (e = 0; e < e_max; e++) {
2698 reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_CTL2(e));
2699 seq_printf(filp, "CPT Engine[%u] Group Enable 0x%02llx\n", e,
2700 reg & 0xff);
2701 reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_ACTIVE(e));
2702 seq_printf(filp, "CPT Engine[%u] Active Info 0x%llx\n", e,
2703 reg);
2704 reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_CTL(e));
2705 seq_printf(filp, "CPT Engine[%u] Control 0x%llx\n", e,
2706 reg);
2707 seq_puts(filp, "===========================================\n");
2708 }
2709 return 0;
2710}
2711
2712RVU_DEBUG_SEQ_FOPS(cpt_engines_info, cpt_engines_info_display, NULL);
2713
2714static int rvu_dbg_cpt_lfs_info_display(struct seq_file *filp, void *unused)
2715{
2716 struct cpt_ctx *ctx = filp->private;
2717 int blkaddr = ctx->blkaddr;
2718 struct rvu *rvu = ctx->rvu;
2719 struct rvu_block *block;
2720 struct rvu_hwinfo *hw;
2721 u64 reg;
2722 u32 lf;
2723
2724 hw = rvu->hw;
2725 block = &hw->block[blkaddr];
2726 if (!block->lf.bmap)
2727 return -ENODEV;
2728
2729 seq_puts(filp, "===========================================\n");
2730 for (lf = 0; lf < block->lf.max; lf++) {
2731 reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_CTL(lf));
2732 seq_printf(filp, "CPT Lf[%u] CTL 0x%llx\n", lf, reg);
2733 reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_CTL2(lf));
2734 seq_printf(filp, "CPT Lf[%u] CTL2 0x%llx\n", lf, reg);
2735 reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_PTR_CTL(lf));
2736 seq_printf(filp, "CPT Lf[%u] PTR_CTL 0x%llx\n", lf, reg);
2737 reg = rvu_read64(rvu, blkaddr, block->lfcfg_reg |
2738 (lf << block->lfshift));
2739 seq_printf(filp, "CPT Lf[%u] CFG 0x%llx\n", lf, reg);
2740 seq_puts(filp, "===========================================\n");
2741 }
2742 return 0;
2743}
2744
2745RVU_DEBUG_SEQ_FOPS(cpt_lfs_info, cpt_lfs_info_display, NULL);
2746
2747static int rvu_dbg_cpt_err_info_display(struct seq_file *filp, void *unused)
2748{
2749 struct cpt_ctx *ctx = filp->private;
2750 struct rvu *rvu = ctx->rvu;
2751 int blkaddr = ctx->blkaddr;
2752 u64 reg0, reg1;
2753
2754 reg0 = rvu_read64(rvu, blkaddr, CPT_AF_FLTX_INT(0));
2755 reg1 = rvu_read64(rvu, blkaddr, CPT_AF_FLTX_INT(1));
2756 seq_printf(filp, "CPT_AF_FLTX_INT: 0x%llx 0x%llx\n", reg0, reg1);
2757 reg0 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_EXE(0));
2758 reg1 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_EXE(1));
2759 seq_printf(filp, "CPT_AF_PSNX_EXE: 0x%llx 0x%llx\n", reg0, reg1);
2760 reg0 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_LF(0));
2761 seq_printf(filp, "CPT_AF_PSNX_LF: 0x%llx\n", reg0);
2762 reg0 = rvu_read64(rvu, blkaddr, CPT_AF_RVU_INT);
2763 seq_printf(filp, "CPT_AF_RVU_INT: 0x%llx\n", reg0);
2764 reg0 = rvu_read64(rvu, blkaddr, CPT_AF_RAS_INT);
2765 seq_printf(filp, "CPT_AF_RAS_INT: 0x%llx\n", reg0);
2766 reg0 = rvu_read64(rvu, blkaddr, CPT_AF_EXE_ERR_INFO);
2767 seq_printf(filp, "CPT_AF_EXE_ERR_INFO: 0x%llx\n", reg0);
2768
2769 return 0;
2770}
2771
2772RVU_DEBUG_SEQ_FOPS(cpt_err_info, cpt_err_info_display, NULL);
2773
2774static int rvu_dbg_cpt_pc_display(struct seq_file *filp, void *unused)
2775{
2776 struct cpt_ctx *ctx = filp->private;
2777 struct rvu *rvu = ctx->rvu;
2778 int blkaddr = ctx->blkaddr;
2779 u64 reg;
2780
2781 reg = rvu_read64(rvu, blkaddr, CPT_AF_INST_REQ_PC);
2782 seq_printf(filp, "CPT instruction requests %llu\n", reg);
2783 reg = rvu_read64(rvu, blkaddr, CPT_AF_INST_LATENCY_PC);
2784 seq_printf(filp, "CPT instruction latency %llu\n", reg);
2785 reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_REQ_PC);
2786 seq_printf(filp, "CPT NCB read requests %llu\n", reg);
2787 reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_LATENCY_PC);
2788 seq_printf(filp, "CPT NCB read latency %llu\n", reg);
2789 reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_UC_PC);
2790 seq_printf(filp, "CPT read requests caused by UC fills %llu\n", reg);
2791 reg = rvu_read64(rvu, blkaddr, CPT_AF_ACTIVE_CYCLES_PC);
2792 seq_printf(filp, "CPT active cycles pc %llu\n", reg);
2793 reg = rvu_read64(rvu, blkaddr, CPT_AF_CPTCLK_CNT);
2794 seq_printf(filp, "CPT clock count pc %llu\n", reg);
2795
2796 return 0;
2797}
2798
2799RVU_DEBUG_SEQ_FOPS(cpt_pc, cpt_pc_display, NULL);
2800
2801static void rvu_dbg_cpt_init(struct rvu *rvu, int blkaddr)
2802{
2803 struct cpt_ctx *ctx;
2804
2805 if (!is_block_implemented(rvu->hw, blkaddr))
2806 return;
2807
2808 if (blkaddr == BLKADDR_CPT0) {
2809 rvu->rvu_dbg.cpt = debugfs_create_dir("cpt", rvu->rvu_dbg.root);
2810 ctx = &rvu->rvu_dbg.cpt_ctx[0];
2811 ctx->blkaddr = BLKADDR_CPT0;
2812 ctx->rvu = rvu;
2813 } else {
2814 rvu->rvu_dbg.cpt = debugfs_create_dir("cpt1",
2815 rvu->rvu_dbg.root);
2816 ctx = &rvu->rvu_dbg.cpt_ctx[1];
2817 ctx->blkaddr = BLKADDR_CPT1;
2818 ctx->rvu = rvu;
2819 }
2820
2821 debugfs_create_file("cpt_pc", 0600, rvu->rvu_dbg.cpt, ctx,
2822 &rvu_dbg_cpt_pc_fops);
2823 debugfs_create_file("cpt_ae_sts", 0600, rvu->rvu_dbg.cpt, ctx,
2824 &rvu_dbg_cpt_ae_sts_fops);
2825 debugfs_create_file("cpt_se_sts", 0600, rvu->rvu_dbg.cpt, ctx,
2826 &rvu_dbg_cpt_se_sts_fops);
2827 debugfs_create_file("cpt_ie_sts", 0600, rvu->rvu_dbg.cpt, ctx,
2828 &rvu_dbg_cpt_ie_sts_fops);
2829 debugfs_create_file("cpt_engines_info", 0600, rvu->rvu_dbg.cpt, ctx,
2830 &rvu_dbg_cpt_engines_info_fops);
2831 debugfs_create_file("cpt_lfs_info", 0600, rvu->rvu_dbg.cpt, ctx,
2832 &rvu_dbg_cpt_lfs_info_fops);
2833 debugfs_create_file("cpt_err_info", 0600, rvu->rvu_dbg.cpt, ctx,
2834 &rvu_dbg_cpt_err_info_fops);
2835}
2836
2837static const char *rvu_get_dbg_dir_name(struct rvu *rvu)
2838{
2839 if (!is_rvu_otx2(rvu))
2840 return "cn10k";
2841 else
2842 return "octeontx2";
2843}
2844
2845void rvu_dbg_init(struct rvu *rvu)
2846{
2847 rvu->rvu_dbg.root = debugfs_create_dir(rvu_get_dbg_dir_name(rvu), NULL);
2848
2849 debugfs_create_file("rsrc_alloc", 0444, rvu->rvu_dbg.root, rvu,
2850 &rvu_dbg_rsrc_status_fops);
2851
2852 if (!is_rvu_otx2(rvu))
2853 debugfs_create_file("lmtst_map_table", 0444, rvu->rvu_dbg.root,
2854 rvu, &rvu_dbg_lmtst_map_table_fops);
2855
2856 if (!cgx_get_cgxcnt_max())
2857 goto create;
2858
2859 if (is_rvu_otx2(rvu))
2860 debugfs_create_file("rvu_pf_cgx_map", 0444, rvu->rvu_dbg.root,
2861 rvu, &rvu_dbg_rvu_pf_cgx_map_fops);
2862 else
2863 debugfs_create_file("rvu_pf_rpm_map", 0444, rvu->rvu_dbg.root,
2864 rvu, &rvu_dbg_rvu_pf_cgx_map_fops);
2865
2866create:
2867 rvu_dbg_npa_init(rvu);
2868 rvu_dbg_nix_init(rvu, BLKADDR_NIX0);
2869
2870 rvu_dbg_nix_init(rvu, BLKADDR_NIX1);
2871 rvu_dbg_cgx_init(rvu);
2872 rvu_dbg_npc_init(rvu);
2873 rvu_dbg_cpt_init(rvu, BLKADDR_CPT0);
2874 rvu_dbg_cpt_init(rvu, BLKADDR_CPT1);
2875}
2876
2877void rvu_dbg_exit(struct rvu *rvu)
2878{
2879 debugfs_remove_recursive(rvu->rvu_dbg.root);
2880}
2881
2882#endif
2883