]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 22 May 2025 12:12:13 +0000 (14:12 +0200)
[ Upstream commit 5076ab66db1671a5cd9ecfb857d1949e36a33142 ]

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>
Stable-dep-of: c23c03bf1faa ("firmware: arm_scmi: Fix timeout checks on polling path")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/firmware/arm_scmi/driver.c
drivers/firmware/arm_scmi/mailbox.c

index b3c2a199b2afb5804f64e64cbe9539a41d4f8f8e..f66a16d3671f197b58ab5b8949b8dd0a97b46244 100644 (file)
@@ -852,6 +852,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);
@@ -876,6 +879,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);
@@ -917,6 +923,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;
        }
@@ -1036,6 +1045,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 8e513f70b75d4c5218cb3fa825f599fc6fe3a4c1..f1d5e3fba35e076f687a09530f39db06be4d4d53 100644 (file)
@@ -58,6 +58,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;
        }