|
|
|
|
@ -1632,6 +1632,165 @@ static int rvu_dbg_nix_qsize_display(struct seq_file *filp, void *unused)
|
|
|
|
|
|
|
|
|
|
RVU_DEBUG_SEQ_FOPS(nix_qsize, nix_qsize_display, nix_qsize_write);
|
|
|
|
|
|
|
|
|
|
static void print_band_prof_ctx(struct seq_file *m,
|
|
|
|
|
struct nix_bandprof_s *prof)
|
|
|
|
|
{
|
|
|
|
|
char *str;
|
|
|
|
|
|
|
|
|
|
switch (prof->pc_mode) {
|
|
|
|
|
case NIX_RX_PC_MODE_VLAN:
|
|
|
|
|
str = "VLAN";
|
|
|
|
|
break;
|
|
|
|
|
case NIX_RX_PC_MODE_DSCP:
|
|
|
|
|
str = "DSCP";
|
|
|
|
|
break;
|
|
|
|
|
case NIX_RX_PC_MODE_GEN:
|
|
|
|
|
str = "Generic";
|
|
|
|
|
break;
|
|
|
|
|
case NIX_RX_PC_MODE_RSVD:
|
|
|
|
|
str = "Reserved";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
seq_printf(m, "W0: pc_mode\t\t%s\n", str);
|
|
|
|
|
str = (prof->icolor == 3) ? "Color blind" :
|
|
|
|
|
(prof->icolor == 0) ? "Green" :
|
|
|
|
|
(prof->icolor == 1) ? "Yellow" : "Red";
|
|
|
|
|
seq_printf(m, "W0: icolor\t\t%s\n", str);
|
|
|
|
|
seq_printf(m, "W0: tnl_ena\t\t%d\n", prof->tnl_ena);
|
|
|
|
|
seq_printf(m, "W0: peir_exponent\t%d\n", prof->peir_exponent);
|
|
|
|
|
seq_printf(m, "W0: pebs_exponent\t%d\n", prof->pebs_exponent);
|
|
|
|
|
seq_printf(m, "W0: cir_exponent\t%d\n", prof->cir_exponent);
|
|
|
|
|
seq_printf(m, "W0: cbs_exponent\t%d\n", prof->cbs_exponent);
|
|
|
|
|
seq_printf(m, "W0: peir_mantissa\t%d\n", prof->peir_mantissa);
|
|
|
|
|
seq_printf(m, "W0: pebs_mantissa\t%d\n", prof->pebs_mantissa);
|
|
|
|
|
seq_printf(m, "W0: cir_mantissa\t%d\n", prof->cir_mantissa);
|
|
|
|
|
|
|
|
|
|
seq_printf(m, "W1: cbs_mantissa\t%d\n", prof->cbs_mantissa);
|
|
|
|
|
str = (prof->lmode == 0) ? "byte" : "packet";
|
|
|
|
|
seq_printf(m, "W1: lmode\t\t%s\n", str);
|
|
|
|
|
seq_printf(m, "W1: l_select\t\t%d\n", prof->l_sellect);
|
|
|
|
|
seq_printf(m, "W1: rdiv\t\t%d\n", prof->rdiv);
|
|
|
|
|
seq_printf(m, "W1: adjust_exponent\t%d\n", prof->adjust_exponent);
|
|
|
|
|
seq_printf(m, "W1: adjust_mantissa\t%d\n", prof->adjust_mantissa);
|
|
|
|
|
str = (prof->gc_action == 0) ? "PASS" :
|
|
|
|
|
(prof->gc_action == 1) ? "DROP" : "RED";
|
|
|
|
|
seq_printf(m, "W1: gc_action\t\t%s\n", str);
|
|
|
|
|
str = (prof->yc_action == 0) ? "PASS" :
|
|
|
|
|
(prof->yc_action == 1) ? "DROP" : "RED";
|
|
|
|
|
seq_printf(m, "W1: yc_action\t\t%s\n", str);
|
|
|
|
|
str = (prof->rc_action == 0) ? "PASS" :
|
|
|
|
|
(prof->rc_action == 1) ? "DROP" : "RED";
|
|
|
|
|
seq_printf(m, "W1: rc_action\t\t%s\n", str);
|
|
|
|
|
seq_printf(m, "W1: meter_algo\t\t%d\n", prof->meter_algo);
|
|
|
|
|
seq_printf(m, "W1: band_prof_id\t%d\n", prof->band_prof_id);
|
|
|
|
|
seq_printf(m, "W1: hl_en\t\t%d\n", prof->hl_en);
|
|
|
|
|
|
|
|
|
|
seq_printf(m, "W2: ts\t\t\t%lld\n", (u64)prof->ts);
|
|
|
|
|
seq_printf(m, "W3: pe_accum\t\t%d\n", prof->pe_accum);
|
|
|
|
|
seq_printf(m, "W3: c_accum\t\t%d\n", prof->c_accum);
|
|
|
|
|
seq_printf(m, "W4: green_pkt_pass\t%lld\n",
|
|
|
|
|
(u64)prof->green_pkt_pass);
|
|
|
|
|
seq_printf(m, "W5: yellow_pkt_pass\t%lld\n",
|
|
|
|
|
(u64)prof->yellow_pkt_pass);
|
|
|
|
|
seq_printf(m, "W6: red_pkt_pass\t%lld\n", (u64)prof->red_pkt_pass);
|
|
|
|
|
seq_printf(m, "W7: green_octs_pass\t%lld\n",
|
|
|
|
|
(u64)prof->green_octs_pass);
|
|
|
|
|
seq_printf(m, "W8: yellow_octs_pass\t%lld\n",
|
|
|
|
|
(u64)prof->yellow_octs_pass);
|
|
|
|
|
seq_printf(m, "W9: red_octs_pass\t%lld\n", (u64)prof->red_octs_pass);
|
|
|
|
|
seq_printf(m, "W10: green_pkt_drop\t%lld\n",
|
|
|
|
|
(u64)prof->green_pkt_drop);
|
|
|
|
|
seq_printf(m, "W11: yellow_pkt_drop\t%lld\n",
|
|
|
|
|
(u64)prof->yellow_pkt_drop);
|
|
|
|
|
seq_printf(m, "W12: red_pkt_drop\t%lld\n", (u64)prof->red_pkt_drop);
|
|
|
|
|
seq_printf(m, "W13: green_octs_drop\t%lld\n",
|
|
|
|
|
(u64)prof->green_octs_drop);
|
|
|
|
|
seq_printf(m, "W14: yellow_octs_drop\t%lld\n",
|
|
|
|
|
(u64)prof->yellow_octs_drop);
|
|
|
|
|
seq_printf(m, "W15: red_octs_drop\t%lld\n", (u64)prof->red_octs_drop);
|
|
|
|
|
seq_puts(m, "==============================\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int rvu_dbg_nix_band_prof_ctx_display(struct seq_file *m, void *unused)
|
|
|
|
|
{
|
|
|
|
|
struct nix_hw *nix_hw = m->private;
|
|
|
|
|
struct nix_cn10k_aq_enq_req aq_req;
|
|
|
|
|
struct nix_cn10k_aq_enq_rsp aq_rsp;
|
|
|
|
|
struct rvu *rvu = nix_hw->rvu;
|
|
|
|
|
struct nix_ipolicer *ipolicer;
|
|
|
|
|
int layer, prof_idx, idx, rc;
|
|
|
|
|
u16 pcifunc;
|
|
|
|
|
char *str;
|
|
|
|
|
|
|
|
|
|
for (layer = 0; layer < BAND_PROF_NUM_LAYERS; layer++) {
|
|
|
|
|
if (layer == BAND_PROF_INVAL_LAYER)
|
|
|
|
|
continue;
|
|
|
|
|
str = (layer == BAND_PROF_LEAF_LAYER) ? "Leaf" :
|
|
|
|
|
(layer == BAND_PROF_MID_LAYER) ? "Mid" : "Top";
|
|
|
|
|
|
|
|
|
|
seq_printf(m, "\n%s bandwidth profiles\n", str);
|
|
|
|
|
seq_puts(m, "=======================\n");
|
|
|
|
|
|
|
|
|
|
ipolicer = &nix_hw->ipolicer[layer];
|
|
|
|
|
|
|
|
|
|
for (idx = 0; idx < ipolicer->band_prof.max; idx++) {
|
|
|
|
|
if (is_rsrc_free(&ipolicer->band_prof, idx))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
prof_idx = (idx & 0x3FFF) | (layer << 14);
|
|
|
|
|
rc = nix_aq_context_read(rvu, nix_hw, &aq_req, &aq_rsp,
|
|
|
|
|
0x00, NIX_AQ_CTYPE_BANDPROF,
|
|
|
|
|
prof_idx);
|
|
|
|
|
if (rc) {
|
|
|
|
|
dev_err(rvu->dev,
|
|
|
|
|
"%s: Failed to fetch context of %s profile %d, err %d\n",
|
|
|
|
|
__func__, str, idx, rc);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
seq_printf(m, "\n%s bandwidth profile:: %d\n", str, idx);
|
|
|
|
|
pcifunc = ipolicer->pfvf_map[idx];
|
|
|
|
|
if (!(pcifunc & RVU_PFVF_FUNC_MASK))
|
|
|
|
|
seq_printf(m, "Allocated to :: PF %d\n",
|
|
|
|
|
rvu_get_pf(pcifunc));
|
|
|
|
|
else
|
|
|
|
|
seq_printf(m, "Allocated to :: PF %d VF %d\n",
|
|
|
|
|
rvu_get_pf(pcifunc),
|
|
|
|
|
(pcifunc & RVU_PFVF_FUNC_MASK) - 1);
|
|
|
|
|
print_band_prof_ctx(m, &aq_rsp.prof);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RVU_DEBUG_SEQ_FOPS(nix_band_prof_ctx, nix_band_prof_ctx_display, NULL);
|
|
|
|
|
|
|
|
|
|
static int rvu_dbg_nix_band_prof_rsrc_display(struct seq_file *m, void *unused)
|
|
|
|
|
{
|
|
|
|
|
struct nix_hw *nix_hw = m->private;
|
|
|
|
|
struct nix_ipolicer *ipolicer;
|
|
|
|
|
int layer;
|
|
|
|
|
char *str;
|
|
|
|
|
|
|
|
|
|
seq_puts(m, "\nBandwidth profile resource free count\n");
|
|
|
|
|
seq_puts(m, "=====================================\n");
|
|
|
|
|
for (layer = 0; layer < BAND_PROF_NUM_LAYERS; layer++) {
|
|
|
|
|
if (layer == BAND_PROF_INVAL_LAYER)
|
|
|
|
|
continue;
|
|
|
|
|
str = (layer == BAND_PROF_LEAF_LAYER) ? "Leaf" :
|
|
|
|
|
(layer == BAND_PROF_MID_LAYER) ? "Mid " : "Top ";
|
|
|
|
|
|
|
|
|
|
ipolicer = &nix_hw->ipolicer[layer];
|
|
|
|
|
seq_printf(m, "%s :: Max: %4d Free: %4d\n", str,
|
|
|
|
|
ipolicer->band_prof.max,
|
|
|
|
|
rvu_rsrc_free_count(&ipolicer->band_prof));
|
|
|
|
|
}
|
|
|
|
|
seq_puts(m, "=====================================\n");
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RVU_DEBUG_SEQ_FOPS(nix_band_prof_rsrc, nix_band_prof_rsrc_display, NULL);
|
|
|
|
|
|
|
|
|
|
static void rvu_dbg_nix_init(struct rvu *rvu, int blkaddr)
|
|
|
|
|
{
|
|
|
|
|
struct nix_hw *nix_hw;
|
|
|
|
|
@ -1664,6 +1823,10 @@ static void rvu_dbg_nix_init(struct rvu *rvu, int blkaddr)
|
|
|
|
|
&rvu_dbg_nix_ndc_rx_hits_miss_fops);
|
|
|
|
|
debugfs_create_file("qsize", 0600, rvu->rvu_dbg.nix, rvu,
|
|
|
|
|
&rvu_dbg_nix_qsize_fops);
|
|
|
|
|
debugfs_create_file("ingress_policer_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
|
|
|
|
|
&rvu_dbg_nix_band_prof_ctx_fops);
|
|
|
|
|
debugfs_create_file("ingress_policer_rsrc", 0600, rvu->rvu_dbg.nix, nix_hw,
|
|
|
|
|
&rvu_dbg_nix_band_prof_rsrc_fops);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void rvu_dbg_npa_init(struct rvu *rvu)
|
|
|
|
|
|