feat(intel): support SHA-2 hash digest generation on a blob

This command is to request the SHA-2 hash digest on a blob.
If input has a key, the output shall be key-hash digest.

Signed-off-by: Siew Chin Lim <elly.siew.chin.lim@intel.com>
Signed-off-by: Boon Khai Ng <boon.khai.ng@intel.com>
Signed-off-by: Sieu Mun Tang <sieu.mun.tang@intel.com>
Change-Id: I08cb82d89a8e8f7bfe04f5f01e079ea49fe38cf5
diff --git a/plat/intel/soc/common/include/socfpga_fcs.h b/plat/intel/soc/common/include/socfpga_fcs.h
index da982e1..db8f558 100644
--- a/plat/intel/soc/common/include/socfpga_fcs.h
+++ b/plat/intel/soc/common/include/socfpga_fcs.h
@@ -9,61 +9,64 @@
 
 /* FCS Definitions */
 
-#define FCS_RANDOM_WORD_SIZE		8U
-#define FCS_PROV_DATA_WORD_SIZE		44U
-#define FCS_SHA384_WORD_SIZE		12U
+#define FCS_RANDOM_WORD_SIZE			8U
+#define FCS_PROV_DATA_WORD_SIZE			44U
+#define FCS_SHA384_WORD_SIZE			12U
 
-#define FCS_RANDOM_BYTE_SIZE		(FCS_RANDOM_WORD_SIZE * 4U)
-#define FCS_RANDOM_EXT_MAX_WORD_SIZE	1020U
-#define FCS_PROV_DATA_BYTE_SIZE		(FCS_PROV_DATA_WORD_SIZE * 4U)
-#define FCS_SHA384_BYTE_SIZE		(FCS_SHA384_WORD_SIZE * 4U)
+#define FCS_RANDOM_BYTE_SIZE			(FCS_RANDOM_WORD_SIZE * 4U)
+#define FCS_RANDOM_EXT_MAX_WORD_SIZE		1020U
+#define FCS_PROV_DATA_BYTE_SIZE			(FCS_PROV_DATA_WORD_SIZE * 4U)
+#define FCS_SHA384_BYTE_SIZE			(FCS_SHA384_WORD_SIZE * 4U)
 
-#define FCS_RANDOM_EXT_OFFSET		3
+#define FCS_RANDOM_EXT_OFFSET			3
 
-#define FCS_MODE_DECRYPT		0x0
-#define FCS_MODE_ENCRYPT		0x1
-#define FCS_ENCRYPTION_DATA_0		0x10100
-#define FCS_DECRYPTION_DATA_0		0x10102
-#define FCS_OWNER_ID_OFFSET		0xC
+#define FCS_MODE_DECRYPT			0x0
+#define FCS_MODE_ENCRYPT			0x1
+#define FCS_ENCRYPTION_DATA_0			0x10100
+#define FCS_DECRYPTION_DATA_0			0x10102
+#define FCS_OWNER_ID_OFFSET			0xC
 
-#define PSGSIGMA_TEARDOWN_MAGIC		0xB852E2A4
-#define	PSGSIGMA_SESSION_ID_ONE		0x1
-#define PSGSIGMA_UNKNOWN_SESSION	0xFFFFFFFF
+#define PSGSIGMA_TEARDOWN_MAGIC			0xB852E2A4
+#define	PSGSIGMA_SESSION_ID_ONE			0x1
+#define PSGSIGMA_UNKNOWN_SESSION		0xFFFFFFFF
 
-#define	RESERVED_AS_ZERO		0x0
+#define	RESERVED_AS_ZERO			0x0
 /* FCS Single cert */
 
-#define FCS_BIG_CNTR_SEL		0x1
+#define FCS_BIG_CNTR_SEL			0x1
 
-#define FCS_SVN_CNTR_0_SEL		0x2
-#define FCS_SVN_CNTR_1_SEL		0x3
-#define FCS_SVN_CNTR_2_SEL		0x4
-#define FCS_SVN_CNTR_3_SEL		0x5
+#define FCS_SVN_CNTR_0_SEL			0x2
+#define FCS_SVN_CNTR_1_SEL			0x3
+#define FCS_SVN_CNTR_2_SEL			0x4
+#define FCS_SVN_CNTR_3_SEL			0x5
 
-#define FCS_BIG_CNTR_VAL_MAX		495U
-#define FCS_SVN_CNTR_VAL_MAX		64U
+#define FCS_BIG_CNTR_VAL_MAX			495U
+#define FCS_SVN_CNTR_VAL_MAX			64U
 
 /* FCS Attestation Cert Request Parameter */
 
-#define FCS_ALIAS_CERT			0x01
-#define FCS_DEV_ID_SELF_SIGN_CERT	0x02
-#define FCS_DEV_ID_ENROLL_CERT		0x04
-#define FCS_ENROLL_SELF_SIGN_CERT	0x08
-#define FCS_PLAT_KEY_CERT		0x10
+#define FCS_ALIAS_CERT				0x01
+#define FCS_DEV_ID_SELF_SIGN_CERT		0x02
+#define FCS_DEV_ID_ENROLL_CERT			0x04
+#define FCS_ENROLL_SELF_SIGN_CERT		0x08
+#define FCS_PLAT_KEY_CERT			0x10
 
 /* FCS Crypto Service */
 
