feat(interrupts): delegate group0 interrupt handling to EL3

This patch adds a helper function to delegate handling of Group0
secure interrupt to EL3 firmware using FFA_EL3_INTR_HANDLE SMC
call.

Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
Change-Id: I46df6b96bb77cccd69011ee8074368d44a7bcd9d
diff --git a/src/arch/aarch64/hypervisor/handler.c b/src/arch/aarch64/hypervisor/handler.c
index 3ef7546..0d38365 100644
--- a/src/arch/aarch64/hypervisor/handler.c
+++ b/src/arch/aarch64/hypervisor/handler.c
@@ -1080,6 +1080,20 @@
 #endif
 }
 
+#if SECURE_WORLD == 1
+static void spmd_group0_intr_delegate(void)
+{
+	struct ffa_value ret;
+
+	dlog_verbose("Delegating Group0 interrupt to SPMD\n");
+
+	ret = smc_ffa_call((struct ffa_value){.func = FFA_EL3_INTR_HANDLE_32});
+
+	/* Check if the Group0 interrupt was handled successfully. */
+	CHECK(ret.func == FFA_SUCCESS_32);
+}
+#endif
+
 struct vcpu *fiq_lower(void)
 {
 #if SECURE_WORLD == 1
@@ -1092,10 +1106,11 @@
 
 	/* Check for the highest priority pending Group0 interrupt. */
 	if (intid != SPURIOUS_INTID_OTHER_WORLD) {
-		/*
-		 * TODO: Delegate handling of Group0 interrupt to EL3 firmware.
-		 */
-		panic();
+		/* Delegate handling of Group0 interrupt to EL3 firmware. */
+		spmd_group0_intr_delegate();
+
+		/* Resume current vCPU. */
+		return NULL;
 	}
 
 	/*