From c063c5a4f92d5787536e595ca4906b458b0f26cb Mon Sep 17 00:00:00 2001 From: Abhyuday Godhasara Date: Thu, 24 Jun 2021 05:49:04 -0700 Subject: [PATCH 1/2] fix(plat/xilinx/zynqmp): use sync method for blocking calls All API calls except non-blocking should wait for IPI response and read buffer to check return status from firmware. Some of API calls are not reading status from IPI payload data. Use sync method which reads actual return status from IPI payload. Signed-off-by: Abhyuday Godhasara Change-Id: I78f9c061a80cee6d524ade4ef124ca88ce1848cf --- plat/xilinx/zynqmp/pm_service/pm_api_sys.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_sys.c b/plat/xilinx/zynqmp/pm_service/pm_api_sys.c index 9a53408fd..62260bc40 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_sys.c +++ b/plat/xilinx/zynqmp/pm_service/pm_api_sys.c @@ -209,7 +209,7 @@ enum pm_ret_status pm_abort_suspend(enum pm_abort_reason reason) /* TODO: allow passing the node ID of the affected CPU */ PM_PACK_PAYLOAD3(payload, PM_ABORT_SUSPEND, reason, primary_proc->node_id); - return pm_ipi_send(primary_proc, payload); + return pm_ipi_send_sync(primary_proc, payload, NULL, 0); } /** @@ -228,7 +228,7 @@ enum pm_ret_status pm_set_wakeup_source(enum pm_node_id target, PM_PACK_PAYLOAD4(payload, PM_SET_WAKEUP_SOURCE, target, wkup_node, enable); - return pm_ipi_send(primary_proc, payload); + return pm_ipi_send_sync(primary_proc, payload, NULL, 0); } /** @@ -316,7 +316,7 @@ enum pm_ret_status pm_release_node(enum pm_node_id nid) uint32_t payload[PAYLOAD_ARG_CNT]; PM_PACK_PAYLOAD2(payload, PM_RELEASE_NODE, nid); - return pm_ipi_send(primary_proc, payload); + return pm_ipi_send_sync(primary_proc, payload, NULL, 0); } /** @@ -332,7 +332,7 @@ enum pm_ret_status pm_set_max_latency(enum pm_node_id nid, uint32_t payload[PAYLOAD_ARG_CNT]; PM_PACK_PAYLOAD3(payload, PM_SET_MAX_LATENCY, nid, latency); - return pm_ipi_send(primary_proc, payload); + return pm_ipi_send_sync(primary_proc, payload, NULL, 0); } /* Miscellaneous API functions */ @@ -461,7 +461,7 @@ enum pm_ret_status pm_reset_assert(unsigned int reset, /* Send request to the PMU */ PM_PACK_PAYLOAD3(payload, PM_RESET_ASSERT, reset, assert); - return pm_ipi_send(primary_proc, payload); + return pm_ipi_send_sync(primary_proc, payload, NULL, 0); } /** From fa58171534976f94b93a44184afd050d8225e404 Mon Sep 17 00:00:00 2001 From: Abhyuday Godhasara Date: Thu, 24 Jun 2021 05:50:44 -0700 Subject: [PATCH 2/2] fix(plat/xilinx/versal): use sync method for blocking calls All API calls except non-blocking should wait for IPI response and read buffer to check return status from firmware. Some of API calls are not reading status from IPI payload data. Use sync method which reads actual return status from IPI payload. Signed-off-by: Abhyuday Godhasara Change-Id: I6f568b85d0da639c264f507122e3015807d8423d --- plat/xilinx/versal/pm_service/pm_api_sys.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plat/xilinx/versal/pm_service/pm_api_sys.c b/plat/xilinx/versal/pm_service/pm_api_sys.c index 15fe187eb..912835a15 100644 --- a/plat/xilinx/versal/pm_service/pm_api_sys.c +++ b/plat/xilinx/versal/pm_service/pm_api_sys.c @@ -173,7 +173,7 @@ enum pm_ret_status pm_abort_suspend(enum pm_abort_reason reason, uint32_t flag) /* Send request to the PLM */ PM_PACK_PAYLOAD3(payload, LIBPM_MODULE_ID, flag, PM_ABORT_SUSPEND, reason, primary_proc->node_id); - return pm_ipi_send(primary_proc, payload); + return pm_ipi_send_sync(primary_proc, payload, NULL, 0); } /** @@ -909,7 +909,7 @@ enum pm_ret_status pm_set_wakeup_source(uint32_t target, uint32_t wkup_device, PM_PACK_PAYLOAD4(payload, LIBPM_MODULE_ID, flag, PM_SET_WAKEUP_SOURCE, target, wkup_device, enable); - return pm_ipi_send(primary_proc, payload); + return pm_ipi_send_sync(primary_proc, payload, NULL, 0); } /**