octeontx2-af: Debugsfs support for exact match.
There debugfs files created. 1. General information on exact match table 2. Exact match table entries. 3. NPC mcam drop on hit count stats. Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
3571fe07a0
commit
87e4ea29b0
@ -18,6 +18,7 @@
|
||||
#include "cgx.h"
|
||||
#include "lmac_common.h"
|
||||
#include "npc.h"
|
||||
#include "rvu_npc_hash.h"
|
||||
|
||||
#define DEBUGFS_DIR_NAME "octeontx2"
|
||||
|
||||
@ -2600,6 +2601,170 @@ static int rvu_dbg_npc_mcam_show_rules(struct seq_file *s, void *unused)
|
||||
|
||||
RVU_DEBUG_SEQ_FOPS(npc_mcam_rules, npc_mcam_show_rules, NULL);
|
||||
|
||||
static int rvu_dbg_npc_exact_show_entries(struct seq_file *s, void *unused)
|
||||
{
|
||||
struct npc_exact_table_entry *mem_entry[NPC_EXACT_TBL_MAX_WAYS] = { 0 };
|
||||
struct npc_exact_table_entry *cam_entry;
|
||||
struct npc_exact_table *table;
|
||||
struct rvu *rvu = s->private;
|
||||
int i, j;
|
||||
|
||||
u8 bitmap = 0;
|
||||
|
||||
table = rvu->hw->table;
|
||||
|
||||
mutex_lock(&table->lock);
|
||||
|
||||
/* Check if there is at least one entry in mem table */
|
||||
if (!table->mem_tbl_entry_cnt)
|
||||
goto dump_cam_table;
|
||||
|
||||
/* Print table headers */
|
||||
seq_puts(s, "\n\tExact Match MEM Table\n");
|
||||
seq_puts(s, "Index\t");
|
||||
|
||||
for (i = 0; i < table->mem_table.ways; i++) {
|
||||
mem_entry[i] = list_first_entry_or_null(&table->lhead_mem_tbl_entry[i],
|
||||
struct npc_exact_table_entry, list);
|
||||
|
||||
seq_printf(s, "Way-%d\t\t\t\t\t", i);
|
||||
}
|
||||
|
||||
seq_puts(s, "\n");
|
||||
for (i = 0; i < table->mem_table.ways; i++)
|
||||
seq_puts(s, "\tChan MAC \t");
|
||||
|
||||
seq_puts(s, "\n\n");
|
||||
|
||||
/* Print mem table entries */
|
||||
for (i = 0; i < table->mem_table.depth; i++) {
|
||||
bitmap = 0;
|
||||
for (j = 0; j < table->mem_table.ways; j++) {
|
||||
if (!mem_entry[j])
|
||||
continue;
|
||||
|
||||
if (mem_entry[j]->index != i)
|
||||
continue;
|
||||
|
||||
bitmap |= BIT(j);
|
||||
}
|
||||
|
||||
/* No valid entries */
|
||||
if (!bitmap)
|
||||
continue;
|
||||
|
||||
seq_printf(s, "%d\t", i);
|
||||
for (j = 0; j < table->mem_table.ways; j++) {
|
||||
if (!(bitmap & BIT(j))) {
|
||||
seq_puts(s, "nil\t\t\t\t\t");
|
||||
continue;
|
||||
}
|
||||
|
||||
seq_printf(s, "0x%x %pM\t\t\t", mem_entry[j]->chan,
|
||||
mem_entry[j]->mac);
|
||||
mem_entry[j] = list_next_entry(mem_entry[j], list);
|
||||
}
|
||||
seq_puts(s, "\n");
|
||||
}
|
||||
|
||||
dump_cam_table:
|
||||
|
||||
if (!table->cam_tbl_entry_cnt)
|
||||
goto done;
|
||||
|
||||
seq_puts(s, "\n\tExact Match CAM Table\n");
|
||||
seq_puts(s, "index\tchan\tMAC\n");
|
||||
|
||||
/* Traverse cam table entries */
|
||||
list_for_each_entry(cam_entry, &table->lhead_cam_tbl_entry, list) {
|
||||
seq_printf(s, "%d\t0x%x\t%pM\n", cam_entry->index, cam_entry->chan,
|
||||
cam_entry->mac);
|
||||
}
|
||||
|
||||
done:
|
||||
mutex_unlock(&table->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
RVU_DEBUG_SEQ_FOPS(npc_exact_entries, npc_exact_show_entries, NULL);
|
||||
|
||||
static int rvu_dbg_npc_exact_show_info(struct seq_file *s, void *unused)
|
||||
{
|
||||
struct npc_exact_table *table;
|
||||
struct rvu *rvu = s->private;
|
||||
int i;
|
||||
|
||||
table = rvu->hw->table;
|
||||
|
||||
seq_puts(s, "\n\tExact Table Info\n");
|
||||
seq_printf(s, "Exact Match Feature : %s\n",
|
||||
rvu->hw->cap.npc_exact_match_enabled ? "enabled" : "disable");
|
||||
if (!rvu->hw->cap.npc_exact_match_enabled)
|
||||
return 0;
|
||||
|
||||
seq_puts(s, "\nMCAM Index\tMAC Filter Rules Count\n");
|
||||
for (i = 0; i < table->num_drop_rules; i++)
|
||||
seq_printf(s, "%d\t\t%d\n", i, table->cnt_cmd_rules[i]);
|
||||
|
||||
seq_puts(s, "\nMcam Index\tPromisc Mode Status\n");
|
||||
for (i = 0; i < table->num_drop_rules; i++)
|
||||
seq_printf(s, "%d\t\t%s\n", i, table->promisc_mode[i] ? "on" : "off");
|
||||
|
||||
seq_puts(s, "\n\tMEM Table Info\n");
|
||||
seq_printf(s, "Ways : %d\n", table->mem_table.ways);
|
||||
seq_printf(s, "Depth : %d\n", table->mem_table.depth);
|
||||
seq_printf(s, "Mask : 0x%llx\n", table->mem_table.mask);
|
||||
seq_printf(s, "Hash Mask : 0x%x\n", table->mem_table.hash_mask);
|
||||
seq_printf(s, "Hash Offset : 0x%x\n", table->mem_table.hash_offset);
|
||||
|
||||
seq_puts(s, "\n\tCAM Table Info\n");
|
||||
seq_printf(s, "Depth : %d\n", table->cam_table.depth);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
RVU_DEBUG_SEQ_FOPS(npc_exact_info, npc_exact_show_info, NULL);
|
||||
|
||||
static int rvu_dbg_npc_exact_drop_cnt(struct seq_file *s, void *unused)
|
||||
{
|
||||
struct npc_exact_table *table;
|
||||
struct rvu *rvu = s->private;
|
||||
struct npc_key_field *field;
|
||||
u16 chan, pcifunc;
|
||||
int blkaddr, i;
|
||||
u64 cfg, cam1;
|
||||
char *str;
|
||||
|
||||
blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
|
||||
table = rvu->hw->table;
|
||||
|
||||
field = &rvu->hw->mcam.rx_key_fields[NPC_CHAN];
|
||||
|
||||
seq_puts(s, "\n\t Exact Hit on drop status\n");
|
||||
seq_puts(s, "\npcifunc\tmcam_idx\tHits\tchan\tstatus\n");
|
||||
|
||||
for (i = 0; i < table->num_drop_rules; i++) {
|
||||
pcifunc = rvu_npc_exact_drop_rule_to_pcifunc(rvu, i);
|
||||
cfg = rvu_read64(rvu, blkaddr, NPC_AF_MCAMEX_BANKX_CFG(i, 0));
|
||||
|
||||
/* channel will be always in keyword 0 */
|
||||
cam1 = rvu_read64(rvu, blkaddr,
|
||||
NPC_AF_MCAMEX_BANKX_CAMX_W0(i, 0, 1));
|
||||
chan = field->kw_mask[0] & cam1;
|
||||
|
||||
str = (cfg & 1) ? "enabled" : "disabled";
|
||||
|
||||
seq_printf(s, "0x%x\t%d\t\t%llu\t0x%x\t%s\n", pcifunc, i,
|
||||
rvu_read64(rvu, blkaddr,
|
||||
NPC_AF_MATCH_STATX(table->counter_idx[i])),
|
||||
chan, str);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
RVU_DEBUG_SEQ_FOPS(npc_exact_drop_cnt, npc_exact_drop_cnt, NULL);
|
||||
|
||||
static void rvu_dbg_npc_init(struct rvu *rvu)
|
||||
{
|
||||
rvu->rvu_dbg.npc = debugfs_create_dir("npc", rvu->rvu_dbg.root);
|
||||
@ -2608,8 +2773,22 @@ static void rvu_dbg_npc_init(struct rvu *rvu)
|
||||
&rvu_dbg_npc_mcam_info_fops);
|
||||
debugfs_create_file("mcam_rules", 0444, rvu->rvu_dbg.npc, rvu,
|
||||
&rvu_dbg_npc_mcam_rules_fops);
|
||||
|
||||
debugfs_create_file("rx_miss_act_stats", 0444, rvu->rvu_dbg.npc, rvu,
|
||||
&rvu_dbg_npc_rx_miss_act_fops);
|
||||
|
||||
if (!rvu->hw->cap.npc_exact_match_enabled)
|
||||
return;
|
||||
|
||||
debugfs_create_file("exact_entries", 0444, rvu->rvu_dbg.npc, rvu,
|
||||
&rvu_dbg_npc_exact_entries_fops);
|
||||
|
||||
debugfs_create_file("exact_info", 0444, rvu->rvu_dbg.npc, rvu,
|
||||
&rvu_dbg_npc_exact_info_fops);
|
||||
|
||||
debugfs_create_file("exact_drop_cnt", 0444, rvu->rvu_dbg.npc, rvu,
|
||||
&rvu_dbg_npc_exact_drop_cnt_fops);
|
||||
|
||||
}
|
||||
|
||||
static int cpt_eng_sts_display(struct seq_file *filp, u8 eng_type)
|
||||
|
Loading…
Reference in New Issue
Block a user