fix(smccc): use full GP regs set on physical FF-A instance

For the following ABIs where Hafnium/S-EL2 is caller and SPMD/EL3 is
callee, assuming it runs in the AArch64 execution state:

FFA_SECONDARY_EP_REGISTER
FFA_EL3_INTR_HANDLE
FFA_ID_GET

On S-EL2 emitting an SMC, clear GP registers that are not required for
those ABIs up to x17.
On return to S-EL2, consume the full x0-x17 GP registers set.

Apply the same to the following SiP calls towards EL3:
PLAT_PROTECT_MEM_64
PLAT_UNPROTECT_MEM_64

Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
Change-Id: I193f6bb06d13dbc7eb8496c64f9c44271548352d
diff --git a/src/arch/aarch64/hypervisor/handler.c b/src/arch/aarch64/hypervisor/handler.c
index 4f544c0..7bacd2e 100644
--- a/src/arch/aarch64/hypervisor/handler.c
+++ b/src/arch/aarch64/hypervisor/handler.c
@@ -974,7 +974,8 @@
 
 	dlog_verbose("Delegating Group0 interrupt to SPMD\n");
 
-	ret = smc_ffa_call((struct ffa_value){.func = FFA_EL3_INTR_HANDLE_32});
+	ret = smc_ffa_call_ext(
+		(struct ffa_value){.func = FFA_EL3_INTR_HANDLE_32});
 
 	/* Check if the Group0 interrupt was handled successfully. */
 	CHECK(ret.func == FFA_SUCCESS_32);
diff --git a/src/arch/aarch64/memory_protect/rme.c b/src/arch/aarch64/memory_protect/rme.c
index 7c9a0c8..307c45e 100644
--- a/src/arch/aarch64/memory_protect/rme.c
+++ b/src/arch/aarch64/memory_protect/rme.c
@@ -34,9 +34,9 @@
 		return ffa_error(FFA_NOT_SUPPORTED);
 	}
 
-	ret = smc_ffa_call((struct ffa_value){.func = PLAT_PROTECT_MEM_64,
-					      .arg1 = pa_addr(begin),
-					      .arg2 = size});
+	ret = smc_ffa_call_ext((struct ffa_value){.func = PLAT_PROTECT_MEM_64,
+						  .arg1 = pa_addr(begin),
+						  .arg2 = size});
 
 	switch (ret.func) {
 	case SMCCC_OK:
@@ -83,9 +83,9 @@
 	 */
 	assert(is_arch_feat_rme_supported());
 
-	ret = smc_ffa_call((struct ffa_value){.func = PLAT_UNPROTECT_MEM_64,
-					      .arg1 = pa_addr(begin),
-					      .arg2 = size});
+	ret = smc_ffa_call_ext((struct ffa_value){.func = PLAT_UNPROTECT_MEM_64,
+						  .arg1 = pa_addr(begin),
+						  .arg2 = size});
 
 	return ret.func == SMCCC_OK;
 }
diff --git a/src/arch/aarch64/plat/psci/spmc.c b/src/arch/aarch64/plat/psci/spmc.c
index 1aa2789..81574f1 100644
--- a/src/arch/aarch64/plat/psci/spmc.c
+++ b/src/arch/aarch64/plat/psci/spmc.c
@@ -40,7 +40,7 @@
 	 * Register the SPMC secondary cold boot entry point at the secure
 	 * physical FF-A instance (to the SPMD).
 	 */
-	res = smc_ffa_call(
+	res = smc_ffa_call_ext(
 		(struct ffa_value){.func = FFA_SECONDARY_EP_REGISTER_64,
 				   .arg1 = (uintreg_t)&cpu_entry});
 
diff --git a/src/arch/aarch64/smc.c b/src/arch/aarch64/smc.c
index 0fc76fb..754b2f7 100644
--- a/src/arch/aarch64/smc.c
+++ b/src/arch/aarch64/smc.c
@@ -138,12 +138,6 @@
 
 struct ffa_value smc_ffa_call_ext(struct ffa_value args)
 {
-	/* Only these FF-A v1.2 SMC functions allowed to use this helper. */
-	assert(args.func == FFA_PARTITION_INFO_GET_REGS_64 ||
-	       args.func == FFA_RUN_32 ||
-	       args.func == FFA_MSG_SEND_DIRECT_REQ2_64 ||
-	       args.func == FFA_MSG_SEND_DIRECT_RESP2_64);
-
 	return smc_internal_ext(
 		args.func, args.arg1, args.arg2, args.arg3, args.arg4,
 		args.arg5, args.arg6, args.arg7, args.extended_val.arg8,
diff --git a/src/ffa/spmc/setup_and_discovery.c b/src/ffa/spmc/setup_and_discovery.c
index fbb3b52..ab61b98 100644
--- a/src/ffa/spmc/setup_and_discovery.c
+++ b/src/ffa/spmc/setup_and_discovery.c
@@ -20,7 +20,7 @@
 	 * Since we are running in the SPMC use FFA_ID_GET to fetch our
 	 * ID from the SPMD.
 	 */
-	return smc_ffa_call((struct ffa_value){.func = FFA_ID_GET_32});
+	return smc_ffa_call_ext((struct ffa_value){.func = FFA_ID_GET_32});
 }
 
 /**