blob: be6bde6f8a6fff861b8d084818ad7116f5939571 [file] [log] [blame]
From b70dd14eed59d7c5833ded8469cf99e631951e14 Mon Sep 17 00:00:00 2001
From: Emekcan Aras <emekcan.aras@arm.com>
Date: Wed, 15 Nov 2023 09:52:19 +0000
Subject: [PATCH] platform: corstone1000: fix synchronization issue on openamp
notification
This fixes a race that is observed rarely in the FVP. It occurs in FVP
when tfm sends the notication ack in openamp, and then reset the access
request which resets the mhu registers before received by the host
processor. This solution introduces polling on the status register of
mhu until the notificaiton is read by the host processor. (Inspired by
signal_and_wait_for_signal function in mhu_wrapper_v2_x.c in trusted-firmware-m
https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git/tree/platform/ext/target/arm/rss/common/native_drivers/mhu_wrapper_v2_x.c#n61)
Signed-off-by: Emekcan Aras <emekcan.aras@arm.com>
Upstream-Status: Pending [Not submitted to upstream yet]
---
.../corstone1000/openamp/platform_spe_dual_core_hal.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/platform/ext/target/arm/corstone1000/openamp/platform_spe_dual_core_hal.c b/platform/ext/target/arm/corstone1000/openamp/platform_spe_dual_core_hal.c
index 7613345ffc..b58088032f 100644
--- a/platform/ext/target/arm/corstone1000/openamp/platform_spe_dual_core_hal.c
+++ b/platform/ext/target/arm/corstone1000/openamp/platform_spe_dual_core_hal.c
@@ -83,7 +83,7 @@ enum tfm_plat_err_t tfm_dual_core_hal_init(void)
enum tfm_plat_err_t tfm_hal_notify_peer(void)
{
- uint32_t access_ready;
+ uint32_t access_ready,val;
enum mhu_v2_x_error_t status;
struct mhu_v2_x_dev_t* dev = &MHU1_SE_TO_HOST_DEV;
@@ -108,6 +108,13 @@ enum tfm_plat_err_t tfm_hal_notify_peer(void)
return TFM_PLAT_ERR_SYSTEM_ERR;
}
+ do {
+ status = mhu_v2_x_channel_poll(dev, MHU1_SEH_NOTIFY_CH, &val);
+ if (status != MHU_V_2_X_ERR_NONE) {
+ break;
+ }
+ } while(val != 0);
+
status = mhu_v2_x_reset_access_request(dev);
if (status != MHU_V_2_X_ERR_NONE) {
SPMLOG_ERRMSGVAL("mhu_v2_x_reset_access_request : ", status);
--
2.25.1