-#define FCS_CS_KEY_OBJ_MAX_WORD_SIZE	88U
-#define FCS_CS_KEY_INFO_MAX_WORD_SIZE	36U
-#define FCS_CS_KEY_RESP_STATUS_MASK	0xFF
-#define FCS_CS_KEY_RESP_STATUS_OFFSET	16U
+#define FCS_CS_KEY_OBJ_MAX_WORD_SIZE		88U
+#define FCS_CS_KEY_INFO_MAX_WORD_SIZE		36U
+#define FCS_CS_KEY_RESP_STATUS_MASK		0xFF
+#define FCS_CS_KEY_RESP_STATUS_OFFSET		16U
 
-#define FCS_CS_FIELD_SIZE_MASK		0xFFFF
-#define FCS_CS_FIELD_FLAG_OFFSET	24
-#define FCS_CS_FIELD_FLAG_INIT		BIT(0)
-#define FCS_CS_FIELD_FLAG_UPDATE	BIT(1)
-#define FCS_CS_FIELD_FLAG_FINALIZE	BIT(2)
+#define FCS_CS_FIELD_SIZE_MASK			0xFFFF
+#define FCS_CS_FIELD_FLAG_OFFSET		24
+#define FCS_CS_FIELD_FLAG_INIT			BIT(0)
+#define FCS_CS_FIELD_FLAG_UPDATE		BIT(1)
+#define FCS_CS_FIELD_FLAG_FINALIZE		BIT(2)
 
+#define FCS_GET_DIGEST_CMD_MAX_WORD_SIZE	7U
+#define FCS_GET_DIGEST_RESP_MAX_WORD_SIZE	19U
+#define FCS_SHA_HMAC_CRYPTO_PARAM_SIZE_OFFSET	8U
 /* FCS Payload Structure */
 typedef struct fcs_rng_payload_t {
 	uint32_t session_id;
@@ -107,6 +110,14 @@
 	uint32_t key_id;
 } fcs_cs_key_payload;
 
+typedef struct fcs_crypto_service_data_t {
+	uint32_t session_id;
+	uint32_t context_id;
+	uint32_t key_id;
+	uint32_t crypto_param_size;
+	uint64_t crypto_param;
+} fcs_crypto_service_data;
+
 /* Functions Definitions */
 
 uint32_t intel_fcs_random_number_gen(uint64_t addr, uint64_t *ret_size,
@@ -160,4 +171,12 @@
 				uint64_t dst_addr, uint32_t *dst_size,
 				uint32_t *mbox_error);
 
+int intel_fcs_get_digest_init(uint32_t session_id, uint32_t context_id,
+				uint32_t key_id, uint32_t param_size,
+				uint64_t param_data, uint32_t *mbox_error);
+int intel_fcs_get_digest_finalize(uint32_t session_id, uint32_t context_id,
+				uint32_t src_addr, uint32_t src_size,
+				uint64_t dst_addr, uint32_t *dst_size,
+				uint32_t *mbox_error);
+
 #endif /* SOCFPGA_FCS_H */
diff --git a/plat/intel/soc/common/include/socfpga_mailbox.h b/plat/intel/soc/common/include/socfpga_mailbox.h
index f969a35..4984020 100644
--- a/plat/intel/soc/common/include/socfpga_mailbox.h
+++ b/plat/intel/soc/common/include/socfpga_mailbox.h
@@ -75,6 +75,7 @@
 #define MBOX_FCS_ENCRYPT_REQ				0x7E
 #define MBOX_FCS_DECRYPT_REQ				0x7F
 #define MBOX_FCS_RANDOM_GEN				0x80
+#define MBOX_FCS_GET_DIGEST_REQ				0x82
 #define MBOX_FCS_OPEN_CS_SESSION			0xA0
 #define MBOX_FCS_CLOSE_CS_SESSION			0xA1
 #define MBOX_FCS_IMPORT_CS_KEY				0xA5
diff --git a/plat/intel/soc/common/include/socfpga_sip_svc.h b/plat/intel/soc/common/include/socfpga_sip_svc.h
index e790669..f05e861 100644
--- a/plat/intel/soc/common/include/socfpga_sip_svc.h
+++ b/plat/intel/soc/common/include/socfpga_sip_svc.h
@@ -93,7 +93,12 @@
 #define INTEL_SIP_SMC_FCS_EXPORT_CS_KEY			0xC2000071
 #define INTEL_SIP_SMC_FCS_REMOVE_CS_KEY			0xC2000072
 #define INTEL_SIP_SMC_FCS_GET_CS_KEY_INFO		0xC2000073
+#define INTEL_SIP_SMC_FCS_GET_DIGEST_INIT		0xC2000077
+#define INTEL_SIP_SMC_FCS_GET_DIGEST_FINALIZE		0xC2000079
 
+#define INTEL_SIP_SMC_FCS_SHA_MODE_MASK			0xF
+#define INTEL_SIP_SMC_FCS_DIGEST_SIZE_MASK		0xF
+#define INTEL_SIP_SMC_FCS_DIGEST_SIZE_OFFSET		4U
 /* ECC DBE */
 #define WARM_RESET_WFI_FLAG				BIT(31)
 #define SYSMGR_ECC_DBE_COLD_RST_MASK			(SYSMGR_ECC_OCRAM_MASK |\