octeontx2-af: Support to retrieve CGX LMAC stats
authorChristina Jacob <cjacob@marvell.com>
Tue, 16 Oct 2018 11:27:07 +0000 (16:57 +0530)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Oct 2018 04:33:42 +0000 (21:33 -0700)
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>
drivers/net/ethernet/marvell/octeontx2/af/cgx.c
drivers/net/ethernet/marvell/octeontx2/af/cgx.h
drivers/net/ethernet/marvell/octeontx2/af/mbox.h
drivers/net/ethernet/marvell/octeontx2/af/rvu.h
drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c

index 03a91c69e6302982b493693b3e448c13cd36ddd0..a7dc6f265df8a4523447d0368c3c3dcf0cd0d7eb 100644 (file)
@@ -119,6 +119,28 @@ void *cgx_get_pdata(int cgx_id)
 }
 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)
 {
        struct cgx *cgx = cgxd;
index 90979353216cf015d8538840b0090051726c3b42..8f596dfb6b2a15ca22ee5e7fbab295f2632e2257 100644 (file)
@@ -32,7 +32,9 @@
 #define  FW_CGX_INT                            BIT_ULL(1)
 #define CGXX_CMRX_INT_ENA_W1S          0x058
 #define CGXX_CMRX_RX_ID_MAP            0x060
+#define CGXX_CMRX_RX_STAT0             0x070
 #define CGXX_CMRX_RX_LMACS             0x128
+#define CGXX_CMRX_TX_STAT0             0x700
 #define CGXX_SCRATCH0_REG              0x1050
 #define CGXX_SCRATCH1_REG              0x1058
 #define CGX_CONST                      0x2000
@@ -66,5 +68,7 @@ int cgx_get_cgx_cnt(void);
 int cgx_get_lmac_cnt(void *cgxd);
 void *cgx_get_pdata(int cgx_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);
 #endif /* CGX_H */
index 6b66cf0a5e71fdcbb901533c1e84eb2cf9885cef..03dd04d53f3b66b0468165f519fe7136e4ef0faa 100644 (file)
@@ -126,6 +126,7 @@ M(MSIX_OFFSET,              0x004, msg_req, msix_offset_rsp)                \
 /* CGX mbox IDs (range 0x200 - 0x3FF) */                               \
 M(CGX_START_RXTX,      0x200, 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) */                               \
 /* SSO/SSOW mbox IDs (range 0x600 - 0x7FF) */                          \
 /* TIM mbox IDs (range 0x800 - 0x9FF) */                               \
@@ -210,4 +211,14 @@ struct msix_offset_rsp {
        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 */
index 4cf2bcb956442df2772c3fdf94cb00801b4d1539..8ee66632ed29c170f5f4d5a004806729e10af47c 100644 (file)
@@ -171,4 +171,6 @@ int rvu_mbox_handler_CGX_START_RXTX(struct rvu *rvu, struct msg_req *req,
                                    struct msg_rsp *rsp);
 int rvu_mbox_handler_CGX_STOP_RXTX(struct rvu *rvu, struct msg_req *req,
                                   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 */
index 75a03a840e7a21d9dd92c633567fb38dc96a44c8..a4aa1e07e8f90eac29dacb0a6a44aa6ad0140035 100644 (file)
@@ -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);
        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;
+}