From 5e6faa5d189153d951ddc0a1cd22bc6ad1dc7349 Mon Sep 17 00:00:00 2001 From: Anmolpreet Kaur Date: Thu, 11 Feb 2021 21:56:49 +0530 Subject: [PATCH] smcinvoke: Update the correct result from qseecom In case when a listener request comes from secure side to smcinvoke, we invoke qseecom for processing of listener request. It maybe the case that after this request, secure side may request for another callback request. In this flow, we need to update the correct result from qseecom as 0 so as to indicate that qseecom's job was successfully finished and now smcinvoke has to take care of the callback request further. This condition is again checked at smcinvoke side and decision to marshal out is taken accordingly. Change-Id: I5d6be3292ef11ac2d84fd287bb8f1e9f91dc1b56 Signed-off-by: Anmolpreet Kaur --- drivers/misc/qseecom.c | 5 +++++ drivers/soc/qcom/smcinvoke.c | 10 +++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index add93fdfa311..5fbb2bc6550b 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -2655,6 +2655,11 @@ err_resp: pr_warn("get cback req app_id = %d, resp->data = %d\n", data->client.app_id, resp->data); resp->resp_type = SMCINVOKE_RESULT_INBOUND_REQ_NEEDED; + /* We are here because scm call sent to TZ has requested + * for another callback request. This call has been a + * success and hence setting result = 0 + */ + resp->result = 0; break; default: pr_err("fail:resp res= %d,app_id = %d,lstr = %d\n", diff --git a/drivers/soc/qcom/smcinvoke.c b/drivers/soc/qcom/smcinvoke.c index 3881ec0d32cc..3cbf9e359f2a 100644 --- a/drivers/soc/qcom/smcinvoke.c +++ b/drivers/soc/qcom/smcinvoke.c @@ -1282,13 +1282,9 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr, response_type == QSEOS_RESULT_BLOCKED_ON_LISTENER) { ret = qseecom_process_listener_from_smcinvoke( &req->result, &response_type, &data); - /* - * new scm APIs do not provide complete response i.e. res[0-2], - * we loose some values returned from QSEECom APIs. so we need to - * populate result from response type i.e. res[1] - */ - req->result = response_type; - if (!req->result) { + + if (!req->result && + response_type != SMCINVOKE_RESULT_INBOUND_REQ_NEEDED) { ret = marshal_out_invoke_req(in_buf, in_buf_len, req, args_buf); }