Merge "qseecom: return app_id correctly when looking up and loading app"
This commit is contained in:
commit
20f778e413
4 changed files with 48 additions and 33 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* 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
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
@ -52,7 +52,7 @@ static int compat_get_qseecom_load_img_req(
|
||||||
compat_ulong_t img_len;
|
compat_ulong_t img_len;
|
||||||
compat_long_t ifd_data_fd;
|
compat_long_t ifd_data_fd;
|
||||||
compat_ulong_t app_arch;
|
compat_ulong_t app_arch;
|
||||||
compat_int_t app_id;
|
compat_uint_t app_id;
|
||||||
|
|
||||||
err = get_user(mdt_len, &data32->mdt_len);
|
err = get_user(mdt_len, &data32->mdt_len);
|
||||||
err |= put_user(mdt_len, &data->mdt_len);
|
err |= put_user(mdt_len, &data->mdt_len);
|
||||||
|
@ -164,7 +164,7 @@ static int compat_get_qseecom_qseos_app_load_query(
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
compat_int_t app_id;
|
compat_uint_t app_id;
|
||||||
char app_name;
|
char app_name;
|
||||||
compat_ulong_t app_arch;
|
compat_ulong_t app_arch;
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ struct compat_qseecom_load_img_req {
|
||||||
compat_long_t ifd_data_fd; /* in */
|
compat_long_t ifd_data_fd; /* in */
|
||||||
char img_name[MAX_APP_NAME_SIZE]; /* in */
|
char img_name[MAX_APP_NAME_SIZE]; /* in */
|
||||||
compat_ulong_t app_arch; /* 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 {
|
struct compat_qseecom_set_sb_mem_param_req {
|
||||||
|
@ -117,7 +117,7 @@ struct compat_qseecom_qseos_version_req {
|
||||||
*/
|
*/
|
||||||
struct compat_qseecom_qseos_app_load_query {
|
struct compat_qseecom_qseos_app_load_query {
|
||||||
char app_name[MAX_APP_NAME_SIZE]; /* in */
|
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;
|
compat_ulong_t app_arch;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2167,7 +2167,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;
|
int32_t ret;
|
||||||
struct qseecom_command_scm_resp resp;
|
struct qseecom_command_scm_resp resp;
|
||||||
|
@ -2175,6 +2176,12 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req)
|
||||||
struct qseecom_registered_app_list *entry = NULL;
|
struct qseecom_registered_app_list *entry = NULL;
|
||||||
unsigned long flags = 0;
|
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 */
|
/* check if app exists and has been registered locally */
|
||||||
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
|
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
|
||||||
list_for_each_entry(entry,
|
list_for_each_entry(entry,
|
||||||
|
@ -2187,7 +2194,8 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req)
|
||||||
spin_unlock_irqrestore(&qseecom.registered_app_list_lock, flags);
|
spin_unlock_irqrestore(&qseecom.registered_app_list_lock, flags);
|
||||||
if (found_app) {
|
if (found_app) {
|
||||||
pr_debug("Found app with id %d\n", entry->app_id);
|
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));
|
memset((void *)&resp, 0, sizeof(resp));
|
||||||
|
@ -2210,7 +2218,8 @@ static int __qseecom_check_app_exists(struct qseecom_check_app_ireq req)
|
||||||
pr_err("resp type is of listener type instead of app");
|
pr_err("resp type is of listener type instead of app");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
case QSEOS_APP_ID:
|
case QSEOS_APP_ID:
|
||||||
return resp.data;
|
*app_id = resp.data;
|
||||||
|
return 0;
|
||||||
default:
|
default:
|
||||||
pr_err("invalid resp type (%d) from qsee",
|
pr_err("invalid resp type (%d) from qsee",
|
||||||
resp.resp_type);
|
resp.resp_type);
|
||||||
|
@ -2286,11 +2295,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';
|
load_img_req.img_name[MAX_APP_NAME_SIZE-1] = '\0';
|
||||||
strlcpy(req.app_name, load_img_req.img_name, MAX_APP_NAME_SIZE);
|
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)
|
if (ret < 0)
|
||||||
goto loadapp_err;
|
goto loadapp_err;
|
||||||
|
|
||||||
app_id = ret;
|
|
||||||
if (app_id) {
|
if (app_id) {
|
||||||
pr_debug("App id %d (%s) already exists\n", app_id,
|
pr_debug("App id %d (%s) already exists\n", app_id,
|
||||||
(char *)(req.app_name));
|
(char *)(req.app_name));
|
||||||
|
@ -4038,7 +4046,8 @@ static void __qseecom_free_img_data(struct ion_handle **ihandle)
|
||||||
*ihandle = NULL;
|
*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;
|
int ret = -1;
|
||||||
uint32_t fw_size = 0;
|
uint32_t fw_size = 0;
|
||||||
|
@ -4052,6 +4061,11 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname)
|
||||||
size_t cmd_len;
|
size_t cmd_len;
|
||||||
uint32_t app_arch = 0;
|
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))
|
if (__qseecom_get_fw_size(appname, &fw_size, &app_arch))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
data->client.app_arch = app_arch;
|
data->client.app_arch = app_arch;
|
||||||
|
@ -4143,14 +4157,14 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname)
|
||||||
|
|
||||||
switch (resp.result) {
|
switch (resp.result) {
|
||||||
case QSEOS_RESULT_SUCCESS:
|
case QSEOS_RESULT_SUCCESS:
|
||||||
ret = resp.data;
|
*app_id = resp.data;
|
||||||
break;
|
break;
|
||||||
case QSEOS_RESULT_INCOMPLETE:
|
case QSEOS_RESULT_INCOMPLETE:
|
||||||
ret = __qseecom_process_incomplete_cmd(data, &resp);
|
ret = __qseecom_process_incomplete_cmd(data, &resp);
|
||||||
if (ret)
|
if (ret)
|
||||||
pr_err("process_incomplete_cmd FAILED\n");
|
pr_err("process_incomplete_cmd FAILED\n");
|
||||||
else
|
else
|
||||||
ret = resp.data;
|
*app_id = resp.data;
|
||||||
break;
|
break;
|
||||||
case QSEOS_RESULT_FAILURE:
|
case QSEOS_RESULT_FAILURE:
|
||||||
pr_err("scm call failed with response QSEOS_RESULT FAILURE\n");
|
pr_err("scm call failed with response QSEOS_RESULT FAILURE\n");
|
||||||
|
@ -4343,6 +4357,7 @@ int qseecom_start_app(struct qseecom_handle **handle,
|
||||||
size_t len;
|
size_t len;
|
||||||
ion_phys_addr_t pa;
|
ion_phys_addr_t pa;
|
||||||
uint32_t fw_size, app_arch;
|
uint32_t fw_size, app_arch;
|
||||||
|
uint32_t app_id = 0;
|
||||||
|
|
||||||
if (atomic_read(&qseecom.qseecom_state) != QSEECOM_STATE_READY) {
|
if (atomic_read(&qseecom.qseecom_state) != QSEECOM_STATE_READY) {
|
||||||
pr_err("Not allowed to be called in %d state\n",
|
pr_err("Not allowed to be called in %d state\n",
|
||||||
|
@ -4397,18 +4412,18 @@ int qseecom_start_app(struct qseecom_handle **handle,
|
||||||
|
|
||||||
app_ireq.qsee_cmd_id = QSEOS_APP_LOOKUP_COMMAND;
|
app_ireq.qsee_cmd_id = QSEOS_APP_LOOKUP_COMMAND;
|
||||||
strlcpy(app_ireq.app_name, app_name, MAX_APP_NAME_SIZE);
|
strlcpy(app_ireq.app_name, app_name, MAX_APP_NAME_SIZE);
|
||||||
ret = __qseecom_check_app_exists(app_ireq);
|
ret = __qseecom_check_app_exists(app_ireq, &app_id);
|
||||||
if (ret < 0)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
strlcpy(data->client.app_name, app_name, MAX_APP_NAME_SIZE);
|
strlcpy(data->client.app_name, app_name, MAX_APP_NAME_SIZE);
|
||||||
if (ret > 0) {
|
if (app_id) {
|
||||||
pr_warn("App id %d for [%s] app exists\n", ret,
|
pr_warn("App id %d for [%s] app exists\n", app_id,
|
||||||
(char *)app_ireq.app_name);
|
(char *)app_ireq.app_name);
|
||||||
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
|
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
|
||||||
list_for_each_entry(entry,
|
list_for_each_entry(entry,
|
||||||
&qseecom.registered_app_list_head, list){
|
&qseecom.registered_app_list_head, list){
|
||||||
if (entry->app_id == ret) {
|
if (entry->app_id == app_id) {
|
||||||
entry->ref_cnt++;
|
entry->ref_cnt++;
|
||||||
found_app = true;
|
found_app = true;
|
||||||
break;
|
break;
|
||||||
|
@ -4423,11 +4438,11 @@ int qseecom_start_app(struct qseecom_handle **handle,
|
||||||
/* load the app and get the app_id */
|
/* load the app and get the app_id */
|
||||||
pr_debug("%s: Loading app for the first time'\n",
|
pr_debug("%s: Loading app for the first time'\n",
|
||||||
qseecom.pdev->init_name);
|
qseecom.pdev->init_name);
|
||||||
ret = __qseecom_load_fw(data, app_name);
|
ret = __qseecom_load_fw(data, app_name, &app_id);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
data->client.app_id = ret;
|
data->client.app_id = app_id;
|
||||||
if (!found_app) {
|
if (!found_app) {
|
||||||
entry = kmalloc(sizeof(*entry), GFP_KERNEL);
|
entry = kmalloc(sizeof(*entry), GFP_KERNEL);
|
||||||
if (!entry) {
|
if (!entry) {
|
||||||
|
@ -4435,7 +4450,7 @@ int qseecom_start_app(struct qseecom_handle **handle,
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
entry->app_id = ret;
|
entry->app_id = app_id;
|
||||||
entry->ref_cnt = 1;
|
entry->ref_cnt = 1;
|
||||||
strlcpy(entry->app_name, app_name, MAX_APP_NAME_SIZE);
|
strlcpy(entry->app_name, app_name, MAX_APP_NAME_SIZE);
|
||||||
if (__qseecom_get_fw_size(app_name, &fw_size, &app_arch)) {
|
if (__qseecom_get_fw_size(app_name, &fw_size, &app_arch)) {
|
||||||
|
@ -5272,7 +5287,7 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data,
|
||||||
struct qseecom_check_app_ireq req;
|
struct qseecom_check_app_ireq req;
|
||||||
struct qseecom_registered_app_list *entry = NULL;
|
struct qseecom_registered_app_list *entry = NULL;
|
||||||
unsigned long flags = 0;
|
unsigned long flags = 0;
|
||||||
uint32_t app_arch = 0;
|
uint32_t app_arch = 0, app_id = 0;
|
||||||
bool found_app = false;
|
bool found_app = false;
|
||||||
|
|
||||||
/* Copy the relevant information needed for loading the image */
|
/* Copy the relevant information needed for loading the image */
|
||||||
|
@ -5287,18 +5302,18 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data,
|
||||||
query_req.app_name[MAX_APP_NAME_SIZE-1] = '\0';
|
query_req.app_name[MAX_APP_NAME_SIZE-1] = '\0';
|
||||||
strlcpy(req.app_name, query_req.app_name, MAX_APP_NAME_SIZE);
|
strlcpy(req.app_name, query_req.app_name, MAX_APP_NAME_SIZE);
|
||||||
|
|
||||||
ret = __qseecom_check_app_exists(req);
|
ret = __qseecom_check_app_exists(req, &app_id);
|
||||||
|
if (ret) {
|
||||||
if ((ret == -EINVAL) || (ret == -ENODEV)) {
|
|
||||||
pr_err(" scm call to check if app is loaded failed");
|
pr_err(" scm call to check if app is loaded failed");
|
||||||
return ret; /* scm call 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));
|
(char *)(req.app_name));
|
||||||
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
|
spin_lock_irqsave(&qseecom.registered_app_list_lock, flags);
|
||||||
list_for_each_entry(entry,
|
list_for_each_entry(entry,
|
||||||
&qseecom.registered_app_list_head, list){
|
&qseecom.registered_app_list_head, list){
|
||||||
if (entry->app_id == ret) {
|
if (entry->app_id == app_id) {
|
||||||
app_arch = entry->app_arch;
|
app_arch = entry->app_arch;
|
||||||
entry->ref_cnt++;
|
entry->ref_cnt++;
|
||||||
found_app = true;
|
found_app = true;
|
||||||
|
@ -5307,8 +5322,8 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data,
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(
|
spin_unlock_irqrestore(
|
||||||
&qseecom.registered_app_list_lock, flags);
|
&qseecom.registered_app_list_lock, flags);
|
||||||
data->client.app_id = ret;
|
data->client.app_id = app_id;
|
||||||
query_req.app_id = ret;
|
query_req.app_id = app_id;
|
||||||
if (app_arch) {
|
if (app_arch) {
|
||||||
data->client.app_arch = app_arch;
|
data->client.app_arch = app_arch;
|
||||||
query_req.app_arch = app_arch;
|
query_req.app_arch = app_arch;
|
||||||
|
@ -5330,7 +5345,7 @@ static int qseecom_query_app_loaded(struct qseecom_dev_handle *data,
|
||||||
pr_err("kmalloc for app entry failed\n");
|
pr_err("kmalloc for app entry failed\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
entry->app_id = ret;
|
entry->app_id = app_id;
|
||||||
entry->ref_cnt = 1;
|
entry->ref_cnt = 1;
|
||||||
entry->app_arch = data->client.app_arch;
|
entry->app_arch = data->client.app_arch;
|
||||||
strlcpy(entry->app_name, data->client.app_name,
|
strlcpy(entry->app_name, data->client.app_name,
|
||||||
|
|
|
@ -92,7 +92,7 @@ struct qseecom_load_img_req {
|
||||||
int32_t ifd_data_fd; /* in */
|
int32_t ifd_data_fd; /* in */
|
||||||
char img_name[MAX_APP_NAME_SIZE]; /* in */
|
char img_name[MAX_APP_NAME_SIZE]; /* in */
|
||||||
uint32_t app_arch; /* in */
|
uint32_t app_arch; /* in */
|
||||||
int app_id; /* out*/
|
uint32_t app_id; /* out*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct qseecom_set_sb_mem_param_req {
|
struct qseecom_set_sb_mem_param_req {
|
||||||
|
@ -116,7 +116,7 @@ struct qseecom_qseos_version_req {
|
||||||
*/
|
*/
|
||||||
struct qseecom_qseos_app_load_query {
|
struct qseecom_qseos_app_load_query {
|
||||||
char app_name[MAX_APP_NAME_SIZE]; /* in */
|
char app_name[MAX_APP_NAME_SIZE]; /* in */
|
||||||
int app_id; /* out */
|
uint32_t app_id; /* out */
|
||||||
uint32_t app_arch;
|
uint32_t app_arch;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue