1#ifndef __TARGET_CORE_USER_H
2#define __TARGET_CORE_USER_H
3
4
5
6#include <linux/types.h>
7#include <linux/uio.h>
8
9#define TCMU_VERSION "2.0"
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42#define TCMU_MAILBOX_VERSION 2
43#define ALIGN_SIZE 64
44#define TCMU_MAILBOX_FLAG_CAP_OOOC (1 << 0)
45
46struct tcmu_mailbox {
47 __u16 version;
48 __u16 flags;
49 __u32 cmdr_off;
50 __u32 cmdr_size;
51
52 __u32 cmd_head;
53
54
55 __u32 cmd_tail __attribute__((__aligned__(ALIGN_SIZE)));
56
57} __packed;
58
59enum tcmu_opcode {
60 TCMU_OP_PAD = 0,
61 TCMU_OP_CMD,
62};
63
64
65
66
67struct tcmu_cmd_entry_hdr {
68 __u32 len_op;
69 __u16 cmd_id;
70 __u8 kflags;
71#define TCMU_UFLAG_UNKNOWN_OP 0x1
72 __u8 uflags;
73
74} __packed;
75
76#define TCMU_OP_MASK 0x7
77
78static inline enum tcmu_opcode tcmu_hdr_get_op(__u32 len_op)
79{
80 return len_op & TCMU_OP_MASK;
81}
82
83static inline void tcmu_hdr_set_op(__u32 *len_op, enum tcmu_opcode op)
84{
85 *len_op &= ~TCMU_OP_MASK;
86 *len_op |= (op & TCMU_OP_MASK);
87}
88
89static inline __u32 tcmu_hdr_get_len(__u32 len_op)
90{
91 return len_op & ~TCMU_OP_MASK;
92}
93
94static inline void tcmu_hdr_set_len(__u32 *len_op, __u32 len)
95{
96 *len_op &= TCMU_OP_MASK;
97 *len_op |= len;
98}
99
100
101#define TCMU_SENSE_BUFFERSIZE 96
102
103struct tcmu_cmd_entry {
104 struct tcmu_cmd_entry_hdr hdr;
105
106 union {
107 struct {
108 uint32_t iov_cnt;
109 uint32_t iov_bidi_cnt;
110 uint32_t iov_dif_cnt;
111 uint64_t cdb_off;
112 uint64_t __pad1;
113 uint64_t __pad2;
114 struct iovec iov[0];
115 } req;
116 struct {
117 uint8_t scsi_status;
118 uint8_t __pad1;
119 uint16_t __pad2;
120 uint32_t __pad3;
121 char sense_buffer[TCMU_SENSE_BUFFERSIZE];
122 } rsp;
123 };
124
125} __packed;
126
127#define TCMU_OP_ALIGN_SIZE sizeof(uint64_t)
128
129enum tcmu_genl_cmd {
130 TCMU_CMD_UNSPEC,
131 TCMU_CMD_ADDED_DEVICE,
132 TCMU_CMD_REMOVED_DEVICE,
133 __TCMU_CMD_MAX,
134};
135#define TCMU_CMD_MAX (__TCMU_CMD_MAX - 1)
136
137enum tcmu_genl_attr {
138 TCMU_ATTR_UNSPEC,
139 TCMU_ATTR_DEVICE,
140 TCMU_ATTR_MINOR,
141 __TCMU_ATTR_MAX,
142};
143#define TCMU_ATTR_MAX (__TCMU_ATTR_MAX - 1)
144
145#endif
146