| 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 |
| |