Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 420e53ab authored by Mallikarjuna Reddy Amireddy's avatar Mallikarjuna Reddy Amireddy Committed by Gerrit - the friendly Code Review server
Browse files

qseecom: qseecom_send_service_cmd failing secure world busy



In case of a failure during a TZ service request, return a response
to the TZ to stop the "TZ service request to AP" process.

Change-Id: I2bf8f8455271f9c5b4fc245d28a31fde341d196e
Signed-off-by: default avatarMallikarjuna Reddy Amireddy <mamire@codeaurora.org>
parent 6cb8923f
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -1348,6 +1348,46 @@ static int __qseecom_listener_has_sent_rsp(struct qseecom_dev_handle *data)
	return ret || data->abort;
}

static int __qseecom_qseos_fail_return_resp_tz(struct qseecom_dev_handle *data,
					struct qseecom_command_scm_resp *resp,
			struct qseecom_client_listener_data_irsp *send_data_rsp,
			struct qseecom_registered_listener_list *ptr_svc,
							uint32_t lstnr) {
	int ret = 0;

	send_data_rsp->status = QSEOS_RESULT_FAILURE;
	qseecom.send_resp_flag = 0;
	send_data_rsp->qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND;
	send_data_rsp->listener_id = lstnr;
	if (ptr_svc)
		pr_warn("listener_id:%x, lstnr: %x\n",
					ptr_svc->svc.listener_id, lstnr);
	if (ptr_svc && ptr_svc->ihandle)
		msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle,
					ptr_svc->sb_virt, ptr_svc->sb_length,
					ION_IOC_CLEAN_INV_CACHES);
	if (lstnr == RPMB_SERVICE)
		__qseecom_enable_clk(CLK_QSEE);
	ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, send_data_rsp,
				sizeof(send_data_rsp), resp, sizeof(*resp));
	if (ret) {
		pr_err("scm_call() failed with err: %d (app_id = %d)\n",
						ret, data->client.app_id);
		if (lstnr == RPMB_SERVICE)
			__qseecom_disable_clk(CLK_QSEE);
		return ret;
	}
	if ((resp->result != QSEOS_RESULT_SUCCESS) &&
			(resp->result != QSEOS_RESULT_INCOMPLETE)) {
		pr_err("fail:resp res= %d,app_id = %d,lstr = %d\n",
				resp->result, data->client.app_id, lstnr);
		ret = -EINVAL;
	}
	if (lstnr == RPMB_SERVICE)
		__qseecom_disable_clk(CLK_QSEE);
	return ret;
}

static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data,
					struct qseecom_command_scm_resp *resp)
{
@@ -1380,16 +1420,22 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data,

		if (ptr_svc == NULL) {
			pr_err("Listener Svc %d does not exist\n", lstnr);
			__qseecom_qseos_fail_return_resp_tz(data, resp,
					&send_data_rsp, ptr_svc, lstnr);
			return -EINVAL;
		}

		if (!ptr_svc->ihandle) {
			pr_err("Client handle is not initialized\n");
			__qseecom_qseos_fail_return_resp_tz(data, resp,
					&send_data_rsp, ptr_svc, lstnr);
			return -EINVAL;
		}

		if (ptr_svc->svc.listener_id != lstnr) {
			pr_warn("Service requested does not exist\n");
			__qseecom_qseos_fail_return_resp_tz(data, resp,
					&send_data_rsp, ptr_svc, lstnr);
			return -ERESTARTSYS;
		}
		pr_debug("waking up rcv_req_wq and waiting for send_resp_wq\n");