#ifndef _SYS_IB_CLIENTS_OF_SOL_UVERBS_SOL_UVERBS_H
#define _SYS_IB_CLIENTS_OF_SOL_UVERBS_SOL_UVERBS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/ib/clients/of/ofed_kernel.h>
#include <sys/ib/clients/of/rdma/ib_user_verbs.h>
#include <sys/ib/clients/of/sol_uverbs/sol_uverbs_hca.h>
#include <sys/ib/clients/of/sol_ofs/sol_ofs_common.h>
#include <sys/ib/clients/of/sol_uverbs/sol_uverbs2ucma.h>
#define SOL_UVERBS_DRIVER_MAX_HCA_MINOR (16)
#define SOL_UVERBS_DRIVER_EVENT_MINOR (17)
#define SOL_UVERBS_DRIVER_MAX_MINOR (18)
typedef struct uverbs_event {
union {
struct ib_uverbs_async_event_desc async;
struct ib_uverbs_comp_event_desc comp;
} ev_desc;
llist_head_t ev_list;
llist_head_t ev_obj_list;
uint32_t *ev_counter;
} uverbs_event_t;
typedef struct {
kmutex_t lock;
dev_info_t *dip;
ibt_clnt_modinfo_t clnt_modinfo;
ibt_clnt_hdl_t clnt_hdl;
uint32_t hca_count;
ib_guid_t *hca_guid_list;
sol_uverbs_hca_t *hcas;
dev_t dev;
} uverbs_module_context_t;
typedef struct uverbs_ufile_uobj {
sol_ofs_uobj_t uobj;
kmutex_t lock;
int ref;
kcondvar_t poll_wait;
pollhead_t poll_head;
struct uverbs_uctxt_uobj *uctxt;
int is_async;
llist_head_t event_list;
sol_uverbs_cq_ctrl_t ufile_notify_enabled;
uint32_t ufile_cq_cnt;
} uverbs_ufile_uobj_t;
#define SOL_UVERBS_UCTXT_VERBS 0x001
#define SOL_UVERBS_UCTXT_EVENT 0x100
#define SOL_UVERBS_UCTXT_ASYNC 0x101
#define SOL_UVERBS_UCTXT_COMPL 0x110
typedef struct uverbs_uctxt_uobj {
sol_ofs_uobj_t uobj;
kmutex_t lock;
uverbs_module_context_t *mod_ctxt;
sol_uverbs_hca_t *hca;
genlist_t pd_list;
genlist_t mr_list;
genlist_t cq_list;
genlist_t qp_list;
genlist_t srq_list;
genlist_t ah_list;
uverbs_ufile_uobj_t *comp_evfile;
uverbs_ufile_uobj_t *async_evfile;
uint16_t uctxt_type;
uint32_t uctxt_verbs_id;
uint32_t uctxt_async_id;
uint32_t uctxt_comp_id;
uint8_t uctxt_free_pending;
} uverbs_uctxt_uobj_t;
typedef struct uverbs_upd_uobj {
sol_ofs_uobj_t uobj;
ibt_pd_hdl_t pd;
genlist_entry_t *list_entry;
uint32_t active_qp_cnt;
uint8_t free_pending;
} uverbs_upd_uobj_t;
typedef struct uverbs_umr_uobj {
sol_ofs_uobj_t uobj;
ibt_mr_hdl_t mr;
genlist_entry_t *list_entry;
} uverbs_umr_uobj_t;
typedef struct uverbs_ucq_uobj {
sol_ofs_uobj_t uobj;
ibt_cq_hdl_t cq;
genlist_entry_t *list_entry;
uverbs_uctxt_uobj_t *uctxt;
uverbs_ufile_uobj_t *comp_chan;
uint32_t comp_events_reported;
uint32_t async_events_reported;
llist_head_t async_list;
llist_head_t comp_list;
uint32_t active_qp_cnt;
uint8_t free_pending;
} uverbs_ucq_uobj_t;
typedef struct uverbs_usrq_uobj {
sol_ofs_uobj_t uobj;
ibt_srq_hdl_t srq;
genlist_entry_t *list_entry;
uverbs_uctxt_uobj_t *uctxt;
uint32_t async_events_reported;
llist_head_t async_list;
uint32_t active_qp_cnt;
uint8_t free_pending;
} uverbs_usrq_uobj_t;
typedef struct uverbs_uah_uobj {
sol_ofs_uobj_t uobj;
ibt_ah_hdl_t ah;
genlist_entry_t *list_entry;
} uverbs_uah_uobj_t;
#define SOL_UVERBS_UQP_RCQ_VALID 0x01
#define SOL_UVERBS_UQP_SRQ_VALID 0x02
typedef struct uverbs_uqp_uobj {
sol_ofs_uobj_t uobj;
ibt_qp_hdl_t qp;
genlist_entry_t *list_entry;
uint32_t max_inline_data;
uverbs_uctxt_uobj_t *uctxt;
uint32_t qp_num;
uint32_t disable_qp_mod;
enum ib_qp_type ofa_qp_type;
llist_head_t mcast_list;
llist_head_t async_list;
uint32_t async_events_reported;
uverbs_ucq_uobj_t *uqp_rcq;
uverbs_ucq_uobj_t *uqp_scq;
uint32_t uqp_pd_hdl;
uint32_t uqp_scq_hdl;
uint32_t uqp_rcq_hdl;
uint32_t uqp_srq_hdl;
uint8_t uqp_rcq_srq_valid;
sol_uverbs_qp_free_state_t uqp_free_state;
} uverbs_uqp_uobj_t;
extern sol_ofs_uobj_table_t uverbs_uctxt_uo_tbl;
extern sol_ofs_uobj_table_t uverbs_upd_uo_tbl;
extern sol_ofs_uobj_table_t uverbs_uah_uo_tbl;
extern sol_ofs_uobj_table_t uverbs_umr_uo_tbl;
extern sol_ofs_uobj_table_t uverbs_ucq_uo_tbl;
extern sol_ofs_uobj_table_t uverbs_usrq_uo_tbl;
extern sol_ofs_uobj_table_t uverbs_uqp_uo_tbl;
extern sol_ofs_uobj_table_t uverbs_ufile_uo_tbl;
struct mthca_alloc_ucontext_resp {
uint32_t qp_tab_size;
uint32_t uarc_size;
};
struct ib_udata {
void *inbuf;
void *outbuf;
size_t inlen;
size_t outlen;
};
int sol_uverbs_dummy_command(uverbs_uctxt_uobj_t *uctxt, char *buf,
int in_len, int out_len);
int sol_uverbs_get_context(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_alloc_pd(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_dealloc_pd(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_create_ah(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_destroy_ah(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_query_device(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_query_port(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_query_gid(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_query_pkey(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_reg_mr(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_dereg_mr(uverbs_uctxt_uobj_t *uctxt, char *buf, int in_len,
int out_len);
int sol_uverbs_create_comp_channel(uverbs_uctxt_uobj_t *uctxt, char *buf,
int in_len, int out_len);
uint32_t
sol_uverbs_ibt_to_of_device_cap_flags(ibt_hca_flags_t flags,
ibt_hca_flags2_t flags2);
uint64_t
sol_uverbs_ibt_to_of_page_sz(ibt_page_sizes_t page_szs);
int sol_uverbs_ibt_to_kernel_status(ibt_status_t status);
uint32_t sol_uverbs_qpnum2uqpid(uint32_t qp_num);
int uverbs_upd_free(uverbs_upd_uobj_t *, uverbs_uctxt_uobj_t *);
int uverbs_uqp_free(uverbs_uqp_uobj_t *, uverbs_uctxt_uobj_t *);
int uverbs_usrq_free(uverbs_usrq_uobj_t *, uverbs_uctxt_uobj_t *);
int uverbs_ucq_free(uverbs_ucq_uobj_t *, uverbs_uctxt_uobj_t *);
static inline uverbs_uctxt_uobj_t *
uverbs_uobj_get_uctxt_read(uint32_t id)
{
return (uverbs_uctxt_uobj_t *)
sol_ofs_uobj_get_read(&uverbs_uctxt_uo_tbl, id);
}
static inline uverbs_uctxt_uobj_t *
uverbs_uobj_get_uctxt_write(uint32_t id)
{
return (uverbs_uctxt_uobj_t *)
sol_ofs_uobj_get_write(&uverbs_uctxt_uo_tbl, id);
}
static inline uverbs_upd_uobj_t *
uverbs_uobj_get_upd_read(uint32_t id)
{
return (uverbs_upd_uobj_t *)
sol_ofs_uobj_get_read(&uverbs_upd_uo_tbl, id);
}
static inline uverbs_upd_uobj_t *
uverbs_uobj_get_upd_write(uint32_t id)
{
return (uverbs_upd_uobj_t *)
sol_ofs_uobj_get_write(&uverbs_upd_uo_tbl, id);
}
static inline uverbs_umr_uobj_t *
uverbs_uobj_get_umr_read(uint32_t id)
{
return (uverbs_umr_uobj_t *)
sol_ofs_uobj_get_read(&uverbs_umr_uo_tbl, id);
}
static inline uverbs_umr_uobj_t *
uverbs_uobj_get_umr_write(uint32_t id)
{
return (uverbs_umr_uobj_t *)
sol_ofs_uobj_get_write(&uverbs_umr_uo_tbl, id);
}
static inline uverbs_ucq_uobj_t *
uverbs_uobj_get_ucq_read(uint32_t id)
{
return (uverbs_ucq_uobj_t *)
sol_ofs_uobj_get_read(&uverbs_ucq_uo_tbl, id);
}
static inline uverbs_ucq_uobj_t *
uverbs_uobj_get_ucq_write(uint32_t id)
{
return (uverbs_ucq_uobj_t *)
sol_ofs_uobj_get_write(&uverbs_ucq_uo_tbl, (int)id);
}
static inline uverbs_usrq_uobj_t *
uverbs_uobj_get_usrq_read(uint32_t id)
{
return (uverbs_usrq_uobj_t *)
sol_ofs_uobj_get_read(&uverbs_usrq_uo_tbl, id);
}
static inline uverbs_usrq_uobj_t *
uverbs_uobj_get_usrq_write(uint32_t id)
{
return (uverbs_usrq_uobj_t *)
sol_ofs_uobj_get_write(&uverbs_usrq_uo_tbl, id);
}
static inline uverbs_uah_uobj_t *
uverbs_uobj_get_uah_read(uint32_t id)
{
return (uverbs_uah_uobj_t *)
sol_ofs_uobj_get_read(&uverbs_uah_uo_tbl, id);
}
static inline uverbs_uah_uobj_t *
uverbs_uobj_get_uah_write(uint32_t id)
{
return (uverbs_uah_uobj_t *)
sol_ofs_uobj_get_write(&uverbs_uah_uo_tbl, id);
}
static inline uverbs_uqp_uobj_t *
uverbs_uobj_get_uqp_read(uint32_t id)
{
return (uverbs_uqp_uobj_t *)
sol_ofs_uobj_get_read(&uverbs_uqp_uo_tbl, id);
}
static inline uverbs_uqp_uobj_t *
uverbs_uobj_get_uqp_write(uint32_t id)
{
return (uverbs_uqp_uobj_t *)
sol_ofs_uobj_get_write(&uverbs_uqp_uo_tbl, id);
}
#ifdef __cplusplus
}
#endif
#endif