summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorZhen Kong <zkong@codeaurora.org>2017-12-01 18:26:25 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-12-18 13:59:20 -0800
commit0a2d725d486b9c4e2000b83336fe75d72c8d2925 (patch)
tree52374c0c2db76d7abd552d68f67a1760f436571b /drivers
parentc2e3a1a7e7d71919464fba0d6cf1a620aa781e99 (diff)
qseecom: resend continue blocked listener request
When new cmd with session_id is not supported by TZ, resend continue blocked listener request with legacy cmd using app_id. Also set dummy app_id in qseecom_process_listener_from_smcinvoke to support legacy cmd. Change-Id: Icafc77cece23daff0f2ceb89c10e82a822eb582a Signed-off-by: Zhen Kong <zkong@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/misc/qseecom.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 16dd7dd37f78..98657d0a6822 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -1940,7 +1940,7 @@ exit:
}
static int __qseecom_process_blocked_on_listener_smcinvoke(
- struct qseecom_command_scm_resp *resp)
+ struct qseecom_command_scm_resp *resp, uint32_t app_id)
{
struct qseecom_registered_listener_list *list_ptr;
int ret = 0;
@@ -1987,9 +1987,18 @@ static int __qseecom_process_blocked_on_listener_smcinvoke(
&ireq, sizeof(ireq),
&continue_resp, sizeof(continue_resp));
if (ret) {
- pr_err("scm_call for continue blocked req for session %d failed, ret %d\n",
- session_id, ret);
- goto exit;
+ /* retry with legacy cmd */
+ qseecom.smcinvoke_support = false;
+ ireq.app_or_session_id = app_id;
+ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1,
+ &ireq, sizeof(ireq),
+ &continue_resp, sizeof(continue_resp));
+ qseecom.smcinvoke_support = true;
+ if (ret) {
+ pr_err("cont block req for app %d or session %d fail\n",
+ app_id, session_id);
+ goto exit;
+ }
}
resp->result = QSEOS_RESULT_INCOMPLETE;
exit:
@@ -2006,7 +2015,7 @@ static int __qseecom_process_reentrancy_blocked_on_listener(
resp, ptr_app, data);
else
return __qseecom_process_blocked_on_listener_smcinvoke(
- resp);
+ resp, data->client.app_id);
}
static int __qseecom_reentrancy_process_incomplete_cmd(
struct qseecom_dev_handle *data,
@@ -4786,6 +4795,9 @@ int qseecom_process_listener_from_smcinvoke(struct scm_desc *desc)
resp.resp_type = desc->ret[1]; /*incomplete:unused;blocked:session_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);
if (qseecom.qsee_reentrancy_support)
ret = __qseecom_process_reentrancy(&resp, &dummy_app_entry,