Skip to content

Commit 5dc0e0b

Browse files
cris-masudeep-holla
authored andcommitted
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sudeep Holla <[email protected]>
1 parent da251ce commit 5dc0e0b

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

drivers/firmware/arm_scmi/common.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,17 @@ extern const struct scmi_desc scmi_optee_desc;
301301

302302
void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, void *priv);
303303

304+
enum scmi_bad_msg {
305+
MSG_UNEXPECTED = -1,
306+
MSG_INVALID = -2,
307+
MSG_UNKNOWN = -3,
308+
MSG_NOMEM = -4,
309+
MSG_MBOX_SPURIOUS = -5,
310+
};
311+
312+
void scmi_bad_message_trace(struct scmi_chan_info *cinfo, u32 msg_hdr,
313+
enum scmi_bad_msg err);
314+
304315
/* shmem related declarations */
305316
struct scmi_shared_mem;
306317

drivers/firmware/arm_scmi/driver.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,45 @@ scmi_xfer_lookup_unlocked(struct scmi_xfers_info *minfo, u16 xfer_id)
696696
return xfer ?: ERR_PTR(-EINVAL);
697697
}
698698

699+
/**
700+
* scmi_bad_message_trace - A helper to trace weird messages
701+
*
702+
* @cinfo: A reference to the channel descriptor on which the message was
703+
* received
704+
* @msg_hdr: Message header to track
705+
* @err: A specific error code used as a status value in traces.
706+
*
707+
* This helper can be used to trace any kind of weird, incomplete, unexpected,
708+
* timed-out message that arrives and as such, can be traced only referring to
709+
* the header content, since the payload is missing/unreliable.
710+
*/
711+
void scmi_bad_message_trace(struct scmi_chan_info *cinfo, u32 msg_hdr,
712+
enum scmi_bad_msg err)
713+
{
714+
char *tag;
715+
struct scmi_info *info = handle_to_scmi_info(cinfo->handle);
716+
717+
switch (MSG_XTRACT_TYPE(msg_hdr)) {
718+
case MSG_TYPE_COMMAND:
719+
tag = "!RESP";
720+
break;
721+
case MSG_TYPE_DELAYED_RESP:
722+
tag = "!DLYD";
723+
break;
724+
case MSG_TYPE_NOTIFICATION:
725+
tag = "!NOTI";
726+
break;
727+
default:
728+
tag = "!UNKN";
729+
break;
730+
}
731+
732+
trace_scmi_msg_dump(info->id, cinfo->id,
733+
MSG_XTRACT_PROT_ID(msg_hdr),
734+
MSG_XTRACT_ID(msg_hdr), tag,
735+
MSG_XTRACT_TOKEN(msg_hdr), err, NULL, 0);
736+
}
737+
699738
/**
700739
* scmi_msg_response_validate - Validate message type against state of related
701740
* xfer

0 commit comments

Comments
 (0)