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