feat(realm): set the PMU IRQ number depending on GIC version
Despite the PPI number being the same, the INTID is different - it needs
to be labelled as PPI on GICv5. Add a helper to switch this.
Change-Id: I600ab121135b0826f8405202de222943392c36ec
Signed-off-by: Boyan Karatotev <boyan.karatotev@arm.com>
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
index be999c3..015728d 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
@@ -12,6 +12,7 @@
#include <irq.h>
#include <drivers/arm/arm_gic.h>
#include <drivers/arm/gic_v3.h>
+#include <drivers/arm/gic_v5.h>
#include <heap/page_alloc.h>
#include <lib/context_mgmt/context_el1.h>
#include <lib/context_mgmt/context_el2.h>
@@ -39,6 +40,22 @@
static uint128_t pauth_keys_after[NUM_KEYS];
#endif
+static unsigned int tftf_get_pmu_irq(void)
+{
+ if (arm_gic_get_version() == 5)
+ return PMU_PPI | INPLACE(INT_TYPE, INT_PPI);
+ else
+ return PMU_PPI;
+}
+
+static unsigned int tftf_get_pmu_virq(void)
+{
+ if (arm_gic_get_version() == 5)
+ return PMU_VIRQ | INPLACE(INT_TYPE, INT_PPI);
+ else
+ return PMU_VIRQ;
+}
+
/*
* @Test_Aim@ Test RSI_PLANE_SYSREG_READ/WRITE
*/
@@ -669,8 +686,8 @@
u_register_t exit_reason, retrmm;
int ret;
- tftf_irq_disable(PMU_PPI);
- ret = tftf_irq_unregister_handler(PMU_PPI);
+ tftf_irq_disable(tftf_get_pmu_irq());
+ ret = tftf_irq_unregister_handler(tftf_get_pmu_irq());
if (ret != 0) {
ERROR("Failed to %sregister IRQ handler\n", "un");
return false;
@@ -679,10 +696,10 @@
/* Inject PMU virtual interrupt */
run->entry.gicv3_lrs[0] =
ICH_LRn_EL2_STATE_Pending | ICH_LRn_EL2_Group_1 |
- (PMU_VIRQ << ICH_LRn_EL2_vINTID_SHIFT);
+ (tftf_get_pmu_virq() << ICH_LRn_EL2_vINTID_SHIFT);
/* Re-enter Realm */
- INFO("Re-entering Realm with vIRQ %lu pending\n", PMU_VIRQ);
+ INFO("Re-entering Realm with vIRQ %u pending\n", tftf_get_pmu_virq());
retrmm = host_realm_rec_enter(realm_ptr, &exit_reason,
&host_call_result, rec_num);
@@ -810,17 +827,17 @@
test_result_t ret;
/* Register PMU IRQ handler */
- if (tftf_irq_register_handler(PMU_PPI, host_overflow_interrupt) != 0) {
+ if (tftf_irq_register_handler(tftf_get_pmu_irq(), host_overflow_interrupt) != 0) {
tftf_testcase_printf("Failed to %sregister IRQ handler\n", "");
return TEST_RESULT_FAIL;
}
- tftf_irq_enable(PMU_PPI, GIC_HIGHEST_NS_PRIORITY);
+ tftf_irq_enable(tftf_get_pmu_irq(), GIC_HIGHEST_NS_PRIORITY);
ret = host_test_realm_pmuv3(cmd);
if (ret != TEST_RESULT_SUCCESS) {
- tftf_irq_disable(PMU_PPI);
- if (tftf_irq_unregister_handler(PMU_PPI) != 0) {
+ tftf_irq_disable(tftf_get_pmu_irq());
+ if (tftf_irq_unregister_handler(tftf_get_pmu_irq()) != 0) {
ERROR("Failed to %sregister IRQ handler\n", "un");
return TEST_RESULT_FAIL;
}