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 #define UBLK_CMD_SET_PARAMS 0x08 19 #define UBLK_CMD_GET_PARAMS 0x09 20 21 /* 22 * IO commands, issued by ublk server, and handled by ublk driver. 23 * 24 * FETCH_REQ: issued via sqe(URING_CMD) beforehand for fetching IO request 25 * from ublk driver, should be issued only when starting device. After 26 * the associated cqe is returned, request's tag can be retrieved via 27 * cqe->userdata. 28 * 29 * COMMIT_AND_FETCH_REQ: issued via sqe(URING_CMD) after ublkserver handled 30 * this IO request, request's handling result is committed to ublk 31 * driver, meantime FETCH_REQ is piggyback, and FETCH_REQ has to be 32 * handled before completing io request. 33 */ 34 #define UBLK_IO_FETCH_REQ 0x20 35 #define UBLK_IO_COMMIT_AND_FETCH_REQ 0x21 36 37 /* only ABORT means that no re-fetch */ 38 #define UBLK_IO_RES_OK 0 39 #define UBLK_IO_RES_ABORT (-ENODEV) 40 41 #define UBLKSRV_CMD_BUF_OFFSET 0 42 #define UBLKSRV_IO_BUF_OFFSET 0x80000000 43 44 /* tag bit is 12bit, so at most 4096 IOs for each queue */ 45 #define UBLK_MAX_QUEUE_DEPTH 4096 46 47 /* 48 * zero copy requires 4k block size, and can remap ublk driver's io 49 * request into ublksrv's vm space 50 */ 51 #define UBLK_F_SUPPORT_ZERO_COPY (1ULL << 0) 52 53 /* 54 * Force to complete io cmd via io_uring_cmd_complete_in_task so that 55 * performance comparison is done easily with using task_work_add 56 */ 57 #define UBLK_F_URING_CMD_COMP_IN_TASK (1ULL << 1) 58 59 /* device state */ 60 #define UBLK_S_DEV_DEAD 0 61 #define UBLK_S_DEV_LIVE 1 62 63 /* shipped via sqe->cmd of io_uring command */ 64 struct ublksrv_ctrl_cmd { 65 /* sent to which device, must be valid */ 66 __u32 dev_id; 67 68 /* sent to which queue, must be -1 if the cmd isn't for queue */ 69 __u16 queue_id; 70 /* 71 * cmd specific buffer, can be IN or OUT. 72 */ 73 __u16 len; 74 __u64 addr; 75 76 /* inline data */ 77 __u64 data[2]; 78 }; 79 80 struct ublksrv_ctrl_dev_info { 81 __u16 nr_hw_queues; 82 __u16 queue_depth; 83 __u16 state; 84 __u16 pad0; 85 86 __u32 max_io_buf_bytes; 87 __u32 dev_id; 88 89 __s32 ublksrv_pid; 90 __u32 pad1; 91 92 __u64 flags; 93 94 /* For ublksrv internal use, invisible to ublk driver */ 95 __u64 ublksrv_flags; 96 97 __u64 reserved0; 98 __u64 reserved1; 99 __u64 reserved2; 100 }; 101 102 #define UBLK_IO_OP_READ 0 103 #define UBLK_IO_OP_WRITE 1 104 #define UBLK_IO_OP_FLUSH 2 105 #define UBLK_IO_OP_DISCARD 3 106 #define UBLK_IO_OP_WRITE_SAME 4 107 #define UBLK_IO_OP_WRITE_ZEROES 5 108 109 #define UBLK_IO_F_FAILFAST_DEV (1U << 8) 110 #define UBLK_IO_F_FAILFAST_TRANSPORT (1U << 9) 111 #define UBLK_IO_F_FAILFAST_DRIVER (1U << 10) 112 #define UBLK_IO_F_META (1U << 11) 113 #define UBLK_IO_F_FUA (1U << 13) 114 #define UBLK_IO_F_NOUNMAP (1U << 15) 115 #define UBLK_IO_F_SWAP (1U << 16) 116 117 /* 118 * io cmd is described by this structure, and stored in share memory, indexed 119 * by request tag. 120 * 121 * The data is stored by ublk driver, and read by ublksrv after one fetch command 122 * returns. 123 */ 124 struct ublksrv_io_desc { 125 /* op: bit 0-7, flags: bit 8-31 */ 126 __u32 op_flags; 127 128 __u32 nr_sectors; 129 130 /* start sector for this io */ 131 __u64 start_sector; 132 133 /* buffer address in ublksrv daemon vm space, from ublk driver */ 134 __u64 addr; 135 }; 136 137 static inline __u8 ublksrv_get_op(const struct ublksrv_io_desc *iod) 138 { 139 return iod->op_flags & 0xff; 140 } 141 142 static inline __u32 ublksrv_get_flags(const struct ublksrv_io_desc *iod) 143 { 144 return iod->op_flags >> 8; 145 } 146 147 /* issued to ublk driver via /dev/ublkcN */ 148 struct ublksrv_io_cmd { 149 __u16 q_id; 150 151 /* for fetch/commit which result */ 152 __u16 tag; 153 154 /* io result, it is valid for COMMIT* command only */ 155 __s32 result; 156 157 /* 158 * userspace buffer address in ublksrv daemon process, valid for 159 * FETCH* command only 160 */ 161 __u64 addr; 162 }; 163 164 struct ublk_param_basic { 165 #define UBLK_ATTR_READ_ONLY (1 << 0) 166 #define UBLK_ATTR_ROTATIONAL (1 << 1) 167 #define UBLK_ATTR_VOLATILE_CACHE (1 << 2) 168 #define UBLK_ATTR_FUA (1 << 3) 169 __u32 attrs; 170 __u8 logical_bs_shift; 171 __u8 physical_bs_shift; 172 __u8 io_opt_shift; 173 __u8 io_min_shift; 174 175 __u32 max_sectors; 176 __u32 chunk_sectors; 177 178 __u64 dev_sectors; 179 __u64 virt_boundary_mask; 180 }; 181 182 struct ublk_param_discard { 183 __u32 discard_alignment; 184 185 __u32 discard_granularity; 186 __u32 max_discard_sectors; 187 188 __u32 max_write_zeroes_sectors; 189 __u16 max_discard_segments; 190 __u16 reserved0; 191 }; 192 193 struct ublk_params { 194 /* 195 * Total length of parameters, userspace has to set 'len' for both 196 * SET_PARAMS and GET_PARAMS command, and driver may update len 197 * if two sides use different version of 'ublk_params', same with 198 * 'types' fields. 199 */ 200 __u32 len; 201 #define UBLK_PARAM_TYPE_BASIC (1 << 0) 202 #define UBLK_PARAM_TYPE_DISCARD (1 << 1) 203 __u32 types; /* types of parameter included */ 204 205 struct ublk_param_basic basic; 206 struct ublk_param_discard discard; 207 }; 208 209 #endif 210