mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
octeontx2-af: Support to retrieve CGX LMAC stats
This patch adds support for a RVU PF/VF driver to retrieve it's mapped CGX LMAC Rx and Tx stats from AF via mbox. New mailbox msg is added is added. Signed-off-by: Christina Jacob <cjacob@marvell.com> Signed-off-by: Sunil Goutham <sgoutham@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1435f66a28
commit
66208910e5
5 changed files with 76 additions and 0 deletions
|
@ -119,6 +119,28 @@ void *cgx_get_pdata(int cgx_id)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cgx_get_pdata);
|
EXPORT_SYMBOL(cgx_get_pdata);
|
||||||
|
|
||||||
|
int cgx_get_rx_stats(void *cgxd, int lmac_id, int idx, u64 *rx_stat)
|
||||||
|
{
|
||||||
|
struct cgx *cgx = cgxd;
|
||||||
|
|
||||||
|
if (!cgx || lmac_id >= cgx->lmac_count)
|
||||||
|
return -ENODEV;
|
||||||
|
*rx_stat = cgx_read(cgx, lmac_id, CGXX_CMRX_RX_STAT0 + (idx * 8));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(cgx_get_rx_stats);
|
||||||
|
|
||||||
|
int cgx_get_tx_stats(void *cgxd, int lmac_id, int idx, u64 *tx_stat)
|
||||||
|
{
|
||||||
|
struct cgx *cgx = cgxd;
|
||||||
|
|
||||||
|
if (!cgx || lmac_id >= cgx->lmac_count)
|
||||||
|
return -ENODEV;
|
||||||
|
*tx_stat = cgx_read(cgx, lmac_id, CGXX_CMRX_TX_STAT0 + (idx * 8));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(cgx_get_tx_stats);
|
||||||
|
|
||||||
int cgx_lmac_rx_tx_enable(void *cgxd, int lmac_id, bool enable)
|
int cgx_lmac_rx_tx_enable(void *cgxd, int lmac_id, bool enable)
|
||||||
{
|
{
|
||||||
struct cgx *cgx = cgxd;
|
struct cgx *cgx = cgxd;
|
||||||
|
|
|
@ -32,7 +32,9 @@
|
||||||
#define FW_CGX_INT BIT_ULL(1)
|
#define FW_CGX_INT BIT_ULL(1)
|
||||||
#define CGXX_CMRX_INT_ENA_W1S 0x058
|
#define CGXX_CMRX_INT_ENA_W1S 0x058
|
||||||
#define CGXX_CMRX_RX_ID_MAP 0x060
|
#define CGXX_CMRX_RX_ID_MAP 0x060
|
||||||
|
#define CGXX_CMRX_RX_STAT0 0x070
|
||||||
#define CGXX_CMRX_RX_LMACS 0x128
|
#define CGXX_CMRX_RX_LMACS 0x128
|
||||||
|
#define CGXX_CMRX_TX_STAT0 0x700
|
||||||
#define CGXX_SCRATCH0_REG 0x1050
|
#define CGXX_SCRATCH0_REG 0x1050
|
||||||
#define CGXX_SCRATCH1_REG 0x1058
|
#define CGXX_SCRATCH1_REG 0x1058
|
||||||
#define CGX_CONST 0x2000
|
#define CGX_CONST 0x2000
|
||||||
|
@ -66,5 +68,7 @@ int cgx_get_cgx_cnt(void);
|
||||||
int cgx_get_lmac_cnt(void *cgxd);
|
int cgx_get_lmac_cnt(void *cgxd);
|
||||||
void *cgx_get_pdata(int cgx_id);
|
void *cgx_get_pdata(int cgx_id);
|
||||||
int cgx_lmac_evh_register(struct cgx_event_cb *cb, void *cgxd, int lmac_id);
|
int cgx_lmac_evh_register(struct cgx_event_cb *cb, void *cgxd, int lmac_id);
|
||||||
|
int cgx_get_tx_stats(void *cgxd, int lmac_id, int idx, u64 *tx_stat);
|
||||||
|
int cgx_get_rx_stats(void *cgxd, int lmac_id, int idx, u64 *rx_stat);
|
||||||
int cgx_lmac_rx_tx_enable(void *cgxd, int lmac_id, bool enable);
|
int cgx_lmac_rx_tx_enable(void *cgxd, int lmac_id, bool enable);
|
||||||
#endif /* CGX_H */
|
#endif /* CGX_H */
|
||||||
|
|
|
@ -126,6 +126,7 @@ M(MSIX_OFFSET, 0x004, msg_req, msix_offset_rsp) \
|
||||||
/* CGX mbox IDs (range 0x200 - 0x3FF) */ \
|
/* CGX mbox IDs (range 0x200 - 0x3FF) */ \
|
||||||
M(CGX_START_RXTX, 0x200, msg_req, msg_rsp) \
|
M(CGX_START_RXTX, 0x200, msg_req, msg_rsp) \
|
||||||
M(CGX_STOP_RXTX, 0x201, msg_req, msg_rsp) \
|
M(CGX_STOP_RXTX, 0x201, msg_req, msg_rsp) \
|
||||||
|
M(CGX_STATS, 0x202, msg_req, cgx_stats_rsp) \
|
||||||
/* NPA mbox IDs (range 0x400 - 0x5FF) */ \
|
/* NPA mbox IDs (range 0x400 - 0x5FF) */ \
|
||||||
/* SSO/SSOW mbox IDs (range 0x600 - 0x7FF) */ \
|
/* SSO/SSOW mbox IDs (range 0x600 - 0x7FF) */ \
|
||||||
/* TIM mbox IDs (range 0x800 - 0x9FF) */ \
|
/* TIM mbox IDs (range 0x800 - 0x9FF) */ \
|
||||||
|
@ -210,4 +211,14 @@ struct msix_offset_rsp {
|
||||||
u16 cptlf_msixoff[MAX_RVU_BLKLF_CNT];
|
u16 cptlf_msixoff[MAX_RVU_BLKLF_CNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* CGX mbox message formats */
|
||||||
|
|
||||||
|
struct cgx_stats_rsp {
|
||||||
|
struct mbox_msghdr hdr;
|
||||||
|
#define CGX_RX_STATS_COUNT 13
|
||||||
|
#define CGX_TX_STATS_COUNT 18
|
||||||
|
u64 rx_stats[CGX_RX_STATS_COUNT];
|
||||||
|
u64 tx_stats[CGX_TX_STATS_COUNT];
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* MBOX_H */
|
#endif /* MBOX_H */
|
||||||
|
|
|
@ -171,4 +171,6 @@ int rvu_mbox_handler_CGX_START_RXTX(struct rvu *rvu, struct msg_req *req,
|
||||||
struct msg_rsp *rsp);
|
struct msg_rsp *rsp);
|
||||||
int rvu_mbox_handler_CGX_STOP_RXTX(struct rvu *rvu, struct msg_req *req,
|
int rvu_mbox_handler_CGX_STOP_RXTX(struct rvu *rvu, struct msg_req *req,
|
||||||
struct msg_rsp *rsp);
|
struct msg_rsp *rsp);
|
||||||
|
int rvu_mbox_handler_CGX_STATS(struct rvu *rvu, struct msg_req *req,
|
||||||
|
struct cgx_stats_rsp *rsp);
|
||||||
#endif /* RVU_H */
|
#endif /* RVU_H */
|
||||||
|
|
|
@ -224,3 +224,40 @@ int rvu_mbox_handler_CGX_STOP_RXTX(struct rvu *rvu, struct msg_req *req,
|
||||||
rvu_cgx_config_rxtx(rvu, req->hdr.pcifunc, false);
|
rvu_cgx_config_rxtx(rvu, req->hdr.pcifunc, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rvu_mbox_handler_CGX_STATS(struct rvu *rvu, struct msg_req *req,
|
||||||
|
struct cgx_stats_rsp *rsp)
|
||||||
|
{
|
||||||
|
int pf = rvu_get_pf(req->hdr.pcifunc);
|
||||||
|
int stat = 0, err = 0;
|
||||||
|
u64 tx_stat, rx_stat;
|
||||||
|
u8 cgx_idx, lmac;
|
||||||
|
void *cgxd;
|
||||||
|
|
||||||
|
if ((req->hdr.pcifunc & RVU_PFVF_FUNC_MASK) ||
|
||||||
|
!is_pf_cgxmapped(rvu, pf))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_idx, &lmac);
|
||||||
|
cgxd = rvu_cgx_pdata(cgx_idx, rvu);
|
||||||
|
|
||||||
|
/* Rx stats */
|
||||||
|
while (stat < CGX_RX_STATS_COUNT) {
|
||||||
|
err = cgx_get_rx_stats(cgxd, lmac, stat, &rx_stat);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
rsp->rx_stats[stat] = rx_stat;
|
||||||
|
stat++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tx stats */
|
||||||
|
stat = 0;
|
||||||
|
while (stat < CGX_TX_STATS_COUNT) {
|
||||||
|
err = cgx_get_tx_stats(cgxd, lmac, stat, &tx_stat);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
rsp->tx_stats[stat] = tx_stat;
|
||||||
|
stat++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue