123205e6dSChristina Jacob // SPDX-License-Identifier: GPL-2.0 223205e6dSChristina Jacob /* Marvell OcteonTx2 RVU Admin Function driver 323205e6dSChristina Jacob * 423205e6dSChristina Jacob * Copyright (C) 2019 Marvell International Ltd. 523205e6dSChristina Jacob * 623205e6dSChristina Jacob * This program is free software; you can redistribute it and/or modify 723205e6dSChristina Jacob * it under the terms of the GNU General Public License version 2 as 823205e6dSChristina Jacob * published by the Free Software Foundation. 923205e6dSChristina Jacob */ 1023205e6dSChristina Jacob 1123205e6dSChristina Jacob #ifdef CONFIG_DEBUG_FS 1223205e6dSChristina Jacob 1323205e6dSChristina Jacob #include <linux/fs.h> 1423205e6dSChristina Jacob #include <linux/debugfs.h> 1523205e6dSChristina Jacob #include <linux/module.h> 1623205e6dSChristina Jacob #include <linux/pci.h> 1723205e6dSChristina Jacob 1823205e6dSChristina Jacob #include "rvu_struct.h" 1923205e6dSChristina Jacob #include "rvu_reg.h" 2023205e6dSChristina Jacob #include "rvu.h" 21c57211b5SPrakash Brahmajyosyula #include "cgx.h" 2291c6945eSHariprasad Kelam #include "lmac_common.h" 23e07fb507SSunil Goutham #include "npc.h" 2423205e6dSChristina Jacob 2523205e6dSChristina Jacob #define DEBUGFS_DIR_NAME "octeontx2" 2623205e6dSChristina Jacob 27c57211b5SPrakash Brahmajyosyula enum { 28c57211b5SPrakash Brahmajyosyula CGX_STAT0, 29c57211b5SPrakash Brahmajyosyula CGX_STAT1, 30c57211b5SPrakash Brahmajyosyula CGX_STAT2, 31c57211b5SPrakash Brahmajyosyula CGX_STAT3, 32c57211b5SPrakash Brahmajyosyula CGX_STAT4, 33c57211b5SPrakash Brahmajyosyula CGX_STAT5, 34c57211b5SPrakash Brahmajyosyula CGX_STAT6, 35c57211b5SPrakash Brahmajyosyula CGX_STAT7, 36c57211b5SPrakash Brahmajyosyula CGX_STAT8, 37c57211b5SPrakash Brahmajyosyula CGX_STAT9, 38c57211b5SPrakash Brahmajyosyula CGX_STAT10, 39c57211b5SPrakash Brahmajyosyula CGX_STAT11, 40c57211b5SPrakash Brahmajyosyula CGX_STAT12, 41c57211b5SPrakash Brahmajyosyula CGX_STAT13, 42c57211b5SPrakash Brahmajyosyula CGX_STAT14, 43c57211b5SPrakash Brahmajyosyula CGX_STAT15, 44c57211b5SPrakash Brahmajyosyula CGX_STAT16, 45c57211b5SPrakash Brahmajyosyula CGX_STAT17, 46c57211b5SPrakash Brahmajyosyula CGX_STAT18, 47c57211b5SPrakash Brahmajyosyula }; 48c57211b5SPrakash Brahmajyosyula 49f967488dSLinu Cherian /* NIX TX stats */ 50f967488dSLinu Cherian enum nix_stat_lf_tx { 51f967488dSLinu Cherian TX_UCAST = 0x0, 52f967488dSLinu Cherian TX_BCAST = 0x1, 53f967488dSLinu Cherian TX_MCAST = 0x2, 54f967488dSLinu Cherian TX_DROP = 0x3, 55f967488dSLinu Cherian TX_OCTS = 0x4, 56f967488dSLinu Cherian TX_STATS_ENUM_LAST, 57f967488dSLinu Cherian }; 58f967488dSLinu Cherian 59f967488dSLinu Cherian /* NIX RX stats */ 60f967488dSLinu Cherian enum nix_stat_lf_rx { 61f967488dSLinu Cherian RX_OCTS = 0x0, 62f967488dSLinu Cherian RX_UCAST = 0x1, 63f967488dSLinu Cherian RX_BCAST = 0x2, 64f967488dSLinu Cherian RX_MCAST = 0x3, 65f967488dSLinu Cherian RX_DROP = 0x4, 66f967488dSLinu Cherian RX_DROP_OCTS = 0x5, 67f967488dSLinu Cherian RX_FCS = 0x6, 68f967488dSLinu Cherian RX_ERR = 0x7, 69f967488dSLinu Cherian RX_DRP_BCAST = 0x8, 70f967488dSLinu Cherian RX_DRP_MCAST = 0x9, 71f967488dSLinu Cherian RX_DRP_L3BCAST = 0xa, 72f967488dSLinu Cherian RX_DRP_L3MCAST = 0xb, 73f967488dSLinu Cherian RX_STATS_ENUM_LAST, 74f967488dSLinu Cherian }; 75f967488dSLinu Cherian 76c57211b5SPrakash Brahmajyosyula static char *cgx_rx_stats_fields[] = { 77c57211b5SPrakash Brahmajyosyula [CGX_STAT0] = "Received packets", 78c57211b5SPrakash Brahmajyosyula [CGX_STAT1] = "Octets of received packets", 79c57211b5SPrakash Brahmajyosyula [CGX_STAT2] = "Received PAUSE packets", 80c57211b5SPrakash Brahmajyosyula [CGX_STAT3] = "Received PAUSE and control packets", 81c57211b5SPrakash Brahmajyosyula [CGX_STAT4] = "Filtered DMAC0 (NIX-bound) packets", 82c57211b5SPrakash Brahmajyosyula [CGX_STAT5] = "Filtered DMAC0 (NIX-bound) octets", 83c57211b5SPrakash Brahmajyosyula [CGX_STAT6] = "Packets dropped due to RX FIFO full", 84c57211b5SPrakash Brahmajyosyula [CGX_STAT7] = "Octets dropped due to RX FIFO full", 85c57211b5SPrakash Brahmajyosyula [CGX_STAT8] = "Error packets", 86c57211b5SPrakash Brahmajyosyula [CGX_STAT9] = "Filtered DMAC1 (NCSI-bound) packets", 87c57211b5SPrakash Brahmajyosyula [CGX_STAT10] = "Filtered DMAC1 (NCSI-bound) octets", 88c57211b5SPrakash Brahmajyosyula [CGX_STAT11] = "NCSI-bound packets dropped", 89c57211b5SPrakash Brahmajyosyula [CGX_STAT12] = "NCSI-bound octets dropped", 90c57211b5SPrakash Brahmajyosyula }; 91c57211b5SPrakash Brahmajyosyula 92c57211b5SPrakash Brahmajyosyula static char *cgx_tx_stats_fields[] = { 93c57211b5SPrakash Brahmajyosyula [CGX_STAT0] = "Packets dropped due to excessive collisions", 94c57211b5SPrakash Brahmajyosyula [CGX_STAT1] = "Packets dropped due to excessive deferral", 95c57211b5SPrakash Brahmajyosyula [CGX_STAT2] = "Multiple collisions before successful transmission", 96c57211b5SPrakash Brahmajyosyula [CGX_STAT3] = "Single collisions before successful transmission", 97c57211b5SPrakash Brahmajyosyula [CGX_STAT4] = "Total octets sent on the interface", 98c57211b5SPrakash Brahmajyosyula [CGX_STAT5] = "Total frames sent on the interface", 99c57211b5SPrakash Brahmajyosyula [CGX_STAT6] = "Packets sent with an octet count < 64", 100c57211b5SPrakash Brahmajyosyula [CGX_STAT7] = "Packets sent with an octet count == 64", 101c57211b5SPrakash Brahmajyosyula [CGX_STAT8] = "Packets sent with an octet count of 65–127", 102c57211b5SPrakash Brahmajyosyula [CGX_STAT9] = "Packets sent with an octet count of 128-255", 103c57211b5SPrakash Brahmajyosyula [CGX_STAT10] = "Packets sent with an octet count of 256-511", 104c57211b5SPrakash Brahmajyosyula [CGX_STAT11] = "Packets sent with an octet count of 512-1023", 105c57211b5SPrakash Brahmajyosyula [CGX_STAT12] = "Packets sent with an octet count of 1024-1518", 106c57211b5SPrakash Brahmajyosyula [CGX_STAT13] = "Packets sent with an octet count of > 1518", 107c57211b5SPrakash Brahmajyosyula [CGX_STAT14] = "Packets sent to a broadcast DMAC", 108c57211b5SPrakash Brahmajyosyula [CGX_STAT15] = "Packets sent to the multicast DMAC", 109c57211b5SPrakash Brahmajyosyula [CGX_STAT16] = "Transmit underflow and were truncated", 110c57211b5SPrakash Brahmajyosyula [CGX_STAT17] = "Control/PAUSE packets sent", 111c57211b5SPrakash Brahmajyosyula }; 112c57211b5SPrakash Brahmajyosyula 113ce7a6c31SHariprasad Kelam static char *rpm_rx_stats_fields[] = { 114ce7a6c31SHariprasad Kelam "Octets of received packets", 115ce7a6c31SHariprasad Kelam "Octets of received packets with out error", 116ce7a6c31SHariprasad Kelam "Received packets with alignment errors", 117ce7a6c31SHariprasad Kelam "Control/PAUSE packets received", 118ce7a6c31SHariprasad Kelam "Packets received with Frame too long Errors", 119ce7a6c31SHariprasad Kelam "Packets received with a1nrange length Errors", 120ce7a6c31SHariprasad Kelam "Received packets", 121ce7a6c31SHariprasad Kelam "Packets received with FrameCheckSequenceErrors", 122ce7a6c31SHariprasad Kelam "Packets received with VLAN header", 123ce7a6c31SHariprasad Kelam "Error packets", 124a6e0ee35SColin Ian King "Packets received with unicast DMAC", 125ce7a6c31SHariprasad Kelam "Packets received with multicast DMAC", 126ce7a6c31SHariprasad Kelam "Packets received with broadcast DMAC", 127ce7a6c31SHariprasad Kelam "Dropped packets", 128ce7a6c31SHariprasad Kelam "Total frames received on interface", 129ce7a6c31SHariprasad Kelam "Packets received with an octet count < 64", 130ce7a6c31SHariprasad Kelam "Packets received with an octet count == 64", 131ce7a6c31SHariprasad Kelam "Packets received with an octet count of 65â127", 132ce7a6c31SHariprasad Kelam "Packets received with an octet count of 128-255", 133ce7a6c31SHariprasad Kelam "Packets received with an octet count of 256-511", 134ce7a6c31SHariprasad Kelam "Packets received with an octet count of 512-1023", 135ce7a6c31SHariprasad Kelam "Packets received with an octet count of 1024-1518", 136ce7a6c31SHariprasad Kelam "Packets received with an octet count of > 1518", 137ce7a6c31SHariprasad Kelam "Oversized Packets", 138ce7a6c31SHariprasad Kelam "Jabber Packets", 139ce7a6c31SHariprasad Kelam "Fragmented Packets", 140ce7a6c31SHariprasad Kelam "CBFC(class based flow control) pause frames received for class 0", 141ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 1", 142ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 2", 143ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 3", 144ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 4", 145ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 5", 146ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 6", 147ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 7", 148ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 8", 149ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 9", 150ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 10", 151ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 11", 152ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 12", 153ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 13", 154ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 14", 155ce7a6c31SHariprasad Kelam "CBFC pause frames received for class 15", 156ce7a6c31SHariprasad Kelam "MAC control packets received", 157ce7a6c31SHariprasad Kelam }; 158ce7a6c31SHariprasad Kelam 159ce7a6c31SHariprasad Kelam static char *rpm_tx_stats_fields[] = { 160ce7a6c31SHariprasad Kelam "Total octets sent on the interface", 161ce7a6c31SHariprasad Kelam "Total octets transmitted OK", 162ce7a6c31SHariprasad Kelam "Control/Pause frames sent", 163ce7a6c31SHariprasad Kelam "Total frames transmitted OK", 164ce7a6c31SHariprasad Kelam "Total frames sent with VLAN header", 165ce7a6c31SHariprasad Kelam "Error Packets", 166ce7a6c31SHariprasad Kelam "Packets sent to unicast DMAC", 167ce7a6c31SHariprasad Kelam "Packets sent to the multicast DMAC", 168ce7a6c31SHariprasad Kelam "Packets sent to a broadcast DMAC", 169ce7a6c31SHariprasad Kelam "Packets sent with an octet count == 64", 170ce7a6c31SHariprasad Kelam "Packets sent with an octet count of 65â127", 171ce7a6c31SHariprasad Kelam "Packets sent with an octet count of 128-255", 172ce7a6c31SHariprasad Kelam "Packets sent with an octet count of 256-511", 173ce7a6c31SHariprasad Kelam "Packets sent with an octet count of 512-1023", 174ce7a6c31SHariprasad Kelam "Packets sent with an octet count of 1024-1518", 175ce7a6c31SHariprasad Kelam "Packets sent with an octet count of > 1518", 176ce7a6c31SHariprasad Kelam "CBFC(class based flow control) pause frames transmitted for class 0", 177ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 1", 178ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 2", 179ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 3", 180ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 4", 181ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 5", 182ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 6", 183ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 7", 184ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 8", 185ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 9", 186ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 10", 187ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 11", 188ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 12", 189ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 13", 190ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 14", 191ce7a6c31SHariprasad Kelam "CBFC pause frames transmitted for class 15", 192ce7a6c31SHariprasad Kelam "MAC control packets sent", 193ce7a6c31SHariprasad Kelam "Total frames sent on the interface" 194ce7a6c31SHariprasad Kelam }; 195ce7a6c31SHariprasad Kelam 19676638a2eSSrujana Challa enum cpt_eng_type { 19776638a2eSSrujana Challa CPT_AE_TYPE = 1, 19876638a2eSSrujana Challa CPT_SE_TYPE = 2, 19976638a2eSSrujana Challa CPT_IE_TYPE = 3, 20076638a2eSSrujana Challa }; 20176638a2eSSrujana Challa 202c5a797e0SPrakash Brahmajyosyula #define NDC_MAX_BANK(rvu, blk_addr) (rvu_read64(rvu, \ 203c5a797e0SPrakash Brahmajyosyula blk_addr, NDC_AF_CONST) & 0xFF) 204c5a797e0SPrakash Brahmajyosyula 20523205e6dSChristina Jacob #define rvu_dbg_NULL NULL 2068756828aSChristina Jacob #define rvu_dbg_open_NULL NULL 2078756828aSChristina Jacob 2088756828aSChristina Jacob #define RVU_DEBUG_SEQ_FOPS(name, read_op, write_op) \ 2098756828aSChristina Jacob static int rvu_dbg_open_##name(struct inode *inode, struct file *file) \ 2108756828aSChristina Jacob { \ 2118756828aSChristina Jacob return single_open(file, rvu_dbg_##read_op, inode->i_private); \ 2128756828aSChristina Jacob } \ 2138756828aSChristina Jacob static const struct file_operations rvu_dbg_##name##_fops = { \ 2148756828aSChristina Jacob .owner = THIS_MODULE, \ 2158756828aSChristina Jacob .open = rvu_dbg_open_##name, \ 2168756828aSChristina Jacob .read = seq_read, \ 2178756828aSChristina Jacob .write = rvu_dbg_##write_op, \ 2188756828aSChristina Jacob .llseek = seq_lseek, \ 2198756828aSChristina Jacob .release = single_release, \ 2208756828aSChristina Jacob } 22123205e6dSChristina Jacob 22223205e6dSChristina Jacob #define RVU_DEBUG_FOPS(name, read_op, write_op) \ 22323205e6dSChristina Jacob static const struct file_operations rvu_dbg_##name##_fops = { \ 22423205e6dSChristina Jacob .owner = THIS_MODULE, \ 22523205e6dSChristina Jacob .open = simple_open, \ 22623205e6dSChristina Jacob .read = rvu_dbg_##read_op, \ 22723205e6dSChristina Jacob .write = rvu_dbg_##write_op \ 22823205e6dSChristina Jacob } 22923205e6dSChristina Jacob 23002e202c3SPrakash Brahmajyosyula static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf); 23102e202c3SPrakash Brahmajyosyula 23223205e6dSChristina Jacob /* Dumps current provisioning status of all RVU block LFs */ 23323205e6dSChristina Jacob static ssize_t rvu_dbg_rsrc_attach_status(struct file *filp, 23423205e6dSChristina Jacob char __user *buffer, 23523205e6dSChristina Jacob size_t count, loff_t *ppos) 23623205e6dSChristina Jacob { 23723205e6dSChristina Jacob int index, off = 0, flag = 0, go_back = 0, off_prev; 23823205e6dSChristina Jacob struct rvu *rvu = filp->private_data; 23923205e6dSChristina Jacob int lf, pf, vf, pcifunc; 24023205e6dSChristina Jacob struct rvu_block block; 24123205e6dSChristina Jacob int bytes_not_copied; 24223205e6dSChristina Jacob int buf_size = 2048; 24323205e6dSChristina Jacob char *buf; 24423205e6dSChristina Jacob 24523205e6dSChristina Jacob /* don't allow partial reads */ 24623205e6dSChristina Jacob if (*ppos != 0) 24723205e6dSChristina Jacob return 0; 24823205e6dSChristina Jacob 24923205e6dSChristina Jacob buf = kzalloc(buf_size, GFP_KERNEL); 25023205e6dSChristina Jacob if (!buf) 25123205e6dSChristina Jacob return -ENOSPC; 25223205e6dSChristina Jacob off += scnprintf(&buf[off], buf_size - 1 - off, "\npcifunc\t\t"); 25323205e6dSChristina Jacob for (index = 0; index < BLK_COUNT; index++) 25423205e6dSChristina Jacob if (strlen(rvu->hw->block[index].name)) 25523205e6dSChristina Jacob off += scnprintf(&buf[off], buf_size - 1 - off, 25623205e6dSChristina Jacob "%*s\t", (index - 1) * 2, 25723205e6dSChristina Jacob rvu->hw->block[index].name); 25823205e6dSChristina Jacob off += scnprintf(&buf[off], buf_size - 1 - off, "\n"); 25923205e6dSChristina Jacob for (pf = 0; pf < rvu->hw->total_pfs; pf++) { 26023205e6dSChristina Jacob for (vf = 0; vf <= rvu->hw->total_vfs; vf++) { 26123205e6dSChristina Jacob pcifunc = pf << 10 | vf; 26223205e6dSChristina Jacob if (!pcifunc) 26323205e6dSChristina Jacob continue; 26423205e6dSChristina Jacob 26523205e6dSChristina Jacob if (vf) { 26623205e6dSChristina Jacob go_back = scnprintf(&buf[off], 26723205e6dSChristina Jacob buf_size - 1 - off, 26823205e6dSChristina Jacob "PF%d:VF%d\t\t", pf, 26923205e6dSChristina Jacob vf - 1); 27023205e6dSChristina Jacob } else { 27123205e6dSChristina Jacob go_back = scnprintf(&buf[off], 27223205e6dSChristina Jacob buf_size - 1 - off, 27323205e6dSChristina Jacob "PF%d\t\t", pf); 27423205e6dSChristina Jacob } 27523205e6dSChristina Jacob 27623205e6dSChristina Jacob off += go_back; 27723205e6dSChristina Jacob for (index = 0; index < BLKTYPE_MAX; index++) { 27823205e6dSChristina Jacob block = rvu->hw->block[index]; 27923205e6dSChristina Jacob if (!strlen(block.name)) 28023205e6dSChristina Jacob continue; 28123205e6dSChristina Jacob off_prev = off; 28223205e6dSChristina Jacob for (lf = 0; lf < block.lf.max; lf++) { 28323205e6dSChristina Jacob if (block.fn_map[lf] != pcifunc) 28423205e6dSChristina Jacob continue; 28523205e6dSChristina Jacob flag = 1; 28623205e6dSChristina Jacob off += scnprintf(&buf[off], buf_size - 1 28723205e6dSChristina Jacob - off, "%3d,", lf); 28823205e6dSChristina Jacob } 28923205e6dSChristina Jacob if (flag && off_prev != off) 29023205e6dSChristina Jacob off--; 29123205e6dSChristina Jacob else 29223205e6dSChristina Jacob go_back++; 29323205e6dSChristina Jacob off += scnprintf(&buf[off], buf_size - 1 - off, 29423205e6dSChristina Jacob "\t"); 29523205e6dSChristina Jacob } 29623205e6dSChristina Jacob if (!flag) 29723205e6dSChristina Jacob off -= go_back; 29823205e6dSChristina Jacob else 29923205e6dSChristina Jacob flag = 0; 30023205e6dSChristina Jacob off--; 30123205e6dSChristina Jacob off += scnprintf(&buf[off], buf_size - 1 - off, "\n"); 30223205e6dSChristina Jacob } 30323205e6dSChristina Jacob } 30423205e6dSChristina Jacob 30523205e6dSChristina Jacob bytes_not_copied = copy_to_user(buffer, buf, off); 30623205e6dSChristina Jacob kfree(buf); 30723205e6dSChristina Jacob 30823205e6dSChristina Jacob if (bytes_not_copied) 30923205e6dSChristina Jacob return -EFAULT; 31023205e6dSChristina Jacob 31123205e6dSChristina Jacob *ppos = off; 31223205e6dSChristina Jacob return off; 31323205e6dSChristina Jacob } 31423205e6dSChristina Jacob 31523205e6dSChristina Jacob RVU_DEBUG_FOPS(rsrc_status, rsrc_attach_status, NULL); 31623205e6dSChristina Jacob 317e2fb3730SRakesh Babu static int rvu_dbg_rvu_pf_cgx_map_display(struct seq_file *filp, void *unused) 318e2fb3730SRakesh Babu { 319e2fb3730SRakesh Babu struct rvu *rvu = filp->private; 320e2fb3730SRakesh Babu struct pci_dev *pdev = NULL; 32191c6945eSHariprasad Kelam struct mac_ops *mac_ops; 32291c6945eSHariprasad Kelam int rvu_def_cgx_id = 0; 323e2fb3730SRakesh Babu char cgx[10], lmac[10]; 324e2fb3730SRakesh Babu struct rvu_pfvf *pfvf; 325e2fb3730SRakesh Babu int pf, domain, blkid; 326e2fb3730SRakesh Babu u8 cgx_id, lmac_id; 327e2fb3730SRakesh Babu u16 pcifunc; 328e2fb3730SRakesh Babu 329e2fb3730SRakesh Babu domain = 2; 33091c6945eSHariprasad Kelam mac_ops = get_mac_ops(rvu_cgx_pdata(rvu_def_cgx_id, rvu)); 33191c6945eSHariprasad Kelam seq_printf(filp, "PCI dev\t\tRVU PF Func\tNIX block\t%s\tLMAC\n", 33291c6945eSHariprasad Kelam mac_ops->name); 333e2fb3730SRakesh Babu for (pf = 0; pf < rvu->hw->total_pfs; pf++) { 334e2fb3730SRakesh Babu if (!is_pf_cgxmapped(rvu, pf)) 335e2fb3730SRakesh Babu continue; 336e2fb3730SRakesh Babu 337e2fb3730SRakesh Babu pdev = pci_get_domain_bus_and_slot(domain, pf + 1, 0); 338e2fb3730SRakesh Babu if (!pdev) 339e2fb3730SRakesh Babu continue; 340e2fb3730SRakesh Babu 341e2fb3730SRakesh Babu cgx[0] = 0; 342e2fb3730SRakesh Babu lmac[0] = 0; 343e2fb3730SRakesh Babu pcifunc = pf << 10; 344e2fb3730SRakesh Babu pfvf = rvu_get_pfvf(rvu, pcifunc); 345e2fb3730SRakesh Babu 346e2fb3730SRakesh Babu if (pfvf->nix_blkaddr == BLKADDR_NIX0) 347e2fb3730SRakesh Babu blkid = 0; 348e2fb3730SRakesh Babu else 349e2fb3730SRakesh Babu blkid = 1; 350e2fb3730SRakesh Babu 351e2fb3730SRakesh Babu rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, 352e2fb3730SRakesh Babu &lmac_id); 35391c6945eSHariprasad Kelam sprintf(cgx, "%s%d", mac_ops->name, cgx_id); 354e2fb3730SRakesh Babu sprintf(lmac, "LMAC%d", lmac_id); 355e2fb3730SRakesh Babu seq_printf(filp, "%s\t0x%x\t\tNIX%d\t\t%s\t%s\n", 356e2fb3730SRakesh Babu dev_name(&pdev->dev), pcifunc, blkid, cgx, lmac); 357e2fb3730SRakesh Babu } 358e2fb3730SRakesh Babu return 0; 359e2fb3730SRakesh Babu } 360e2fb3730SRakesh Babu 361e2fb3730SRakesh Babu RVU_DEBUG_SEQ_FOPS(rvu_pf_cgx_map, rvu_pf_cgx_map_display, NULL); 362e2fb3730SRakesh Babu 3630f3ce484SRakesh Babu static bool rvu_dbg_is_valid_lf(struct rvu *rvu, int blkaddr, int lf, 3648756828aSChristina Jacob u16 *pcifunc) 3658756828aSChristina Jacob { 3668756828aSChristina Jacob struct rvu_block *block; 3678756828aSChristina Jacob struct rvu_hwinfo *hw; 3688756828aSChristina Jacob 3698756828aSChristina Jacob hw = rvu->hw; 3708756828aSChristina Jacob block = &hw->block[blkaddr]; 3718756828aSChristina Jacob 3728756828aSChristina Jacob if (lf < 0 || lf >= block->lf.max) { 3738756828aSChristina Jacob dev_warn(rvu->dev, "Invalid LF: valid range: 0-%d\n", 3748756828aSChristina Jacob block->lf.max - 1); 3758756828aSChristina Jacob return false; 3768756828aSChristina Jacob } 3778756828aSChristina Jacob 3788756828aSChristina Jacob *pcifunc = block->fn_map[lf]; 3798756828aSChristina Jacob if (!*pcifunc) { 3808756828aSChristina Jacob dev_warn(rvu->dev, 3818756828aSChristina Jacob "This LF is not attached to any RVU PFFUNC\n"); 3828756828aSChristina Jacob return false; 3838756828aSChristina Jacob } 3848756828aSChristina Jacob return true; 3858756828aSChristina Jacob } 3868756828aSChristina Jacob 3878756828aSChristina Jacob static void print_npa_qsize(struct seq_file *m, struct rvu_pfvf *pfvf) 3888756828aSChristina Jacob { 3898756828aSChristina Jacob char *buf; 3908756828aSChristina Jacob 3918756828aSChristina Jacob buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 3928756828aSChristina Jacob if (!buf) 3938756828aSChristina Jacob return; 3948756828aSChristina Jacob 3958756828aSChristina Jacob if (!pfvf->aura_ctx) { 3968756828aSChristina Jacob seq_puts(m, "Aura context is not initialized\n"); 3978756828aSChristina Jacob } else { 3988756828aSChristina Jacob bitmap_print_to_pagebuf(false, buf, pfvf->aura_bmap, 3998756828aSChristina Jacob pfvf->aura_ctx->qsize); 4008756828aSChristina Jacob seq_printf(m, "Aura count : %d\n", pfvf->aura_ctx->qsize); 4018756828aSChristina Jacob seq_printf(m, "Aura context ena/dis bitmap : %s\n", buf); 4028756828aSChristina Jacob } 4038756828aSChristina Jacob 4048756828aSChristina Jacob if (!pfvf->pool_ctx) { 4058756828aSChristina Jacob seq_puts(m, "Pool context is not initialized\n"); 4068756828aSChristina Jacob } else { 4078756828aSChristina Jacob bitmap_print_to_pagebuf(false, buf, pfvf->pool_bmap, 4088756828aSChristina Jacob pfvf->pool_ctx->qsize); 4098756828aSChristina Jacob seq_printf(m, "Pool count : %d\n", pfvf->pool_ctx->qsize); 4108756828aSChristina Jacob seq_printf(m, "Pool context ena/dis bitmap : %s\n", buf); 4118756828aSChristina Jacob } 4128756828aSChristina Jacob kfree(buf); 4138756828aSChristina Jacob } 4148756828aSChristina Jacob 4158756828aSChristina Jacob /* The 'qsize' entry dumps current Aura/Pool context Qsize 4168756828aSChristina Jacob * and each context's current enable/disable status in a bitmap. 4178756828aSChristina Jacob */ 4188756828aSChristina Jacob static int rvu_dbg_qsize_display(struct seq_file *filp, void *unsused, 4198756828aSChristina Jacob int blktype) 4208756828aSChristina Jacob { 4218756828aSChristina Jacob void (*print_qsize)(struct seq_file *filp, 4228756828aSChristina Jacob struct rvu_pfvf *pfvf) = NULL; 4230f3ce484SRakesh Babu struct dentry *current_dir; 4248756828aSChristina Jacob struct rvu_pfvf *pfvf; 4258756828aSChristina Jacob struct rvu *rvu; 4268756828aSChristina Jacob int qsize_id; 4278756828aSChristina Jacob u16 pcifunc; 4280f3ce484SRakesh Babu int blkaddr; 4298756828aSChristina Jacob 4308756828aSChristina Jacob rvu = filp->private; 4318756828aSChristina Jacob switch (blktype) { 4328756828aSChristina Jacob case BLKTYPE_NPA: 4338756828aSChristina Jacob qsize_id = rvu->rvu_dbg.npa_qsize_id; 4348756828aSChristina Jacob print_qsize = print_npa_qsize; 4358756828aSChristina Jacob break; 43602e202c3SPrakash Brahmajyosyula 43702e202c3SPrakash Brahmajyosyula case BLKTYPE_NIX: 43802e202c3SPrakash Brahmajyosyula qsize_id = rvu->rvu_dbg.nix_qsize_id; 43902e202c3SPrakash Brahmajyosyula print_qsize = print_nix_qsize; 44002e202c3SPrakash Brahmajyosyula break; 44102e202c3SPrakash Brahmajyosyula 4428756828aSChristina Jacob default: 4438756828aSChristina Jacob return -EINVAL; 4448756828aSChristina Jacob } 4458756828aSChristina Jacob 4460f3ce484SRakesh Babu if (blktype == BLKTYPE_NPA) { 4470f3ce484SRakesh Babu blkaddr = BLKADDR_NPA; 4480f3ce484SRakesh Babu } else { 4490f3ce484SRakesh Babu current_dir = filp->file->f_path.dentry->d_parent; 4500f3ce484SRakesh Babu blkaddr = (!strcmp(current_dir->d_name.name, "nix1") ? 4510f3ce484SRakesh Babu BLKADDR_NIX1 : BLKADDR_NIX0); 4520f3ce484SRakesh Babu } 4530f3ce484SRakesh Babu 4540f3ce484SRakesh Babu if (!rvu_dbg_is_valid_lf(rvu, blkaddr, qsize_id, &pcifunc)) 4558756828aSChristina Jacob return -EINVAL; 4568756828aSChristina Jacob 4578756828aSChristina Jacob pfvf = rvu_get_pfvf(rvu, pcifunc); 4588756828aSChristina Jacob print_qsize(filp, pfvf); 4598756828aSChristina Jacob 4608756828aSChristina Jacob return 0; 4618756828aSChristina Jacob } 4628756828aSChristina Jacob 4638756828aSChristina Jacob static ssize_t rvu_dbg_qsize_write(struct file *filp, 4648756828aSChristina Jacob const char __user *buffer, size_t count, 4658756828aSChristina Jacob loff_t *ppos, int blktype) 4668756828aSChristina Jacob { 4678756828aSChristina Jacob char *blk_string = (blktype == BLKTYPE_NPA) ? "npa" : "nix"; 4688756828aSChristina Jacob struct seq_file *seqfile = filp->private_data; 4698756828aSChristina Jacob char *cmd_buf, *cmd_buf_tmp, *subtoken; 4708756828aSChristina Jacob struct rvu *rvu = seqfile->private; 4710f3ce484SRakesh Babu struct dentry *current_dir; 4720f3ce484SRakesh Babu int blkaddr; 4738756828aSChristina Jacob u16 pcifunc; 4748756828aSChristina Jacob int ret, lf; 4758756828aSChristina Jacob 4768756828aSChristina Jacob cmd_buf = memdup_user(buffer, count); 4778756828aSChristina Jacob if (IS_ERR(cmd_buf)) 4788756828aSChristina Jacob return -ENOMEM; 4798756828aSChristina Jacob 4808756828aSChristina Jacob cmd_buf[count] = '\0'; 4818756828aSChristina Jacob 4828756828aSChristina Jacob cmd_buf_tmp = strchr(cmd_buf, '\n'); 4838756828aSChristina Jacob if (cmd_buf_tmp) { 4848756828aSChristina Jacob *cmd_buf_tmp = '\0'; 4858756828aSChristina Jacob count = cmd_buf_tmp - cmd_buf + 1; 4868756828aSChristina Jacob } 4878756828aSChristina Jacob 4888756828aSChristina Jacob cmd_buf_tmp = cmd_buf; 4898756828aSChristina Jacob subtoken = strsep(&cmd_buf, " "); 4908756828aSChristina Jacob ret = subtoken ? kstrtoint(subtoken, 10, &lf) : -EINVAL; 4918756828aSChristina Jacob if (cmd_buf) 4928756828aSChristina Jacob ret = -EINVAL; 4938756828aSChristina Jacob 4948756828aSChristina Jacob if (!strncmp(subtoken, "help", 4) || ret < 0) { 4958756828aSChristina Jacob dev_info(rvu->dev, "Use echo <%s-lf > qsize\n", blk_string); 4968756828aSChristina Jacob goto qsize_write_done; 4978756828aSChristina Jacob } 4988756828aSChristina Jacob 4990f3ce484SRakesh Babu if (blktype == BLKTYPE_NPA) { 5000f3ce484SRakesh Babu blkaddr = BLKADDR_NPA; 5010f3ce484SRakesh Babu } else { 5020f3ce484SRakesh Babu current_dir = filp->f_path.dentry->d_parent; 5030f3ce484SRakesh Babu blkaddr = (!strcmp(current_dir->d_name.name, "nix1") ? 5040f3ce484SRakesh Babu BLKADDR_NIX1 : BLKADDR_NIX0); 5050f3ce484SRakesh Babu } 5060f3ce484SRakesh Babu 5070f3ce484SRakesh Babu if (!rvu_dbg_is_valid_lf(rvu, blkaddr, lf, &pcifunc)) { 5088756828aSChristina Jacob ret = -EINVAL; 5098756828aSChristina Jacob goto qsize_write_done; 5108756828aSChristina Jacob } 5118756828aSChristina Jacob if (blktype == BLKTYPE_NPA) 5128756828aSChristina Jacob rvu->rvu_dbg.npa_qsize_id = lf; 51302e202c3SPrakash Brahmajyosyula else 51402e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_qsize_id = lf; 5158756828aSChristina Jacob 5168756828aSChristina Jacob qsize_write_done: 5178756828aSChristina Jacob kfree(cmd_buf_tmp); 5188756828aSChristina Jacob return ret ? ret : count; 5198756828aSChristina Jacob } 5208756828aSChristina Jacob 5218756828aSChristina Jacob static ssize_t rvu_dbg_npa_qsize_write(struct file *filp, 5228756828aSChristina Jacob const char __user *buffer, 5238756828aSChristina Jacob size_t count, loff_t *ppos) 5248756828aSChristina Jacob { 5258756828aSChristina Jacob return rvu_dbg_qsize_write(filp, buffer, count, ppos, 5268756828aSChristina Jacob BLKTYPE_NPA); 5278756828aSChristina Jacob } 5288756828aSChristina Jacob 5298756828aSChristina Jacob static int rvu_dbg_npa_qsize_display(struct seq_file *filp, void *unused) 5308756828aSChristina Jacob { 5318756828aSChristina Jacob return rvu_dbg_qsize_display(filp, unused, BLKTYPE_NPA); 5328756828aSChristina Jacob } 5338756828aSChristina Jacob 5348756828aSChristina Jacob RVU_DEBUG_SEQ_FOPS(npa_qsize, npa_qsize_display, npa_qsize_write); 5358756828aSChristina Jacob 5368756828aSChristina Jacob /* Dumps given NPA Aura's context */ 5378756828aSChristina Jacob static void print_npa_aura_ctx(struct seq_file *m, struct npa_aq_enq_rsp *rsp) 5388756828aSChristina Jacob { 5398756828aSChristina Jacob struct npa_aura_s *aura = &rsp->aura; 5403feac505SGeetha sowjanya struct rvu *rvu = m->private; 5418756828aSChristina Jacob 5428756828aSChristina Jacob seq_printf(m, "W0: Pool addr\t\t%llx\n", aura->pool_addr); 5438756828aSChristina Jacob 5448756828aSChristina Jacob seq_printf(m, "W1: ena\t\t\t%d\nW1: pool caching\t%d\n", 5458756828aSChristina Jacob aura->ena, aura->pool_caching); 5468756828aSChristina Jacob seq_printf(m, "W1: pool way mask\t%d\nW1: avg con\t\t%d\n", 5478756828aSChristina Jacob aura->pool_way_mask, aura->avg_con); 5488756828aSChristina Jacob seq_printf(m, "W1: pool drop ena\t%d\nW1: aura drop ena\t%d\n", 5498756828aSChristina Jacob aura->pool_drop_ena, aura->aura_drop_ena); 5508756828aSChristina Jacob seq_printf(m, "W1: bp_ena\t\t%d\nW1: aura drop\t\t%d\n", 5518756828aSChristina Jacob aura->bp_ena, aura->aura_drop); 5528756828aSChristina Jacob seq_printf(m, "W1: aura shift\t\t%d\nW1: avg_level\t\t%d\n", 5538756828aSChristina Jacob aura->shift, aura->avg_level); 5548756828aSChristina Jacob 5558756828aSChristina Jacob seq_printf(m, "W2: count\t\t%llu\nW2: nix0_bpid\t\t%d\nW2: nix1_bpid\t\t%d\n", 5568756828aSChristina Jacob (u64)aura->count, aura->nix0_bpid, aura->nix1_bpid); 5578756828aSChristina Jacob 5588756828aSChristina Jacob seq_printf(m, "W3: limit\t\t%llu\nW3: bp\t\t\t%d\nW3: fc_ena\t\t%d\n", 5598756828aSChristina Jacob (u64)aura->limit, aura->bp, aura->fc_ena); 5603feac505SGeetha sowjanya 5613feac505SGeetha sowjanya if (!is_rvu_otx2(rvu)) 5623feac505SGeetha sowjanya seq_printf(m, "W3: fc_be\t\t%d\n", aura->fc_be); 5638756828aSChristina Jacob seq_printf(m, "W3: fc_up_crossing\t%d\nW3: fc_stype\t\t%d\n", 5648756828aSChristina Jacob aura->fc_up_crossing, aura->fc_stype); 5658756828aSChristina Jacob seq_printf(m, "W3: fc_hyst_bits\t%d\n", aura->fc_hyst_bits); 5668756828aSChristina Jacob 5678756828aSChristina Jacob seq_printf(m, "W4: fc_addr\t\t%llx\n", aura->fc_addr); 5688756828aSChristina Jacob 5698756828aSChristina Jacob seq_printf(m, "W5: pool_drop\t\t%d\nW5: update_time\t\t%d\n", 5708756828aSChristina Jacob aura->pool_drop, aura->update_time); 5718756828aSChristina Jacob seq_printf(m, "W5: err_int \t\t%d\nW5: err_int_ena\t\t%d\n", 5728756828aSChristina Jacob aura->err_int, aura->err_int_ena); 5738756828aSChristina Jacob seq_printf(m, "W5: thresh_int\t\t%d\nW5: thresh_int_ena \t%d\n", 5748756828aSChristina Jacob aura->thresh_int, aura->thresh_int_ena); 5758756828aSChristina Jacob seq_printf(m, "W5: thresh_up\t\t%d\nW5: thresh_qint_idx\t%d\n", 5768756828aSChristina Jacob aura->thresh_up, aura->thresh_qint_idx); 5778756828aSChristina Jacob seq_printf(m, "W5: err_qint_idx \t%d\n", aura->err_qint_idx); 5788756828aSChristina Jacob 5798756828aSChristina Jacob seq_printf(m, "W6: thresh\t\t%llu\n", (u64)aura->thresh); 5803feac505SGeetha sowjanya if (!is_rvu_otx2(rvu)) 5813feac505SGeetha sowjanya seq_printf(m, "W6: fc_msh_dst\t\t%d\n", aura->fc_msh_dst); 5828756828aSChristina Jacob } 5838756828aSChristina Jacob 5848756828aSChristina Jacob /* Dumps given NPA Pool's context */ 5858756828aSChristina Jacob static void print_npa_pool_ctx(struct seq_file *m, struct npa_aq_enq_rsp *rsp) 5868756828aSChristina Jacob { 5878756828aSChristina Jacob struct npa_pool_s *pool = &rsp->pool; 5883feac505SGeetha sowjanya struct rvu *rvu = m->private; 5898756828aSChristina Jacob 5908756828aSChristina Jacob seq_printf(m, "W0: Stack base\t\t%llx\n", pool->stack_base); 5918756828aSChristina Jacob 5928756828aSChristina Jacob seq_printf(m, "W1: ena \t\t%d\nW1: nat_align \t\t%d\n", 5938756828aSChristina Jacob pool->ena, pool->nat_align); 5948756828aSChristina Jacob seq_printf(m, "W1: stack_caching\t%d\nW1: stack_way_mask\t%d\n", 5958756828aSChristina Jacob pool->stack_caching, pool->stack_way_mask); 5968756828aSChristina Jacob seq_printf(m, "W1: buf_offset\t\t%d\nW1: buf_size\t\t%d\n", 5978756828aSChristina Jacob pool->buf_offset, pool->buf_size); 5988756828aSChristina Jacob 5998756828aSChristina Jacob seq_printf(m, "W2: stack_max_pages \t%d\nW2: stack_pages\t\t%d\n", 6008756828aSChristina Jacob pool->stack_max_pages, pool->stack_pages); 6018756828aSChristina Jacob 6028756828aSChristina Jacob seq_printf(m, "W3: op_pc \t\t%llu\n", (u64)pool->op_pc); 6038756828aSChristina Jacob 6048756828aSChristina Jacob seq_printf(m, "W4: stack_offset\t%d\nW4: shift\t\t%d\nW4: avg_level\t\t%d\n", 6058756828aSChristina Jacob pool->stack_offset, pool->shift, pool->avg_level); 6068756828aSChristina Jacob seq_printf(m, "W4: avg_con \t\t%d\nW4: fc_ena\t\t%d\nW4: fc_stype\t\t%d\n", 6078756828aSChristina Jacob pool->avg_con, pool->fc_ena, pool->fc_stype); 6088756828aSChristina Jacob seq_printf(m, "W4: fc_hyst_bits\t%d\nW4: fc_up_crossing\t%d\n", 6098756828aSChristina Jacob pool->fc_hyst_bits, pool->fc_up_crossing); 6103feac505SGeetha sowjanya if (!is_rvu_otx2(rvu)) 6113feac505SGeetha sowjanya seq_printf(m, "W4: fc_be\t\t%d\n", pool->fc_be); 6128756828aSChristina Jacob seq_printf(m, "W4: update_time\t\t%d\n", pool->update_time); 6138756828aSChristina Jacob 6148756828aSChristina Jacob seq_printf(m, "W5: fc_addr\t\t%llx\n", pool->fc_addr); 6158756828aSChristina Jacob 6168756828aSChristina Jacob seq_printf(m, "W6: ptr_start\t\t%llx\n", pool->ptr_start); 6178756828aSChristina Jacob 6188756828aSChristina Jacob seq_printf(m, "W7: ptr_end\t\t%llx\n", pool->ptr_end); 6198756828aSChristina Jacob 6208756828aSChristina Jacob seq_printf(m, "W8: err_int\t\t%d\nW8: err_int_ena\t\t%d\n", 6218756828aSChristina Jacob pool->err_int, pool->err_int_ena); 6228756828aSChristina Jacob seq_printf(m, "W8: thresh_int\t\t%d\n", pool->thresh_int); 6238756828aSChristina Jacob seq_printf(m, "W8: thresh_int_ena\t%d\nW8: thresh_up\t\t%d\n", 6248756828aSChristina Jacob pool->thresh_int_ena, pool->thresh_up); 6253feac505SGeetha sowjanya seq_printf(m, "W8: thresh_qint_idx\t%d\nW8: err_qint_idx\t%d\n", 6268756828aSChristina Jacob pool->thresh_qint_idx, pool->err_qint_idx); 6273feac505SGeetha sowjanya if (!is_rvu_otx2(rvu)) 6283feac505SGeetha sowjanya seq_printf(m, "W8: fc_msh_dst\t\t%d\n", pool->fc_msh_dst); 6298756828aSChristina Jacob } 6308756828aSChristina Jacob 6318756828aSChristina Jacob /* Reads aura/pool's ctx from admin queue */ 6328756828aSChristina Jacob static int rvu_dbg_npa_ctx_display(struct seq_file *m, void *unused, int ctype) 6338756828aSChristina Jacob { 6348756828aSChristina Jacob void (*print_npa_ctx)(struct seq_file *m, struct npa_aq_enq_rsp *rsp); 6358756828aSChristina Jacob struct npa_aq_enq_req aq_req; 6368756828aSChristina Jacob struct npa_aq_enq_rsp rsp; 6378756828aSChristina Jacob struct rvu_pfvf *pfvf; 6388756828aSChristina Jacob int aura, rc, max_id; 6398756828aSChristina Jacob int npalf, id, all; 6408756828aSChristina Jacob struct rvu *rvu; 6418756828aSChristina Jacob u16 pcifunc; 6428756828aSChristina Jacob 6438756828aSChristina Jacob rvu = m->private; 6448756828aSChristina Jacob 6458756828aSChristina Jacob switch (ctype) { 6468756828aSChristina Jacob case NPA_AQ_CTYPE_AURA: 6478756828aSChristina Jacob npalf = rvu->rvu_dbg.npa_aura_ctx.lf; 6488756828aSChristina Jacob id = rvu->rvu_dbg.npa_aura_ctx.id; 6498756828aSChristina Jacob all = rvu->rvu_dbg.npa_aura_ctx.all; 6508756828aSChristina Jacob break; 6518756828aSChristina Jacob 6528756828aSChristina Jacob case NPA_AQ_CTYPE_POOL: 6538756828aSChristina Jacob npalf = rvu->rvu_dbg.npa_pool_ctx.lf; 6548756828aSChristina Jacob id = rvu->rvu_dbg.npa_pool_ctx.id; 6558756828aSChristina Jacob all = rvu->rvu_dbg.npa_pool_ctx.all; 6568756828aSChristina Jacob break; 6578756828aSChristina Jacob default: 6588756828aSChristina Jacob return -EINVAL; 6598756828aSChristina Jacob } 6608756828aSChristina Jacob 6610f3ce484SRakesh Babu if (!rvu_dbg_is_valid_lf(rvu, BLKADDR_NPA, npalf, &pcifunc)) 6628756828aSChristina Jacob return -EINVAL; 6638756828aSChristina Jacob 6648756828aSChristina Jacob pfvf = rvu_get_pfvf(rvu, pcifunc); 6658756828aSChristina Jacob if (ctype == NPA_AQ_CTYPE_AURA && !pfvf->aura_ctx) { 6668756828aSChristina Jacob seq_puts(m, "Aura context is not initialized\n"); 6678756828aSChristina Jacob return -EINVAL; 6688756828aSChristina Jacob } else if (ctype == NPA_AQ_CTYPE_POOL && !pfvf->pool_ctx) { 6698756828aSChristina Jacob seq_puts(m, "Pool context is not initialized\n"); 6708756828aSChristina Jacob return -EINVAL; 6718756828aSChristina Jacob } 6728756828aSChristina Jacob 6738756828aSChristina Jacob memset(&aq_req, 0, sizeof(struct npa_aq_enq_req)); 6748756828aSChristina Jacob aq_req.hdr.pcifunc = pcifunc; 6758756828aSChristina Jacob aq_req.ctype = ctype; 6768756828aSChristina Jacob aq_req.op = NPA_AQ_INSTOP_READ; 6778756828aSChristina Jacob if (ctype == NPA_AQ_CTYPE_AURA) { 6788756828aSChristina Jacob max_id = pfvf->aura_ctx->qsize; 6798756828aSChristina Jacob print_npa_ctx = print_npa_aura_ctx; 6808756828aSChristina Jacob } else { 6818756828aSChristina Jacob max_id = pfvf->pool_ctx->qsize; 6828756828aSChristina Jacob print_npa_ctx = print_npa_pool_ctx; 6838756828aSChristina Jacob } 6848756828aSChristina Jacob 6858756828aSChristina Jacob if (id < 0 || id >= max_id) { 6868756828aSChristina Jacob seq_printf(m, "Invalid %s, valid range is 0-%d\n", 6878756828aSChristina Jacob (ctype == NPA_AQ_CTYPE_AURA) ? "aura" : "pool", 6888756828aSChristina Jacob max_id - 1); 6898756828aSChristina Jacob return -EINVAL; 6908756828aSChristina Jacob } 6918756828aSChristina Jacob 6928756828aSChristina Jacob if (all) 6938756828aSChristina Jacob id = 0; 6948756828aSChristina Jacob else 6958756828aSChristina Jacob max_id = id + 1; 6968756828aSChristina Jacob 6978756828aSChristina Jacob for (aura = id; aura < max_id; aura++) { 6988756828aSChristina Jacob aq_req.aura_id = aura; 6998756828aSChristina Jacob seq_printf(m, "======%s : %d=======\n", 7008756828aSChristina Jacob (ctype == NPA_AQ_CTYPE_AURA) ? "AURA" : "POOL", 7018756828aSChristina Jacob aq_req.aura_id); 7028756828aSChristina Jacob rc = rvu_npa_aq_enq_inst(rvu, &aq_req, &rsp); 7038756828aSChristina Jacob if (rc) { 7048756828aSChristina Jacob seq_puts(m, "Failed to read context\n"); 7058756828aSChristina Jacob return -EINVAL; 7068756828aSChristina Jacob } 7078756828aSChristina Jacob print_npa_ctx(m, &rsp); 7088756828aSChristina Jacob } 7098756828aSChristina Jacob return 0; 7108756828aSChristina Jacob } 7118756828aSChristina Jacob 7128756828aSChristina Jacob static int write_npa_ctx(struct rvu *rvu, bool all, 7138756828aSChristina Jacob int npalf, int id, int ctype) 7148756828aSChristina Jacob { 7158756828aSChristina Jacob struct rvu_pfvf *pfvf; 7168756828aSChristina Jacob int max_id = 0; 7178756828aSChristina Jacob u16 pcifunc; 7188756828aSChristina Jacob 7190f3ce484SRakesh Babu if (!rvu_dbg_is_valid_lf(rvu, BLKADDR_NPA, npalf, &pcifunc)) 7208756828aSChristina Jacob return -EINVAL; 7218756828aSChristina Jacob 7228756828aSChristina Jacob pfvf = rvu_get_pfvf(rvu, pcifunc); 7238756828aSChristina Jacob 7248756828aSChristina Jacob if (ctype == NPA_AQ_CTYPE_AURA) { 7258756828aSChristina Jacob if (!pfvf->aura_ctx) { 7268756828aSChristina Jacob dev_warn(rvu->dev, "Aura context is not initialized\n"); 7278756828aSChristina Jacob return -EINVAL; 7288756828aSChristina Jacob } 7298756828aSChristina Jacob max_id = pfvf->aura_ctx->qsize; 7308756828aSChristina Jacob } else if (ctype == NPA_AQ_CTYPE_POOL) { 7318756828aSChristina Jacob if (!pfvf->pool_ctx) { 7328756828aSChristina Jacob dev_warn(rvu->dev, "Pool context is not initialized\n"); 7338756828aSChristina Jacob return -EINVAL; 7348756828aSChristina Jacob } 7358756828aSChristina Jacob max_id = pfvf->pool_ctx->qsize; 7368756828aSChristina Jacob } 7378756828aSChristina Jacob 7388756828aSChristina Jacob if (id < 0 || id >= max_id) { 7398756828aSChristina Jacob dev_warn(rvu->dev, "Invalid %s, valid range is 0-%d\n", 7408756828aSChristina Jacob (ctype == NPA_AQ_CTYPE_AURA) ? "aura" : "pool", 7418756828aSChristina Jacob max_id - 1); 7428756828aSChristina Jacob return -EINVAL; 7438756828aSChristina Jacob } 7448756828aSChristina Jacob 7458756828aSChristina Jacob switch (ctype) { 7468756828aSChristina Jacob case NPA_AQ_CTYPE_AURA: 7478756828aSChristina Jacob rvu->rvu_dbg.npa_aura_ctx.lf = npalf; 7488756828aSChristina Jacob rvu->rvu_dbg.npa_aura_ctx.id = id; 7498756828aSChristina Jacob rvu->rvu_dbg.npa_aura_ctx.all = all; 7508756828aSChristina Jacob break; 7518756828aSChristina Jacob 7528756828aSChristina Jacob case NPA_AQ_CTYPE_POOL: 7538756828aSChristina Jacob rvu->rvu_dbg.npa_pool_ctx.lf = npalf; 7548756828aSChristina Jacob rvu->rvu_dbg.npa_pool_ctx.id = id; 7558756828aSChristina Jacob rvu->rvu_dbg.npa_pool_ctx.all = all; 7568756828aSChristina Jacob break; 7578756828aSChristina Jacob default: 7588756828aSChristina Jacob return -EINVAL; 7598756828aSChristina Jacob } 7608756828aSChristina Jacob return 0; 7618756828aSChristina Jacob } 7628756828aSChristina Jacob 7638756828aSChristina Jacob static int parse_cmd_buffer_ctx(char *cmd_buf, size_t *count, 7648756828aSChristina Jacob const char __user *buffer, int *npalf, 7658756828aSChristina Jacob int *id, bool *all) 7668756828aSChristina Jacob { 7678756828aSChristina Jacob int bytes_not_copied; 7688756828aSChristina Jacob char *cmd_buf_tmp; 7698756828aSChristina Jacob char *subtoken; 7708756828aSChristina Jacob int ret; 7718756828aSChristina Jacob 7728756828aSChristina Jacob bytes_not_copied = copy_from_user(cmd_buf, buffer, *count); 7738756828aSChristina Jacob if (bytes_not_copied) 7748756828aSChristina Jacob return -EFAULT; 7758756828aSChristina Jacob 7768756828aSChristina Jacob cmd_buf[*count] = '\0'; 7778756828aSChristina Jacob cmd_buf_tmp = strchr(cmd_buf, '\n'); 7788756828aSChristina Jacob 7798756828aSChristina Jacob if (cmd_buf_tmp) { 7808756828aSChristina Jacob *cmd_buf_tmp = '\0'; 7818756828aSChristina Jacob *count = cmd_buf_tmp - cmd_buf + 1; 7828756828aSChristina Jacob } 7838756828aSChristina Jacob 7848756828aSChristina Jacob subtoken = strsep(&cmd_buf, " "); 7858756828aSChristina Jacob ret = subtoken ? kstrtoint(subtoken, 10, npalf) : -EINVAL; 7868756828aSChristina Jacob if (ret < 0) 7878756828aSChristina Jacob return ret; 7888756828aSChristina Jacob subtoken = strsep(&cmd_buf, " "); 7898756828aSChristina Jacob if (subtoken && strcmp(subtoken, "all") == 0) { 7908756828aSChristina Jacob *all = true; 7918756828aSChristina Jacob } else { 7928756828aSChristina Jacob ret = subtoken ? kstrtoint(subtoken, 10, id) : -EINVAL; 7938756828aSChristina Jacob if (ret < 0) 7948756828aSChristina Jacob return ret; 7958756828aSChristina Jacob } 7968756828aSChristina Jacob if (cmd_buf) 7978756828aSChristina Jacob return -EINVAL; 7988756828aSChristina Jacob return ret; 7998756828aSChristina Jacob } 8008756828aSChristina Jacob 8018756828aSChristina Jacob static ssize_t rvu_dbg_npa_ctx_write(struct file *filp, 8028756828aSChristina Jacob const char __user *buffer, 8038756828aSChristina Jacob size_t count, loff_t *ppos, int ctype) 8048756828aSChristina Jacob { 8058756828aSChristina Jacob char *cmd_buf, *ctype_string = (ctype == NPA_AQ_CTYPE_AURA) ? 8068756828aSChristina Jacob "aura" : "pool"; 8078756828aSChristina Jacob struct seq_file *seqfp = filp->private_data; 8088756828aSChristina Jacob struct rvu *rvu = seqfp->private; 8098756828aSChristina Jacob int npalf, id = 0, ret; 8108756828aSChristina Jacob bool all = false; 8118756828aSChristina Jacob 8128756828aSChristina Jacob if ((*ppos != 0) || !count) 8138756828aSChristina Jacob return -EINVAL; 8148756828aSChristina Jacob 8158756828aSChristina Jacob cmd_buf = kzalloc(count + 1, GFP_KERNEL); 8168756828aSChristina Jacob if (!cmd_buf) 8178756828aSChristina Jacob return count; 8188756828aSChristina Jacob ret = parse_cmd_buffer_ctx(cmd_buf, &count, buffer, 8198756828aSChristina Jacob &npalf, &id, &all); 8208756828aSChristina Jacob if (ret < 0) { 8218756828aSChristina Jacob dev_info(rvu->dev, 8228756828aSChristina Jacob "Usage: echo <npalf> [%s number/all] > %s_ctx\n", 8238756828aSChristina Jacob ctype_string, ctype_string); 8248756828aSChristina Jacob goto done; 8258756828aSChristina Jacob } else { 8268756828aSChristina Jacob ret = write_npa_ctx(rvu, all, npalf, id, ctype); 8278756828aSChristina Jacob } 8288756828aSChristina Jacob done: 8298756828aSChristina Jacob kfree(cmd_buf); 8308756828aSChristina Jacob return ret ? ret : count; 8318756828aSChristina Jacob } 8328756828aSChristina Jacob 8338756828aSChristina Jacob static ssize_t rvu_dbg_npa_aura_ctx_write(struct file *filp, 8348756828aSChristina Jacob const char __user *buffer, 8358756828aSChristina Jacob size_t count, loff_t *ppos) 8368756828aSChristina Jacob { 8378756828aSChristina Jacob return rvu_dbg_npa_ctx_write(filp, buffer, count, ppos, 8388756828aSChristina Jacob NPA_AQ_CTYPE_AURA); 8398756828aSChristina Jacob } 8408756828aSChristina Jacob 8418756828aSChristina Jacob static int rvu_dbg_npa_aura_ctx_display(struct seq_file *filp, void *unused) 8428756828aSChristina Jacob { 8438756828aSChristina Jacob return rvu_dbg_npa_ctx_display(filp, unused, NPA_AQ_CTYPE_AURA); 8448756828aSChristina Jacob } 8458756828aSChristina Jacob 8468756828aSChristina Jacob RVU_DEBUG_SEQ_FOPS(npa_aura_ctx, npa_aura_ctx_display, npa_aura_ctx_write); 8478756828aSChristina Jacob 8488756828aSChristina Jacob static ssize_t rvu_dbg_npa_pool_ctx_write(struct file *filp, 8498756828aSChristina Jacob const char __user *buffer, 8508756828aSChristina Jacob size_t count, loff_t *ppos) 8518756828aSChristina Jacob { 8528756828aSChristina Jacob return rvu_dbg_npa_ctx_write(filp, buffer, count, ppos, 8538756828aSChristina Jacob NPA_AQ_CTYPE_POOL); 8548756828aSChristina Jacob } 8558756828aSChristina Jacob 8568756828aSChristina Jacob static int rvu_dbg_npa_pool_ctx_display(struct seq_file *filp, void *unused) 8578756828aSChristina Jacob { 8588756828aSChristina Jacob return rvu_dbg_npa_ctx_display(filp, unused, NPA_AQ_CTYPE_POOL); 8598756828aSChristina Jacob } 8608756828aSChristina Jacob 8618756828aSChristina Jacob RVU_DEBUG_SEQ_FOPS(npa_pool_ctx, npa_pool_ctx_display, npa_pool_ctx_write); 8628756828aSChristina Jacob 863c5a797e0SPrakash Brahmajyosyula static void ndc_cache_stats(struct seq_file *s, int blk_addr, 864c5a797e0SPrakash Brahmajyosyula int ctype, int transaction) 865c5a797e0SPrakash Brahmajyosyula { 866c5a797e0SPrakash Brahmajyosyula u64 req, out_req, lat, cant_alloc; 8670f3ce484SRakesh Babu struct nix_hw *nix_hw; 8680f3ce484SRakesh Babu struct rvu *rvu; 869c5a797e0SPrakash Brahmajyosyula int port; 870c5a797e0SPrakash Brahmajyosyula 8710f3ce484SRakesh Babu if (blk_addr == BLKADDR_NDC_NPA0) { 8720f3ce484SRakesh Babu rvu = s->private; 8730f3ce484SRakesh Babu } else { 8740f3ce484SRakesh Babu nix_hw = s->private; 8750f3ce484SRakesh Babu rvu = nix_hw->rvu; 8760f3ce484SRakesh Babu } 8770f3ce484SRakesh Babu 878c5a797e0SPrakash Brahmajyosyula for (port = 0; port < NDC_MAX_PORT; port++) { 879c5a797e0SPrakash Brahmajyosyula req = rvu_read64(rvu, blk_addr, NDC_AF_PORTX_RTX_RWX_REQ_PC 880c5a797e0SPrakash Brahmajyosyula (port, ctype, transaction)); 881c5a797e0SPrakash Brahmajyosyula lat = rvu_read64(rvu, blk_addr, NDC_AF_PORTX_RTX_RWX_LAT_PC 882c5a797e0SPrakash Brahmajyosyula (port, ctype, transaction)); 883c5a797e0SPrakash Brahmajyosyula out_req = rvu_read64(rvu, blk_addr, 884c5a797e0SPrakash Brahmajyosyula NDC_AF_PORTX_RTX_RWX_OSTDN_PC 885c5a797e0SPrakash Brahmajyosyula (port, ctype, transaction)); 886c5a797e0SPrakash Brahmajyosyula cant_alloc = rvu_read64(rvu, blk_addr, 887c5a797e0SPrakash Brahmajyosyula NDC_AF_PORTX_RTX_CANT_ALLOC_PC 888c5a797e0SPrakash Brahmajyosyula (port, transaction)); 889c5a797e0SPrakash Brahmajyosyula seq_printf(s, "\nPort:%d\n", port); 890c5a797e0SPrakash Brahmajyosyula seq_printf(s, "\tTotal Requests:\t\t%lld\n", req); 891c5a797e0SPrakash Brahmajyosyula seq_printf(s, "\tTotal Time Taken:\t%lld cycles\n", lat); 892c5a797e0SPrakash Brahmajyosyula seq_printf(s, "\tAvg Latency:\t\t%lld cycles\n", lat / req); 893c5a797e0SPrakash Brahmajyosyula seq_printf(s, "\tOutstanding Requests:\t%lld\n", out_req); 894c5a797e0SPrakash Brahmajyosyula seq_printf(s, "\tCant Alloc Requests:\t%lld\n", cant_alloc); 895c5a797e0SPrakash Brahmajyosyula } 896c5a797e0SPrakash Brahmajyosyula } 897c5a797e0SPrakash Brahmajyosyula 898c5a797e0SPrakash Brahmajyosyula static int ndc_blk_cache_stats(struct seq_file *s, int idx, int blk_addr) 899c5a797e0SPrakash Brahmajyosyula { 900c5a797e0SPrakash Brahmajyosyula seq_puts(s, "\n***** CACHE mode read stats *****\n"); 901c5a797e0SPrakash Brahmajyosyula ndc_cache_stats(s, blk_addr, CACHING, NDC_READ_TRANS); 902c5a797e0SPrakash Brahmajyosyula seq_puts(s, "\n***** CACHE mode write stats *****\n"); 903c5a797e0SPrakash Brahmajyosyula ndc_cache_stats(s, blk_addr, CACHING, NDC_WRITE_TRANS); 904c5a797e0SPrakash Brahmajyosyula seq_puts(s, "\n***** BY-PASS mode read stats *****\n"); 905c5a797e0SPrakash Brahmajyosyula ndc_cache_stats(s, blk_addr, BYPASS, NDC_READ_TRANS); 906c5a797e0SPrakash Brahmajyosyula seq_puts(s, "\n***** BY-PASS mode write stats *****\n"); 907c5a797e0SPrakash Brahmajyosyula ndc_cache_stats(s, blk_addr, BYPASS, NDC_WRITE_TRANS); 908c5a797e0SPrakash Brahmajyosyula return 0; 909c5a797e0SPrakash Brahmajyosyula } 910c5a797e0SPrakash Brahmajyosyula 911c5a797e0SPrakash Brahmajyosyula static int rvu_dbg_npa_ndc_cache_display(struct seq_file *filp, void *unused) 912c5a797e0SPrakash Brahmajyosyula { 913c5a797e0SPrakash Brahmajyosyula return ndc_blk_cache_stats(filp, NPA0_U, BLKADDR_NDC_NPA0); 914c5a797e0SPrakash Brahmajyosyula } 915c5a797e0SPrakash Brahmajyosyula 916c5a797e0SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(npa_ndc_cache, npa_ndc_cache_display, NULL); 917c5a797e0SPrakash Brahmajyosyula 918c5a797e0SPrakash Brahmajyosyula static int ndc_blk_hits_miss_stats(struct seq_file *s, int idx, int blk_addr) 919c5a797e0SPrakash Brahmajyosyula { 9200f3ce484SRakesh Babu struct nix_hw *nix_hw; 9210f3ce484SRakesh Babu struct rvu *rvu; 922c5a797e0SPrakash Brahmajyosyula int bank, max_bank; 923c5a797e0SPrakash Brahmajyosyula 9240f3ce484SRakesh Babu if (blk_addr == BLKADDR_NDC_NPA0) { 9250f3ce484SRakesh Babu rvu = s->private; 9260f3ce484SRakesh Babu } else { 9270f3ce484SRakesh Babu nix_hw = s->private; 9280f3ce484SRakesh Babu rvu = nix_hw->rvu; 9290f3ce484SRakesh Babu } 9300f3ce484SRakesh Babu 931c5a797e0SPrakash Brahmajyosyula max_bank = NDC_MAX_BANK(rvu, blk_addr); 932c5a797e0SPrakash Brahmajyosyula for (bank = 0; bank < max_bank; bank++) { 933c5a797e0SPrakash Brahmajyosyula seq_printf(s, "BANK:%d\n", bank); 934c5a797e0SPrakash Brahmajyosyula seq_printf(s, "\tHits:\t%lld\n", 935c5a797e0SPrakash Brahmajyosyula (u64)rvu_read64(rvu, blk_addr, 936c5a797e0SPrakash Brahmajyosyula NDC_AF_BANKX_HIT_PC(bank))); 937c5a797e0SPrakash Brahmajyosyula seq_printf(s, "\tMiss:\t%lld\n", 938c5a797e0SPrakash Brahmajyosyula (u64)rvu_read64(rvu, blk_addr, 939c5a797e0SPrakash Brahmajyosyula NDC_AF_BANKX_MISS_PC(bank))); 940c5a797e0SPrakash Brahmajyosyula } 941c5a797e0SPrakash Brahmajyosyula return 0; 942c5a797e0SPrakash Brahmajyosyula } 943c5a797e0SPrakash Brahmajyosyula 944c5a797e0SPrakash Brahmajyosyula static int rvu_dbg_nix_ndc_rx_cache_display(struct seq_file *filp, void *unused) 945c5a797e0SPrakash Brahmajyosyula { 9460f3ce484SRakesh Babu struct nix_hw *nix_hw = filp->private; 9470f3ce484SRakesh Babu int blkaddr = 0; 9480f3ce484SRakesh Babu int ndc_idx = 0; 9490f3ce484SRakesh Babu 9500f3ce484SRakesh Babu blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ? 9510f3ce484SRakesh Babu BLKADDR_NDC_NIX1_RX : BLKADDR_NDC_NIX0_RX); 9520f3ce484SRakesh Babu ndc_idx = (nix_hw->blkaddr == BLKADDR_NIX1 ? NIX1_RX : NIX0_RX); 9530f3ce484SRakesh Babu 9540f3ce484SRakesh Babu return ndc_blk_cache_stats(filp, ndc_idx, blkaddr); 955c5a797e0SPrakash Brahmajyosyula } 956c5a797e0SPrakash Brahmajyosyula 957c5a797e0SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(nix_ndc_rx_cache, nix_ndc_rx_cache_display, NULL); 958c5a797e0SPrakash Brahmajyosyula 959c5a797e0SPrakash Brahmajyosyula static int rvu_dbg_nix_ndc_tx_cache_display(struct seq_file *filp, void *unused) 960c5a797e0SPrakash Brahmajyosyula { 9610f3ce484SRakesh Babu struct nix_hw *nix_hw = filp->private; 9620f3ce484SRakesh Babu int blkaddr = 0; 9630f3ce484SRakesh Babu int ndc_idx = 0; 9640f3ce484SRakesh Babu 9650f3ce484SRakesh Babu blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ? 9660f3ce484SRakesh Babu BLKADDR_NDC_NIX1_TX : BLKADDR_NDC_NIX0_TX); 9670f3ce484SRakesh Babu ndc_idx = (nix_hw->blkaddr == BLKADDR_NIX1 ? NIX1_TX : NIX0_TX); 9680f3ce484SRakesh Babu 9690f3ce484SRakesh Babu return ndc_blk_cache_stats(filp, ndc_idx, blkaddr); 970c5a797e0SPrakash Brahmajyosyula } 971c5a797e0SPrakash Brahmajyosyula 972c5a797e0SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(nix_ndc_tx_cache, nix_ndc_tx_cache_display, NULL); 973c5a797e0SPrakash Brahmajyosyula 974c5a797e0SPrakash Brahmajyosyula static int rvu_dbg_npa_ndc_hits_miss_display(struct seq_file *filp, 975c5a797e0SPrakash Brahmajyosyula void *unused) 976c5a797e0SPrakash Brahmajyosyula { 977c5a797e0SPrakash Brahmajyosyula return ndc_blk_hits_miss_stats(filp, NPA0_U, BLKADDR_NDC_NPA0); 978c5a797e0SPrakash Brahmajyosyula } 979c5a797e0SPrakash Brahmajyosyula 980c5a797e0SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(npa_ndc_hits_miss, npa_ndc_hits_miss_display, NULL); 981c5a797e0SPrakash Brahmajyosyula 982c5a797e0SPrakash Brahmajyosyula static int rvu_dbg_nix_ndc_rx_hits_miss_display(struct seq_file *filp, 983c5a797e0SPrakash Brahmajyosyula void *unused) 984c5a797e0SPrakash Brahmajyosyula { 9850f3ce484SRakesh Babu struct nix_hw *nix_hw = filp->private; 9860f3ce484SRakesh Babu int ndc_idx = NPA0_U; 9870f3ce484SRakesh Babu int blkaddr = 0; 9880f3ce484SRakesh Babu 9890f3ce484SRakesh Babu blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ? 9900f3ce484SRakesh Babu BLKADDR_NDC_NIX1_RX : BLKADDR_NDC_NIX0_RX); 9910f3ce484SRakesh Babu 9920f3ce484SRakesh Babu return ndc_blk_hits_miss_stats(filp, ndc_idx, blkaddr); 993c5a797e0SPrakash Brahmajyosyula } 994c5a797e0SPrakash Brahmajyosyula 995c5a797e0SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(nix_ndc_rx_hits_miss, nix_ndc_rx_hits_miss_display, NULL); 996c5a797e0SPrakash Brahmajyosyula 997c5a797e0SPrakash Brahmajyosyula static int rvu_dbg_nix_ndc_tx_hits_miss_display(struct seq_file *filp, 998c5a797e0SPrakash Brahmajyosyula void *unused) 999c5a797e0SPrakash Brahmajyosyula { 10000f3ce484SRakesh Babu struct nix_hw *nix_hw = filp->private; 10010f3ce484SRakesh Babu int ndc_idx = NPA0_U; 10020f3ce484SRakesh Babu int blkaddr = 0; 10030f3ce484SRakesh Babu 10040f3ce484SRakesh Babu blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ? 10050f3ce484SRakesh Babu BLKADDR_NDC_NIX1_TX : BLKADDR_NDC_NIX0_TX); 10060f3ce484SRakesh Babu 10070f3ce484SRakesh Babu return ndc_blk_hits_miss_stats(filp, ndc_idx, blkaddr); 1008c5a797e0SPrakash Brahmajyosyula } 1009c5a797e0SPrakash Brahmajyosyula 1010c5a797e0SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(nix_ndc_tx_hits_miss, nix_ndc_tx_hits_miss_display, NULL); 1011c5a797e0SPrakash Brahmajyosyula 10123feac505SGeetha sowjanya static void print_nix_cn10k_sq_ctx(struct seq_file *m, 10133feac505SGeetha sowjanya struct nix_cn10k_sq_ctx_s *sq_ctx) 10143feac505SGeetha sowjanya { 10153feac505SGeetha sowjanya seq_printf(m, "W0: ena \t\t\t%d\nW0: qint_idx \t\t\t%d\n", 10163feac505SGeetha sowjanya sq_ctx->ena, sq_ctx->qint_idx); 10173feac505SGeetha sowjanya seq_printf(m, "W0: substream \t\t\t0x%03x\nW0: sdp_mcast \t\t\t%d\n", 10183feac505SGeetha sowjanya sq_ctx->substream, sq_ctx->sdp_mcast); 10193feac505SGeetha sowjanya seq_printf(m, "W0: cq \t\t\t\t%d\nW0: sqe_way_mask \t\t%d\n\n", 10203feac505SGeetha sowjanya sq_ctx->cq, sq_ctx->sqe_way_mask); 10213feac505SGeetha sowjanya 10223feac505SGeetha sowjanya seq_printf(m, "W1: smq \t\t\t%d\nW1: cq_ena \t\t\t%d\nW1: xoff\t\t\t%d\n", 10233feac505SGeetha sowjanya sq_ctx->smq, sq_ctx->cq_ena, sq_ctx->xoff); 10243feac505SGeetha sowjanya seq_printf(m, "W1: sso_ena \t\t\t%d\nW1: smq_rr_weight\t\t%d\n", 10253feac505SGeetha sowjanya sq_ctx->sso_ena, sq_ctx->smq_rr_weight); 10263feac505SGeetha sowjanya seq_printf(m, "W1: default_chan\t\t%d\nW1: sqb_count\t\t\t%d\n\n", 10273feac505SGeetha sowjanya sq_ctx->default_chan, sq_ctx->sqb_count); 10283feac505SGeetha sowjanya 10293feac505SGeetha sowjanya seq_printf(m, "W2: smq_rr_count_lb \t\t%d\n", sq_ctx->smq_rr_count_lb); 10303feac505SGeetha sowjanya seq_printf(m, "W2: smq_rr_count_ub \t\t%d\n", sq_ctx->smq_rr_count_ub); 10313feac505SGeetha sowjanya seq_printf(m, "W2: sqb_aura \t\t\t%d\nW2: sq_int \t\t\t%d\n", 10323feac505SGeetha sowjanya sq_ctx->sqb_aura, sq_ctx->sq_int); 10333feac505SGeetha sowjanya seq_printf(m, "W2: sq_int_ena \t\t\t%d\nW2: sqe_stype \t\t\t%d\n", 10343feac505SGeetha sowjanya sq_ctx->sq_int_ena, sq_ctx->sqe_stype); 10353feac505SGeetha sowjanya 10363feac505SGeetha sowjanya seq_printf(m, "W3: max_sqe_size\t\t%d\nW3: cq_limit\t\t\t%d\n", 10373feac505SGeetha sowjanya sq_ctx->max_sqe_size, sq_ctx->cq_limit); 10383feac505SGeetha sowjanya seq_printf(m, "W3: lmt_dis \t\t\t%d\nW3: mnq_dis \t\t\t%d\n", 10393feac505SGeetha sowjanya sq_ctx->mnq_dis, sq_ctx->lmt_dis); 10403feac505SGeetha sowjanya seq_printf(m, "W3: smq_next_sq\t\t\t%d\nW3: smq_lso_segnum\t\t%d\n", 10413feac505SGeetha sowjanya sq_ctx->smq_next_sq, sq_ctx->smq_lso_segnum); 10423feac505SGeetha sowjanya seq_printf(m, "W3: tail_offset \t\t%d\nW3: smenq_offset\t\t%d\n", 10433feac505SGeetha sowjanya sq_ctx->tail_offset, sq_ctx->smenq_offset); 10443feac505SGeetha sowjanya seq_printf(m, "W3: head_offset\t\t\t%d\nW3: smenq_next_sqb_vld\t\t%d\n\n", 10453feac505SGeetha sowjanya sq_ctx->head_offset, sq_ctx->smenq_next_sqb_vld); 10463feac505SGeetha sowjanya 10473feac505SGeetha sowjanya seq_printf(m, "W4: next_sqb \t\t\t%llx\n\n", sq_ctx->next_sqb); 10483feac505SGeetha sowjanya seq_printf(m, "W5: tail_sqb \t\t\t%llx\n\n", sq_ctx->tail_sqb); 10493feac505SGeetha sowjanya seq_printf(m, "W6: smenq_sqb \t\t\t%llx\n\n", sq_ctx->smenq_sqb); 10503feac505SGeetha sowjanya seq_printf(m, "W7: smenq_next_sqb \t\t%llx\n\n", 10513feac505SGeetha sowjanya sq_ctx->smenq_next_sqb); 10523feac505SGeetha sowjanya 10533feac505SGeetha sowjanya seq_printf(m, "W8: head_sqb\t\t\t%llx\n\n", sq_ctx->head_sqb); 10543feac505SGeetha sowjanya 10553feac505SGeetha sowjanya seq_printf(m, "W9: vfi_lso_total\t\t%d\n", sq_ctx->vfi_lso_total); 10563feac505SGeetha sowjanya seq_printf(m, "W9: vfi_lso_sizem1\t\t%d\nW9: vfi_lso_sb\t\t\t%d\n", 10573feac505SGeetha sowjanya sq_ctx->vfi_lso_sizem1, sq_ctx->vfi_lso_sb); 10583feac505SGeetha sowjanya seq_printf(m, "W9: vfi_lso_mps\t\t\t%d\nW9: vfi_lso_vlan0_ins_ena\t%d\n", 10593feac505SGeetha sowjanya sq_ctx->vfi_lso_mps, sq_ctx->vfi_lso_vlan0_ins_ena); 10603feac505SGeetha sowjanya seq_printf(m, "W9: vfi_lso_vlan1_ins_ena\t%d\nW9: vfi_lso_vld \t\t%d\n\n", 10613feac505SGeetha sowjanya sq_ctx->vfi_lso_vld, sq_ctx->vfi_lso_vlan1_ins_ena); 10623feac505SGeetha sowjanya 10633feac505SGeetha sowjanya seq_printf(m, "W10: scm_lso_rem \t\t%llu\n\n", 10643feac505SGeetha sowjanya (u64)sq_ctx->scm_lso_rem); 10653feac505SGeetha sowjanya seq_printf(m, "W11: octs \t\t\t%llu\n\n", (u64)sq_ctx->octs); 10663feac505SGeetha sowjanya seq_printf(m, "W12: pkts \t\t\t%llu\n\n", (u64)sq_ctx->pkts); 10673feac505SGeetha sowjanya seq_printf(m, "W14: dropped_octs \t\t%llu\n\n", 10683feac505SGeetha sowjanya (u64)sq_ctx->dropped_octs); 10693feac505SGeetha sowjanya seq_printf(m, "W15: dropped_pkts \t\t%llu\n\n", 10703feac505SGeetha sowjanya (u64)sq_ctx->dropped_pkts); 10713feac505SGeetha sowjanya } 10723feac505SGeetha sowjanya 107302e202c3SPrakash Brahmajyosyula /* Dumps given nix_sq's context */ 107402e202c3SPrakash Brahmajyosyula static void print_nix_sq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp) 107502e202c3SPrakash Brahmajyosyula { 107602e202c3SPrakash Brahmajyosyula struct nix_sq_ctx_s *sq_ctx = &rsp->sq; 10773feac505SGeetha sowjanya struct nix_hw *nix_hw = m->private; 10783feac505SGeetha sowjanya struct rvu *rvu = nix_hw->rvu; 107902e202c3SPrakash Brahmajyosyula 10803feac505SGeetha sowjanya if (!is_rvu_otx2(rvu)) { 10813feac505SGeetha sowjanya print_nix_cn10k_sq_ctx(m, (struct nix_cn10k_sq_ctx_s *)sq_ctx); 10823feac505SGeetha sowjanya return; 10833feac505SGeetha sowjanya } 108402e202c3SPrakash Brahmajyosyula seq_printf(m, "W0: sqe_way_mask \t\t%d\nW0: cq \t\t\t\t%d\n", 108502e202c3SPrakash Brahmajyosyula sq_ctx->sqe_way_mask, sq_ctx->cq); 108602e202c3SPrakash Brahmajyosyula seq_printf(m, "W0: sdp_mcast \t\t\t%d\nW0: substream \t\t\t0x%03x\n", 108702e202c3SPrakash Brahmajyosyula sq_ctx->sdp_mcast, sq_ctx->substream); 108802e202c3SPrakash Brahmajyosyula seq_printf(m, "W0: qint_idx \t\t\t%d\nW0: ena \t\t\t%d\n\n", 108902e202c3SPrakash Brahmajyosyula sq_ctx->qint_idx, sq_ctx->ena); 109002e202c3SPrakash Brahmajyosyula 109102e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: sqb_count \t\t\t%d\nW1: default_chan \t\t%d\n", 109202e202c3SPrakash Brahmajyosyula sq_ctx->sqb_count, sq_ctx->default_chan); 109302e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: smq_rr_quantum \t\t%d\nW1: sso_ena \t\t\t%d\n", 109402e202c3SPrakash Brahmajyosyula sq_ctx->smq_rr_quantum, sq_ctx->sso_ena); 109502e202c3SPrakash Brahmajyosyula 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", 109602e202c3SPrakash Brahmajyosyula sq_ctx->xoff, sq_ctx->cq_ena, sq_ctx->smq); 109702e202c3SPrakash Brahmajyosyula 109802e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: sqe_stype \t\t\t%d\nW2: sq_int_ena \t\t\t%d\n", 109902e202c3SPrakash Brahmajyosyula sq_ctx->sqe_stype, sq_ctx->sq_int_ena); 110002e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: sq_int \t\t\t%d\nW2: sqb_aura \t\t\t%d\n", 110102e202c3SPrakash Brahmajyosyula sq_ctx->sq_int, sq_ctx->sqb_aura); 110202e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: smq_rr_count \t\t%d\n\n", sq_ctx->smq_rr_count); 110302e202c3SPrakash Brahmajyosyula 110402e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: smq_next_sq_vld\t\t%d\nW3: smq_pend\t\t\t%d\n", 110502e202c3SPrakash Brahmajyosyula sq_ctx->smq_next_sq_vld, sq_ctx->smq_pend); 110602e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: smenq_next_sqb_vld \t\t%d\nW3: head_offset\t\t\t%d\n", 110702e202c3SPrakash Brahmajyosyula sq_ctx->smenq_next_sqb_vld, sq_ctx->head_offset); 110802e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: smenq_offset\t\t%d\nW3: tail_offset\t\t\t%d\n", 110902e202c3SPrakash Brahmajyosyula sq_ctx->smenq_offset, sq_ctx->tail_offset); 111002e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: smq_lso_segnum \t\t%d\nW3: smq_next_sq\t\t\t%d\n", 111102e202c3SPrakash Brahmajyosyula sq_ctx->smq_lso_segnum, sq_ctx->smq_next_sq); 111202e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: mnq_dis \t\t\t%d\nW3: lmt_dis \t\t\t%d\n", 111302e202c3SPrakash Brahmajyosyula sq_ctx->mnq_dis, sq_ctx->lmt_dis); 111402e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: cq_limit\t\t\t%d\nW3: max_sqe_size\t\t%d\n\n", 111502e202c3SPrakash Brahmajyosyula sq_ctx->cq_limit, sq_ctx->max_sqe_size); 111602e202c3SPrakash Brahmajyosyula 111702e202c3SPrakash Brahmajyosyula seq_printf(m, "W4: next_sqb \t\t\t%llx\n\n", sq_ctx->next_sqb); 111802e202c3SPrakash Brahmajyosyula seq_printf(m, "W5: tail_sqb \t\t\t%llx\n\n", sq_ctx->tail_sqb); 111902e202c3SPrakash Brahmajyosyula seq_printf(m, "W6: smenq_sqb \t\t\t%llx\n\n", sq_ctx->smenq_sqb); 112002e202c3SPrakash Brahmajyosyula seq_printf(m, "W7: smenq_next_sqb \t\t%llx\n\n", 112102e202c3SPrakash Brahmajyosyula sq_ctx->smenq_next_sqb); 112202e202c3SPrakash Brahmajyosyula 112302e202c3SPrakash Brahmajyosyula seq_printf(m, "W8: head_sqb\t\t\t%llx\n\n", sq_ctx->head_sqb); 112402e202c3SPrakash Brahmajyosyula 112502e202c3SPrakash Brahmajyosyula seq_printf(m, "W9: vfi_lso_vld\t\t\t%d\nW9: vfi_lso_vlan1_ins_ena\t%d\n", 112602e202c3SPrakash Brahmajyosyula sq_ctx->vfi_lso_vld, sq_ctx->vfi_lso_vlan1_ins_ena); 112702e202c3SPrakash Brahmajyosyula seq_printf(m, "W9: vfi_lso_vlan0_ins_ena\t%d\nW9: vfi_lso_mps\t\t\t%d\n", 112802e202c3SPrakash Brahmajyosyula sq_ctx->vfi_lso_vlan0_ins_ena, sq_ctx->vfi_lso_mps); 112902e202c3SPrakash Brahmajyosyula seq_printf(m, "W9: vfi_lso_sb\t\t\t%d\nW9: vfi_lso_sizem1\t\t%d\n", 113002e202c3SPrakash Brahmajyosyula sq_ctx->vfi_lso_sb, sq_ctx->vfi_lso_sizem1); 113102e202c3SPrakash Brahmajyosyula seq_printf(m, "W9: vfi_lso_total\t\t%d\n\n", sq_ctx->vfi_lso_total); 113202e202c3SPrakash Brahmajyosyula 113302e202c3SPrakash Brahmajyosyula seq_printf(m, "W10: scm_lso_rem \t\t%llu\n\n", 113402e202c3SPrakash Brahmajyosyula (u64)sq_ctx->scm_lso_rem); 113502e202c3SPrakash Brahmajyosyula seq_printf(m, "W11: octs \t\t\t%llu\n\n", (u64)sq_ctx->octs); 113602e202c3SPrakash Brahmajyosyula seq_printf(m, "W12: pkts \t\t\t%llu\n\n", (u64)sq_ctx->pkts); 113702e202c3SPrakash Brahmajyosyula seq_printf(m, "W14: dropped_octs \t\t%llu\n\n", 113802e202c3SPrakash Brahmajyosyula (u64)sq_ctx->dropped_octs); 113902e202c3SPrakash Brahmajyosyula seq_printf(m, "W15: dropped_pkts \t\t%llu\n\n", 114002e202c3SPrakash Brahmajyosyula (u64)sq_ctx->dropped_pkts); 114102e202c3SPrakash Brahmajyosyula } 114202e202c3SPrakash Brahmajyosyula 11433feac505SGeetha sowjanya static void print_nix_cn10k_rq_ctx(struct seq_file *m, 11443feac505SGeetha sowjanya struct nix_cn10k_rq_ctx_s *rq_ctx) 11453feac505SGeetha sowjanya { 11463feac505SGeetha sowjanya seq_printf(m, "W0: ena \t\t\t%d\nW0: sso_ena \t\t\t%d\n", 11473feac505SGeetha sowjanya rq_ctx->ena, rq_ctx->sso_ena); 11483feac505SGeetha sowjanya seq_printf(m, "W0: ipsech_ena \t\t\t%d\nW0: ena_wqwd \t\t\t%d\n", 11493feac505SGeetha sowjanya rq_ctx->ipsech_ena, rq_ctx->ena_wqwd); 11503feac505SGeetha sowjanya seq_printf(m, "W0: cq \t\t\t\t%d\nW0: lenerr_dis \t\t\t%d\n", 11513feac505SGeetha sowjanya rq_ctx->cq, rq_ctx->lenerr_dis); 11523feac505SGeetha sowjanya seq_printf(m, "W0: csum_il4_dis \t\t%d\nW0: csum_ol4_dis \t\t%d\n", 11533feac505SGeetha sowjanya rq_ctx->csum_il4_dis, rq_ctx->csum_ol4_dis); 11543feac505SGeetha sowjanya seq_printf(m, "W0: len_il4_dis \t\t%d\nW0: len_il3_dis \t\t%d\n", 11553feac505SGeetha sowjanya rq_ctx->len_il4_dis, rq_ctx->len_il3_dis); 11563feac505SGeetha sowjanya seq_printf(m, "W0: len_ol4_dis \t\t%d\nW0: len_ol3_dis \t\t%d\n", 11573feac505SGeetha sowjanya rq_ctx->len_ol4_dis, rq_ctx->len_ol3_dis); 11583feac505SGeetha sowjanya seq_printf(m, "W0: wqe_aura \t\t\t%d\n\n", rq_ctx->wqe_aura); 11593feac505SGeetha sowjanya 11603feac505SGeetha sowjanya seq_printf(m, "W1: spb_aura \t\t\t%d\nW1: lpb_aura \t\t\t%d\n", 11613feac505SGeetha sowjanya rq_ctx->spb_aura, rq_ctx->lpb_aura); 11623feac505SGeetha sowjanya seq_printf(m, "W1: spb_aura \t\t\t%d\n", rq_ctx->spb_aura); 11633feac505SGeetha sowjanya seq_printf(m, "W1: sso_grp \t\t\t%d\nW1: sso_tt \t\t\t%d\n", 11643feac505SGeetha sowjanya rq_ctx->sso_grp, rq_ctx->sso_tt); 11653feac505SGeetha sowjanya seq_printf(m, "W1: pb_caching \t\t\t%d\nW1: wqe_caching \t\t%d\n", 11663feac505SGeetha sowjanya rq_ctx->pb_caching, rq_ctx->wqe_caching); 11673feac505SGeetha sowjanya seq_printf(m, "W1: xqe_drop_ena \t\t%d\nW1: spb_drop_ena \t\t%d\n", 11683feac505SGeetha sowjanya rq_ctx->xqe_drop_ena, rq_ctx->spb_drop_ena); 11693feac505SGeetha sowjanya seq_printf(m, "W1: lpb_drop_ena \t\t%d\nW1: pb_stashing \t\t%d\n", 11703feac505SGeetha sowjanya rq_ctx->lpb_drop_ena, rq_ctx->pb_stashing); 11713feac505SGeetha sowjanya seq_printf(m, "W1: ipsecd_drop_ena \t\t%d\nW1: chi_ena \t\t\t%d\n\n", 11723feac505SGeetha sowjanya rq_ctx->ipsecd_drop_ena, rq_ctx->chi_ena); 11733feac505SGeetha sowjanya 11743feac505SGeetha sowjanya seq_printf(m, "W2: band_prof_id \t\t%d\n", rq_ctx->band_prof_id); 11753feac505SGeetha sowjanya seq_printf(m, "W2: policer_ena \t\t%d\n", rq_ctx->policer_ena); 11763feac505SGeetha sowjanya seq_printf(m, "W2: spb_sizem1 \t\t\t%d\n", rq_ctx->spb_sizem1); 11773feac505SGeetha sowjanya seq_printf(m, "W2: wqe_skip \t\t\t%d\nW2: sqb_ena \t\t\t%d\n", 11783feac505SGeetha sowjanya rq_ctx->wqe_skip, rq_ctx->spb_ena); 11793feac505SGeetha sowjanya seq_printf(m, "W2: lpb_size1 \t\t\t%d\nW2: first_skip \t\t\t%d\n", 11803feac505SGeetha sowjanya rq_ctx->lpb_sizem1, rq_ctx->first_skip); 11813feac505SGeetha sowjanya seq_printf(m, "W2: later_skip\t\t\t%d\nW2: xqe_imm_size\t\t%d\n", 11823feac505SGeetha sowjanya rq_ctx->later_skip, rq_ctx->xqe_imm_size); 11833feac505SGeetha sowjanya seq_printf(m, "W2: xqe_imm_copy \t\t%d\nW2: xqe_hdr_split \t\t%d\n\n", 11843feac505SGeetha sowjanya rq_ctx->xqe_imm_copy, rq_ctx->xqe_hdr_split); 11853feac505SGeetha sowjanya 11863feac505SGeetha sowjanya seq_printf(m, "W3: xqe_drop \t\t\t%d\nW3: xqe_pass \t\t\t%d\n", 11873feac505SGeetha sowjanya rq_ctx->xqe_drop, rq_ctx->xqe_pass); 11883feac505SGeetha sowjanya seq_printf(m, "W3: wqe_pool_drop \t\t%d\nW3: wqe_pool_pass \t\t%d\n", 11893feac505SGeetha sowjanya rq_ctx->wqe_pool_drop, rq_ctx->wqe_pool_pass); 11903feac505SGeetha sowjanya seq_printf(m, "W3: spb_pool_drop \t\t%d\nW3: spb_pool_pass \t\t%d\n", 11913feac505SGeetha sowjanya rq_ctx->spb_pool_drop, rq_ctx->spb_pool_pass); 11923feac505SGeetha sowjanya seq_printf(m, "W3: spb_aura_drop \t\t%d\nW3: spb_aura_pass \t\t%d\n\n", 11933feac505SGeetha sowjanya rq_ctx->spb_aura_pass, rq_ctx->spb_aura_drop); 11943feac505SGeetha sowjanya 11953feac505SGeetha sowjanya seq_printf(m, "W4: lpb_aura_drop \t\t%d\nW3: lpb_aura_pass \t\t%d\n", 11963feac505SGeetha sowjanya rq_ctx->lpb_aura_pass, rq_ctx->lpb_aura_drop); 11973feac505SGeetha sowjanya seq_printf(m, "W4: lpb_pool_drop \t\t%d\nW3: lpb_pool_pass \t\t%d\n", 11983feac505SGeetha sowjanya rq_ctx->lpb_pool_drop, rq_ctx->lpb_pool_pass); 11993feac505SGeetha sowjanya seq_printf(m, "W4: rq_int \t\t\t%d\nW4: rq_int_ena\t\t\t%d\n", 12003feac505SGeetha sowjanya rq_ctx->rq_int, rq_ctx->rq_int_ena); 12013feac505SGeetha sowjanya seq_printf(m, "W4: qint_idx \t\t\t%d\n\n", rq_ctx->qint_idx); 12023feac505SGeetha sowjanya 12033feac505SGeetha sowjanya seq_printf(m, "W5: ltag \t\t\t%d\nW5: good_utag \t\t\t%d\n", 12043feac505SGeetha sowjanya rq_ctx->ltag, rq_ctx->good_utag); 12053feac505SGeetha sowjanya seq_printf(m, "W5: bad_utag \t\t\t%d\nW5: flow_tagw \t\t\t%d\n", 12063feac505SGeetha sowjanya rq_ctx->bad_utag, rq_ctx->flow_tagw); 12073feac505SGeetha sowjanya seq_printf(m, "W5: ipsec_vwqe \t\t\t%d\nW5: vwqe_ena \t\t\t%d\n", 12083feac505SGeetha sowjanya rq_ctx->ipsec_vwqe, rq_ctx->vwqe_ena); 12093feac505SGeetha sowjanya seq_printf(m, "W5: vwqe_wait \t\t\t%d\nW5: max_vsize_exp\t\t%d\n", 12103feac505SGeetha sowjanya rq_ctx->vwqe_wait, rq_ctx->max_vsize_exp); 12113feac505SGeetha sowjanya seq_printf(m, "W5: vwqe_skip \t\t\t%d\n\n", rq_ctx->vwqe_skip); 12123feac505SGeetha sowjanya 12133feac505SGeetha sowjanya seq_printf(m, "W6: octs \t\t\t%llu\n\n", (u64)rq_ctx->octs); 12143feac505SGeetha sowjanya seq_printf(m, "W7: pkts \t\t\t%llu\n\n", (u64)rq_ctx->pkts); 12153feac505SGeetha sowjanya seq_printf(m, "W8: drop_octs \t\t\t%llu\n\n", (u64)rq_ctx->drop_octs); 12163feac505SGeetha sowjanya seq_printf(m, "W9: drop_pkts \t\t\t%llu\n\n", (u64)rq_ctx->drop_pkts); 12173feac505SGeetha sowjanya seq_printf(m, "W10: re_pkts \t\t\t%llu\n", (u64)rq_ctx->re_pkts); 12183feac505SGeetha sowjanya } 12193feac505SGeetha sowjanya 122002e202c3SPrakash Brahmajyosyula /* Dumps given nix_rq's context */ 122102e202c3SPrakash Brahmajyosyula static void print_nix_rq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp) 122202e202c3SPrakash Brahmajyosyula { 122302e202c3SPrakash Brahmajyosyula struct nix_rq_ctx_s *rq_ctx = &rsp->rq; 12243feac505SGeetha sowjanya struct nix_hw *nix_hw = m->private; 12253feac505SGeetha sowjanya struct rvu *rvu = nix_hw->rvu; 12263feac505SGeetha sowjanya 12273feac505SGeetha sowjanya if (!is_rvu_otx2(rvu)) { 12283feac505SGeetha sowjanya print_nix_cn10k_rq_ctx(m, (struct nix_cn10k_rq_ctx_s *)rq_ctx); 12293feac505SGeetha sowjanya return; 12303feac505SGeetha sowjanya } 123102e202c3SPrakash Brahmajyosyula 123202e202c3SPrakash Brahmajyosyula seq_printf(m, "W0: wqe_aura \t\t\t%d\nW0: substream \t\t\t0x%03x\n", 123302e202c3SPrakash Brahmajyosyula rq_ctx->wqe_aura, rq_ctx->substream); 123402e202c3SPrakash Brahmajyosyula seq_printf(m, "W0: cq \t\t\t\t%d\nW0: ena_wqwd \t\t\t%d\n", 123502e202c3SPrakash Brahmajyosyula rq_ctx->cq, rq_ctx->ena_wqwd); 123602e202c3SPrakash Brahmajyosyula seq_printf(m, "W0: ipsech_ena \t\t\t%d\nW0: sso_ena \t\t\t%d\n", 123702e202c3SPrakash Brahmajyosyula rq_ctx->ipsech_ena, rq_ctx->sso_ena); 123802e202c3SPrakash Brahmajyosyula seq_printf(m, "W0: ena \t\t\t%d\n\n", rq_ctx->ena); 123902e202c3SPrakash Brahmajyosyula 124002e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: lpb_drop_ena \t\t%d\nW1: spb_drop_ena \t\t%d\n", 124102e202c3SPrakash Brahmajyosyula rq_ctx->lpb_drop_ena, rq_ctx->spb_drop_ena); 124202e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: xqe_drop_ena \t\t%d\nW1: wqe_caching \t\t%d\n", 124302e202c3SPrakash Brahmajyosyula rq_ctx->xqe_drop_ena, rq_ctx->wqe_caching); 124402e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: pb_caching \t\t\t%d\nW1: sso_tt \t\t\t%d\n", 124502e202c3SPrakash Brahmajyosyula rq_ctx->pb_caching, rq_ctx->sso_tt); 124602e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: sso_grp \t\t\t%d\nW1: lpb_aura \t\t\t%d\n", 124702e202c3SPrakash Brahmajyosyula rq_ctx->sso_grp, rq_ctx->lpb_aura); 124802e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: spb_aura \t\t\t%d\n\n", rq_ctx->spb_aura); 124902e202c3SPrakash Brahmajyosyula 125002e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: xqe_hdr_split \t\t%d\nW2: xqe_imm_copy \t\t%d\n", 125102e202c3SPrakash Brahmajyosyula rq_ctx->xqe_hdr_split, rq_ctx->xqe_imm_copy); 125202e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: xqe_imm_size \t\t%d\nW2: later_skip \t\t\t%d\n", 125302e202c3SPrakash Brahmajyosyula rq_ctx->xqe_imm_size, rq_ctx->later_skip); 125402e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: first_skip \t\t\t%d\nW2: lpb_sizem1 \t\t\t%d\n", 125502e202c3SPrakash Brahmajyosyula rq_ctx->first_skip, rq_ctx->lpb_sizem1); 125602e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: spb_ena \t\t\t%d\nW2: wqe_skip \t\t\t%d\n", 125702e202c3SPrakash Brahmajyosyula rq_ctx->spb_ena, rq_ctx->wqe_skip); 125802e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: spb_sizem1 \t\t\t%d\n\n", rq_ctx->spb_sizem1); 125902e202c3SPrakash Brahmajyosyula 126002e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: spb_pool_pass \t\t%d\nW3: spb_pool_drop \t\t%d\n", 126102e202c3SPrakash Brahmajyosyula rq_ctx->spb_pool_pass, rq_ctx->spb_pool_drop); 126202e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: spb_aura_pass \t\t%d\nW3: spb_aura_drop \t\t%d\n", 126302e202c3SPrakash Brahmajyosyula rq_ctx->spb_aura_pass, rq_ctx->spb_aura_drop); 126402e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: wqe_pool_pass \t\t%d\nW3: wqe_pool_drop \t\t%d\n", 126502e202c3SPrakash Brahmajyosyula rq_ctx->wqe_pool_pass, rq_ctx->wqe_pool_drop); 126602e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: xqe_pass \t\t\t%d\nW3: xqe_drop \t\t\t%d\n\n", 126702e202c3SPrakash Brahmajyosyula rq_ctx->xqe_pass, rq_ctx->xqe_drop); 126802e202c3SPrakash Brahmajyosyula 126902e202c3SPrakash Brahmajyosyula seq_printf(m, "W4: qint_idx \t\t\t%d\nW4: rq_int_ena \t\t\t%d\n", 127002e202c3SPrakash Brahmajyosyula rq_ctx->qint_idx, rq_ctx->rq_int_ena); 127102e202c3SPrakash Brahmajyosyula seq_printf(m, "W4: rq_int \t\t\t%d\nW4: lpb_pool_pass \t\t%d\n", 127202e202c3SPrakash Brahmajyosyula rq_ctx->rq_int, rq_ctx->lpb_pool_pass); 127302e202c3SPrakash Brahmajyosyula seq_printf(m, "W4: lpb_pool_drop \t\t%d\nW4: lpb_aura_pass \t\t%d\n", 127402e202c3SPrakash Brahmajyosyula rq_ctx->lpb_pool_drop, rq_ctx->lpb_aura_pass); 127502e202c3SPrakash Brahmajyosyula seq_printf(m, "W4: lpb_aura_drop \t\t%d\n\n", rq_ctx->lpb_aura_drop); 127602e202c3SPrakash Brahmajyosyula 127702e202c3SPrakash Brahmajyosyula seq_printf(m, "W5: flow_tagw \t\t\t%d\nW5: bad_utag \t\t\t%d\n", 127802e202c3SPrakash Brahmajyosyula rq_ctx->flow_tagw, rq_ctx->bad_utag); 127902e202c3SPrakash Brahmajyosyula seq_printf(m, "W5: good_utag \t\t\t%d\nW5: ltag \t\t\t%d\n\n", 128002e202c3SPrakash Brahmajyosyula rq_ctx->good_utag, rq_ctx->ltag); 128102e202c3SPrakash Brahmajyosyula 128202e202c3SPrakash Brahmajyosyula seq_printf(m, "W6: octs \t\t\t%llu\n\n", (u64)rq_ctx->octs); 128302e202c3SPrakash Brahmajyosyula seq_printf(m, "W7: pkts \t\t\t%llu\n\n", (u64)rq_ctx->pkts); 128402e202c3SPrakash Brahmajyosyula seq_printf(m, "W8: drop_octs \t\t\t%llu\n\n", (u64)rq_ctx->drop_octs); 128502e202c3SPrakash Brahmajyosyula seq_printf(m, "W9: drop_pkts \t\t\t%llu\n\n", (u64)rq_ctx->drop_pkts); 128602e202c3SPrakash Brahmajyosyula seq_printf(m, "W10: re_pkts \t\t\t%llu\n", (u64)rq_ctx->re_pkts); 128702e202c3SPrakash Brahmajyosyula } 128802e202c3SPrakash Brahmajyosyula 128902e202c3SPrakash Brahmajyosyula /* Dumps given nix_cq's context */ 129002e202c3SPrakash Brahmajyosyula static void print_nix_cq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp) 129102e202c3SPrakash Brahmajyosyula { 129202e202c3SPrakash Brahmajyosyula struct nix_cq_ctx_s *cq_ctx = &rsp->cq; 129302e202c3SPrakash Brahmajyosyula 129402e202c3SPrakash Brahmajyosyula seq_printf(m, "W0: base \t\t\t%llx\n\n", cq_ctx->base); 129502e202c3SPrakash Brahmajyosyula 129602e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: wrptr \t\t\t%llx\n", (u64)cq_ctx->wrptr); 129702e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: avg_con \t\t\t%d\nW1: cint_idx \t\t\t%d\n", 129802e202c3SPrakash Brahmajyosyula cq_ctx->avg_con, cq_ctx->cint_idx); 129902e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: cq_err \t\t\t%d\nW1: qint_idx \t\t\t%d\n", 130002e202c3SPrakash Brahmajyosyula cq_ctx->cq_err, cq_ctx->qint_idx); 130102e202c3SPrakash Brahmajyosyula seq_printf(m, "W1: bpid \t\t\t%d\nW1: bp_ena \t\t\t%d\n\n", 130202e202c3SPrakash Brahmajyosyula cq_ctx->bpid, cq_ctx->bp_ena); 130302e202c3SPrakash Brahmajyosyula 130402e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: update_time \t\t%d\nW2:avg_level \t\t\t%d\n", 130502e202c3SPrakash Brahmajyosyula cq_ctx->update_time, cq_ctx->avg_level); 130602e202c3SPrakash Brahmajyosyula seq_printf(m, "W2: head \t\t\t%d\nW2:tail \t\t\t%d\n\n", 130702e202c3SPrakash Brahmajyosyula cq_ctx->head, cq_ctx->tail); 130802e202c3SPrakash Brahmajyosyula 130902e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: cq_err_int_ena \t\t%d\nW3:cq_err_int \t\t\t%d\n", 131002e202c3SPrakash Brahmajyosyula cq_ctx->cq_err_int_ena, cq_ctx->cq_err_int); 131102e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: qsize \t\t\t%d\nW3:caching \t\t\t%d\n", 131202e202c3SPrakash Brahmajyosyula cq_ctx->qsize, cq_ctx->caching); 131302e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: substream \t\t\t0x%03x\nW3: ena \t\t\t%d\n", 131402e202c3SPrakash Brahmajyosyula cq_ctx->substream, cq_ctx->ena); 131502e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: drop_ena \t\t\t%d\nW3: drop \t\t\t%d\n", 131602e202c3SPrakash Brahmajyosyula cq_ctx->drop_ena, cq_ctx->drop); 131702e202c3SPrakash Brahmajyosyula seq_printf(m, "W3: bp \t\t\t\t%d\n\n", cq_ctx->bp); 131802e202c3SPrakash Brahmajyosyula } 131902e202c3SPrakash Brahmajyosyula 132002e202c3SPrakash Brahmajyosyula static int rvu_dbg_nix_queue_ctx_display(struct seq_file *filp, 132102e202c3SPrakash Brahmajyosyula void *unused, int ctype) 132202e202c3SPrakash Brahmajyosyula { 132302e202c3SPrakash Brahmajyosyula void (*print_nix_ctx)(struct seq_file *filp, 132402e202c3SPrakash Brahmajyosyula struct nix_aq_enq_rsp *rsp) = NULL; 13250f3ce484SRakesh Babu struct nix_hw *nix_hw = filp->private; 13260f3ce484SRakesh Babu struct rvu *rvu = nix_hw->rvu; 132702e202c3SPrakash Brahmajyosyula struct nix_aq_enq_req aq_req; 132802e202c3SPrakash Brahmajyosyula struct nix_aq_enq_rsp rsp; 132902e202c3SPrakash Brahmajyosyula char *ctype_string = NULL; 133002e202c3SPrakash Brahmajyosyula int qidx, rc, max_id = 0; 133102e202c3SPrakash Brahmajyosyula struct rvu_pfvf *pfvf; 133202e202c3SPrakash Brahmajyosyula int nixlf, id, all; 133302e202c3SPrakash Brahmajyosyula u16 pcifunc; 133402e202c3SPrakash Brahmajyosyula 133502e202c3SPrakash Brahmajyosyula switch (ctype) { 133602e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_CQ: 133702e202c3SPrakash Brahmajyosyula nixlf = rvu->rvu_dbg.nix_cq_ctx.lf; 133802e202c3SPrakash Brahmajyosyula id = rvu->rvu_dbg.nix_cq_ctx.id; 133902e202c3SPrakash Brahmajyosyula all = rvu->rvu_dbg.nix_cq_ctx.all; 134002e202c3SPrakash Brahmajyosyula break; 134102e202c3SPrakash Brahmajyosyula 134202e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_SQ: 134302e202c3SPrakash Brahmajyosyula nixlf = rvu->rvu_dbg.nix_sq_ctx.lf; 134402e202c3SPrakash Brahmajyosyula id = rvu->rvu_dbg.nix_sq_ctx.id; 134502e202c3SPrakash Brahmajyosyula all = rvu->rvu_dbg.nix_sq_ctx.all; 134602e202c3SPrakash Brahmajyosyula break; 134702e202c3SPrakash Brahmajyosyula 134802e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_RQ: 134902e202c3SPrakash Brahmajyosyula nixlf = rvu->rvu_dbg.nix_rq_ctx.lf; 135002e202c3SPrakash Brahmajyosyula id = rvu->rvu_dbg.nix_rq_ctx.id; 135102e202c3SPrakash Brahmajyosyula all = rvu->rvu_dbg.nix_rq_ctx.all; 135202e202c3SPrakash Brahmajyosyula break; 135302e202c3SPrakash Brahmajyosyula 135402e202c3SPrakash Brahmajyosyula default: 135502e202c3SPrakash Brahmajyosyula return -EINVAL; 135602e202c3SPrakash Brahmajyosyula } 135702e202c3SPrakash Brahmajyosyula 13580f3ce484SRakesh Babu if (!rvu_dbg_is_valid_lf(rvu, nix_hw->blkaddr, nixlf, &pcifunc)) 135902e202c3SPrakash Brahmajyosyula return -EINVAL; 136002e202c3SPrakash Brahmajyosyula 136102e202c3SPrakash Brahmajyosyula pfvf = rvu_get_pfvf(rvu, pcifunc); 136202e202c3SPrakash Brahmajyosyula if (ctype == NIX_AQ_CTYPE_SQ && !pfvf->sq_ctx) { 136302e202c3SPrakash Brahmajyosyula seq_puts(filp, "SQ context is not initialized\n"); 136402e202c3SPrakash Brahmajyosyula return -EINVAL; 136502e202c3SPrakash Brahmajyosyula } else if (ctype == NIX_AQ_CTYPE_RQ && !pfvf->rq_ctx) { 136602e202c3SPrakash Brahmajyosyula seq_puts(filp, "RQ context is not initialized\n"); 136702e202c3SPrakash Brahmajyosyula return -EINVAL; 136802e202c3SPrakash Brahmajyosyula } else if (ctype == NIX_AQ_CTYPE_CQ && !pfvf->cq_ctx) { 136902e202c3SPrakash Brahmajyosyula seq_puts(filp, "CQ context is not initialized\n"); 137002e202c3SPrakash Brahmajyosyula return -EINVAL; 137102e202c3SPrakash Brahmajyosyula } 137202e202c3SPrakash Brahmajyosyula 137302e202c3SPrakash Brahmajyosyula if (ctype == NIX_AQ_CTYPE_SQ) { 137402e202c3SPrakash Brahmajyosyula max_id = pfvf->sq_ctx->qsize; 137502e202c3SPrakash Brahmajyosyula ctype_string = "sq"; 137602e202c3SPrakash Brahmajyosyula print_nix_ctx = print_nix_sq_ctx; 137702e202c3SPrakash Brahmajyosyula } else if (ctype == NIX_AQ_CTYPE_RQ) { 137802e202c3SPrakash Brahmajyosyula max_id = pfvf->rq_ctx->qsize; 137902e202c3SPrakash Brahmajyosyula ctype_string = "rq"; 138002e202c3SPrakash Brahmajyosyula print_nix_ctx = print_nix_rq_ctx; 138102e202c3SPrakash Brahmajyosyula } else if (ctype == NIX_AQ_CTYPE_CQ) { 138202e202c3SPrakash Brahmajyosyula max_id = pfvf->cq_ctx->qsize; 138302e202c3SPrakash Brahmajyosyula ctype_string = "cq"; 138402e202c3SPrakash Brahmajyosyula print_nix_ctx = print_nix_cq_ctx; 138502e202c3SPrakash Brahmajyosyula } 138602e202c3SPrakash Brahmajyosyula 138702e202c3SPrakash Brahmajyosyula memset(&aq_req, 0, sizeof(struct nix_aq_enq_req)); 138802e202c3SPrakash Brahmajyosyula aq_req.hdr.pcifunc = pcifunc; 138902e202c3SPrakash Brahmajyosyula aq_req.ctype = ctype; 139002e202c3SPrakash Brahmajyosyula aq_req.op = NIX_AQ_INSTOP_READ; 139102e202c3SPrakash Brahmajyosyula if (all) 139202e202c3SPrakash Brahmajyosyula id = 0; 139302e202c3SPrakash Brahmajyosyula else 139402e202c3SPrakash Brahmajyosyula max_id = id + 1; 139502e202c3SPrakash Brahmajyosyula for (qidx = id; qidx < max_id; qidx++) { 139602e202c3SPrakash Brahmajyosyula aq_req.qidx = qidx; 139702e202c3SPrakash Brahmajyosyula seq_printf(filp, "=====%s_ctx for nixlf:%d and qidx:%d is=====\n", 139802e202c3SPrakash Brahmajyosyula ctype_string, nixlf, aq_req.qidx); 139902e202c3SPrakash Brahmajyosyula rc = rvu_mbox_handler_nix_aq_enq(rvu, &aq_req, &rsp); 140002e202c3SPrakash Brahmajyosyula if (rc) { 140102e202c3SPrakash Brahmajyosyula seq_puts(filp, "Failed to read the context\n"); 140202e202c3SPrakash Brahmajyosyula return -EINVAL; 140302e202c3SPrakash Brahmajyosyula } 140402e202c3SPrakash Brahmajyosyula print_nix_ctx(filp, &rsp); 140502e202c3SPrakash Brahmajyosyula } 140602e202c3SPrakash Brahmajyosyula return 0; 140702e202c3SPrakash Brahmajyosyula } 140802e202c3SPrakash Brahmajyosyula 140902e202c3SPrakash Brahmajyosyula static int write_nix_queue_ctx(struct rvu *rvu, bool all, int nixlf, 14100f3ce484SRakesh Babu int id, int ctype, char *ctype_string, 14110f3ce484SRakesh Babu struct seq_file *m) 141202e202c3SPrakash Brahmajyosyula { 14130f3ce484SRakesh Babu struct nix_hw *nix_hw = m->private; 141402e202c3SPrakash Brahmajyosyula struct rvu_pfvf *pfvf; 141502e202c3SPrakash Brahmajyosyula int max_id = 0; 141602e202c3SPrakash Brahmajyosyula u16 pcifunc; 141702e202c3SPrakash Brahmajyosyula 14180f3ce484SRakesh Babu if (!rvu_dbg_is_valid_lf(rvu, nix_hw->blkaddr, nixlf, &pcifunc)) 141902e202c3SPrakash Brahmajyosyula return -EINVAL; 142002e202c3SPrakash Brahmajyosyula 142102e202c3SPrakash Brahmajyosyula pfvf = rvu_get_pfvf(rvu, pcifunc); 142202e202c3SPrakash Brahmajyosyula 142302e202c3SPrakash Brahmajyosyula if (ctype == NIX_AQ_CTYPE_SQ) { 142402e202c3SPrakash Brahmajyosyula if (!pfvf->sq_ctx) { 142502e202c3SPrakash Brahmajyosyula dev_warn(rvu->dev, "SQ context is not initialized\n"); 142602e202c3SPrakash Brahmajyosyula return -EINVAL; 142702e202c3SPrakash Brahmajyosyula } 142802e202c3SPrakash Brahmajyosyula max_id = pfvf->sq_ctx->qsize; 142902e202c3SPrakash Brahmajyosyula } else if (ctype == NIX_AQ_CTYPE_RQ) { 143002e202c3SPrakash Brahmajyosyula if (!pfvf->rq_ctx) { 143102e202c3SPrakash Brahmajyosyula dev_warn(rvu->dev, "RQ context is not initialized\n"); 143202e202c3SPrakash Brahmajyosyula return -EINVAL; 143302e202c3SPrakash Brahmajyosyula } 143402e202c3SPrakash Brahmajyosyula max_id = pfvf->rq_ctx->qsize; 143502e202c3SPrakash Brahmajyosyula } else if (ctype == NIX_AQ_CTYPE_CQ) { 143602e202c3SPrakash Brahmajyosyula if (!pfvf->cq_ctx) { 143702e202c3SPrakash Brahmajyosyula dev_warn(rvu->dev, "CQ context is not initialized\n"); 143802e202c3SPrakash Brahmajyosyula return -EINVAL; 143902e202c3SPrakash Brahmajyosyula } 144002e202c3SPrakash Brahmajyosyula max_id = pfvf->cq_ctx->qsize; 144102e202c3SPrakash Brahmajyosyula } 144202e202c3SPrakash Brahmajyosyula 144302e202c3SPrakash Brahmajyosyula if (id < 0 || id >= max_id) { 144402e202c3SPrakash Brahmajyosyula dev_warn(rvu->dev, "Invalid %s_ctx valid range 0-%d\n", 144502e202c3SPrakash Brahmajyosyula ctype_string, max_id - 1); 144602e202c3SPrakash Brahmajyosyula return -EINVAL; 144702e202c3SPrakash Brahmajyosyula } 144802e202c3SPrakash Brahmajyosyula switch (ctype) { 144902e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_CQ: 145002e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_cq_ctx.lf = nixlf; 145102e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_cq_ctx.id = id; 145202e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_cq_ctx.all = all; 145302e202c3SPrakash Brahmajyosyula break; 145402e202c3SPrakash Brahmajyosyula 145502e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_SQ: 145602e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_sq_ctx.lf = nixlf; 145702e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_sq_ctx.id = id; 145802e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_sq_ctx.all = all; 145902e202c3SPrakash Brahmajyosyula break; 146002e202c3SPrakash Brahmajyosyula 146102e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_RQ: 146202e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_rq_ctx.lf = nixlf; 146302e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_rq_ctx.id = id; 146402e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix_rq_ctx.all = all; 146502e202c3SPrakash Brahmajyosyula break; 146602e202c3SPrakash Brahmajyosyula default: 146702e202c3SPrakash Brahmajyosyula return -EINVAL; 146802e202c3SPrakash Brahmajyosyula } 146902e202c3SPrakash Brahmajyosyula return 0; 147002e202c3SPrakash Brahmajyosyula } 147102e202c3SPrakash Brahmajyosyula 147202e202c3SPrakash Brahmajyosyula static ssize_t rvu_dbg_nix_queue_ctx_write(struct file *filp, 147302e202c3SPrakash Brahmajyosyula const char __user *buffer, 147402e202c3SPrakash Brahmajyosyula size_t count, loff_t *ppos, 147502e202c3SPrakash Brahmajyosyula int ctype) 147602e202c3SPrakash Brahmajyosyula { 147702e202c3SPrakash Brahmajyosyula struct seq_file *m = filp->private_data; 14780f3ce484SRakesh Babu struct nix_hw *nix_hw = m->private; 14790f3ce484SRakesh Babu struct rvu *rvu = nix_hw->rvu; 148002e202c3SPrakash Brahmajyosyula char *cmd_buf, *ctype_string; 148102e202c3SPrakash Brahmajyosyula int nixlf, id = 0, ret; 148202e202c3SPrakash Brahmajyosyula bool all = false; 148302e202c3SPrakash Brahmajyosyula 148402e202c3SPrakash Brahmajyosyula if ((*ppos != 0) || !count) 148502e202c3SPrakash Brahmajyosyula return -EINVAL; 148602e202c3SPrakash Brahmajyosyula 148702e202c3SPrakash Brahmajyosyula switch (ctype) { 148802e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_SQ: 148902e202c3SPrakash Brahmajyosyula ctype_string = "sq"; 149002e202c3SPrakash Brahmajyosyula break; 149102e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_RQ: 149202e202c3SPrakash Brahmajyosyula ctype_string = "rq"; 149302e202c3SPrakash Brahmajyosyula break; 149402e202c3SPrakash Brahmajyosyula case NIX_AQ_CTYPE_CQ: 149502e202c3SPrakash Brahmajyosyula ctype_string = "cq"; 149602e202c3SPrakash Brahmajyosyula break; 149702e202c3SPrakash Brahmajyosyula default: 149802e202c3SPrakash Brahmajyosyula return -EINVAL; 149902e202c3SPrakash Brahmajyosyula } 150002e202c3SPrakash Brahmajyosyula 150102e202c3SPrakash Brahmajyosyula cmd_buf = kzalloc(count + 1, GFP_KERNEL); 150202e202c3SPrakash Brahmajyosyula 150302e202c3SPrakash Brahmajyosyula if (!cmd_buf) 150402e202c3SPrakash Brahmajyosyula return count; 150502e202c3SPrakash Brahmajyosyula 150602e202c3SPrakash Brahmajyosyula ret = parse_cmd_buffer_ctx(cmd_buf, &count, buffer, 150702e202c3SPrakash Brahmajyosyula &nixlf, &id, &all); 150802e202c3SPrakash Brahmajyosyula if (ret < 0) { 150902e202c3SPrakash Brahmajyosyula dev_info(rvu->dev, 151002e202c3SPrakash Brahmajyosyula "Usage: echo <nixlf> [%s number/all] > %s_ctx\n", 151102e202c3SPrakash Brahmajyosyula ctype_string, ctype_string); 151202e202c3SPrakash Brahmajyosyula goto done; 151302e202c3SPrakash Brahmajyosyula } else { 151402e202c3SPrakash Brahmajyosyula ret = write_nix_queue_ctx(rvu, all, nixlf, id, ctype, 15150f3ce484SRakesh Babu ctype_string, m); 151602e202c3SPrakash Brahmajyosyula } 151702e202c3SPrakash Brahmajyosyula done: 151802e202c3SPrakash Brahmajyosyula kfree(cmd_buf); 151902e202c3SPrakash Brahmajyosyula return ret ? ret : count; 152002e202c3SPrakash Brahmajyosyula } 152102e202c3SPrakash Brahmajyosyula 152202e202c3SPrakash Brahmajyosyula static ssize_t rvu_dbg_nix_sq_ctx_write(struct file *filp, 152302e202c3SPrakash Brahmajyosyula const char __user *buffer, 152402e202c3SPrakash Brahmajyosyula size_t count, loff_t *ppos) 152502e202c3SPrakash Brahmajyosyula { 152602e202c3SPrakash Brahmajyosyula return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos, 152702e202c3SPrakash Brahmajyosyula NIX_AQ_CTYPE_SQ); 152802e202c3SPrakash Brahmajyosyula } 152902e202c3SPrakash Brahmajyosyula 153002e202c3SPrakash Brahmajyosyula static int rvu_dbg_nix_sq_ctx_display(struct seq_file *filp, void *unused) 153102e202c3SPrakash Brahmajyosyula { 153202e202c3SPrakash Brahmajyosyula return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_SQ); 153302e202c3SPrakash Brahmajyosyula } 153402e202c3SPrakash Brahmajyosyula 153502e202c3SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(nix_sq_ctx, nix_sq_ctx_display, nix_sq_ctx_write); 153602e202c3SPrakash Brahmajyosyula 153702e202c3SPrakash Brahmajyosyula static ssize_t rvu_dbg_nix_rq_ctx_write(struct file *filp, 153802e202c3SPrakash Brahmajyosyula const char __user *buffer, 153902e202c3SPrakash Brahmajyosyula size_t count, loff_t *ppos) 154002e202c3SPrakash Brahmajyosyula { 154102e202c3SPrakash Brahmajyosyula return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos, 154202e202c3SPrakash Brahmajyosyula NIX_AQ_CTYPE_RQ); 154302e202c3SPrakash Brahmajyosyula } 154402e202c3SPrakash Brahmajyosyula 154502e202c3SPrakash Brahmajyosyula static int rvu_dbg_nix_rq_ctx_display(struct seq_file *filp, void *unused) 154602e202c3SPrakash Brahmajyosyula { 154702e202c3SPrakash Brahmajyosyula return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_RQ); 154802e202c3SPrakash Brahmajyosyula } 154902e202c3SPrakash Brahmajyosyula 155002e202c3SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(nix_rq_ctx, nix_rq_ctx_display, nix_rq_ctx_write); 155102e202c3SPrakash Brahmajyosyula 155202e202c3SPrakash Brahmajyosyula static ssize_t rvu_dbg_nix_cq_ctx_write(struct file *filp, 155302e202c3SPrakash Brahmajyosyula const char __user *buffer, 155402e202c3SPrakash Brahmajyosyula size_t count, loff_t *ppos) 155502e202c3SPrakash Brahmajyosyula { 155602e202c3SPrakash Brahmajyosyula return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos, 155702e202c3SPrakash Brahmajyosyula NIX_AQ_CTYPE_CQ); 155802e202c3SPrakash Brahmajyosyula } 155902e202c3SPrakash Brahmajyosyula 156002e202c3SPrakash Brahmajyosyula static int rvu_dbg_nix_cq_ctx_display(struct seq_file *filp, void *unused) 156102e202c3SPrakash Brahmajyosyula { 156202e202c3SPrakash Brahmajyosyula return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_CQ); 156302e202c3SPrakash Brahmajyosyula } 156402e202c3SPrakash Brahmajyosyula 156502e202c3SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(nix_cq_ctx, nix_cq_ctx_display, nix_cq_ctx_write); 156602e202c3SPrakash Brahmajyosyula 156702e202c3SPrakash Brahmajyosyula static void print_nix_qctx_qsize(struct seq_file *filp, int qsize, 156802e202c3SPrakash Brahmajyosyula unsigned long *bmap, char *qtype) 156902e202c3SPrakash Brahmajyosyula { 157002e202c3SPrakash Brahmajyosyula char *buf; 157102e202c3SPrakash Brahmajyosyula 157202e202c3SPrakash Brahmajyosyula buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 157302e202c3SPrakash Brahmajyosyula if (!buf) 157402e202c3SPrakash Brahmajyosyula return; 157502e202c3SPrakash Brahmajyosyula 157602e202c3SPrakash Brahmajyosyula bitmap_print_to_pagebuf(false, buf, bmap, qsize); 157702e202c3SPrakash Brahmajyosyula seq_printf(filp, "%s context count : %d\n", qtype, qsize); 157802e202c3SPrakash Brahmajyosyula seq_printf(filp, "%s context ena/dis bitmap : %s\n", 157902e202c3SPrakash Brahmajyosyula qtype, buf); 158002e202c3SPrakash Brahmajyosyula kfree(buf); 158102e202c3SPrakash Brahmajyosyula } 158202e202c3SPrakash Brahmajyosyula 158302e202c3SPrakash Brahmajyosyula static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf) 158402e202c3SPrakash Brahmajyosyula { 158502e202c3SPrakash Brahmajyosyula if (!pfvf->cq_ctx) 158602e202c3SPrakash Brahmajyosyula seq_puts(filp, "cq context is not initialized\n"); 158702e202c3SPrakash Brahmajyosyula else 158802e202c3SPrakash Brahmajyosyula print_nix_qctx_qsize(filp, pfvf->cq_ctx->qsize, pfvf->cq_bmap, 158902e202c3SPrakash Brahmajyosyula "cq"); 159002e202c3SPrakash Brahmajyosyula 159102e202c3SPrakash Brahmajyosyula if (!pfvf->rq_ctx) 159202e202c3SPrakash Brahmajyosyula seq_puts(filp, "rq context is not initialized\n"); 159302e202c3SPrakash Brahmajyosyula else 159402e202c3SPrakash Brahmajyosyula print_nix_qctx_qsize(filp, pfvf->rq_ctx->qsize, pfvf->rq_bmap, 159502e202c3SPrakash Brahmajyosyula "rq"); 159602e202c3SPrakash Brahmajyosyula 159702e202c3SPrakash Brahmajyosyula if (!pfvf->sq_ctx) 159802e202c3SPrakash Brahmajyosyula seq_puts(filp, "sq context is not initialized\n"); 159902e202c3SPrakash Brahmajyosyula else 160002e202c3SPrakash Brahmajyosyula print_nix_qctx_qsize(filp, pfvf->sq_ctx->qsize, pfvf->sq_bmap, 160102e202c3SPrakash Brahmajyosyula "sq"); 160202e202c3SPrakash Brahmajyosyula } 160302e202c3SPrakash Brahmajyosyula 160402e202c3SPrakash Brahmajyosyula static ssize_t rvu_dbg_nix_qsize_write(struct file *filp, 160502e202c3SPrakash Brahmajyosyula const char __user *buffer, 160602e202c3SPrakash Brahmajyosyula size_t count, loff_t *ppos) 160702e202c3SPrakash Brahmajyosyula { 160802e202c3SPrakash Brahmajyosyula return rvu_dbg_qsize_write(filp, buffer, count, ppos, 160902e202c3SPrakash Brahmajyosyula BLKTYPE_NIX); 161002e202c3SPrakash Brahmajyosyula } 161102e202c3SPrakash Brahmajyosyula 161202e202c3SPrakash Brahmajyosyula static int rvu_dbg_nix_qsize_display(struct seq_file *filp, void *unused) 161302e202c3SPrakash Brahmajyosyula { 161402e202c3SPrakash Brahmajyosyula return rvu_dbg_qsize_display(filp, unused, BLKTYPE_NIX); 161502e202c3SPrakash Brahmajyosyula } 161602e202c3SPrakash Brahmajyosyula 161702e202c3SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(nix_qsize, nix_qsize_display, nix_qsize_write); 161802e202c3SPrakash Brahmajyosyula 16190f3ce484SRakesh Babu static void rvu_dbg_nix_init(struct rvu *rvu, int blkaddr) 162002e202c3SPrakash Brahmajyosyula { 16210f3ce484SRakesh Babu struct nix_hw *nix_hw; 162202e202c3SPrakash Brahmajyosyula 16230f3ce484SRakesh Babu if (!is_block_implemented(rvu->hw, blkaddr)) 16240f3ce484SRakesh Babu return; 16250f3ce484SRakesh Babu 16260f3ce484SRakesh Babu if (blkaddr == BLKADDR_NIX0) { 162702e202c3SPrakash Brahmajyosyula rvu->rvu_dbg.nix = debugfs_create_dir("nix", rvu->rvu_dbg.root); 16280f3ce484SRakesh Babu nix_hw = &rvu->hw->nix[0]; 16290f3ce484SRakesh Babu } else { 16300f3ce484SRakesh Babu rvu->rvu_dbg.nix = debugfs_create_dir("nix1", 16310f3ce484SRakesh Babu rvu->rvu_dbg.root); 16320f3ce484SRakesh Babu nix_hw = &rvu->hw->nix[1]; 16330f3ce484SRakesh Babu } 163402e202c3SPrakash Brahmajyosyula 16352ce5a307SDan Carpenter debugfs_create_file("sq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw, 163602e202c3SPrakash Brahmajyosyula &rvu_dbg_nix_sq_ctx_fops); 16372ce5a307SDan Carpenter debugfs_create_file("rq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw, 163802e202c3SPrakash Brahmajyosyula &rvu_dbg_nix_rq_ctx_fops); 16392ce5a307SDan Carpenter debugfs_create_file("cq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw, 164002e202c3SPrakash Brahmajyosyula &rvu_dbg_nix_cq_ctx_fops); 16412ce5a307SDan Carpenter debugfs_create_file("ndc_tx_cache", 0600, rvu->rvu_dbg.nix, nix_hw, 16422ce5a307SDan Carpenter &rvu_dbg_nix_ndc_tx_cache_fops); 16432ce5a307SDan Carpenter debugfs_create_file("ndc_rx_cache", 0600, rvu->rvu_dbg.nix, nix_hw, 16442ce5a307SDan Carpenter &rvu_dbg_nix_ndc_rx_cache_fops); 16452ce5a307SDan Carpenter debugfs_create_file("ndc_tx_hits_miss", 0600, rvu->rvu_dbg.nix, nix_hw, 16460f3ce484SRakesh Babu &rvu_dbg_nix_ndc_tx_hits_miss_fops); 16472ce5a307SDan Carpenter debugfs_create_file("ndc_rx_hits_miss", 0600, rvu->rvu_dbg.nix, nix_hw, 16480f3ce484SRakesh Babu &rvu_dbg_nix_ndc_rx_hits_miss_fops); 16492ce5a307SDan Carpenter debugfs_create_file("qsize", 0600, rvu->rvu_dbg.nix, rvu, 165002e202c3SPrakash Brahmajyosyula &rvu_dbg_nix_qsize_fops); 165102e202c3SPrakash Brahmajyosyula } 165202e202c3SPrakash Brahmajyosyula 16538756828aSChristina Jacob static void rvu_dbg_npa_init(struct rvu *rvu) 16548756828aSChristina Jacob { 16558756828aSChristina Jacob rvu->rvu_dbg.npa = debugfs_create_dir("npa", rvu->rvu_dbg.root); 16568756828aSChristina Jacob 16572ce5a307SDan Carpenter debugfs_create_file("qsize", 0600, rvu->rvu_dbg.npa, rvu, 16588756828aSChristina Jacob &rvu_dbg_npa_qsize_fops); 16592ce5a307SDan Carpenter debugfs_create_file("aura_ctx", 0600, rvu->rvu_dbg.npa, rvu, 16608756828aSChristina Jacob &rvu_dbg_npa_aura_ctx_fops); 16612ce5a307SDan Carpenter debugfs_create_file("pool_ctx", 0600, rvu->rvu_dbg.npa, rvu, 16628756828aSChristina Jacob &rvu_dbg_npa_pool_ctx_fops); 16632ce5a307SDan Carpenter debugfs_create_file("ndc_cache", 0600, rvu->rvu_dbg.npa, rvu, 1664c5a797e0SPrakash Brahmajyosyula &rvu_dbg_npa_ndc_cache_fops); 16652ce5a307SDan Carpenter debugfs_create_file("ndc_hits_miss", 0600, rvu->rvu_dbg.npa, rvu, 16662ce5a307SDan Carpenter &rvu_dbg_npa_ndc_hits_miss_fops); 16678756828aSChristina Jacob } 16688756828aSChristina Jacob 1669f967488dSLinu Cherian #define PRINT_CGX_CUML_NIXRX_STATUS(idx, name) \ 1670f967488dSLinu Cherian ({ \ 1671f967488dSLinu Cherian u64 cnt; \ 1672f967488dSLinu Cherian err = rvu_cgx_nix_cuml_stats(rvu, cgxd, lmac_id, (idx), \ 1673f967488dSLinu Cherian NIX_STATS_RX, &(cnt)); \ 1674f967488dSLinu Cherian if (!err) \ 1675f967488dSLinu Cherian seq_printf(s, "%s: %llu\n", name, cnt); \ 1676f967488dSLinu Cherian cnt; \ 1677f967488dSLinu Cherian }) 1678f967488dSLinu Cherian 1679f967488dSLinu Cherian #define PRINT_CGX_CUML_NIXTX_STATUS(idx, name) \ 1680f967488dSLinu Cherian ({ \ 1681f967488dSLinu Cherian u64 cnt; \ 1682f967488dSLinu Cherian err = rvu_cgx_nix_cuml_stats(rvu, cgxd, lmac_id, (idx), \ 1683f967488dSLinu Cherian NIX_STATS_TX, &(cnt)); \ 1684f967488dSLinu Cherian if (!err) \ 1685f967488dSLinu Cherian seq_printf(s, "%s: %llu\n", name, cnt); \ 1686f967488dSLinu Cherian cnt; \ 1687f967488dSLinu Cherian }) 1688f967488dSLinu Cherian 1689c57211b5SPrakash Brahmajyosyula static int cgx_print_stats(struct seq_file *s, int lmac_id) 1690c57211b5SPrakash Brahmajyosyula { 1691c57211b5SPrakash Brahmajyosyula struct cgx_link_user_info linfo; 169291c6945eSHariprasad Kelam struct mac_ops *mac_ops; 1693c57211b5SPrakash Brahmajyosyula void *cgxd = s->private; 1694f967488dSLinu Cherian u64 ucast, mcast, bcast; 1695c57211b5SPrakash Brahmajyosyula int stat = 0, err = 0; 1696c57211b5SPrakash Brahmajyosyula u64 tx_stat, rx_stat; 1697f967488dSLinu Cherian struct rvu *rvu; 1698f967488dSLinu Cherian 1699f967488dSLinu Cherian rvu = pci_get_drvdata(pci_get_device(PCI_VENDOR_ID_CAVIUM, 1700f967488dSLinu Cherian PCI_DEVID_OCTEONTX2_RVU_AF, NULL)); 1701f967488dSLinu Cherian if (!rvu) 1702f967488dSLinu Cherian return -ENODEV; 1703c57211b5SPrakash Brahmajyosyula 170491c6945eSHariprasad Kelam mac_ops = get_mac_ops(cgxd); 170591c6945eSHariprasad Kelam 170691c6945eSHariprasad Kelam if (!mac_ops) 170791c6945eSHariprasad Kelam return 0; 170891c6945eSHariprasad Kelam 1709c57211b5SPrakash Brahmajyosyula /* Link status */ 1710c57211b5SPrakash Brahmajyosyula seq_puts(s, "\n=======Link Status======\n\n"); 1711c57211b5SPrakash Brahmajyosyula err = cgx_get_link_info(cgxd, lmac_id, &linfo); 1712c57211b5SPrakash Brahmajyosyula if (err) 1713c57211b5SPrakash Brahmajyosyula seq_puts(s, "Failed to read link status\n"); 1714c57211b5SPrakash Brahmajyosyula seq_printf(s, "\nLink is %s %d Mbps\n\n", 1715c57211b5SPrakash Brahmajyosyula linfo.link_up ? "UP" : "DOWN", linfo.speed); 1716c57211b5SPrakash Brahmajyosyula 1717c57211b5SPrakash Brahmajyosyula /* Rx stats */ 171891c6945eSHariprasad Kelam seq_printf(s, "\n=======NIX RX_STATS(%s port level)======\n\n", 171991c6945eSHariprasad Kelam mac_ops->name); 1720f967488dSLinu Cherian ucast = PRINT_CGX_CUML_NIXRX_STATUS(RX_UCAST, "rx_ucast_frames"); 1721f967488dSLinu Cherian if (err) 1722f967488dSLinu Cherian return err; 1723f967488dSLinu Cherian mcast = PRINT_CGX_CUML_NIXRX_STATUS(RX_MCAST, "rx_mcast_frames"); 1724f967488dSLinu Cherian if (err) 1725f967488dSLinu Cherian return err; 1726f967488dSLinu Cherian bcast = PRINT_CGX_CUML_NIXRX_STATUS(RX_BCAST, "rx_bcast_frames"); 1727f967488dSLinu Cherian if (err) 1728f967488dSLinu Cherian return err; 1729f967488dSLinu Cherian seq_printf(s, "rx_frames: %llu\n", ucast + mcast + bcast); 1730f967488dSLinu Cherian PRINT_CGX_CUML_NIXRX_STATUS(RX_OCTS, "rx_bytes"); 1731f967488dSLinu Cherian if (err) 1732f967488dSLinu Cherian return err; 1733f967488dSLinu Cherian PRINT_CGX_CUML_NIXRX_STATUS(RX_DROP, "rx_drops"); 1734f967488dSLinu Cherian if (err) 1735f967488dSLinu Cherian return err; 1736f967488dSLinu Cherian PRINT_CGX_CUML_NIXRX_STATUS(RX_ERR, "rx_errors"); 1737f967488dSLinu Cherian if (err) 1738f967488dSLinu Cherian return err; 1739f967488dSLinu Cherian 1740f967488dSLinu Cherian /* Tx stats */ 174191c6945eSHariprasad Kelam seq_printf(s, "\n=======NIX TX_STATS(%s port level)======\n\n", 174291c6945eSHariprasad Kelam mac_ops->name); 1743f967488dSLinu Cherian ucast = PRINT_CGX_CUML_NIXTX_STATUS(TX_UCAST, "tx_ucast_frames"); 1744f967488dSLinu Cherian if (err) 1745f967488dSLinu Cherian return err; 1746f967488dSLinu Cherian mcast = PRINT_CGX_CUML_NIXTX_STATUS(TX_MCAST, "tx_mcast_frames"); 1747f967488dSLinu Cherian if (err) 1748f967488dSLinu Cherian return err; 1749f967488dSLinu Cherian bcast = PRINT_CGX_CUML_NIXTX_STATUS(TX_BCAST, "tx_bcast_frames"); 1750f967488dSLinu Cherian if (err) 1751f967488dSLinu Cherian return err; 1752f967488dSLinu Cherian seq_printf(s, "tx_frames: %llu\n", ucast + mcast + bcast); 1753f967488dSLinu Cherian PRINT_CGX_CUML_NIXTX_STATUS(TX_OCTS, "tx_bytes"); 1754f967488dSLinu Cherian if (err) 1755f967488dSLinu Cherian return err; 1756f967488dSLinu Cherian PRINT_CGX_CUML_NIXTX_STATUS(TX_DROP, "tx_drops"); 1757f967488dSLinu Cherian if (err) 1758f967488dSLinu Cherian return err; 1759f967488dSLinu Cherian 1760f967488dSLinu Cherian /* Rx stats */ 176191c6945eSHariprasad Kelam seq_printf(s, "\n=======%s RX_STATS======\n\n", mac_ops->name); 1762ce7a6c31SHariprasad Kelam while (stat < mac_ops->rx_stats_cnt) { 1763ce7a6c31SHariprasad Kelam err = mac_ops->mac_get_rx_stats(cgxd, lmac_id, stat, &rx_stat); 1764c57211b5SPrakash Brahmajyosyula if (err) 1765c57211b5SPrakash Brahmajyosyula return err; 1766ce7a6c31SHariprasad Kelam if (is_rvu_otx2(rvu)) 1767ce7a6c31SHariprasad Kelam seq_printf(s, "%s: %llu\n", cgx_rx_stats_fields[stat], 1768ce7a6c31SHariprasad Kelam rx_stat); 1769ce7a6c31SHariprasad Kelam else 1770ce7a6c31SHariprasad Kelam seq_printf(s, "%s: %llu\n", rpm_rx_stats_fields[stat], 1771ce7a6c31SHariprasad Kelam rx_stat); 1772c57211b5SPrakash Brahmajyosyula stat++; 1773c57211b5SPrakash Brahmajyosyula } 1774c57211b5SPrakash Brahmajyosyula 1775c57211b5SPrakash Brahmajyosyula /* Tx stats */ 1776c57211b5SPrakash Brahmajyosyula stat = 0; 177791c6945eSHariprasad Kelam seq_printf(s, "\n=======%s TX_STATS======\n\n", mac_ops->name); 1778ce7a6c31SHariprasad Kelam while (stat < mac_ops->tx_stats_cnt) { 1779ce7a6c31SHariprasad Kelam err = mac_ops->mac_get_tx_stats(cgxd, lmac_id, stat, &tx_stat); 1780c57211b5SPrakash Brahmajyosyula if (err) 1781c57211b5SPrakash Brahmajyosyula return err; 1782ce7a6c31SHariprasad Kelam 1783ce7a6c31SHariprasad Kelam if (is_rvu_otx2(rvu)) 1784ce7a6c31SHariprasad Kelam seq_printf(s, "%s: %llu\n", cgx_tx_stats_fields[stat], 1785ce7a6c31SHariprasad Kelam tx_stat); 1786ce7a6c31SHariprasad Kelam else 1787ce7a6c31SHariprasad Kelam seq_printf(s, "%s: %llu\n", rpm_tx_stats_fields[stat], 1788ce7a6c31SHariprasad Kelam tx_stat); 1789c57211b5SPrakash Brahmajyosyula stat++; 1790c57211b5SPrakash Brahmajyosyula } 1791c57211b5SPrakash Brahmajyosyula 1792c57211b5SPrakash Brahmajyosyula return err; 1793c57211b5SPrakash Brahmajyosyula } 1794c57211b5SPrakash Brahmajyosyula 1795c57211b5SPrakash Brahmajyosyula static int rvu_dbg_cgx_stat_display(struct seq_file *filp, void *unused) 1796c57211b5SPrakash Brahmajyosyula { 1797c57211b5SPrakash Brahmajyosyula struct dentry *current_dir; 1798c57211b5SPrakash Brahmajyosyula int err, lmac_id; 1799c57211b5SPrakash Brahmajyosyula char *buf; 1800c57211b5SPrakash Brahmajyosyula 1801c57211b5SPrakash Brahmajyosyula current_dir = filp->file->f_path.dentry->d_parent; 1802c57211b5SPrakash Brahmajyosyula buf = strrchr(current_dir->d_name.name, 'c'); 1803c57211b5SPrakash Brahmajyosyula if (!buf) 1804c57211b5SPrakash Brahmajyosyula return -EINVAL; 1805c57211b5SPrakash Brahmajyosyula 1806c57211b5SPrakash Brahmajyosyula err = kstrtoint(buf + 1, 10, &lmac_id); 1807c57211b5SPrakash Brahmajyosyula if (!err) { 1808c57211b5SPrakash Brahmajyosyula err = cgx_print_stats(filp, lmac_id); 1809c57211b5SPrakash Brahmajyosyula if (err) 1810c57211b5SPrakash Brahmajyosyula return err; 1811c57211b5SPrakash Brahmajyosyula } 1812c57211b5SPrakash Brahmajyosyula return err; 1813c57211b5SPrakash Brahmajyosyula } 1814c57211b5SPrakash Brahmajyosyula 1815c57211b5SPrakash Brahmajyosyula RVU_DEBUG_SEQ_FOPS(cgx_stat, cgx_stat_display, NULL); 1816c57211b5SPrakash Brahmajyosyula 1817c57211b5SPrakash Brahmajyosyula static void rvu_dbg_cgx_init(struct rvu *rvu) 1818c57211b5SPrakash Brahmajyosyula { 181991c6945eSHariprasad Kelam struct mac_ops *mac_ops; 182091c6945eSHariprasad Kelam unsigned long lmac_bmap; 182191c6945eSHariprasad Kelam int rvu_def_cgx_id = 0; 1822c57211b5SPrakash Brahmajyosyula int i, lmac_id; 1823c57211b5SPrakash Brahmajyosyula char dname[20]; 1824c57211b5SPrakash Brahmajyosyula void *cgx; 1825c57211b5SPrakash Brahmajyosyula 18263feac505SGeetha sowjanya if (!cgx_get_cgxcnt_max()) 18273feac505SGeetha sowjanya return; 18283feac505SGeetha sowjanya 182991c6945eSHariprasad Kelam mac_ops = get_mac_ops(rvu_cgx_pdata(rvu_def_cgx_id, rvu)); 183091c6945eSHariprasad Kelam if (!mac_ops) 183191c6945eSHariprasad Kelam return; 183291c6945eSHariprasad Kelam 183391c6945eSHariprasad Kelam rvu->rvu_dbg.cgx_root = debugfs_create_dir(mac_ops->name, 183491c6945eSHariprasad Kelam rvu->rvu_dbg.root); 1835c57211b5SPrakash Brahmajyosyula 1836c57211b5SPrakash Brahmajyosyula for (i = 0; i < cgx_get_cgxcnt_max(); i++) { 1837c57211b5SPrakash Brahmajyosyula cgx = rvu_cgx_pdata(i, rvu); 1838c57211b5SPrakash Brahmajyosyula if (!cgx) 1839c57211b5SPrakash Brahmajyosyula continue; 184091c6945eSHariprasad Kelam lmac_bmap = cgx_get_lmac_bmap(cgx); 1841c57211b5SPrakash Brahmajyosyula /* cgx debugfs dir */ 184291c6945eSHariprasad Kelam sprintf(dname, "%s%d", mac_ops->name, i); 1843c57211b5SPrakash Brahmajyosyula rvu->rvu_dbg.cgx = debugfs_create_dir(dname, 1844c57211b5SPrakash Brahmajyosyula rvu->rvu_dbg.cgx_root); 184591c6945eSHariprasad Kelam 184691c6945eSHariprasad Kelam for_each_set_bit(lmac_id, &lmac_bmap, MAX_LMAC_PER_CGX) { 1847c57211b5SPrakash Brahmajyosyula /* lmac debugfs dir */ 1848c57211b5SPrakash Brahmajyosyula sprintf(dname, "lmac%d", lmac_id); 1849c57211b5SPrakash Brahmajyosyula rvu->rvu_dbg.lmac = 1850c57211b5SPrakash Brahmajyosyula debugfs_create_dir(dname, rvu->rvu_dbg.cgx); 1851c57211b5SPrakash Brahmajyosyula 18522ce5a307SDan Carpenter debugfs_create_file("stats", 0600, rvu->rvu_dbg.lmac, 18532ce5a307SDan Carpenter cgx, &rvu_dbg_cgx_stat_fops); 1854c57211b5SPrakash Brahmajyosyula } 1855c57211b5SPrakash Brahmajyosyula } 1856c57211b5SPrakash Brahmajyosyula } 1857c57211b5SPrakash Brahmajyosyula 1858e07fb507SSunil Goutham /* NPC debugfs APIs */ 1859e07fb507SSunil Goutham static void rvu_print_npc_mcam_info(struct seq_file *s, 1860e07fb507SSunil Goutham u16 pcifunc, int blkaddr) 1861e07fb507SSunil Goutham { 1862e07fb507SSunil Goutham struct rvu *rvu = s->private; 1863e07fb507SSunil Goutham int entry_acnt, entry_ecnt; 1864e07fb507SSunil Goutham int cntr_acnt, cntr_ecnt; 1865e07fb507SSunil Goutham 1866e07fb507SSunil Goutham /* Skip PF0 */ 1867e07fb507SSunil Goutham if (!pcifunc) 1868e07fb507SSunil Goutham return; 1869e07fb507SSunil Goutham rvu_npc_get_mcam_entry_alloc_info(rvu, pcifunc, blkaddr, 1870e07fb507SSunil Goutham &entry_acnt, &entry_ecnt); 1871e07fb507SSunil Goutham rvu_npc_get_mcam_counter_alloc_info(rvu, pcifunc, blkaddr, 1872e07fb507SSunil Goutham &cntr_acnt, &cntr_ecnt); 1873e07fb507SSunil Goutham if (!entry_acnt && !cntr_acnt) 1874e07fb507SSunil Goutham return; 1875e07fb507SSunil Goutham 1876e07fb507SSunil Goutham if (!(pcifunc & RVU_PFVF_FUNC_MASK)) 1877e07fb507SSunil Goutham seq_printf(s, "\n\t\t Device \t\t: PF%d\n", 1878e07fb507SSunil Goutham rvu_get_pf(pcifunc)); 1879e07fb507SSunil Goutham else 1880e07fb507SSunil Goutham seq_printf(s, "\n\t\t Device \t\t: PF%d VF%d\n", 1881e07fb507SSunil Goutham rvu_get_pf(pcifunc), 1882e07fb507SSunil Goutham (pcifunc & RVU_PFVF_FUNC_MASK) - 1); 1883e07fb507SSunil Goutham 1884e07fb507SSunil Goutham if (entry_acnt) { 1885e07fb507SSunil Goutham seq_printf(s, "\t\t Entries allocated \t: %d\n", entry_acnt); 1886e07fb507SSunil Goutham seq_printf(s, "\t\t Entries enabled \t: %d\n", entry_ecnt); 1887e07fb507SSunil Goutham } 1888e07fb507SSunil Goutham if (cntr_acnt) { 1889e07fb507SSunil Goutham seq_printf(s, "\t\t Counters allocated \t: %d\n", cntr_acnt); 1890e07fb507SSunil Goutham seq_printf(s, "\t\t Counters enabled \t: %d\n", cntr_ecnt); 1891e07fb507SSunil Goutham } 1892e07fb507SSunil Goutham } 1893e07fb507SSunil Goutham 1894e07fb507SSunil Goutham static int rvu_dbg_npc_mcam_info_display(struct seq_file *filp, void *unsued) 1895e07fb507SSunil Goutham { 1896e07fb507SSunil Goutham struct rvu *rvu = filp->private; 1897e07fb507SSunil Goutham int pf, vf, numvfs, blkaddr; 1898e07fb507SSunil Goutham struct npc_mcam *mcam; 18991c1935c9SSubbaraya Sundeep u16 pcifunc, counters; 1900e07fb507SSunil Goutham u64 cfg; 1901e07fb507SSunil Goutham 1902e07fb507SSunil Goutham blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0); 1903e07fb507SSunil Goutham if (blkaddr < 0) 1904e07fb507SSunil Goutham return -ENODEV; 1905e07fb507SSunil Goutham 1906e07fb507SSunil Goutham mcam = &rvu->hw->mcam; 19071c1935c9SSubbaraya Sundeep counters = rvu->hw->npc_counters; 1908e07fb507SSunil Goutham 1909e07fb507SSunil Goutham seq_puts(filp, "\nNPC MCAM info:\n"); 1910e07fb507SSunil Goutham /* MCAM keywidth on receive and transmit sides */ 1911e07fb507SSunil Goutham cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_RX)); 1912e07fb507SSunil Goutham cfg = (cfg >> 32) & 0x07; 1913e07fb507SSunil Goutham seq_printf(filp, "\t\t RX keywidth \t: %s\n", (cfg == NPC_MCAM_KEY_X1) ? 1914e07fb507SSunil Goutham "112bits" : ((cfg == NPC_MCAM_KEY_X2) ? 1915e07fb507SSunil Goutham "224bits" : "448bits")); 1916e07fb507SSunil Goutham cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_TX)); 1917e07fb507SSunil Goutham cfg = (cfg >> 32) & 0x07; 1918e07fb507SSunil Goutham seq_printf(filp, "\t\t TX keywidth \t: %s\n", (cfg == NPC_MCAM_KEY_X1) ? 1919e07fb507SSunil Goutham "112bits" : ((cfg == NPC_MCAM_KEY_X2) ? 1920e07fb507SSunil Goutham "224bits" : "448bits")); 1921e07fb507SSunil Goutham 1922e07fb507SSunil Goutham mutex_lock(&mcam->lock); 1923e07fb507SSunil Goutham /* MCAM entries */ 1924e07fb507SSunil Goutham seq_printf(filp, "\n\t\t MCAM entries \t: %d\n", mcam->total_entries); 1925e07fb507SSunil Goutham seq_printf(filp, "\t\t Reserved \t: %d\n", 1926e07fb507SSunil Goutham mcam->total_entries - mcam->bmap_entries); 1927e07fb507SSunil Goutham seq_printf(filp, "\t\t Available \t: %d\n", mcam->bmap_fcnt); 1928e07fb507SSunil Goutham 1929e07fb507SSunil Goutham /* MCAM counters */ 19301c1935c9SSubbaraya Sundeep seq_printf(filp, "\n\t\t MCAM counters \t: %d\n", counters); 19311c1935c9SSubbaraya Sundeep seq_printf(filp, "\t\t Reserved \t: %d\n", 19321c1935c9SSubbaraya Sundeep counters - mcam->counters.max); 1933e07fb507SSunil Goutham seq_printf(filp, "\t\t Available \t: %d\n", 1934e07fb507SSunil Goutham rvu_rsrc_free_count(&mcam->counters)); 1935e07fb507SSunil Goutham 1936e07fb507SSunil Goutham if (mcam->bmap_entries == mcam->bmap_fcnt) { 1937e07fb507SSunil Goutham mutex_unlock(&mcam->lock); 1938e07fb507SSunil Goutham return 0; 1939e07fb507SSunil Goutham } 1940e07fb507SSunil Goutham 1941e07fb507SSunil Goutham seq_puts(filp, "\n\t\t Current allocation\n"); 1942e07fb507SSunil Goutham seq_puts(filp, "\t\t====================\n"); 1943e07fb507SSunil Goutham for (pf = 0; pf < rvu->hw->total_pfs; pf++) { 1944e07fb507SSunil Goutham pcifunc = (pf << RVU_PFVF_PF_SHIFT); 1945e07fb507SSunil Goutham rvu_print_npc_mcam_info(filp, pcifunc, blkaddr); 1946e07fb507SSunil Goutham 1947e07fb507SSunil Goutham cfg = rvu_read64(rvu, BLKADDR_RVUM, RVU_PRIV_PFX_CFG(pf)); 1948e07fb507SSunil Goutham numvfs = (cfg >> 12) & 0xFF; 1949e07fb507SSunil Goutham for (vf = 0; vf < numvfs; vf++) { 1950e07fb507SSunil Goutham pcifunc = (pf << RVU_PFVF_PF_SHIFT) | (vf + 1); 1951e07fb507SSunil Goutham rvu_print_npc_mcam_info(filp, pcifunc, blkaddr); 1952e07fb507SSunil Goutham } 1953e07fb507SSunil Goutham } 1954e07fb507SSunil Goutham 1955e07fb507SSunil Goutham mutex_unlock(&mcam->lock); 1956e07fb507SSunil Goutham return 0; 1957e07fb507SSunil Goutham } 1958e07fb507SSunil Goutham 1959e07fb507SSunil Goutham RVU_DEBUG_SEQ_FOPS(npc_mcam_info, npc_mcam_info_display, NULL); 1960e07fb507SSunil Goutham 1961e07fb507SSunil Goutham static int rvu_dbg_npc_rx_miss_stats_display(struct seq_file *filp, 1962e07fb507SSunil Goutham void *unused) 1963e07fb507SSunil Goutham { 1964e07fb507SSunil Goutham struct rvu *rvu = filp->private; 1965e07fb507SSunil Goutham struct npc_mcam *mcam; 1966e07fb507SSunil Goutham int blkaddr; 1967e07fb507SSunil Goutham 1968e07fb507SSunil Goutham blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0); 1969e07fb507SSunil Goutham if (blkaddr < 0) 1970e07fb507SSunil Goutham return -ENODEV; 1971e07fb507SSunil Goutham 1972e07fb507SSunil Goutham mcam = &rvu->hw->mcam; 1973e07fb507SSunil Goutham 1974e07fb507SSunil Goutham seq_puts(filp, "\nNPC MCAM RX miss action stats\n"); 1975e07fb507SSunil Goutham seq_printf(filp, "\t\tStat %d: \t%lld\n", mcam->rx_miss_act_cntr, 1976e07fb507SSunil Goutham rvu_read64(rvu, blkaddr, 1977e07fb507SSunil Goutham NPC_AF_MATCH_STATX(mcam->rx_miss_act_cntr))); 1978e07fb507SSunil Goutham 1979e07fb507SSunil Goutham return 0; 1980e07fb507SSunil Goutham } 1981e07fb507SSunil Goutham 1982e07fb507SSunil Goutham RVU_DEBUG_SEQ_FOPS(npc_rx_miss_act, npc_rx_miss_stats_display, NULL); 1983e07fb507SSunil Goutham 19844d6beb9cSSubbaraya Sundeep static void rvu_dbg_npc_mcam_show_flows(struct seq_file *s, 19854d6beb9cSSubbaraya Sundeep struct rvu_npc_mcam_rule *rule) 19864d6beb9cSSubbaraya Sundeep { 19874d6beb9cSSubbaraya Sundeep u8 bit; 19884d6beb9cSSubbaraya Sundeep 19894d6beb9cSSubbaraya Sundeep for_each_set_bit(bit, (unsigned long *)&rule->features, 64) { 19904d6beb9cSSubbaraya Sundeep seq_printf(s, "\t%s ", npc_get_field_name(bit)); 19914d6beb9cSSubbaraya Sundeep switch (bit) { 19924d6beb9cSSubbaraya Sundeep case NPC_DMAC: 19934d6beb9cSSubbaraya Sundeep seq_printf(s, "%pM ", rule->packet.dmac); 19944d6beb9cSSubbaraya Sundeep seq_printf(s, "mask %pM\n", rule->mask.dmac); 19954d6beb9cSSubbaraya Sundeep break; 19964d6beb9cSSubbaraya Sundeep case NPC_SMAC: 19974d6beb9cSSubbaraya Sundeep seq_printf(s, "%pM ", rule->packet.smac); 19984d6beb9cSSubbaraya Sundeep seq_printf(s, "mask %pM\n", rule->mask.smac); 19994d6beb9cSSubbaraya Sundeep break; 20004d6beb9cSSubbaraya Sundeep case NPC_ETYPE: 20014d6beb9cSSubbaraya Sundeep seq_printf(s, "0x%x ", ntohs(rule->packet.etype)); 20024d6beb9cSSubbaraya Sundeep seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.etype)); 20034d6beb9cSSubbaraya Sundeep break; 20044d6beb9cSSubbaraya Sundeep case NPC_OUTER_VID: 20054d6beb9cSSubbaraya Sundeep seq_printf(s, "%d ", ntohs(rule->packet.vlan_tci)); 20064d6beb9cSSubbaraya Sundeep seq_printf(s, "mask 0x%x\n", 20074d6beb9cSSubbaraya Sundeep ntohs(rule->mask.vlan_tci)); 20084d6beb9cSSubbaraya Sundeep break; 20094d6beb9cSSubbaraya Sundeep case NPC_TOS: 20104d6beb9cSSubbaraya Sundeep seq_printf(s, "%d ", rule->packet.tos); 20114d6beb9cSSubbaraya Sundeep seq_printf(s, "mask 0x%x\n", rule->mask.tos); 20124d6beb9cSSubbaraya Sundeep break; 20134d6beb9cSSubbaraya Sundeep case NPC_SIP_IPV4: 20144d6beb9cSSubbaraya Sundeep seq_printf(s, "%pI4 ", &rule->packet.ip4src); 20154d6beb9cSSubbaraya Sundeep seq_printf(s, "mask %pI4\n", &rule->mask.ip4src); 20164d6beb9cSSubbaraya Sundeep break; 20174d6beb9cSSubbaraya Sundeep case NPC_DIP_IPV4: 20184d6beb9cSSubbaraya Sundeep seq_printf(s, "%pI4 ", &rule->packet.ip4dst); 20194d6beb9cSSubbaraya Sundeep seq_printf(s, "mask %pI4\n", &rule->mask.ip4dst); 20204d6beb9cSSubbaraya Sundeep break; 20214d6beb9cSSubbaraya Sundeep case NPC_SIP_IPV6: 20224d6beb9cSSubbaraya Sundeep seq_printf(s, "%pI6 ", rule->packet.ip6src); 20234d6beb9cSSubbaraya Sundeep seq_printf(s, "mask %pI6\n", rule->mask.ip6src); 20244d6beb9cSSubbaraya Sundeep break; 20254d6beb9cSSubbaraya Sundeep case NPC_DIP_IPV6: 20264d6beb9cSSubbaraya Sundeep seq_printf(s, "%pI6 ", rule->packet.ip6dst); 20274d6beb9cSSubbaraya Sundeep seq_printf(s, "mask %pI6\n", rule->mask.ip6dst); 20284d6beb9cSSubbaraya Sundeep break; 20294d6beb9cSSubbaraya Sundeep case NPC_SPORT_TCP: 20304d6beb9cSSubbaraya Sundeep case NPC_SPORT_UDP: 20314d6beb9cSSubbaraya Sundeep case NPC_SPORT_SCTP: 20324d6beb9cSSubbaraya Sundeep seq_printf(s, "%d ", ntohs(rule->packet.sport)); 20334d6beb9cSSubbaraya Sundeep seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.sport)); 20344d6beb9cSSubbaraya Sundeep break; 20354d6beb9cSSubbaraya Sundeep case NPC_DPORT_TCP: 20364d6beb9cSSubbaraya Sundeep case NPC_DPORT_UDP: 20374d6beb9cSSubbaraya Sundeep case NPC_DPORT_SCTP: 20384d6beb9cSSubbaraya Sundeep seq_printf(s, "%d ", ntohs(rule->packet.dport)); 20394d6beb9cSSubbaraya Sundeep seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.dport)); 20404d6beb9cSSubbaraya Sundeep break; 20414d6beb9cSSubbaraya Sundeep default: 2042b7cf9661SNaveen Mamindlapalli seq_puts(s, "\n"); 20434d6beb9cSSubbaraya Sundeep break; 20444d6beb9cSSubbaraya Sundeep } 20454d6beb9cSSubbaraya Sundeep } 20464d6beb9cSSubbaraya Sundeep } 20474d6beb9cSSubbaraya Sundeep 20484d6beb9cSSubbaraya Sundeep static void rvu_dbg_npc_mcam_show_action(struct seq_file *s, 20494d6beb9cSSubbaraya Sundeep struct rvu_npc_mcam_rule *rule) 20504d6beb9cSSubbaraya Sundeep { 20514d6beb9cSSubbaraya Sundeep if (rule->intf == NIX_INTF_TX) { 20524d6beb9cSSubbaraya Sundeep switch (rule->tx_action.op) { 20534d6beb9cSSubbaraya Sundeep case NIX_TX_ACTIONOP_DROP: 20544d6beb9cSSubbaraya Sundeep seq_puts(s, "\taction: Drop\n"); 20554d6beb9cSSubbaraya Sundeep break; 20564d6beb9cSSubbaraya Sundeep case NIX_TX_ACTIONOP_UCAST_DEFAULT: 20574d6beb9cSSubbaraya Sundeep seq_puts(s, "\taction: Unicast to default channel\n"); 20584d6beb9cSSubbaraya Sundeep break; 20594d6beb9cSSubbaraya Sundeep case NIX_TX_ACTIONOP_UCAST_CHAN: 20604d6beb9cSSubbaraya Sundeep seq_printf(s, "\taction: Unicast to channel %d\n", 20614d6beb9cSSubbaraya Sundeep rule->tx_action.index); 20624d6beb9cSSubbaraya Sundeep break; 20634d6beb9cSSubbaraya Sundeep case NIX_TX_ACTIONOP_MCAST: 20644d6beb9cSSubbaraya Sundeep seq_puts(s, "\taction: Multicast\n"); 20654d6beb9cSSubbaraya Sundeep break; 20664d6beb9cSSubbaraya Sundeep case NIX_TX_ACTIONOP_DROP_VIOL: 20674d6beb9cSSubbaraya Sundeep seq_puts(s, "\taction: Lockdown Violation Drop\n"); 20684d6beb9cSSubbaraya Sundeep break; 20694d6beb9cSSubbaraya Sundeep default: 20704d6beb9cSSubbaraya Sundeep break; 2071fc6f89ddSXu Wang } 20724d6beb9cSSubbaraya Sundeep } else { 20734d6beb9cSSubbaraya Sundeep switch (rule->rx_action.op) { 20744d6beb9cSSubbaraya Sundeep case NIX_RX_ACTIONOP_DROP: 20754d6beb9cSSubbaraya Sundeep seq_puts(s, "\taction: Drop\n"); 20764d6beb9cSSubbaraya Sundeep break; 20774d6beb9cSSubbaraya Sundeep case NIX_RX_ACTIONOP_UCAST: 20784d6beb9cSSubbaraya Sundeep seq_printf(s, "\taction: Direct to queue %d\n", 20794d6beb9cSSubbaraya Sundeep rule->rx_action.index); 20804d6beb9cSSubbaraya Sundeep break; 20814d6beb9cSSubbaraya Sundeep case NIX_RX_ACTIONOP_RSS: 20824d6beb9cSSubbaraya Sundeep seq_puts(s, "\taction: RSS\n"); 20834d6beb9cSSubbaraya Sundeep break; 20844d6beb9cSSubbaraya Sundeep case NIX_RX_ACTIONOP_UCAST_IPSEC: 20854d6beb9cSSubbaraya Sundeep seq_puts(s, "\taction: Unicast ipsec\n"); 20864d6beb9cSSubbaraya Sundeep break; 20874d6beb9cSSubbaraya Sundeep case NIX_RX_ACTIONOP_MCAST: 20884d6beb9cSSubbaraya Sundeep seq_puts(s, "\taction: Multicast\n"); 20894d6beb9cSSubbaraya Sundeep break; 20904d6beb9cSSubbaraya Sundeep default: 20914d6beb9cSSubbaraya Sundeep break; 2092fc6f89ddSXu Wang } 20934d6beb9cSSubbaraya Sundeep } 20944d6beb9cSSubbaraya Sundeep } 20954d6beb9cSSubbaraya Sundeep 20964d6beb9cSSubbaraya Sundeep static const char *rvu_dbg_get_intf_name(int intf) 20974d6beb9cSSubbaraya Sundeep { 20984d6beb9cSSubbaraya Sundeep switch (intf) { 20994d6beb9cSSubbaraya Sundeep case NIX_INTFX_RX(0): 21004d6beb9cSSubbaraya Sundeep return "NIX0_RX"; 21014d6beb9cSSubbaraya Sundeep case NIX_INTFX_RX(1): 21024d6beb9cSSubbaraya Sundeep return "NIX1_RX"; 21034d6beb9cSSubbaraya Sundeep case NIX_INTFX_TX(0): 21044d6beb9cSSubbaraya Sundeep return "NIX0_TX"; 21054d6beb9cSSubbaraya Sundeep case NIX_INTFX_TX(1): 21064d6beb9cSSubbaraya Sundeep return "NIX1_TX"; 21074d6beb9cSSubbaraya Sundeep default: 21084d6beb9cSSubbaraya Sundeep break; 21094d6beb9cSSubbaraya Sundeep } 21104d6beb9cSSubbaraya Sundeep 21114d6beb9cSSubbaraya Sundeep return "unknown"; 21124d6beb9cSSubbaraya Sundeep } 21134d6beb9cSSubbaraya Sundeep 21144d6beb9cSSubbaraya Sundeep static int rvu_dbg_npc_mcam_show_rules(struct seq_file *s, void *unused) 21154d6beb9cSSubbaraya Sundeep { 21164d6beb9cSSubbaraya Sundeep struct rvu_npc_mcam_rule *iter; 21174d6beb9cSSubbaraya Sundeep struct rvu *rvu = s->private; 21184d6beb9cSSubbaraya Sundeep struct npc_mcam *mcam; 21194d6beb9cSSubbaraya Sundeep int pf, vf = -1; 21204d6beb9cSSubbaraya Sundeep int blkaddr; 21214d6beb9cSSubbaraya Sundeep u16 target; 21224d6beb9cSSubbaraya Sundeep u64 hits; 21234d6beb9cSSubbaraya Sundeep 21244d6beb9cSSubbaraya Sundeep blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0); 21254d6beb9cSSubbaraya Sundeep if (blkaddr < 0) 21264d6beb9cSSubbaraya Sundeep return 0; 21274d6beb9cSSubbaraya Sundeep 21284d6beb9cSSubbaraya Sundeep mcam = &rvu->hw->mcam; 21294d6beb9cSSubbaraya Sundeep 21304d6beb9cSSubbaraya Sundeep mutex_lock(&mcam->lock); 21314d6beb9cSSubbaraya Sundeep list_for_each_entry(iter, &mcam->mcam_rules, list) { 21324d6beb9cSSubbaraya Sundeep pf = (iter->owner >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK; 21334d6beb9cSSubbaraya Sundeep seq_printf(s, "\n\tInstalled by: PF%d ", pf); 21344d6beb9cSSubbaraya Sundeep 21354d6beb9cSSubbaraya Sundeep if (iter->owner & RVU_PFVF_FUNC_MASK) { 21364d6beb9cSSubbaraya Sundeep vf = (iter->owner & RVU_PFVF_FUNC_MASK) - 1; 21374d6beb9cSSubbaraya Sundeep seq_printf(s, "VF%d", vf); 21384d6beb9cSSubbaraya Sundeep } 21394d6beb9cSSubbaraya Sundeep seq_puts(s, "\n"); 21404d6beb9cSSubbaraya Sundeep 21414d6beb9cSSubbaraya Sundeep seq_printf(s, "\tdirection: %s\n", is_npc_intf_rx(iter->intf) ? 21424d6beb9cSSubbaraya Sundeep "RX" : "TX"); 21434d6beb9cSSubbaraya Sundeep seq_printf(s, "\tinterface: %s\n", 21444d6beb9cSSubbaraya Sundeep rvu_dbg_get_intf_name(iter->intf)); 21454d6beb9cSSubbaraya Sundeep seq_printf(s, "\tmcam entry: %d\n", iter->entry); 21464d6beb9cSSubbaraya Sundeep 21474d6beb9cSSubbaraya Sundeep rvu_dbg_npc_mcam_show_flows(s, iter); 21484d6beb9cSSubbaraya Sundeep if (iter->intf == NIX_INTF_RX) { 21494d6beb9cSSubbaraya Sundeep target = iter->rx_action.pf_func; 21504d6beb9cSSubbaraya Sundeep pf = (target >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK; 21514d6beb9cSSubbaraya Sundeep seq_printf(s, "\tForward to: PF%d ", pf); 21524d6beb9cSSubbaraya Sundeep 21534d6beb9cSSubbaraya Sundeep if (target & RVU_PFVF_FUNC_MASK) { 21544d6beb9cSSubbaraya Sundeep vf = (target & RVU_PFVF_FUNC_MASK) - 1; 21554d6beb9cSSubbaraya Sundeep seq_printf(s, "VF%d", vf); 21564d6beb9cSSubbaraya Sundeep } 21574d6beb9cSSubbaraya Sundeep seq_puts(s, "\n"); 21584d6beb9cSSubbaraya Sundeep } 21594d6beb9cSSubbaraya Sundeep 21604d6beb9cSSubbaraya Sundeep rvu_dbg_npc_mcam_show_action(s, iter); 21614d6beb9cSSubbaraya Sundeep seq_printf(s, "\tenabled: %s\n", iter->enable ? "yes" : "no"); 21624d6beb9cSSubbaraya Sundeep 21634d6beb9cSSubbaraya Sundeep if (!iter->has_cntr) 21644d6beb9cSSubbaraya Sundeep continue; 21654d6beb9cSSubbaraya Sundeep seq_printf(s, "\tcounter: %d\n", iter->cntr); 21664d6beb9cSSubbaraya Sundeep 21674d6beb9cSSubbaraya Sundeep hits = rvu_read64(rvu, blkaddr, NPC_AF_MATCH_STATX(iter->cntr)); 21684d6beb9cSSubbaraya Sundeep seq_printf(s, "\thits: %lld\n", hits); 21694d6beb9cSSubbaraya Sundeep } 21704d6beb9cSSubbaraya Sundeep mutex_unlock(&mcam->lock); 21714d6beb9cSSubbaraya Sundeep 21724d6beb9cSSubbaraya Sundeep return 0; 21734d6beb9cSSubbaraya Sundeep } 21744d6beb9cSSubbaraya Sundeep 21754d6beb9cSSubbaraya Sundeep RVU_DEBUG_SEQ_FOPS(npc_mcam_rules, npc_mcam_show_rules, NULL); 21764d6beb9cSSubbaraya Sundeep 2177e07fb507SSunil Goutham static void rvu_dbg_npc_init(struct rvu *rvu) 2178e07fb507SSunil Goutham { 2179e07fb507SSunil Goutham rvu->rvu_dbg.npc = debugfs_create_dir("npc", rvu->rvu_dbg.root); 2180e07fb507SSunil Goutham 21812ce5a307SDan Carpenter debugfs_create_file("mcam_info", 0444, rvu->rvu_dbg.npc, rvu, 21822ce5a307SDan Carpenter &rvu_dbg_npc_mcam_info_fops); 21832ce5a307SDan Carpenter debugfs_create_file("mcam_rules", 0444, rvu->rvu_dbg.npc, rvu, 21842ce5a307SDan Carpenter &rvu_dbg_npc_mcam_rules_fops); 21852ce5a307SDan Carpenter debugfs_create_file("rx_miss_act_stats", 0444, rvu->rvu_dbg.npc, rvu, 21862ce5a307SDan Carpenter &rvu_dbg_npc_rx_miss_act_fops); 2187e07fb507SSunil Goutham } 2188e07fb507SSunil Goutham 218976638a2eSSrujana Challa static int cpt_eng_sts_display(struct seq_file *filp, u8 eng_type) 219076638a2eSSrujana Challa { 2191b0f60fabSSrujana Challa struct cpt_ctx *ctx = filp->private; 219276638a2eSSrujana Challa u64 busy_sts = 0, free_sts = 0; 219376638a2eSSrujana Challa u32 e_min = 0, e_max = 0, e, i; 219476638a2eSSrujana Challa u16 max_ses, max_ies, max_aes; 2195b0f60fabSSrujana Challa struct rvu *rvu = ctx->rvu; 2196b0f60fabSSrujana Challa int blkaddr = ctx->blkaddr; 219776638a2eSSrujana Challa u64 reg; 219876638a2eSSrujana Challa 219976638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_CONSTANTS1); 220076638a2eSSrujana Challa max_ses = reg & 0xffff; 220176638a2eSSrujana Challa max_ies = (reg >> 16) & 0xffff; 220276638a2eSSrujana Challa max_aes = (reg >> 32) & 0xffff; 220376638a2eSSrujana Challa 220476638a2eSSrujana Challa switch (eng_type) { 220576638a2eSSrujana Challa case CPT_AE_TYPE: 220676638a2eSSrujana Challa e_min = max_ses + max_ies; 220776638a2eSSrujana Challa e_max = max_ses + max_ies + max_aes; 220876638a2eSSrujana Challa break; 220976638a2eSSrujana Challa case CPT_SE_TYPE: 221076638a2eSSrujana Challa e_min = 0; 221176638a2eSSrujana Challa e_max = max_ses; 221276638a2eSSrujana Challa break; 221376638a2eSSrujana Challa case CPT_IE_TYPE: 221476638a2eSSrujana Challa e_min = max_ses; 221576638a2eSSrujana Challa e_max = max_ses + max_ies; 221676638a2eSSrujana Challa break; 221776638a2eSSrujana Challa default: 221876638a2eSSrujana Challa return -EINVAL; 221976638a2eSSrujana Challa } 222076638a2eSSrujana Challa 222176638a2eSSrujana Challa for (e = e_min, i = 0; e < e_max; e++, i++) { 222276638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_STS(e)); 222376638a2eSSrujana Challa if (reg & 0x1) 222476638a2eSSrujana Challa busy_sts |= 1ULL << i; 222576638a2eSSrujana Challa 222676638a2eSSrujana Challa if (reg & 0x2) 222776638a2eSSrujana Challa free_sts |= 1ULL << i; 222876638a2eSSrujana Challa } 222976638a2eSSrujana Challa seq_printf(filp, "FREE STS : 0x%016llx\n", free_sts); 223076638a2eSSrujana Challa seq_printf(filp, "BUSY STS : 0x%016llx\n", busy_sts); 223176638a2eSSrujana Challa 223276638a2eSSrujana Challa return 0; 223376638a2eSSrujana Challa } 223476638a2eSSrujana Challa 223576638a2eSSrujana Challa static int rvu_dbg_cpt_ae_sts_display(struct seq_file *filp, void *unused) 223676638a2eSSrujana Challa { 223776638a2eSSrujana Challa return cpt_eng_sts_display(filp, CPT_AE_TYPE); 223876638a2eSSrujana Challa } 223976638a2eSSrujana Challa 224076638a2eSSrujana Challa RVU_DEBUG_SEQ_FOPS(cpt_ae_sts, cpt_ae_sts_display, NULL); 224176638a2eSSrujana Challa 224276638a2eSSrujana Challa static int rvu_dbg_cpt_se_sts_display(struct seq_file *filp, void *unused) 224376638a2eSSrujana Challa { 224476638a2eSSrujana Challa return cpt_eng_sts_display(filp, CPT_SE_TYPE); 224576638a2eSSrujana Challa } 224676638a2eSSrujana Challa 224776638a2eSSrujana Challa RVU_DEBUG_SEQ_FOPS(cpt_se_sts, cpt_se_sts_display, NULL); 224876638a2eSSrujana Challa 224976638a2eSSrujana Challa static int rvu_dbg_cpt_ie_sts_display(struct seq_file *filp, void *unused) 225076638a2eSSrujana Challa { 225176638a2eSSrujana Challa return cpt_eng_sts_display(filp, CPT_IE_TYPE); 225276638a2eSSrujana Challa } 225376638a2eSSrujana Challa 225476638a2eSSrujana Challa RVU_DEBUG_SEQ_FOPS(cpt_ie_sts, cpt_ie_sts_display, NULL); 225576638a2eSSrujana Challa 225676638a2eSSrujana Challa static int rvu_dbg_cpt_engines_info_display(struct seq_file *filp, void *unused) 225776638a2eSSrujana Challa { 2258b0f60fabSSrujana Challa struct cpt_ctx *ctx = filp->private; 225976638a2eSSrujana Challa u16 max_ses, max_ies, max_aes; 2260b0f60fabSSrujana Challa struct rvu *rvu = ctx->rvu; 2261b0f60fabSSrujana Challa int blkaddr = ctx->blkaddr; 226276638a2eSSrujana Challa u32 e_max, e; 226376638a2eSSrujana Challa u64 reg; 226476638a2eSSrujana Challa 226576638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_CONSTANTS1); 226676638a2eSSrujana Challa max_ses = reg & 0xffff; 226776638a2eSSrujana Challa max_ies = (reg >> 16) & 0xffff; 226876638a2eSSrujana Challa max_aes = (reg >> 32) & 0xffff; 226976638a2eSSrujana Challa 227076638a2eSSrujana Challa e_max = max_ses + max_ies + max_aes; 227176638a2eSSrujana Challa 227276638a2eSSrujana Challa seq_puts(filp, "===========================================\n"); 227376638a2eSSrujana Challa for (e = 0; e < e_max; e++) { 227476638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_CTL2(e)); 227576638a2eSSrujana Challa seq_printf(filp, "CPT Engine[%u] Group Enable 0x%02llx\n", e, 227676638a2eSSrujana Challa reg & 0xff); 227776638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_ACTIVE(e)); 227876638a2eSSrujana Challa seq_printf(filp, "CPT Engine[%u] Active Info 0x%llx\n", e, 227976638a2eSSrujana Challa reg); 228076638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_CTL(e)); 228176638a2eSSrujana Challa seq_printf(filp, "CPT Engine[%u] Control 0x%llx\n", e, 228276638a2eSSrujana Challa reg); 228376638a2eSSrujana Challa seq_puts(filp, "===========================================\n"); 228476638a2eSSrujana Challa } 228576638a2eSSrujana Challa return 0; 228676638a2eSSrujana Challa } 228776638a2eSSrujana Challa 228876638a2eSSrujana Challa RVU_DEBUG_SEQ_FOPS(cpt_engines_info, cpt_engines_info_display, NULL); 228976638a2eSSrujana Challa 229076638a2eSSrujana Challa static int rvu_dbg_cpt_lfs_info_display(struct seq_file *filp, void *unused) 229176638a2eSSrujana Challa { 2292b0f60fabSSrujana Challa struct cpt_ctx *ctx = filp->private; 2293b0f60fabSSrujana Challa int blkaddr = ctx->blkaddr; 2294b0f60fabSSrujana Challa struct rvu *rvu = ctx->rvu; 229576638a2eSSrujana Challa struct rvu_block *block; 2296b0f60fabSSrujana Challa struct rvu_hwinfo *hw; 229776638a2eSSrujana Challa u64 reg; 229876638a2eSSrujana Challa u32 lf; 229976638a2eSSrujana Challa 2300b0f60fabSSrujana Challa hw = rvu->hw; 230176638a2eSSrujana Challa block = &hw->block[blkaddr]; 230276638a2eSSrujana Challa if (!block->lf.bmap) 230376638a2eSSrujana Challa return -ENODEV; 230476638a2eSSrujana Challa 230576638a2eSSrujana Challa seq_puts(filp, "===========================================\n"); 230676638a2eSSrujana Challa for (lf = 0; lf < block->lf.max; lf++) { 230776638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_CTL(lf)); 230876638a2eSSrujana Challa seq_printf(filp, "CPT Lf[%u] CTL 0x%llx\n", lf, reg); 230976638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_CTL2(lf)); 231076638a2eSSrujana Challa seq_printf(filp, "CPT Lf[%u] CTL2 0x%llx\n", lf, reg); 231176638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_PTR_CTL(lf)); 231276638a2eSSrujana Challa seq_printf(filp, "CPT Lf[%u] PTR_CTL 0x%llx\n", lf, reg); 231376638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, block->lfcfg_reg | 231476638a2eSSrujana Challa (lf << block->lfshift)); 231576638a2eSSrujana Challa seq_printf(filp, "CPT Lf[%u] CFG 0x%llx\n", lf, reg); 231676638a2eSSrujana Challa seq_puts(filp, "===========================================\n"); 231776638a2eSSrujana Challa } 231876638a2eSSrujana Challa return 0; 231976638a2eSSrujana Challa } 232076638a2eSSrujana Challa 232176638a2eSSrujana Challa RVU_DEBUG_SEQ_FOPS(cpt_lfs_info, cpt_lfs_info_display, NULL); 232276638a2eSSrujana Challa 232376638a2eSSrujana Challa static int rvu_dbg_cpt_err_info_display(struct seq_file *filp, void *unused) 232476638a2eSSrujana Challa { 2325b0f60fabSSrujana Challa struct cpt_ctx *ctx = filp->private; 2326b0f60fabSSrujana Challa struct rvu *rvu = ctx->rvu; 2327b0f60fabSSrujana Challa int blkaddr = ctx->blkaddr; 232876638a2eSSrujana Challa u64 reg0, reg1; 232976638a2eSSrujana Challa 233076638a2eSSrujana Challa reg0 = rvu_read64(rvu, blkaddr, CPT_AF_FLTX_INT(0)); 233176638a2eSSrujana Challa reg1 = rvu_read64(rvu, blkaddr, CPT_AF_FLTX_INT(1)); 233276638a2eSSrujana Challa seq_printf(filp, "CPT_AF_FLTX_INT: 0x%llx 0x%llx\n", reg0, reg1); 233376638a2eSSrujana Challa reg0 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_EXE(0)); 233476638a2eSSrujana Challa reg1 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_EXE(1)); 233576638a2eSSrujana Challa seq_printf(filp, "CPT_AF_PSNX_EXE: 0x%llx 0x%llx\n", reg0, reg1); 233676638a2eSSrujana Challa reg0 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_LF(0)); 233776638a2eSSrujana Challa seq_printf(filp, "CPT_AF_PSNX_LF: 0x%llx\n", reg0); 233876638a2eSSrujana Challa reg0 = rvu_read64(rvu, blkaddr, CPT_AF_RVU_INT); 233976638a2eSSrujana Challa seq_printf(filp, "CPT_AF_RVU_INT: 0x%llx\n", reg0); 234076638a2eSSrujana Challa reg0 = rvu_read64(rvu, blkaddr, CPT_AF_RAS_INT); 234176638a2eSSrujana Challa seq_printf(filp, "CPT_AF_RAS_INT: 0x%llx\n", reg0); 234276638a2eSSrujana Challa reg0 = rvu_read64(rvu, blkaddr, CPT_AF_EXE_ERR_INFO); 234376638a2eSSrujana Challa seq_printf(filp, "CPT_AF_EXE_ERR_INFO: 0x%llx\n", reg0); 234476638a2eSSrujana Challa 234576638a2eSSrujana Challa return 0; 234676638a2eSSrujana Challa } 234776638a2eSSrujana Challa 234876638a2eSSrujana Challa RVU_DEBUG_SEQ_FOPS(cpt_err_info, cpt_err_info_display, NULL); 234976638a2eSSrujana Challa 235076638a2eSSrujana Challa static int rvu_dbg_cpt_pc_display(struct seq_file *filp, void *unused) 235176638a2eSSrujana Challa { 2352b0f60fabSSrujana Challa struct cpt_ctx *ctx = filp->private; 2353b0f60fabSSrujana Challa struct rvu *rvu = ctx->rvu; 2354b0f60fabSSrujana Challa int blkaddr = ctx->blkaddr; 235576638a2eSSrujana Challa u64 reg; 235676638a2eSSrujana Challa 235776638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_INST_REQ_PC); 235876638a2eSSrujana Challa seq_printf(filp, "CPT instruction requests %llu\n", reg); 235976638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_INST_LATENCY_PC); 236076638a2eSSrujana Challa seq_printf(filp, "CPT instruction latency %llu\n", reg); 236176638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_REQ_PC); 236276638a2eSSrujana Challa seq_printf(filp, "CPT NCB read requests %llu\n", reg); 236376638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_LATENCY_PC); 236476638a2eSSrujana Challa seq_printf(filp, "CPT NCB read latency %llu\n", reg); 236576638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_UC_PC); 236676638a2eSSrujana Challa seq_printf(filp, "CPT read requests caused by UC fills %llu\n", reg); 236776638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_ACTIVE_CYCLES_PC); 236876638a2eSSrujana Challa seq_printf(filp, "CPT active cycles pc %llu\n", reg); 236976638a2eSSrujana Challa reg = rvu_read64(rvu, blkaddr, CPT_AF_CPTCLK_CNT); 237076638a2eSSrujana Challa seq_printf(filp, "CPT clock count pc %llu\n", reg); 237176638a2eSSrujana Challa 237276638a2eSSrujana Challa return 0; 237376638a2eSSrujana Challa } 237476638a2eSSrujana Challa 237576638a2eSSrujana Challa RVU_DEBUG_SEQ_FOPS(cpt_pc, cpt_pc_display, NULL); 237676638a2eSSrujana Challa 2377b0f60fabSSrujana Challa static void rvu_dbg_cpt_init(struct rvu *rvu, int blkaddr) 237876638a2eSSrujana Challa { 2379b0f60fabSSrujana Challa struct cpt_ctx *ctx; 2380b0f60fabSSrujana Challa 2381b0f60fabSSrujana Challa if (!is_block_implemented(rvu->hw, blkaddr)) 238276638a2eSSrujana Challa return; 238376638a2eSSrujana Challa 2384b0f60fabSSrujana Challa if (blkaddr == BLKADDR_CPT0) { 238576638a2eSSrujana Challa rvu->rvu_dbg.cpt = debugfs_create_dir("cpt", rvu->rvu_dbg.root); 2386b0f60fabSSrujana Challa ctx = &rvu->rvu_dbg.cpt_ctx[0]; 2387b0f60fabSSrujana Challa ctx->blkaddr = BLKADDR_CPT0; 2388b0f60fabSSrujana Challa ctx->rvu = rvu; 2389b0f60fabSSrujana Challa } else { 2390b0f60fabSSrujana Challa rvu->rvu_dbg.cpt = debugfs_create_dir("cpt1", 2391b0f60fabSSrujana Challa rvu->rvu_dbg.root); 2392b0f60fabSSrujana Challa ctx = &rvu->rvu_dbg.cpt_ctx[1]; 2393b0f60fabSSrujana Challa ctx->blkaddr = BLKADDR_CPT1; 2394b0f60fabSSrujana Challa ctx->rvu = rvu; 2395b0f60fabSSrujana Challa } 239676638a2eSSrujana Challa 2397b0f60fabSSrujana Challa debugfs_create_file("cpt_pc", 0600, rvu->rvu_dbg.cpt, ctx, 239876638a2eSSrujana Challa &rvu_dbg_cpt_pc_fops); 2399b0f60fabSSrujana Challa debugfs_create_file("cpt_ae_sts", 0600, rvu->rvu_dbg.cpt, ctx, 240076638a2eSSrujana Challa &rvu_dbg_cpt_ae_sts_fops); 2401b0f60fabSSrujana Challa debugfs_create_file("cpt_se_sts", 0600, rvu->rvu_dbg.cpt, ctx, 240276638a2eSSrujana Challa &rvu_dbg_cpt_se_sts_fops); 2403b0f60fabSSrujana Challa debugfs_create_file("cpt_ie_sts", 0600, rvu->rvu_dbg.cpt, ctx, 240476638a2eSSrujana Challa &rvu_dbg_cpt_ie_sts_fops); 2405b0f60fabSSrujana Challa debugfs_create_file("cpt_engines_info", 0600, rvu->rvu_dbg.cpt, ctx, 240676638a2eSSrujana Challa &rvu_dbg_cpt_engines_info_fops); 2407b0f60fabSSrujana Challa debugfs_create_file("cpt_lfs_info", 0600, rvu->rvu_dbg.cpt, ctx, 240876638a2eSSrujana Challa &rvu_dbg_cpt_lfs_info_fops); 2409b0f60fabSSrujana Challa debugfs_create_file("cpt_err_info", 0600, rvu->rvu_dbg.cpt, ctx, 241076638a2eSSrujana Challa &rvu_dbg_cpt_err_info_fops); 241176638a2eSSrujana Challa } 241276638a2eSSrujana Challa 24133feac505SGeetha sowjanya static const char *rvu_get_dbg_dir_name(struct rvu *rvu) 24143feac505SGeetha sowjanya { 24153feac505SGeetha sowjanya if (!is_rvu_otx2(rvu)) 24163feac505SGeetha sowjanya return "cn10k"; 24173feac505SGeetha sowjanya else 24183feac505SGeetha sowjanya return "octeontx2"; 24193feac505SGeetha sowjanya } 24203feac505SGeetha sowjanya 242123205e6dSChristina Jacob void rvu_dbg_init(struct rvu *rvu) 242223205e6dSChristina Jacob { 24233feac505SGeetha sowjanya rvu->rvu_dbg.root = debugfs_create_dir(rvu_get_dbg_dir_name(rvu), NULL); 242423205e6dSChristina Jacob 24252ce5a307SDan Carpenter debugfs_create_file("rsrc_alloc", 0444, rvu->rvu_dbg.root, rvu, 24262ce5a307SDan Carpenter &rvu_dbg_rsrc_status_fops); 2427e2fb3730SRakesh Babu 242891c6945eSHariprasad Kelam if (!cgx_get_cgxcnt_max()) 242991c6945eSHariprasad Kelam goto create; 243091c6945eSHariprasad Kelam 243191c6945eSHariprasad Kelam if (is_rvu_otx2(rvu)) 243291c6945eSHariprasad Kelam debugfs_create_file("rvu_pf_cgx_map", 0444, rvu->rvu_dbg.root, 243391c6945eSHariprasad Kelam rvu, &rvu_dbg_rvu_pf_cgx_map_fops); 243491c6945eSHariprasad Kelam else 2435*786621d2SGeetha sowjanya debugfs_create_file("rvu_pf_rpm_map", 0444, rvu->rvu_dbg.root, 243691c6945eSHariprasad Kelam rvu, &rvu_dbg_rvu_pf_cgx_map_fops); 243791c6945eSHariprasad Kelam 243891c6945eSHariprasad Kelam create: 24398756828aSChristina Jacob rvu_dbg_npa_init(rvu); 24400f3ce484SRakesh Babu rvu_dbg_nix_init(rvu, BLKADDR_NIX0); 24410f3ce484SRakesh Babu 24420f3ce484SRakesh Babu rvu_dbg_nix_init(rvu, BLKADDR_NIX1); 2443c57211b5SPrakash Brahmajyosyula rvu_dbg_cgx_init(rvu); 2444e07fb507SSunil Goutham rvu_dbg_npc_init(rvu); 2445b0f60fabSSrujana Challa rvu_dbg_cpt_init(rvu, BLKADDR_CPT0); 2446b0f60fabSSrujana Challa rvu_dbg_cpt_init(rvu, BLKADDR_CPT1); 244723205e6dSChristina Jacob } 244823205e6dSChristina Jacob 244923205e6dSChristina Jacob void rvu_dbg_exit(struct rvu *rvu) 245023205e6dSChristina Jacob { 245123205e6dSChristina Jacob debugfs_remove_recursive(rvu->rvu_dbg.root); 245223205e6dSChristina Jacob } 245323205e6dSChristina Jacob 245423205e6dSChristina Jacob #endif /* CONFIG_DEBUG_FS */ 2455