xref: /openbmc/linux/drivers/infiniband/hw/vmw_pvrdma/pvrdma_dev_api.h (revision c95baf12f5077419db01313ab61c2aac007d40cd)
129c8d9ebSAdit Ranadive /*
229c8d9ebSAdit Ranadive  * Copyright (c) 2012-2016 VMware, Inc.  All rights reserved.
329c8d9ebSAdit Ranadive  *
429c8d9ebSAdit Ranadive  * This program is free software; you can redistribute it and/or
529c8d9ebSAdit Ranadive  * modify it under the terms of EITHER the GNU General Public License
629c8d9ebSAdit Ranadive  * version 2 as published by the Free Software Foundation or the BSD
729c8d9ebSAdit Ranadive  * 2-Clause License. This program is distributed in the hope that it
829c8d9ebSAdit Ranadive  * will be useful, but WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED
929c8d9ebSAdit Ranadive  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1029c8d9ebSAdit Ranadive  * See the GNU General Public License version 2 for more details at
1129c8d9ebSAdit Ranadive  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html.
1229c8d9ebSAdit Ranadive  *
1329c8d9ebSAdit Ranadive  * You should have received a copy of the GNU General Public License
1429c8d9ebSAdit Ranadive  * along with this program available in the file COPYING in the main
1529c8d9ebSAdit Ranadive  * directory of this source tree.
1629c8d9ebSAdit Ranadive  *
1729c8d9ebSAdit Ranadive  * The BSD 2-Clause License
1829c8d9ebSAdit Ranadive  *
1929c8d9ebSAdit Ranadive  *     Redistribution and use in source and binary forms, with or
2029c8d9ebSAdit Ranadive  *     without modification, are permitted provided that the following
2129c8d9ebSAdit Ranadive  *     conditions are met:
2229c8d9ebSAdit Ranadive  *
2329c8d9ebSAdit Ranadive  *      - Redistributions of source code must retain the above
2429c8d9ebSAdit Ranadive  *        copyright notice, this list of conditions and the following
2529c8d9ebSAdit Ranadive  *        disclaimer.
2629c8d9ebSAdit Ranadive  *
2729c8d9ebSAdit Ranadive  *      - Redistributions in binary form must reproduce the above
2829c8d9ebSAdit Ranadive  *        copyright notice, this list of conditions and the following
2929c8d9ebSAdit Ranadive  *        disclaimer in the documentation and/or other materials
3029c8d9ebSAdit Ranadive  *        provided with the distribution.
3129c8d9ebSAdit Ranadive  *
3229c8d9ebSAdit Ranadive  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3329c8d9ebSAdit Ranadive  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3429c8d9ebSAdit Ranadive  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
3529c8d9ebSAdit Ranadive  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
3629c8d9ebSAdit Ranadive  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
3729c8d9ebSAdit Ranadive  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
3829c8d9ebSAdit Ranadive  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
3929c8d9ebSAdit Ranadive  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4029c8d9ebSAdit Ranadive  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
4129c8d9ebSAdit Ranadive  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
4229c8d9ebSAdit Ranadive  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
4329c8d9ebSAdit Ranadive  * OF THE POSSIBILITY OF SUCH DAMAGE.
4429c8d9ebSAdit Ranadive  */
4529c8d9ebSAdit Ranadive 
4629c8d9ebSAdit Ranadive #ifndef __PVRDMA_DEV_API_H__
4729c8d9ebSAdit Ranadive #define __PVRDMA_DEV_API_H__
4829c8d9ebSAdit Ranadive 
4929c8d9ebSAdit Ranadive #include <linux/types.h>
5029c8d9ebSAdit Ranadive 
5129c8d9ebSAdit Ranadive #include "pvrdma_verbs.h"
5229c8d9ebSAdit Ranadive 
5305297b66SBryan Tan /*
5405297b66SBryan Tan  * PVRDMA version macros. Some new features require updates to PVRDMA_VERSION.
5505297b66SBryan Tan  * These macros allow us to check for different features if necessary.
5605297b66SBryan Tan  */
5705297b66SBryan Tan 
5805297b66SBryan Tan #define PVRDMA_ROCEV1_VERSION		17
5905297b66SBryan Tan #define PVRDMA_ROCEV2_VERSION		18
608aa04ad3SAdit Ranadive #define PVRDMA_PPN64_VERSION		19
61*a52dc3a1SBryan Tan #define PVRDMA_QPHANDLE_VERSION		20
62*a52dc3a1SBryan Tan #define PVRDMA_VERSION			PVRDMA_QPHANDLE_VERSION
6305297b66SBryan Tan 
6429c8d9ebSAdit Ranadive #define PVRDMA_BOARD_ID			1
6529c8d9ebSAdit Ranadive #define PVRDMA_REV_ID			1
6629c8d9ebSAdit Ranadive 
6729c8d9ebSAdit Ranadive /*
6829c8d9ebSAdit Ranadive  * Masks and accessors for page directory, which is a two-level lookup:
6929c8d9ebSAdit Ranadive  * page directory -> page table -> page. Only one directory for now, but we
7029c8d9ebSAdit Ranadive  * could expand that easily. 9 bits for tables, 9 bits for pages, gives one
7129c8d9ebSAdit Ranadive  * gigabyte for memory regions and so forth.
7229c8d9ebSAdit Ranadive  */
7329c8d9ebSAdit Ranadive 
7429c8d9ebSAdit Ranadive #define PVRDMA_PDIR_SHIFT		18
7529c8d9ebSAdit Ranadive #define PVRDMA_PTABLE_SHIFT		9
7629c8d9ebSAdit Ranadive #define PVRDMA_PAGE_DIR_DIR(x)		(((x) >> PVRDMA_PDIR_SHIFT) & 0x1)
7729c8d9ebSAdit Ranadive #define PVRDMA_PAGE_DIR_TABLE(x)	(((x) >> PVRDMA_PTABLE_SHIFT) & 0x1ff)
7829c8d9ebSAdit Ranadive #define PVRDMA_PAGE_DIR_PAGE(x)		((x) & 0x1ff)
7929c8d9ebSAdit Ranadive #define PVRDMA_PAGE_DIR_MAX_PAGES	(1 * 512 * 512)
8029c8d9ebSAdit Ranadive #define PVRDMA_MAX_FAST_REG_PAGES	128
8129c8d9ebSAdit Ranadive 
8229c8d9ebSAdit Ranadive /*
8329c8d9ebSAdit Ranadive  * Max MSI-X vectors.
8429c8d9ebSAdit Ranadive  */
8529c8d9ebSAdit Ranadive 
8629c8d9ebSAdit Ranadive #define PVRDMA_MAX_INTERRUPTS	3
8729c8d9ebSAdit Ranadive 
8829c8d9ebSAdit Ranadive /* Register offsets within PCI resource on BAR1. */
8929c8d9ebSAdit Ranadive #define PVRDMA_REG_VERSION	0x00	/* R: Version of device. */
9029c8d9ebSAdit Ranadive #define PVRDMA_REG_DSRLOW	0x04	/* W: Device shared region low PA. */
9129c8d9ebSAdit Ranadive #define PVRDMA_REG_DSRHIGH	0x08	/* W: Device shared region high PA. */
9229c8d9ebSAdit Ranadive #define PVRDMA_REG_CTL		0x0c	/* W: PVRDMA_DEVICE_CTL */
9329c8d9ebSAdit Ranadive #define PVRDMA_REG_REQUEST	0x10	/* W: Indicate device request. */
9429c8d9ebSAdit Ranadive #define PVRDMA_REG_ERR		0x14	/* R: Device error. */
9529c8d9ebSAdit Ranadive #define PVRDMA_REG_ICR		0x18	/* R: Interrupt cause. */
9629c8d9ebSAdit Ranadive #define PVRDMA_REG_IMR		0x1c	/* R/W: Interrupt mask. */
9729c8d9ebSAdit Ranadive #define PVRDMA_REG_MACL		0x20	/* R/W: MAC address low. */
9829c8d9ebSAdit Ranadive #define PVRDMA_REG_MACH		0x24	/* R/W: MAC address high. */
9929c8d9ebSAdit Ranadive 
10029c8d9ebSAdit Ranadive /* Object flags. */
10129c8d9ebSAdit Ranadive #define PVRDMA_CQ_FLAG_ARMED_SOL	BIT(0)	/* Armed for solicited-only. */
10229c8d9ebSAdit Ranadive #define PVRDMA_CQ_FLAG_ARMED		BIT(1)	/* Armed. */
10329c8d9ebSAdit Ranadive #define PVRDMA_MR_FLAG_DMA		BIT(0)	/* DMA region. */
10429c8d9ebSAdit Ranadive #define PVRDMA_MR_FLAG_FRMR		BIT(1)	/* Fast reg memory region. */
10529c8d9ebSAdit Ranadive 
10629c8d9ebSAdit Ranadive /*
10729c8d9ebSAdit Ranadive  * Atomic operation capability (masked versions are extended atomic
10829c8d9ebSAdit Ranadive  * operations.
10929c8d9ebSAdit Ranadive  */
11029c8d9ebSAdit Ranadive 
11129c8d9ebSAdit Ranadive #define PVRDMA_ATOMIC_OP_COMP_SWAP	BIT(0)	/* Compare and swap. */
11229c8d9ebSAdit Ranadive #define PVRDMA_ATOMIC_OP_FETCH_ADD	BIT(1)	/* Fetch and add. */
11329c8d9ebSAdit Ranadive #define PVRDMA_ATOMIC_OP_MASK_COMP_SWAP	BIT(2)	/* Masked compare and swap. */
11429c8d9ebSAdit Ranadive #define PVRDMA_ATOMIC_OP_MASK_FETCH_ADD	BIT(3)	/* Masked fetch and add. */
11529c8d9ebSAdit Ranadive 
11629c8d9ebSAdit Ranadive /*
11729c8d9ebSAdit Ranadive  * Base Memory Management Extension flags to support Fast Reg Memory Regions
11829c8d9ebSAdit Ranadive  * and Fast Reg Work Requests. Each flag represents a verb operation and we
11929c8d9ebSAdit Ranadive  * must support all of them to qualify for the BMME device cap.
12029c8d9ebSAdit Ranadive  */
12129c8d9ebSAdit Ranadive 
12229c8d9ebSAdit Ranadive #define PVRDMA_BMME_FLAG_LOCAL_INV	BIT(0)	/* Local Invalidate. */
12329c8d9ebSAdit Ranadive #define PVRDMA_BMME_FLAG_REMOTE_INV	BIT(1)	/* Remote Invalidate. */
12429c8d9ebSAdit Ranadive #define PVRDMA_BMME_FLAG_FAST_REG_WR	BIT(2)	/* Fast Reg Work Request. */
12529c8d9ebSAdit Ranadive 
12629c8d9ebSAdit Ranadive /*
12729c8d9ebSAdit Ranadive  * GID types. The interpretation of the gid_types bit field in the device
12829c8d9ebSAdit Ranadive  * capabilities will depend on the device mode. For now, the device only
12929c8d9ebSAdit Ranadive  * supports RoCE as mode, so only the different GID types for RoCE are
13029c8d9ebSAdit Ranadive  * defined.
13129c8d9ebSAdit Ranadive  */
13229c8d9ebSAdit Ranadive 
13329c8d9ebSAdit Ranadive #define PVRDMA_GID_TYPE_FLAG_ROCE_V1	BIT(0)
13429c8d9ebSAdit Ranadive #define PVRDMA_GID_TYPE_FLAG_ROCE_V2	BIT(1)
13529c8d9ebSAdit Ranadive 
13605297b66SBryan Tan /*
13705297b66SBryan Tan  * Version checks. This checks whether each version supports specific
13805297b66SBryan Tan  * capabilities from the device.
13905297b66SBryan Tan  */
14005297b66SBryan Tan 
14105297b66SBryan Tan #define PVRDMA_IS_VERSION17(_dev)					\
14205297b66SBryan Tan 	(_dev->dsr_version == PVRDMA_ROCEV1_VERSION &&			\
14305297b66SBryan Tan 	 _dev->dsr->caps.gid_types == PVRDMA_GID_TYPE_FLAG_ROCE_V1)
14405297b66SBryan Tan 
14505297b66SBryan Tan #define PVRDMA_IS_VERSION18(_dev)					\
14605297b66SBryan Tan 	(_dev->dsr_version >= PVRDMA_ROCEV2_VERSION &&			\
14705297b66SBryan Tan 	 (_dev->dsr->caps.gid_types == PVRDMA_GID_TYPE_FLAG_ROCE_V1 ||  \
14805297b66SBryan Tan 	  _dev->dsr->caps.gid_types == PVRDMA_GID_TYPE_FLAG_ROCE_V2))	\
14905297b66SBryan Tan 
15005297b66SBryan Tan #define PVRDMA_SUPPORTED(_dev)						\
15105297b66SBryan Tan 	((_dev->dsr->caps.mode == PVRDMA_DEVICE_MODE_ROCE) &&		\
15205297b66SBryan Tan 	 (PVRDMA_IS_VERSION17(_dev) || PVRDMA_IS_VERSION18(_dev)))
15305297b66SBryan Tan 
154a31a2a3bSAdit Ranadive /*
155a31a2a3bSAdit Ranadive  * Get capability values based on device version.
156a31a2a3bSAdit Ranadive  */
157a31a2a3bSAdit Ranadive 
158a31a2a3bSAdit Ranadive #define PVRDMA_GET_CAP(_dev, _old_val, _val) \
159a31a2a3bSAdit Ranadive 	((PVRDMA_IS_VERSION18(_dev)) ? _val : _old_val)
160a31a2a3bSAdit Ranadive 
16129c8d9ebSAdit Ranadive enum pvrdma_pci_resource {
16229c8d9ebSAdit Ranadive 	PVRDMA_PCI_RESOURCE_MSIX,	/* BAR0: MSI-X, MMIO. */
16329c8d9ebSAdit Ranadive 	PVRDMA_PCI_RESOURCE_REG,	/* BAR1: Registers, MMIO. */
16429c8d9ebSAdit Ranadive 	PVRDMA_PCI_RESOURCE_UAR,	/* BAR2: UAR pages, MMIO, 64-bit. */
16529c8d9ebSAdit Ranadive 	PVRDMA_PCI_RESOURCE_LAST,	/* Last. */
16629c8d9ebSAdit Ranadive };
16729c8d9ebSAdit Ranadive 
16829c8d9ebSAdit Ranadive enum pvrdma_device_ctl {
16929c8d9ebSAdit Ranadive 	PVRDMA_DEVICE_CTL_ACTIVATE,	/* Activate device. */
170b172679bSAditya Sarwade 	PVRDMA_DEVICE_CTL_UNQUIESCE,	/* Unquiesce device. */
17129c8d9ebSAdit Ranadive 	PVRDMA_DEVICE_CTL_RESET,	/* Reset device. */
17229c8d9ebSAdit Ranadive };
17329c8d9ebSAdit Ranadive 
17429c8d9ebSAdit Ranadive enum pvrdma_intr_vector {
17529c8d9ebSAdit Ranadive 	PVRDMA_INTR_VECTOR_RESPONSE,	/* Command response. */
17629c8d9ebSAdit Ranadive 	PVRDMA_INTR_VECTOR_ASYNC,	/* Async events. */
17729c8d9ebSAdit Ranadive 	PVRDMA_INTR_VECTOR_CQ,		/* CQ notification. */
17829c8d9ebSAdit Ranadive 	/* Additional CQ notification vectors. */
17929c8d9ebSAdit Ranadive };
18029c8d9ebSAdit Ranadive 
18129c8d9ebSAdit Ranadive enum pvrdma_intr_cause {
18229c8d9ebSAdit Ranadive 	PVRDMA_INTR_CAUSE_RESPONSE	= (1 << PVRDMA_INTR_VECTOR_RESPONSE),
18329c8d9ebSAdit Ranadive 	PVRDMA_INTR_CAUSE_ASYNC		= (1 << PVRDMA_INTR_VECTOR_ASYNC),
18429c8d9ebSAdit Ranadive 	PVRDMA_INTR_CAUSE_CQ		= (1 << PVRDMA_INTR_VECTOR_CQ),
18529c8d9ebSAdit Ranadive };
18629c8d9ebSAdit Ranadive 
18729c8d9ebSAdit Ranadive enum pvrdma_gos_bits {
18829c8d9ebSAdit Ranadive 	PVRDMA_GOS_BITS_UNK,		/* Unknown. */
18929c8d9ebSAdit Ranadive 	PVRDMA_GOS_BITS_32,		/* 32-bit. */
19029c8d9ebSAdit Ranadive 	PVRDMA_GOS_BITS_64,		/* 64-bit. */
19129c8d9ebSAdit Ranadive };
19229c8d9ebSAdit Ranadive 
19329c8d9ebSAdit Ranadive enum pvrdma_gos_type {
19429c8d9ebSAdit Ranadive 	PVRDMA_GOS_TYPE_UNK,		/* Unknown. */
19529c8d9ebSAdit Ranadive 	PVRDMA_GOS_TYPE_LINUX,		/* Linux. */
19629c8d9ebSAdit Ranadive };
19729c8d9ebSAdit Ranadive 
19829c8d9ebSAdit Ranadive enum pvrdma_device_mode {
19929c8d9ebSAdit Ranadive 	PVRDMA_DEVICE_MODE_ROCE,	/* RoCE. */
20029c8d9ebSAdit Ranadive 	PVRDMA_DEVICE_MODE_IWARP,	/* iWarp. */
20129c8d9ebSAdit Ranadive 	PVRDMA_DEVICE_MODE_IB,		/* InfiniBand. */
20229c8d9ebSAdit Ranadive };
20329c8d9ebSAdit Ranadive 
20429c8d9ebSAdit Ranadive struct pvrdma_gos_info {
20529c8d9ebSAdit Ranadive 	u32 gos_bits:2;			/* W: PVRDMA_GOS_BITS_ */
20629c8d9ebSAdit Ranadive 	u32 gos_type:4;			/* W: PVRDMA_GOS_TYPE_ */
20729c8d9ebSAdit Ranadive 	u32 gos_ver:16;			/* W: Guest OS version. */
20829c8d9ebSAdit Ranadive 	u32 gos_misc:10;		/* W: Other. */
20929c8d9ebSAdit Ranadive 	u32 pad;			/* Pad to 8-byte alignment. */
21029c8d9ebSAdit Ranadive };
21129c8d9ebSAdit Ranadive 
21229c8d9ebSAdit Ranadive struct pvrdma_device_caps {
21329c8d9ebSAdit Ranadive 	u64 fw_ver;				/* R: Query device. */
21429c8d9ebSAdit Ranadive 	__be64 node_guid;
21529c8d9ebSAdit Ranadive 	__be64 sys_image_guid;
21629c8d9ebSAdit Ranadive 	u64 max_mr_size;
21729c8d9ebSAdit Ranadive 	u64 page_size_cap;
21829c8d9ebSAdit Ranadive 	u64 atomic_arg_sizes;			/* EX verbs. */
21929c8d9ebSAdit Ranadive 	u32 ex_comp_mask;			/* EX verbs. */
22029c8d9ebSAdit Ranadive 	u32 device_cap_flags2;			/* EX verbs. */
22129c8d9ebSAdit Ranadive 	u32 max_fa_bit_boundary;		/* EX verbs. */
22229c8d9ebSAdit Ranadive 	u32 log_max_atomic_inline_arg;		/* EX verbs. */
22329c8d9ebSAdit Ranadive 	u32 vendor_id;
22429c8d9ebSAdit Ranadive 	u32 vendor_part_id;
22529c8d9ebSAdit Ranadive 	u32 hw_ver;
22629c8d9ebSAdit Ranadive 	u32 max_qp;
22729c8d9ebSAdit Ranadive 	u32 max_qp_wr;
22829c8d9ebSAdit Ranadive 	u32 device_cap_flags;
22929c8d9ebSAdit Ranadive 	u32 max_sge;
23029c8d9ebSAdit Ranadive 	u32 max_sge_rd;
23129c8d9ebSAdit Ranadive 	u32 max_cq;
23229c8d9ebSAdit Ranadive 	u32 max_cqe;
23329c8d9ebSAdit Ranadive 	u32 max_mr;
23429c8d9ebSAdit Ranadive 	u32 max_pd;
23529c8d9ebSAdit Ranadive 	u32 max_qp_rd_atom;
23629c8d9ebSAdit Ranadive 	u32 max_ee_rd_atom;
23729c8d9ebSAdit Ranadive 	u32 max_res_rd_atom;
23829c8d9ebSAdit Ranadive 	u32 max_qp_init_rd_atom;
23929c8d9ebSAdit Ranadive 	u32 max_ee_init_rd_atom;
24029c8d9ebSAdit Ranadive 	u32 max_ee;
24129c8d9ebSAdit Ranadive 	u32 max_rdd;
24229c8d9ebSAdit Ranadive 	u32 max_mw;
24329c8d9ebSAdit Ranadive 	u32 max_raw_ipv6_qp;
24429c8d9ebSAdit Ranadive 	u32 max_raw_ethy_qp;
24529c8d9ebSAdit Ranadive 	u32 max_mcast_grp;
24629c8d9ebSAdit Ranadive 	u32 max_mcast_qp_attach;
24729c8d9ebSAdit Ranadive 	u32 max_total_mcast_qp_attach;
24829c8d9ebSAdit Ranadive 	u32 max_ah;
24929c8d9ebSAdit Ranadive 	u32 max_fmr;
25029c8d9ebSAdit Ranadive 	u32 max_map_per_fmr;
25129c8d9ebSAdit Ranadive 	u32 max_srq;
25229c8d9ebSAdit Ranadive 	u32 max_srq_wr;
25329c8d9ebSAdit Ranadive 	u32 max_srq_sge;
25429c8d9ebSAdit Ranadive 	u32 max_uar;
25529c8d9ebSAdit Ranadive 	u32 gid_tbl_len;
25629c8d9ebSAdit Ranadive 	u16 max_pkeys;
25729c8d9ebSAdit Ranadive 	u8  local_ca_ack_delay;
25829c8d9ebSAdit Ranadive 	u8  phys_port_cnt;
25929c8d9ebSAdit Ranadive 	u8  mode;				/* PVRDMA_DEVICE_MODE_ */
26029c8d9ebSAdit Ranadive 	u8  atomic_ops;				/* PVRDMA_ATOMIC_OP_* bits */
26129c8d9ebSAdit Ranadive 	u8  bmme_flags;				/* FRWR Mem Mgmt Extensions */
26229c8d9ebSAdit Ranadive 	u8  gid_types;				/* PVRDMA_GID_TYPE_FLAG_ */
263a31a2a3bSAdit Ranadive 	u32 max_fast_reg_page_list_len;
26429c8d9ebSAdit Ranadive };
26529c8d9ebSAdit Ranadive 
26629c8d9ebSAdit Ranadive struct pvrdma_ring_page_info {
26729c8d9ebSAdit Ranadive 	u32 num_pages;				/* Num pages incl. header. */
26829c8d9ebSAdit Ranadive 	u32 reserved;				/* Reserved. */
26929c8d9ebSAdit Ranadive 	u64 pdir_dma;				/* Page directory PA. */
27029c8d9ebSAdit Ranadive };
27129c8d9ebSAdit Ranadive 
27229c8d9ebSAdit Ranadive #pragma pack(push, 1)
27329c8d9ebSAdit Ranadive 
27429c8d9ebSAdit Ranadive struct pvrdma_device_shared_region {
27529c8d9ebSAdit Ranadive 	u32 driver_version;			/* W: Driver version. */
27629c8d9ebSAdit Ranadive 	u32 pad;				/* Pad to 8-byte align. */
27729c8d9ebSAdit Ranadive 	struct pvrdma_gos_info gos_info;	/* W: Guest OS information. */
27829c8d9ebSAdit Ranadive 	u64 cmd_slot_dma;			/* W: Command slot address. */
27929c8d9ebSAdit Ranadive 	u64 resp_slot_dma;			/* W: Response slot address. */
28029c8d9ebSAdit Ranadive 	struct pvrdma_ring_page_info async_ring_pages;
28129c8d9ebSAdit Ranadive 						/* W: Async ring page info. */
28229c8d9ebSAdit Ranadive 	struct pvrdma_ring_page_info cq_ring_pages;
28329c8d9ebSAdit Ranadive 						/* W: CQ ring page info. */
2848aa04ad3SAdit Ranadive 	union {
28529c8d9ebSAdit Ranadive 		u32 uar_pfn;			/* W: UAR pageframe. */
2868aa04ad3SAdit Ranadive 		u64 uar_pfn64;			/* W: 64-bit UAR page frame. */
2878aa04ad3SAdit Ranadive 	};
28829c8d9ebSAdit Ranadive 	struct pvrdma_device_caps caps;		/* R: Device capabilities. */
28929c8d9ebSAdit Ranadive };
29029c8d9ebSAdit Ranadive 
29129c8d9ebSAdit Ranadive #pragma pack(pop)
29229c8d9ebSAdit Ranadive 
29329c8d9ebSAdit Ranadive /* Event types. Currently a 1:1 mapping with enum ib_event. */
29429c8d9ebSAdit Ranadive enum pvrdma_eqe_type {
29529c8d9ebSAdit Ranadive 	PVRDMA_EVENT_CQ_ERR,
29629c8d9ebSAdit Ranadive 	PVRDMA_EVENT_QP_FATAL,
29729c8d9ebSAdit Ranadive 	PVRDMA_EVENT_QP_REQ_ERR,
29829c8d9ebSAdit Ranadive 	PVRDMA_EVENT_QP_ACCESS_ERR,
29929c8d9ebSAdit Ranadive 	PVRDMA_EVENT_COMM_EST,
30029c8d9ebSAdit Ranadive 	PVRDMA_EVENT_SQ_DRAINED,
30129c8d9ebSAdit Ranadive 	PVRDMA_EVENT_PATH_MIG,
30229c8d9ebSAdit Ranadive 	PVRDMA_EVENT_PATH_MIG_ERR,
30329c8d9ebSAdit Ranadive 	PVRDMA_EVENT_DEVICE_FATAL,
30429c8d9ebSAdit Ranadive 	PVRDMA_EVENT_PORT_ACTIVE,
30529c8d9ebSAdit Ranadive 	PVRDMA_EVENT_PORT_ERR,
30629c8d9ebSAdit Ranadive 	PVRDMA_EVENT_LID_CHANGE,
30729c8d9ebSAdit Ranadive 	PVRDMA_EVENT_PKEY_CHANGE,
30829c8d9ebSAdit Ranadive 	PVRDMA_EVENT_SM_CHANGE,
30929c8d9ebSAdit Ranadive 	PVRDMA_EVENT_SRQ_ERR,
31029c8d9ebSAdit Ranadive 	PVRDMA_EVENT_SRQ_LIMIT_REACHED,
31129c8d9ebSAdit Ranadive 	PVRDMA_EVENT_QP_LAST_WQE_REACHED,
31229c8d9ebSAdit Ranadive 	PVRDMA_EVENT_CLIENT_REREGISTER,
31329c8d9ebSAdit Ranadive 	PVRDMA_EVENT_GID_CHANGE,
31429c8d9ebSAdit Ranadive };
31529c8d9ebSAdit Ranadive 
31629c8d9ebSAdit Ranadive /* Event queue element. */
31729c8d9ebSAdit Ranadive struct pvrdma_eqe {
31829c8d9ebSAdit Ranadive 	u32 type;	/* Event type. */
31929c8d9ebSAdit Ranadive 	u32 info;	/* Handle, other. */
32029c8d9ebSAdit Ranadive };
32129c8d9ebSAdit Ranadive 
32229c8d9ebSAdit Ranadive /* CQ notification queue element. */
32329c8d9ebSAdit Ranadive struct pvrdma_cqne {
32429c8d9ebSAdit Ranadive 	u32 info;	/* Handle */
32529c8d9ebSAdit Ranadive };
32629c8d9ebSAdit Ranadive 
32729c8d9ebSAdit Ranadive enum {
32829c8d9ebSAdit Ranadive 	PVRDMA_CMD_FIRST,
32929c8d9ebSAdit Ranadive 	PVRDMA_CMD_QUERY_PORT = PVRDMA_CMD_FIRST,
33029c8d9ebSAdit Ranadive 	PVRDMA_CMD_QUERY_PKEY,
33129c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_PD,
33229c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_PD,
33329c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_MR,
33429c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_MR,
33529c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_CQ,
33629c8d9ebSAdit Ranadive 	PVRDMA_CMD_RESIZE_CQ,
33729c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_CQ,
33829c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_QP,
33929c8d9ebSAdit Ranadive 	PVRDMA_CMD_MODIFY_QP,
34029c8d9ebSAdit Ranadive 	PVRDMA_CMD_QUERY_QP,
34129c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_QP,
34229c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_UC,
34329c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_UC,
34429c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_BIND,
34529c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_BIND,
3468b10ba78SBryan Tan 	PVRDMA_CMD_CREATE_SRQ,
3478b10ba78SBryan Tan 	PVRDMA_CMD_MODIFY_SRQ,
3488b10ba78SBryan Tan 	PVRDMA_CMD_QUERY_SRQ,
3498b10ba78SBryan Tan 	PVRDMA_CMD_DESTROY_SRQ,
35029c8d9ebSAdit Ranadive 	PVRDMA_CMD_MAX,
35129c8d9ebSAdit Ranadive };
35229c8d9ebSAdit Ranadive 
35329c8d9ebSAdit Ranadive enum {
35429c8d9ebSAdit Ranadive 	PVRDMA_CMD_FIRST_RESP = (1 << 31),
35529c8d9ebSAdit Ranadive 	PVRDMA_CMD_QUERY_PORT_RESP = PVRDMA_CMD_FIRST_RESP,
35629c8d9ebSAdit Ranadive 	PVRDMA_CMD_QUERY_PKEY_RESP,
35729c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_PD_RESP,
35829c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_PD_RESP_NOOP,
35929c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_MR_RESP,
36029c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_MR_RESP_NOOP,
36129c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_CQ_RESP,
36229c8d9ebSAdit Ranadive 	PVRDMA_CMD_RESIZE_CQ_RESP,
36329c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_CQ_RESP_NOOP,
36429c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_QP_RESP,
36529c8d9ebSAdit Ranadive 	PVRDMA_CMD_MODIFY_QP_RESP,
36629c8d9ebSAdit Ranadive 	PVRDMA_CMD_QUERY_QP_RESP,
36729c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_QP_RESP,
36829c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_UC_RESP,
36929c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_UC_RESP_NOOP,
37029c8d9ebSAdit Ranadive 	PVRDMA_CMD_CREATE_BIND_RESP_NOOP,
37129c8d9ebSAdit Ranadive 	PVRDMA_CMD_DESTROY_BIND_RESP_NOOP,
3728b10ba78SBryan Tan 	PVRDMA_CMD_CREATE_SRQ_RESP,
3738b10ba78SBryan Tan 	PVRDMA_CMD_MODIFY_SRQ_RESP,
3748b10ba78SBryan Tan 	PVRDMA_CMD_QUERY_SRQ_RESP,
3758b10ba78SBryan Tan 	PVRDMA_CMD_DESTROY_SRQ_RESP,
37629c8d9ebSAdit Ranadive 	PVRDMA_CMD_MAX_RESP,
37729c8d9ebSAdit Ranadive };
37829c8d9ebSAdit Ranadive 
37929c8d9ebSAdit Ranadive struct pvrdma_cmd_hdr {
38029c8d9ebSAdit Ranadive 	u64 response;		/* Key for response lookup. */
38129c8d9ebSAdit Ranadive 	u32 cmd;		/* PVRDMA_CMD_ */
38229c8d9ebSAdit Ranadive 	u32 reserved;		/* Reserved. */
38329c8d9ebSAdit Ranadive };
38429c8d9ebSAdit Ranadive 
38529c8d9ebSAdit Ranadive struct pvrdma_cmd_resp_hdr {
38629c8d9ebSAdit Ranadive 	u64 response;		/* From cmd hdr. */
38729c8d9ebSAdit Ranadive 	u32 ack;		/* PVRDMA_CMD_XXX_RESP */
38829c8d9ebSAdit Ranadive 	u8 err;			/* Error. */
38929c8d9ebSAdit Ranadive 	u8 reserved[3];		/* Reserved. */
39029c8d9ebSAdit Ranadive };
39129c8d9ebSAdit Ranadive 
39229c8d9ebSAdit Ranadive struct pvrdma_cmd_query_port {
39329c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
39429c8d9ebSAdit Ranadive 	u8 port_num;
39529c8d9ebSAdit Ranadive 	u8 reserved[7];
39629c8d9ebSAdit Ranadive };
39729c8d9ebSAdit Ranadive 
39829c8d9ebSAdit Ranadive struct pvrdma_cmd_query_port_resp {
39929c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
40029c8d9ebSAdit Ranadive 	struct pvrdma_port_attr attrs;
40129c8d9ebSAdit Ranadive };
40229c8d9ebSAdit Ranadive 
40329c8d9ebSAdit Ranadive struct pvrdma_cmd_query_pkey {
40429c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
40529c8d9ebSAdit Ranadive 	u8 port_num;
40629c8d9ebSAdit Ranadive 	u8 index;
40729c8d9ebSAdit Ranadive 	u8 reserved[6];
40829c8d9ebSAdit Ranadive };
40929c8d9ebSAdit Ranadive 
41029c8d9ebSAdit Ranadive struct pvrdma_cmd_query_pkey_resp {
41129c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
41229c8d9ebSAdit Ranadive 	u16 pkey;
41329c8d9ebSAdit Ranadive 	u8 reserved[6];
41429c8d9ebSAdit Ranadive };
41529c8d9ebSAdit Ranadive 
41629c8d9ebSAdit Ranadive struct pvrdma_cmd_create_uc {
41729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
4188aa04ad3SAdit Ranadive 	union {
41929c8d9ebSAdit Ranadive 		u32 pfn; /* UAR page frame number */
4208aa04ad3SAdit Ranadive 		u64 pfn64; /* 64-bit UAR page frame number */
4218aa04ad3SAdit Ranadive 	};
42229c8d9ebSAdit Ranadive };
42329c8d9ebSAdit Ranadive 
42429c8d9ebSAdit Ranadive struct pvrdma_cmd_create_uc_resp {
42529c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
42629c8d9ebSAdit Ranadive 	u32 ctx_handle;
42729c8d9ebSAdit Ranadive 	u8 reserved[4];
42829c8d9ebSAdit Ranadive };
42929c8d9ebSAdit Ranadive 
43029c8d9ebSAdit Ranadive struct pvrdma_cmd_destroy_uc {
43129c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
43229c8d9ebSAdit Ranadive 	u32 ctx_handle;
43329c8d9ebSAdit Ranadive 	u8 reserved[4];
43429c8d9ebSAdit Ranadive };
43529c8d9ebSAdit Ranadive 
43629c8d9ebSAdit Ranadive struct pvrdma_cmd_create_pd {
43729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
43829c8d9ebSAdit Ranadive 	u32 ctx_handle;
43929c8d9ebSAdit Ranadive 	u8 reserved[4];
44029c8d9ebSAdit Ranadive };
44129c8d9ebSAdit Ranadive 
44229c8d9ebSAdit Ranadive struct pvrdma_cmd_create_pd_resp {
44329c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
44429c8d9ebSAdit Ranadive 	u32 pd_handle;
44529c8d9ebSAdit Ranadive 	u8 reserved[4];
44629c8d9ebSAdit Ranadive };
44729c8d9ebSAdit Ranadive 
44829c8d9ebSAdit Ranadive struct pvrdma_cmd_destroy_pd {
44929c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
45029c8d9ebSAdit Ranadive 	u32 pd_handle;
45129c8d9ebSAdit Ranadive 	u8 reserved[4];
45229c8d9ebSAdit Ranadive };
45329c8d9ebSAdit Ranadive 
45429c8d9ebSAdit Ranadive struct pvrdma_cmd_create_mr {
45529c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
45629c8d9ebSAdit Ranadive 	u64 start;
45729c8d9ebSAdit Ranadive 	u64 length;
45829c8d9ebSAdit Ranadive 	u64 pdir_dma;
45929c8d9ebSAdit Ranadive 	u32 pd_handle;
46029c8d9ebSAdit Ranadive 	u32 access_flags;
46129c8d9ebSAdit Ranadive 	u32 flags;
46229c8d9ebSAdit Ranadive 	u32 nchunks;
46329c8d9ebSAdit Ranadive };
46429c8d9ebSAdit Ranadive 
46529c8d9ebSAdit Ranadive struct pvrdma_cmd_create_mr_resp {
46629c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
46729c8d9ebSAdit Ranadive 	u32 mr_handle;
46829c8d9ebSAdit Ranadive 	u32 lkey;
46929c8d9ebSAdit Ranadive 	u32 rkey;
47029c8d9ebSAdit Ranadive 	u8 reserved[4];
47129c8d9ebSAdit Ranadive };
47229c8d9ebSAdit Ranadive 
47329c8d9ebSAdit Ranadive struct pvrdma_cmd_destroy_mr {
47429c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
47529c8d9ebSAdit Ranadive 	u32 mr_handle;
47629c8d9ebSAdit Ranadive 	u8 reserved[4];
47729c8d9ebSAdit Ranadive };
47829c8d9ebSAdit Ranadive 
47929c8d9ebSAdit Ranadive struct pvrdma_cmd_create_cq {
48029c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
48129c8d9ebSAdit Ranadive 	u64 pdir_dma;
48229c8d9ebSAdit Ranadive 	u32 ctx_handle;
48329c8d9ebSAdit Ranadive 	u32 cqe;
48429c8d9ebSAdit Ranadive 	u32 nchunks;
48529c8d9ebSAdit Ranadive 	u8 reserved[4];
48629c8d9ebSAdit Ranadive };
48729c8d9ebSAdit Ranadive 
48829c8d9ebSAdit Ranadive struct pvrdma_cmd_create_cq_resp {
48929c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
49029c8d9ebSAdit Ranadive 	u32 cq_handle;
49129c8d9ebSAdit Ranadive 	u32 cqe;
49229c8d9ebSAdit Ranadive };
49329c8d9ebSAdit Ranadive 
49429c8d9ebSAdit Ranadive struct pvrdma_cmd_resize_cq {
49529c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
49629c8d9ebSAdit Ranadive 	u32 cq_handle;
49729c8d9ebSAdit Ranadive 	u32 cqe;
49829c8d9ebSAdit Ranadive };
49929c8d9ebSAdit Ranadive 
50029c8d9ebSAdit Ranadive struct pvrdma_cmd_resize_cq_resp {
50129c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
50229c8d9ebSAdit Ranadive 	u32 cqe;
50329c8d9ebSAdit Ranadive 	u8 reserved[4];
50429c8d9ebSAdit Ranadive };
50529c8d9ebSAdit Ranadive 
50629c8d9ebSAdit Ranadive struct pvrdma_cmd_destroy_cq {
50729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
50829c8d9ebSAdit Ranadive 	u32 cq_handle;
50929c8d9ebSAdit Ranadive 	u8 reserved[4];
51029c8d9ebSAdit Ranadive };
51129c8d9ebSAdit Ranadive 
5128b10ba78SBryan Tan struct pvrdma_cmd_create_srq {
5138b10ba78SBryan Tan 	struct pvrdma_cmd_hdr hdr;
5148b10ba78SBryan Tan 	u64 pdir_dma;
5158b10ba78SBryan Tan 	u32 pd_handle;
5168b10ba78SBryan Tan 	u32 nchunks;
5178b10ba78SBryan Tan 	struct pvrdma_srq_attr attrs;
5188b10ba78SBryan Tan 	u8 srq_type;
5198b10ba78SBryan Tan 	u8 reserved[7];
5208b10ba78SBryan Tan };
5218b10ba78SBryan Tan 
5228b10ba78SBryan Tan struct pvrdma_cmd_create_srq_resp {
5238b10ba78SBryan Tan 	struct pvrdma_cmd_resp_hdr hdr;
5248b10ba78SBryan Tan 	u32 srqn;
5258b10ba78SBryan Tan 	u8 reserved[4];
5268b10ba78SBryan Tan };
5278b10ba78SBryan Tan 
5288b10ba78SBryan Tan struct pvrdma_cmd_modify_srq {
5298b10ba78SBryan Tan 	struct pvrdma_cmd_hdr hdr;
5308b10ba78SBryan Tan 	u32 srq_handle;
5318b10ba78SBryan Tan 	u32 attr_mask;
5328b10ba78SBryan Tan 	struct pvrdma_srq_attr attrs;
5338b10ba78SBryan Tan };
5348b10ba78SBryan Tan 
5358b10ba78SBryan Tan struct pvrdma_cmd_query_srq {
5368b10ba78SBryan Tan 	struct pvrdma_cmd_hdr hdr;
5378b10ba78SBryan Tan 	u32 srq_handle;
5388b10ba78SBryan Tan 	u8 reserved[4];
5398b10ba78SBryan Tan };
5408b10ba78SBryan Tan 
5418b10ba78SBryan Tan struct pvrdma_cmd_query_srq_resp {
5428b10ba78SBryan Tan 	struct pvrdma_cmd_resp_hdr hdr;
5438b10ba78SBryan Tan 	struct pvrdma_srq_attr attrs;
5448b10ba78SBryan Tan };
5458b10ba78SBryan Tan 
5468b10ba78SBryan Tan struct pvrdma_cmd_destroy_srq {
5478b10ba78SBryan Tan 	struct pvrdma_cmd_hdr hdr;
5488b10ba78SBryan Tan 	u32 srq_handle;
5498b10ba78SBryan Tan 	u8 reserved[4];
5508b10ba78SBryan Tan };
5518b10ba78SBryan Tan 
55229c8d9ebSAdit Ranadive struct pvrdma_cmd_create_qp {
55329c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
55429c8d9ebSAdit Ranadive 	u64 pdir_dma;
55529c8d9ebSAdit Ranadive 	u32 pd_handle;
55629c8d9ebSAdit Ranadive 	u32 send_cq_handle;
55729c8d9ebSAdit Ranadive 	u32 recv_cq_handle;
55829c8d9ebSAdit Ranadive 	u32 srq_handle;
55929c8d9ebSAdit Ranadive 	u32 max_send_wr;
56029c8d9ebSAdit Ranadive 	u32 max_recv_wr;
56129c8d9ebSAdit Ranadive 	u32 max_send_sge;
56229c8d9ebSAdit Ranadive 	u32 max_recv_sge;
56329c8d9ebSAdit Ranadive 	u32 max_inline_data;
56429c8d9ebSAdit Ranadive 	u32 lkey;
56529c8d9ebSAdit Ranadive 	u32 access_flags;
56629c8d9ebSAdit Ranadive 	u16 total_chunks;
56729c8d9ebSAdit Ranadive 	u16 send_chunks;
56829c8d9ebSAdit Ranadive 	u16 max_atomic_arg;
56929c8d9ebSAdit Ranadive 	u8 sq_sig_all;
57029c8d9ebSAdit Ranadive 	u8 qp_type;
57129c8d9ebSAdit Ranadive 	u8 is_srq;
57229c8d9ebSAdit Ranadive 	u8 reserved[3];
57329c8d9ebSAdit Ranadive };
57429c8d9ebSAdit Ranadive 
57529c8d9ebSAdit Ranadive struct pvrdma_cmd_create_qp_resp {
57629c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
57729c8d9ebSAdit Ranadive 	u32 qpn;
57829c8d9ebSAdit Ranadive 	u32 max_send_wr;
57929c8d9ebSAdit Ranadive 	u32 max_recv_wr;
58029c8d9ebSAdit Ranadive 	u32 max_send_sge;
58129c8d9ebSAdit Ranadive 	u32 max_recv_sge;
58229c8d9ebSAdit Ranadive 	u32 max_inline_data;
58329c8d9ebSAdit Ranadive };
58429c8d9ebSAdit Ranadive 
585*a52dc3a1SBryan Tan struct pvrdma_cmd_create_qp_resp_v2 {
586*a52dc3a1SBryan Tan 	struct pvrdma_cmd_resp_hdr hdr;
587*a52dc3a1SBryan Tan 	u32 qpn;
588*a52dc3a1SBryan Tan 	u32 qp_handle;
589*a52dc3a1SBryan Tan 	u32 max_send_wr;
590*a52dc3a1SBryan Tan 	u32 max_recv_wr;
591*a52dc3a1SBryan Tan 	u32 max_send_sge;
592*a52dc3a1SBryan Tan 	u32 max_recv_sge;
593*a52dc3a1SBryan Tan 	u32 max_inline_data;
594*a52dc3a1SBryan Tan };
595*a52dc3a1SBryan Tan 
59629c8d9ebSAdit Ranadive struct pvrdma_cmd_modify_qp {
59729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
59829c8d9ebSAdit Ranadive 	u32 qp_handle;
59929c8d9ebSAdit Ranadive 	u32 attr_mask;
60029c8d9ebSAdit Ranadive 	struct pvrdma_qp_attr attrs;
60129c8d9ebSAdit Ranadive };
60229c8d9ebSAdit Ranadive 
60329c8d9ebSAdit Ranadive struct pvrdma_cmd_query_qp {
60429c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
60529c8d9ebSAdit Ranadive 	u32 qp_handle;
60629c8d9ebSAdit Ranadive 	u32 attr_mask;
60729c8d9ebSAdit Ranadive };
60829c8d9ebSAdit Ranadive 
60929c8d9ebSAdit Ranadive struct pvrdma_cmd_query_qp_resp {
61029c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
61129c8d9ebSAdit Ranadive 	struct pvrdma_qp_attr attrs;
61229c8d9ebSAdit Ranadive };
61329c8d9ebSAdit Ranadive 
61429c8d9ebSAdit Ranadive struct pvrdma_cmd_destroy_qp {
61529c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
61629c8d9ebSAdit Ranadive 	u32 qp_handle;
61729c8d9ebSAdit Ranadive 	u8 reserved[4];
61829c8d9ebSAdit Ranadive };
61929c8d9ebSAdit Ranadive 
62029c8d9ebSAdit Ranadive struct pvrdma_cmd_destroy_qp_resp {
62129c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
62229c8d9ebSAdit Ranadive 	u32 events_reported;
62329c8d9ebSAdit Ranadive 	u8 reserved[4];
62429c8d9ebSAdit Ranadive };
62529c8d9ebSAdit Ranadive 
62629c8d9ebSAdit Ranadive struct pvrdma_cmd_create_bind {
62729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
62829c8d9ebSAdit Ranadive 	u32 mtu;
62929c8d9ebSAdit Ranadive 	u32 vlan;
63029c8d9ebSAdit Ranadive 	u32 index;
63129c8d9ebSAdit Ranadive 	u8 new_gid[16];
63229c8d9ebSAdit Ranadive 	u8 gid_type;
63329c8d9ebSAdit Ranadive 	u8 reserved[3];
63429c8d9ebSAdit Ranadive };
63529c8d9ebSAdit Ranadive 
63629c8d9ebSAdit Ranadive struct pvrdma_cmd_destroy_bind {
63729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
63829c8d9ebSAdit Ranadive 	u32 index;
63929c8d9ebSAdit Ranadive 	u8 dest_gid[16];
64029c8d9ebSAdit Ranadive 	u8 reserved[4];
64129c8d9ebSAdit Ranadive };
64229c8d9ebSAdit Ranadive 
64329c8d9ebSAdit Ranadive union pvrdma_cmd_req {
64429c8d9ebSAdit Ranadive 	struct pvrdma_cmd_hdr hdr;
64529c8d9ebSAdit Ranadive 	struct pvrdma_cmd_query_port query_port;
64629c8d9ebSAdit Ranadive 	struct pvrdma_cmd_query_pkey query_pkey;
64729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_uc create_uc;
64829c8d9ebSAdit Ranadive 	struct pvrdma_cmd_destroy_uc destroy_uc;
64929c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_pd create_pd;
65029c8d9ebSAdit Ranadive 	struct pvrdma_cmd_destroy_pd destroy_pd;
65129c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_mr create_mr;
65229c8d9ebSAdit Ranadive 	struct pvrdma_cmd_destroy_mr destroy_mr;
65329c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_cq create_cq;
65429c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resize_cq resize_cq;
65529c8d9ebSAdit Ranadive 	struct pvrdma_cmd_destroy_cq destroy_cq;
65629c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_qp create_qp;
65729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_modify_qp modify_qp;
65829c8d9ebSAdit Ranadive 	struct pvrdma_cmd_query_qp query_qp;
65929c8d9ebSAdit Ranadive 	struct pvrdma_cmd_destroy_qp destroy_qp;
66029c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_bind create_bind;
66129c8d9ebSAdit Ranadive 	struct pvrdma_cmd_destroy_bind destroy_bind;
6628b10ba78SBryan Tan 	struct pvrdma_cmd_create_srq create_srq;
6638b10ba78SBryan Tan 	struct pvrdma_cmd_modify_srq modify_srq;
6648b10ba78SBryan Tan 	struct pvrdma_cmd_query_srq query_srq;
6658b10ba78SBryan Tan 	struct pvrdma_cmd_destroy_srq destroy_srq;
66629c8d9ebSAdit Ranadive };
66729c8d9ebSAdit Ranadive 
66829c8d9ebSAdit Ranadive union pvrdma_cmd_resp {
66929c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resp_hdr hdr;
67029c8d9ebSAdit Ranadive 	struct pvrdma_cmd_query_port_resp query_port_resp;
67129c8d9ebSAdit Ranadive 	struct pvrdma_cmd_query_pkey_resp query_pkey_resp;
67229c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_uc_resp create_uc_resp;
67329c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_pd_resp create_pd_resp;
67429c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_mr_resp create_mr_resp;
67529c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_cq_resp create_cq_resp;
67629c8d9ebSAdit Ranadive 	struct pvrdma_cmd_resize_cq_resp resize_cq_resp;
67729c8d9ebSAdit Ranadive 	struct pvrdma_cmd_create_qp_resp create_qp_resp;
678*a52dc3a1SBryan Tan 	struct pvrdma_cmd_create_qp_resp_v2 create_qp_resp_v2;
67929c8d9ebSAdit Ranadive 	struct pvrdma_cmd_query_qp_resp query_qp_resp;
68029c8d9ebSAdit Ranadive 	struct pvrdma_cmd_destroy_qp_resp destroy_qp_resp;
6818b10ba78SBryan Tan 	struct pvrdma_cmd_create_srq_resp create_srq_resp;
6828b10ba78SBryan Tan 	struct pvrdma_cmd_query_srq_resp query_srq_resp;
68329c8d9ebSAdit Ranadive };
68429c8d9ebSAdit Ranadive 
68529c8d9ebSAdit Ranadive #endif /* __PVRDMA_DEV_API_H__ */
686