147b43a1fSPaolo Bonzini /*****************************************************************************/ 247b43a1fSPaolo Bonzini /* srp.h -- SCSI RDMA Protocol definitions */ 347b43a1fSPaolo Bonzini /* */ 447b43a1fSPaolo Bonzini /* Written By: Colin Devilbis, IBM Corporation */ 547b43a1fSPaolo Bonzini /* */ 647b43a1fSPaolo Bonzini /* Copyright (C) 2003 IBM Corporation */ 747b43a1fSPaolo Bonzini /* */ 847b43a1fSPaolo Bonzini /* This program is free software; you can redistribute it and/or modify */ 947b43a1fSPaolo Bonzini /* it under the terms of the GNU General Public License as published by */ 1047b43a1fSPaolo Bonzini /* the Free Software Foundation; either version 2 of the License, or */ 1147b43a1fSPaolo Bonzini /* (at your option) any later version. */ 1247b43a1fSPaolo Bonzini /* */ 1347b43a1fSPaolo Bonzini /* This program is distributed in the hope that it will be useful, */ 1447b43a1fSPaolo Bonzini /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ 1547b43a1fSPaolo Bonzini /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ 1647b43a1fSPaolo Bonzini /* GNU General Public License for more details. */ 1747b43a1fSPaolo Bonzini /* */ 1847b43a1fSPaolo Bonzini /* You should have received a copy of the GNU General Public License */ 19*0c201cc1SKhadija Kamran /* along with this program. If not, see <https://www.gnu.org/licenses/>. */ 2047b43a1fSPaolo Bonzini /* */ 2147b43a1fSPaolo Bonzini /* */ 2247b43a1fSPaolo Bonzini /* This file contains structures and definitions for IBM RPA (RS/6000 */ 2347b43a1fSPaolo Bonzini /* platform architecture) implementation of the SRP (SCSI RDMA Protocol) */ 2447b43a1fSPaolo Bonzini /* standard. SRP is used on IBM iSeries and pSeries platforms to send SCSI */ 2547b43a1fSPaolo Bonzini /* commands between logical partitions. */ 2647b43a1fSPaolo Bonzini /* */ 2747b43a1fSPaolo Bonzini /* SRP Information Units (IUs) are sent on a "Command/Response Queue" (CRQ) */ 2847b43a1fSPaolo Bonzini /* between partitions. The definitions in this file are architected, */ 2947b43a1fSPaolo Bonzini /* and cannot be changed without breaking compatibility with other versions */ 3047b43a1fSPaolo Bonzini /* of Linux and other operating systems (AIX, OS/400) that talk this protocol*/ 3147b43a1fSPaolo Bonzini /* between logical partitions */ 3247b43a1fSPaolo Bonzini /*****************************************************************************/ 3347b43a1fSPaolo Bonzini #ifndef PPC_VIOSRP_H 3447b43a1fSPaolo Bonzini #define PPC_VIOSRP_H 3547b43a1fSPaolo Bonzini 36560f421aSPhilippe Mathieu-Daudé #include "hw/scsi/srp.h" 37560f421aSPhilippe Mathieu-Daudé 3847b43a1fSPaolo Bonzini #define SRP_VERSION "16.a" 3947b43a1fSPaolo Bonzini #define SRP_MAX_IU_LEN 256 4047b43a1fSPaolo Bonzini #define SRP_MAX_LOC_LEN 32 4147b43a1fSPaolo Bonzini 4247b43a1fSPaolo Bonzini union srp_iu { 4347b43a1fSPaolo Bonzini struct srp_login_req login_req; 4447b43a1fSPaolo Bonzini struct srp_login_rsp login_rsp; 4547b43a1fSPaolo Bonzini struct srp_login_rej login_rej; 4647b43a1fSPaolo Bonzini struct srp_i_logout i_logout; 4747b43a1fSPaolo Bonzini struct srp_t_logout t_logout; 4847b43a1fSPaolo Bonzini struct srp_tsk_mgmt tsk_mgmt; 4947b43a1fSPaolo Bonzini struct srp_cmd cmd; 5047b43a1fSPaolo Bonzini struct srp_rsp rsp; 5147b43a1fSPaolo Bonzini }; 5247b43a1fSPaolo Bonzini 5347b43a1fSPaolo Bonzini enum viosrp_crq_formats { 5447b43a1fSPaolo Bonzini VIOSRP_SRP_FORMAT = 0x01, 5547b43a1fSPaolo Bonzini VIOSRP_MAD_FORMAT = 0x02, 5647b43a1fSPaolo Bonzini VIOSRP_OS400_FORMAT = 0x03, 5747b43a1fSPaolo Bonzini VIOSRP_AIX_FORMAT = 0x04, 5847b43a1fSPaolo Bonzini VIOSRP_LINUX_FORMAT = 0x06, 5947b43a1fSPaolo Bonzini VIOSRP_INLINE_FORMAT = 0x07 6047b43a1fSPaolo Bonzini }; 6147b43a1fSPaolo Bonzini 6247b43a1fSPaolo Bonzini enum viosrp_crq_status { 6347b43a1fSPaolo Bonzini VIOSRP_OK = 0x0, 6447b43a1fSPaolo Bonzini VIOSRP_NONRECOVERABLE_ERR = 0x1, 6547b43a1fSPaolo Bonzini VIOSRP_VIOLATES_MAX_XFER = 0x2, 6647b43a1fSPaolo Bonzini VIOSRP_PARTNER_PANIC = 0x3, 6747b43a1fSPaolo Bonzini VIOSRP_DEVICE_BUSY = 0x8, 6847b43a1fSPaolo Bonzini VIOSRP_ADAPTER_FAIL = 0x10, 6947b43a1fSPaolo Bonzini VIOSRP_OK2 = 0x99, 7047b43a1fSPaolo Bonzini }; 7147b43a1fSPaolo Bonzini 7247b43a1fSPaolo Bonzini struct viosrp_crq { 7347b43a1fSPaolo Bonzini uint8_t valid; /* used by RPA */ 7447b43a1fSPaolo Bonzini uint8_t format; /* SCSI vs out-of-band */ 7547b43a1fSPaolo Bonzini uint8_t reserved; 7647b43a1fSPaolo Bonzini uint8_t status; /* non-scsi failure? (e.g. DMA failure) */ 7747b43a1fSPaolo Bonzini uint16_t timeout; /* in seconds */ 7847b43a1fSPaolo Bonzini uint16_t IU_length; /* in bytes */ 7947b43a1fSPaolo Bonzini uint64_t IU_data_ptr; /* the TCE for transferring data */ 8047b43a1fSPaolo Bonzini }; 8147b43a1fSPaolo Bonzini 8247b43a1fSPaolo Bonzini /* MADs are Management requests above and beyond the IUs defined in the SRP 8347b43a1fSPaolo Bonzini * standard. 8447b43a1fSPaolo Bonzini */ 8547b43a1fSPaolo Bonzini enum viosrp_mad_types { 8647b43a1fSPaolo Bonzini VIOSRP_EMPTY_IU_TYPE = 0x01, 8747b43a1fSPaolo Bonzini VIOSRP_ERROR_LOG_TYPE = 0x02, 8847b43a1fSPaolo Bonzini VIOSRP_ADAPTER_INFO_TYPE = 0x03, 8947b43a1fSPaolo Bonzini VIOSRP_HOST_CONFIG_TYPE = 0x04, 9047b43a1fSPaolo Bonzini VIOSRP_CAPABILITIES_TYPE = 0x05, 9147b43a1fSPaolo Bonzini VIOSRP_ENABLE_FAST_FAIL = 0x08, 9247b43a1fSPaolo Bonzini }; 9347b43a1fSPaolo Bonzini 9447b43a1fSPaolo Bonzini enum viosrp_mad_status { 9547b43a1fSPaolo Bonzini VIOSRP_MAD_SUCCESS = 0x00, 9647b43a1fSPaolo Bonzini VIOSRP_MAD_NOT_SUPPORTED = 0xF1, 9747b43a1fSPaolo Bonzini VIOSRP_MAD_FAILED = 0xF7, 9847b43a1fSPaolo Bonzini }; 9947b43a1fSPaolo Bonzini 10047b43a1fSPaolo Bonzini enum viosrp_capability_type { 10147b43a1fSPaolo Bonzini MIGRATION_CAPABILITIES = 0x01, 10247b43a1fSPaolo Bonzini RESERVATION_CAPABILITIES = 0x02, 10347b43a1fSPaolo Bonzini }; 10447b43a1fSPaolo Bonzini 10547b43a1fSPaolo Bonzini enum viosrp_capability_support { 10647b43a1fSPaolo Bonzini SERVER_DOES_NOT_SUPPORTS_CAP = 0x0, 10747b43a1fSPaolo Bonzini SERVER_SUPPORTS_CAP = 0x01, 10847b43a1fSPaolo Bonzini SERVER_CAP_DATA = 0x02, 10947b43a1fSPaolo Bonzini }; 11047b43a1fSPaolo Bonzini 11147b43a1fSPaolo Bonzini enum viosrp_reserve_type { 11247b43a1fSPaolo Bonzini CLIENT_RESERVE_SCSI_2 = 0x01, 11347b43a1fSPaolo Bonzini }; 11447b43a1fSPaolo Bonzini 11547b43a1fSPaolo Bonzini enum viosrp_capability_flag { 11647b43a1fSPaolo Bonzini CLIENT_MIGRATED = 0x01, 11747b43a1fSPaolo Bonzini CLIENT_RECONNECT = 0x02, 11847b43a1fSPaolo Bonzini CAP_LIST_SUPPORTED = 0x04, 11947b43a1fSPaolo Bonzini CAP_LIST_DATA = 0x08, 12047b43a1fSPaolo Bonzini }; 12147b43a1fSPaolo Bonzini 12247b43a1fSPaolo Bonzini /* 12347b43a1fSPaolo Bonzini * Common MAD header 12447b43a1fSPaolo Bonzini */ 12547b43a1fSPaolo Bonzini struct mad_common { 12647b43a1fSPaolo Bonzini uint32_t type; 12747b43a1fSPaolo Bonzini uint16_t status; 12847b43a1fSPaolo Bonzini uint16_t length; 12947b43a1fSPaolo Bonzini uint64_t tag; 13047b43a1fSPaolo Bonzini }; 13147b43a1fSPaolo Bonzini 13247b43a1fSPaolo Bonzini /* 13347b43a1fSPaolo Bonzini * All SRP (and MAD) requests normally flow from the 13447b43a1fSPaolo Bonzini * client to the server. There is no way for the server to send 13547b43a1fSPaolo Bonzini * an asynchronous message back to the client. The Empty IU is used 13647b43a1fSPaolo Bonzini * to hang out a meaningless request to the server so that it can respond 13747b43a1fSPaolo Bonzini * asynchrouously with something like a SCSI AER 13847b43a1fSPaolo Bonzini */ 13947b43a1fSPaolo Bonzini struct viosrp_empty_iu { 14047b43a1fSPaolo Bonzini struct mad_common common; 14147b43a1fSPaolo Bonzini uint64_t buffer; 14247b43a1fSPaolo Bonzini uint32_t port; 14347b43a1fSPaolo Bonzini }; 14447b43a1fSPaolo Bonzini 14547b43a1fSPaolo Bonzini struct viosrp_error_log { 14647b43a1fSPaolo Bonzini struct mad_common common; 14747b43a1fSPaolo Bonzini uint64_t buffer; 14847b43a1fSPaolo Bonzini }; 14947b43a1fSPaolo Bonzini 15047b43a1fSPaolo Bonzini struct viosrp_adapter_info { 15147b43a1fSPaolo Bonzini struct mad_common common; 15247b43a1fSPaolo Bonzini uint64_t buffer; 15347b43a1fSPaolo Bonzini }; 15447b43a1fSPaolo Bonzini 15547b43a1fSPaolo Bonzini struct viosrp_host_config { 15647b43a1fSPaolo Bonzini struct mad_common common; 15747b43a1fSPaolo Bonzini uint64_t buffer; 15847b43a1fSPaolo Bonzini }; 15947b43a1fSPaolo Bonzini 16047b43a1fSPaolo Bonzini struct viosrp_fast_fail { 16147b43a1fSPaolo Bonzini struct mad_common common; 16247b43a1fSPaolo Bonzini }; 16347b43a1fSPaolo Bonzini 16447b43a1fSPaolo Bonzini struct viosrp_capabilities { 16547b43a1fSPaolo Bonzini struct mad_common common; 16647b43a1fSPaolo Bonzini uint64_t buffer; 16747b43a1fSPaolo Bonzini }; 16847b43a1fSPaolo Bonzini 16947b43a1fSPaolo Bonzini struct mad_capability_common { 17047b43a1fSPaolo Bonzini uint32_t cap_type; 17147b43a1fSPaolo Bonzini uint16_t length; 17247b43a1fSPaolo Bonzini uint16_t server_support; 17347b43a1fSPaolo Bonzini }; 17447b43a1fSPaolo Bonzini 17547b43a1fSPaolo Bonzini struct mad_reserve_cap { 17647b43a1fSPaolo Bonzini struct mad_capability_common common; 17747b43a1fSPaolo Bonzini uint32_t type; 17847b43a1fSPaolo Bonzini }; 17947b43a1fSPaolo Bonzini 18047b43a1fSPaolo Bonzini struct mad_migration_cap { 18147b43a1fSPaolo Bonzini struct mad_capability_common common; 18247b43a1fSPaolo Bonzini uint32_t ecl; 18347b43a1fSPaolo Bonzini }; 18447b43a1fSPaolo Bonzini 18547b43a1fSPaolo Bonzini struct capabilities { 18647b43a1fSPaolo Bonzini uint32_t flags; 18747b43a1fSPaolo Bonzini char name[SRP_MAX_LOC_LEN]; 18847b43a1fSPaolo Bonzini char loc[SRP_MAX_LOC_LEN]; 18947b43a1fSPaolo Bonzini struct mad_migration_cap migration; 19047b43a1fSPaolo Bonzini struct mad_reserve_cap reserve; 19147b43a1fSPaolo Bonzini }; 19247b43a1fSPaolo Bonzini 19347b43a1fSPaolo Bonzini union mad_iu { 19447b43a1fSPaolo Bonzini struct viosrp_empty_iu empty_iu; 19547b43a1fSPaolo Bonzini struct viosrp_error_log error_log; 19647b43a1fSPaolo Bonzini struct viosrp_adapter_info adapter_info; 19747b43a1fSPaolo Bonzini struct viosrp_host_config host_config; 19847b43a1fSPaolo Bonzini struct viosrp_fast_fail fast_fail; 19947b43a1fSPaolo Bonzini struct viosrp_capabilities capabilities; 20047b43a1fSPaolo Bonzini }; 20147b43a1fSPaolo Bonzini 20247b43a1fSPaolo Bonzini union viosrp_iu { 20347b43a1fSPaolo Bonzini union srp_iu srp; 20447b43a1fSPaolo Bonzini union mad_iu mad; 20547b43a1fSPaolo Bonzini }; 20647b43a1fSPaolo Bonzini 20747b43a1fSPaolo Bonzini struct mad_adapter_info_data { 20847b43a1fSPaolo Bonzini char srp_version[8]; 20947b43a1fSPaolo Bonzini char partition_name[96]; 21047b43a1fSPaolo Bonzini uint32_t partition_number; 21147b43a1fSPaolo Bonzini uint32_t mad_version; 21247b43a1fSPaolo Bonzini uint32_t os_type; 21347b43a1fSPaolo Bonzini uint32_t port_max_txu[8]; /* per-port maximum transfer */ 21447b43a1fSPaolo Bonzini }; 21547b43a1fSPaolo Bonzini 21647b43a1fSPaolo Bonzini #endif 217