net/thunderx/base: add statistics
authorJerin Jacob <jerin.jacob@caviumnetworks.com>
Fri, 17 Jun 2016 13:29:34 +0000 (18:59 +0530)
committerBruce Richardson <bruce.richardson@intel.com>
Mon, 20 Jun 2016 15:21:54 +0000 (17:21 +0200)
Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Signed-off-by: Maciej Czekaj <maciej.czekaj@caviumnetworks.com>
Signed-off-by: Kamil Rytarowski <kamil.rytarowski@caviumnetworks.com>
Signed-off-by: Zyta Szpak <zyta.szpak@semihalf.com>
Signed-off-by: Slawomir Rosek <slawomir.rosek@semihalf.com>
Signed-off-by: Radoslaw Biernacki <rad@semihalf.com>
drivers/net/thunderx/base/nicvf_hw.c
drivers/net/thunderx/base/nicvf_hw.h

index 3366aa5..001b0ed 100644 (file)
@@ -858,3 +858,48 @@ nicvf_loopback_config(struct nicvf *nic, bool enable)
 
        return nicvf_mbox_loopback_config(nic, enable);
 }
+
+void
+nicvf_hw_get_stats(struct nicvf *nic, struct nicvf_hw_stats *stats)
+{
+       stats->rx_bytes = NICVF_GET_RX_STATS(RX_OCTS);
+       stats->rx_ucast_frames = NICVF_GET_RX_STATS(RX_UCAST);
+       stats->rx_bcast_frames = NICVF_GET_RX_STATS(RX_BCAST);
+       stats->rx_mcast_frames = NICVF_GET_RX_STATS(RX_MCAST);
+       stats->rx_fcs_errors = NICVF_GET_RX_STATS(RX_FCS);
+       stats->rx_l2_errors = NICVF_GET_RX_STATS(RX_L2ERR);
+       stats->rx_drop_red = NICVF_GET_RX_STATS(RX_RED);
+       stats->rx_drop_red_bytes = NICVF_GET_RX_STATS(RX_RED_OCTS);
+       stats->rx_drop_overrun = NICVF_GET_RX_STATS(RX_ORUN);
+       stats->rx_drop_overrun_bytes = NICVF_GET_RX_STATS(RX_ORUN_OCTS);
+       stats->rx_drop_bcast = NICVF_GET_RX_STATS(RX_DRP_BCAST);
+       stats->rx_drop_mcast = NICVF_GET_RX_STATS(RX_DRP_MCAST);
+       stats->rx_drop_l3_bcast = NICVF_GET_RX_STATS(RX_DRP_L3BCAST);
+       stats->rx_drop_l3_mcast = NICVF_GET_RX_STATS(RX_DRP_L3MCAST);
+
+       stats->tx_bytes_ok = NICVF_GET_TX_STATS(TX_OCTS);
+       stats->tx_ucast_frames_ok = NICVF_GET_TX_STATS(TX_UCAST);
+       stats->tx_bcast_frames_ok = NICVF_GET_TX_STATS(TX_BCAST);
+       stats->tx_mcast_frames_ok = NICVF_GET_TX_STATS(TX_MCAST);
+       stats->tx_drops = NICVF_GET_TX_STATS(TX_DROP);
+}
+
+void
+nicvf_hw_get_rx_qstats(struct nicvf *nic, struct nicvf_hw_rx_qstats *qstats,
+                      uint16_t qidx)
+{
+       qstats->q_rx_bytes =
+               nicvf_queue_reg_read(nic, NIC_QSET_RQ_0_7_STATUS0, qidx);
+       qstats->q_rx_packets =
+               nicvf_queue_reg_read(nic, NIC_QSET_RQ_0_7_STATUS1, qidx);
+}
+
+void
+nicvf_hw_get_tx_qstats(struct nicvf *nic, struct nicvf_hw_tx_qstats *qstats,
+                      uint16_t qidx)
+{
+       qstats->q_tx_bytes =
+               nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_STATUS0, qidx);
+       qstats->q_tx_packets =
+               nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_STATUS1, qidx);
+}
index a7ae531..9db1d30 100644 (file)
 
 #define NICVF_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
 
+#define NICVF_GET_RX_STATS(reg) \
+       nicvf_reg_read(nic, NIC_VNIC_RX_STAT_0_13 | (reg << 3))
+#define NICVF_GET_TX_STATS(reg) \
+       nicvf_reg_read(nic, NIC_VNIC_TX_STAT_0_4 | (reg << 3))
+
 #define NICVF_PASS1    (PCI_SUB_DEVICE_ID_THUNDERX_PASS1_NICVF)
 #define NICVF_PASS2    (PCI_SUB_DEVICE_ID_THUNDERX_PASS2_NICVF)
 
@@ -82,6 +87,39 @@ enum nicvf_err_e {
 
 typedef nicvf_phys_addr_t (*rbdr_pool_get_handler)(void *opaque);
 
+struct nicvf_hw_rx_qstats {
+       uint64_t q_rx_bytes;
+       uint64_t q_rx_packets;
+};
+
+struct nicvf_hw_tx_qstats {
+       uint64_t q_tx_bytes;
+       uint64_t q_tx_packets;
+};
+
+struct nicvf_hw_stats {
+       uint64_t rx_bytes;
+       uint64_t rx_ucast_frames;
+       uint64_t rx_bcast_frames;
+       uint64_t rx_mcast_frames;
+       uint64_t rx_fcs_errors;
+       uint64_t rx_l2_errors;
+       uint64_t rx_drop_red;
+       uint64_t rx_drop_red_bytes;
+       uint64_t rx_drop_overrun;
+       uint64_t rx_drop_overrun_bytes;
+       uint64_t rx_drop_bcast;
+       uint64_t rx_drop_mcast;
+       uint64_t rx_drop_l3_bcast;
+       uint64_t rx_drop_l3_mcast;
+
+       uint64_t tx_bytes_ok;
+       uint64_t tx_ucast_frames_ok;
+       uint64_t tx_bcast_frames_ok;
+       uint64_t tx_mcast_frames_ok;
+       uint64_t tx_drops;
+};
+
 struct nicvf_rss_reta_info {
        uint8_t hash_bits;
        uint16_t rss_size;
@@ -193,4 +231,10 @@ uint64_t nicvf_rss_get_cfg(struct nicvf *nic);
 
 int nicvf_loopback_config(struct nicvf *nic, bool enable);
 
+void nicvf_hw_get_stats(struct nicvf *nic, struct nicvf_hw_stats *stats);
+void nicvf_hw_get_rx_qstats(struct nicvf *nic,
+                           struct nicvf_hw_rx_qstats *qstats, uint16_t qidx);
+void nicvf_hw_get_tx_qstats(struct nicvf *nic,
+                           struct nicvf_hw_tx_qstats *qstats, uint16_t qidx);
+
 #endif /* _THUNDERX_NICVF_HW_H */