Loading drivers/cxl/core/mbox.c +7 −2 Original line number Diff line number Diff line Loading @@ -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) Loading drivers/cxl/core/memdev.c +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading drivers/cxl/cxlmem.h +0 −1 Original line number Diff line number Diff line Loading @@ -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) }; Loading include/uapi/linux/cxl_mem.h +25 −5 Original line number Diff line number Diff line Loading @@ -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"), \ Loading Loading @@ -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. * Loading @@ -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 * Loading @@ -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; Loading Loading
drivers/cxl/core/mbox.c +7 −2 Original line number Diff line number Diff line Loading @@ -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) Loading
drivers/cxl/core/memdev.c +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
drivers/cxl/cxlmem.h +0 −1 Original line number Diff line number Diff line Loading @@ -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) }; Loading
include/uapi/linux/cxl_mem.h +25 −5 Original line number Diff line number Diff line Loading @@ -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"), \ Loading Loading @@ -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. * Loading @@ -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 * Loading @@ -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; Loading