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@xxxxxxxxxx> > Reviewed-by: George Zhang <georgezhang@xxxxxxxxxx> > Reviewed-by: Aditya Sarwade <asarwade@xxxxxxxxxx> > Reviewed-by: Bryan Tan <bryantan@xxxxxxxxxx> > Signed-off-by: Adit Ranadive <aditr@xxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxx > 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html