Loading drivers/media/platform/msm/npu/npu_dev.c +39 −15 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; } Loading Loading @@ -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; } Loading drivers/media/platform/msm/npu/npu_hw_access.c +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading drivers/media/platform/msm/npu/npu_mgr.c +39 −7 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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; } Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading drivers/media/platform/msm/npu/npu_mgr.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; }; Loading Loading
drivers/media/platform/msm/npu/npu_dev.c +39 −15 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; } Loading Loading @@ -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; } Loading
drivers/media/platform/msm/npu/npu_hw_access.c +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
drivers/media/platform/msm/npu/npu_mgr.c +39 −7 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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; } Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading
drivers/media/platform/msm/npu/npu_mgr.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; }; Loading