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:
parent
da251ce210
commit
5dc0e0b1f0
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user