Loading drivers/misc/qseecom.c +62 −33 Original line number Original line Diff line number Diff line Loading @@ -428,6 +428,29 @@ static int get_qseecom_keymaster_status(char *str) } } __setup("androidboot.keymaster=", get_qseecom_keymaster_status); __setup("androidboot.keymaster=", get_qseecom_keymaster_status); #define QSEECOM_SCM_EBUSY_WAIT_MS 30 #define QSEECOM_SCM_EBUSY_MAX_RETRY 67 static int __qseecom_scm_call2_locked(uint32_t smc_id, struct scm_desc *desc) { int ret = 0; int retry_count = 0; do { ret = scm_call2_noretry(smc_id, desc); if (ret == -EBUSY) { mutex_unlock(&app_access_lock); msleep(QSEECOM_SCM_EBUSY_WAIT_MS); mutex_lock(&app_access_lock); } if (retry_count == 33) pr_warn("secure world has been busy for 1 second!\n"); } while (ret == -EBUSY && (retry_count++ < QSEECOM_SCM_EBUSY_MAX_RETRY)); return ret; } static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, const void *req_buf, void *resp_buf) const void *req_buf, void *resp_buf) { { Loading Loading @@ -455,7 +478,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, svc_id, tz_cmd_id); svc_id, tz_cmd_id); return -EINVAL; return -EINVAL; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case SCM_SVC_ES: { case SCM_SVC_ES: { Loading @@ -478,7 +501,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = p_hash_req->partition_id; desc.args[0] = p_hash_req->partition_id; desc.args[1] = virt_to_phys(tzbuf); desc.args[1] = virt_to_phys(tzbuf); desc.args[2] = SHA256_DIGEST_LENGTH; desc.args[2] = SHA256_DIGEST_LENGTH; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading Loading @@ -513,7 +536,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[2] = req_64bit->phy_addr; desc.args[2] = req_64bit->phy_addr; } } __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_APP_SHUTDOWN_COMMAND: { case QSEOS_APP_SHUTDOWN_COMMAND: { Loading @@ -523,7 +546,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, smc_id = TZ_OS_APP_SHUTDOWN_ID; smc_id = TZ_OS_APP_SHUTDOWN_ID; desc.arginfo = TZ_OS_APP_SHUTDOWN_ID_PARAM_ID; desc.arginfo = TZ_OS_APP_SHUTDOWN_ID_PARAM_ID; desc.args[0] = req->app_id; desc.args[0] = req->app_id; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_APP_LOOKUP_COMMAND: { case QSEOS_APP_LOOKUP_COMMAND: { Loading @@ -542,7 +565,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = strlen(req->app_name); desc.args[1] = strlen(req->app_name); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -566,7 +589,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[1] = req_64bit->size; desc.args[1] = req_64bit->size; } } __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_LOAD_SERV_IMAGE_COMMAND: { case QSEOS_LOAD_SERV_IMAGE_COMMAND: { Loading @@ -590,14 +613,14 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[2] = req_64bit->phy_addr; desc.args[2] = req_64bit->phy_addr; } } __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_UNLOAD_SERV_IMAGE_COMMAND: { case QSEOS_UNLOAD_SERV_IMAGE_COMMAND: { smc_id = TZ_OS_UNLOAD_SERVICES_IMAGE_ID; smc_id = TZ_OS_UNLOAD_SERVICES_IMAGE_ID; desc.arginfo = TZ_OS_UNLOAD_SERVICES_IMAGE_ID_PARAM_ID; desc.arginfo = TZ_OS_UNLOAD_SERVICES_IMAGE_ID_PARAM_ID; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_REGISTER_LISTENER: { case QSEOS_REGISTER_LISTENER: { Loading @@ -622,12 +645,12 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, } } qseecom.smcinvoke_support = true; qseecom.smcinvoke_support = true; smc_id = TZ_OS_REGISTER_LISTENER_SMCINVOKE_ID; smc_id = TZ_OS_REGISTER_LISTENER_SMCINVOKE_ID; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); if (ret == -EIO) { if (ret == -EIO) { /* smcinvoke is not supported */ /* smcinvoke is not supported */ qseecom.smcinvoke_support = false; qseecom.smcinvoke_support = false; smc_id = TZ_OS_REGISTER_LISTENER_ID; smc_id = TZ_OS_REGISTER_LISTENER_ID; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); } } break; break; } } Loading @@ -639,7 +662,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, smc_id = TZ_OS_DEREGISTER_LISTENER_ID; smc_id = TZ_OS_DEREGISTER_LISTENER_ID; desc.arginfo = TZ_OS_DEREGISTER_LISTENER_ID_PARAM_ID; desc.arginfo = TZ_OS_DEREGISTER_LISTENER_ID_PARAM_ID; desc.args[0] = req->listener_id; desc.args[0] = req->listener_id; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_LISTENER_DATA_RSP_COMMAND: { case QSEOS_LISTENER_DATA_RSP_COMMAND: { Loading @@ -652,7 +675,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, TZ_OS_LISTENER_RESPONSE_HANDLER_ID_PARAM_ID; TZ_OS_LISTENER_RESPONSE_HANDLER_ID_PARAM_ID; desc.args[0] = req->listener_id; desc.args[0] = req->listener_id; desc.args[1] = req->status; desc.args[1] = req->status; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST: { case QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST: { Loading Loading @@ -680,7 +703,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[2] = req_64->sglistinfo_ptr; desc.args[2] = req_64->sglistinfo_ptr; desc.args[3] = req_64->sglistinfo_len; desc.args[3] = req_64->sglistinfo_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_LOAD_EXTERNAL_ELF_COMMAND: { case QSEOS_LOAD_EXTERNAL_ELF_COMMAND: { Loading @@ -702,14 +725,14 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[2] = req_64bit->phy_addr; desc.args[2] = req_64bit->phy_addr; } } __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_UNLOAD_EXTERNAL_ELF_COMMAND: { case QSEOS_UNLOAD_EXTERNAL_ELF_COMMAND: { smc_id = TZ_OS_UNLOAD_EXTERNAL_IMAGE_ID; smc_id = TZ_OS_UNLOAD_EXTERNAL_IMAGE_ID; desc.arginfo = TZ_OS_UNLOAD_SERVICES_IMAGE_ID_PARAM_ID; desc.arginfo = TZ_OS_UNLOAD_SERVICES_IMAGE_ID_PARAM_ID; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } Loading Loading @@ -737,7 +760,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->rsp_ptr; desc.args[3] = req_64bit->rsp_ptr; desc.args[4] = req_64bit->rsp_len; desc.args[4] = req_64bit->rsp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST: { case QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST: { Loading Loading @@ -769,7 +792,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[6] = req_64bit->sglistinfo_len; desc.args[6] = req_64bit->sglistinfo_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_RPMB_PROVISION_KEY_COMMAND: { case QSEOS_RPMB_PROVISION_KEY_COMMAND: { Loading @@ -781,21 +804,21 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.arginfo = TZ_OS_RPMB_PROVISION_KEY_ID_PARAM_ID; desc.arginfo = TZ_OS_RPMB_PROVISION_KEY_ID_PARAM_ID; desc.args[0] = req->key_type; desc.args[0] = req->key_type; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_RPMB_ERASE_COMMAND: { case QSEOS_RPMB_ERASE_COMMAND: { smc_id = TZ_OS_RPMB_ERASE_ID; smc_id = TZ_OS_RPMB_ERASE_ID; desc.arginfo = TZ_OS_RPMB_ERASE_ID_PARAM_ID; desc.arginfo = TZ_OS_RPMB_ERASE_ID_PARAM_ID; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND: { case QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND: { smc_id = TZ_OS_RPMB_CHECK_PROV_STATUS_ID; smc_id = TZ_OS_RPMB_CHECK_PROV_STATUS_ID; desc.arginfo = TZ_OS_RPMB_CHECK_PROV_STATUS_ID_PARAM_ID; desc.arginfo = TZ_OS_RPMB_CHECK_PROV_STATUS_ID_PARAM_ID; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_GENERATE_KEY: { case QSEOS_GENERATE_KEY: { Loading @@ -816,7 +839,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = tzbuflen; desc.args[1] = tzbuflen; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -838,7 +861,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = tzbuflen; desc.args[1] = tzbuflen; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -860,7 +883,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = tzbuflen; desc.args[1] = tzbuflen; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -882,7 +905,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = tzbuflen; desc.args[1] = tzbuflen; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -908,7 +931,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->resp_ptr; desc.args[3] = req_64bit->resp_ptr; desc.args[4] = req_64bit->resp_len; desc.args[4] = req_64bit->resp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_OPEN_SESSION_WHITELIST: { case QSEOS_TEE_OPEN_SESSION_WHITELIST: { Loading Loading @@ -938,7 +961,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[6] = req_64bit->sglistinfo_len; desc.args[6] = req_64bit->sglistinfo_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_INVOKE_COMMAND: { case QSEOS_TEE_INVOKE_COMMAND: { Loading @@ -963,7 +986,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->resp_ptr; desc.args[3] = req_64bit->resp_ptr; desc.args[4] = req_64bit->resp_len; desc.args[4] = req_64bit->resp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_INVOKE_COMMAND_WHITELIST: { case QSEOS_TEE_INVOKE_COMMAND_WHITELIST: { Loading Loading @@ -993,7 +1016,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[6] = req_64bit->sglistinfo_len; desc.args[6] = req_64bit->sglistinfo_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_CLOSE_SESSION: { case QSEOS_TEE_CLOSE_SESSION: { Loading @@ -1018,7 +1041,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->resp_ptr; desc.args[3] = req_64bit->resp_ptr; desc.args[4] = req_64bit->resp_len; desc.args[4] = req_64bit->resp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_REQUEST_CANCELLATION: { case QSEOS_TEE_REQUEST_CANCELLATION: { Loading @@ -1044,7 +1067,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->resp_ptr; desc.args[3] = req_64bit->resp_ptr; desc.args[4] = req_64bit->resp_len; desc.args[4] = req_64bit->resp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_CONTINUE_BLOCKED_REQ_COMMAND: { case QSEOS_CONTINUE_BLOCKED_REQ_COMMAND: { Loading @@ -1059,7 +1082,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.arginfo = desc.arginfo = TZ_OS_CONTINUE_BLOCKED_REQUEST_ID_PARAM_ID; TZ_OS_CONTINUE_BLOCKED_REQUEST_ID_PARAM_ID; desc.args[0] = req->app_or_session_id; desc.args[0] = req->app_or_session_id; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } default: { default: { Loading Loading @@ -6527,7 +6550,7 @@ static int qseecom_mdtp_cipher_dip(void __user *argp) if (ret) if (ret) break; break; ret = scm_call2(TZ_MDTP_CIPHER_DIP_ID, &desc); ret = __qseecom_scm_call2_locked(TZ_MDTP_CIPHER_DIP_ID, &desc); __qseecom_disable_clk(CLK_QSEE); __qseecom_disable_clk(CLK_QSEE); Loading Loading @@ -8730,8 +8753,10 @@ static int qseecom_check_whitelist_feature(void) desc.args[0] = FEATURE_ID_WHITELIST; desc.args[0] = FEATURE_ID_WHITELIST; desc.arginfo = SCM_ARGS(1); desc.arginfo = SCM_ARGS(1); ret = scm_call2(SCM_SIP_FNID(SCM_SVC_INFO, mutex_lock(&app_access_lock); ret = __qseecom_scm_call2_locked(SCM_SIP_FNID(SCM_SVC_INFO, GET_FEAT_VERSION_CMD), &desc); GET_FEAT_VERSION_CMD), &desc); mutex_unlock(&app_access_lock); if (!ret) if (!ret) version = desc.ret[0]; version = desc.ret[0]; Loading Loading @@ -8814,8 +8839,10 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.send_resp_flag = 0; qseecom.send_resp_flag = 0; qseecom.qsee_version = QSEEE_VERSION_00; qseecom.qsee_version = QSEEE_VERSION_00; mutex_lock(&app_access_lock); rc = qseecom_scm_call(6, 3, &feature, sizeof(feature), rc = qseecom_scm_call(6, 3, &feature, sizeof(feature), &resp, sizeof(resp)); &resp, sizeof(resp)); mutex_unlock(&app_access_lock); pr_info("qseecom.qsee_version = 0x%x\n", resp.result); pr_info("qseecom.qsee_version = 0x%x\n", resp.result); if (rc) { if (rc) { pr_err("Failed to get QSEE version info %d\n", rc); pr_err("Failed to get QSEE version info %d\n", rc); Loading Loading @@ -8968,9 +8995,11 @@ static int qseecom_probe(struct platform_device *pdev) rc = -EIO; rc = -EIO; goto exit_deinit_clock; goto exit_deinit_clock; } } mutex_lock(&app_access_lock); rc = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, rc = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, cmd_buf, cmd_len, &resp, sizeof(resp)); &resp, sizeof(resp)); mutex_unlock(&app_access_lock); __qseecom_disable_clk(CLK_QSEE); __qseecom_disable_clk(CLK_QSEE); if (rc || (resp.result != QSEOS_RESULT_SUCCESS)) { if (rc || (resp.result != QSEOS_RESULT_SUCCESS)) { pr_err("send secapp reg fail %d resp.res %d\n", pr_err("send secapp reg fail %d resp.res %d\n", Loading Loading
drivers/misc/qseecom.c +62 −33 Original line number Original line Diff line number Diff line Loading @@ -428,6 +428,29 @@ static int get_qseecom_keymaster_status(char *str) } } __setup("androidboot.keymaster=", get_qseecom_keymaster_status); __setup("androidboot.keymaster=", get_qseecom_keymaster_status); #define QSEECOM_SCM_EBUSY_WAIT_MS 30 #define QSEECOM_SCM_EBUSY_MAX_RETRY 67 static int __qseecom_scm_call2_locked(uint32_t smc_id, struct scm_desc *desc) { int ret = 0; int retry_count = 0; do { ret = scm_call2_noretry(smc_id, desc); if (ret == -EBUSY) { mutex_unlock(&app_access_lock); msleep(QSEECOM_SCM_EBUSY_WAIT_MS); mutex_lock(&app_access_lock); } if (retry_count == 33) pr_warn("secure world has been busy for 1 second!\n"); } while (ret == -EBUSY && (retry_count++ < QSEECOM_SCM_EBUSY_MAX_RETRY)); return ret; } static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, const void *req_buf, void *resp_buf) const void *req_buf, void *resp_buf) { { Loading Loading @@ -455,7 +478,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, svc_id, tz_cmd_id); svc_id, tz_cmd_id); return -EINVAL; return -EINVAL; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case SCM_SVC_ES: { case SCM_SVC_ES: { Loading @@ -478,7 +501,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = p_hash_req->partition_id; desc.args[0] = p_hash_req->partition_id; desc.args[1] = virt_to_phys(tzbuf); desc.args[1] = virt_to_phys(tzbuf); desc.args[2] = SHA256_DIGEST_LENGTH; desc.args[2] = SHA256_DIGEST_LENGTH; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading Loading @@ -513,7 +536,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[2] = req_64bit->phy_addr; desc.args[2] = req_64bit->phy_addr; } } __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_APP_SHUTDOWN_COMMAND: { case QSEOS_APP_SHUTDOWN_COMMAND: { Loading @@ -523,7 +546,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, smc_id = TZ_OS_APP_SHUTDOWN_ID; smc_id = TZ_OS_APP_SHUTDOWN_ID; desc.arginfo = TZ_OS_APP_SHUTDOWN_ID_PARAM_ID; desc.arginfo = TZ_OS_APP_SHUTDOWN_ID_PARAM_ID; desc.args[0] = req->app_id; desc.args[0] = req->app_id; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_APP_LOOKUP_COMMAND: { case QSEOS_APP_LOOKUP_COMMAND: { Loading @@ -542,7 +565,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = strlen(req->app_name); desc.args[1] = strlen(req->app_name); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -566,7 +589,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[1] = req_64bit->size; desc.args[1] = req_64bit->size; } } __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_LOAD_SERV_IMAGE_COMMAND: { case QSEOS_LOAD_SERV_IMAGE_COMMAND: { Loading @@ -590,14 +613,14 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[2] = req_64bit->phy_addr; desc.args[2] = req_64bit->phy_addr; } } __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_UNLOAD_SERV_IMAGE_COMMAND: { case QSEOS_UNLOAD_SERV_IMAGE_COMMAND: { smc_id = TZ_OS_UNLOAD_SERVICES_IMAGE_ID; smc_id = TZ_OS_UNLOAD_SERVICES_IMAGE_ID; desc.arginfo = TZ_OS_UNLOAD_SERVICES_IMAGE_ID_PARAM_ID; desc.arginfo = TZ_OS_UNLOAD_SERVICES_IMAGE_ID_PARAM_ID; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_REGISTER_LISTENER: { case QSEOS_REGISTER_LISTENER: { Loading @@ -622,12 +645,12 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, } } qseecom.smcinvoke_support = true; qseecom.smcinvoke_support = true; smc_id = TZ_OS_REGISTER_LISTENER_SMCINVOKE_ID; smc_id = TZ_OS_REGISTER_LISTENER_SMCINVOKE_ID; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); if (ret == -EIO) { if (ret == -EIO) { /* smcinvoke is not supported */ /* smcinvoke is not supported */ qseecom.smcinvoke_support = false; qseecom.smcinvoke_support = false; smc_id = TZ_OS_REGISTER_LISTENER_ID; smc_id = TZ_OS_REGISTER_LISTENER_ID; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); } } break; break; } } Loading @@ -639,7 +662,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, smc_id = TZ_OS_DEREGISTER_LISTENER_ID; smc_id = TZ_OS_DEREGISTER_LISTENER_ID; desc.arginfo = TZ_OS_DEREGISTER_LISTENER_ID_PARAM_ID; desc.arginfo = TZ_OS_DEREGISTER_LISTENER_ID_PARAM_ID; desc.args[0] = req->listener_id; desc.args[0] = req->listener_id; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_LISTENER_DATA_RSP_COMMAND: { case QSEOS_LISTENER_DATA_RSP_COMMAND: { Loading @@ -652,7 +675,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, TZ_OS_LISTENER_RESPONSE_HANDLER_ID_PARAM_ID; TZ_OS_LISTENER_RESPONSE_HANDLER_ID_PARAM_ID; desc.args[0] = req->listener_id; desc.args[0] = req->listener_id; desc.args[1] = req->status; desc.args[1] = req->status; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST: { case QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST: { Loading Loading @@ -680,7 +703,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[2] = req_64->sglistinfo_ptr; desc.args[2] = req_64->sglistinfo_ptr; desc.args[3] = req_64->sglistinfo_len; desc.args[3] = req_64->sglistinfo_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_LOAD_EXTERNAL_ELF_COMMAND: { case QSEOS_LOAD_EXTERNAL_ELF_COMMAND: { Loading @@ -702,14 +725,14 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[2] = req_64bit->phy_addr; desc.args[2] = req_64bit->phy_addr; } } __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_UNLOAD_EXTERNAL_ELF_COMMAND: { case QSEOS_UNLOAD_EXTERNAL_ELF_COMMAND: { smc_id = TZ_OS_UNLOAD_EXTERNAL_IMAGE_ID; smc_id = TZ_OS_UNLOAD_EXTERNAL_IMAGE_ID; desc.arginfo = TZ_OS_UNLOAD_SERVICES_IMAGE_ID_PARAM_ID; desc.arginfo = TZ_OS_UNLOAD_SERVICES_IMAGE_ID_PARAM_ID; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } Loading Loading @@ -737,7 +760,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->rsp_ptr; desc.args[3] = req_64bit->rsp_ptr; desc.args[4] = req_64bit->rsp_len; desc.args[4] = req_64bit->rsp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST: { case QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST: { Loading Loading @@ -769,7 +792,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[6] = req_64bit->sglistinfo_len; desc.args[6] = req_64bit->sglistinfo_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_RPMB_PROVISION_KEY_COMMAND: { case QSEOS_RPMB_PROVISION_KEY_COMMAND: { Loading @@ -781,21 +804,21 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.arginfo = TZ_OS_RPMB_PROVISION_KEY_ID_PARAM_ID; desc.arginfo = TZ_OS_RPMB_PROVISION_KEY_ID_PARAM_ID; desc.args[0] = req->key_type; desc.args[0] = req->key_type; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_RPMB_ERASE_COMMAND: { case QSEOS_RPMB_ERASE_COMMAND: { smc_id = TZ_OS_RPMB_ERASE_ID; smc_id = TZ_OS_RPMB_ERASE_ID; desc.arginfo = TZ_OS_RPMB_ERASE_ID_PARAM_ID; desc.arginfo = TZ_OS_RPMB_ERASE_ID_PARAM_ID; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND: { case QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND: { smc_id = TZ_OS_RPMB_CHECK_PROV_STATUS_ID; smc_id = TZ_OS_RPMB_CHECK_PROV_STATUS_ID; desc.arginfo = TZ_OS_RPMB_CHECK_PROV_STATUS_ID_PARAM_ID; desc.arginfo = TZ_OS_RPMB_CHECK_PROV_STATUS_ID_PARAM_ID; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_GENERATE_KEY: { case QSEOS_GENERATE_KEY: { Loading @@ -816,7 +839,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = tzbuflen; desc.args[1] = tzbuflen; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -838,7 +861,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = tzbuflen; desc.args[1] = tzbuflen; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -860,7 +883,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = tzbuflen; desc.args[1] = tzbuflen; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -882,7 +905,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[0] = virt_to_phys(tzbuf); desc.args[0] = virt_to_phys(tzbuf); desc.args[1] = tzbuflen; desc.args[1] = tzbuflen; __qseecom_reentrancy_check_if_no_app_blocked(smc_id); __qseecom_reentrancy_check_if_no_app_blocked(smc_id); ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); kzfree(tzbuf); kzfree(tzbuf); break; break; } } Loading @@ -908,7 +931,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->resp_ptr; desc.args[3] = req_64bit->resp_ptr; desc.args[4] = req_64bit->resp_len; desc.args[4] = req_64bit->resp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_OPEN_SESSION_WHITELIST: { case QSEOS_TEE_OPEN_SESSION_WHITELIST: { Loading Loading @@ -938,7 +961,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[6] = req_64bit->sglistinfo_len; desc.args[6] = req_64bit->sglistinfo_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_INVOKE_COMMAND: { case QSEOS_TEE_INVOKE_COMMAND: { Loading @@ -963,7 +986,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->resp_ptr; desc.args[3] = req_64bit->resp_ptr; desc.args[4] = req_64bit->resp_len; desc.args[4] = req_64bit->resp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_INVOKE_COMMAND_WHITELIST: { case QSEOS_TEE_INVOKE_COMMAND_WHITELIST: { Loading Loading @@ -993,7 +1016,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[5] = req_64bit->sglistinfo_ptr; desc.args[6] = req_64bit->sglistinfo_len; desc.args[6] = req_64bit->sglistinfo_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_CLOSE_SESSION: { case QSEOS_TEE_CLOSE_SESSION: { Loading @@ -1018,7 +1041,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->resp_ptr; desc.args[3] = req_64bit->resp_ptr; desc.args[4] = req_64bit->resp_len; desc.args[4] = req_64bit->resp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_TEE_REQUEST_CANCELLATION: { case QSEOS_TEE_REQUEST_CANCELLATION: { Loading @@ -1044,7 +1067,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.args[3] = req_64bit->resp_ptr; desc.args[3] = req_64bit->resp_ptr; desc.args[4] = req_64bit->resp_len; desc.args[4] = req_64bit->resp_len; } } ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } case QSEOS_CONTINUE_BLOCKED_REQ_COMMAND: { case QSEOS_CONTINUE_BLOCKED_REQ_COMMAND: { Loading @@ -1059,7 +1082,7 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, desc.arginfo = desc.arginfo = TZ_OS_CONTINUE_BLOCKED_REQUEST_ID_PARAM_ID; TZ_OS_CONTINUE_BLOCKED_REQUEST_ID_PARAM_ID; desc.args[0] = req->app_or_session_id; desc.args[0] = req->app_or_session_id; ret = scm_call2(smc_id, &desc); ret = __qseecom_scm_call2_locked(smc_id, &desc); break; break; } } default: { default: { Loading Loading @@ -6527,7 +6550,7 @@ static int qseecom_mdtp_cipher_dip(void __user *argp) if (ret) if (ret) break; break; ret = scm_call2(TZ_MDTP_CIPHER_DIP_ID, &desc); ret = __qseecom_scm_call2_locked(TZ_MDTP_CIPHER_DIP_ID, &desc); __qseecom_disable_clk(CLK_QSEE); __qseecom_disable_clk(CLK_QSEE); Loading Loading @@ -8730,8 +8753,10 @@ static int qseecom_check_whitelist_feature(void) desc.args[0] = FEATURE_ID_WHITELIST; desc.args[0] = FEATURE_ID_WHITELIST; desc.arginfo = SCM_ARGS(1); desc.arginfo = SCM_ARGS(1); ret = scm_call2(SCM_SIP_FNID(SCM_SVC_INFO, mutex_lock(&app_access_lock); ret = __qseecom_scm_call2_locked(SCM_SIP_FNID(SCM_SVC_INFO, GET_FEAT_VERSION_CMD), &desc); GET_FEAT_VERSION_CMD), &desc); mutex_unlock(&app_access_lock); if (!ret) if (!ret) version = desc.ret[0]; version = desc.ret[0]; Loading Loading @@ -8814,8 +8839,10 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.send_resp_flag = 0; qseecom.send_resp_flag = 0; qseecom.qsee_version = QSEEE_VERSION_00; qseecom.qsee_version = QSEEE_VERSION_00; mutex_lock(&app_access_lock); rc = qseecom_scm_call(6, 3, &feature, sizeof(feature), rc = qseecom_scm_call(6, 3, &feature, sizeof(feature), &resp, sizeof(resp)); &resp, sizeof(resp)); mutex_unlock(&app_access_lock); pr_info("qseecom.qsee_version = 0x%x\n", resp.result); pr_info("qseecom.qsee_version = 0x%x\n", resp.result); if (rc) { if (rc) { pr_err("Failed to get QSEE version info %d\n", rc); pr_err("Failed to get QSEE version info %d\n", rc); Loading Loading @@ -8968,9 +8995,11 @@ static int qseecom_probe(struct platform_device *pdev) rc = -EIO; rc = -EIO; goto exit_deinit_clock; goto exit_deinit_clock; } } mutex_lock(&app_access_lock); rc = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, rc = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, cmd_buf, cmd_len, &resp, sizeof(resp)); &resp, sizeof(resp)); mutex_unlock(&app_access_lock); __qseecom_disable_clk(CLK_QSEE); __qseecom_disable_clk(CLK_QSEE); if (rc || (resp.result != QSEOS_RESULT_SUCCESS)) { if (rc || (resp.result != QSEOS_RESULT_SUCCESS)) { pr_err("send secapp reg fail %d resp.res %d\n", pr_err("send secapp reg fail %d resp.res %d\n", Loading