1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 288a678bbSBryant G. Ly /*****************************************************************************/ 388a678bbSBryant G. Ly /* srp.h -- SCSI RDMA Protocol definitions */ 488a678bbSBryant G. Ly /* */ 588a678bbSBryant G. Ly /* Written By: Colin Devilbis, IBM Corporation */ 688a678bbSBryant G. Ly /* */ 788a678bbSBryant G. Ly /* Copyright (C) 2003 IBM Corporation */ 888a678bbSBryant G. Ly /* */ 988a678bbSBryant G. Ly /* */ 1088a678bbSBryant G. Ly /* This file contains structures and definitions for IBM RPA (RS/6000 */ 1188a678bbSBryant G. Ly /* platform architecture) implementation of the SRP (SCSI RDMA Protocol) */ 1288a678bbSBryant G. Ly /* standard. SRP is used on IBM iSeries and pSeries platforms to send SCSI */ 1388a678bbSBryant G. Ly /* commands between logical partitions. */ 1488a678bbSBryant G. Ly /* */ 1588a678bbSBryant G. Ly /* SRP Information Units (IUs) are sent on a "Command/Response Queue" (CRQ) */ 1688a678bbSBryant G. Ly /* between partitions. The definitions in this file are architected, */ 1788a678bbSBryant G. Ly /* and cannot be changed without breaking compatibility with other versions */ 1888a678bbSBryant G. Ly /* of Linux and other operating systems (AIX, OS/400) that talk this protocol*/ 1988a678bbSBryant G. Ly /* between logical partitions */ 2088a678bbSBryant G. Ly /*****************************************************************************/ 2188a678bbSBryant G. Ly #ifndef VIOSRP_H 2288a678bbSBryant G. Ly #define VIOSRP_H 2388a678bbSBryant G. Ly #include <scsi/srp.h> 2488a678bbSBryant G. Ly 2588a678bbSBryant G. Ly #define SRP_VERSION "16.a" 2688a678bbSBryant G. Ly #define SRP_MAX_IU_LEN 256 2788a678bbSBryant G. Ly #define SRP_MAX_LOC_LEN 32 2888a678bbSBryant G. Ly 2988a678bbSBryant G. Ly union srp_iu { 3088a678bbSBryant G. Ly struct srp_login_req login_req; 3188a678bbSBryant G. Ly struct srp_login_rsp login_rsp; 3288a678bbSBryant G. Ly struct srp_login_rej login_rej; 3388a678bbSBryant G. Ly struct srp_i_logout i_logout; 3488a678bbSBryant G. Ly struct srp_t_logout t_logout; 3588a678bbSBryant G. Ly struct srp_tsk_mgmt tsk_mgmt; 3688a678bbSBryant G. Ly struct srp_cmd cmd; 3788a678bbSBryant G. Ly struct srp_rsp rsp; 3888a678bbSBryant G. Ly u8 reserved[SRP_MAX_IU_LEN]; 3988a678bbSBryant G. Ly }; 4088a678bbSBryant G. Ly 4188a678bbSBryant G. Ly enum viosrp_crq_headers { 4288a678bbSBryant G. Ly VIOSRP_CRQ_FREE = 0x00, 4388a678bbSBryant G. Ly VIOSRP_CRQ_CMD_RSP = 0x80, 4488a678bbSBryant G. Ly VIOSRP_CRQ_INIT_RSP = 0xC0, 4588a678bbSBryant G. Ly VIOSRP_CRQ_XPORT_EVENT = 0xFF 4688a678bbSBryant G. Ly }; 4788a678bbSBryant G. Ly 4888a678bbSBryant G. Ly enum viosrp_crq_init_formats { 4988a678bbSBryant G. Ly VIOSRP_CRQ_INIT = 0x01, 5088a678bbSBryant G. Ly VIOSRP_CRQ_INIT_COMPLETE = 0x02 5188a678bbSBryant G. Ly }; 5288a678bbSBryant G. Ly 5388a678bbSBryant G. Ly enum viosrp_crq_formats { 5488a678bbSBryant G. Ly VIOSRP_SRP_FORMAT = 0x01, 5588a678bbSBryant G. Ly VIOSRP_MAD_FORMAT = 0x02, 5688a678bbSBryant G. Ly VIOSRP_OS400_FORMAT = 0x03, 5788a678bbSBryant G. Ly VIOSRP_AIX_FORMAT = 0x04, 5888a678bbSBryant G. Ly VIOSRP_LINUX_FORMAT = 0x05, 5988a678bbSBryant G. Ly VIOSRP_INLINE_FORMAT = 0x06 6088a678bbSBryant G. Ly }; 6188a678bbSBryant G. Ly 6288a678bbSBryant G. Ly enum viosrp_crq_status { 6388a678bbSBryant G. Ly VIOSRP_OK = 0x0, 6488a678bbSBryant G. Ly VIOSRP_NONRECOVERABLE_ERR = 0x1, 6588a678bbSBryant G. Ly VIOSRP_VIOLATES_MAX_XFER = 0x2, 6688a678bbSBryant G. Ly VIOSRP_PARTNER_PANIC = 0x3, 6788a678bbSBryant G. Ly VIOSRP_DEVICE_BUSY = 0x8, 6888a678bbSBryant G. Ly VIOSRP_ADAPTER_FAIL = 0x10, 6988a678bbSBryant G. Ly VIOSRP_OK2 = 0x99, 7088a678bbSBryant G. Ly }; 7188a678bbSBryant G. Ly 7288a678bbSBryant G. Ly struct viosrp_crq { 73*03e4383cSKees Cook union { 74*03e4383cSKees Cook __be64 high; /* High 64 bits */ 75*03e4383cSKees Cook struct { 7688a678bbSBryant G. Ly u8 valid; /* used by RPA */ 7788a678bbSBryant G. Ly u8 format; /* SCSI vs out-of-band */ 7888a678bbSBryant G. Ly u8 reserved; 7988a678bbSBryant G. Ly u8 status; /* non-scsi failure? (e.g. DMA failure) */ 8088a678bbSBryant G. Ly __be16 timeout; /* in seconds */ 8188a678bbSBryant G. Ly __be16 IU_length; /* in bytes */ 82*03e4383cSKees Cook }; 83*03e4383cSKees Cook }; 8488a678bbSBryant G. Ly __be64 IU_data_ptr; /* the TCE for transferring data */ 8588a678bbSBryant G. Ly }; 8688a678bbSBryant G. Ly 8788a678bbSBryant G. Ly /* MADs are Management requests above and beyond the IUs defined in the SRP 8888a678bbSBryant G. Ly * standard. 8988a678bbSBryant G. Ly */ 9088a678bbSBryant G. Ly enum viosrp_mad_types { 9188a678bbSBryant G. Ly VIOSRP_EMPTY_IU_TYPE = 0x01, 9288a678bbSBryant G. Ly VIOSRP_ERROR_LOG_TYPE = 0x02, 9388a678bbSBryant G. Ly VIOSRP_ADAPTER_INFO_TYPE = 0x03, 9488a678bbSBryant G. Ly VIOSRP_CAPABILITIES_TYPE = 0x05, 9588a678bbSBryant G. Ly VIOSRP_ENABLE_FAST_FAIL = 0x08, 9688a678bbSBryant G. Ly }; 9788a678bbSBryant G. Ly 9888a678bbSBryant G. Ly enum viosrp_mad_status { 9988a678bbSBryant G. Ly VIOSRP_MAD_SUCCESS = 0x00, 10088a678bbSBryant G. Ly VIOSRP_MAD_NOT_SUPPORTED = 0xF1, 10188a678bbSBryant G. Ly VIOSRP_MAD_FAILED = 0xF7, 10288a678bbSBryant G. Ly }; 10388a678bbSBryant G. Ly 10488a678bbSBryant G. Ly enum viosrp_capability_type { 10588a678bbSBryant G. Ly MIGRATION_CAPABILITIES = 0x01, 10688a678bbSBryant G. Ly RESERVATION_CAPABILITIES = 0x02, 10788a678bbSBryant G. Ly }; 10888a678bbSBryant G. Ly 10988a678bbSBryant G. Ly enum viosrp_capability_support { 11088a678bbSBryant G. Ly SERVER_DOES_NOT_SUPPORTS_CAP = 0x0, 11188a678bbSBryant G. Ly SERVER_SUPPORTS_CAP = 0x01, 11288a678bbSBryant G. Ly SERVER_CAP_DATA = 0x02, 11388a678bbSBryant G. Ly }; 11488a678bbSBryant G. Ly 11588a678bbSBryant G. Ly enum viosrp_reserve_type { 11688a678bbSBryant G. Ly CLIENT_RESERVE_SCSI_2 = 0x01, 11788a678bbSBryant G. Ly }; 11888a678bbSBryant G. Ly 11988a678bbSBryant G. Ly enum viosrp_capability_flag { 12088a678bbSBryant G. Ly CLIENT_MIGRATED = 0x01, 12188a678bbSBryant G. Ly CLIENT_RECONNECT = 0x02, 12288a678bbSBryant G. Ly CAP_LIST_SUPPORTED = 0x04, 12388a678bbSBryant G. Ly CAP_LIST_DATA = 0x08, 12488a678bbSBryant G. Ly }; 12588a678bbSBryant G. Ly 12688a678bbSBryant G. Ly /* 12788a678bbSBryant G. Ly * Common MAD header 12888a678bbSBryant G. Ly */ 12988a678bbSBryant G. Ly struct mad_common { 13088a678bbSBryant G. Ly __be32 type; 13188a678bbSBryant G. Ly __be16 status; 13288a678bbSBryant G. Ly __be16 length; 13388a678bbSBryant G. Ly __be64 tag; 13488a678bbSBryant G. Ly }; 13588a678bbSBryant G. Ly 13688a678bbSBryant G. Ly /* 13788a678bbSBryant G. Ly * All SRP (and MAD) requests normally flow from the 13888a678bbSBryant G. Ly * client to the server. There is no way for the server to send 13988a678bbSBryant G. Ly * an asynchronous message back to the client. The Empty IU is used 14088a678bbSBryant G. Ly * to hang out a meaningless request to the server so that it can respond 14188a678bbSBryant G. Ly * asynchrouously with something like a SCSI AER 14288a678bbSBryant G. Ly */ 14388a678bbSBryant G. Ly struct viosrp_empty_iu { 14488a678bbSBryant G. Ly struct mad_common common; 14588a678bbSBryant G. Ly __be64 buffer; 14688a678bbSBryant G. Ly __be32 port; 14788a678bbSBryant G. Ly }; 14888a678bbSBryant G. Ly 14988a678bbSBryant G. Ly struct viosrp_error_log { 15088a678bbSBryant G. Ly struct mad_common common; 15188a678bbSBryant G. Ly __be64 buffer; 15288a678bbSBryant G. Ly }; 15388a678bbSBryant G. Ly 15488a678bbSBryant G. Ly struct viosrp_adapter_info { 15588a678bbSBryant G. Ly struct mad_common common; 15688a678bbSBryant G. Ly __be64 buffer; 15788a678bbSBryant G. Ly }; 15888a678bbSBryant G. Ly 15988a678bbSBryant G. Ly struct viosrp_fast_fail { 16088a678bbSBryant G. Ly struct mad_common common; 16188a678bbSBryant G. Ly }; 16288a678bbSBryant G. Ly 16388a678bbSBryant G. Ly struct viosrp_capabilities { 16488a678bbSBryant G. Ly struct mad_common common; 16588a678bbSBryant G. Ly __be64 buffer; 16688a678bbSBryant G. Ly }; 16788a678bbSBryant G. Ly 16888a678bbSBryant G. Ly struct mad_capability_common { 16988a678bbSBryant G. Ly __be32 cap_type; 17088a678bbSBryant G. Ly __be16 length; 17188a678bbSBryant G. Ly __be16 server_support; 17288a678bbSBryant G. Ly }; 17388a678bbSBryant G. Ly 17488a678bbSBryant G. Ly struct mad_reserve_cap { 17588a678bbSBryant G. Ly struct mad_capability_common common; 17688a678bbSBryant G. Ly __be32 type; 17788a678bbSBryant G. Ly }; 17888a678bbSBryant G. Ly 17988a678bbSBryant G. Ly struct mad_migration_cap { 18088a678bbSBryant G. Ly struct mad_capability_common common; 18188a678bbSBryant G. Ly __be32 ecl; 18288a678bbSBryant G. Ly }; 18388a678bbSBryant G. Ly 18488a678bbSBryant G. Ly struct capabilities { 18588a678bbSBryant G. Ly __be32 flags; 18688a678bbSBryant G. Ly char name[SRP_MAX_LOC_LEN]; 18788a678bbSBryant G. Ly char loc[SRP_MAX_LOC_LEN]; 18888a678bbSBryant G. Ly struct mad_migration_cap migration; 18988a678bbSBryant G. Ly struct mad_reserve_cap reserve; 19088a678bbSBryant G. Ly }; 19188a678bbSBryant G. Ly 19288a678bbSBryant G. Ly union mad_iu { 19388a678bbSBryant G. Ly struct viosrp_empty_iu empty_iu; 19488a678bbSBryant G. Ly struct viosrp_error_log error_log; 19588a678bbSBryant G. Ly struct viosrp_adapter_info adapter_info; 19688a678bbSBryant G. Ly struct viosrp_fast_fail fast_fail; 19788a678bbSBryant G. Ly struct viosrp_capabilities capabilities; 19888a678bbSBryant G. Ly }; 19988a678bbSBryant G. Ly 20088a678bbSBryant G. Ly union viosrp_iu { 20188a678bbSBryant G. Ly union srp_iu srp; 20288a678bbSBryant G. Ly union mad_iu mad; 20388a678bbSBryant G. Ly }; 20488a678bbSBryant G. Ly 20588a678bbSBryant G. Ly struct mad_adapter_info_data { 20688a678bbSBryant G. Ly char srp_version[8]; 20788a678bbSBryant G. Ly char partition_name[96]; 20888a678bbSBryant G. Ly __be32 partition_number; 20988a678bbSBryant G. Ly #define SRP_MAD_VERSION_1 1 21088a678bbSBryant G. Ly __be32 mad_version; 21188a678bbSBryant G. Ly #define SRP_MAD_OS_LINUX 2 21288a678bbSBryant G. Ly #define SRP_MAD_OS_AIX 3 21388a678bbSBryant G. Ly __be32 os_type; 21488a678bbSBryant G. Ly __be32 port_max_txu[8]; /* per-port maximum transfer */ 21588a678bbSBryant G. Ly }; 21688a678bbSBryant G. Ly 21788a678bbSBryant G. Ly #endif 218