firmware: arm_scmi: Add helper to trace bad messages
authorCristian Marussi <cristian.marussi@arm.com>
Mon, 25 Mar 2024 20:46:17 +0000 (20:46 +0000)
committerSudeep Holla <sudeep.holla@arm.com>
Tue, 26 Mar 2024 11:19:38 +0000 (11:19 +0000)
Upon reception of malformed and unexpected timed-out SCMI messages, it is
not possible to trace those bad messages in their entirety, because usually
we cannot even retrieve the payload, or it is just not reliable.

Add a helper to trace at least the content of the header of the received
message while associating a meaningful tag and error code.

Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Link: https://lore.kernel.org/r/20240325204620.1437237-3-cristian.marussi@arm.com
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/common.h
drivers/firmware/arm_scmi/driver.c

index 6affbfdd1dec1aeedb82dc53adbef3d182e33d02..b5ac25dbc1cac34e76afda986c2591f6f0c4054d 100644 (file)
@@ -301,6 +301,17 @@ extern const struct scmi_desc scmi_optee_desc;
 
 void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, void *priv);
 
+enum scmi_bad_msg {
+       MSG_UNEXPECTED = -1,
+       MSG_INVALID = -2,
+       MSG_UNKNOWN = -3,
+       MSG_NOMEM = -4,
+       MSG_MBOX_SPURIOUS = -5,
+};
+
+void scmi_bad_message_trace(struct scmi_chan_info *cinfo, u32 msg_hdr,
+                           enum scmi_bad_msg err);
+
 /* shmem related declarations */
 struct scmi_shared_mem;
 
index 2709598f3008908ecc7d377508bb99eedbb6f1b6..7fc1c5b1a2a44f1d595127b58b2da4024f919b03 100644 (file)
@@ -696,6 +696,45 @@ scmi_xfer_lookup_unlocked(struct scmi_xfers_info *minfo, u16 xfer_id)
        return xfer ?: ERR_PTR(-EINVAL);
 }
 
+/**
+ * scmi_bad_message_trace  - A helper to trace weird messages
+ *
+ * @cinfo: A reference to the channel descriptor on which the message was
+ *        received
+ * @msg_hdr: Message header to track
+ * @err: A specific error code used as a status value in traces.
+ *
+ * This helper can be used to trace any kind of weird, incomplete, unexpected,
+ * timed-out message that arrives and as such, can be traced only referring to
+ * the header content, since the payload is missing/unreliable.
+ */
+void scmi_bad_message_trace(struct scmi_chan_info *cinfo, u32 msg_hdr,
+                           enum scmi_bad_msg err)
+{
+       char *tag;
+       struct scmi_info *info = handle_to_scmi_info(cinfo->handle);
+
+       switch (MSG_XTRACT_TYPE(msg_hdr)) {
+       case MSG_TYPE_COMMAND:
+               tag = "!RESP";
+               break;
+       case MSG_TYPE_DELAYED_RESP:
+               tag = "!DLYD";
+               break;
+       case MSG_TYPE_NOTIFICATION:
+               tag = "!NOTI";
+               break;
+       default:
+               tag = "!UNKN";
+               break;
+       }
+
+       trace_scmi_msg_dump(info->id, cinfo->id,
+                           MSG_XTRACT_PROT_ID(msg_hdr),
+                           MSG_XTRACT_ID(msg_hdr), tag,
+                           MSG_XTRACT_TOKEN(msg_hdr), err, NULL, 0);
+}
+
 /**
  * scmi_msg_response_validate  - Validate message type against state of related
  * xfer