drivers/net/ethernet/marvell/octeontx2/af/cn20k/debugfs.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/marvell/octeontx2/af/cn20k/debugfs.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/marvell/octeontx2/af/cn20k/debugfs.c
Extension
.c
Size
18919 bytes
Lines
628
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

static const struct file_operations __name ## _fops = {			\
	.owner = THIS_MODULE,						\
	.open = __name ## _open,					\
	.read = seq_read,						\
	.llseek = seq_lseek,						\
	.release = single_release,					\
}

#define DEFINE_OCTEONTX2_DEBUGFS_ATTRIBUTE_WITH_SIZE(__name, __size)		\
static int __name ## _open(struct inode *inode, struct file *file)		\
{										\
	return single_open_size(file, __name ## _show, inode->i_private,	\
				__size);					\
}										\
__OCTEONTX2_DEBUGFS_ATTRIBUTE_FOPS(__name)

static DEFINE_MUTEX(stats_lock);

/* MAX_NUM_BANKS, MAX_SUBBANK_DEPTH and MAX_NUM_SUB_BANKS represent
 * hard limit on all silicon variants, preventing any possibility of
 * out-of-bounds access.
 */
static u64 (*dstats)[MAX_NUM_BANKS][MAX_SUBBANK_DEPTH * MAX_NUM_SUB_BANKS];

static int npc_mcam_dstats_show(struct seq_file *s, void *unused)
{
	struct npc_priv_t *npc_priv;
	int blkaddr, pf, mcam_idx;
	u64 stats, delta;
	struct rvu *rvu;
	char buff[64];
	u8 key_type;
	void *map;

	npc_priv = npc_priv_get();
	rvu = s->private;
	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
	if (blkaddr < 0)
		return 0;

	mutex_lock(&stats_lock);
	seq_puts(s, "idx\tpfunc\tstats\n");
	for (int bank = npc_priv->num_banks - 1; bank >= 0; bank--) {
		for (int idx = npc_priv->bank_depth - 1; idx >= 0; idx--) {
			mcam_idx = bank * npc_priv->bank_depth + idx;

			if (npc_mcam_idx_2_key_type(rvu, mcam_idx, &key_type))
				continue;

			if (key_type == NPC_MCAM_KEY_X4 && bank != 0)
				continue;

			if (!test_bit(mcam_idx, npc_priv->en_map))
				continue;

			stats = rvu_read64(rvu, blkaddr,
					   NPC_AF_CN20K_MCAMEX_BANKX_STAT_EXT(idx, bank));
			if (!stats)
				continue;
			if (stats == dstats[0][bank][idx])
				continue;

			if (stats < dstats[0][bank][idx])
				dstats[0][bank][idx] = 0;

			pf = 0xFFFF;
			map = xa_load(&npc_priv->xa_idx2pf_map, mcam_idx);
			if (map)
				pf = xa_to_value(map);

			delta = stats - dstats[0][bank][idx];

			snprintf(buff, sizeof(buff), "%u\t%#04x\t%llu\n",
				 mcam_idx, pf, delta);
			seq_puts(s, buff);

			dstats[0][bank][idx] = stats;
		}
	}

	mutex_unlock(&stats_lock);
	return 0;
}

/*  "%u\t%#04x\t%llu\n" needs less than 64 characters to print */
#define TOTAL_SZ (MAX_NUM_BANKS * MAX_NUM_SUB_BANKS * MAX_SUBBANK_DEPTH * 64)
DEFINE_OCTEONTX2_DEBUGFS_ATTRIBUTE_WITH_SIZE(npc_mcam_dstats, TOTAL_SZ);

static int npc_mcam_mismatch_show(struct seq_file *s, void *unused)
{

Annotation

Implementation Notes