summaryrefslogtreecommitdiff
path: root/drivers/misc
diff options
context:
space:
mode:
authorZhen Kong <zkong@codeaurora.org>2016-10-31 12:51:26 -0700
committerZhen Kong <zkong@codeaurora.org>2016-12-22 17:54:34 -0800
commitc9153d1ae836f4509f9e9347289d8b9cd0aed2b9 (patch)
tree89f4efcde35c627719bd1e565fbc64cbf7b29eaf /drivers/misc
parent9c8924dbaadbb194f6d0bf30fa7fafde20ec096c (diff)
qseecom: support listener request for smcinvoke
Add a new kernel API to support listener service for smcinvoke. Change-Id: Ifeed957b99d2becd986629f60e145d6fdb717244 Signed-off-by: Zhen Kong <zkong@codeaurora.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/qseecom.c34
-rw-r--r--drivers/misc/qseecom_kernel.h2
2 files changed, 36 insertions, 0 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 3402a1b581cf..97e69d1ae9e9 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -4361,6 +4361,40 @@ int qseecom_set_bandwidth(struct qseecom_handle *handle, bool high)
}
EXPORT_SYMBOL(qseecom_set_bandwidth);
+int qseecom_process_listener_from_smcinvoke(struct scm_desc *desc)
+{
+ struct qseecom_registered_app_list dummy_app_entry = { {0} };
+ struct qseecom_dev_handle dummy_private_data = {0};
+ struct qseecom_command_scm_resp resp;
+ int ret = 0;
+
+ if (!desc) {
+ pr_err("desc is NULL\n");
+ return -EINVAL;
+ }
+
+ resp.result = desc->ret[0]; /*req_cmd*/
+ resp.resp_type = desc->ret[1]; /*app_id*/
+ resp.data = desc->ret[2]; /*listener_id*/
+
+ dummy_private_data.client.app_id = desc->ret[1];
+ dummy_app_entry.app_id = desc->ret[1];
+
+ mutex_lock(&app_access_lock);
+ ret = __qseecom_process_reentrancy(&resp, &dummy_app_entry,
+ &dummy_private_data);
+ mutex_unlock(&app_access_lock);
+ if (ret)
+ pr_err("Failed to req cmd %d lsnr %d on app %d, ret = %d\n",
+ (int)desc->ret[0], (int)desc->ret[2],
+ (int)desc->ret[1], ret);
+ desc->ret[0] = resp.result;
+ desc->ret[1] = resp.resp_type;
+ desc->ret[2] = resp.data;
+ return ret;
+}
+EXPORT_SYMBOL(qseecom_process_listener_from_smcinvoke);
+
static int qseecom_send_resp(void)
{
qseecom.send_resp_flag = 1;
diff --git a/drivers/misc/qseecom_kernel.h b/drivers/misc/qseecom_kernel.h
index ca0205560875..8f981903c3a1 100644
--- a/drivers/misc/qseecom_kernel.h
+++ b/drivers/misc/qseecom_kernel.h
@@ -14,6 +14,7 @@
#define __QSEECOM_KERNEL_H_
#include <linux/types.h>
+#include <soc/qcom/scm.h>
#define QSEECOM_ALIGN_SIZE 0x40
#define QSEECOM_ALIGN_MASK (QSEECOM_ALIGN_SIZE - 1)
@@ -38,5 +39,6 @@ int qseecom_shutdown_app(struct qseecom_handle **handle);
int qseecom_send_command(struct qseecom_handle *handle, void *send_buf,
uint32_t sbuf_len, void *resp_buf, uint32_t rbuf_len);
int qseecom_set_bandwidth(struct qseecom_handle *handle, bool high);
+int qseecom_process_listener_from_smcinvoke(struct scm_desc *desc);
#endif /* __QSEECOM_KERNEL_H_ */