diff options
author | Zhen Kong <zkong@codeaurora.org> | 2017-12-01 18:26:25 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-12-18 13:59:20 -0800 |
commit | 0a2d725d486b9c4e2000b83336fe75d72c8d2925 (patch) | |
tree | 52374c0c2db76d7abd552d68f67a1760f436571b /drivers | |
parent | c2e3a1a7e7d71919464fba0d6cf1a620aa781e99 (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.c | 22 |
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, |