Commit 84019dd8 authored by Yizhen Fan's avatar Yizhen Fan Committed by fanyizhen1995
Browse files

ub: uburma add cmd user control implementation.



driver inclusion
category: feature
bugzilla: NA
CVE: NA

--------------------------------

Uburma add implementations of handling user control cmd from
user layer.

This will make kernel possible to handle urma_user_ctl in user-layer urma.

User_ctl will finally call ubcore_user_control.

Signed-off-by: default avatarGuoxin Qian <qianguoxin@huawei.com>
Signed-off-by: default avatarYizhen Fan <fanyizhen@huawei.com>
parent b9103ff6
Loading
Loading
Loading
Loading
+49 −0
Original line number Diff line number Diff line
@@ -1456,6 +1456,54 @@ static int uburma_cmd_unbind_jetty(struct ubcore_device *ubc_dev, struct uburma_
	return ret;
}

static int uburma_fill_user_ctl_info(struct ubcore_ucontext *ctx,
				     struct uburma_cmd_user_ctl *user_ctl,
				     struct ubcore_user_ctl *k_user_ctl)
{
	if (ctx == NULL) {
		uburma_log_err("parameter invalid with ctx nullptr.\n");
		return -EINVAL;
	}

	k_user_ctl->uctx = ctx;
	k_user_ctl->in.addr = user_ctl->in.addr;
	k_user_ctl->in.len = user_ctl->in.len;
	k_user_ctl->in.opcode = user_ctl->in.opcode;

	k_user_ctl->out.addr = user_ctl->out.addr;
	k_user_ctl->out.len = user_ctl->out.len;

	k_user_ctl->udrv_data.in_addr = user_ctl->udrv.in_addr;
	k_user_ctl->udrv_data.in_len = user_ctl->udrv.in_len;
	k_user_ctl->udrv_data.out_addr = user_ctl->udrv.out_addr;
	k_user_ctl->udrv_data.out_len = user_ctl->udrv.out_len;

	return 0;
}

static int uburma_cmd_user_ctl(struct ubcore_device *ubc_dev, struct uburma_file *file,
			       struct uburma_cmd_hdr *hdr)
{
	struct ubcore_user_ctl k_user_ctl = { 0 };
	struct uburma_cmd_user_ctl user_ctl;
	int ret;

	ret = uburma_copy_from_user(&user_ctl, (void __user *)(uintptr_t)hdr->args_addr,
				    sizeof(struct uburma_cmd_user_ctl));
	if (ret != 0)
		return ret;

	ret = uburma_fill_user_ctl_info(file->ucontext, &user_ctl, &k_user_ctl);
	if (ret != 0)
		return ret;

	ret = ubcore_user_control(&k_user_ctl);
	if (ret != 0)
		return ret;

	return 0;
}

typedef int (*uburma_cmd_handler)(struct ubcore_device *ubc_dev, struct uburma_file *file,
				  struct uburma_cmd_hdr *hdr);

@@ -1491,6 +1539,7 @@ static uburma_cmd_handler g_uburma_cmd_handlers[] = {
	[UBURMA_CMD_UNADVISE_JETTY] = uburma_cmd_unadvise_jetty,
	[UBURMA_CMD_BIND_JETTY] = uburma_cmd_bind_jetty,
	[UBURMA_CMD_UNBIND_JETTY] = uburma_cmd_unbind_jetty,
	[UBURMA_CMD_USER_CTL] = uburma_cmd_user_ctl
};

static int uburma_cmd_parse(struct ubcore_device *ubc_dev, struct uburma_file *file,
+19 −0
Original line number Diff line number Diff line
@@ -384,6 +384,25 @@ struct uburma_cmd_unadvise_jetty {
	} in;
};

struct uburma_cmd_user_ctl {
	struct {
		uint64_t addr;
		uint32_t len;
		uint32_t opcode;
	} in; /* struct [in] should be consistent with [urma_user_ctl_in_t] */
	struct {
		uint64_t addr;
		uint32_t len;
		uint32_t rsv;
	} out; /* struct [out] should be consistent with [urma_user_ctl_out_t] */
	struct {
		uint64_t in_addr;
		uint32_t in_len;
		uint64_t out_addr;
		uint32_t out_len;
	} udrv; /* struct [udrv] should be consistent with [urma_udrv_t] */
};

/* only for event ioctl */
#define MAX_JFCE_EVENT_CNT 16
#define UBURMA_EVENT_CMD_MAGIC 'E'