Loading drivers/media/platform/msm/npu/npu_debugfs.c +5 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,7 @@ static ssize_t npu_debug_ctrl_write(struct file *file, char buf[24]; struct npu_device *npu_dev = file->private_data; struct npu_debugfs_ctx *debugfs; int32_t rc = 0; pr_debug("npu_dev %pK %pK\n", npu_dev, g_npu_dev); npu_dev = g_npu_dev; Loading Loading @@ -381,6 +382,10 @@ static ssize_t npu_debug_ctrl_write(struct file *file, REGW(npu_dev, NPU_MASTERn_ERROR_IRQ_SET(0), 2); npu_disable_core_power(npu_dev); } else if (strcmp(buf, "loopback") == 0) { pr_debug("loopback test\n"); rc = npu_host_loopback_test(npu_dev); pr_debug("loopback test end: %d\n", rc); } else if (strcmp(buf, "0") == 0) { pr_info("setting power state to 0\n"); npu_dev->pwrctrl.active_pwrlevel = 0; Loading drivers/media/platform/msm/npu/npu_host_ipc.h +20 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ #define NPU_IPC_CMD_CONFIG_PERFORMANCE 0x00000005 #define NPU_IPC_CMD_CONFIG_DEBUG 0x00000006 #define NPU_IPC_CMD_SHUTDOWN 0x00000007 /* npu_ipc_cmd_loopback_packet_t */ #define NPU_IPC_CMD_LOOPBACK 0x00000008 /* Messages sent **from** NPU */ /* IPC Message Response -- uint32_t */ Loading @@ -45,6 +47,8 @@ #define NPU_IPC_MSG_EXECUTE_DONE 0x00010003 /* ipc_msg_event_notify_pkt */ #define NPU_IPC_MSG_EVENT_NOTIFY 0x00010004 /* npu_ipc_msg_loopback_packet_t */ #define NPU_IPC_MSG_LOOPBACK_DONE 0x00010005 /* Logging message size */ /* Number 32-bit elements for the maximum log message size */ Loading Loading @@ -191,6 +195,14 @@ struct ipc_cmd_execute_pkt { uint32_t aco_hdl; }; /* * Loopback packet definition */ struct ipc_cmd_loopback_pkt { struct ipc_cmd_header_pkt header; uint32_t loopbackParams; }; /* * LOAD response packet definition */ Loading Loading @@ -257,6 +269,14 @@ struct ipc_msg_execute_pkt { struct ipc_execute_stats stats; }; /* * LOOPBACK response packet definition */ struct ipc_msg_loopback_pkt { struct ipc_msg_header_pkt header; uint32_t loopbackParams; }; /* Logging Related */ /* Loading drivers/media/platform/msm/npu/npu_mgr.c +44 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,7 @@ int npu_host_init(struct npu_device *npu_dev) init_completion(&host_ctx->exec_done); init_completion(&host_ctx->load_done); init_completion(&host_ctx->unload_done); init_completion(&host_ctx->loopback_done); host_ctx->sys_cache_disable = 0; spin_lock_init(&host_ctx->lock); Loading Loading @@ -287,6 +288,7 @@ static int host_error_hdlr(struct npu_device *npu_dev) complete_all(&host_ctx->exec_done); complete_all(&host_ctx->load_done); complete_all(&host_ctx->unload_done); complete_all(&host_ctx->loopback_done); return 1; } Loading Loading @@ -430,6 +432,7 @@ static void app_msg_proc(struct npu_host_ctx *host_ctx, uint32_t *msg) struct ipc_msg_header_pkt *resp_pkt; struct ipc_msg_load_pkt *load_rsp_pkt; struct ipc_msg_execute_pkt *exe_rsp_pkt; struct ipc_msg_loopback_pkt *lb_rsp_pkt; msg_id = msg[1]; switch (msg_id) { Loading Loading @@ -481,6 +484,14 @@ static void app_msg_proc(struct npu_host_ctx *host_ctx, uint32_t *msg) resp_pkt->status, resp_pkt->trans_id); complete_all(&host_ctx->unload_done); break; case NPU_IPC_MSG_LOOPBACK_DONE: lb_rsp_pkt = (struct ipc_msg_loopback_pkt *)msg; pr_debug("NPU_IPC_MSG_LOOPBACK_DONE loopbackParams: 0x%x\n", lb_rsp_pkt->loopbackParams); complete_all(&host_ctx->loopback_done); break; default: pr_err("Not supported apps response received %d\n", msg_id); Loading Loading @@ -807,3 +818,36 @@ int32_t npu_host_exec_network(struct npu_device *npu_dev, return ret; } int32_t npu_host_loopback_test(struct npu_device *npu_dev) { struct ipc_cmd_loopback_pkt loopback_packet; struct npu_host_ctx *host_ctx = &npu_dev->host_ctx; int32_t ret; ret = fw_init(npu_dev); if (ret) return ret; loopback_packet.header.cmd_type = NPU_IPC_CMD_LOOPBACK; loopback_packet.header.size = sizeof(struct ipc_cmd_loopback_pkt); loopback_packet.header.trans_id = 0; loopback_packet.header.flags = 0; loopback_packet.loopbackParams = 15; reinit_completion(&host_ctx->loopback_done); ret = npu_host_ipc_send_cmd(npu_dev, IPC_QUEUE_APPS_EXEC, &loopback_packet); if (ret) { pr_err("NPU_IPC_CMD_LOOPBACK sent failed: %d\n", ret); } else if (!wait_for_completion_interruptible_timeout( &host_ctx->loopback_done, NW_LOAD_TIMEOUT)) { pr_err_ratelimited("npu: NPU_IPC_CMD_LOOPBACK time out\n"); ret = -ETIMEDOUT; } fw_deinit(npu_dev, true); return ret; } drivers/media/platform/msm/npu/npu_mgr.h +2 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ struct npu_host_ctx { struct completion exec_done; struct completion load_done; struct completion unload_done; struct completion loopback_done; int32_t network_num; struct npu_network networks[MAX_LOADED_NETWORK]; bool sys_cache_disable; Loading Loading @@ -111,6 +112,7 @@ int32_t npu_host_unload_network(struct npu_device *npu_dev, struct msm_npu_unload_network_ioctl *unload); int32_t npu_host_exec_network(struct npu_device *npu_dev, struct msm_npu_exec_network_ioctl *exec_ioctl); int32_t npu_host_loopback_test(struct npu_device *npu_dev); void npu_dump_debug_timeout_stats(struct npu_device *npu_dev); void npu_dump_cal_state(struct npu_device *npu_dev); Loading Loading
drivers/media/platform/msm/npu/npu_debugfs.c +5 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,7 @@ static ssize_t npu_debug_ctrl_write(struct file *file, char buf[24]; struct npu_device *npu_dev = file->private_data; struct npu_debugfs_ctx *debugfs; int32_t rc = 0; pr_debug("npu_dev %pK %pK\n", npu_dev, g_npu_dev); npu_dev = g_npu_dev; Loading Loading @@ -381,6 +382,10 @@ static ssize_t npu_debug_ctrl_write(struct file *file, REGW(npu_dev, NPU_MASTERn_ERROR_IRQ_SET(0), 2); npu_disable_core_power(npu_dev); } else if (strcmp(buf, "loopback") == 0) { pr_debug("loopback test\n"); rc = npu_host_loopback_test(npu_dev); pr_debug("loopback test end: %d\n", rc); } else if (strcmp(buf, "0") == 0) { pr_info("setting power state to 0\n"); npu_dev->pwrctrl.active_pwrlevel = 0; Loading
drivers/media/platform/msm/npu/npu_host_ipc.h +20 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ #define NPU_IPC_CMD_CONFIG_PERFORMANCE 0x00000005 #define NPU_IPC_CMD_CONFIG_DEBUG 0x00000006 #define NPU_IPC_CMD_SHUTDOWN 0x00000007 /* npu_ipc_cmd_loopback_packet_t */ #define NPU_IPC_CMD_LOOPBACK 0x00000008 /* Messages sent **from** NPU */ /* IPC Message Response -- uint32_t */ Loading @@ -45,6 +47,8 @@ #define NPU_IPC_MSG_EXECUTE_DONE 0x00010003 /* ipc_msg_event_notify_pkt */ #define NPU_IPC_MSG_EVENT_NOTIFY 0x00010004 /* npu_ipc_msg_loopback_packet_t */ #define NPU_IPC_MSG_LOOPBACK_DONE 0x00010005 /* Logging message size */ /* Number 32-bit elements for the maximum log message size */ Loading Loading @@ -191,6 +195,14 @@ struct ipc_cmd_execute_pkt { uint32_t aco_hdl; }; /* * Loopback packet definition */ struct ipc_cmd_loopback_pkt { struct ipc_cmd_header_pkt header; uint32_t loopbackParams; }; /* * LOAD response packet definition */ Loading Loading @@ -257,6 +269,14 @@ struct ipc_msg_execute_pkt { struct ipc_execute_stats stats; }; /* * LOOPBACK response packet definition */ struct ipc_msg_loopback_pkt { struct ipc_msg_header_pkt header; uint32_t loopbackParams; }; /* Logging Related */ /* Loading
drivers/media/platform/msm/npu/npu_mgr.c +44 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,7 @@ int npu_host_init(struct npu_device *npu_dev) init_completion(&host_ctx->exec_done); init_completion(&host_ctx->load_done); init_completion(&host_ctx->unload_done); init_completion(&host_ctx->loopback_done); host_ctx->sys_cache_disable = 0; spin_lock_init(&host_ctx->lock); Loading Loading @@ -287,6 +288,7 @@ static int host_error_hdlr(struct npu_device *npu_dev) complete_all(&host_ctx->exec_done); complete_all(&host_ctx->load_done); complete_all(&host_ctx->unload_done); complete_all(&host_ctx->loopback_done); return 1; } Loading Loading @@ -430,6 +432,7 @@ static void app_msg_proc(struct npu_host_ctx *host_ctx, uint32_t *msg) struct ipc_msg_header_pkt *resp_pkt; struct ipc_msg_load_pkt *load_rsp_pkt; struct ipc_msg_execute_pkt *exe_rsp_pkt; struct ipc_msg_loopback_pkt *lb_rsp_pkt; msg_id = msg[1]; switch (msg_id) { Loading Loading @@ -481,6 +484,14 @@ static void app_msg_proc(struct npu_host_ctx *host_ctx, uint32_t *msg) resp_pkt->status, resp_pkt->trans_id); complete_all(&host_ctx->unload_done); break; case NPU_IPC_MSG_LOOPBACK_DONE: lb_rsp_pkt = (struct ipc_msg_loopback_pkt *)msg; pr_debug("NPU_IPC_MSG_LOOPBACK_DONE loopbackParams: 0x%x\n", lb_rsp_pkt->loopbackParams); complete_all(&host_ctx->loopback_done); break; default: pr_err("Not supported apps response received %d\n", msg_id); Loading Loading @@ -807,3 +818,36 @@ int32_t npu_host_exec_network(struct npu_device *npu_dev, return ret; } int32_t npu_host_loopback_test(struct npu_device *npu_dev) { struct ipc_cmd_loopback_pkt loopback_packet; struct npu_host_ctx *host_ctx = &npu_dev->host_ctx; int32_t ret; ret = fw_init(npu_dev); if (ret) return ret; loopback_packet.header.cmd_type = NPU_IPC_CMD_LOOPBACK; loopback_packet.header.size = sizeof(struct ipc_cmd_loopback_pkt); loopback_packet.header.trans_id = 0; loopback_packet.header.flags = 0; loopback_packet.loopbackParams = 15; reinit_completion(&host_ctx->loopback_done); ret = npu_host_ipc_send_cmd(npu_dev, IPC_QUEUE_APPS_EXEC, &loopback_packet); if (ret) { pr_err("NPU_IPC_CMD_LOOPBACK sent failed: %d\n", ret); } else if (!wait_for_completion_interruptible_timeout( &host_ctx->loopback_done, NW_LOAD_TIMEOUT)) { pr_err_ratelimited("npu: NPU_IPC_CMD_LOOPBACK time out\n"); ret = -ETIMEDOUT; } fw_deinit(npu_dev, true); return ret; }
drivers/media/platform/msm/npu/npu_mgr.h +2 −0 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ struct npu_host_ctx { struct completion exec_done; struct completion load_done; struct completion unload_done; struct completion loopback_done; int32_t network_num; struct npu_network networks[MAX_LOADED_NETWORK]; bool sys_cache_disable; Loading Loading @@ -111,6 +112,7 @@ int32_t npu_host_unload_network(struct npu_device *npu_dev, struct msm_npu_unload_network_ioctl *unload); int32_t npu_host_exec_network(struct npu_device *npu_dev, struct msm_npu_exec_network_ioctl *exec_ioctl); int32_t npu_host_loopback_test(struct npu_device *npu_dev); void npu_dump_debug_timeout_stats(struct npu_device *npu_dev); void npu_dump_cal_state(struct npu_device *npu_dev); Loading