Merge "qseecom: fix incomplete error handling for several functions"

This commit is contained in:
Linux Build Service Account 2017-01-30 21:53:34 -08:00 committed by Gerrit - the friendly Code Review server
commit 1750226d77
1 changed files with 162 additions and 52 deletions

View File

@ -1219,9 +1219,11 @@ static int __qseecom_set_msm_bus_request(uint32_t mode)
pr_err("Bandwidth req failed(%d) MODE (%d)\n",
ret, mode);
if (qclk->ce_core_src_clk != NULL) {
if (mode == INACTIVE)
__qseecom_enable_clk(CLK_QSEE);
else
if (mode == INACTIVE) {
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
pr_err("CLK enable failed\n");
} else
__qseecom_disable_clk(CLK_QSEE);
}
}
@ -1520,12 +1522,21 @@ static int __qseecom_qseos_fail_return_resp_tz(struct qseecom_dev_handle *data,
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,
if (ptr_svc && ptr_svc->ihandle) {
ret = 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);
if (ret) {
pr_err("cache operation failed %d\n", ret);
return ret;
}
}
if (lstnr == RPMB_SERVICE) {
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
return ret;
}
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, send_data_rsp,
sizeof(send_data_rsp), resp, sizeof(*resp));
@ -1668,13 +1679,22 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data,
else
*(uint32_t *)cmd_buf =
QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST;
if (ptr_svc)
msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle,
if (ptr_svc) {
ret = msm_ion_do_cache_op(qseecom.ion_clnt,
ptr_svc->ihandle,
ptr_svc->sb_virt, ptr_svc->sb_length,
ION_IOC_CLEAN_INV_CACHES);
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
return ret;
}
}
if ((lstnr == RPMB_SERVICE) || (lstnr == SSD_SERVICE))
__qseecom_enable_clk(CLK_QSEE);
if ((lstnr == RPMB_SERVICE) || (lstnr == SSD_SERVICE)) {
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
return ret;
}
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1,
cmd_buf, cmd_len, resp, sizeof(*resp));
@ -1814,13 +1834,21 @@ static int __qseecom_reentrancy_process_incomplete_cmd(
else
*(uint32_t *)cmd_buf =
QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST;
if (ptr_svc)
msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle,
if (ptr_svc) {
ret = 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);
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
return ret;
}
}
if (lstnr == RPMB_SERVICE) {
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
return ret;
}
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1,
cmd_buf, cmd_len, resp, sizeof(*resp));
@ -2075,8 +2103,12 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp)
cmd_len = sizeof(struct qseecom_load_app_64bit_ireq);
}
msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto loadapp_err;
}
__qseecom_reentrancy_check_if_no_app_blocked();
@ -2562,15 +2594,16 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data,
}
}
msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt, data->client.sb_length,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto exit;
}
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1,
(const void *)send_req_ptr,
req_buf_size, &resp, sizeof(resp));
msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt, data->client.sb_length,
ION_IOC_INV_CACHES);
if (ret) {
pr_err("qseecom_scm_call failed with err: %d\n", ret);
if (!qseecom.support_bus_scaling) {
@ -2582,7 +2615,13 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data,
}
goto exit;
}
ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt, data->client.sb_length,
ION_IOC_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto exit;
}
switch (resp.result) {
case QSEOS_RESULT_SUCCESS:
break;
@ -2848,10 +2887,14 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data,
else
*(uint32_t *)cmd_buf = QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST;
msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt,
reqd_len_sb_in,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
return ret;
}
__qseecom_reentrancy_check_if_this_app_blocked(ptr_app);
@ -2882,9 +2925,11 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data,
}
}
}
msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt, data->client.sb_length,
ION_IOC_INV_CACHES);
if (ret)
pr_err("cache operation failed %d\n", ret);
return ret;
}
@ -2996,7 +3041,7 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup,
}
/* Populate the cmd data structure with the phys_addr */
sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle);
if (sg_ptr == NULL) {
if (IS_ERR_OR_NULL(sg_ptr)) {
pr_err("IOn client could not retrieve sg table\n");
goto err;
}
@ -3104,13 +3149,21 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup,
}
if (cleanup) {
msm_ion_do_cache_op(qseecom.ion_clnt,
ret = msm_ion_do_cache_op(qseecom.ion_clnt,
ihandle, NULL, len,
ION_IOC_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto err;
}
} else {
msm_ion_do_cache_op(qseecom.ion_clnt,
ret = msm_ion_do_cache_op(qseecom.ion_clnt,
ihandle, NULL, len,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto err;
}
if (data->type == QSEECOM_CLIENT_APP) {
offset = req->ifd_data[i].cmd_buf_offset;
data->sglistinfo_ptr[i].indexAndFlags =
@ -3251,7 +3304,7 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup,
}
/* Populate the cmd data structure with the phys_addr */
sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle);
if (sg_ptr == NULL) {
if (IS_ERR_OR_NULL(sg_ptr)) {
pr_err("IOn client could not retrieve sg table\n");
goto err;
}
@ -3334,13 +3387,21 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup,
}
cleanup:
if (cleanup) {
msm_ion_do_cache_op(qseecom.ion_clnt,
ret = msm_ion_do_cache_op(qseecom.ion_clnt,
ihandle, NULL, len,
ION_IOC_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto err;
}
} else {
msm_ion_do_cache_op(qseecom.ion_clnt,
ret = msm_ion_do_cache_op(qseecom.ion_clnt,
ihandle, NULL, len,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto err;
}
if (data->type == QSEECOM_CLIENT_APP) {
offset = req->ifd_data[i].cmd_buf_offset;
data->sglistinfo_ptr[i].indexAndFlags =
@ -3829,9 +3890,13 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname)
goto exit_unregister_bus_bw_need;
}
msm_ion_do_cache_op(qseecom.ion_clnt, ihandle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle,
img_data, fw_size,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto exit_disable_clk_vote;
}
__qseecom_reentrancy_check_if_no_app_blocked();
/* SCM_CALL to load the image */
@ -3946,9 +4011,13 @@ static int qseecom_load_commonlib_image(struct qseecom_dev_handle *data,
goto exit_unregister_bus_bw_need;
}
msm_ion_do_cache_op(qseecom.ion_clnt, qseecom.cmnlib_ion_handle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, qseecom.cmnlib_ion_handle,
img_data, fw_size,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto exit_disable_clk_vote;
}
/* SCM_CALL to load the image */
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len,
@ -4514,9 +4583,10 @@ static int __qseecom_enable_clk(enum qseecom_ce_hw_instance ce)
}
mutex_lock(&clk_access_lock);
if (qclk->clk_access_cnt == ULONG_MAX)
if (qclk->clk_access_cnt == ULONG_MAX) {
pr_err("clk_access_cnt beyond limitation\n");
goto err;
}
if (qclk->clk_access_cnt > 0) {
qclk->clk_access_cnt++;
mutex_unlock(&clk_access_lock);
@ -4829,9 +4899,13 @@ static int qseecom_load_external_elf(struct qseecom_dev_handle *data,
ret = -EIO;
goto exit_register_bus_bandwidth_needs;
}
msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len,
ION_IOC_CLEAN_INV_CACHES);
__qseecom_reentrancy_check_if_no_app_blocked();
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto exit_disable_clock;
}
/* SCM_CALL to load the external elf */
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len,
&resp, sizeof(resp));
@ -5075,7 +5149,9 @@ static int __qseecom_generate_and_save_key(struct qseecom_dev_handle *data,
pr_err("Error:: unsupported usage %d\n", usage);
return -EFAULT;
}
__qseecom_enable_clk(CLK_QSEE);
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
return ret;
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1,
ireq, sizeof(struct qseecom_key_generate_ireq),
@ -5133,7 +5209,9 @@ static int __qseecom_delete_saved_key(struct qseecom_dev_handle *data,
pr_err("Error:: unsupported usage %d\n", usage);
return -EFAULT;
}
__qseecom_enable_clk(CLK_QSEE);
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
return ret;
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1,
ireq, sizeof(struct qseecom_key_delete_ireq),
@ -5192,10 +5270,15 @@ static int __qseecom_set_clear_ce_key(struct qseecom_dev_handle *data,
pr_err("Error:: unsupported usage %d\n", usage);
return -EFAULT;
}
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
return ret;
__qseecom_enable_clk(CLK_QSEE);
if (qseecom.qsee.instance != qseecom.ce_drv.instance)
__qseecom_enable_clk(CLK_CE_DRV);
if (qseecom.qsee.instance != qseecom.ce_drv.instance) {
ret = __qseecom_enable_clk(CLK_CE_DRV);
if (ret)
return ret;
}
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1,
ireq, sizeof(struct qseecom_key_select_ireq),
@ -5270,8 +5353,9 @@ static int __qseecom_update_current_key_user_info(
pr_err("Error:: unsupported usage %d\n", usage);
return -EFAULT;
}
__qseecom_enable_clk(CLK_QSEE);
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
return ret;
ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1,
ireq, sizeof(struct qseecom_key_userinfo_update_ireq),
@ -5749,7 +5833,9 @@ static int qseecom_mdtp_cipher_dip(void __user *argp)
desc.args[3] = req.out_buf_size;
desc.args[4] = req.direction;
__qseecom_enable_clk(CLK_QSEE);
ret = __qseecom_enable_clk(CLK_QSEE);
if (ret)
break;
ret = scm_call2(TZ_MDTP_CIPHER_DIP_ID, &desc);
@ -5936,7 +6022,7 @@ static int __qseecom_update_qteec_req_buf(struct qseecom_qteec_modfd_req *req,
}
/* Populate the cmd data structure with the phys_addr */
sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle);
if (sg_ptr == NULL) {
if (IS_ERR_OR_NULL(sg_ptr)) {
pr_err("IOn client could not retrieve sg table\n");
goto err;
}
@ -5992,13 +6078,21 @@ static int __qseecom_update_qteec_req_buf(struct qseecom_qteec_modfd_req *req,
}
clean:
if (cleanup) {
msm_ion_do_cache_op(qseecom.ion_clnt,
ret = msm_ion_do_cache_op(qseecom.ion_clnt,
ihandle, NULL, sg->length,
ION_IOC_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto err;
}
} else {
msm_ion_do_cache_op(qseecom.ion_clnt,
ret = msm_ion_do_cache_op(qseecom.ion_clnt,
ihandle, NULL, sg->length,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
goto err;
}
data->sglistinfo_ptr[i].indexAndFlags =
SGLISTINFO_SET_INDEX_FLAG(
(sg_ptr->nents == 1), 0,
@ -6113,10 +6207,14 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data,
*(uint32_t *)cmd_buf = cmd_id;
reqd_len_sb_in = req->req_len + req->resp_len;
msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt,
reqd_len_sb_in,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
return ret;
}
__qseecom_reentrancy_check_if_this_app_blocked(ptr_app);
@ -6147,9 +6245,13 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data,
}
}
}
msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt, data->client.sb_length,
ION_IOC_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
return ret;
}
if ((cmd_id == QSEOS_TEE_OPEN_SESSION) ||
(cmd_id == QSEOS_TEE_REQUEST_CANCELLATION)) {
@ -6295,10 +6397,14 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data,
else
*(uint32_t *)cmd_buf = QSEOS_TEE_INVOKE_COMMAND;
msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt,
reqd_len_sb_in,
ION_IOC_CLEAN_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
return ret;
}
__qseecom_reentrancy_check_if_this_app_blocked(ptr_app);
@ -6333,9 +6439,13 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data,
if (ret)
return ret;
msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle,
data->client.sb_virt, data->client.sb_length,
ION_IOC_INV_CACHES);
if (ret) {
pr_err("cache operation failed %d\n", ret);
return ret;
}
return 0;
}