]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firmware: arm_scmi: Add support for debug metrics at the interface
authorLuke Parkin <luke.parkin@arm.com>
Mon, 5 Aug 2024 13:10:09 +0000 (14:10 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Fri, 9 Aug 2024 13:21:11 +0000 (14:21 +0100)
Since SCMI involves interaction with the entity(software, firmware and/or
hardware) providing services or features, it is quite useful to track
certain metrics(for pure debugging purposes) like how many messages were
sent or received, were there any failures, what kind of failures, ..etc.

Add a new optional config option for the above purpose and the initial
support for counting such key debug metrics.

Signed-off-by: Luke Parkin <luke.parkin@arm.com>
Reviewed-by: Cristian Marussi <cristian.marussi@arm.com>
Tested-by: Cristian Marussi <cristian.marussi@arm.com>
Message-Id: <20240805131013.587016-3-sudeep.holla@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/Kconfig
drivers/firmware/arm_scmi/common.h
drivers/firmware/arm_scmi/driver.c

index aa5842be19b2d12aa65862dcefaabee731c1ae2b..f35784d0a8dddfffd1ba4d461cbe1b00cd33e6f3 100644 (file)
@@ -55,6 +55,20 @@ config ARM_SCMI_RAW_MODE_SUPPORT_COEX
          operate normally, thing which could make an SCMI test suite using the
          SCMI Raw mode support unreliable. If unsure, say N.
 
+config ARM_SCMI_DEBUG_COUNTERS
+       bool "Enable SCMI communication debug metrics tracking"
+       select ARM_SCMI_NEED_DEBUGFS
+       depends on DEBUG_FS
+       default n
+       help
+         Enables tracking of some key communication metrics for debug
+         purposes. It may track metrics like how many messages were sent
+         or received, were there any failures, what kind of failures, ..etc.
+
+         Enable this option to create a new debugfs directory which contains
+         such useful debug counters. This can be helpful for debugging and
+         SCMI monitoring.
+
 config ARM_SCMI_HAVE_TRANSPORT
        bool
        help
index 4b8c5250cdb57eb7f67169a01ad6ced3287e82c3..d414b0a43b3bda71be268212435779218072d276 100644 (file)
@@ -301,6 +301,16 @@ extern const struct scmi_desc scmi_optee_desc;
 
 void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, void *priv);
 
+enum debug_counters {
+       SCMI_DEBUG_COUNTERS_LAST
+};
+
+static inline void scmi_inc_count(atomic_t *arr, int stat)
+{
+       if (IS_ENABLED(CONFIG_ARM_SCMI_DEBUG_COUNTERS))
+               atomic_inc(&arr[stat]);
+}
+
 enum scmi_bad_msg {
        MSG_UNEXPECTED = -1,
        MSG_INVALID = -2,
index 56a93d20bf23486ec9b2876fcca8e3f8591ebf5c..958b2ac92050b7ceaafd5398a0db8e70aa5700f8 100644 (file)
@@ -117,12 +117,14 @@ struct scmi_protocol_instance {
  * @name: Name of this SCMI instance
  * @type: Type of this SCMI instance
  * @is_atomic: Flag to state if the transport of this instance is atomic
+ * @counters: An array of atomic_c's used for tracking statistics (if enabled)
  */
 struct scmi_debug_info {
        struct dentry *top_dentry;
        const char *name;
        const char *type;
        bool is_atomic;
+       atomic_t counters[SCMI_DEBUG_COUNTERS_LAST];
 };
 
 /**