xref: /qemu/hw/scsi/viosrp.h (revision 0c201cc1)
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         */
190c201cc1SKhadija 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