Commit 5dc0e0b1 authored by Cristian Marussi's avatar Cristian Marussi Committed by Sudeep Holla

firmware: arm_scmi: Add helper to trace bad messages

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: default avatarCristian Marussi <cristian.marussi@arm.com>
Link: https://lore.kernel.org/r/20240325204620.1437237-3-cristian.marussi@arm.comSigned-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
parent da251ce2
...@@ -301,6 +301,17 @@ extern const struct scmi_desc scmi_optee_desc; ...@@ -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); 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 */ /* shmem related declarations */
struct scmi_shared_mem; struct scmi_shared_mem;
......
...@@ -696,6 +696,45 @@ scmi_xfer_lookup_unlocked(struct scmi_xfers_info *minfo, u16 xfer_id) ...@@ -696,6 +696,45 @@ scmi_xfer_lookup_unlocked(struct scmi_xfers_info *minfo, u16 xfer_id)
return xfer ?: ERR_PTR(-EINVAL); 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 * scmi_msg_response_validate - Validate message type against state of related
* xfer * xfer
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment