diff mbox

[v3,02/15] IB/pvrdma: Add virtual device RDMA structures

Message ID 1470266864-16888-3-git-send-email-aditr@vmware.com (mailing list archive)
State Superseded
Headers show

Commit Message

Adit Ranadive Aug. 3, 2016, 11:27 p.m. UTC
This patch adds the various Verbs structures that we support in the
virtual RDMA device. We have re-mapped the ones from the RDMA core stack
to make sure we can maintain compatibility with our backend.

Changes v2->v3:
 - Added , to end of enums missing them.

Reviewed-by: Jorgen Hansen <jhansen@vmware.com>
Reviewed-by: George Zhang <georgezhang@vmware.com>
Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
Reviewed-by: Bryan Tan <bryantan@vmware.com>
Signed-off-by: Adit Ranadive <aditr@vmware.com>
---
 drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h | 450 +++++++++++++++++++++++++
 1 file changed, 450 insertions(+)
 create mode 100644 drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h

Comments

Yuval Shaia Aug. 21, 2016, 11:54 a.m. UTC | #1
On Wed, Aug 03, 2016 at 04:27:31PM -0700, Adit Ranadive wrote:
> This patch adds the various Verbs structures that we support in the
> virtual RDMA device. We have re-mapped the ones from the RDMA core stack
> to make sure we can maintain compatibility with our backend.
> 
> Changes v2->v3:
>  - Added , to end of enums missing them.
> 
> Reviewed-by: Jorgen Hansen <jhansen@vmware.com>
> Reviewed-by: George Zhang <georgezhang@vmware.com>
> Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
> Reviewed-by: Bryan Tan <bryantan@vmware.com>
> Signed-off-by: Adit Ranadive <aditr@vmware.com>
> ---
>  drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h | 450 +++++++++++++++++++++++++
>  1 file changed, 450 insertions(+)
>  create mode 100644 drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> 
> diff --git a/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> new file mode 100644
> index 0000000..4bef8b4
> --- /dev/null
> +++ b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> @@ -0,0 +1,450 @@
> +/*
> + * [PLEASE NOTE:  VMWARE, INC. ELECTS TO USE AND DISTRIBUTE THIS COMPONENT
> + * UNDER THE TERMS OF THE OpenIB.org BSD license.  THE ORIGINAL LICENSE TERMS
> + * ARE REPRODUCED BELOW ONLY AS A REFERENCE.]
> + *
> + * Copyright (c) 2004 Mellanox Technologies Ltd.  All rights reserved.
> + * Copyright (c) 2004 Infinicon Corporation.  All rights reserved.
> + * Copyright (c) 2004 Intel Corporation.  All rights reserved.
> + * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
> + * Copyright (c) 2004 Voltaire Corporation.  All rights reserved.
> + * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
> + * Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
> + * Copyright (c) 2015-2016 VMware, Inc.  All rights reserved.
> + *
> + * This software is available to you under a choice of one of two
> + * licenses.  You may choose to be licensed under the terms of the GNU
> + * General Public License (GPL) Version 2, available from the file
> + * COPYING in the main directory of this source tree, or the
> + * OpenIB.org BSD license below:
> + *
> + *     Redistribution and use in source and binary forms, with or
> + *     without modification, are permitted provided that the following
> + *     conditions are met:
> + *
> + *      - Redistributions of source code must retain the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer.
> + *
> + *      - Redistributions in binary form must reproduce the above
> + *        copyright notice, this list of conditions and the following
> + *        disclaimer in the documentation and/or other materials
> + *        provided with the distribution.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> + * SOFTWARE.
> + */
> +
> +#ifndef __PVRDMA_IB_VERBS_H__
> +#define __PVRDMA_IB_VERBS_H__
> +
> +#include <linux/types.h>
> +
> +union pvrdma_gid {
> +	__u8	raw[16];
> +	struct {
> +		__be64	subnet_prefix;
> +		__be64	interface_id;
> +	} global;
> +};

Any reason why not to use ib_gid?
Suggesting to utilize definitions from rdma/ib_verbs.h as much as you can.

