Loading drivers/misc/compat_qseecom.c +3 −3 Original line number Diff line number Diff line /* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2015,2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -52,7 +52,7 @@ static int compat_get_qseecom_load_img_req( compat_ulong_t img_len; compat_long_t ifd_data_fd; compat_ulong_t app_arch; compat_int_t app_id; compat_uint_t app_id; err = get_user(mdt_len, &data32->mdt_len); err |= put_user(mdt_len, &data->mdt_len); Loading Loading @@ -164,7 +164,7 @@ static int compat_get_qseecom_qseos_app_load_query( { int err = 0; unsigned int i; compat_int_t app_id; compat_uint_t app_id; char app_name; compat_ulong_t app_arch; Loading drivers/misc/compat_qseecom.h +2 −2 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ struct compat_qseecom_load_img_req { compat_long_t ifd_data_fd; /* in */ char img_name[MAX_APP_NAME_SIZE]; /* in */ compat_ulong_t app_arch; /* in */ compat_int_t app_id; /* out*/ compat_uint_t app_id; /* out*/ }; struct compat_qseecom_set_sb_mem_param_req { Loading @@ -117,7 +117,7 @@ struct compat_qseecom_qseos_version_req { */ struct compat_qseecom_qseos_app_load_query { char app_name[MAX_APP_NAME_SIZE]; /* in */ compat_int_t app_id; /* out */ compat_uint_t app_id; /* out */ compat_ulong_t app_arch; }; Loading drivers/misc/qseecom.c +41 −26 Original line number Diff line number Diff line Loading @@ -2155,7 +2155,8 @@ static void __qseecom_reentrancy_check_if_this_app_blocked( } } static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req) static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req, uint32_t *app_id) { int32_t ret; struct qseecom_command_scm_resp resp; Loading @@ -2163,6 +2164,12 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req) struct qseecom_registered_app_list *entry = NULL; unsigned long flags = 0; if (!app_id) { pr_err("Null pointer to app_id\n"); return -EINVAL; } *app_id = 0; /* check if app exists and has been registered locally */ spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); list_for_each_entry(entry, Loading @@ -2175,7 +2182,8 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req) spin_unlock_irqrestore(&qseecom.registered_app_list_lock, flags); if (found_app) { pr_debug("Found app with id %d\n", entry->app_id); return entry->app_id; *app_id = entry->app_id; return 0; } memset((void *)&resp, 0, sizeof(resp)); Loading @@ -2198,7 +2206,8 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req) pr_err("resp type is of listener type instead of app"); return -EINVAL; case QSEOS_APP_ID: return resp.data; *app_id = resp.data; return 0; default: pr_err("invalid resp type (%d) from qsee", resp.resp_type); Loading Loading @@ -2274,11 +2283,10 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) load_img_req.img_name[MAX_APP_NAME_SIZE-1] = '\0'; strlcpy(req.app_name, load_img_req.img_name, MAX_APP_NAME_SIZE); ret = __qseecom_check_app_exists(req); ret = __qseecom_check_app_exists(req, &app_id); if (ret < 0) goto loadapp_err; app_id = ret; if (app_id) { pr_debug("App id %d (%s) already exists\n", app_id, (char *)(req.app_name)); Loading Loading @@ -4026,7 +4034,8 @@ static void __qseecom_free_img_data(struct ion_handle **ihandle) *ihandle = NULL; } static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname, uint32_t *app_id) { int ret = -1; uint32_t fw_size = 0; Loading @@ -4040,6 +4049,11 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) size_t cmd_len; uint32_t app_arch = 0; if (!data || !appname || !app_id) { pr_err("Null pointer to data or appname or appid\n"); return -EINVAL; } *app_id = 0; if (__qseecom_get_fw_size(appname, &fw_size, &app_arch)) return -EIO; data->client.app_arch = app_arch; Loading Loading @@ -4131,14 +4145,14 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) switch (resp.result) { case QSEOS_RESULT_SUCCESS: ret = resp.data; *app_id = resp.data; break; case QSEOS_RESULT_INCOMPLETE: ret = __qseecom_process_incomplete_cmd(data, &resp); if (ret) pr_err("process_incomplete_cmd FAILED\n"); else ret = resp.data; *app_id = resp.data; break; case QSEOS_RESULT_FAILURE: pr_err("scm call failed with response QSEOS_RESULT FAILURE\n"); Loading Loading @@ -4331,6 +4345,7 @@ int qseecom_start_app(struct qseecom_handle **handle, size_t len; ion_phys_addr_t pa; uint32_t fw_size, app_arch; uint32_t app_id = 0; if (atomic_read(&qseecom.qseecom_state) != QSEECOM_STATE_READY) { pr_err("Not allowed to be called in %d state\n", Loading Loading @@ -4385,18 +4400,18 @@ int qseecom_start_app(struct qseecom_handle **handle, app_ireq.qsee_cmd_id = QSEOS_APP_LOOKUP_COMMAND; strlcpy(app_ireq.app_name, app_name, MAX_APP_NAME_SIZE); ret = __qseecom_check_app_exists(app_ireq); if (ret < 0) ret = __qseecom_check_app_exists(app_ireq, &app_id); if (ret) goto err; strlcpy(data->client.app_name, app_name, MAX_APP_NAME_SIZE); if (ret > 0) { pr_warn("App id %d for [%s] app exists\n", ret, if (app_id) { pr_warn("App id %d for [%s] app exists\n", app_id, (char *)app_ireq.app_name); spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); list_for_each_entry(entry, &qseecom.registered_app_list_head, list){ if (entry->app_id == ret) { if (entry->app_id == app_id) { entry->ref_cnt++; found_app = true; break; Loading @@ -4411,11 +4426,11 @@ int qseecom_start_app(struct qseecom_handle **handle, /* load the app and get the app_id */ pr_debug("%s: Loading app for the first time'\n", qseecom.pdev->init_name); ret = __qseecom_load_fw(data, app_name); ret = __qseecom_load_fw(data, app_name, &app_id); if (ret < 0) goto err; } data->client.app_id = ret; data->client.app_id = app_id; if (!found_app) { entry = kmalloc(sizeof(*entry), GFP_KERNEL); if (!entry) { Loading @@ -4423,7 +4438,7 @@ int qseecom_start_app(struct qseecom_handle **handle, ret = -ENOMEM; goto err; } entry->app_id = ret; entry->app_id = app_id; entry->ref_cnt = 1; strlcpy(entry->app_name, app_name, MAX_APP_NAME_SIZE); if (__qseecom_get_fw_size(app_name, &fw_size, &app_arch)) { Loading Loading @@ -5226,7 +5241,7 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data, struct qseecom_check_app_ireq req; struct qseecom_registered_app_list *entry = NULL; unsigned long flags = 0; uint32_t app_arch = 0; uint32_t app_arch = 0, app_id = 0; bool found_app = false; /* Copy the relevant information needed for loading the image */ Loading @@ -5241,18 +5256,18 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data, query_req.app_name[MAX_APP_NAME_SIZE-1] = '\0'; strlcpy(req.app_name, query_req.app_name, MAX_APP_NAME_SIZE); ret = __qseecom_check_app_exists(req); if ((ret == -EINVAL) || (ret == -ENODEV)) { ret = __qseecom_check_app_exists(req, &app_id); if (ret) { pr_err(" scm call to check if app is loaded failed"); return ret; /* scm call failed */ } else if (ret > 0) { pr_debug("App id %d (%s) already exists\n", ret, } if (app_id) { pr_debug("App id %d (%s) already exists\n", app_id, (char *)(req.app_name)); spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); list_for_each_entry(entry, &qseecom.registered_app_list_head, list){ if (entry->app_id == ret) { if (entry->app_id == app_id) { app_arch = entry->app_arch; entry->ref_cnt++; found_app = true; Loading @@ -5261,8 +5276,8 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data, } spin_unlock_irqrestore( &qseecom.registered_app_list_lock, flags); data->client.app_id = ret; query_req.app_id = ret; data->client.app_id = app_id; query_req.app_id = app_id; if (app_arch) { data->client.app_arch = app_arch; query_req.app_arch = app_arch; Loading @@ -5284,7 +5299,7 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data, pr_err("kmalloc for app entry failed\n"); return -ENOMEM; } entry->app_id = ret; entry->app_id = app_id; entry->ref_cnt = 1; entry->app_arch = data->client.app_arch; strlcpy(entry->app_name, data->client.app_name, Loading include/uapi/linux/qseecom.h +2 −2 Original line number Diff line number Diff line Loading @@ -92,7 +92,7 @@ struct qseecom_load_img_req { int32_t ifd_data_fd; /* in */ char img_name[MAX_APP_NAME_SIZE]; /* in */ uint32_t app_arch; /* in */ int app_id; /* out*/ uint32_t app_id; /* out*/ }; struct qseecom_set_sb_mem_param_req { Loading @@ -116,7 +116,7 @@ struct qseecom_qseos_version_req { */ struct qseecom_qseos_app_load_query { char app_name[MAX_APP_NAME_SIZE]; /* in */ int app_id; /* out */ uint32_t app_id; /* out */ uint32_t app_arch; }; Loading Loading
drivers/misc/compat_qseecom.c +3 −3 Original line number Diff line number Diff line /* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2015,2017 The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -52,7 +52,7 @@ static int compat_get_qseecom_load_img_req( compat_ulong_t img_len; compat_long_t ifd_data_fd; compat_ulong_t app_arch; compat_int_t app_id; compat_uint_t app_id; err = get_user(mdt_len, &data32->mdt_len); err |= put_user(mdt_len, &data->mdt_len); Loading Loading @@ -164,7 +164,7 @@ static int compat_get_qseecom_qseos_app_load_query( { int err = 0; unsigned int i; compat_int_t app_id; compat_uint_t app_id; char app_name; compat_ulong_t app_arch; Loading
drivers/misc/compat_qseecom.h +2 −2 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ struct compat_qseecom_load_img_req { compat_long_t ifd_data_fd; /* in */ char img_name[MAX_APP_NAME_SIZE]; /* in */ compat_ulong_t app_arch; /* in */ compat_int_t app_id; /* out*/ compat_uint_t app_id; /* out*/ }; struct compat_qseecom_set_sb_mem_param_req { Loading @@ -117,7 +117,7 @@ struct compat_qseecom_qseos_version_req { */ struct compat_qseecom_qseos_app_load_query { char app_name[MAX_APP_NAME_SIZE]; /* in */ compat_int_t app_id; /* out */ compat_uint_t app_id; /* out */ compat_ulong_t app_arch; }; Loading
drivers/misc/qseecom.c +41 −26 Original line number Diff line number Diff line Loading @@ -2155,7 +2155,8 @@ static void __qseecom_reentrancy_check_if_this_app_blocked( } } static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req) static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req, uint32_t *app_id) { int32_t ret; struct qseecom_command_scm_resp resp; Loading @@ -2163,6 +2164,12 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req) struct qseecom_registered_app_list *entry = NULL; unsigned long flags = 0; if (!app_id) { pr_err("Null pointer to app_id\n"); return -EINVAL; } *app_id = 0; /* check if app exists and has been registered locally */ spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); list_for_each_entry(entry, Loading @@ -2175,7 +2182,8 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req) spin_unlock_irqrestore(&qseecom.registered_app_list_lock, flags); if (found_app) { pr_debug("Found app with id %d\n", entry->app_id); return entry->app_id; *app_id = entry->app_id; return 0; } memset((void *)&resp, 0, sizeof(resp)); Loading @@ -2198,7 +2206,8 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req) pr_err("resp type is of listener type instead of app"); return -EINVAL; case QSEOS_APP_ID: return resp.data; *app_id = resp.data; return 0; default: pr_err("invalid resp type (%d) from qsee", resp.resp_type); Loading Loading @@ -2274,11 +2283,10 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) load_img_req.img_name[MAX_APP_NAME_SIZE-1] = '\0'; strlcpy(req.app_name, load_img_req.img_name, MAX_APP_NAME_SIZE); ret = __qseecom_check_app_exists(req); ret = __qseecom_check_app_exists(req, &app_id); if (ret < 0) goto loadapp_err; app_id = ret; if (app_id) { pr_debug("App id %d (%s) already exists\n", app_id, (char *)(req.app_name)); Loading Loading @@ -4026,7 +4034,8 @@ static void __qseecom_free_img_data(struct ion_handle **ihandle) *ihandle = NULL; } static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname, uint32_t *app_id) { int ret = -1; uint32_t fw_size = 0; Loading @@ -4040,6 +4049,11 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) size_t cmd_len; uint32_t app_arch = 0; if (!data || !appname || !app_id) { pr_err("Null pointer to data or appname or appid\n"); return -EINVAL; } *app_id = 0; if (__qseecom_get_fw_size(appname, &fw_size, &app_arch)) return -EIO; data->client.app_arch = app_arch; Loading Loading @@ -4131,14 +4145,14 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) switch (resp.result) { case QSEOS_RESULT_SUCCESS: ret = resp.data; *app_id = resp.data; break; case QSEOS_RESULT_INCOMPLETE: ret = __qseecom_process_incomplete_cmd(data, &resp); if (ret) pr_err("process_incomplete_cmd FAILED\n"); else ret = resp.data; *app_id = resp.data; break; case QSEOS_RESULT_FAILURE: pr_err("scm call failed with response QSEOS_RESULT FAILURE\n"); Loading Loading @@ -4331,6 +4345,7 @@ int qseecom_start_app(struct qseecom_handle **handle, size_t len; ion_phys_addr_t pa; uint32_t fw_size, app_arch; uint32_t app_id = 0; if (atomic_read(&qseecom.qseecom_state) != QSEECOM_STATE_READY) { pr_err("Not allowed to be called in %d state\n", Loading Loading @@ -4385,18 +4400,18 @@ int qseecom_start_app(struct qseecom_handle **handle, app_ireq.qsee_cmd_id = QSEOS_APP_LOOKUP_COMMAND; strlcpy(app_ireq.app_name, app_name, MAX_APP_NAME_SIZE); ret = __qseecom_check_app_exists(app_ireq); if (ret < 0) ret = __qseecom_check_app_exists(app_ireq, &app_id); if (ret) goto err; strlcpy(data->client.app_name, app_name, MAX_APP_NAME_SIZE); if (ret > 0) { pr_warn("App id %d for [%s] app exists\n", ret, if (app_id) { pr_warn("App id %d for [%s] app exists\n", app_id, (char *)app_ireq.app_name); spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); list_for_each_entry(entry, &qseecom.registered_app_list_head, list){ if (entry->app_id == ret) { if (entry->app_id == app_id) { entry->ref_cnt++; found_app = true; break; Loading @@ -4411,11 +4426,11 @@ int qseecom_start_app(struct qseecom_handle **handle, /* load the app and get the app_id */ pr_debug("%s: Loading app for the first time'\n", qseecom.pdev->init_name); ret = __qseecom_load_fw(data, app_name); ret = __qseecom_load_fw(data, app_name, &app_id); if (ret < 0) goto err; } data->client.app_id = ret; data->client.app_id = app_id; if (!found_app) { entry = kmalloc(sizeof(*entry), GFP_KERNEL); if (!entry) { Loading @@ -4423,7 +4438,7 @@ int qseecom_start_app(struct qseecom_handle **handle, ret = -ENOMEM; goto err; } entry->app_id = ret; entry->app_id = app_id; entry->ref_cnt = 1; strlcpy(entry->app_name, app_name, MAX_APP_NAME_SIZE); if (__qseecom_get_fw_size(app_name, &fw_size, &app_arch)) { Loading Loading @@ -5226,7 +5241,7 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data, struct qseecom_check_app_ireq req; struct qseecom_registered_app_list *entry = NULL; unsigned long flags = 0; uint32_t app_arch = 0; uint32_t app_arch = 0, app_id = 0; bool found_app = false; /* Copy the relevant information needed for loading the image */ Loading @@ -5241,18 +5256,18 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data, query_req.app_name[MAX_APP_NAME_SIZE-1] = '\0'; strlcpy(req.app_name, query_req.app_name, MAX_APP_NAME_SIZE); ret = __qseecom_check_app_exists(req); if ((ret == -EINVAL) || (ret == -ENODEV)) { ret = __qseecom_check_app_exists(req, &app_id); if (ret) { pr_err(" scm call to check if app is loaded failed"); return ret; /* scm call failed */ } else if (ret > 0) { pr_debug("App id %d (%s) already exists\n", ret, } if (app_id) { pr_debug("App id %d (%s) already exists\n", app_id, (char *)(req.app_name)); spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); list_for_each_entry(entry, &qseecom.registered_app_list_head, list){ if (entry->app_id == ret) { if (entry->app_id == app_id) { app_arch = entry->app_arch; entry->ref_cnt++; found_app = true; Loading @@ -5261,8 +5276,8 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data, } spin_unlock_irqrestore( &qseecom.registered_app_list_lock, flags); data->client.app_id = ret; query_req.app_id = ret; data->client.app_id = app_id; query_req.app_id = app_id; if (app_arch) { data->client.app_arch = app_arch; query_req.app_arch = app_arch; Loading @@ -5284,7 +5299,7 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data, pr_err("kmalloc for app entry failed\n"); return -ENOMEM; } entry->app_id = ret; entry->app_id = app_id; entry->ref_cnt = 1; entry->app_arch = data->client.app_arch; strlcpy(entry->app_name, data->client.app_name, Loading
include/uapi/linux/qseecom.h +2 −2 Original line number Diff line number Diff line Loading @@ -92,7 +92,7 @@ struct qseecom_load_img_req { int32_t ifd_data_fd; /* in */ char img_name[MAX_APP_NAME_SIZE]; /* in */ uint32_t app_arch; /* in */ int app_id; /* out*/ uint32_t app_id; /* out*/ }; struct qseecom_set_sb_mem_param_req { Loading @@ -116,7 +116,7 @@ struct qseecom_qseos_version_req { */ struct qseecom_qseos_app_load_query { char app_name[MAX_APP_NAME_SIZE]; /* in */ int app_id; /* out */ uint32_t app_id; /* out */ uint32_t app_arch; }; Loading