Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4c9d0e2 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "qseecom: return app_id correctly when looking up and loading app"

parents 5b38c9e5 9b571120
Loading
Loading
Loading
Loading
+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
@@ -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);
@@ -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;

+2 −2
Original line number Diff line number Diff line
@@ -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 {
@@ -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;
};

+41 −26
Original line number Diff line number Diff line
@@ -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;
@@ -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,
@@ -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));
@@ -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);
@@ -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));
@@ -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;
@@ -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;
@@ -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");
@@ -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",
@@ -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;
@@ -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) {
@@ -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)) {
@@ -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 */
@@ -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;
@@ -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;
@@ -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,
+2 −2
Original line number Diff line number Diff line
@@ -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 {
@@ -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;
};