xref: /openbmc/qemu/hw/scsi/srp.h (revision 7d41364e712f00894759f7dbf2623a8b27b79a0e)
1 47b43a1fSPaolo Bonzini /*
2 47b43a1fSPaolo Bonzini  * Copyright (c) 2005 Cisco Systems.  All rights reserved.
3 47b43a1fSPaolo Bonzini  *
4 47b43a1fSPaolo Bonzini  * This software is available to you under a choice of one of two
5 47b43a1fSPaolo Bonzini  * licenses.  You may choose to be licensed under the terms of the GNU
6 47b43a1fSPaolo Bonzini  * General Public License (GPL) Version 2, available from the file
7 47b43a1fSPaolo Bonzini  * COPYING in the main directory of this source tree, or the
8 47b43a1fSPaolo Bonzini  * OpenIB.org BSD license below:
9 47b43a1fSPaolo Bonzini  *
10 47b43a1fSPaolo Bonzini  *     Redistribution and use in source and binary forms, with or
11 47b43a1fSPaolo Bonzini  *     without modification, are permitted provided that the following
12 47b43a1fSPaolo Bonzini  *     conditions are met:
13 47b43a1fSPaolo Bonzini  *
14 47b43a1fSPaolo Bonzini  *      - Redistributions of source code must retain the above
15 47b43a1fSPaolo Bonzini  *        copyright notice, this list of conditions and the following
16 47b43a1fSPaolo Bonzini  *        disclaimer.
17 47b43a1fSPaolo Bonzini  *
18 47b43a1fSPaolo Bonzini  *      - Redistributions in binary form must reproduce the above
19 47b43a1fSPaolo Bonzini  *        copyright notice, this list of conditions and the following
20 47b43a1fSPaolo Bonzini  *        disclaimer in the documentation and/or other materials
21 47b43a1fSPaolo Bonzini  *        provided with the distribution.
22 47b43a1fSPaolo Bonzini  *
23 47b43a1fSPaolo Bonzini  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 47b43a1fSPaolo Bonzini  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 47b43a1fSPaolo Bonzini  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 47b43a1fSPaolo Bonzini  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 47b43a1fSPaolo Bonzini  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 47b43a1fSPaolo Bonzini  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 47b43a1fSPaolo Bonzini  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 47b43a1fSPaolo Bonzini  * SOFTWARE.
31 47b43a1fSPaolo Bonzini  *
32 47b43a1fSPaolo Bonzini  */
33 47b43a1fSPaolo Bonzini 
34 47b43a1fSPaolo Bonzini #ifndef SCSI_SRP_H
35 47b43a1fSPaolo Bonzini #define SCSI_SRP_H
36 47b43a1fSPaolo Bonzini 
37 47b43a1fSPaolo Bonzini /*
38 47b43a1fSPaolo Bonzini  * Structures and constants for the SCSI RDMA Protocol (SRP) as
39 47b43a1fSPaolo Bonzini  * defined by the INCITS T10 committee.  This file was written using
40 47b43a1fSPaolo Bonzini  * draft Revision 16a of the SRP standard.
41 47b43a1fSPaolo Bonzini  */
42 47b43a1fSPaolo Bonzini 
43 47b43a1fSPaolo Bonzini enum {
44 47b43a1fSPaolo Bonzini 
45 47b43a1fSPaolo Bonzini     SRP_LOGIN_REQ = 0x00,
46 47b43a1fSPaolo Bonzini     SRP_TSK_MGMT  = 0x01,
47 47b43a1fSPaolo Bonzini     SRP_CMD       = 0x02,
48 47b43a1fSPaolo Bonzini     SRP_I_LOGOUT  = 0x03,
49 47b43a1fSPaolo Bonzini     SRP_LOGIN_RSP = 0xc0,
50 47b43a1fSPaolo Bonzini     SRP_RSP       = 0xc1,
51 47b43a1fSPaolo Bonzini     SRP_LOGIN_REJ = 0xc2,
52 47b43a1fSPaolo Bonzini     SRP_T_LOGOUT  = 0x80,
53 47b43a1fSPaolo Bonzini     SRP_CRED_REQ  = 0x81,
54 47b43a1fSPaolo Bonzini     SRP_AER_REQ   = 0x82,
55 47b43a1fSPaolo Bonzini     SRP_CRED_RSP  = 0x41,
56 47b43a1fSPaolo Bonzini     SRP_AER_RSP   = 0x42
57 47b43a1fSPaolo Bonzini };
58 47b43a1fSPaolo Bonzini 
59 47b43a1fSPaolo Bonzini enum {
60 47b43a1fSPaolo Bonzini     SRP_BUF_FORMAT_DIRECT   = 1 << 1,
61 47b43a1fSPaolo Bonzini     SRP_BUF_FORMAT_INDIRECT = 1 << 2
62 47b43a1fSPaolo Bonzini };
63 47b43a1fSPaolo Bonzini 
64 47b43a1fSPaolo Bonzini enum {
65 47b43a1fSPaolo Bonzini     SRP_NO_DATA_DESC       = 0,
66 47b43a1fSPaolo Bonzini     SRP_DATA_DESC_DIRECT   = 1,
67 47b43a1fSPaolo Bonzini     SRP_DATA_DESC_INDIRECT = 2
68 47b43a1fSPaolo Bonzini };
69 47b43a1fSPaolo Bonzini 
70 47b43a1fSPaolo Bonzini enum {
71 47b43a1fSPaolo Bonzini     SRP_TSK_ABORT_TASK     = 0x01,
72 47b43a1fSPaolo Bonzini     SRP_TSK_ABORT_TASK_SET = 0x02,
73 47b43a1fSPaolo Bonzini     SRP_TSK_CLEAR_TASK_SET = 0x04,
74 47b43a1fSPaolo Bonzini     SRP_TSK_LUN_RESET      = 0x08,
75 47b43a1fSPaolo Bonzini     SRP_TSK_CLEAR_ACA      = 0x40
76 47b43a1fSPaolo Bonzini };
77 47b43a1fSPaolo Bonzini 
78 47b43a1fSPaolo Bonzini enum srp_login_rej_reason {
79 47b43a1fSPaolo Bonzini     SRP_LOGIN_REJ_UNABLE_ESTABLISH_CHANNEL   = 0x00010000,
80 47b43a1fSPaolo Bonzini     SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES     = 0x00010001,
81 47b43a1fSPaolo Bonzini     SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE = 0x00010002,
82 47b43a1fSPaolo Bonzini     SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL   = 0x00010003,
83 47b43a1fSPaolo Bonzini     SRP_LOGIN_REJ_UNSUPPORTED_DESCRIPTOR_FMT = 0x00010004,
84 47b43a1fSPaolo Bonzini     SRP_LOGIN_REJ_MULTI_CHANNEL_UNSUPPORTED  = 0x00010005,
85 47b43a1fSPaolo Bonzini     SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED      = 0x00010006
86 47b43a1fSPaolo Bonzini };
87 47b43a1fSPaolo Bonzini 
88 47b43a1fSPaolo Bonzini enum {
89 47b43a1fSPaolo Bonzini     SRP_REV10_IB_IO_CLASS  = 0xff00,
90 47b43a1fSPaolo Bonzini     SRP_REV16A_IB_IO_CLASS = 0x0100
91 47b43a1fSPaolo Bonzini };
92 47b43a1fSPaolo Bonzini 
93 *eb37f146SAlexey Kardashevskiy enum {
94 *eb37f146SAlexey Kardashevskiy     SRP_TSK_MGMT_COMPLETE       = 0x00,
95 *eb37f146SAlexey Kardashevskiy     SRP_TSK_MGMT_FIELDS_INVALID = 0x02,
96 *eb37f146SAlexey Kardashevskiy     SRP_TSK_MGMT_NOT_SUPPORTED  = 0x04,
97 *eb37f146SAlexey Kardashevskiy     SRP_TSK_MGMT_FAILED         = 0x05
98 *eb37f146SAlexey Kardashevskiy };
99 *eb37f146SAlexey Kardashevskiy 
100 47b43a1fSPaolo Bonzini struct srp_direct_buf {
101 47b43a1fSPaolo Bonzini     uint64_t    va;
102 47b43a1fSPaolo Bonzini     uint32_t    key;
103 47b43a1fSPaolo Bonzini     uint32_t    len;
104 47b43a1fSPaolo Bonzini };
105 47b43a1fSPaolo Bonzini 
106 47b43a1fSPaolo Bonzini /*
107 47b43a1fSPaolo Bonzini  * We need the packed attribute because the SRP spec puts the list of
108 47b43a1fSPaolo Bonzini  * descriptors at an offset of 20, which is not aligned to the size of
109 47b43a1fSPaolo Bonzini  * struct srp_direct_buf.  The whole structure must be packed to avoid
110 47b43a1fSPaolo Bonzini  * having the 20-byte structure padded to 24 bytes on 64-bit architectures.
111 47b43a1fSPaolo Bonzini  */
112 47b43a1fSPaolo Bonzini struct srp_indirect_buf {
113 47b43a1fSPaolo Bonzini     struct srp_direct_buf    table_desc;
114 47b43a1fSPaolo Bonzini     uint32_t                 len;
115 47b43a1fSPaolo Bonzini     struct srp_direct_buf    desc_list[0];
116 47b43a1fSPaolo Bonzini } QEMU_PACKED;
117 47b43a1fSPaolo Bonzini 
118 47b43a1fSPaolo Bonzini enum {
119 47b43a1fSPaolo Bonzini     SRP_MULTICHAN_SINGLE = 0,
120 47b43a1fSPaolo Bonzini     SRP_MULTICHAN_MULTI  = 1
121 47b43a1fSPaolo Bonzini };
122 47b43a1fSPaolo Bonzini 
123 47b43a1fSPaolo Bonzini struct srp_login_req {
124 47b43a1fSPaolo Bonzini     uint8_t    opcode;
125 47b43a1fSPaolo Bonzini     uint8_t    reserved1[7];
126 47b43a1fSPaolo Bonzini     uint64_t   tag;
127 47b43a1fSPaolo Bonzini     uint32_t   req_it_iu_len;
128 47b43a1fSPaolo Bonzini     uint8_t    reserved2[4];
129 47b43a1fSPaolo Bonzini     uint16_t   req_buf_fmt;
130 47b43a1fSPaolo Bonzini     uint8_t    req_flags;
131 47b43a1fSPaolo Bonzini     uint8_t    reserved3[5];
132 47b43a1fSPaolo Bonzini     uint8_t    initiator_port_id[16];
133 47b43a1fSPaolo Bonzini     uint8_t    target_port_id[16];
134 47b43a1fSPaolo Bonzini };
135 47b43a1fSPaolo Bonzini 
136 47b43a1fSPaolo Bonzini /*
137 47b43a1fSPaolo Bonzini  * The SRP spec defines the size of the LOGIN_RSP structure to be 52
138 47b43a1fSPaolo Bonzini  * bytes, so it needs to be packed to avoid having it padded to 56
139 47b43a1fSPaolo Bonzini  * bytes on 64-bit architectures.
140 47b43a1fSPaolo Bonzini  */
141 47b43a1fSPaolo Bonzini struct srp_login_rsp {
142 47b43a1fSPaolo Bonzini     uint8_t    opcode;
143 47b43a1fSPaolo Bonzini     uint8_t    reserved1[3];
144 47b43a1fSPaolo Bonzini     uint32_t   req_lim_delta;
145 47b43a1fSPaolo Bonzini     uint64_t   tag;
146 47b43a1fSPaolo Bonzini     uint32_t   max_it_iu_len;
147 47b43a1fSPaolo Bonzini     uint32_t   max_ti_iu_len;
148 47b43a1fSPaolo Bonzini     uint16_t   buf_fmt;
149 47b43a1fSPaolo Bonzini     uint8_t    rsp_flags;
150 47b43a1fSPaolo Bonzini     uint8_t    reserved2[25];
151 47b43a1fSPaolo Bonzini } QEMU_PACKED;
152 47b43a1fSPaolo Bonzini 
153 47b43a1fSPaolo Bonzini struct srp_login_rej {
154 47b43a1fSPaolo Bonzini     uint8_t    opcode;
155 47b43a1fSPaolo Bonzini     uint8_t    reserved1[3];
156 47b43a1fSPaolo Bonzini     uint32_t   reason;
157 47b43a1fSPaolo Bonzini     uint64_t   tag;
158 47b43a1fSPaolo Bonzini     uint8_t    reserved2[8];
159 47b43a1fSPaolo Bonzini     uint16_t   buf_fmt;
160 47b43a1fSPaolo Bonzini     uint8_t    reserved3[6];
161 47b43a1fSPaolo Bonzini };
162 47b43a1fSPaolo Bonzini 
163 47b43a1fSPaolo Bonzini struct srp_i_logout {
164 47b43a1fSPaolo Bonzini     uint8_t    opcode;
165 47b43a1fSPaolo Bonzini     uint8_t    reserved[7];
166 47b43a1fSPaolo Bonzini     uint64_t   tag;
167 47b43a1fSPaolo Bonzini };
168 47b43a1fSPaolo Bonzini 
169 47b43a1fSPaolo Bonzini struct srp_t_logout {
170 47b43a1fSPaolo Bonzini     uint8_t    opcode;
171 47b43a1fSPaolo Bonzini     uint8_t    sol_not;
172 47b43a1fSPaolo Bonzini     uint8_t    reserved[2];
173 47b43a1fSPaolo Bonzini     uint32_t   reason;
174 47b43a1fSPaolo Bonzini     uint64_t   tag;
175 47b43a1fSPaolo Bonzini };
176 47b43a1fSPaolo Bonzini 
177 47b43a1fSPaolo Bonzini /*
178 47b43a1fSPaolo Bonzini  * We need the packed attribute because the SRP spec only aligns the
179 47b43a1fSPaolo Bonzini  * 8-byte LUN field to 4 bytes.
180 47b43a1fSPaolo Bonzini  */
181 47b43a1fSPaolo Bonzini struct srp_tsk_mgmt {
182 47b43a1fSPaolo Bonzini     uint8_t    opcode;
183 47b43a1fSPaolo Bonzini     uint8_t    sol_not;
184 47b43a1fSPaolo Bonzini     uint8_t    reserved1[6];
185 47b43a1fSPaolo Bonzini     uint64_t   tag;
186 47b43a1fSPaolo Bonzini     uint8_t    reserved2[4];
187 47b43a1fSPaolo Bonzini     uint64_t   lun;
188 47b43a1fSPaolo Bonzini     uint8_t    reserved3[2];
189 47b43a1fSPaolo Bonzini     uint8_t    tsk_mgmt_func;
190 47b43a1fSPaolo Bonzini     uint8_t    reserved4;
191 47b43a1fSPaolo Bonzini     uint64_t   task_tag;
192 47b43a1fSPaolo Bonzini     uint8_t    reserved5[8];
193 47b43a1fSPaolo Bonzini } QEMU_PACKED;
194 47b43a1fSPaolo Bonzini 
195 47b43a1fSPaolo Bonzini /*
196 47b43a1fSPaolo Bonzini  * We need the packed attribute because the SRP spec only aligns the
197 47b43a1fSPaolo Bonzini  * 8-byte LUN field to 4 bytes.
198 47b43a1fSPaolo Bonzini  */
199 47b43a1fSPaolo Bonzini struct srp_cmd {
200 47b43a1fSPaolo Bonzini     uint8_t    opcode;
201 47b43a1fSPaolo Bonzini     uint8_t    sol_not;
202 47b43a1fSPaolo Bonzini     uint8_t    reserved1[3];
203 47b43a1fSPaolo Bonzini     uint8_t    buf_fmt;
204 47b43a1fSPaolo Bonzini     uint8_t    data_out_desc_cnt;
205 47b43a1fSPaolo Bonzini     uint8_t    data_in_desc_cnt;
206 47b43a1fSPaolo Bonzini     uint64_t   tag;
207 47b43a1fSPaolo Bonzini     uint8_t    reserved2[4];
208 47b43a1fSPaolo Bonzini     uint64_t   lun;
209 47b43a1fSPaolo Bonzini     uint8_t    reserved3;
210 47b43a1fSPaolo Bonzini     uint8_t    task_attr;
211 47b43a1fSPaolo Bonzini     uint8_t    reserved4;
212 47b43a1fSPaolo Bonzini     uint8_t    add_cdb_len;
213 47b43a1fSPaolo Bonzini     uint8_t    cdb[16];
214 47b43a1fSPaolo Bonzini     uint8_t    add_data[0];
215 47b43a1fSPaolo Bonzini } QEMU_PACKED;
216 47b43a1fSPaolo Bonzini 
217 47b43a1fSPaolo Bonzini enum {
218 47b43a1fSPaolo Bonzini     SRP_RSP_FLAG_RSPVALID = 1 << 0,
219 47b43a1fSPaolo Bonzini     SRP_RSP_FLAG_SNSVALID = 1 << 1,
220 47b43a1fSPaolo Bonzini     SRP_RSP_FLAG_DOOVER   = 1 << 2,
221 47b43a1fSPaolo Bonzini     SRP_RSP_FLAG_DOUNDER  = 1 << 3,
222 47b43a1fSPaolo Bonzini     SRP_RSP_FLAG_DIOVER   = 1 << 4,
223 47b43a1fSPaolo Bonzini     SRP_RSP_FLAG_DIUNDER  = 1 << 5
224 47b43a1fSPaolo Bonzini };
225 47b43a1fSPaolo Bonzini 
226 47b43a1fSPaolo Bonzini /*
227 47b43a1fSPaolo Bonzini  * The SRP spec defines the size of the RSP structure to be 36 bytes,
228 47b43a1fSPaolo Bonzini  * so it needs to be packed to avoid having it padded to 40 bytes on
229 47b43a1fSPaolo Bonzini  * 64-bit architectures.
230 47b43a1fSPaolo Bonzini  */
231 47b43a1fSPaolo Bonzini struct srp_rsp {
232 47b43a1fSPaolo Bonzini     uint8_t    opcode;
233 47b43a1fSPaolo Bonzini     uint8_t    sol_not;
234 47b43a1fSPaolo Bonzini     uint8_t    reserved1[2];
235 47b43a1fSPaolo Bonzini     uint32_t   req_lim_delta;
236 47b43a1fSPaolo Bonzini     uint64_t   tag;
237 47b43a1fSPaolo Bonzini     uint8_t    reserved2[2];
238 47b43a1fSPaolo Bonzini     uint8_t    flags;
239 47b43a1fSPaolo Bonzini     uint8_t    status;
240 47b43a1fSPaolo Bonzini     uint32_t   data_out_res_cnt;
241 47b43a1fSPaolo Bonzini     uint32_t   data_in_res_cnt;
242 47b43a1fSPaolo Bonzini     uint32_t   sense_data_len;
243 47b43a1fSPaolo Bonzini     uint32_t   resp_data_len;
244 47b43a1fSPaolo Bonzini     uint8_t    data[0];
245 47b43a1fSPaolo Bonzini } QEMU_PACKED;
246 47b43a1fSPaolo Bonzini 
247 47b43a1fSPaolo Bonzini #endif /* SCSI_SRP_H */
248