4f0c16ec875e4f5239286844512c98ed02d70817
[platform/kernel/linux-starfive.git] / include / uapi / linux / ublk_cmd.h
1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 #ifndef USER_BLK_DRV_CMD_INC_H
3 #define USER_BLK_DRV_CMD_INC_H
4
5 #include <linux/types.h>
6
7 /* ublk server command definition */
8
9 /*
10  * Admin commands, issued by ublk server, and handled by ublk driver.
11  */
12 #define UBLK_CMD_GET_QUEUE_AFFINITY     0x01
13 #define UBLK_CMD_GET_DEV_INFO   0x02
14 #define UBLK_CMD_ADD_DEV                0x04
15 #define UBLK_CMD_DEL_DEV                0x05
16 #define UBLK_CMD_START_DEV      0x06
17 #define UBLK_CMD_STOP_DEV       0x07
18
19 /*
20  * IO commands, issued by ublk server, and handled by ublk driver.
21  *
22  * FETCH_REQ: issued via sqe(URING_CMD) beforehand for fetching IO request
23  *      from ublk driver, should be issued only when starting device. After
24  *      the associated cqe is returned, request's tag can be retrieved via
25  *      cqe->userdata.
26  *
27  * COMMIT_AND_FETCH_REQ: issued via sqe(URING_CMD) after ublkserver handled
28  *      this IO request, request's handling result is committed to ublk
29  *      driver, meantime FETCH_REQ is piggyback, and FETCH_REQ has to be
30  *      handled before completing io request.
31  */
32 #define UBLK_IO_FETCH_REQ               0x20
33 #define UBLK_IO_COMMIT_AND_FETCH_REQ    0x21
34
35 /* only ABORT means that no re-fetch */
36 #define UBLK_IO_RES_OK                  0
37 #define UBLK_IO_RES_ABORT               (-ENODEV)
38
39 #define UBLKSRV_CMD_BUF_OFFSET  0
40 #define UBLKSRV_IO_BUF_OFFSET   0x80000000
41
42 /* tag bit is 12bit, so at most 4096 IOs for each queue */
43 #define UBLK_MAX_QUEUE_DEPTH    4096
44
45 /*
46  * zero copy requires 4k block size, and can remap ublk driver's io
47  * request into ublksrv's vm space
48  */
49 #define UBLK_F_SUPPORT_ZERO_COPY        (1UL << 0)
50
51 /* device state */
52 #define UBLK_S_DEV_DEAD 0
53 #define UBLK_S_DEV_LIVE 1
54
55 /* shipped via sqe->cmd of io_uring command */
56 struct ublksrv_ctrl_cmd {
57         /* sent to which device, must be valid */
58         __u32   dev_id;
59
60         /* sent to which queue, must be -1 if the cmd isn't for queue */
61         __u16   queue_id;
62         /*
63          * cmd specific buffer, can be IN or OUT.
64          */
65         __u16   len;
66         __u64   addr;
67
68         /* inline data */
69         __u64   data[2];
70 };
71
72 struct ublksrv_ctrl_dev_info {
73         __u16   nr_hw_queues;
74         __u16   queue_depth;
75         __u16   block_size;
76         __u16   state;
77
78         __u32   rq_max_blocks;
79         __u32   dev_id;
80
81         __u64   dev_blocks;
82
83         __s32   ublksrv_pid;
84         __s32   reserved0;
85         __u64   flags[2];
86
87         /* For ublksrv internal use, invisible to ublk driver */
88         __u64   ublksrv_flags;
89         __u64   reserved1[9];
90 };
91
92 #define         UBLK_IO_OP_READ         0
93 #define         UBLK_IO_OP_WRITE                1
94 #define         UBLK_IO_OP_FLUSH                2
95 #define         UBLK_IO_OP_DISCARD      3
96 #define         UBLK_IO_OP_WRITE_SAME   4
97 #define         UBLK_IO_OP_WRITE_ZEROES 5
98
99 #define         UBLK_IO_F_FAILFAST_DEV          (1U << 8)
100 #define         UBLK_IO_F_FAILFAST_TRANSPORT    (1U << 9)
101 #define         UBLK_IO_F_FAILFAST_DRIVER       (1U << 10)
102 #define         UBLK_IO_F_META                  (1U << 11)
103 #define         UBLK_IO_F_INTEGRITY             (1U << 12)
104 #define         UBLK_IO_F_FUA                   (1U << 13)
105 #define         UBLK_IO_F_PREFLUSH              (1U << 14)
106 #define         UBLK_IO_F_NOUNMAP               (1U << 15)
107 #define         UBLK_IO_F_SWAP                  (1U << 16)
108
109 /*
110  * io cmd is described by this structure, and stored in share memory, indexed
111  * by request tag.
112  *
113  * The data is stored by ublk driver, and read by ublksrv after one fetch command
114  * returns.
115  */
116 struct ublksrv_io_desc {
117         /* op: bit 0-7, flags: bit 8-31 */
118         __u32           op_flags;
119
120         __u32           nr_sectors;
121
122         /* start sector for this io */
123         __u64           start_sector;
124
125         /* buffer address in ublksrv daemon vm space, from ublk driver */
126         __u64           addr;
127 };
128
129 static inline __u8 ublksrv_get_op(const struct ublksrv_io_desc *iod)
130 {
131         return iod->op_flags & 0xff;
132 }
133
134 static inline __u32 ublksrv_get_flags(const struct ublksrv_io_desc *iod)
135 {
136         return iod->op_flags >> 8;
137 }
138
139 /* issued to ublk driver via /dev/ublkcN */
140 struct ublksrv_io_cmd {
141         __u16   q_id;
142
143         /* for fetch/commit which result */
144         __u16   tag;
145
146         /* io result, it is valid for COMMIT* command only */
147         __s32   result;
148
149         /*
150          * userspace buffer address in ublksrv daemon process, valid for
151          * FETCH* command only
152          */
153         __u64   addr;
154 };
155
156 #endif