linux/drivers/mailbox
Sudeep Holla 8b7b088925 mailbox: pcc: Always clear the platform ack interrupt first
[ Upstream commit cf1338c0e0 ]

The PCC mailbox interrupt handler (pcc_mbox_irq()) currently checks
for command completion flags and any error status before clearing the
interrupt.

The below sequence highlights an issue in the handling of PCC mailbox
interrupts, specifically when dealing with doorbell notifications and
acknowledgment between the OSPM and the platform where type3 and type4
channels are sharing the interrupt.

-------------------------------------------------------------------------
| T |       Platform Firmware         |    OSPM/Linux PCC driver        |
|---|---------------------------------|---------------------------------|
| 1 |                                 | Build message in shmem          |
| 2 |                                 | Ring Type3 chan doorbell        |
| 3 | Receives the doorbell interrupt |                                 |
| 4 | Process the message from OSPM   |                                 |
| 5 | Build response for the message  |                                 |
| 6 | Ring Platform ACK interrupt on  |                                 |
|   |  Type3 chan to OSPM             | Received the interrupt          |
| 7 | Build Notification in Type4 Chan|                                 |
| 8 |                                 | Start processing interrupt in   |
|   |                                 |  pcc_mbox_irq() handler         |
| 9 |                                 | Enter PCC handler for Type4 chan|
|10 |                                 | Check command complete cleared  |
|11 |                                 | Read the notification           |
|12 |                                 | Clear Platform ACK interrupt    |
|   | No effect from the previous step yet as the Platform ACK          |
|   |  interrupt has not yet been triggered for this channel            |
|13 | Ring Platform ACK interrupt on  |                                 |
|   | Type4 chan to OSPM              |                                 |
|14 |                                 | Enter PCC handler for Type3 chan|
|15 |                                 | Command complete is set.        |
|16 |                                 | Read the response.              |
|17 |                                 | Clear Platform ACK interrupt    |
|18 |                                 | Leave PCC handler for Type3     |
|19 |                                 | Leave pcc_mbox_irq() handler    |
|20 |                                 | Re-enter pcc_mbox_irq() handler |
|21 |                                 | Enter PCC handler for Type4 chan|
|22 |                                 | Leave PCC handler for Type4 chan|
|23 |                                 | Enter PCC handler for Type3 chan|
|24 |                                 | Leave PCC handler for Type3 chan|
|25 |                                 | Leave pcc_mbox_irq() handler    |
-------------------------------------------------------------------------

The key issue occurs when OSPM tries to acknowledge platform ack
interrupt for a notification which is ready to be read and processed
but the interrupt itself is not yet triggered by the platform.

This ineffective acknowledgment leads to an issue later in time where
the interrupt remains pending as we exit the interrupt handler without
clearing the platform ack interrupt as there is no pending response or
notification. The interrupt acknowledgment order is incorrect.

To resolve this issue, the platform acknowledgment interrupt should
always be cleared before processing the interrupt for any notifications
or response.

