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