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