xref: /qemu/hw/scsi/viosrp.h (revision 47b43a1f)
1*47b43a1fSPaolo Bonzini /*****************************************************************************/
2*47b43a1fSPaolo Bonzini /* srp.h -- SCSI RDMA Protocol definitions                                   */
3*47b43a1fSPaolo Bonzini /*                                                                           */
4*47b43a1fSPaolo Bonzini /* Written By: Colin Devilbis, IBM Corporation                               */
5*47b43a1fSPaolo Bonzini /*                                                                           */
6*47b43a1fSPaolo Bonzini /* Copyright (C) 2003 IBM Corporation                                        */
7*47b43a1fSPaolo Bonzini /*                                                                           */
8*47b43a1fSPaolo Bonzini /* This program is free software; you can redistribute it and/or modify      */
9*47b43a1fSPaolo Bonzini /* it under the terms of the GNU General Public License as published by      */
10*47b43a1fSPaolo Bonzini /* the Free Software Foundation; either version 2 of the License, or         */
11*47b43a1fSPaolo Bonzini /* (at your option) any later version.                                       */
12*47b43a1fSPaolo Bonzini /*                                                                           */
13*47b43a1fSPaolo Bonzini /* This program is distributed in the hope that it will be useful,           */
14*47b43a1fSPaolo Bonzini /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */
15*47b43a1fSPaolo Bonzini /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
16*47b43a1fSPaolo Bonzini /* GNU General Public License for more details.                              */
17*47b43a1fSPaolo Bonzini /*                                                                           */
18*47b43a1fSPaolo Bonzini /* You should have received a copy of the GNU General Public License         */
19*47b43a1fSPaolo Bonzini /* along with this program; if not, write to the Free Software               */
20*47b43a1fSPaolo Bonzini /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
21*47b43a1fSPaolo Bonzini /*                                                                           */
22*47b43a1fSPaolo Bonzini /*                                                                           */
23*47b43a1fSPaolo Bonzini /* This file contains structures and definitions for IBM RPA (RS/6000        */
24*47b43a1fSPaolo Bonzini /* platform architecture) implementation of the SRP (SCSI RDMA Protocol)     */
25*47b43a1fSPaolo Bonzini /* standard.  SRP is used on IBM iSeries and pSeries platforms to send SCSI  */
26*47b43a1fSPaolo Bonzini /* commands between logical partitions.                                      */
27*47b43a1fSPaolo Bonzini /*                                                                           */
28*47b43a1fSPaolo Bonzini /* SRP Information Units (IUs) are sent on a "Command/Response Queue" (CRQ)  */
29*47b43a1fSPaolo Bonzini /* between partitions.  The definitions in this file are architected,        */
30*47b43a1fSPaolo Bonzini /* and cannot be changed without breaking compatibility with other versions  */
31*47b43a1fSPaolo Bonzini /* of Linux and other operating systems (AIX, OS/400) that talk this protocol*/
32*47b43a1fSPaolo Bonzini /* between logical partitions                                                */
33*47b43a1fSPaolo Bonzini /*****************************************************************************/
34*47b43a1fSPaolo Bonzini #ifndef PPC_VIOSRP_H
35*47b43a1fSPaolo Bonzini #define PPC_VIOSRP_H
36*47b43a1fSPaolo Bonzini 
37*47b43a1fSPaolo Bonzini #define SRP_VERSION "16.a"
38*47b43a1fSPaolo Bonzini #define SRP_MAX_IU_LEN    256
39*47b43a1fSPaolo Bonzini #define SRP_MAX_LOC_LEN 32
40*47b43a1fSPaolo Bonzini 
41*47b43a1fSPaolo Bonzini union srp_iu {
42*47b43a1fSPaolo Bonzini     struct srp_login_req login_req;
43*47b43a1fSPaolo Bonzini     struct srp_login_rsp login_rsp;
44*47b43a1fSPaolo Bonzini     struct srp_login_rej login_rej;
45*47b43a1fSPaolo Bonzini     struct srp_i_logout i_logout;
46*47b43a1fSPaolo Bonzini     struct srp_t_logout t_logout;
47*47b43a1fSPaolo Bonzini     struct srp_tsk_mgmt tsk_mgmt;
48*47b43a1fSPaolo Bonzini     struct srp_cmd cmd;
49*47b43a1fSPaolo Bonzini     struct srp_rsp rsp;
50*47b43a1fSPaolo Bonzini     uint8_t reserved[SRP_MAX_IU_LEN];
51*47b43a1fSPaolo Bonzini };
52*47b43a1fSPaolo Bonzini 
53*47b43a1fSPaolo Bonzini enum viosrp_crq_formats {
54*47b43a1fSPaolo Bonzini     VIOSRP_SRP_FORMAT = 0x01,
55*47b43a1fSPaolo Bonzini     VIOSRP_MAD_FORMAT = 0x02,
56*47b43a1fSPaolo Bonzini     VIOSRP_OS400_FORMAT = 0x03,
57*47b43a1fSPaolo Bonzini     VIOSRP_AIX_FORMAT = 0x04,
58*47b43a1fSPaolo Bonzini     VIOSRP_LINUX_FORMAT = 0x06,
59*47b43a1fSPaolo Bonzini     VIOSRP_INLINE_FORMAT = 0x07
60*47b43a1fSPaolo Bonzini };
61*47b43a1fSPaolo Bonzini 
62*47b43a1fSPaolo Bonzini enum viosrp_crq_status {
63*47b43a1fSPaolo Bonzini     VIOSRP_OK = 0x0,
64*47b43a1fSPaolo Bonzini     VIOSRP_NONRECOVERABLE_ERR = 0x1,
65*47b43a1fSPaolo Bonzini     VIOSRP_VIOLATES_MAX_XFER = 0x2,
66*47b43a1fSPaolo Bonzini     VIOSRP_PARTNER_PANIC = 0x3,
67*47b43a1fSPaolo Bonzini     VIOSRP_DEVICE_BUSY = 0x8,
68*47b43a1fSPaolo Bonzini     VIOSRP_ADAPTER_FAIL = 0x10,
69*47b43a1fSPaolo Bonzini     VIOSRP_OK2 = 0x99,
70*47b43a1fSPaolo Bonzini };
71*47b43a1fSPaolo Bonzini 
72*47b43a1fSPaolo Bonzini struct viosrp_crq {
73*47b43a1fSPaolo Bonzini     uint8_t valid;        /* used by RPA */
74*47b43a1fSPaolo Bonzini     uint8_t format;        /* SCSI vs out-of-band */
75*47b43a1fSPaolo Bonzini     uint8_t reserved;
76*47b43a1fSPaolo Bonzini     uint8_t status;        /* non-scsi failure? (e.g. DMA failure) */
77*47b43a1fSPaolo Bonzini     uint16_t timeout;        /* in seconds */
78*47b43a1fSPaolo Bonzini     uint16_t IU_length;        /* in bytes */
79*47b43a1fSPaolo Bonzini     uint64_t IU_data_ptr;    /* the TCE for transferring data */
80*47b43a1fSPaolo Bonzini };
81*47b43a1fSPaolo Bonzini 
82*47b43a1fSPaolo Bonzini /* MADs are Management requests above and beyond the IUs defined in the SRP
83*47b43a1fSPaolo Bonzini  * standard.
84*47b43a1fSPaolo Bonzini  */
85*47b43a1fSPaolo Bonzini enum viosrp_mad_types {
86*47b43a1fSPaolo Bonzini     VIOSRP_EMPTY_IU_TYPE = 0x01,
87*47b43a1fSPaolo Bonzini     VIOSRP_ERROR_LOG_TYPE = 0x02,
88*47b43a1fSPaolo Bonzini     VIOSRP_ADAPTER_INFO_TYPE = 0x03,
89*47b43a1fSPaolo Bonzini     VIOSRP_HOST_CONFIG_TYPE = 0x04,
90*47b43a1fSPaolo Bonzini     VIOSRP_CAPABILITIES_TYPE = 0x05,
91*47b43a1fSPaolo Bonzini     VIOSRP_ENABLE_FAST_FAIL = 0x08,
92*47b43a1fSPaolo Bonzini };
93*47b43a1fSPaolo Bonzini 
94*47b43a1fSPaolo Bonzini enum viosrp_mad_status {
95*47b43a1fSPaolo Bonzini     VIOSRP_MAD_SUCCESS = 0x00,
96*47b43a1fSPaolo Bonzini     VIOSRP_MAD_NOT_SUPPORTED = 0xF1,
97*47b43a1fSPaolo Bonzini     VIOSRP_MAD_FAILED = 0xF7,
98*47b43a1fSPaolo Bonzini };
99*47b43a1fSPaolo Bonzini 
100*47b43a1fSPaolo Bonzini enum viosrp_capability_type {
101*47b43a1fSPaolo Bonzini     MIGRATION_CAPABILITIES = 0x01,
102*47b43a1fSPaolo Bonzini     RESERVATION_CAPABILITIES = 0x02,
103*47b43a1fSPaolo Bonzini };
104*47b43a1fSPaolo Bonzini 
105*47b43a1fSPaolo Bonzini enum viosrp_capability_support {
106*47b43a1fSPaolo Bonzini     SERVER_DOES_NOT_SUPPORTS_CAP = 0x0,
107*47b43a1fSPaolo Bonzini     SERVER_SUPPORTS_CAP = 0x01,
108*47b43a1fSPaolo Bonzini     SERVER_CAP_DATA = 0x02,
109*47b43a1fSPaolo Bonzini };
110*47b43a1fSPaolo Bonzini 
111*47b43a1fSPaolo Bonzini enum viosrp_reserve_type {
112*47b43a1fSPaolo Bonzini     CLIENT_RESERVE_SCSI_2 = 0x01,
113*47b43a1fSPaolo Bonzini };
114*47b43a1fSPaolo Bonzini 
115*47b43a1fSPaolo Bonzini enum viosrp_capability_flag {
116*47b43a1fSPaolo Bonzini     CLIENT_MIGRATED = 0x01,
117*47b43a1fSPaolo Bonzini     CLIENT_RECONNECT = 0x02,
118*47b43a1fSPaolo Bonzini     CAP_LIST_SUPPORTED = 0x04,
119*47b43a1fSPaolo Bonzini     CAP_LIST_DATA = 0x08,
120*47b43a1fSPaolo Bonzini };
121*47b43a1fSPaolo Bonzini 
122*47b43a1fSPaolo Bonzini /*
123*47b43a1fSPaolo Bonzini  * Common MAD header
124*47b43a1fSPaolo Bonzini  */
125*47b43a1fSPaolo Bonzini struct mad_common {
126*47b43a1fSPaolo Bonzini     uint32_t type;
127*47b43a1fSPaolo Bonzini     uint16_t status;
128*47b43a1fSPaolo Bonzini     uint16_t length;
129*47b43a1fSPaolo Bonzini     uint64_t tag;
130*47b43a1fSPaolo Bonzini };
131*47b43a1fSPaolo Bonzini 
132*47b43a1fSPaolo Bonzini /*
133*47b43a1fSPaolo Bonzini  * All SRP (and MAD) requests normally flow from the
134*47b43a1fSPaolo Bonzini  * client to the server.  There is no way for the server to send
135*47b43a1fSPaolo Bonzini  * an asynchronous message back to the client.  The Empty IU is used
136*47b43a1fSPaolo Bonzini  * to hang out a meaningless request to the server so that it can respond
137*47b43a1fSPaolo Bonzini  * asynchrouously with something like a SCSI AER
138*47b43a1fSPaolo Bonzini  */
139*47b43a1fSPaolo Bonzini struct viosrp_empty_iu {
140*47b43a1fSPaolo Bonzini     struct mad_common common;
141*47b43a1fSPaolo Bonzini     uint64_t buffer;
142*47b43a1fSPaolo Bonzini     uint32_t port;
143*47b43a1fSPaolo Bonzini };
144*47b43a1fSPaolo Bonzini 
145*47b43a1fSPaolo Bonzini struct viosrp_error_log {
146*47b43a1fSPaolo Bonzini     struct mad_common common;
147*47b43a1fSPaolo Bonzini     uint64_t buffer;
148*47b43a1fSPaolo Bonzini };
149*47b43a1fSPaolo Bonzini 
150*47b43a1fSPaolo Bonzini struct viosrp_adapter_info {
151*47b43a1fSPaolo Bonzini     struct mad_common common;
152*47b43a1fSPaolo Bonzini     uint64_t buffer;
153*47b43a1fSPaolo Bonzini };
154*47b43a1fSPaolo Bonzini 
155*47b43a1fSPaolo Bonzini struct viosrp_host_config {
156*47b43a1fSPaolo Bonzini     struct mad_common common;
157*47b43a1fSPaolo Bonzini     uint64_t buffer;
158*47b43a1fSPaolo Bonzini };
159*47b43a1fSPaolo Bonzini 
160*47b43a1fSPaolo Bonzini struct viosrp_fast_fail {
161*47b43a1fSPaolo Bonzini     struct mad_common common;
162*47b43a1fSPaolo Bonzini };
163*47b43a1fSPaolo Bonzini 
164*47b43a1fSPaolo Bonzini struct viosrp_capabilities {
165*47b43a1fSPaolo Bonzini     struct mad_common common;
166*47b43a1fSPaolo Bonzini     uint64_t buffer;
167*47b43a1fSPaolo Bonzini };
168*47b43a1fSPaolo Bonzini 
169*47b43a1fSPaolo Bonzini struct mad_capability_common {
170*47b43a1fSPaolo Bonzini     uint32_t cap_type;
171*47b43a1fSPaolo Bonzini     uint16_t length;
172*47b43a1fSPaolo Bonzini     uint16_t server_support;
173*47b43a1fSPaolo Bonzini };
174*47b43a1fSPaolo Bonzini 
175*47b43a1fSPaolo Bonzini struct mad_reserve_cap {
176*47b43a1fSPaolo Bonzini     struct mad_capability_common common;
177*47b43a1fSPaolo Bonzini     uint32_t type;
178*47b43a1fSPaolo Bonzini };
179*47b43a1fSPaolo Bonzini 
180*47b43a1fSPaolo Bonzini struct mad_migration_cap {
181*47b43a1fSPaolo Bonzini     struct mad_capability_common common;
182*47b43a1fSPaolo Bonzini     uint32_t ecl;
183*47b43a1fSPaolo Bonzini };
184*47b43a1fSPaolo Bonzini 
185*47b43a1fSPaolo Bonzini struct capabilities {
186*47b43a1fSPaolo Bonzini     uint32_t flags;
187*47b43a1fSPaolo Bonzini     char name[SRP_MAX_LOC_LEN];
188*47b43a1fSPaolo Bonzini     char loc[SRP_MAX_LOC_LEN];
189*47b43a1fSPaolo Bonzini     struct mad_migration_cap migration;
190*47b43a1fSPaolo Bonzini     struct mad_reserve_cap reserve;
191*47b43a1fSPaolo Bonzini };
192*47b43a1fSPaolo Bonzini 
193*47b43a1fSPaolo Bonzini union mad_iu {
194*47b43a1fSPaolo Bonzini     struct viosrp_empty_iu empty_iu;
195*47b43a1fSPaolo Bonzini     struct viosrp_error_log error_log;
196*47b43a1fSPaolo Bonzini     struct viosrp_adapter_info adapter_info;
197*47b43a1fSPaolo Bonzini     struct viosrp_host_config host_config;
198*47b43a1fSPaolo Bonzini     struct viosrp_fast_fail fast_fail;
199*47b43a1fSPaolo Bonzini     struct viosrp_capabilities capabilities;
200*47b43a1fSPaolo Bonzini };
201*47b43a1fSPaolo Bonzini 
202*47b43a1fSPaolo Bonzini union viosrp_iu {
203*47b43a1fSPaolo Bonzini     union srp_iu srp;
204*47b43a1fSPaolo Bonzini     union mad_iu mad;
205*47b43a1fSPaolo Bonzini };
206*47b43a1fSPaolo Bonzini 
207*47b43a1fSPaolo Bonzini struct mad_adapter_info_data {
208*47b43a1fSPaolo Bonzini     char srp_version[8];
209*47b43a1fSPaolo Bonzini     char partition_name[96];
210*47b43a1fSPaolo Bonzini     uint32_t partition_number;
211*47b43a1fSPaolo Bonzini     uint32_t mad_version;
212*47b43a1fSPaolo Bonzini     uint32_t os_type;
213*47b43a1fSPaolo Bonzini     uint32_t port_max_txu[8];    /* per-port maximum transfer */
214*47b43a1fSPaolo Bonzini };
215*47b43a1fSPaolo Bonzini 
216*47b43a1fSPaolo Bonzini #endif
217