1

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: 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>
This commit is contained in:
Cristian Marussi 2024-03-25 20:46:17 +00:00 committed by Sudeep Holla
parent da251ce210
commit 5dc0e0b1f0
2 changed files with 50 additions and 0 deletions

View 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;

View 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