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

Commit a711ecef authored by Jilai Wang's avatar Jilai Wang
Browse files

msm: npu: Add loopback test



This change is to add npu loopback test via debugfs.

Change-Id: I9091e0cbc353bee788cd22efe3c3c7d07c5cf227
Signed-off-by: default avatarJilai Wang <jilaiw@codeaurora.org>
parent 6401e390
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
+20 −0
Original line number Diff line number Diff line
@@ -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 */
@@ -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 */
@@ -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
 */
@@ -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 */

/*
+44 −0
Original line number Diff line number Diff line
@@ -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);
@@ -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;
}
@@ -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) {
@@ -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);
@@ -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;
}
+2 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);