diff mbox series

[net-next] net: ti: icssg-prueth: Add ICSSG FW Stats

Message ID 20250227093712.2130561-1-danishanwar@ti.com (mailing list archive)
State New
Headers show
Series [net-next] net: ti: icssg-prueth: Add ICSSG FW Stats | expand

Commit Message

MD Danish Anwar Feb. 27, 2025, 9:37 a.m. UTC
The ICSSG firmware maintains set of stats called PA_STATS.
Currently the driver only dumps 4 stats. Add support for dumping more
stats.

The offset for different stats are defined as MACROs in icssg_switch_map.h
file. All the offsets are for Slice0. Slice1 offsets are slice0 + 4.
The offset calculation is taken care while reading the stats in
emac_update_hardware_stats().

Signed-off-by: MD Danish Anwar <danishanwar@ti.com>
---
 drivers/net/ethernet/ti/icssg/icssg_prueth.h  |   2 +-
 drivers/net/ethernet/ti/icssg/icssg_stats.c   |   6 +-
 drivers/net/ethernet/ti/icssg/icssg_stats.h   |  63 +++++++----
 .../net/ethernet/ti/icssg/icssg_switch_map.h  | 105 ++++++++++++++++++
 4 files changed, 149 insertions(+), 27 deletions(-)


base-commit: 0493f7a54e5bcf490f943f7b25ec6e1051832f98
diff mbox series

Patch

diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/ethernet/ti/icssg/icssg_prueth.h
index 329b46e9ee53..569d3d53db59 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h
+++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h
@@ -50,7 +50,7 @@ 
 
 #define ICSSG_MAX_RFLOWS	8	/* per slice */
 
-#define ICSSG_NUM_PA_STATS	4
+#define ICSSG_NUM_PA_STATS	37
 #define ICSSG_NUM_MIIG_STATS	60
 /* Number of ICSSG related stats */
 #define ICSSG_NUM_STATS (ICSSG_NUM_MIIG_STATS + ICSSG_NUM_PA_STATS)
diff --git a/drivers/net/ethernet/ti/icssg/icssg_stats.c b/drivers/net/ethernet/ti/icssg/icssg_stats.c
index 8800bd3a8d07..3f1400e0207c 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_stats.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_stats.c
@@ -11,7 +11,6 @@ 
 
 #define ICSSG_TX_PACKET_OFFSET	0xA0
 #define ICSSG_TX_BYTE_OFFSET	0xEC
-#define ICSSG_FW_STATS_BASE	0x0248
 
 static u32 stats_base[] = {	0x54c,	/* Slice 0 stats start */
 				0xb18,	/* Slice 1 stats start */
@@ -44,9 +43,8 @@  void emac_update_hardware_stats(struct prueth_emac *emac)
 
 	if (prueth->pa_stats) {
 		for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++) {
-			reg = ICSSG_FW_STATS_BASE +
-			      icssg_all_pa_stats[i].offset *
-			      PRUETH_NUM_MACS + slice * sizeof(u32);
+			reg = icssg_all_pa_stats[i].offset +
+			      slice * sizeof(u32);
 			regmap_read(prueth->pa_stats, reg, &val);
 			emac->pa_stats[i] += val;
 		}
diff --git a/drivers/net/ethernet/ti/icssg/icssg_stats.h b/drivers/net/ethernet/ti/icssg/icssg_stats.h
index e88b919f532c..8d0fe42a5a41 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_stats.h
+++ b/drivers/net/ethernet/ti/icssg/icssg_stats.h
@@ -155,24 +155,10 @@  static const struct icssg_miig_stats icssg_all_miig_stats[] = {
 	ICSSG_MIIG_STATS(tx_bytes, true),
 };
 
-/**
- * struct pa_stats_regs - ICSSG Firmware maintained PA Stats register
- * @fw_rx_cnt: Number of valid packets sent by Rx PRU to Host on PSI
- * @fw_tx_cnt: Number of valid packets copied by RTU0 to Tx queues
- * @fw_tx_pre_overflow: Host Egress Q (Pre-emptible) Overflow Counter
- * @fw_tx_exp_overflow: Host Egress Q (Express) Overflow Counter
- */
-struct pa_stats_regs {
-	u32 fw_rx_cnt;
-	u32 fw_tx_cnt;
-	u32 fw_tx_pre_overflow;
-	u32 fw_tx_exp_overflow;
-};
-
-#define ICSSG_PA_STATS(field)			\
-{						\
-	#field,					\
-	offsetof(struct pa_stats_regs, field),	\
+#define ICSSG_PA_STATS(field)	\
+{				\
+	#field,			\
+	field,			\
 }
 
 struct icssg_pa_stats {
@@ -181,10 +167,43 @@  struct icssg_pa_stats {
 };
 
 static const struct icssg_pa_stats icssg_all_pa_stats[] = {
-	ICSSG_PA_STATS(fw_rx_cnt),
-	ICSSG_PA_STATS(fw_tx_cnt),
-	ICSSG_PA_STATS(fw_tx_pre_overflow),
-	ICSSG_PA_STATS(fw_tx_exp_overflow),
+	ICSSG_PA_STATS(FW_RTU_PKT_DROP),
+	ICSSG_PA_STATS(FW_Q0_OVERFLOW),
+	ICSSG_PA_STATS(FW_Q1_OVERFLOW),
+	ICSSG_PA_STATS(FW_Q2_OVERFLOW),
+	ICSSG_PA_STATS(FW_Q3_OVERFLOW),
+	ICSSG_PA_STATS(FW_Q4_OVERFLOW),
+	ICSSG_PA_STATS(FW_Q5_OVERFLOW),
+	ICSSG_PA_STATS(FW_Q6_OVERFLOW),
+	ICSSG_PA_STATS(FW_Q7_OVERFLOW),
+	ICSSG_PA_STATS(FW_DROPPED_PKT),
+	ICSSG_PA_STATS(FW_RX_ERROR),
+	ICSSG_PA_STATS(FW_RX_DS_INVALID),
+	ICSSG_PA_STATS(FW_TX_DROPPED_PACKET),
+	ICSSG_PA_STATS(FW_TX_TS_DROPPED_PACKET),
+	ICSSG_PA_STATS(FW_INF_PORT_DISABLED),
+	ICSSG_PA_STATS(FW_INF_SAV),
+	ICSSG_PA_STATS(FW_INF_SA_BL),
+	ICSSG_PA_STATS(FW_INF_PORT_BLOCKED),
+	ICSSG_PA_STATS(FW_INF_DROP_TAGGED),
+	ICSSG_PA_STATS(FW_INF_DROP_PRIOTAGGED),
+	ICSSG_PA_STATS(FW_INF_DROP_NOTAG),
+	ICSSG_PA_STATS(FW_INF_DROP_NOTMEMBER),
+	ICSSG_PA_STATS(FW_PREEMPT_BAD_FRAG),
+	ICSSG_PA_STATS(FW_PREEMPT_ASSEMBLY_ERR),
+	ICSSG_PA_STATS(FW_PREEMPT_FRAG_CNT_TX),
+	ICSSG_PA_STATS(FW_PREEMPT_ASSEMBLY_OK),
+	ICSSG_PA_STATS(FW_PREEMPT_FRAG_CNT_RX),
+	ICSSG_PA_STATS(FW_RX_EOF_SHORT_FRMERR),
+	ICSSG_PA_STATS(FW_RX_B0_DROP_EARLY_EOF),
+	ICSSG_PA_STATS(FW_TX_JUMBO_FRM_CUTOFF),
+	ICSSG_PA_STATS(FW_RX_EXP_FRAG_Q_DROP),
+	ICSSG_PA_STATS(FW_RX_FIFO_OVERRUN),
+	ICSSG_PA_STATS(FW_CUT_THR_PKT),
+	ICSSG_PA_STATS(FW_HOST_RX_PKT_CNT),
+	ICSSG_PA_STATS(FW_HOST_TX_PKT_CNT),
+	ICSSG_PA_STATS(FW_HOST_EGRESS_Q_PRE_OVERFLOW),
+	ICSSG_PA_STATS(FW_HOST_EGRESS_Q_EXP_OVERFLOW),
 };
 
 #endif /* __NET_TI_ICSSG_STATS_H */
diff --git a/drivers/net/ethernet/ti/icssg/icssg_switch_map.h b/drivers/net/ethernet/ti/icssg/icssg_switch_map.h
index 424a7e945ea8..d30203a0978c 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_switch_map.h
+++ b/drivers/net/ethernet/ti/icssg/icssg_switch_map.h
@@ -231,4 +231,109 @@ 
 /* Start of 32 bits PA_STAT counters */
 #define PA_STAT_32b_START_OFFSET                           0x0080
 
+/* Diagnostic error counter which increments when RTU drops a locally injected
+ * packet due to port disabled or rule violation.
+ */
+#define FW_RTU_PKT_DROP		0x0088
+
+/* Tx Queue Overflow Counters */
+#define FW_Q0_OVERFLOW		0x0090
+#define FW_Q1_OVERFLOW		0x0098
+#define FW_Q2_OVERFLOW		0x00A0
+#define FW_Q3_OVERFLOW		0x00A8
+#define FW_Q4_OVERFLOW		0x00B0
+#define FW_Q5_OVERFLOW		0x00B8
+#define FW_Q6_OVERFLOW		0x00C0
+#define FW_Q7_OVERFLOW		0x00C8
+
+/* Incremented if a packet is dropped at PRU because of a rule violation */
+#define FW_DROPPED_PKT		0x00F8
+
+/* Incremented if there was a CRC error or Min/Max frame error at PRU0 */
+#define FW_RX_ERROR		0x0100
+
+/* Incremented when RTU detects Data Status invalid condition */
+#define FW_RX_DS_INVALID	0x0108
+
+/* Counter for packets dropped via TX Port */
+#define FW_TX_DROPPED_PACKET	0x0110
+
+/* Counter for packets with TS flag dropped via TX Port */
+#define FW_TX_TS_DROPPED_PACKET	0x0118
+
+/* Incremented when RX frame is dropped due to port being disabled */
+#define FW_INF_PORT_DISABLED	0x0120
+
+/* Incremented when RX frame is dropped due to Source Address violation */
+#define FW_INF_SAV		0x0128
+
+/* Incremented when RX frame is dropped due to Source Address being black
+ * listed
+ */
+#define FW_INF_SA_BL		0x0130
+
+/* Incremented when RX frame is dropped due to port being blocked and frame
+ * is being a special frame
+ */
+#define FW_INF_PORT_BLOCKED	0x0138
+
+/* Incremented when RX frame is dropped for being tagged */
+#define FW_INF_DROP_TAGGED	0x0140
+
+/* Incremented when RX frame is dropped for being priority tagged */
+#define FW_INF_DROP_PRIOTAGGED	0x0148
+
+/* Incremented when RX frame is dropped for being untagged */
+#define FW_INF_DROP_NOTAG	0x0150
+
+/* Incremented when RX frame is dropped for port not being member of VLAN */
+#define FW_INF_DROP_NOTMEMBER	0x0158
+
+/* Bad fragment Error Counter */
+#define FW_PREEMPT_BAD_FRAG	0x0160
+
+/* Fragment assembly Error Counter */
+#define FW_PREEMPT_ASSEMBLY_ERR	0x0168
+
+/* Fragment count in TX */
+#define FW_PREEMPT_FRAG_CNT_TX	0x0170
+
+/* Assembly Completed */
+#define FW_PREEMPT_ASSEMBLY_OK	0x0178
+
+/* Fragments received */
+#define FW_PREEMPT_FRAG_CNT_RX	0x0180
+
+/* Incremented if EOF task is scheduled without seeing RX_B1 */
+#define FW_RX_EOF_SHORT_FRMERR	0x0188
+
+/* Incremented when frame is dropped due to Early EOF received in B0 */
+#define FW_RX_B0_DROP_EARLY_EOF	0x0190
+
+/* Incremented when frame is cut off to prevent packet size > 2000B */
+#define FW_TX_JUMBO_FRM_CUTOFF	0x0198
+
+/* Incremented when express frame is received in the same queue as the previous
+ * fragment
+ */
+#define FW_RX_EXP_FRAG_Q_DROP	0x01A0
+
+/* RX fifo overrun counter */
+#define FW_RX_FIFO_OVERRUN	0x01A8
+
+/* Cut-through packet Counter */
+#define FW_CUT_THR_PKT		0x01B0
+
+/* Number of valid packets sent by Rx PRU to Host on PSI */
+#define FW_HOST_RX_PKT_CNT	0x0248
+
+/* Number of valid packets copied by RTU0 to Tx queues */
+#define FW_HOST_TX_PKT_CNT	0x0250
+
+/* Host Egress Q (Pre-emptible) Overflow Counter */
+#define FW_HOST_EGRESS_Q_PRE_OVERFLOW 0x0258
+
+/* Host Egress Q (Pre-emptible) Overflow Counter */
+#define FW_HOST_EGRESS_Q_EXP_OVERFLOW 0x0260
+
 #endif /* __NET_TI_ICSSG_SWITCH_MAP_H  */