> +
> +enum pvrdma_link_layer {
> +	PVRDMA_LINK_LAYER_UNSPECIFIED,
> +	PVRDMA_LINK_LAYER_INFINIBAND,
> +	PVRDMA_LINK_LAYER_ETHERNET,
> +};
> +
> +enum pvrdma_mtu {
> +	PVRDMA_MTU_256  = 1,
> +	PVRDMA_MTU_512  = 2,
> +	PVRDMA_MTU_1024 = 3,
> +	PVRDMA_MTU_2048 = 4,
> +	PVRDMA_MTU_4096 = 5,
> +};
> +
> +static inline int pvrdma_mtu_enum_to_int(enum pvrdma_mtu mtu)
> +{
> +	switch (mtu) {
> +	case PVRDMA_MTU_256:	return  256;
> +	case PVRDMA_MTU_512:	return  512;
> +	case PVRDMA_MTU_1024:	return 1024;
> +	case PVRDMA_MTU_2048:	return 2048;
> +	case PVRDMA_MTU_4096:	return 4096;
> +	default:		return   -1;
> +	}
> +}
> +
> +static inline enum pvrdma_mtu pvrdma_mtu_int_to_enum(int mtu)
> +{
> +	switch (mtu) {
> +	case 256:	return PVRDMA_MTU_256;
> +	case 512:	return PVRDMA_MTU_512;
> +	case 1024:	return PVRDMA_MTU_1024;
> +	case 2048:	return PVRDMA_MTU_2048;
> +	case 4096:
> +	default:	return PVRDMA_MTU_4096;
> +	}
> +}
> +
> +enum pvrdma_port_state {
> +	PVRDMA_PORT_NOP			= 0,
> +	PVRDMA_PORT_DOWN		= 1,
> +	PVRDMA_PORT_INIT		= 2,
> +	PVRDMA_PORT_ARMED		= 3,
> +	PVRDMA_PORT_ACTIVE		= 4,
> +	PVRDMA_PORT_ACTIVE_DEFER	= 5,
> +};
> +
> +enum pvrdma_port_cap_flags {
> +	PVRDMA_PORT_SM				= 1 <<  1,
> +	PVRDMA_PORT_NOTICE_SUP			= 1 <<  2,
> +	PVRDMA_PORT_TRAP_SUP			= 1 <<  3,
> +	PVRDMA_PORT_OPT_IPD_SUP			= 1 <<  4,
> +	PVRDMA_PORT_AUTO_MIGR_SUP		= 1 <<  5,
> +	PVRDMA_PORT_SL_MAP_SUP			= 1 <<  6,
> +	PVRDMA_PORT_MKEY_NVRAM			= 1 <<  7,
> +	PVRDMA_PORT_PKEY_NVRAM			= 1 <<  8,
> +	PVRDMA_PORT_LED_INFO_SUP		= 1 <<  9,
> +	PVRDMA_PORT_SM_DISABLED			= 1 << 10,
> +	PVRDMA_PORT_SYS_IMAGE_GUID_SUP		= 1 << 11,
> +	PVRDMA_PORT_PKEY_SW_EXT_PORT_TRAP_SUP	= 1 << 12,
> +	PVRDMA_PORT_EXTENDED_SPEEDS_SUP		= 1 << 14,
> +	PVRDMA_PORT_CM_SUP			= 1 << 16,
> +	PVRDMA_PORT_SNMP_TUNNEL_SUP		= 1 << 17,
> +	PVRDMA_PORT_REINIT_SUP			= 1 << 18,
> +	PVRDMA_PORT_DEVICE_MGMT_SUP		= 1 << 19,
> +	PVRDMA_PORT_VENDOR_CLASS_SUP		= 1 << 20,
> +	PVRDMA_PORT_DR_NOTICE_SUP		= 1 << 21,
> +	PVRDMA_PORT_CAP_MASK_NOTICE_SUP		= 1 << 22,
> +	PVRDMA_PORT_BOOT_MGMT_SUP		= 1 << 23,
> +	PVRDMA_PORT_LINK_LATENCY_SUP		= 1 << 24,
> +	PVRDMA_PORT_CLIENT_REG_SUP		= 1 << 25,
> +	PVRDMA_PORT_IP_BASED_GIDS		= 1 << 26,
> +	PVRDMA_PORT_CAP_FLAGS_MAX		= PVRDMA_PORT_IP_BASED_GIDS,
> +};
> +
> +enum pvrdma_port_width {
> +	PVRDMA_WIDTH_1X		= 1,
> +	PVRDMA_WIDTH_4X		= 2,
> +	PVRDMA_WIDTH_8X		= 4,
> +	PVRDMA_WIDTH_12X	= 8,
> +};
> +
> +static inline int pvrdma_width_enum_to_int(enum pvrdma_port_width width)
> +{
> +	switch (width) {
> +	case PVRDMA_WIDTH_1X:	return  1;
> +	case PVRDMA_WIDTH_4X:	return  4;
> +	case PVRDMA_WIDTH_8X:	return  8;
> +	case PVRDMA_WIDTH_12X:	return 12;
> +	default:		return -1;
> +	}
> +}
> +
> +enum pvrdma_port_speed {
> +	PVRDMA_SPEED_SDR	= 1,
> +	PVRDMA_SPEED_DDR	= 2,
> +	PVRDMA_SPEED_QDR	= 4,
> +	PVRDMA_SPEED_FDR10	= 8,
> +	PVRDMA_SPEED_FDR	= 16,
> +	PVRDMA_SPEED_EDR	= 32,
> +};
> +
> +struct pvrdma_port_attr {
> +	enum pvrdma_port_state	state;
> +	enum pvrdma_mtu		max_mtu;
> +	enum pvrdma_mtu		active_mtu;
> +	__u32			gid_tbl_len;
> +	__u32			port_cap_flags;
> +	__u32			max_msg_sz;
> +	__u32			bad_pkey_cntr;
> +	__u32			qkey_viol_cntr;
> +	__u16			pkey_tbl_len;
> +	__u16			lid;
> +	__u16			sm_lid;
> +	__u8			lmc;
> +	__u8			max_vl_num;
> +	__u8			sm_sl;
> +	__u8			subnet_timeout;
> +	__u8			init_type_reply;
> +	__u8			active_width;
> +	__u8			active_speed;
> +	__u8			phys_state;
> +	__u8			reserved[2];
> +};
> +
> +struct pvrdma_global_route {
> +	union pvrdma_gid	dgid;
> +	__u32			flow_label;
> +	__u8			sgid_index;
> +	__u8			hop_limit;
> +	__u8			traffic_class;
> +	__u8			reserved;
> +};
> +
> +struct pvrdma_grh {
> +	__be32			version_tclass_flow;
> +	__be16			paylen;
> +	__u8			next_hdr;
> +	__u8			hop_limit;
> +	union pvrdma_gid	sgid;
> +	union pvrdma_gid	dgid;
> +};

Same comment as for pvrdma_gid.
(ib_grh)

> +
> +enum pvrdma_ah_flags {
> +	PVRDMA_AH_GRH = 1,
> +};

Same comment as for pvrdma_gid.
(ib_ah_flags)

> +
> +enum pvrdma_rate {
> +	PVRDMA_RATE_PORT_CURRENT	= 0,
> +	PVRDMA_RATE_2_5_GBPS		= 2,
> +	PVRDMA_RATE_5_GBPS		= 5,
> +	PVRDMA_RATE_10_GBPS		= 3,
> +	PVRDMA_RATE_20_GBPS		= 6,
> +	PVRDMA_RATE_30_GBPS		= 4,
> +	PVRDMA_RATE_40_GBPS		= 7,
> +	PVRDMA_RATE_60_GBPS		= 8,
> +	PVRDMA_RATE_80_GBPS		= 9,
> +	PVRDMA_RATE_120_GBPS		= 10,
> +	PVRDMA_RATE_14_GBPS		= 11,
> +	PVRDMA_RATE_56_GBPS		= 12,
> +	PVRDMA_RATE_112_GBPS		= 13,
> +	PVRDMA_RATE_168_GBPS		= 14,
> +	PVRDMA_RATE_25_GBPS		= 15,
> +	PVRDMA_RATE_100_GBPS		= 16,
> +	PVRDMA_RATE_200_GBPS		= 17,
> +	PVRDMA_RATE_300_GBPS		= 18,
> +};

Same comment as for pvrdma_gid.
(ib_rate)

> +
> +struct pvrdma_ah_attr {
> +	struct pvrdma_global_route	grh;
> +	__u16				dlid;
> +	__u16				vlan_id;
> +	__u8				sl;
> +	__u8				src_path_bits;
> +	__u8				static_rate;
> +	__u8				ah_flags;
> +	__u8				port_num;
> +	__u8				dmac[6];
> +	__u8				reserved;
> +};

And so on...
(ib_ah_attr)

