[RFC PATCH 7/7] firmware: arm_scmi: Use new Telemetry traces

Cristian Marussi cristian.marussi at arm.com
Fri Jun 20 12:28:13 PDT 2025


Track failed SHMTI accesses and notification updates.

Signed-off-by: Cristian Marussi <cristian.marussi at arm.com>
---
 drivers/firmware/arm_scmi/telemetry.c | 35 +++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/drivers/firmware/arm_scmi/telemetry.c b/drivers/firmware/arm_scmi/telemetry.c
index 3cbad06251a9..7843ff802bd0 100644
--- a/drivers/firmware/arm_scmi/telemetry.c
+++ b/drivers/firmware/arm_scmi/telemetry.c
@@ -16,6 +16,8 @@
 #include "protocols.h"
 #include "notify.h"
 
+#include <trace/events/scmi.h>
+
 /* Updated only after ALL the mandatory features for that version are merged */
 #define SCMI_PROTOCOL_SUPPORTED_VERSION		0x10000
 
@@ -813,8 +815,10 @@ static int scmi_telemetry_tdcf_parse_one(struct telemetry_info *ti,
 	int used_qwords;
 
 	de = xa_load(&ti->xa_des, le32_to_cpu(payld->id));
-	if (!de || DATA_INVALID(payld))
+	if (!de || DATA_INVALID(payld)) {
+		trace_scmi_tlm_access(de->id, "DE_INVALID", 0, 0);
 		return -EINVAL;
+	}
 
 	used_qwords = 4;
 
@@ -840,6 +844,8 @@ static int scmi_telemetry_tdcf_parse_one(struct telemetry_info *ti,
 	else
 		tde->last_ts = 0;
 
+	trace_scmi_tlm_collect(0, de->id, tde->last_val, "SHMTI_UPDATE");
+
 	return used_qwords;
 }
 
@@ -864,8 +870,10 @@ static int scmi_telemetry_shmti_scan(struct telemetry_info *ti,
 		fsleep((SCMI_TLM_TDCF_MAX_RETRIES - retries) * 1000);
 
 		startm = TDCF_START_SEQ_GET(tdcf);
-		if (IS_BAD_START_SEQ(startm))
+		if (IS_BAD_START_SEQ(startm)) {
+			trace_scmi_tlm_access(0, "MSEQ_BADSTART", startm, 0);
 			continue;
+		}
 
 		qwords = tdcf->prlg.num_qwords;
 		next = tdcf->payld;
@@ -874,14 +882,18 @@ static int scmi_telemetry_shmti_scan(struct telemetry_info *ti,
 
 			used_qwords = scmi_telemetry_tdcf_parse_one(ti, next,
 								    update ? shmti : NULL);
-			if (qwords < used_qwords)
+			if (qwords < used_qwords) {
+				trace_scmi_tlm_access(0, "BAD_QWORDS", 0, 0);
 				return -EINVAL;
+			}
 
 			next += used_qwords * 4;
 			qwords -= used_qwords;
 		}
 
 		endm = TDCF_END_SEQ_GET(eplg);
+		if (startm != endm)
+			trace_scmi_tlm_access(0, "MSEQ_MISMATCH", startm, endm);
 	} while (startm != endm && --retries);
 
 	if (startm != endm)
@@ -1252,12 +1264,17 @@ static int scmi_telemetry_de_tdcf_parse(struct telemetry_de *tde,
 		fsleep((SCMI_TLM_TDCF_MAX_RETRIES - retries) * 1000);
 
 		startm = TDCF_START_SEQ_GET(tdcf);
-		if (IS_BAD_START_SEQ(startm))
+		if (IS_BAD_START_SEQ(startm)) {
+			trace_scmi_tlm_access(tde->de.id, "MSEQ_BADSTART",
+					      startm, 0);
 			continue;
+		}
 
 		payld = tde->base + tde->offset;
-		if (le32_to_cpu(payld->id) != tde->de.id || DATA_INVALID(payld))
+		if (le32_to_cpu(payld->id) != tde->de.id || DATA_INVALID(payld)) {
+			trace_scmi_tlm_access(tde->de.id, "DE_INVALID", 0, 0);
 			return -EINVAL;
+		}
 
 		//TODO BLK_TS
 		if (tstamp && USE_LINE_TS(payld) && TS_VALID(payld))
@@ -1266,6 +1283,9 @@ static int scmi_telemetry_de_tdcf_parse(struct telemetry_de *tde,
 		*val = LINE_DATA_GET(&payld->tsl);
 
 		endm = TDCF_END_SEQ_GET(tde->eplg);
+		if (startm != endm)
+			trace_scmi_tlm_access(tde->de.id, "MSEQ_MISMATCH",
+					      startm, endm);
 	} while (startm != endm && --retries);
 
 	if (startm != endm)
@@ -1412,6 +1432,9 @@ scmi_telemetry_msg_payld_process(struct telemetry_info *ti,
 			tde->last_ts = LINE_TSTAMP_GET(&payld->tsl);
 		else
 			tde->last_ts = 0;
+
+		trace_scmi_tlm_collect(timestamp, tde->de.id, tde->last_val,
+				       "MESSAGE");
 	}
 }
 
@@ -1622,6 +1645,8 @@ static void scmi_telemetry_scan_update(struct telemetry_info *ti, u64 ts)
 			tde->last_ts = tstamp;
 		else
 			tde->last_ts = 0;
+
+		trace_scmi_tlm_collect(ts, de->id, tde->last_val, "FC_UPDATE");
 	}
 }
 
-- 
2.47.0




More information about the linux-arm-kernel mailing list