Commit 99b8e547 authored by Hariprasad Kelam's avatar Hariprasad Kelam Committed by David S. Miller

octeontx2-af: cn10K: Get NPC counters value

The way SW can identify the number NPC counters supported by silicon
has changed for CN10K. This patch addresses this reading appropriate
registers to find out number of counters available.
Signed-off-by: default avatarHariprasad Kelam <hkelam@marvell.com>
Signed-off-by: default avatarSunil Goutham <sgoutham@marvell.com>
Signed-off-by: default avatarSubbaraya Sundeep <sbhatta@marvell.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7df5b4b2
...@@ -356,6 +356,7 @@ struct rvu_hwinfo { ...@@ -356,6 +356,7 @@ struct rvu_hwinfo {
u16 npc_counters; /* No of match stats counters */ u16 npc_counters; /* No of match stats counters */
u32 lbk_bufsize; /* FIFO size supported by LBK */ u32 lbk_bufsize; /* FIFO size supported by LBK */
bool npc_ext_set; /* Extended register set */ bool npc_ext_set; /* Extended register set */
u64 npc_stat_ena; /* Match stats enable bit */
struct hw_cap cap; struct hw_cap cap;
struct rvu_block block[BLK_COUNT]; /* Block info */ struct rvu_block block[BLK_COUNT]; /* Block info */
......
...@@ -1898,9 +1898,22 @@ static void rvu_npc_hw_init(struct rvu *rvu, int blkaddr) ...@@ -1898,9 +1898,22 @@ static void rvu_npc_hw_init(struct rvu *rvu, int blkaddr)
mcam->banks = (npc_const >> 44) & 0xFULL; mcam->banks = (npc_const >> 44) & 0xFULL;
mcam->banksize = (npc_const >> 28) & 0xFFFFULL; mcam->banksize = (npc_const >> 28) & 0xFFFFULL;
hw->npc_stat_ena = BIT_ULL(9);
/* Extended set */ /* Extended set */
if (npc_const2) { if (npc_const2) {
hw->npc_ext_set = true; hw->npc_ext_set = true;
/* 96xx supports only match_stats and npc_counters
* reflected in NPC_AF_CONST reg.
* STAT_SEL and ENA are at [0:8] and 9 bit positions.
* 98xx has both match_stat and ext and npc_counter
* reflected in NPC_AF_CONST2
* STAT_SEL_EXT added at [12:14] bit position.
* cn10k supports only ext and hence npc_counters in
* NPC_AF_CONST is 0 and npc_counters reflected in NPC_AF_CONST2.
* STAT_SEL bitpos incremented from [0:8] to [0:11] and ENA bit moved to 63
*/
if (!hw->npc_counters)
hw->npc_stat_ena = BIT_ULL(63);
hw->npc_counters = (npc_const2 >> 16) & 0xFFFFULL; hw->npc_counters = (npc_const2 >> 16) & 0xFFFFULL;
mcam->banksize = npc_const2 & 0xFFFFULL; mcam->banksize = npc_const2 & 0xFFFFULL;
} }
...@@ -1955,7 +1968,7 @@ static void rvu_npc_setup_interfaces(struct rvu *rvu, int blkaddr) ...@@ -1955,7 +1968,7 @@ static void rvu_npc_setup_interfaces(struct rvu *rvu, int blkaddr)
rvu_write64(rvu, blkaddr, rvu_write64(rvu, blkaddr,
NPC_AF_INTFX_MISS_STAT_ACT(intf), NPC_AF_INTFX_MISS_STAT_ACT(intf),
((mcam->rx_miss_act_cntr >> 9) << 12) | ((mcam->rx_miss_act_cntr >> 9) << 12) |
BIT_ULL(9) | mcam->rx_miss_act_cntr); hw->npc_stat_ena | mcam->rx_miss_act_cntr);
} }
/* Configure TX interfaces */ /* Configure TX interfaces */
...@@ -2147,18 +2160,16 @@ static void npc_map_mcam_entry_and_cntr(struct rvu *rvu, struct npc_mcam *mcam, ...@@ -2147,18 +2160,16 @@ static void npc_map_mcam_entry_and_cntr(struct rvu *rvu, struct npc_mcam *mcam,
int blkaddr, u16 entry, u16 cntr) int blkaddr, u16 entry, u16 cntr)
{ {
u16 index = entry & (mcam->banksize - 1); u16 index = entry & (mcam->banksize - 1);
u16 bank = npc_get_bank(mcam, entry); u32 bank = npc_get_bank(mcam, entry);
struct rvu_hwinfo *hw = rvu->hw;
/* Set mapping and increment counter's refcnt */ /* Set mapping and increment counter's refcnt */
mcam->entry2cntr_map[entry] = cntr; mcam->entry2cntr_map[entry] = cntr;
mcam->cntr_refcnt[cntr]++; mcam->cntr_refcnt[cntr]++;
/* Enable stats /* Enable stats */
* NPC_AF_MCAMEX_BANKX_STAT_ACT[14:12] - counter[11:9]
* NPC_AF_MCAMEX_BANKX_STAT_ACT[8:0] - counter[8:0]
*/
rvu_write64(rvu, blkaddr, rvu_write64(rvu, blkaddr,
NPC_AF_MCAMEX_BANKX_STAT_ACT(index, bank), NPC_AF_MCAMEX_BANKX_STAT_ACT(index, bank),
((cntr >> 9) << 12) | BIT_ULL(9) | cntr); ((cntr >> 9) << 12) | hw->npc_stat_ena | cntr);
} }
static void npc_unmap_mcam_entry_and_cntr(struct rvu *rvu, static void npc_unmap_mcam_entry_and_cntr(struct rvu *rvu,
...@@ -3264,7 +3275,7 @@ int rvu_mbox_handler_npc_mcam_entry_stats(struct rvu *rvu, ...@@ -3264,7 +3275,7 @@ int rvu_mbox_handler_npc_mcam_entry_stats(struct rvu *rvu,
/* read MCAM entry STAT_ACT register */ /* read MCAM entry STAT_ACT register */
regval = rvu_read64(rvu, blkaddr, NPC_AF_MCAMEX_BANKX_STAT_ACT(index, bank)); regval = rvu_read64(rvu, blkaddr, NPC_AF_MCAMEX_BANKX_STAT_ACT(index, bank));
if (!(regval & BIT_ULL(9))) { if (!(regval & rvu->hw->npc_stat_ena)) {
rsp->stat_ena = 0; rsp->stat_ena = 0;
mutex_unlock(&mcam->lock); mutex_unlock(&mcam->lock);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment