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

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

Merge "msm: npu: Firmware APIs update and add new ioctl commands"

parents da033616 ea0adb14
Loading
Loading
Loading
Loading
+1 −24
Original line number Diff line number Diff line
@@ -35,30 +35,6 @@
 * Defines
 * -------------------------------------------------------------------------
 */
/* get npu info */
#define MSM_NPU_GET_INFO_32 \
	_IOWR(MSM_NPU_IOCTL_MAGIC, 1, compat_caddr_t)

/* map buf */
#define MSM_NPU_MAP_BUF_32 \
	_IOWR(MSM_NPU_IOCTL_MAGIC, 2, compat_caddr_t)

/* map buf */
#define MSM_NPU_UNMAP_BUF_32 \
	_IOWR(MSM_NPU_IOCTL_MAGIC, 3, compat_caddr_t)

/* load network */
#define MSM_NPU_LOAD_NETWORK_32 \
	_IOWR(MSM_NPU_IOCTL_MAGIC, 4, compat_caddr_t)

/* unload network */
#define MSM_NPU_UNLOAD_NETWORK_32 \
	_IOWR(MSM_NPU_IOCTL_MAGIC, 5, compat_caddr_t)

/* exec network */
#define MSM_NPU_EXEC_NETWORK_32 \
	_IOWR(MSM_NPU_IOCTL_MAGIC, 6, compat_caddr_t)

#define NPU_MAX_MBOX_NUM	    2
#define NPU_MBOX_LOW_PRI	    0
#define NPU_MBOX_HIGH_PRI	    1
@@ -229,6 +205,7 @@ struct npu_device {
	struct npu_thermalctrl thermalctrl;

	struct llcc_slice_desc *sys_cache;
	uint32_t execute_v2_flag;
};


+8 −2
Original line number Diff line number Diff line
@@ -461,13 +461,19 @@ int npu_debugfs_init(struct npu_device *npu_dev)

	if (!debugfs_create_u32("fw_state", 0444,
		debugfs->root, &(host_ctx->fw_state))) {
		pr_err("debugfs_creat_bool fail for fw_state\n");
		pr_err("debugfs_create_u32 fail for fw_state\n");
		goto err;
	}

	if (!debugfs_create_u32("pwr_level", 0444,
		debugfs->root, &(pwr->active_pwrlevel))) {
		pr_err("debugfs_creat_bool fail for power level\n");
		pr_err("debugfs_create_u32 fail for pwr_level\n");
		goto err;
	}

	if (!debugfs_create_u32("exec_flags", 0644,
		debugfs->root, &(host_ctx->exec_flags_override))) {
		pr_err("debugfs_create_u32 fail for exec_flags\n");
		goto err;
	}

+102 −0
Original line number Diff line number Diff line
@@ -77,8 +77,10 @@ static int npu_get_info(struct npu_device *npu_dev, unsigned long arg);
static int npu_map_buf(struct npu_device *npu_dev, unsigned long arg);
static int npu_unmap_buf(struct npu_device *npu_dev, unsigned long arg);
static int npu_load_network(struct npu_device *npu_dev, unsigned long arg);
static int npu_load_network_v2(struct npu_device *npu_dev, unsigned long arg);
static int npu_unload_network(struct npu_device *npu_dev, unsigned long arg);
static int npu_exec_network(struct npu_device *npu_dev, unsigned long arg);
static int npu_exec_network_v2(struct npu_device *npu_dev, unsigned long arg);
static long npu_ioctl(struct file *file, unsigned int cmd,
					unsigned long arg);
static int npu_parse_dt_clock(struct npu_device *npu_dev);
@@ -900,6 +902,51 @@ static int npu_load_network(struct npu_device *npu_dev, unsigned long arg)
	return 0;
}

