2#ifndef USER_BLK_DRV_CMD_INC_H
3#define USER_BLK_DRV_CMD_INC_H
5#include <linux/types.h>
15#define UBLK_CMD_GET_QUEUE_AFFINITY 0x01
16#define UBLK_CMD_GET_DEV_INFO 0x02
17#define UBLK_CMD_ADD_DEV 0x04
18#define UBLK_CMD_DEL_DEV 0x05
19#define UBLK_CMD_START_DEV 0x06
20#define UBLK_CMD_STOP_DEV 0x07
21#define UBLK_CMD_SET_PARAMS 0x08
22#define UBLK_CMD_GET_PARAMS 0x09
23#define UBLK_CMD_START_USER_RECOVERY 0x10
24#define UBLK_CMD_END_USER_RECOVERY 0x11
25#define UBLK_CMD_GET_DEV_INFO2 0x12
28#define UBLK_U_CMD_GET_QUEUE_AFFINITY \
29 _IOR('u', UBLK_CMD_GET_QUEUE_AFFINITY, struct ublksrv_ctrl_cmd)
30#define UBLK_U_CMD_GET_DEV_INFO \
31 _IOR('u', UBLK_CMD_GET_DEV_INFO, struct ublksrv_ctrl_cmd)
32#define UBLK_U_CMD_ADD_DEV \
33 _IOWR('u', UBLK_CMD_ADD_DEV, struct ublksrv_ctrl_cmd)
34#define UBLK_U_CMD_DEL_DEV \
35 _IOWR('u', UBLK_CMD_DEL_DEV, struct ublksrv_ctrl_cmd)
36#define UBLK_U_CMD_START_DEV \
37 _IOWR('u', UBLK_CMD_START_DEV, struct ublksrv_ctrl_cmd)
38#define UBLK_U_CMD_STOP_DEV \
39 _IOWR('u', UBLK_CMD_STOP_DEV, struct ublksrv_ctrl_cmd)
40#define UBLK_U_CMD_SET_PARAMS \
41 _IOWR('u', UBLK_CMD_SET_PARAMS, struct ublksrv_ctrl_cmd)
42#define UBLK_U_CMD_GET_PARAMS \
43 _IOR('u', UBLK_CMD_GET_PARAMS, struct ublksrv_ctrl_cmd)
44#define UBLK_U_CMD_START_USER_RECOVERY \
45 _IOWR('u', UBLK_CMD_START_USER_RECOVERY, struct ublksrv_ctrl_cmd)
46#define UBLK_U_CMD_END_USER_RECOVERY \
47 _IOWR('u', UBLK_CMD_END_USER_RECOVERY, struct ublksrv_ctrl_cmd)
48#define UBLK_U_CMD_GET_DEV_INFO2 \
49 _IOR('u', UBLK_CMD_GET_DEV_INFO2, struct ublksrv_ctrl_cmd)
50#define UBLK_U_CMD_GET_FEATURES \
51 _IOR('u', 0x13, struct ublksrv_ctrl_cmd)
52#define UBLK_U_CMD_DEL_DEV_ASYNC \
53 _IOR('u', 0x14, struct ublksrv_ctrl_cmd)
54#define UBLK_U_CMD_UPDATE_SIZE \
55 _IOWR('u', 0x15, struct ublksrv_ctrl_cmd)
56#define UBLK_U_CMD_QUIESCE_DEV \
57 _IOWR('u', 0x16, struct ublksrv_ctrl_cmd)
58#define UBLK_U_CMD_TRY_STOP_DEV \
59 _IOWR('u', 0x17, struct ublksrv_ctrl_cmd)
80#define UBLK_U_CMD_REG_BUF \
81 _IOWR('u', 0x18, struct ublksrv_ctrl_cmd)
86#define UBLK_U_CMD_UNREG_BUF \
87 _IOWR('u', 0x19, struct ublksrv_ctrl_cmd)
90struct ublk_shmem_buf_reg {
98#define UBLK_SHMEM_BUF_READ_ONLY (1U << 0)
103#define UBLK_FEATURES_LEN 8
130#define UBLK_IO_FETCH_REQ 0x20
131#define UBLK_IO_COMMIT_AND_FETCH_REQ 0x21
132#define UBLK_IO_NEED_GET_DATA 0x22
135#define UBLK_U_IO_FETCH_REQ \
136 _IOWR('u', UBLK_IO_FETCH_REQ, struct ublksrv_io_cmd)
137#define UBLK_U_IO_COMMIT_AND_FETCH_REQ \
138 _IOWR('u', UBLK_IO_COMMIT_AND_FETCH_REQ, struct ublksrv_io_cmd)
139#define UBLK_U_IO_NEED_GET_DATA \
140 _IOWR('u', UBLK_IO_NEED_GET_DATA, struct ublksrv_io_cmd)
141#define UBLK_U_IO_REGISTER_IO_BUF \
142 _IOWR('u', 0x23, struct ublksrv_io_cmd)
143#define UBLK_U_IO_UNREGISTER_IO_BUF \
144 _IOWR('u', 0x24, struct ublksrv_io_cmd)
150#define UBLK_U_IO_PREP_IO_CMDS \
151 _IOWR('u', 0x25, struct ublk_batch_io)
160#define UBLK_U_IO_COMMIT_IO_CMDS \
161 _IOWR('u', 0x26, struct ublk_batch_io)
167#define UBLK_U_IO_FETCH_IO_CMDS \
168 _IOWR('u', 0x27, struct ublk_batch_io)
171#define UBLK_IO_RES_OK 0
172#define UBLK_IO_RES_NEED_GET_DATA 1
173#define UBLK_IO_RES_ABORT (-ENODEV)
175#define UBLKSRV_CMD_BUF_OFFSET 0
176#define UBLKSRV_IO_BUF_OFFSET 0x80000000
179#define UBLK_MAX_QUEUE_DEPTH 4096
182#define UBLK_IO_BUF_OFF 0
183#define UBLK_IO_BUF_BITS 25
184#define UBLK_IO_BUF_BITS_MASK ((1ULL << UBLK_IO_BUF_BITS) - 1)
187#define UBLK_TAG_OFF UBLK_IO_BUF_BITS
188#define UBLK_TAG_BITS 16
189#define UBLK_TAG_BITS_MASK ((1ULL << UBLK_TAG_BITS) - 1)
192#define UBLK_QID_OFF (UBLK_TAG_OFF + UBLK_TAG_BITS)
193#define UBLK_QID_BITS 12
194#define UBLK_QID_BITS_MASK ((1ULL << UBLK_QID_BITS) - 1)
196#define UBLK_MAX_NR_QUEUES (1U << UBLK_QID_BITS)
198#define UBLKSRV_IO_BUF_TOTAL_BITS (UBLK_QID_OFF + UBLK_QID_BITS)
199#define UBLKSRV_IO_BUF_TOTAL_SIZE (1ULL << UBLKSRV_IO_BUF_TOTAL_BITS)
202#define UBLK_INTEGRITY_FLAG_OFF 62
203#define UBLKSRV_IO_INTEGRITY_FLAG (1ULL << UBLK_INTEGRITY_FLAG_OFF)
229#define UBLK_F_SUPPORT_ZERO_COPY (1ULL << 0)
235#define UBLK_F_URING_CMD_COMP_IN_TASK (1ULL << 1)
244#define UBLK_F_NEED_GET_DATA (1UL << 2)
251#define UBLK_F_USER_RECOVERY (1UL << 3)
258#define UBLK_F_USER_RECOVERY_REISSUE (1UL << 4)
279#define UBLK_F_UNPRIVILEGED_DEV (1UL << 5)
282#define UBLK_F_CMD_IOCTL_ENCODE (1UL << 6)
291#define UBLK_F_USER_COPY (1UL << 7)
297#define UBLK_F_ZONED (1ULL << 8)
304#define UBLK_F_USER_RECOVERY_FAIL_IO (1ULL << 9)
310#define UBLK_F_UPDATE_SIZE (1ULL << 10)
344#define UBLK_F_AUTO_BUF_REG (1ULL << 11)
361#define UBLK_F_QUIESCE (1ULL << 12)
370#define UBLK_F_PER_IO_DAEMON (1ULL << 13)
380#define UBLK_F_BUF_REG_OFF_DAEMON (1ULL << 14)
395#define UBLK_F_BATCH_IO (1ULL << 15)
401#define UBLK_F_INTEGRITY (1ULL << 16)
407#define UBLK_F_SAFE_STOP_DEV (1ULL << 17)
410#define UBLK_F_NO_AUTO_PART_SCAN (1ULL << 18)
418#define UBLK_F_SHMEM_ZC (1ULL << 19)
421#define UBLK_F_IO_DESC_SIZE (1ULL << 20)
424#define UBLK_S_DEV_DEAD 0
425#define UBLK_S_DEV_LIVE 1
426#define UBLK_S_DEV_QUIESCED 2
427#define UBLK_S_DEV_FAIL_IO 3
430struct ublksrv_ctrl_cmd {
454struct ublksrv_ctrl_dev_info {
460 __u32 max_io_buf_bytes;
477#define UBLK_IO_OP_READ 0
478#define UBLK_IO_OP_WRITE 1
479#define UBLK_IO_OP_FLUSH 2
480#define UBLK_IO_OP_DISCARD 3
481#define UBLK_IO_OP_WRITE_SAME 4
482#define UBLK_IO_OP_WRITE_ZEROES 5
483#define UBLK_IO_OP_ZONE_OPEN 10
484#define UBLK_IO_OP_ZONE_CLOSE 11
485#define UBLK_IO_OP_ZONE_FINISH 12
486#define UBLK_IO_OP_ZONE_APPEND 13
487#define UBLK_IO_OP_ZONE_RESET_ALL 14
488#define UBLK_IO_OP_ZONE_RESET 15
500#define UBLK_IO_OP_REPORT_ZONES 18
502#define UBLK_IO_F_FAILFAST_DEV (1U << 8)
503#define UBLK_IO_F_FAILFAST_TRANSPORT (1U << 9)
504#define UBLK_IO_F_FAILFAST_DRIVER (1U << 10)
505#define UBLK_IO_F_META (1U << 11)
506#define UBLK_IO_F_FUA (1U << 13)
507#define UBLK_IO_F_NOUNMAP (1U << 15)
508#define UBLK_IO_F_SWAP (1U << 16)
519#define UBLK_IO_F_NEED_REG_BUF (1U << 17)
521#define UBLK_IO_F_INTEGRITY (1UL << 18)
527#define UBLK_IO_F_SHMEM_ZC (1U << 19)
536struct ublksrv_io_desc {
552static inline __u8 ublksrv_get_op(
const struct ublksrv_io_desc *iod)
554 return iod->op_flags & 0xff;
557static inline __u32 ublksrv_get_flags(
const struct ublksrv_io_desc *iod)
559 return iod->op_flags >> 8;
571#define UBLK_AUTO_BUF_REG_FALLBACK (1 << 0)
572#define UBLK_AUTO_BUF_REG_F_MASK UBLK_AUTO_BUF_REG_FALLBACK
574struct ublk_auto_buf_reg {
596static inline struct ublk_auto_buf_reg ublk_sqe_addr_to_auto_buf_reg(
599 struct ublk_auto_buf_reg reg = {
600 .index = (__u16)sqe_addr,
601 .flags = (__u8)(sqe_addr >> 16),
602 .reserved0 = (__u8)(sqe_addr >> 24),
603 .reserved1 = (__u32)(sqe_addr >> 32),
610ublk_auto_buf_reg_to_sqe_addr(
const struct ublk_auto_buf_reg *buf)
612 __u64 addr = buf->index | (__u64)buf->flags << 16 | (__u64)buf->reserved0 << 24 |
613 (__u64)buf->reserved1 << 32;
619struct ublksrv_io_cmd {
641 __u64 zone_append_lba;
645struct ublk_elem_header {
678struct ublk_batch_io {
680#define UBLK_BATCH_F_HAS_ZONE_LBA (1 << 0)
681#define UBLK_BATCH_F_HAS_BUF_ADDR (1 << 1)
682#define UBLK_BATCH_F_AUTO_BUF_REG_FALLBACK (1 << 2)
690struct ublk_param_basic {
691#define UBLK_ATTR_READ_ONLY (1 << 0)
692#define UBLK_ATTR_ROTATIONAL (1 << 1)
693#define UBLK_ATTR_VOLATILE_CACHE (1 << 2)
694#define UBLK_ATTR_FUA (1 << 3)
696 __u8 logical_bs_shift;
697 __u8 physical_bs_shift;
705 __u64 virt_boundary_mask;
708struct ublk_param_discard {
709 __u32 discard_alignment;
711 __u32 discard_granularity;
712 __u32 max_discard_sectors;
714 __u32 max_write_zeroes_sectors;
715 __u16 max_discard_segments;
723struct ublk_param_devt {
730struct ublk_param_zoned {
731 __u32 max_open_zones;
732 __u32 max_active_zones;
733 __u32 max_zone_append_sectors;
737struct ublk_param_dma_align {
742#define UBLK_MIN_SEGMENT_SIZE 4096
747struct ublk_param_segment {
752 __u64 seg_boundary_mask;
760 __u32 max_segment_size;
765struct ublk_param_integrity {
767 __u16 max_integrity_segments;
784#define UBLK_PARAM_TYPE_BASIC (1 << 0)
785#define UBLK_PARAM_TYPE_DISCARD (1 << 1)
786#define UBLK_PARAM_TYPE_DEVT (1 << 2)
787#define UBLK_PARAM_TYPE_ZONED (1 << 3)
788#define UBLK_PARAM_TYPE_DMA_ALIGN (1 << 4)
789#define UBLK_PARAM_TYPE_SEGMENT (1 << 5)
790#define UBLK_PARAM_TYPE_INTEGRITY (1 << 6)
793 struct ublk_param_basic basic;
794 struct ublk_param_discard discard;
795 struct ublk_param_devt devt;
796 struct ublk_param_zoned zoned;
797 struct ublk_param_dma_align dma;
798 struct ublk_param_segment seg;
799 struct ublk_param_integrity integrity;
810#define UBLK_SHMEM_ZC_OFF_MASK 0xffffffffULL
811#define UBLK_SHMEM_ZC_IDX_OFF 32
812#define UBLK_SHMEM_ZC_IDX_MASK 0xffffULL
814static inline __u64 ublk_shmem_zc_addr(__u16 index, __u32 offset)
816 return ((__u64)index << UBLK_SHMEM_ZC_IDX_OFF) | offset;
819static inline __u16 ublk_shmem_zc_index(__u64 addr)
821 return (addr >> UBLK_SHMEM_ZC_IDX_OFF) & UBLK_SHMEM_ZC_IDX_MASK;
824static inline __u32 ublk_shmem_zc_offset(__u64 addr)
826 return (__u32)(addr & UBLK_SHMEM_ZC_OFF_MASK);