firmware: arm_scmi: Add message dump traces for bad and unexpected replies
authorCristian Marussi <cristian.marussi@arm.com>
Mon, 25 Mar 2024 20:46:18 +0000 (20:46 +0000)
committerSudeep Holla <sudeep.holla@arm.com>
Tue, 26 Mar 2024 11:32:01 +0000 (11:32 +0000)
It is useful to have message dump traces for any invalid/bad/unexpected
replies. Let us add traces for the same as well as late-timed-out,
out-of-order and unexpected/spurious messages.

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

index 7fc1c5b1a2a44f1d595127b58b2da4024f919b03..207ed1a52d690f759bd60ecc1bd2d071eeb0d69b 100644 (file)
@@ -861,6 +861,9 @@ scmi_xfer_command_acquire(struct scmi_chan_info *cinfo, u32 msg_hdr)
                        "Message for %d type %d is not expected!\n",
                        xfer_id, msg_type);
                spin_unlock_irqrestore(&minfo->xfer_lock, flags);
+
+               scmi_bad_message_trace(cinfo, msg_hdr, MSG_UNEXPECTED);
+
                return xfer;
        }
        refcount_inc(&xfer->users);
@@ -885,6 +888,9 @@ scmi_xfer_command_acquire(struct scmi_chan_info *cinfo, u32 msg_hdr)
                dev_err(cinfo->dev,
                        "Invalid message type:%d for %d - HDR:0x%X  state:%d\n",
                        msg_type, xfer_id, msg_hdr, xfer->state);
+
+               scmi_bad_message_trace(cinfo, msg_hdr, MSG_INVALID);
+
                /* On error the refcount incremented above has to be dropped */
                __scmi_xfer_put(minfo, xfer);
                xfer = ERR_PTR(-EINVAL);
@@ -921,6 +927,9 @@ static void scmi_handle_notification(struct scmi_chan_info *cinfo,
        if (IS_ERR(xfer)) {
                dev_err(dev, "failed to get free message slot (%ld)\n",
                        PTR_ERR(xfer));
+
+               scmi_bad_message_trace(cinfo, msg_hdr, MSG_NOMEM);
+
                scmi_clear_channel(info, cinfo);
                return;
        }
@@ -1040,6 +1049,7 @@ void scmi_rx_callback(struct scmi_chan_info *cinfo, u32 msg_hdr, void *priv)
                break;
        default:
                WARN_ONCE(1, "received unknown msg_type:%d\n", msg_type);
+               scmi_bad_message_trace(cinfo, msg_hdr, MSG_UNKNOWN);
                break;
        }
 }
index b8d470417e8f99bb6408aba541bc4b89541ddf7c..615a3b2ad83d03c3ff8500d2544ab64d571ffcbf 100644 (file)
@@ -56,6 +56,9 @@ static void rx_callback(struct mbox_client *cl, void *m)
         */
        if (cl->knows_txdone && !shmem_channel_free(smbox->shmem)) {
                dev_warn(smbox->cinfo->dev, "Ignoring spurious A2P IRQ !\n");
+               scmi_bad_message_trace(smbox->cinfo,
+                                      shmem_read_header(smbox->shmem),
+                                      MSG_MBOX_SPURIOUS);
                return;
        }