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