> +
> +enum pvrdma_wc_status {
> +	PVRDMA_WC_SUCCESS,
> +	PVRDMA_WC_LOC_LEN_ERR,
> +	PVRDMA_WC_LOC_QP_OP_ERR,
> +	PVRDMA_WC_LOC_EEC_OP_ERR,
> +	PVRDMA_WC_LOC_PROT_ERR,
> +	PVRDMA_WC_WR_FLUSH_ERR,
> +	PVRDMA_WC_MW_BIND_ERR,
> +	PVRDMA_WC_BAD_RESP_ERR,
> +	PVRDMA_WC_LOC_ACCESS_ERR,
> +	PVRDMA_WC_REM_INV_REQ_ERR,
> +	PVRDMA_WC_REM_ACCESS_ERR,
> +	PVRDMA_WC_REM_OP_ERR,
> +	PVRDMA_WC_RETRY_EXC_ERR,
> +	PVRDMA_WC_RNR_RETRY_EXC_ERR,
> +	PVRDMA_WC_LOC_RDD_VIOL_ERR,
> +	PVRDMA_WC_REM_INV_RD_REQ_ERR,
> +	PVRDMA_WC_REM_ABORT_ERR,
> +	PVRDMA_WC_INV_EECN_ERR,
> +	PVRDMA_WC_INV_EEC_STATE_ERR,
> +	PVRDMA_WC_FATAL_ERR,
> +	PVRDMA_WC_RESP_TIMEOUT_ERR,
> +	PVRDMA_WC_GENERAL_ERR,
> +};
> +
> +enum pvrdma_wc_opcode {
> +	PVRDMA_WC_SEND,
> +	PVRDMA_WC_RDMA_WRITE,
> +	PVRDMA_WC_RDMA_READ,
> +	PVRDMA_WC_COMP_SWAP,
> +	PVRDMA_WC_FETCH_ADD,
> +	PVRDMA_WC_BIND_MW,
> +	PVRDMA_WC_LSO,
> +	PVRDMA_WC_LOCAL_INV,
> +	PVRDMA_WC_FAST_REG_MR,
> +	PVRDMA_WC_MASKED_COMP_SWAP,
> +	PVRDMA_WC_MASKED_FETCH_ADD,
> +	PVRDMA_WC_RECV = 1 << 7,
> +	PVRDMA_WC_RECV_RDMA_WITH_IMM,
> +};
> +
> +enum pvrdma_wc_flags {
> +	PVRDMA_WC_GRH			= 1 << 0,
> +	PVRDMA_WC_WITH_IMM		= 1 << 1,
> +	PVRDMA_WC_WITH_INVALIDATE	= 1 << 2,
> +	PVRDMA_WC_IP_CSUM_OK		= 1 << 3,
> +	PVRDMA_WC_WITH_SMAC		= 1 << 4,
> +	PVRDMA_WC_WITH_VLAN		= 1 << 5,
> +	PVRDMA_WC_FLAGS_MAX		= PVRDMA_WC_WITH_VLAN,
> +};
> +
> +enum pvrdma_cq_notify_flags {
> +	PVRDMA_CQ_SOLICITED		= 1 << 0,
> +	PVRDMA_CQ_NEXT_COMP		= 1 << 1,
> +	PVRDMA_CQ_SOLICITED_MASK	= PVRDMA_CQ_SOLICITED |
> +					  PVRDMA_CQ_NEXT_COMP,
> +	PVRDMA_CQ_REPORT_MISSED_EVENTS	= 1 << 2,
> +};
> +
> +struct pvrdma_qp_cap {
> +	__u32	max_send_wr;
> +	__u32	max_recv_wr;
> +	__u32	max_send_sge;
> +	__u32	max_recv_sge;
> +	__u32	max_inline_data;
> +	__u32	reserved;
> +};
> +
> +enum pvrdma_sig_type {
> +	PVRDMA_SIGNAL_ALL_WR,
> +	PVRDMA_SIGNAL_REQ_WR,
> +};
> +
> +enum pvrdma_qp_type {
> +	PVRDMA_QPT_SMI,
> +	PVRDMA_QPT_GSI,
> +	PVRDMA_QPT_RC,
> +	PVRDMA_QPT_UC,
> +	PVRDMA_QPT_UD,
> +	PVRDMA_QPT_RAW_IPV6,
> +	PVRDMA_QPT_RAW_ETHERTYPE,
> +	PVRDMA_QPT_RAW_PACKET = 8,
> +	PVRDMA_QPT_XRC_INI = 9,
> +	PVRDMA_QPT_XRC_TGT,
> +	PVRDMA_QPT_MAX,
> +};
> +
> +enum pvrdma_qp_create_flags {
> +	PVRDMA_QP_CREATE_IPOPVRDMA_UD_LSO		= 1 << 0,
> +	PVRDMA_QP_CREATE_BLOCK_MULTICAST_LOOPBACK	= 1 << 1,
> +};
> +
> +enum pvrdma_qp_attr_mask {
> +	PVRDMA_QP_STATE			= 1 << 0,
> +	PVRDMA_QP_CUR_STATE		= 1 << 1,
> +	PVRDMA_QP_EN_SQD_ASYNC_NOTIFY	= 1 << 2,
> +	PVRDMA_QP_ACCESS_FLAGS		= 1 << 3,
> +	PVRDMA_QP_PKEY_INDEX		= 1 << 4,
> +	PVRDMA_QP_PORT			= 1 << 5,
> +	PVRDMA_QP_QKEY			= 1 << 6,
> +	PVRDMA_QP_AV			= 1 << 7,
> +	PVRDMA_QP_PATH_MTU		= 1 << 8,
> +	PVRDMA_QP_TIMEOUT		= 1 << 9,
> +	PVRDMA_QP_RETRY_CNT		= 1 << 10,
> +	PVRDMA_QP_RNR_RETRY		= 1 << 11,
> +	PVRDMA_QP_RQ_PSN		= 1 << 12,
> +	PVRDMA_QP_MAX_QP_RD_ATOMIC	= 1 << 13,
> +	PVRDMA_QP_ALT_PATH		= 1 << 14,
> +	PVRDMA_QP_MIN_RNR_TIMER		= 1 << 15,
> +	PVRDMA_QP_SQ_PSN		= 1 << 16,
> +	PVRDMA_QP_MAX_DEST_RD_ATOMIC	= 1 << 17,
> +	PVRDMA_QP_PATH_MIG_STATE	= 1 << 18,
> +	PVRDMA_QP_CAP			= 1 << 19,
> +	PVRDMA_QP_DEST_QPN		= 1 << 20,
> +	PVRDMA_QP_ATTR_MASK_MAX		= PVRDMA_QP_DEST_QPN,
> +};
> +
> +enum pvrdma_qp_state {
> +	PVRDMA_QPS_RESET,
> +	PVRDMA_QPS_INIT,
> +	PVRDMA_QPS_RTR,
> +	PVRDMA_QPS_RTS,
> +	PVRDMA_QPS_SQD,
> +	PVRDMA_QPS_SQE,
> +	PVRDMA_QPS_ERR,
> +};
> +
> +enum pvrdma_mig_state {
> +	PVRDMA_MIG_MIGRATED,
> +	PVRDMA_MIG_REARM,
> +	PVRDMA_MIG_ARMED,
> +};
> +
> +enum pvrdma_mw_type {
> +	PVRDMA_MW_TYPE_1 = 1,
> +	PVRDMA_MW_TYPE_2 = 2,
> +};
> +
> +struct pvrdma_qp_attr {
> +	enum pvrdma_qp_state	qp_state;
> +	enum pvrdma_qp_state	cur_qp_state;
> +	enum pvrdma_mtu		path_mtu;
> +	enum pvrdma_mig_state	path_mig_state;
> +	__u32			qkey;
> +	__u32			rq_psn;
> +	__u32			sq_psn;
> +	__u32			dest_qp_num;
> +	__u32			qp_access_flags;
> +	__u16			pkey_index;
> +	__u16			alt_pkey_index;
> +	__u8			en_sqd_async_notify;
> +	__u8			sq_draining;
> +	__u8			max_rd_atomic;
> +	__u8			max_dest_rd_atomic;
> +	__u8			min_rnr_timer;
> +	__u8			port_num;
> +	__u8			timeout;
> +	__u8			retry_cnt;
> +	__u8			rnr_retry;
> +	__u8			alt_port_num;
> +	__u8			alt_timeout;
> +	__u8			reserved[5];
> +	struct pvrdma_qp_cap	cap;
> +	struct pvrdma_ah_attr	ah_attr;
> +	struct pvrdma_ah_attr	alt_ah_attr;
> +};
> +
> +enum pvrdma_wr_opcode {
> +	PVRDMA_WR_RDMA_WRITE,
> +	PVRDMA_WR_RDMA_WRITE_WITH_IMM,
> +	PVRDMA_WR_SEND,
> +	PVRDMA_WR_SEND_WITH_IMM,
> +	PVRDMA_WR_RDMA_READ,
> +	PVRDMA_WR_ATOMIC_CMP_AND_SWP,
> +	PVRDMA_WR_ATOMIC_FETCH_AND_ADD,
> +	PVRDMA_WR_LSO,
> +	PVRDMA_WR_SEND_WITH_INV,
> +	PVRDMA_WR_RDMA_READ_WITH_INV,
> +	PVRDMA_WR_LOCAL_INV,
> +	PVRDMA_WR_FAST_REG_MR,
> +	PVRDMA_WR_MASKED_ATOMIC_CMP_AND_SWP,
> +	PVRDMA_WR_MASKED_ATOMIC_FETCH_AND_ADD,
> +	PVRDMA_WR_BIND_MW,
> +	PVRDMA_WR_REG_SIG_MR,
> +};
> +
> +enum pvrdma_send_flags {
> +	PVRDMA_SEND_FENCE	= 1 << 0,
> +	PVRDMA_SEND_SIGNALED	= 1 << 1,
> +	PVRDMA_SEND_SOLICITED	= 1 << 2,
> +	PVRDMA_SEND_INLINE	= 1 << 3,
> +	PVRDMA_SEND_IP_CSUM	= 1 << 4,
> +	PVRDMA_SEND_FLAGS_MAX	= PVRDMA_SEND_IP_CSUM,
> +};
> +
> +struct pvrdma_sge {
> +	__u64	addr;
> +	__u32	length;
> +	__u32	lkey;
> +};
> +
> +enum pvrdma_access_flags {
> +	PVRDMA_ACCESS_LOCAL_WRITE	= 1 << 0,
> +	PVRDMA_ACCESS_REMOTE_WRITE	= 1 << 1,
> +	PVRDMA_ACCESS_REMOTE_READ	= 1 << 2,
> +	PVRDMA_ACCESS_REMOTE_ATOMIC	= 1 << 3,
> +	PVRDMA_ACCESS_MW_BIND		= 1 << 4,
> +	PVRDMA_ZERO_BASED		= 1 << 5,
> +	PVRDMA_ACCESS_ON_DEMAND		= 1 << 6,
> +	PVRDMA_ACCESS_FLAGS_MAX		= PVRDMA_ACCESS_ON_DEMAND,
> +};
> +
> +#endif /* __PVRDMA_IB_VERBS_H__ */
> -- 
> 2.7.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Adit Ranadive Aug. 23, 2016, 5:46 p.m. UTC | #2
On Sun, Aug 21, 2016 at 04:55:20 -0700, Yuval Shaia <yuval.shaia@oracle.com> wrote:
> On Wed, Aug 03, 2016 at 04:27:31PM -0700, Adit Ranadive wrote:
> > This patch adds the various Verbs structures that we support in the
> > virtual RDMA device. We have re-mapped the ones from the RDMA core stack
> > to make sure we can maintain compatibility with our backend.
> >
> > Changes v2->v3:
> >  - Added , to end of enums missing them.
> >
> > Reviewed-by: Jorgen Hansen <jhansen@vmware.com>
> > Reviewed-by: George Zhang <georgezhang@vmware.com>
> > Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
> > Reviewed-by: Bryan Tan <bryantan@vmware.com>
> > Signed-off-by: Adit Ranadive <aditr@vmware.com>
> > ---
> >  drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h | 450 +++++++++++++++++++++++++
> >  1 file changed, 450 insertions(+)
> >  create mode 100644 drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> >
> > diff --git a/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> > new file mode 100644
> > index 0000000..4bef8b4
> > --- /dev/null
> > +++ b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> > @@ -0,0 +1,450 @@
> > +/*
> > + * [PLEASE NOTE:  VMWARE, INC. ELECTS TO USE AND DISTRIBUTE THIS COMPONENT
> > + * UNDER THE TERMS OF THE OpenIB.org BSD license.  THE ORIGINAL LICENSE TERMS
> > + * ARE REPRODUCED BELOW ONLY AS A REFERENCE.]
> > + *
> > + * Copyright (c) 2004 Mellanox Technologies Ltd.  All rights reserved.
> > + * Copyright (c) 2004 Infinicon Corporation.  All rights reserved.
> > + * Copyright (c) 2004 Intel Corporation.  All rights reserved.
> > + * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
> > + * Copyright (c) 2004 Voltaire Corporation.  All rights reserved.
> > + * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
> > + * Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
> > + * Copyright (c) 2015-2016 VMware, Inc.  All rights reserved.
> > + *
> > + * This software is available to you under a choice of one of two
> > + * licenses.  You may choose to be licensed under the terms of the GNU
> > + * General Public License (GPL) Version 2, available from the file
> > + * COPYING in the main directory of this source tree, or the
> > + * OpenIB.org BSD license below:
> > + *
> > + *     Redistribution and use in source and binary forms, with or
> > + *     without modification, are permitted provided that the following
> > + *     conditions are met:
> > + *
> > + *      - Redistributions of source code must retain the above
> > + *        copyright notice, this list of conditions and the following
> > + *        disclaimer.
> > + *
> > + *      - Redistributions in binary form must reproduce the above
> > + *        copyright notice, this list of conditions and the following
> > + *        disclaimer in the documentation and/or other materials
> > + *        provided with the distribution.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> > + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> > + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> > + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> > + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> > + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> > + * SOFTWARE.
> > + */
> > +
> > +#ifndef __PVRDMA_IB_VERBS_H__
> > +#define __PVRDMA_IB_VERBS_H__
> > +
> > +#include <linux/types.h>
> > +
> > +union pvrdma_gid {
> > +	__u8	raw[16];
> > +	struct {
> > +		__be64	subnet_prefix;
> > +		__be64	interface_id;
> > +	} global;
> > +};
> 
> Any reason why not to use ib_gid?
> Suggesting to utilize definitions from rdma/ib_verbs.h as much as you can.

