/*
* This file contains definitions used in OFED defined user/kernel
* interfaces. These are imported from the OFED header ib_user_verbs.h. Oracle
* elects to have and use the contents of ib_user_verbs.h under and governed
* by the OpenIB.org BSD license (see below for full license text). However,
* the following notice accompanied the original version of this file:
*/
/*
* Copyright (c) 2005 Topspin Communications. All rights reserved.
* Copyright (c) 2005, 2006 Cisco Systems. All rights reserved.
* Copyright (c) 2005 PathScale, Inc. All rights reserved.
* Copyright (c) 2006 Mellanox Technologies. 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 _SYS_IB_CLIENTS_OF_RDMA_IB_USER_VERBS_H
#define _SYS_IB_CLIENTS_OF_RDMA_IB_USER_VERBS_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* Increment this value if any changes that break userspace ABI
* compatibility are made.
*/
#define IB_USER_VERBS_ABI_VERSION 6
enum {
IB_USER_VERBS_CMD_GET_CONTEXT,
IB_USER_VERBS_CMD_QUERY_DEVICE,
IB_USER_VERBS_CMD_QUERY_PORT,
IB_USER_VERBS_CMD_ALLOC_PD,
IB_USER_VERBS_CMD_DEALLOC_PD,
IB_USER_VERBS_CMD_CREATE_AH,
IB_USER_VERBS_CMD_MODIFY_AH,
IB_USER_VERBS_CMD_QUERY_AH,
IB_USER_VERBS_CMD_DESTROY_AH,
IB_USER_VERBS_CMD_REG_MR,
IB_USER_VERBS_CMD_REG_SMR,
IB_USER_VERBS_CMD_REREG_MR,
IB_USER_VERBS_CMD_QUERY_MR,
IB_USER_VERBS_CMD_DEREG_MR,
IB_USER_VERBS_CMD_ALLOC_MW,
IB_USER_VERBS_CMD_BIND_MW,
IB_USER_VERBS_CMD_DEALLOC_MW,
IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL,
IB_USER_VERBS_CMD_CREATE_CQ,
IB_USER_VERBS_CMD_RESIZE_CQ,
IB_USER_VERBS_CMD_DESTROY_CQ,
IB_USER_VERBS_CMD_POLL_CQ,
IB_USER_VERBS_CMD_PEEK_CQ,
IB_USER_VERBS_CMD_REQ_NOTIFY_CQ,
IB_USER_VERBS_CMD_CREATE_QP,
IB_USER_VERBS_CMD_QUERY_QP,
IB_USER_VERBS_CMD_MODIFY_QP,
IB_USER_VERBS_CMD_DESTROY_QP,
IB_USER_VERBS_CMD_POST_SEND,
IB_USER_VERBS_CMD_POST_RECV,
IB_USER_VERBS_CMD_ATTACH_MCAST,
IB_USER_VERBS_CMD_DETACH_MCAST,
IB_USER_VERBS_CMD_CREATE_SRQ,
IB_USER_VERBS_CMD_MODIFY_SRQ,
IB_USER_VERBS_CMD_QUERY_SRQ,
IB_USER_VERBS_CMD_DESTROY_SRQ,
IB_USER_VERBS_CMD_POST_SRQ_RECV,
IB_USER_VERBS_CMD_CREATE_XRC_SRQ,
IB_USER_VERBS_CMD_OPEN_XRC_DOMAIN,
IB_USER_VERBS_CMD_CLOSE_XRC_DOMAIN,
IB_USER_VERBS_CMD_CREATE_XRC_RCV_QP,
IB_USER_VERBS_CMD_MODIFY_XRC_RCV_QP,
IB_USER_VERBS_CMD_QUERY_XRC_RCV_QP,
IB_USER_VERBS_CMD_REG_XRC_RCV_QP,
IB_USER_VERBS_CMD_UNREG_XRC_RCV_QP,
IB_USER_VERBS_CMD_QUERY_GID,
IB_USER_VERBS_CMD_QUERY_PKEY
};
/*
* Make sure that all structs defined in this file remain laid out so
* that they pack the same way on 32-bit and 64-bit architectures (to
* avoid incompatibility between 32-bit userspace and 64-bit kernels).
* Specifically:
* - Do not use pointer types -- pass pointers in uint64_t instead.
* - Make sure that any structure larger than 4 bytes is padded to a
* multiple of 8 bytes. Otherwise the structure size will be
* different between 32-bit and 64-bit architectures.
*/
struct ib_uverbs_async_event_desc {
uint64_t element;
uint32_t event_type; /* enum ib_event_type */
uint32_t reserved;
};
struct ib_uverbs_comp_event_desc {
uint64_t cq_handle;
};
/*
* All commands from userspace should start with a uint32_t command field
* followed by uint16_t in_words and out_words fields (which give the
* length of the command block and response buffer if any in 32-bit
* words). The kernel driver will read these fields first and read
* the rest of the command struct based on these value.
*/
struct ib_uverbs_cmd_hdr {
uint32_t command;
uint16_t in_words;
uint16_t out_words;
};
struct ib_uverbs_get_context {
ofv_resp_addr_t response;
uint64_t driver_data[];
};
struct ib_uverbs_get_context_resp {
uint32_t async_fd;
uint32_t num_comp_vectors;
};
struct ib_uverbs_query_device {
ofv_resp_addr_t response;
uint64_t driver_data[];
};
struct ib_uverbs_query_device_resp {
uint64_t fw_ver;
uint64_t node_guid;
uint64_t sys_image_guid;
uint64_t max_mr_size;
uint64_t page_size_cap;
uint32_t vendor_id;
uint32_t vendor_part_id;
uint32_t hw_ver;
uint32_t max_qp;
uint32_t max_qp_wr;
uint32_t device_cap_flags;
uint32_t max_sge;
uint32_t max_sge_rd;
uint32_t max_cq;
uint32_t max_cqe;
uint32_t max_mr;
uint32_t max_pd;
uint32_t max_qp_rd_atom;
uint32_t max_ee_rd_atom;
uint32_t max_res_rd_atom;
uint32_t max_qp_init_rd_atom;
uint32_t max_ee_init_rd_atom;
uint32_t atomic_cap;
uint32_t max_ee;
uint32_t max_rdd;
uint32_t max_mw;
uint32_t max_raw_ipv6_qp;
uint32_t max_raw_ethy_qp;
uint32_t max_mcast_grp;
uint32_t max_mcast_qp_attach;
uint32_t max_total_mcast_qp_attach;
uint32_t max_ah;
uint32_t max_fmr;
uint32_t max_map_per_fmr;
uint32_t max_srq;
uint32_t max_srq_wr;
uint32_t max_srq_sge;
uint16_t max_pkeys;
uint8_t local_ca_ack_delay;
uint8_t phys_port_cnt;
uint8_t reserved[4];
};
struct ib_uverbs_query_port {
ofv_resp_addr_t response;
uint8_t port_num;
uint8_t reserved[7];
uint64_t driver_data[];
};
struct ib_uverbs_query_port_resp {
uint32_t port_cap_flags;
uint32_t max_msg_sz;
uint32_t bad_pkey_cntr;
uint32_t qkey_viol_cntr;
uint32_t gid_tbl_len;
uint16_t pkey_tbl_len;
uint16_t lid;
uint16_t sm_lid;
uint8_t state;
uint8_t max_mtu;
uint8_t active_mtu;
uint8_t lmc;
uint8_t max_vl_num;
uint8_t sm_sl;
uint8_t subnet_timeout;
uint8_t init_type_reply;
uint8_t active_width;
uint8_t active_speed;
uint8_t phys_state;
uint8_t reserved[3];
};
struct ib_uverbs_query_gid {
ofv_resp_addr_t response;
uint32_t gid_index;
uint8_t port_num;
uint8_t reserved[3];
uint64_t driver_data;
};
struct ib_uverbs_query_gid_resp {
uint8_t gid[16];
};
struct ib_uverbs_query_pkey {
ofv_resp_addr_t response;
uint32_t pkey_index;
uint8_t port_num;
uint8_t reserved[3];
uint64_t driver_data;
};
struct ib_uverbs_query_pkey_resp {
uint16_t pkey;
uint16_t reserved;
};
struct ib_uverbs_alloc_pd {
ofv_resp_addr_t response;
uint64_t driver_data[];
};
/*
* PD responses may pass opaque data to userspace drivers, we choose a value
* larger than what any HCA requires.
*/
#define SOL_UVERBS_PD_DATA_OUT_SIZE 24
typedef uint64_t uverbs_pd_drv_out_data_t[SOL_UVERBS_PD_DATA_OUT_SIZE];
struct ib_uverbs_alloc_pd_resp {
uint32_t pd_handle;
uint32_t reserved;
uverbs_pd_drv_out_data_t drv_out;
};
struct ib_uverbs_dealloc_pd {
uint32_t pd_handle;
};
struct ib_uverbs_reg_mr {
ofv_resp_addr_t response;
uint64_t start;
uint64_t length;
uint64_t hca_va;
uint32_t pd_handle;
uint32_t access_flags;
uint64_t driver_data[];
};
struct ib_uverbs_reg_mr_resp {
uint32_t mr_handle;
uint32_t lkey;
uint32_t rkey;
};
struct ib_uverbs_dereg_mr {
uint32_t mr_handle;
};
struct ib_uverbs_create_comp_channel {
ofv_resp_addr_t response;
};
struct ib_uverbs_create_comp_channel_resp {
uint32_t fd;
};
struct ib_uverbs_create_cq {
ofv_resp_addr_t response;
uint64_t user_handle;
uint32_t cqe;
uint32_t comp_vector;
int32_t comp_channel;
uint32_t reserved;
uint64_t driver_data[];
};
/*
* CQ responses pass opaque data to userspace drivers, we choose a value
* larger than what any HCA requires.
*/
#define SOL_UVERBS_CQ_DATA_OUT_SIZE 24
typedef uint64_t uverbs_cq_drv_out_data_t[SOL_UVERBS_CQ_DATA_OUT_SIZE];
struct ib_uverbs_create_cq_resp {
uint32_t cq_handle;
uint32_t cqe;
uverbs_cq_drv_out_data_t drv_out;
};
struct ib_uverbs_resize_cq {
ofv_resp_addr_t response;
uint32_t cq_handle;
uint32_t cqe;
uint64_t driver_data[];
};
struct ib_uverbs_resize_cq_resp {
uint32_t cqe;
uint32_t reserved;
uverbs_cq_drv_out_data_t drv_out;
};
struct ib_uverbs_poll_cq {
ofv_resp_addr_t response;
uint32_t cq_handle;
uint32_t ne;
};
struct ib_uverbs_wc {
uint64_t wr_id;
uint32_t status;
uint32_t opcode;
uint32_t vendor_err;
uint32_t byte_len;
uint32_t imm_data;
uint32_t qp_num;
uint32_t src_qp;
uint32_t wc_flags;
uint16_t pkey_index;
uint16_t slid;
uint8_t sl;
uint8_t dlid_path_bits;
uint8_t port_num;
uint8_t reserved;
};
struct ib_uverbs_poll_cq_resp {
uint32_t count;
uint32_t reserved;
struct ib_uverbs_wc wc[];
};
struct ib_uverbs_req_notify_cq {
uint32_t cq_handle;
uint32_t solicited_only;
};
struct ib_uverbs_destroy_cq {
ofv_resp_addr_t response;
uint32_t cq_handle;
uint32_t reserved;
};
struct ib_uverbs_destroy_cq_resp {
uint32_t comp_events_reported;
uint32_t async_events_reported;
};
struct ib_uverbs_global_route {
uint8_t dgid[16];
uint32_t flow_label;
uint8_t sgid_index;
uint8_t hop_limit;
uint8_t traffic_class;
uint8_t reserved;
};
struct ib_uverbs_ah_attr {
struct ib_uverbs_global_route grh;
uint16_t dlid;
uint8_t sl;
uint8_t src_path_bits;
uint8_t static_rate;
uint8_t is_global;
uint8_t port_num;
uint8_t reserved;
};
struct ib_uverbs_qp_attr {
uint32_t qp_attr_mask;
uint32_t qp_state;
uint32_t cur_qp_state;
uint32_t path_mtu;
uint32_t path_mig_state;
uint32_t qkey;
uint32_t rq_psn;
uint32_t sq_psn;
uint32_t dest_qp_num;
uint32_t qp_access_flags;
struct ib_uverbs_ah_attr ah_attr;
struct ib_uverbs_ah_attr alt_ah_attr;
/* ib_qp_cap */
uint32_t max_send_wr;
uint32_t max_recv_wr;
uint32_t max_send_sge;
uint32_t max_recv_sge;
uint32_t max_inline_data;
uint16_t pkey_index;
uint16_t alt_pkey_index;
uint8_t en_sqd_async_notify;
uint8_t sq_draining;
uint8_t max_rd_atomic;
uint8_t max_dest_rd_atomic;
uint8_t min_rnr_timer;
uint8_t port_num;
uint8_t timeout;
uint8_t retry_cnt;
uint8_t rnr_retry;
uint8_t alt_port_num;
uint8_t alt_timeout;
uint8_t reserved[5];
};
struct ib_uverbs_create_qp {
ofv_resp_addr_t response;
uint64_t user_handle;
uint32_t pd_handle;
uint32_t send_cq_handle;
uint32_t recv_cq_handle;
uint32_t srq_handle;
uint32_t max_send_wr;
uint32_t max_recv_wr;
uint32_t max_send_sge;
uint32_t max_recv_sge;
uint32_t max_inline_data;
uint8_t sq_sig_all;
uint8_t qp_type;
uint8_t is_srq;
uint8_t reserved;
uint64_t driver_data[];
};
/*
* QP responses pass opaque data to userspace drivers, we choose a value
* larger than what any HCA requires.
*/
#define SOL_UVERBS_QP_DATA_OUT_SIZE 24
typedef uint64_t uverbs_qp_drv_out_data_t[SOL_UVERBS_QP_DATA_OUT_SIZE];
struct ib_uverbs_create_qp_resp {
uint32_t qp_handle;
uint32_t qpn;
uint32_t max_send_wr;
uint32_t max_recv_wr;
uint32_t max_send_sge;
uint32_t max_recv_sge;
uint32_t max_inline_data;
uint32_t reserved;
uverbs_qp_drv_out_data_t drv_out;
};
/*
* This struct needs to remain a multiple of 8 bytes to keep the
* alignment of the modify QP parameters.
*/
struct ib_uverbs_qp_dest {
uint8_t dgid[16];
uint32_t flow_label;
uint16_t dlid;
uint16_t reserved;
uint8_t sgid_index;
uint8_t hop_limit;
uint8_t traffic_class;
uint8_t sl;
uint8_t src_path_bits;
uint8_t static_rate;
uint8_t is_global;
uint8_t port_num;
};
struct ib_uverbs_query_qp {
ofv_resp_addr_t response;
uint32_t qp_handle;
uint32_t attr_mask;
uint64_t driver_data[];
};
struct ib_uverbs_query_qp_resp {
struct ib_uverbs_qp_dest dest;
struct ib_uverbs_qp_dest alt_dest;
uint32_t max_send_wr;
uint32_t max_recv_wr;
uint32_t max_send_sge;
uint32_t max_recv_sge;
uint32_t max_inline_data;
uint32_t qkey;
uint32_t rq_psn;
uint32_t sq_psn;
uint32_t dest_qp_num;
uint32_t qp_access_flags;
uint16_t pkey_index;
uint16_t alt_pkey_index;
uint8_t qp_state;
uint8_t cur_qp_state;
uint8_t path_mtu;
uint8_t path_mig_state;
uint8_t sq_draining;
uint8_t max_rd_atomic;
uint8_t max_dest_rd_atomic;
uint8_t min_rnr_timer;
uint8_t port_num;
uint8_t timeout;
uint8_t retry_cnt;
uint8_t rnr_retry;
uint8_t alt_port_num;
uint8_t alt_timeout;
uint8_t sq_sig_all;
uint8_t reserved[5];
uint64_t driver_data[];
};
struct ib_uverbs_modify_qp {
struct ib_uverbs_qp_dest dest;
struct ib_uverbs_qp_dest alt_dest;
uint32_t qp_handle;
uint32_t attr_mask;
uint32_t qkey;
uint32_t rq_psn;
uint32_t sq_psn;
uint32_t dest_qp_num;
uint32_t qp_access_flags;
uint16_t pkey_index;
uint16_t alt_pkey_index;
uint8_t qp_state;
uint8_t cur_qp_state;
uint8_t path_mtu;
uint8_t path_mig_state;
uint8_t en_sqd_async_notify;
uint8_t max_rd_atomic;
uint8_t max_dest_rd_atomic;
uint8_t min_rnr_timer;
uint8_t port_num;
uint8_t timeout;
uint8_t retry_cnt;
uint8_t rnr_retry;
uint8_t alt_port_num;
uint8_t alt_timeout;
uint8_t reserved[2];
uint64_t driver_data[];
};
struct ib_uverbs_destroy_qp {
ofv_resp_addr_t response;
uint32_t qp_handle;
uint32_t reserved;
};
struct ib_uverbs_destroy_qp_resp {
uint32_t events_reported;
};
/*
* The ib_uverbs_sge structure isn't used anywhere, since we assume
* the ib_sge structure is packed the same way on 32-bit and 64-bit
* architectures in both kernel and user space. It's just here to
* document the ABI.
*/
struct ib_uverbs_sge {
uint64_t addr;
uint32_t length;
uint32_t lkey;
};
struct ib_uverbs_send_wr {
uint64_t wr_id;
uint32_t num_sge;
uint32_t opcode;
uint32_t send_flags;
uint32_t imm_data;
union {
struct {
uint64_t remote_addr;
uint32_t rkey;
uint32_t reserved;
} rdma;
struct {
uint64_t remote_addr;
uint64_t compare_add;
uint64_t swap;
uint32_t rkey;
uint32_t reserved;
} atomic;
struct {
uint32_t ah;
uint32_t remote_qpn;
uint32_t remote_qkey;
uint32_t reserved;
} ud;
} wr;
};
struct ib_uverbs_post_send {
uint64_t response;
uint32_t qp_handle;
uint32_t wr_count;
uint32_t sge_count;
uint32_t wqe_size;
struct ib_uverbs_send_wr send_wr[];
};
struct ib_uverbs_post_send_resp {
uint32_t bad_wr;
};
struct ib_uverbs_recv_wr {
uint64_t wr_id;
uint32_t num_sge;
uint32_t reserved;
};
struct ib_uverbs_post_recv {
uint64_t response;
uint32_t qp_handle;
uint32_t wr_count;
uint32_t sge_count;
uint32_t wqe_size;
struct ib_uverbs_recv_wr recv_wr[];
};
struct ib_uverbs_post_recv_resp {
uint32_t bad_wr;
};
struct ib_uverbs_post_srq_recv {
uint64_t response;
uint32_t srq_handle;
uint32_t wr_count;
uint32_t sge_count;
uint32_t wqe_size;
struct ib_uverbs_recv_wr recv[];
};
struct ib_uverbs_post_srq_recv_resp {
uint32_t bad_wr;
};
struct ib_uverbs_create_ah {
uint64_t response;
uint64_t user_handle;
uint32_t pd_handle;
uint32_t reserved;
struct ib_uverbs_ah_attr attr;
};
struct ib_uverbs_create_ah_resp {
uint32_t ah_handle;
};
struct ib_uverbs_destroy_ah {
uint32_t ah_handle;
};
struct ib_uverbs_attach_mcast {
uint8_t gid[16];
uint32_t qp_handle;
uint16_t mlid;
uint16_t reserved;
uint64_t driver_data[];
};
struct ib_uverbs_detach_mcast {
uint8_t gid[16];
uint32_t qp_handle;
uint16_t mlid;
uint16_t reserved;
uint64_t driver_data[];
};
struct ib_uverbs_create_srq {
ofv_resp_addr_t response;
uint64_t user_handle;
uint32_t pd_handle;
uint32_t max_wr;
uint32_t max_sge;
uint32_t srq_limit;
uint64_t driver_data[];
};
/*
* SRQ responses pass opaque data to userspace drivers, we choose a value
* larger than what any HCA requires.
*/
#define SOL_UVERBS_SRQ_DATA_OUT_SIZE 24
typedef uint64_t uverbs_srq_drv_out_data_t[SOL_UVERBS_SRQ_DATA_OUT_SIZE];
struct ib_uverbs_create_srq_resp {
uint32_t srq_handle;
uint32_t max_wr;
uint32_t max_sge;
uint32_t reserved;
uverbs_srq_drv_out_data_t drv_out;
};
struct ib_uverbs_modify_srq {
uint32_t srq_handle;
uint32_t attr_mask;
uint32_t max_wr;
uint32_t srq_limit;
uint64_t driver_data[];
};
struct ib_uverbs_query_srq {
ofv_resp_addr_t response;
uint32_t srq_handle;
uint32_t reserved;
uint64_t driver_data[];
};
struct ib_uverbs_query_srq_resp {
uint32_t max_wr;
uint32_t max_sge;
uint32_t srq_limit;
uint32_t reserved;
};
struct ib_uverbs_destroy_srq {
ofv_resp_addr_t response;
uint32_t srq_handle;
uint32_t reserved;
};
struct ib_uverbs_destroy_srq_resp {
uint32_t events_reported;
};
#ifdef __cplusplus
}
#endif
#endif /* _SYS_IB_CLIENTS_OF_RDMA_IB_USER_VERBS_H */