Reported-by: Robbie King <robbiek@xsightlabs.com>
Reviewed-by: Huisong Li <lihuisong@huawei.com>
Tested-by: Huisong Li <lihuisong@huawei.com>
Tested-by: Adam Young <admiyo@os.amperecomputing.com>
Tested-by: Robbie King <robbiek@xsightlabs.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Jassi Brar <jassisinghbrar@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-05-02 07:59:16 +02:00
..
arm_mhu.c mailbox: Explicitly include correct DT includes 2023-09-05 10:10:58 -05:00
arm_mhu_db.c mailbox: Explicitly include correct DT includes 2023-09-05 10:10:58 -05:00
arm_mhuv2.c mailbox: arm_mhuv2: clean up loop in get_irq_chan_comb() 2024-12-05 14:02:17 +01:00
arm_mhuv3.c mailbox: arm_mhuv3: Add driver 2024-05-19 22:30:09 -05:00
armada-37xx-rwtm-mailbox.c treewide: change my e-mail address, fix my name 2021-04-09 14:54:23 -07:00
bcm-flexrm-mailbox.c irqchip: Convert all platform MSI users to the new API 2024-02-15 17:55:40 +01:00
bcm-pdc-mailbox.c mailbox: bcm-pdc: remove unused struct 'pdc_dma_map' 2024-07-10 13:24:55 -05:00
bcm2835-mailbox.c mailbox: bcm2835: Fix timeout during suspend mode 2024-09-22 19:19:17 -05:00
hi3660-mailbox.c mailbox: Explicitly include correct DT includes 2023-09-05 10:10:58 -05:00
hi6220-mailbox.c mailbox: Explicitly include correct DT includes 2023-09-05 10:10:58 -05:00
imx-mailbox.c mailbox: imx: use device name in interrupt name 2024-09-22 19:19:17 -05:00
Kconfig mailbox, remoteproc: omap2+: fix compile testing 2024-09-27 09:11:05 -05:00
mailbox-altera.c mailbox: altera: Make use of the helper function devm_platform_ioremap_resource() 2021-10-16 14:39:48 -05:00
mailbox-mpfs.c mailbox: Explicitly include correct DT includes 2023-09-05 10:10:58 -05:00
mailbox-sti.c mailbox: Use device_get_match_data() 2023-10-15 12:39:16 -05:00
mailbox-test.c mailbox: mailbox-test: Convert to platform remove callback returning void 2024-01-13 23:08:51 -06:00
mailbox-xgene-slimpro.c mailbox: xgene-slimpro: Make use of the helper function devm_platform_ioremap_resource() 2021-10-16 14:39:49 -05:00
mailbox.c mailbox: Use of_property_match_string() instead of open-coding 2024-09-22 19:19:17 -05:00
mailbox.h mailbox: fix various typos in comments 2021-04-13 20:07:35 -05:00
Makefile mailbox: Add support for QTI CPUCP mailbox controller 2024-07-10 13:24:55 -05:00
mtk-adsp-mailbox.c mailbox: Explicitly include correct DT includes 2023-09-05 10:10:58 -05:00
mtk-cmdq-mailbox.c mailbox: mtk-cmdq: fix wrong use of sizeof in cmdq_get_clocks() 2024-12-05 14:02:17 +01:00
omap-mailbox.c kfifo: don't include dma-mapping.h in kfifo.h 2024-12-05 14:03:03 +01:00
pcc.c mailbox: pcc: Always clear the platform ack interrupt first 2025-05-02 07:59:16 +02:00
pl320-ipc.c mailbox: fix various typos in comments 2021-04-13 20:07:35 -05:00
platform_mhu.c mailbox: Explicitly include correct DT includes 2023-09-05 10:10:58 -05:00
qcom-apcs-ipc-mailbox.c mailbox: qcom-apcs-ipc: Convert to platform remove callback returning void 2024-01-13 23:08:51 -06:00
qcom-cpucp-mbox.c mailbox: qcom-cpucp: Mark the irq with IRQF_NO_SUSPEND flag 2024-11-12 19:45:25 +01:00
qcom-ipcc.c mailbox: qcom-ipcc: Convert to platform remove callback returning void 2024-01-13 23:08:51 -06:00
rockchip-mailbox.c mailbox: rockchip: fix a typo in module autoloading 2024-09-22 19:19:17 -05:00
sprd-mailbox.c mailbox: sprd: Use devm_clk_get_enabled() helpers 2024-09-22 19:19:17 -05:00
stm32-ipcc.c mailbox: stm32-ipcc: Convert to platform remove callback returning void 2024-01-13 23:08:51 -06:00
sun6i-msgbox.c mailbox: sun6i-msgbox: Convert to platform remove callback returning void 2024-01-13 23:08:51 -06:00
tegra-hsp.c mailbox: tegra-hsp: Define dimensioning masks in SoC data 2025-04-20 10:15:45 +02:00
ti-msgmgr.c mailbox: Use device_get_match_data() 2023-10-15 12:39:16 -05:00
zynqmp-ipi-mailbox.c mailbox: zynqmp: Remove invalid __percpu annotation in zynqmp_ipi_probe() 2025-02-17 10:05:40 +01:00