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