feat(amd): add test for TF-A register sgi API
Adds a test to verify the tf_a_register_sgi() API, which registers
the IPI interrupt with the system.
Change-Id: I3be28dc6c4ddec274cb64c8148fe0b61a1ab7b34
Signed-off-by: Madhav Bhatt <madhav.bhatt@amd.com>
diff --git a/tftf/tests/plat/amd/common/common_files/eemi_api.c b/tftf/tests/plat/amd/common/common_files/eemi_api.c
index 529c755..a3c929e 100644
--- a/tftf/tests/plat/amd/common/common_files/eemi_api.c
+++ b/tftf/tests/plat/amd/common/common_files/eemi_api.c
@@ -426,3 +426,11 @@
return ret;
}
+
+int tf_a_pm_register_sgi(uint32_t sgi_num, uint32_t reset)
+{
+ uint32_t ret_payload[PAYLOAD_ARG_CNT];
+
+ return eemi_call(TF_A_PM_REGISTER_SGI, ((uint64_t)reset << 32 | sgi_num),
+ 0, 0, 0, 0, 0, 0, ret_payload);
+}
diff --git a/tftf/tests/plat/amd/common/common_files/eemi_api.h b/tftf/tests/plat/amd/common/common_files/eemi_api.h
index 3e460fe..5ced6f6 100644
--- a/tftf/tests/plat/amd/common/common_files/eemi_api.h
+++ b/tftf/tests/plat/amd/common/common_files/eemi_api.h
@@ -33,6 +33,11 @@
uint32_t usage; /**< Indicates which master is using the slave */
} xpm_node_status;
+struct register_sgi {
+ uint32_t sgi_num; /**< SGI number to be used for communication */
+ uint32_t reset; /**< Reset to invalid SGI when reset=1 */
+};
+
int xpm_get_api_version(uint32_t *version);
int xpm_get_chip_id(uint32_t *id_code, uint32_t *version);
int xpm_feature_check(const uint32_t api_id, uint32_t *const version);
@@ -66,5 +71,6 @@
int xpm_init_finalize(void);
int get_trustzone_version(uint32_t *tz_version);
int tf_a_feature_check(const uint32_t api_id, uint32_t *const version);
+int tf_a_pm_register_sgi(uint32_t sgi_num, uint32_t reset);
#endif /* __EEMI_API_H__ */
diff --git a/tftf/tests/plat/amd/common/common_files/xpm_defs.h b/tftf/tests/plat/amd/common/common_files/xpm_defs.h
index 502c5f2..1d1c7f8 100644
--- a/tftf/tests/plat/amd/common/common_files/xpm_defs.h
+++ b/tftf/tests/plat/amd/common/common_files/xpm_defs.h
@@ -41,6 +41,9 @@
/* Requirement limits */
#define XPM_MAX_LATENCY 0xFFFFU
+/* SGI number used for Event management driver */
+#define XLNX_EVENT_SGI_NUM (15)
+
/* API IDs */
enum pm_api_id {
PM_API_MIN, /**< 0x0 */
diff --git a/tftf/tests/plat/amd/common/tf_a_register_sgi/tf_a_register_sgi.c b/tftf/tests/plat/amd/common/tf_a_register_sgi/tf_a_register_sgi.c
new file mode 100644
index 0000000..1488083
--- /dev/null
+++ b/tftf/tests/plat/amd/common/tf_a_register_sgi/tf_a_register_sgi.c
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2025, Advanced Micro Devices, Inc. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "eemi_api.h"
+#include "xpm_defs.h"
+
+struct register_sgi sgi_register_list[] = {
+ {
+ .sgi_num = XLNX_EVENT_SGI_NUM,
+ .reset = 0,
+ },
+};
+
+/*
+ * This function register the IPI interrupt.
+ */
+test_result_t test_tf_a_register_sgi(void)
+{
+ int32_t status, i;
+
+ for (i = 0; i < ARRAY_SIZE(sgi_register_list); i++) {
+ uint32_t sgi_number = sgi_register_list[i].sgi_num;
+ uint32_t reset = sgi_register_list[i].reset;
+
+ status = tf_a_pm_register_sgi(sgi_number, reset);
+ if (status != PM_RET_SUCCESS) {
+ tftf_testcase_printf("%s ERROR registering sgi, "
+ "Status: 0x%x\n", __func__, status);
+ return TEST_RESULT_FAIL;
+ }
+ tftf_testcase_printf("Registered SGI num : %d\n", sgi_number);
+ }
+
+ return TEST_RESULT_SUCCESS;
+}
diff --git a/tftf/tests/tests-versal.xml b/tftf/tests/tests-versal.xml
index a70b2c0..7db23a4 100644
--- a/tftf/tests/tests-versal.xml
+++ b/tftf/tests/tests-versal.xml
@@ -31,6 +31,7 @@
<testcase name="PM Init Finalize" function="test_init_finalize" />
<testcase name="Trustzone version" function="test_trustzone_version" />
<testcase name="TF-A feature check" function="test_tf_a_feature_check" />
+ <testcase name="TF-A register sgi" function="test_tf_a_register_sgi" />
</testsuite>
</testsuites>