Thanks for taking a look at this! The main reason we don't re-use the IB structures here is for
compatibility reasons. We re-use these PVRDMA defined structures in our virtual device too so
we want to be consistent between the driver and the device itself. Thus, we can protect the
virtual device from any non-compatible changes in the IB structs.
Hope that clarifies the issue!

- Adit 
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Yuval Shaia Aug. 25, 2016, 6:03 a.m. UTC | #3
On Tue, Aug 23, 2016 at 05:46:27PM +0000, Adit Ranadive wrote:
> On Sun, Aug 21, 2016 at 04:55:20 -0700, Yuval Shaia <yuval.shaia@oracle.com> wrote:
> > On Wed, Aug 03, 2016 at 04:27:31PM -0700, Adit Ranadive wrote:
> > > This patch adds the various Verbs structures that we support in the
> > > virtual RDMA device. We have re-mapped the ones from the RDMA core stack
> > > to make sure we can maintain compatibility with our backend.
> > >
> > > Changes v2->v3:
> > >  - Added , to end of enums missing them.
> > >
> > > Reviewed-by: Jorgen Hansen <jhansen@vmware.com>
> > > Reviewed-by: George Zhang <georgezhang@vmware.com>
> > > Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
> > > Reviewed-by: Bryan Tan <bryantan@vmware.com>
> > > Signed-off-by: Adit Ranadive <aditr@vmware.com>
> > > ---
> > >  drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h | 450 +++++++++++++++++++++++++
> > >  1 file changed, 450 insertions(+)
> > >  create mode 100644 drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> > >
> > > diff --git a/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> > > new file mode 100644
> > > index 0000000..4bef8b4
> > > --- /dev/null
> > > +++ b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> > > @@ -0,0 +1,450 @@
> > > +/*
> > > + * [PLEASE NOTE:  VMWARE, INC. ELECTS TO USE AND DISTRIBUTE THIS COMPONENT
> > > + * UNDER THE TERMS OF THE OpenIB.org BSD license.  THE ORIGINAL LICENSE TERMS
> > > + * ARE REPRODUCED BELOW ONLY AS A REFERENCE.]
> > > + *
> > > + * Copyright (c) 2004 Mellanox Technologies Ltd.  All rights reserved.
> > > + * Copyright (c) 2004 Infinicon Corporation.  All rights reserved.
> > > + * Copyright (c) 2004 Intel Corporation.  All rights reserved.
> > > + * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
> > > + * Copyright (c) 2004 Voltaire Corporation.  All rights reserved.
> > > + * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
> > > + * Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
> > > + * Copyright (c) 2015-2016 VMware, Inc.  All rights reserved.
> > > + *
> > > + * This software is available to you under a choice of one of two
> > > + * licenses.  You may choose to be licensed under the terms of the GNU
> > > + * General Public License (GPL) Version 2, available from the file
> > > + * COPYING in the main directory of this source tree, or the
> > > + * OpenIB.org BSD license below:
> > > + *
> > > + *     Redistribution and use in source and binary forms, with or
> > > + *     without modification, are permitted provided that the following
> > > + *     conditions are met:
> > > + *
> > > + *      - Redistributions of source code must retain the above
> > > + *        copyright notice, this list of conditions and the following
> > > + *        disclaimer.
> > > + *
> > > + *      - Redistributions in binary form must reproduce the above
> > > + *        copyright notice, this list of conditions and the following
> > > + *        disclaimer in the documentation and/or other materials
> > > + *        provided with the distribution.
> > > + *
> > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> > > + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > > + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> > > + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> > > + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> > > + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> > > + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> > > + * SOFTWARE.
> > > + */
> > > +
> > > +#ifndef __PVRDMA_IB_VERBS_H__
> > > +#define __PVRDMA_IB_VERBS_H__
> > > +
> > > +#include <linux/types.h>
> > > +
> > > +union pvrdma_gid {
> > > +	__u8	raw[16];
> > > +	struct {
> > > +		__be64	subnet_prefix;
> > > +		__be64	interface_id;
> > > +	} global;
> > > +};
> > 
> > Any reason why not to use ib_gid?
> > Suggesting to utilize definitions from rdma/ib_verbs.h as much as you can.
> 
> Thanks for taking a look at this! The main reason we don't re-use the IB structures here is for
> compatibility reasons. We re-use these PVRDMA defined structures in our virtual device too so
> we want to be consistent between the driver and the device itself. Thus, we can protect the
> virtual device from any non-compatible changes in the IB structs.
> Hope that clarifies the issue!

