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

Commit dfb0c720 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: npu: pass command result from fw to user driver"

parents 463d7051 72a6d615
Loading
Loading
Loading
Loading
+39 −15
Original line number Diff line number Diff line
@@ -933,6 +933,7 @@ static int npu_load_network(struct npu_client *client,
	unsigned long arg)
{
	struct msm_npu_load_network_ioctl req;
	struct msm_npu_unload_network_ioctl unload_req;
	void __user *argp = (void __user *)arg;
	int ret = 0;

@@ -948,21 +949,24 @@ static int npu_load_network(struct npu_client *client,
	ret = npu_host_load_network(client, &req);
	if (ret) {
		pr_err("network load failed: %d\n", ret);
		return -EFAULT;
		return ret;
	}

	ret = copy_to_user(argp, &req, sizeof(req));
	if (ret) {
		pr_err("fail to copy to user\n");
		return -EFAULT;
		ret = -EFAULT;
		unload_req.network_hdl = req.network_hdl;
		npu_host_unload_network(client, &unload_req);
	}
	return 0;
	return ret;
}

static int npu_load_network_v2(struct npu_client *client,
	unsigned long arg)
{
	struct msm_npu_load_network_ioctl_v2 req;
	struct msm_npu_unload_network_ioctl unload_req;
	void __user *argp = (void __user *)arg;
	struct msm_npu_patch_info_v2 *patch_info = NULL;
	int ret;
@@ -985,23 +989,34 @@ static int npu_load_network_v2(struct npu_client *client,
		if (!patch_info)
			return -ENOMEM;

		copy_from_user(patch_info,
		ret = copy_from_user(patch_info,
			(void __user *)req.patch_info,
			req.patch_info_num * sizeof(*patch_info));
		if (ret) {
			pr_err("fail to copy patch info\n");
			kfree(patch_info);
			return -EFAULT;
		}
	}

	pr_debug("network load with perf request %d\n", req.perf_mode);

	ret = npu_host_load_network_v2(client, &req, patch_info);

	kfree(patch_info);
	if (ret) {
		pr_err("network load failed: %d\n", ret);
	} else {
		return ret;
	}

	ret = copy_to_user(argp, &req, sizeof(req));
		if (ret)
	if (ret) {
		pr_err("fail to copy to user\n");
		ret = -EFAULT;
		unload_req.network_hdl = req.network_hdl;
		npu_host_unload_network(client, &unload_req);
	}

	kfree(patch_info);
	return ret;
}

@@ -1105,21 +1120,30 @@ static int npu_exec_network_v2(struct npu_client *client,
		if (!patch_buf_info)
			return -ENOMEM;

		copy_from_user(patch_buf_info,
		ret = copy_from_user(patch_buf_info,
			(void __user *)req.patch_buf_info,
			req.patch_buf_info_num * sizeof(*patch_buf_info));
		if (ret) {
			pr_err("fail to copy patch buf info\n");
			kfree(patch_buf_info);
			return -EFAULT;
		}
	}

	ret = npu_host_exec_network_v2(client, &req, patch_buf_info);

	kfree(patch_buf_info);
	if (ret) {
		pr_err("npu_host_exec_network failed\n");
	} else {
		return ret;
	}

	ret = copy_to_user(argp, &req, sizeof(req));
		if (ret)
	if (ret) {
		pr_err("fail to copy to user\n");
		ret = -EFAULT;
	}

	kfree(patch_buf_info);
	return ret;
}

+1 −1
Original line number Diff line number Diff line
@@ -171,7 +171,7 @@ static struct npu_ion_buf *npu_alloc_npu_ion_buffer(struct npu_client
		pr_err("ion buf %x has been mapped\n");
		ret_val = NULL;
	} else {
		ret_val = kmalloc(sizeof(struct npu_ion_buf), GFP_KERNEL);
		ret_val = kzalloc(sizeof(*ret_val), GFP_KERNEL);
		if (ret_val) {
			ret_val->fd = buf_hdl;
			ret_val->size = size;
+39 −7
Original line number Diff line number Diff line
@@ -539,7 +539,9 @@ static void app_msg_proc(struct npu_host_ctx *host_ctx, uint32_t *msg)
				exe_rsp_pkt->network_hdl);
			break;
		}

		network->cmd_pending = false;
		network->cmd_ret_status = exe_rsp_pkt->header.status;

		if (!network->cmd_async) {
			complete(&network->cmd_done);
@@ -586,6 +588,8 @@ static void app_msg_proc(struct npu_host_ctx *host_ctx, uint32_t *msg)

		network->stats_buf_size = stats_size;
		network->cmd_pending = false;
		network->cmd_ret_status = exe_rsp_pkt->header.status;

		if (network->cmd_async) {
			pr_debug("async cmd, queue event\n");
			kevt.evt.type = MSM_NPU_EVENT_TYPE_EXEC_V2_DONE;
@@ -626,6 +630,8 @@ static void app_msg_proc(struct npu_host_ctx *host_ctx, uint32_t *msg)
		}
		network->network_hdl = load_rsp_pkt->network_hdl;
		network->cmd_pending = false;
		network->cmd_ret_status = load_rsp_pkt->header.status;

		complete(&network->cmd_done);
		break;
	}
@@ -647,6 +653,8 @@ static void app_msg_proc(struct npu_host_ctx *host_ctx, uint32_t *msg)
		}

		network->cmd_pending = false;
		network->cmd_ret_status = unload_rsp_pkt->header.status;

		complete(&network->cmd_done);
		break;
	}
@@ -763,10 +771,12 @@ static int npu_send_network_cmd(struct npu_device *npu_dev,
			((struct ipc_cmd_header_pkt *)cmd_ptr)->cmd_type,
			network->id);
		network->cmd_async = async;
		network->cmd_ret_status = 0;
		network->cmd_pending = true;
		ret = npu_host_ipc_send_cmd(npu_dev,
			IPC_QUEUE_APPS_EXEC, cmd_ptr);
		if (!ret)
			network->cmd_pending = true;
		if (ret)
			network->cmd_pending = false;
	}
	mutex_unlock(&host_ctx->lock);

@@ -927,6 +937,10 @@ int32_t npu_host_load_network(struct npu_client *client,
		goto error_free_network;
	}

	ret = network->cmd_ret_status;
	if (ret)
		goto error_free_network;

	load_ioctl->network_hdl = network->network_hdl;

	return ret;
@@ -1030,6 +1044,10 @@ int32_t npu_host_load_network_v2(struct npu_client *client,
		goto error_free_network;
	}

	ret = network->cmd_ret_status;
	if (ret)
		goto error_free_network;

	load_ioctl->network_hdl = network->network_hdl;

	return ret;
@@ -1164,10 +1182,16 @@ int32_t npu_host_exec_network(struct npu_client *client,
		pr_err_ratelimited("npu: NPU_IPC_CMD_EXECUTE time out\n");
		/* dump debug stats */
		npu_dump_debug_timeout_stats(npu_dev);
		network->cmd_pending = false;

		/* treat execution timed out as ssr */
		fw_deinit(npu_dev, false, true);
		ret = -ETIMEDOUT;
	} else if (network->fw_error) {
		ret = -EIO;
		pr_err("execute cmd returns with error\n");
	} else {
		ret = network->cmd_ret_status;
	}

	return ret;
@@ -1250,18 +1274,26 @@ int32_t npu_host_exec_network_v2(struct npu_client *client,
		pr_err_ratelimited("npu: NPU_IPC_CMD_EXECUTE_V2 time out\n");
		/* dump debug stats */
		npu_dump_debug_timeout_stats(npu_dev);
		network->cmd_pending = false;
		/* treat execution timed out as ssr */
		fw_deinit(npu_dev, false, true);
		ret = -ETIMEDOUT;
	} else if (network->fw_error) {
		ret = -EIO;
		pr_err("execute cmd returns with error\n");
	} else {
		ret = network->cmd_ret_status;
		if (!ret) {
			exec_ioctl->stats_buf_size = network->stats_buf_size;
		if (copy_to_user((void __user *)exec_ioctl->stats_buf_addr,
			network->stats_buf, exec_ioctl->stats_buf_size)) {
			if (copy_to_user(
				(void __user *)exec_ioctl->stats_buf_addr,
				network->stats_buf,
				exec_ioctl->stats_buf_size)) {
				pr_err("copy stats to user failed\n");
				exec_ioctl->stats_buf_size = 0;
			}
		}
	}

	kfree(exec_packet);
	return ret;
+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ struct npu_network {
	bool fw_error;
	bool cmd_pending;
	bool cmd_async;
	int cmd_ret_status;
	struct completion cmd_done;
	struct npu_client *client;
};