WSL2-Linux-Kernel/drivers/firmware/arm_scmi
Cristian Marussi 614cc65032 firmware: arm_scmi: Check mailbox/SMT channel for consistency
commit 437a310b22244d4e0b78665c3042e5d1c0f45306 upstream.

On reception of a completion interrupt the shared memory area is accessed
to retrieve the message header at first and then, if the message sequence
number identifies a transaction which is still pending, the related
payload is fetched too.

When an SCMI command times out the channel ownership remains with the
platform until eventually a late reply is received and, as a consequence,
any further transmission attempt remains pending, waiting for the channel
to be relinquished by the platform.

Once that late reply is received the channel ownership is given back
to the agent and any pending request is then allowed to proceed and
overwrite the SMT area of the just delivered late reply; then the wait
for the reply to the new request starts.

It has been observed that the spurious IRQ related to the late reply can
be wrongly associated with the freshly enqueued request: when that happens
the SCMI stack in-flight lookup procedure is fooled by the fact that the
message header now present in the SMT area is related to the new pending
transaction, even though the real reply has still to arrive.

This race-condition on the A2P channel can be detected by looking at the
channel status bits: a genuine reply from the platform will have set the
channel free bit before triggering the completion IRQ.

Add a consistency check to validate such condition in the A2P ISR.

Reported-by: Xinglong Yang <xinglong.yang@cixtech.com>
Closes: https://lore.kernel.org/all/PUZPR06MB54981E6FA00D82BFDBB864FBF08DA@PUZPR06MB5498.apcprd06.prod.outlook.com/
Fixes: 5c8a47a5a9 ("firmware: arm_scmi: Make scmi core independent of the transport type")
Cc: stable@vger.kernel.org # 5.15+
Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Tested-by: Xinglong Yang <xinglong.yang@cixtech.com>
Link: https://lore.kernel.org/r/20231220172112.763539-1-cristian.marussi@arm.com
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2024-02-23 08:54:32 +01:00
..
Kconfig firmware: arm_scmi: Fix virtio transport Kconfig dependency 2021-09-20 11:50:57 +01:00
Makefile firmware: arm_scmi: Add virtio transport 2021-08-05 10:24:08 +01:00
base.c firmware: arm_scmi: Fix list protocols enumeration in the base protocol 2022-06-09 10:23:08 +02:00
bus.c firmware: arm_scmi: Cleanup the core driver removal callback 2022-11-26 09:24:31 +01:00
clock.c firmware: arm_scmi: Improve checks in the info_get operations 2022-10-12 09:53:26 +02:00
common.h firmware: arm_scmi: Check mailbox/SMT channel for consistency 2024-02-23 08:54:32 +01:00
driver.c firmware: arm_scmi: Fix xfers allocation on Rx channel 2023-05-11 23:00:23 +09:00
mailbox.c firmware: arm_scmi: Check mailbox/SMT channel for consistency 2024-02-23 08:54:32 +01:00
msg.c firmware: arm_scmi: Add message passing abstractions for transports 2021-08-05 10:23:23 +01:00
notify.c firmware: arm_scmi: Fix kernel doc warnings about return values 2021-07-13 11:39:54 +01:00
notify.h firmware: arm_scmi: Remove duplicate declaration of struct scmi_protocol_handle 2021-04-27 11:57:26 +01:00
perf.c firmware: arm_scmi: Add protocol modularization support 2021-03-30 16:35:16 +01:00
power.c firmware: arm_scmi: Add protocol modularization support 2021-03-30 16:35:16 +01:00
reset.c firmware: arm_scmi: Fix the asynchronous reset requests 2022-09-28 11:11:45 +02:00
scmi_pm_domain.c firmware: arm_scmi: Add SCMI PM driver remove routine 2022-10-12 09:53:27 +02:00
sensors.c firmware: arm_scmi: Harden accesses to the sensor domains 2022-10-12 09:53:27 +02:00
shmem.c firmware: arm_scmi: Check mailbox/SMT channel for consistency 2024-02-23 08:54:32 +01:00
smc.c firmware: arm_scmi: Drop OF node reference in the transport channel setup 2023-08-11 15:13:56 +02:00
system.c firmware: arm_scmi: Add protocol modularization support 2021-03-30 16:35:16 +01:00
virtio.c firmware: arm_scmi: Fix devres allocation device in virtio transport 2022-11-10 18:15:36 +01:00
voltage.c firmware: arm_scmi: Fix type error assignment in voltage protocol 2021-12-01 09:04:56 +01:00