Point is cleared.
Just want to warn for any future kernel-api inconsistency between pcrdma
driver and some other OFED module (e.x if your driver will ever want to
call ib_get_cached_gid() or something like that.

Not only "future", how about internal inconsistency with for example
pvrdma_dev.sgid_tbl.

I assume that for that you have the pvrdma_gid_to_ib() and
ib_gid_to_pvrdma() functions which enforce this "compatibility".

> 
> - Adit 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Adit Ranadive Sept. 6, 2016, 7:03 p.m. UTC | #4
On, Wed, Aug 24, 2016 at 23:04:44 -0700, Yuval Shaia wrote:
> On Tue, Aug 23, 2016 at 05:46:27PM +0000, Adit Ranadive wrote:
> > On Sun, Aug 21, 2016 at 04:55:20 -0700, Yuval Shaia <yuval.shaia@oracle.com> wrote:
> > > On Wed, Aug 03, 2016 at 04:27:31PM -0700, Adit Ranadive wrote:
> > > > This patch adds the various Verbs structures that we support in the
> > > > virtual RDMA device. We have re-mapped the ones from the RDMA core stack
> > > > to make sure we can maintain compatibility with our backend.
> > > >
> > > > Changes v2->v3:
> > > >  - Added , to end of enums missing them.
> > > >
> > > > Reviewed-by: Jorgen Hansen <jhansen@vmware.com>
> > > > Reviewed-by: George Zhang <georgezhang@vmware.com>
> > > > Reviewed-by: Aditya Sarwade <asarwade@vmware.com>
> > > > Reviewed-by: Bryan Tan <bryantan@vmware.com>
> > > > Signed-off-by: Adit Ranadive <aditr@vmware.com>
> > > > ---
> > > >  drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h | 450 +++++++++++++++++++++++++
> > > >  1 file changed, 450 insertions(+)
> > > >  create mode 100644 drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> > > >
> > > > diff --git a/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> > > > new file mode 100644
> > > > index 0000000..4bef8b4
> > > > --- /dev/null
> > > > +++ b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
> > > > @@ -0,0 +1,450 @@
> > > > +/*
> > > > + * [PLEASE NOTE:  VMWARE, INC. ELECTS TO USE AND DISTRIBUTE THIS COMPONENT
> > > > + * UNDER THE TERMS OF THE OpenIB.org BSD license.  THE ORIGINAL LICENSE TERMS
> > > > + * ARE REPRODUCED BELOW ONLY AS A REFERENCE.]
> > > > + *
> > > > + * Copyright (c) 2004 Mellanox Technologies Ltd.  All rights reserved.
> > > > + * Copyright (c) 2004 Infinicon Corporation.  All rights reserved.
> > > > + * Copyright (c) 2004 Intel Corporation.  All rights reserved.
> > > > + * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
> > > > + * Copyright (c) 2004 Voltaire Corporation.  All rights reserved.
> > > > + * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
> > > > + * Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
> > > > + * Copyright (c) 2015-2016 VMware, Inc.  All rights reserved.
> > > > + *
> > > > + * This software is available to you under a choice of one of two
> > > > + * licenses.  You may choose to be licensed under the terms of the GNU
> > > > + * General Public License (GPL) Version 2, available from the file
> > > > + * COPYING in the main directory of this source tree, or the
> > > > + * OpenIB.org BSD license below:
> > > > + *
> > > > + *     Redistribution and use in source and binary forms, with or
> > > > + *     without modification, are permitted provided that the following
> > > > + *     conditions are met:
> > > > + *
> > > > + *      - Redistributions of source code must retain the above
> > > > + *        copyright notice, this list of conditions and the following
> > > > + *        disclaimer.
> > > > + *
> > > > + *      - Redistributions in binary form must reproduce the above
> > > > + *        copyright notice, this list of conditions and the following
> > > > + *        disclaimer in the documentation and/or other materials
> > > > + *        provided with the distribution.
> > > > + *
> > > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> > > > + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > > > + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> > > > + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
> > > > + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
> > > > + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
> > > > + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> > > > + * SOFTWARE.
> > > > + */
> > > > +
> > > > +#ifndef __PVRDMA_IB_VERBS_H__
> > > > +#define __PVRDMA_IB_VERBS_H__
> > > > +
> > > > +#include <linux/types.h>
> > > > +
> > > > +union pvrdma_gid {
> > > > +	__u8	raw[16];
> > > > +	struct {
> > > > +		__be64	subnet_prefix;
> > > > +		__be64	interface_id;
> > > > +	} global;
> > > > +};
> > >
> > > Any reason why not to use ib_gid?
> > > Suggesting to utilize definitions from rdma/ib_verbs.h as much as you can.
> >
> > Thanks for taking a look at this! The main reason we don't re-use the IB structures here is for
> > compatibility reasons. We re-use these PVRDMA defined structures in our virtual device too so
> > we want to be consistent between the driver and the device itself. Thus, we can protect the
> > virtual device from any non-compatible changes in the IB structs.
> > Hope that clarifies the issue!
> 
> Point is cleared.
> Just want to warn for any future kernel-api inconsistency between pcrdma
> driver and some other OFED module (e.x if your driver will ever want to
> call ib_get_cached_gid() or something like that.
> 
> Not only "future", how about internal inconsistency with for example
> pvrdma_dev.sgid_tbl.

Since this gets populated with GIDs using OFED stack callbacks, we allocate them in the IB
GID format.

> I assume that for that you have the pvrdma_gid_to_ib() and
> ib_gid_to_pvrdma() functions which enforce this "compatibility".

Yes, that is correct.

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
new file mode 100644
index 0000000..4bef8b4
--- /dev/null
+++ b/drivers/infiniband/hw/pvrdma/pvrdma_ib_verbs.h
@@ -0,0 +1,450 @@ 
+/*
+ * [PLEASE NOTE:  VMWARE, INC. ELECTS TO USE AND DISTRIBUTE THIS COMPONENT
+ * UNDER THE TERMS OF THE OpenIB.org BSD license.  THE ORIGINAL LICENSE TERMS
+ * ARE REPRODUCED BELOW ONLY AS A REFERENCE.]
+ *
+ * Copyright (c) 2004 Mellanox Technologies Ltd.  All rights reserved.
+ * Copyright (c) 2004 Infinicon Corporation.  All rights reserved.
+ * Copyright (c) 2004 Intel Corporation.  All rights reserved.
+ * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
+ * Copyright (c) 2004 Voltaire Corporation.  All rights reserved.
+ * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
+ * Copyright (c) 2015-2016 VMware, Inc.  All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef __PVRDMA_IB_VERBS_H__
+#define __PVRDMA_IB_VERBS_H__
+
+#include <linux/types.h>
+
+union pvrdma_gid {
+	__u8	raw[16];
+	struct {
+		__be64	subnet_prefix;
+		__be64	interface_id;
+	} global;
+};
+
+enum pvrdma_link_layer {
+	PVRDMA_LINK_LAYER_UNSPECIFIED,
+	PVRDMA_LINK_LAYER_INFINIBAND,
+	PVRDMA_LINK_LAYER_ETHERNET,
+};
+
+enum pvrdma_mtu {
+	PVRDMA_MTU_256  = 1,
+	PVRDMA_MTU_512  = 2,
+	PVRDMA_MTU_1024 = 3,
+	PVRDMA_MTU_2048 = 4,
+	PVRDMA_MTU_4096 = 5,
+};
+
+static inline int pvrdma_mtu_enum_to_int(enum pvrdma_mtu mtu)
+{
+	switch (mtu) {
+	case PVRDMA_MTU_256:	return  256;
+	case PVRDMA_MTU_512:	return  512;
+	case PVRDMA_MTU_1024:	return 1024;
+	case PVRDMA_MTU_2048:	return 2048;
+	case PVRDMA_MTU_4096:	return 4096;
+	default:		return   -1;
+	}
+}
+
+static inline enum pvrdma_mtu pvrdma_mtu_int_to_enum(int mtu)
+{
+	switch (mtu) {
+	case 256:	return PVRDMA_MTU_256;
+	case 512:	return PVRDMA_MTU_512;
+	case 1024:	return PVRDMA_MTU_1024;
+	case 2048:	return PVRDMA_MTU_2048;
+	case 4096:
+	default:	return PVRDMA_MTU_4096;
+	}
+}
+
+enum pvrdma_port_state {
+	PVRDMA_PORT_NOP			= 0,
+	PVRDMA_PORT_DOWN		= 1,
+	PVRDMA_PORT_INIT		= 2,
+	PVRDMA_PORT_ARMED		= 3,
+	PVRDMA_PORT_ACTIVE		= 4,
+	PVRDMA_PORT_ACTIVE_DEFER	= 5,
+};
+
+enum pvrdma_port_cap_flags {
+	PVRDMA_PORT_SM				= 1 <<  1,
+	PVRDMA_PORT_NOTICE_SUP			= 1 <<  2,
+	PVRDMA_PORT_TRAP_SUP			= 1 <<  3,
+	PVRDMA_PORT_OPT_IPD_SUP			= 1 <<  4,
+	PVRDMA_PORT_AUTO_MIGR_SUP		= 1 <<  5,
+	PVRDMA_PORT_SL_MAP_SUP			= 1 <<  6,
+	PVRDMA_PORT_MKEY_NVRAM			= 1 <<  7,
+	PVRDMA_PORT_PKEY_NVRAM			= 1 <<  8,
+	PVRDMA_PORT_LED_INFO_SUP		= 1 <<  9,
+	PVRDMA_PORT_SM_DISABLED			= 1 << 10,
+	PVRDMA_PORT_SYS_IMAGE_GUID_SUP		= 1 << 11,
+	PVRDMA_PORT_PKEY_SW_EXT_PORT_TRAP_SUP	= 1 << 12,
+	PVRDMA_PORT_EXTENDED_SPEEDS_SUP		= 1 << 14,
+	PVRDMA_PORT_CM_SUP			= 1 << 16,
+	PVRDMA_PORT_SNMP_TUNNEL_SUP		= 1 << 17,
+	PVRDMA_PORT_REINIT_SUP			= 1 << 18,
+	PVRDMA_PORT_DEVICE_MGMT_SUP		= 1 << 19,
+	PVRDMA_PORT_VENDOR_CLASS_SUP		= 1 << 20,
+	PVRDMA_PORT_DR_NOTICE_SUP		= 1 << 21,
+	PVRDMA_PORT_CAP_MASK_NOTICE_SUP		= 1 << 22,
+	PVRDMA_PORT_BOOT_MGMT_SUP		= 1 << 23,
+	PVRDMA_PORT_LINK_LATENCY_SUP		= 1 << 24,
+	PVRDMA_PORT_CLIENT_REG_SUP		= 1 << 25,
+	PVRDMA_PORT_IP_BASED_GIDS		= 1 << 26,
+	PVRDMA_PORT_CAP_FLAGS_MAX		= PVRDMA_PORT_IP_BASED_GIDS,
+};
+
+enum pvrdma_port_width {
+	PVRDMA_WIDTH_1X		= 1,
+	PVRDMA_WIDTH_4X		= 2,
+	PVRDMA_WIDTH_8X		= 4,
+	PVRDMA_WIDTH_12X	= 8,
+};
+
+static inline int pvrdma_width_enum_to_int(enum pvrdma_port_width width)
+{
+	switch (width) {
+	case PVRDMA_WIDTH_1X:	return  1;
+	case PVRDMA_WIDTH_4X:	return  4;
+	case PVRDMA_WIDTH_8X:	return  8;
+	case PVRDMA_WIDTH_12X:	return 12;
+	default:		return -1;
+	}
+}
+
+enum pvrdma_port_speed {
+	PVRDMA_SPEED_SDR	= 1,
+	PVRDMA_SPEED_DDR	= 2,
+	PVRDMA_SPEED_QDR	= 4,
+	PVRDMA_SPEED_FDR10	= 8,
+	PVRDMA_SPEED_FDR	= 16,
+	PVRDMA_SPEED_EDR	= 32,
+};
+
+struct pvrdma_port_attr {
+	enum pvrdma_port_state	state;
+	enum pvrdma_mtu		max_mtu;
+	enum pvrdma_mtu		active_mtu;
+	__u32			gid_tbl_len;
+	__u32			port_cap_flags;
+	__u32			max_msg_sz;
+	__u32			bad_pkey_cntr;
+	__u32			qkey_viol_cntr;
+	__u16			pkey_tbl_len;
+	__u16			lid;
+	__u16			sm_lid;
+	__u8			lmc;
+	__u8			max_vl_num;
+	__u8			sm_sl;
+	__u8			subnet_timeout;
+	__u8			init_type_reply;
+	__u8			active_width;
+	__u8			active_speed;
+	__u8			phys_state;
+	__u8			reserved[2];
+};
+
+struct pvrdma_global_route {
+	union pvrdma_gid	dgid;
+	__u32			flow_label;
+	__u8			sgid_index;
+	__u8			hop_limit;
+	__u8			traffic_class;
+	__u8			reserved;
+};
+
+struct pvrdma_grh {
+	__be32			version_tclass_flow;
+	__be16			paylen;
+	__u8			next_hdr;
+	__u8			hop_limit;
+	union pvrdma_gid	sgid;
+	union pvrdma_gid	dgid;
+};
+
+enum pvrdma_ah_flags {
+	PVRDMA_AH_GRH = 1,
+};
+
+enum pvrdma_rate {
+	PVRDMA_RATE_PORT_CURRENT	= 0,
+	PVRDMA_RATE_2_5_GBPS		= 2,
+	PVRDMA_RATE_5_GBPS		= 5,
+	PVRDMA_RATE_10_GBPS		= 3,
+	PVRDMA_RATE_20_GBPS		= 6,
+	PVRDMA_RATE_30_GBPS		= 4,
+	PVRDMA_RATE_40_GBPS		= 7,
+	PVRDMA_RATE_60_GBPS		= 8,
+	PVRDMA_RATE_80_GBPS		= 9,
+	PVRDMA_RATE_120_GBPS		= 10,
+	PVRDMA_RATE_14_GBPS		= 11,
+	PVRDMA_RATE_56_GBPS		= 12,
+	PVRDMA_RATE_112_GBPS		= 13,
+	PVRDMA_RATE_168_GBPS		= 14,
+	PVRDMA_RATE_25_GBPS		= 15,
+	PVRDMA_RATE_100_GBPS		= 16,
+	PVRDMA_RATE_200_GBPS		= 17,
+	PVRDMA_RATE_300_GBPS		= 18,
+};
+
+struct pvrdma_ah_attr {
+	struct pvrdma_global_route	grh;
+	__u16				dlid;
+	__u16				vlan_id;
+	__u8				sl;
+	__u8				src_path_bits;
+	__u8				static_rate;
+	__u8				ah_flags;
+	__u8				port_num;
+	__u8				dmac[6];
+	__u8				reserved;
+};
+
+enum pvrdma_wc_status {
+	PVRDMA_WC_SUCCESS,
+	PVRDMA_WC_LOC_LEN_ERR,
+	PVRDMA_WC_LOC_QP_OP_ERR,
+	PVRDMA_WC_LOC_EEC_OP_ERR,
+	PVRDMA_WC_LOC_PROT_ERR,
+	PVRDMA_WC_WR_FLUSH_ERR,
+	PVRDMA_WC_MW_BIND_ERR,
+	PVRDMA_WC_BAD_RESP_ERR,
+	PVRDMA_WC_LOC_ACCESS_ERR,
+	PVRDMA_WC_REM_INV_REQ_ERR,
+	PVRDMA_WC_REM_ACCESS_ERR,
+	PVRDMA_WC_REM_OP_ERR,
+	PVRDMA_WC_RETRY_EXC_ERR,
+	PVRDMA_WC_RNR_RETRY_EXC_ERR,
+	PVRDMA_WC_LOC_RDD_VIOL_ERR,
+	PVRDMA_WC_REM_INV_RD_REQ_ERR,
+	PVRDMA_WC_REM_ABORT_ERR,
+	PVRDMA_WC_INV_EECN_ERR,
+	PVRDMA_WC_INV_EEC_STATE_ERR,
+	PVRDMA_WC_FATAL_ERR,
+	PVRDMA_WC_RESP_TIMEOUT_ERR,
+	PVRDMA_WC_GENERAL_ERR,
+};
+
+enum pvrdma_wc_opcode {
+	PVRDMA_WC_SEND,
+	PVRDMA_WC_RDMA_WRITE,
+	PVRDMA_WC_RDMA_READ,
+	PVRDMA_WC_COMP_SWAP,
+	PVRDMA_WC_FETCH_ADD,
+	PVRDMA_WC_BIND_MW,
+	PVRDMA_WC_LSO,
+	PVRDMA_WC_LOCAL_INV,
+	PVRDMA_WC_FAST_REG_MR,
+	PVRDMA_WC_MASKED_COMP_SWAP,
+	PVRDMA_WC_MASKED_FETCH_ADD,
+	PVRDMA_WC_RECV = 1 << 7,
+	PVRDMA_WC_RECV_RDMA_WITH_IMM,
+};
+
+enum pvrdma_wc_flags {
+	PVRDMA_WC_GRH			= 1 << 0,
+	PVRDMA_WC_WITH_IMM		= 1 << 1,
+	PVRDMA_WC_WITH_INVALIDATE	= 1 << 2,
+	PVRDMA_WC_IP_CSUM_OK		= 1 << 3,
+	PVRDMA_WC_WITH_SMAC		= 1 << 4,
+	PVRDMA_WC_WITH_VLAN		= 1 << 5,
+	PVRDMA_WC_FLAGS_MAX		= PVRDMA_WC_WITH_VLAN,
+};
+
+enum pvrdma_cq_notify_flags {
+	PVRDMA_CQ_SOLICITED		= 1 << 0,
+	PVRDMA_CQ_NEXT_COMP		= 1 << 1,
+	PVRDMA_CQ_SOLICITED_MASK	= PVRDMA_CQ_SOLICITED |
+					  PVRDMA_CQ_NEXT_COMP,
+	PVRDMA_CQ_REPORT_MISSED_EVENTS	= 1 << 2,
+};
+
+struct pvrdma_qp_cap {
+	__u32	max_send_wr;
+	__u32	max_recv_wr;
+	__u32	max_send_sge;
+	__u32	max_recv_sge;
+	__u32	max_inline_data;
+	__u32	reserved;
+};
+
+enum pvrdma_sig_type {
+	PVRDMA_SIGNAL_ALL_WR,
+	PVRDMA_SIGNAL_REQ_WR,
+};
+
+enum pvrdma_qp_type {
+	PVRDMA_QPT_SMI,
+	PVRDMA_QPT_GSI,
+	PVRDMA_QPT_RC,
+	PVRDMA_QPT_UC,
+	PVRDMA_QPT_UD,
+	PVRDMA_QPT_RAW_IPV6,
+	PVRDMA_QPT_RAW_ETHERTYPE,
+	PVRDMA_QPT_RAW_PACKET = 8,
+	PVRDMA_QPT_XRC_INI = 9,
+	PVRDMA_QPT_XRC_TGT,
+	PVRDMA_QPT_MAX,
+};
+
+enum pvrdma_qp_create_flags {
+	PVRDMA_QP_CREATE_IPOPVRDMA_UD_LSO		= 1 << 0,
+	PVRDMA_QP_CREATE_BLOCK_MULTICAST_LOOPBACK	= 1 << 1,
+};
+
+enum pvrdma_qp_attr_mask {
+	PVRDMA_QP_STATE			= 1 << 0,
+	PVRDMA_QP_CUR_STATE		= 1 << 1,
+	PVRDMA_QP_EN_SQD_ASYNC_NOTIFY	= 1 << 2,
+	PVRDMA_QP_ACCESS_FLAGS		= 1 << 3,
+	PVRDMA_QP_PKEY_INDEX		= 1 << 4,
+	PVRDMA_QP_PORT			= 1 << 5,
+	PVRDMA_QP_QKEY			= 1 << 6,
+	PVRDMA_QP_AV			= 1 << 7,
+	PVRDMA_QP_PATH_MTU		= 1 << 8,
+	PVRDMA_QP_TIMEOUT		= 1 << 9,
+	PVRDMA_QP_RETRY_CNT		= 1 << 10,
+	PVRDMA_QP_RNR_RETRY		= 1 << 11,
+	PVRDMA_QP_RQ_PSN		= 1 << 12,
+	PVRDMA_QP_MAX_QP_RD_ATOMIC	= 1 << 13,
+	PVRDMA_QP_ALT_PATH		= 1 << 14,
+	PVRDMA_QP_MIN_RNR_TIMER		= 1 << 15,
+	PVRDMA_QP_SQ_PSN		= 1 << 16,
+	PVRDMA_QP_MAX_DEST_RD_ATOMIC	= 1 << 17,
+	PVRDMA_QP_PATH_MIG_STATE	= 1 << 18,
+	PVRDMA_QP_CAP			= 1 << 19,
+	PVRDMA_QP_DEST_QPN		= 1 << 20,
+	PVRDMA_QP_ATTR_MASK_MAX		= PVRDMA_QP_DEST_QPN,
+};
+
+enum pvrdma_qp_state {
+	PVRDMA_QPS_RESET,
+	PVRDMA_QPS_INIT,
+	PVRDMA_QPS_RTR,
+	PVRDMA_QPS_RTS,
+	PVRDMA_QPS_SQD,
+	PVRDMA_QPS_SQE,
+	PVRDMA_QPS_ERR,
+};
+
+enum pvrdma_mig_state {
+	PVRDMA_MIG_MIGRATED,
+	PVRDMA_MIG_REARM,
+	PVRDMA_MIG_ARMED,
+};
+
+enum pvrdma_mw_type {
+	PVRDMA_MW_TYPE_1 = 1,
+	PVRDMA_MW_TYPE_2 = 2,
+};
+
+struct pvrdma_qp_attr {
+	enum pvrdma_qp_state	qp_state;
+	enum pvrdma_qp_state	cur_qp_state;
+	enum pvrdma_mtu		path_mtu;
+	enum pvrdma_mig_state	path_mig_state;
+	__u32			qkey;
+	__u32			rq_psn;
+	__u32			sq_psn;
+	__u32			dest_qp_num;
+	__u32			qp_access_flags;
+	__u16			pkey_index;
+	__u16			alt_pkey_index;
+	__u8			en_sqd_async_notify;
+	__u8			sq_draining;
+	__u8			max_rd_atomic;
+	__u8			max_dest_rd_atomic;
+	__u8			min_rnr_timer;
+	__u8			port_num;
+	__u8			timeout;
+	__u8			retry_cnt;
+	__u8			rnr_retry;
+	__u8			alt_port_num;
+	__u8			alt_timeout;
+	__u8			reserved[5];
+	struct pvrdma_qp_cap	cap;
+	struct pvrdma_ah_attr	ah_attr;
+	struct pvrdma_ah_attr	alt_ah_attr;
+};
+
+enum pvrdma_wr_opcode {
+	PVRDMA_WR_RDMA_WRITE,
+	PVRDMA_WR_RDMA_WRITE_WITH_IMM,
+	PVRDMA_WR_SEND,
+	PVRDMA_WR_SEND_WITH_IMM,
+	PVRDMA_WR_RDMA_READ,
+	PVRDMA_WR_ATOMIC_CMP_AND_SWP,
+	PVRDMA_WR_ATOMIC_FETCH_AND_ADD,
+	PVRDMA_WR_LSO,
+	PVRDMA_WR_SEND_WITH_INV,
+	PVRDMA_WR_RDMA_READ_WITH_INV,
+	PVRDMA_WR_LOCAL_INV,
+	PVRDMA_WR_FAST_REG_MR,
+	PVRDMA_WR_MASKED_ATOMIC_CMP_AND_SWP,
+	PVRDMA_WR_MASKED_ATOMIC_FETCH_AND_ADD,
+	PVRDMA_WR_BIND_MW,
+	PVRDMA_WR_REG_SIG_MR,
+};
+
+enum pvrdma_send_flags {
+	PVRDMA_SEND_FENCE	= 1 << 0,
+	PVRDMA_SEND_SIGNALED	= 1 << 1,
+	PVRDMA_SEND_SOLICITED	= 1 << 2,
+	PVRDMA_SEND_INLINE	= 1 << 3,
+	PVRDMA_SEND_IP_CSUM	= 1 << 4,
+	PVRDMA_SEND_FLAGS_MAX	= PVRDMA_SEND_IP_CSUM,
+};
+
+struct pvrdma_sge {
+	__u64	addr;
+	__u32	length;
+	__u32	lkey;
+};
+
+enum pvrdma_access_flags {
+	PVRDMA_ACCESS_LOCAL_WRITE	= 1 << 0,
+	PVRDMA_ACCESS_REMOTE_WRITE	= 1 << 1,
+	PVRDMA_ACCESS_REMOTE_READ	= 1 << 2,
+	PVRDMA_ACCESS_REMOTE_ATOMIC	= 1 << 3,
+	PVRDMA_ACCESS_MW_BIND		= 1 << 4,
+	PVRDMA_ZERO_BASED		= 1 << 5,
+	PVRDMA_ACCESS_ON_DEMAND		= 1 << 6,
+	PVRDMA_ACCESS_FLAGS_MAX		= PVRDMA_ACCESS_ON_DEMAND,
+};
+
+#endif /* __PVRDMA_IB_VERBS_H__ */