platform: msm: Add LK support for two SCM calls

Add LK side implementation of two already available SCM calls in TZ:
1) INFO_GET_SECURE_STATE - To return whether the device is in test mode.
2) QFPROM_READ_ROW_ID - To read an eFuse.

Change-Id: Ic66f3c437e89b6a190cbe3f0694c96c729f075dc
diff --git a/platform/msm_shared/scm.c b/platform/msm_shared/scm.c
index ff403b8..ddf177c 100644
--- a/platform/msm_shared/scm.c
+++ b/platform/msm_shared/scm.c
@@ -583,6 +583,48 @@
 	return ret;
 }
 
+int scm_svc_get_secure_state(uint32_t *state_low, uint32_t *state_high)
+{
+	get_secure_state_req req;
+	get_secure_state_rsp rsp;
+
+	int ret = 0;
+
+	scmcall_arg scm_arg = {0};
+	scmcall_ret scm_ret = {0};
+
+	if (!scm_arm_support)
+	{
+		req.status_ptr = (uint32_t*)&rsp;
+		req.status_len = sizeof(rsp);
+
+		ret = scm_call(TZBSP_SVC_INFO,
+					   TZ_INFO_GET_SECURE_STATE,
+					   &req,
+					   sizeof(req),
+					   NULL,
+					   0);
+	}
+	else
+	{
+		scm_arg.x0 = MAKE_SIP_SCM_CMD(TZBSP_SVC_INFO, TZ_INFO_GET_SECURE_STATE);
+		scm_arg.x1 = MAKE_SCM_ARGS(0x0);
+
+		ret = scm_call2(&scm_arg, &scm_ret);
+
+		rsp.status_low = scm_ret.x1;
+		rsp.status_high = scm_ret.x2;
+	}
+
+	if(!ret)
+	{
+		*state_low = rsp.status_low;
+		*state_high = rsp.status_high;
+	}
+
+	return ret;
+}
+
 int scm_protect_keystore(uint32_t * img_ptr, uint32_t  img_len)
 {
 	int                      ret=0;
@@ -817,6 +859,61 @@
 	return 0;
 }
 
+int qfprom_read_row_cmd(uint32_t row_address,
+                        uint32_t addr_type,
+                        uint32_t *row_data,
+                        uint32_t *qfprom_api_status)
+{
+	uint32_t svc_id;
+	uint32_t cmd_id;
+	void *cmd_buf;
+	void *rsp_buf;
+	size_t cmd_len;
+	size_t rsp_len;
+	qfprom_read_row_req req;
+	scmcall_arg scm_arg = {0};
+	scmcall_ret scm_ret = {0};
+
+	req.row_address = row_address;
+	req.addr_type = addr_type;
+	req.row_data = row_data;
+	req.qfprom_api_status = qfprom_api_status;
+
+	if (!scm_arm_support)
+	{
+		svc_id = SCM_SVC_FUSE;
+		cmd_id = SCM_QFPROM_READ_ROW_ID;
+		cmd_buf = (void *)&req;
+		cmd_len = sizeof(req);
+		rsp_buf = NULL;
+		rsp_len = 0;
+
+		if (scm_call(svc_id, cmd_id, cmd_buf, cmd_len, rsp_buf, rsp_len))
+		{
+			dprintf(CRITICAL, "Failed to call SCM_SVC_FUSE.SCM_QFPROM_READ_ROW_ID SCM\n");
+			return -1;
+		}
+	}
+	else
+	{
+		scm_arg.x0 = MAKE_SIP_SCM_CMD(SCM_SVC_FUSE, SCM_QFPROM_READ_ROW_ID);
+		scm_arg.x1 = MAKE_SCM_ARGS(0x4, SMC_PARAM_TYPE_VALUE, SMC_PARAM_TYPE_VALUE,
+										SMC_PARAM_TYPE_BUFFER_READWRITE, SMC_PARAM_TYPE_BUFFER_READWRITE);
+		scm_arg.x2 = req.row_address;
+		scm_arg.x3 = req.addr_type;
+		scm_arg.x4 = (uint32_t)req.row_data;
+		scm_arg.x5[0] = (uint32_t)req.qfprom_api_status;
+
+		if (scm_call2(&scm_arg, &scm_ret))
+		{
+			dprintf(CRITICAL, "Failed to call SCM_SVC_FUSE.SCM_QFPROM_READ_ROW_ID SCM\n");
+			return -1;
+		}
+	}
+
+	return 0;
+}
+
 /*
  * Switches the CE1 channel between ADM and register usage.
  * channel : AP_CE_REGISTER_USE, CE1 uses register interface