static int npu_load_network_v2(struct npu_device *npu_dev, unsigned long arg)
{
	struct msm_npu_load_network_ioctl_v2 req;
	void __user *argp = (void __user *)arg;
	struct msm_npu_patch_info_v2 *patch_info = NULL;
	int ret;

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

	if (req.patch_info_num > MSM_NPU_MAX_PATCH_LAYER_NUM) {
		pr_err("Invalid patch info num %d[max:%d]\n",
			req.patch_info_num, MSM_NPU_MAX_PATCH_LAYER_NUM);
		return -EINVAL;
	}

	if (req.patch_info_num) {
		patch_info = kmalloc_array(req.patch_info_num,
			sizeof(*patch_info), GFP_KERNEL);
		if (!patch_info)
			return -ENOMEM;

		copy_from_user(patch_info,
			(void __user *)req.patch_info,
			req.patch_info_num * sizeof(*patch_info));
	}

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

	ret = npu_host_load_network_v2(npu_dev, &req, patch_info);
	if (ret) {
		pr_err("network load failed: %d\n", ret);
	} else {
		ret = copy_to_user(argp, &req, sizeof(req));
		if (ret)
			pr_err("fail to copy to user\n");
	}

	kfree(patch_info);
	return ret;
}

static int npu_unload_network(struct npu_device *npu_dev, unsigned long arg)
{
	struct msm_npu_unload_network_ioctl req;
@@ -958,6 +1005,55 @@ static int npu_exec_network(struct npu_device *npu_dev, unsigned long arg)
	return 0;
}

static int npu_exec_network_v2(struct npu_device *npu_dev, unsigned long arg)
{
	struct msm_npu_exec_network_ioctl_v2 req;
	void __user *argp = (void __user *)arg;
	struct msm_npu_patch_buf_info *patch_buf_info = NULL;
	int ret;

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

	if (req.patch_buf_info_num > MSM_NPU_MAX_PATCH_LAYER_NUM) {
		pr_err("Invalid patch buf info num %d[max:%d]\n",
			req.patch_buf_info_num, MSM_NPU_MAX_PATCH_LAYER_NUM);
		return -EINVAL;
	}

	if (req.stats_buf_size > MSM_NPU_MAX_STATS_BUF_SIZE) {
		pr_err("Invalid stats buffer size %d max %d\n",
			req.stats_buf_size, MSM_NPU_MAX_STATS_BUF_SIZE);
		return -EINVAL;
	}

	if (req.patch_buf_info_num) {
		patch_buf_info = kmalloc_array(req.patch_buf_info_num,
			sizeof(*patch_buf_info), GFP_KERNEL);
		if (!patch_buf_info)
			return -ENOMEM;

		copy_from_user(patch_buf_info,
			(void __user *)req.patch_buf_info,
			req.patch_buf_info_num * sizeof(*patch_buf_info));
	}

	ret = npu_host_exec_network_v2(npu_dev, &req, patch_buf_info);
	if (ret) {
		pr_err("npu_host_exec_network failed\n");
	} else {
		ret = copy_to_user(argp, &req, sizeof(req));
		if (ret)
			pr_err("fail to copy to user\n");
	}

	kfree(patch_buf_info);
	return ret;
}

