Loading drivers/misc/qseecom.c +199 −63 Original line number Diff line number Diff line Loading @@ -1293,9 +1293,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); } } Loading Loading @@ -1603,12 +1605,21 @@ static int __qseecom_qseos_fail_return_resp_tz(struct qseecom_dev_handle *data, 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, 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)); if (ret) { Loading Loading @@ -1764,13 +1775,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); 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)); Loading Loading @@ -2005,13 +2025,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); 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)); Loading Loading @@ -2296,8 +2324,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; } /* SCM_CALL to load the app and get the app_id back */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, Loading Loading @@ -2775,15 +2807,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) { Loading @@ -2795,7 +2828,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; Loading Loading @@ -3028,10 +3067,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); Loading Loading @@ -3062,9 +3105,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; } Loading Loading @@ -3176,7 +3221,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; } Loading Loading @@ -3284,13 +3329,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 = Loading Loading @@ -3431,7 +3484,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; } Loading Loading @@ -3514,13 +3567,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 = Loading Loading @@ -4009,9 +4070,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; } /* SCM_CALL to load the image */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, Loading Loading @@ -4125,9 +4190,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, Loading Loading @@ -4693,9 +4762,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); Loading Loading @@ -5008,9 +5078,12 @@ 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); 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)); Loading Loading @@ -5256,7 +5329,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), Loading Loading @@ -5314,7 +5389,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), Loading Loading @@ -5373,10 +5450,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), Loading Loading @@ -5451,8 +5533,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), Loading Loading @@ -5989,7 +6072,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); Loading Loading @@ -6176,7 +6261,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; } Loading Loading @@ -6232,13 +6317,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, Loading Loading @@ -6351,10 +6444,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); Loading Loading @@ -6385,9 +6482,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)) { Loading Loading @@ -6531,10 +6632,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); Loading Loading @@ -6569,9 +6674,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; } Loading Loading @@ -8120,11 +8229,12 @@ static int qseecom_check_whitelist_feature(void) static int qseecom_probe(struct platform_device *pdev) { int rc; int ret = 0; int i; uint32_t feature = 10; struct device *class_dev; struct msm_bus_scale_pdata *qseecom_platform_support = NULL; struct qseecom_command_scm_resp resp; struct qseecom_ce_info_use *pce_info_use = NULL; qseecom.qsee_bw_count = 0; qseecom.qsee_perf_client = 0; Loading Loading @@ -8166,7 +8276,7 @@ static int qseecom_probe(struct platform_device *pdev) class_dev = device_create(driver_class, NULL, qseecom_device_no, NULL, QSEECOM_DEV); if (!class_dev) { if (IS_ERR(class_dev)) { pr_err("class_device_create failed %d\n", rc); rc = -ENOMEM; goto exit_destroy_class; Loading Loading @@ -8205,7 +8315,7 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.pdev = class_dev; /* Create ION msm client */ qseecom.ion_clnt = msm_ion_client_create("qseecom-kernel"); if (qseecom.ion_clnt == NULL) { if (IS_ERR_OR_NULL(qseecom.ion_clnt)) { pr_err("Ion client cannot be created\n"); rc = -ENOMEM; goto exit_del_cdev; Loading Loading @@ -8267,14 +8377,14 @@ static int qseecom_probe(struct platform_device *pdev) pr_debug("CE operating frequency is not defined, setting to default 100MHZ\n"); qseecom.ce_opp_freq_hz = QSEE_CE_CLK_100MHZ; } ret = __qseecom_init_clk(CLK_QSEE); if (ret) rc = __qseecom_init_clk(CLK_QSEE); if (rc) goto exit_destroy_ion_client; if ((qseecom.qsee.instance != qseecom.ce_drv.instance) && (qseecom.support_pfe || qseecom.support_fde)) { ret = __qseecom_init_clk(CLK_CE_DRV); if (ret) { rc = __qseecom_init_clk(CLK_CE_DRV); if (rc) { __qseecom_deinit_clk(CLK_QSEE); goto exit_destroy_ion_client; } Loading Loading @@ -8328,9 +8438,14 @@ static int qseecom_probe(struct platform_device *pdev) } else { pr_err("Fail to get secure app region info\n"); rc = -EINVAL; goto exit_destroy_ion_client; goto exit_deinit_clock; } rc = __qseecom_enable_clk(CLK_QSEE); if (rc) { pr_err("CLK_QSEE enabling failed (%d)\n", rc); rc = -EIO; goto exit_deinit_clock; } __qseecom_enable_clk(CLK_QSEE); rc = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, &resp, sizeof(resp)); Loading @@ -8339,7 +8454,7 @@ static int qseecom_probe(struct platform_device *pdev) pr_err("send secapp reg fail %d resp.res %d\n", rc, resp.result); rc = -EINVAL; goto exit_destroy_ion_client; goto exit_deinit_clock; } } /* Loading Loading @@ -8375,7 +8490,28 @@ static int qseecom_probe(struct platform_device *pdev) atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_READY); return 0; exit_deinit_clock: __qseecom_deinit_clk(CLK_QSEE); if ((qseecom.qsee.instance != qseecom.ce_drv.instance) && (qseecom.support_pfe || qseecom.support_fde)) __qseecom_deinit_clk(CLK_CE_DRV); exit_destroy_ion_client: if (qseecom.ce_info.fde) { pce_info_use = qseecom.ce_info.fde; for (i = 0; i < qseecom.ce_info.num_fde; i++) { kzfree(pce_info_use->ce_pipe_entry); pce_info_use++; } kfree(qseecom.ce_info.fde); } if (qseecom.ce_info.pfe) { pce_info_use = qseecom.ce_info.pfe; for (i = 0; i < qseecom.ce_info.num_pfe; i++) { kzfree(pce_info_use->ce_pipe_entry); pce_info_use++; } kfree(qseecom.ce_info.pfe); } ion_client_destroy(qseecom.ion_clnt); exit_del_cdev: cdev_del(&qseecom.cdev); Loading Loading
drivers/misc/qseecom.c +199 −63 Original line number Diff line number Diff line Loading @@ -1293,9 +1293,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); } } Loading Loading @@ -1603,12 +1605,21 @@ static int __qseecom_qseos_fail_return_resp_tz(struct qseecom_dev_handle *data, 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, 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)); if (ret) { Loading Loading @@ -1764,13 +1775,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); 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)); Loading Loading @@ -2005,13 +2025,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); 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)); Loading Loading @@ -2296,8 +2324,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; } /* SCM_CALL to load the app and get the app_id back */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, Loading Loading @@ -2775,15 +2807,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) { Loading @@ -2795,7 +2828,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; Loading Loading @@ -3028,10 +3067,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); Loading Loading @@ -3062,9 +3105,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; } Loading Loading @@ -3176,7 +3221,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; } Loading Loading @@ -3284,13 +3329,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 = Loading Loading @@ -3431,7 +3484,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; } Loading Loading @@ -3514,13 +3567,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 = Loading Loading @@ -4009,9 +4070,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; } /* SCM_CALL to load the image */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, Loading Loading @@ -4125,9 +4190,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, Loading Loading @@ -4693,9 +4762,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); Loading Loading @@ -5008,9 +5078,12 @@ 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); 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)); Loading Loading @@ -5256,7 +5329,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), Loading Loading @@ -5314,7 +5389,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), Loading Loading @@ -5373,10 +5450,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), Loading Loading @@ -5451,8 +5533,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), Loading Loading @@ -5989,7 +6072,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); Loading Loading @@ -6176,7 +6261,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; } Loading Loading @@ -6232,13 +6317,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, Loading Loading @@ -6351,10 +6444,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); Loading Loading @@ -6385,9 +6482,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)) { Loading Loading @@ -6531,10 +6632,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); Loading Loading @@ -6569,9 +6674,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; } Loading Loading @@ -8120,11 +8229,12 @@ static int qseecom_check_whitelist_feature(void) static int qseecom_probe(struct platform_device *pdev) { int rc; int ret = 0; int i; uint32_t feature = 10; struct device *class_dev; struct msm_bus_scale_pdata *qseecom_platform_support = NULL; struct qseecom_command_scm_resp resp; struct qseecom_ce_info_use *pce_info_use = NULL; qseecom.qsee_bw_count = 0; qseecom.qsee_perf_client = 0; Loading Loading @@ -8166,7 +8276,7 @@ static int qseecom_probe(struct platform_device *pdev) class_dev = device_create(driver_class, NULL, qseecom_device_no, NULL, QSEECOM_DEV); if (!class_dev) { if (IS_ERR(class_dev)) { pr_err("class_device_create failed %d\n", rc); rc = -ENOMEM; goto exit_destroy_class; Loading Loading @@ -8205,7 +8315,7 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.pdev = class_dev; /* Create ION msm client */ qseecom.ion_clnt = msm_ion_client_create("qseecom-kernel"); if (qseecom.ion_clnt == NULL) { if (IS_ERR_OR_NULL(qseecom.ion_clnt)) { pr_err("Ion client cannot be created\n"); rc = -ENOMEM; goto exit_del_cdev; Loading Loading @@ -8267,14 +8377,14 @@ static int qseecom_probe(struct platform_device *pdev) pr_debug("CE operating frequency is not defined, setting to default 100MHZ\n"); qseecom.ce_opp_freq_hz = QSEE_CE_CLK_100MHZ; } ret = __qseecom_init_clk(CLK_QSEE); if (ret) rc = __qseecom_init_clk(CLK_QSEE); if (rc) goto exit_destroy_ion_client; if ((qseecom.qsee.instance != qseecom.ce_drv.instance) && (qseecom.support_pfe || qseecom.support_fde)) { ret = __qseecom_init_clk(CLK_CE_DRV); if (ret) { rc = __qseecom_init_clk(CLK_CE_DRV); if (rc) { __qseecom_deinit_clk(CLK_QSEE); goto exit_destroy_ion_client; } Loading Loading @@ -8328,9 +8438,14 @@ static int qseecom_probe(struct platform_device *pdev) } else { pr_err("Fail to get secure app region info\n"); rc = -EINVAL; goto exit_destroy_ion_client; goto exit_deinit_clock; } rc = __qseecom_enable_clk(CLK_QSEE); if (rc) { pr_err("CLK_QSEE enabling failed (%d)\n", rc); rc = -EIO; goto exit_deinit_clock; } __qseecom_enable_clk(CLK_QSEE); rc = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, &resp, sizeof(resp)); Loading @@ -8339,7 +8454,7 @@ static int qseecom_probe(struct platform_device *pdev) pr_err("send secapp reg fail %d resp.res %d\n", rc, resp.result); rc = -EINVAL; goto exit_destroy_ion_client; goto exit_deinit_clock; } } /* Loading Loading @@ -8375,7 +8490,28 @@ static int qseecom_probe(struct platform_device *pdev) atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_READY); return 0; exit_deinit_clock: __qseecom_deinit_clk(CLK_QSEE); if ((qseecom.qsee.instance != qseecom.ce_drv.instance) && (qseecom.support_pfe || qseecom.support_fde)) __qseecom_deinit_clk(CLK_CE_DRV); exit_destroy_ion_client: if (qseecom.ce_info.fde) { pce_info_use = qseecom.ce_info.fde; for (i = 0; i < qseecom.ce_info.num_fde; i++) { kzfree(pce_info_use->ce_pipe_entry); pce_info_use++; } kfree(qseecom.ce_info.fde); } if (qseecom.ce_info.pfe) { pce_info_use = qseecom.ce_info.pfe; for (i = 0; i < qseecom.ce_info.num_pfe; i++) { kzfree(pce_info_use->ce_pipe_entry); pce_info_use++; } kfree(qseecom.ce_info.pfe); } ion_client_destroy(qseecom.ion_clnt); exit_del_cdev: cdev_del(&qseecom.cdev); Loading