SPMD: Add support for SPCI_ID_GET

This patch introduces the `SPCI_ID_GET` interface which will return the
ID of the calling SPCI component. Returns 0 for requests from the
non-secure world and the SPCI component ID as specified in the manifest
for secure world requests.

Change-Id: Icf81eb1d0e1d7d5c521571e04972b6e2d356e0d1
Signed-off-by: Max Shvetsov <maksims.svecovs@arm.com>
Signed-off-by: Marc Bonnici <marc.bonnici@arm.com>
diff --git a/services/std_svc/spmd/spmd_main.c b/services/std_svc/spmd/spmd_main.c
index 2cdf4f5..a3e1a2d 100644
--- a/services/std_svc/spmd/spmd_main.c
+++ b/services/std_svc/spmd/spmd_main.c
@@ -162,6 +162,16 @@
 	INFO("SPM core run time EL%x.\n",
 	     SPMD_SPM_AT_SEL2 ? MODE_EL2 : MODE_EL1);
 
+	/* Validate the SPMC ID, Ensure high bit is set */
+	if (!(spmc_attrs.spmc_id >> SPMC_SECURE_ID_SHIFT) &
+			SPMC_SECURE_ID_MASK) {
+		WARN("Invalid ID (0x%x) for SPMC.\n",
+		     spmc_attrs.spmc_id);
+		return 1;
+	}
+
+	INFO("SPMC ID %x.\n", spmc_attrs.spmc_id);
+
 	/* Validate the SPM core execution state */
 	if ((spmc_attrs.exec_state != MODE_RW_64) &&
 	    (spmc_attrs.exec_state != MODE_RW_32)) {
@@ -436,6 +446,26 @@
 
 		break; /* not reached */
 
+	case SPCI_ID_GET:
+		/*
+		 * Returns the ID of the calling SPCI component.
+		*/
+		if (!secure_origin) {
+			SMC_RET8(handle, SPCI_SUCCESS_SMC32,
+				 SPCI_TARGET_INFO_MBZ, SPCI_NS_ENDPOINT_ID,
+				 SPCI_PARAM_MBZ, SPCI_PARAM_MBZ,
+				 SPCI_PARAM_MBZ, SPCI_PARAM_MBZ,
+				 SPCI_PARAM_MBZ);
+		} else {
+			SMC_RET8(handle, SPCI_SUCCESS_SMC32,
+				 SPCI_TARGET_INFO_MBZ, spmc_attrs.spmc_id,
+				 SPCI_PARAM_MBZ, SPCI_PARAM_MBZ,
+				 SPCI_PARAM_MBZ, SPCI_PARAM_MBZ,
+				 SPCI_PARAM_MBZ);
+		}
+
+		break; /* not reached */
+
 	case SPCI_RX_RELEASE:
 	case SPCI_RXTX_MAP_SMC32:
 	case SPCI_RXTX_MAP_SMC64:
diff --git a/services/std_svc/spmd/spmd_private.h b/services/std_svc/spmd/spmd_private.h
index 61b479a..0ad35c7 100644
--- a/services/std_svc/spmd/spmd_private.h
+++ b/services/std_svc/spmd/spmd_private.h
@@ -55,6 +55,15 @@
 } spmd_spm_core_context_t;
 
 /*
+ * Reserve ID for NS physical SPCI Endpoint.
+ */
+#define SPCI_NS_ENDPOINT_ID		U(0)
+
+/* Mask and shift to check valid secure SPCI Endpoint ID. */
+#define SPMC_SECURE_ID_MASK		0x1
+#define SPMC_SECURE_ID_SHIFT		15
+
+/*
  * Data structure used by the SPM dispatcher (SPMD) in EL3 to track sequence of
  * SPCI calls from lower ELs.
  *