mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
octeontx2-af: cn10k: debugfs for dumping LMTST map table
CN10k SoCs use atomic stores of up to 128 bytes to submit packets/instructions into co-processor cores. The enqueueing is performed using Large Memory Transaction Store (LMTST) operations. They allow for lockless enqueue operations - i.e., two different CPU cores can submit instructions to the same queue without needing to lock the queue or synchronize their accesses. This patch implements a new debugfs entry for dumping LMTST map table present on CN10K, as this might be very useful to debug any issue in case of shared LMTST region among multiple pci functions. Signed-off-by: Harman Kalra <hkalra@marvell.com> Signed-off-by: Bhaskara Budiredla <bbudiredla@marvell.com> Signed-off-by: Rakesh Babu <rsaladi2@marvell.com> Signed-off-by: Sunil Kovvuri Goutham <sgoutham@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1910ccf033
commit
0daa55d033
@ -226,6 +226,96 @@ static const struct file_operations rvu_dbg_##name##_fops = { \
|
||||
|
||||
static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf);
|
||||
|
||||
#define LMT_MAPTBL_ENTRY_SIZE 16
|
||||
/* Dump LMTST map table */
|
||||
static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp,
|
||||
char __user *buffer,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct rvu *rvu = filp->private_data;
|
||||
u64 lmt_addr, val, tbl_base;
|
||||
int pf, vf, num_vfs, hw_vfs;
|
||||
void __iomem *lmt_map_base;
|
||||
int index = 0, off = 0;
|
||||
int bytes_not_copied;
|
||||
int buf_size = 10240;
|
||||
char *buf;
|
||||
|
||||
/* don't allow partial reads */
|
||||
if (*ppos != 0)
|
||||
return 0;
|
||||
|
||||
buf = kzalloc(buf_size, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOSPC;
|
||||
|
||||
tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE);
|
||||
|
||||
lmt_map_base = ioremap_wc(tbl_base, 128 * 1024);
|
||||
if (!lmt_map_base) {
|
||||
dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n");
|
||||
kfree(buf);
|
||||
return false;
|
||||
}
|
||||
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
"\n\t\t\t\t\tLmtst Map Table Entries");
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
"\n\t\t\t\t\t=======================");
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, "\nPcifunc\t\t\t");
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, "Table Index\t\t");
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
"Lmtline Base (word 0)\t\t");
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
"Lmt Map Entry (word 1)");
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, "\n");
|
||||
for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, "PF%d \t\t\t",
|
||||
pf);
|
||||
|
||||
index = pf * rvu->hw->total_vfs * LMT_MAPTBL_ENTRY_SIZE;
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%llx\t\t",
|
||||
(tbl_base + index));
|
||||
lmt_addr = readq(lmt_map_base + index);
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
" 0x%016llx\t\t", lmt_addr);
|
||||
index += 8;
|
||||
val = readq(lmt_map_base + index);
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%016llx\n",
|
||||
val);
|
||||
/* Reading num of VFs per PF */
|
||||
rvu_get_pf_numvfs(rvu, pf, &num_vfs, &hw_vfs);
|
||||
for (vf = 0; vf < num_vfs; vf++) {
|
||||
index = (pf * rvu->hw->total_vfs * 16) +
|
||||
((vf + 1) * LMT_MAPTBL_ENTRY_SIZE);
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
"PF%d:VF%d \t\t", pf, vf);
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
" 0x%llx\t\t", (tbl_base + index));
|
||||
lmt_addr = readq(lmt_map_base + index);
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
" 0x%016llx\t\t", lmt_addr);
|
||||
index += 8;
|
||||
val = readq(lmt_map_base + index);
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
" 0x%016llx\n", val);
|
||||
}
|
||||
}
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, "\n");
|
||||
|
||||
bytes_not_copied = copy_to_user(buffer, buf, off);
|
||||
kfree(buf);
|
||||
|
||||
iounmap(lmt_map_base);
|
||||
if (bytes_not_copied)
|
||||
return -EFAULT;
|
||||
|
||||
*ppos = off;
|
||||
return off;
|
||||
}
|
||||
|
||||
RVU_DEBUG_FOPS(lmtst_map_table, lmtst_map_table_display, NULL);
|
||||
|
||||
/* Dumps current provisioning status of all RVU block LFs */
|
||||
static ssize_t rvu_dbg_rsrc_attach_status(struct file *filp,
|
||||
char __user *buffer,
|
||||
@ -2672,6 +2762,10 @@ void rvu_dbg_init(struct rvu *rvu)
|
||||
debugfs_create_file("rsrc_alloc", 0444, rvu->rvu_dbg.root, rvu,
|
||||
&rvu_dbg_rsrc_status_fops);
|
||||
|
||||
if (!is_rvu_otx2(rvu))
|
||||
debugfs_create_file("lmtst_map_table", 0444, rvu->rvu_dbg.root,
|
||||
rvu, &rvu_dbg_lmtst_map_table_fops);
|
||||
|
||||
if (!cgx_get_cgxcnt_max())
|
||||
goto create;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user