static long npu_ioctl(struct file *file, unsigned int cmd,
						 unsigned long arg)
{
@@ -977,12 +1073,18 @@ static long npu_ioctl(struct file *file, unsigned int cmd,
	case MSM_NPU_LOAD_NETWORK:
		ret = npu_load_network(npu_dev, arg);
		break;
	case MSM_NPU_LOAD_NETWORK_V2:
		ret = npu_load_network_v2(npu_dev, arg);
		break;
	case MSM_NPU_UNLOAD_NETWORK:
		ret = npu_unload_network(npu_dev, arg);
		break;
	case MSM_NPU_EXEC_NETWORK:
		ret = npu_exec_network(npu_dev, arg);
		break;
	case MSM_NPU_EXEC_NETWORK_V2:
		ret = npu_exec_network_v2(npu_dev, arg);
		break;
	default:
		pr_err("unexpected IOCTL %x\n", cmd);
	}
+89 −12
Original line number Diff line number Diff line
@@ -32,8 +32,12 @@
#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 */
/* ipc_cmd_loopback_packet */
#define NPU_IPC_CMD_LOOPBACK            0x00000008
/* ipc_cmd_load_packet_v2_t */
#define NPU_IPC_CMD_LOAD_V2             0x00000009
/* ipc_cmd_execute_packet_v2 */
#define NPU_IPC_CMD_EXECUTE_V2          0x0000000A

/* Messages sent **from** NPU */
/* IPC Message Response -- uint32_t */
@@ -47,8 +51,10 @@
#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 */
/* ipc_msg_loopback_pkt */
#define NPU_IPC_MSG_LOOPBACK_DONE       0x00010005
/* ipc_msg_execute_pkt_v2 */
#define NPU_IPC_MSG_EXECUTE_V2_DONE     0x00010006

/* Logging message size */
/* Number 32-bit elements for the maximum log message size */
@@ -153,6 +159,31 @@ struct npu_aco_buffer {
	uint64_t address;
};

/*
 * ACO Buffer V2 definition
 */
struct npu_aco_buffer_v2 {
	/*
	 * used to track if previous network is the same and already loaded,
	 * we can save a dma
	 */
	uint32_t network_id;
	/*
	 * size of header + first chunk ACO buffer -
	 * this saves a dma by dmaing both header and first chunk
	 */
	uint32_t buf_size;
	/*
	 * SMMU 32-bit mapped address that the DMA engine can read -
	 * uses lower 32 bits
	 */
	uint32_t address;
	/*
	 * number of layers in the network
	 */
	uint32_t num_layers;
};

/*
 * ACO Patch Parameters
 */
@@ -165,6 +196,18 @@ struct npu_patch_tuple {
	uint32_t loc_offset;
};

/*
 * ACO Patch Tuple V2
 */
struct npu_patch_tuple_v2 {
	uint32_t value;
	uint32_t chunk_id;
	uint32_t instruction_size_in_bytes;
	uint32_t variable_size_in_bits;
	uint32_t shift_value_in_bits;
	uint32_t loc_offset;
};

struct npu_patch_params {
	uint32_t num_params;
	struct npu_patch_tuple param[2];
@@ -178,12 +221,22 @@ struct ipc_cmd_load_pkt {
	struct npu_aco_buffer buf_pkt;
};

/*
 * LOAD command packet V2 definition
 */
struct ipc_cmd_load_pkt_v2 {
	struct ipc_cmd_header_pkt header;
	struct npu_aco_buffer_v2 buf_pkt;
	uint32_t num_patch_params;
	struct npu_patch_tuple_v2 patch_params[0];
};

/*
 * UNLOAD command packet definition
 */
struct ipc_cmd_unload_pkt {
	struct ipc_cmd_header_pkt header;
	uint32_t aco_hdl;
	uint32_t network_hdl;
};

/*
@@ -192,7 +245,22 @@ struct ipc_cmd_unload_pkt {
struct ipc_cmd_execute_pkt {
	struct ipc_cmd_header_pkt header;
	struct npu_patch_params patch_params;
	uint32_t aco_hdl;
	uint32_t network_hdl;
};

struct npu_patch_params_v2 {
	uint32_t value;
	uint32_t id;
};

/*
 * Execute packet V2 definition
 */
struct ipc_cmd_execute_pkt_v2 {
	struct ipc_cmd_header_pkt header;
	uint32_t network_hdl;
	uint32_t num_patch_params;
	struct npu_patch_params_v2 patch_params[0];
};

/*
@@ -208,22 +276,21 @@ struct ipc_cmd_loopback_pkt {
 */
struct ipc_msg_load_pkt {
	struct ipc_msg_header_pkt header;
	uint32_t aco_hdl;
	uint32_t network_hdl;
};

/*
 * UNLOAD response packet definition -- ipc_msg_header_pkt
 * UNLOAD response packet definition
 */
struct ipc_msg_unload_pkt {
	struct ipc_msg_header_pkt header;
	uint32_t network_hdl;
};

/*
 * Layer Stats information returned back during EXECUTE_DONE response
 */
struct ipc_layer_stats {
	/*
	 * layer id
	 * 8 bits enough for the current networks supporting
	 */
	uint8_t layer_id;
	/*
	 * hardware tick count per layer
	 */
@@ -234,7 +301,7 @@ struct ipc_execute_layer_stats {
	/*
	 * total number of layers associated with the execution
	 */
	uint8_t total_num_layers;
	uint32_t total_num_layers;
	/*
	 * pointer to each layer stats
	 */
@@ -267,6 +334,16 @@ struct ipc_execute_stats {
struct ipc_msg_execute_pkt {
	struct ipc_msg_header_pkt header;
	struct ipc_execute_stats stats;
	uint32_t network_hdl;
};

/*
 * EXECUTE V2 response packet definition
 */
struct ipc_msg_execute_pkt_v2 {
	struct ipc_msg_header_pkt header;
	uint32_t network_hdl;
	uint32_t stats_data[0];
};

/*
+351 −65

File changed.

Preview size limit exceeded, changes collapsed.

Loading