Commit dfd423e0 authored by Dan Williams's avatar Dan Williams
Browse files

Merge branch 'for-6.3/cxl' into cxl/next

Pick up some final miscellaneous updates for v6.3 including support for
communicating 'exclusive' and 'enabled' state of commands.
parents dbe9f7d1 af73370d
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -453,9 +453,14 @@ int cxl_query_cmd(struct cxl_memdev *cxlmd,
	 * structures.
	 */
	cxl_for_each_cmd(cmd) {
		const struct cxl_command_info *info = &cmd->info;
		struct cxl_command_info info = cmd->info;

		if (copy_to_user(&q->commands[j++], info, sizeof(*info)))
		if (test_bit(info.id, cxlmd->cxlds->enabled_cmds))
			info.flags |= CXL_MEM_COMMAND_FLAG_ENABLED;
		if (test_bit(info.id, cxlmd->cxlds->exclusive_cmds))
			info.flags |= CXL_MEM_COMMAND_FLAG_EXCLUSIVE;

		if (copy_to_user(&q->commands[j++], &info, sizeof(info)))
			return -EFAULT;

		if (j == n_commands)
+1 −1
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ static struct cxl_memdev *cxl_memdev_alloc(struct cxl_dev_state *cxlds,
	if (!cxlmd)
		return ERR_PTR(-ENOMEM);

	rc = ida_alloc_range(&cxl_memdev_ida, 0, CXL_MEM_MAX_DEVS, GFP_KERNEL);
	rc = ida_alloc_max(&cxl_memdev_ida, CXL_MEM_MAX_DEVS - 1, GFP_KERNEL);
	if (rc < 0)
		goto err;
	cxlmd->id = rc;
+0 −1
Original line number Diff line number Diff line
@@ -565,7 +565,6 @@ struct cxl_mem_command {
	struct cxl_command_info info;
	enum cxl_opcode opcode;
	u32 flags;
#define CXL_CMD_FLAG_NONE 0
#define CXL_CMD_FLAG_FORCE_ENABLE BIT(0)
};

+25 −5
Original line number Diff line number Diff line
@@ -11,14 +11,19 @@
/**
 * DOC: UAPI
 *
 * Not all of all commands that the driver supports are always available for use
 * by userspace. Userspace must check the results from the QUERY command in
 * order to determine the live set of commands.
 * Not all of the commands that the driver supports are available for use by
 * userspace at all times.  Userspace can check the result of the QUERY command
 * to determine the live set of commands.  Alternatively, it can issue the
 * command and check for failure.
 */

#define CXL_MEM_QUERY_COMMANDS _IOR(0xCE, 1, struct cxl_mem_query_commands)
#define CXL_MEM_SEND_COMMAND _IOWR(0xCE, 2, struct cxl_send_command)

/*
 * NOTE: New defines must be added to the end of the list to preserve
 * compatibility because this enum is exported to user space.
 */
#define CXL_CMDS                                                          \
	___C(INVALID, "Invalid Command"),                                 \
	___C(IDENTIFY, "Identify Command"),                               \
@@ -68,6 +73,19 @@ static const struct {
 * struct cxl_command_info - Command information returned from a query.
 * @id: ID number for the command.
 * @flags: Flags that specify command behavior.
 *
 *         CXL_MEM_COMMAND_FLAG_USER_ENABLED
 *
 *         The given command id is supported by the driver and is supported by
 *         a related opcode on the device.
 *
 *         CXL_MEM_COMMAND_FLAG_EXCLUSIVE
 *
 *         Requests with the given command id will terminate with EBUSY as the
 *         kernel actively owns management of the given resource. For example,
 *         the label-storage-area can not be written while the kernel is
 *         actively managing that space.
 *
 * @size_in: Expected input size, or ~0 if variable length.
 * @size_out: Expected output size, or ~0 if variable length.
 *
@@ -77,7 +95,7 @@ static const struct {
 * bytes of output.
 *
 *  - @id = 10
 *  - @flags = 0
 *  - @flags = CXL_MEM_COMMAND_FLAG_ENABLED
 *  - @size_in = ~0
 *  - @size_out = 0
 *
@@ -87,7 +105,9 @@ struct cxl_command_info {
	__u32 id;

	__u32 flags;
#define CXL_MEM_COMMAND_FLAG_MASK GENMASK(0, 0)
#define CXL_MEM_COMMAND_FLAG_MASK		GENMASK(1, 0)
#define CXL_MEM_COMMAND_FLAG_ENABLED		BIT(0)
#define CXL_MEM_COMMAND_FLAG_EXCLUSIVE		BIT(1)

	__u32 size_in;
	__u32 size_out;