Loading drivers/misc/qseecom.c +46 −0 Original line number Diff line number Diff line Loading @@ -1349,6 +1349,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) { Loading Loading @@ -1381,16 +1421,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"); Loading Loading
drivers/misc/qseecom.c +46 −0 Original line number Diff line number Diff line Loading @@ -1349,6 +1349,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) { Loading Loading @@ -1381,16 +1421,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"); Loading