ib_verbs.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /*
  2. * Broadcom NetXtreme-E RoCE driver.
  3. *
  4. * Copyright (c) 2016 - 2017, Broadcom. All rights reserved. The term
  5. * Broadcom refers to Broadcom Limited and/or its subsidiaries.
  6. *
  7. * This software is available to you under a choice of one of two
  8. * licenses. You may choose to be licensed under the terms of the GNU
  9. * General Public License (GPL) Version 2, available from the file
  10. * COPYING in the main directory of this source tree, or the
  11. * BSD license below:
  12. *
  13. * Redistribution and use in source and binary forms, with or without
  14. * modification, are permitted provided that the following conditions
  15. * are met:
  16. *
  17. * 1. Redistributions of source code must retain the above copyright
  18. * notice, this list of conditions and the following disclaimer.
  19. * 2. Redistributions in binary form must reproduce the above copyright
  20. * notice, this list of conditions and the following disclaimer in
  21. * the documentation and/or other materials provided with the
  22. * distribution.
  23. *
  24. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
  25. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  26. * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  27. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
  28. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  29. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  30. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  31. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  32. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  33. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  34. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  35. *
  36. * Description: IB Verbs interpreter (header)
  37. */
  38. #ifndef __BNXT_RE_IB_VERBS_H__
  39. #define __BNXT_RE_IB_VERBS_H__
  40. struct bnxt_re_gid_ctx {
  41. u32 idx;
  42. u32 refcnt;
  43. };
  44. #define BNXT_RE_FENCE_BYTES 64
  45. struct bnxt_re_fence_data {
  46. u32 size;
  47. u8 va[BNXT_RE_FENCE_BYTES];
  48. dma_addr_t dma_addr;
  49. struct bnxt_re_mr *mr;
  50. struct ib_mw *mw;
  51. struct bnxt_qplib_swqe bind_wqe;
  52. u32 bind_rkey;
  53. };
  54. struct bnxt_re_pd {
  55. struct bnxt_re_dev *rdev;
  56. struct ib_pd ib_pd;
  57. struct bnxt_qplib_pd qplib_pd;
  58. struct bnxt_re_fence_data fence;
  59. };
  60. struct bnxt_re_ah {
  61. struct bnxt_re_dev *rdev;
  62. struct ib_ah ib_ah;
  63. struct bnxt_qplib_ah qplib_ah;
  64. };
  65. struct bnxt_re_srq {
  66. struct bnxt_re_dev *rdev;
  67. u32 srq_limit;
  68. struct ib_srq ib_srq;
  69. struct bnxt_qplib_srq qplib_srq;
  70. struct ib_umem *umem;
  71. spinlock_t lock; /* protect srq */
  72. };
  73. struct bnxt_re_qp {
  74. struct list_head list;
  75. struct bnxt_re_dev *rdev;
  76. struct ib_qp ib_qp;
  77. spinlock_t sq_lock; /* protect sq */
  78. spinlock_t rq_lock; /* protect rq */
  79. struct bnxt_qplib_qp qplib_qp;
  80. struct ib_umem *sumem;
  81. struct ib_umem *rumem;
  82. /* QP1 */
  83. u32 send_psn;
  84. struct ib_ud_header qp1_hdr;
  85. struct bnxt_re_cq *scq;
  86. struct bnxt_re_cq *rcq;
  87. };
  88. struct bnxt_re_cq {
  89. struct bnxt_re_dev *rdev;
  90. spinlock_t cq_lock; /* protect cq */
  91. u16 cq_count;
  92. u16 cq_period;
  93. struct ib_cq ib_cq;
  94. struct bnxt_qplib_cq qplib_cq;
  95. struct bnxt_qplib_cqe *cql;
  96. #define MAX_CQL_PER_POLL 1024
  97. u32 max_cql;
  98. struct ib_umem *umem;
  99. };
  100. struct bnxt_re_mr {
  101. struct bnxt_re_dev *rdev;
  102. struct ib_mr ib_mr;
  103. struct ib_umem *ib_umem;
  104. struct bnxt_qplib_mrw qplib_mr;
  105. u32 npages;
  106. u64 *pages;
  107. struct bnxt_qplib_frpl qplib_frpl;
  108. };
  109. struct bnxt_re_frpl {
  110. struct bnxt_re_dev *rdev;
  111. struct bnxt_qplib_frpl qplib_frpl;
  112. u64 *page_list;
  113. };
  114. struct bnxt_re_fmr {
  115. struct bnxt_re_dev *rdev;
  116. struct ib_fmr ib_fmr;
  117. struct bnxt_qplib_mrw qplib_fmr;
  118. };
  119. struct bnxt_re_mw {
  120. struct bnxt_re_dev *rdev;
  121. struct ib_mw ib_mw;
  122. struct bnxt_qplib_mrw qplib_mw;
  123. };
  124. struct bnxt_re_ucontext {
  125. struct bnxt_re_dev *rdev;
  126. struct ib_ucontext ib_uctx;
  127. struct bnxt_qplib_dpi dpi;
  128. void *shpg;
  129. spinlock_t sh_lock; /* protect shpg */
  130. };
  131. struct net_device *bnxt_re_get_netdev(struct ib_device *ibdev, u8 port_num);
  132. int bnxt_re_query_device(struct ib_device *ibdev,
  133. struct ib_device_attr *ib_attr,
  134. struct ib_udata *udata);
  135. int bnxt_re_modify_device(struct ib_device *ibdev,
  136. int device_modify_mask,
  137. struct ib_device_modify *device_modify);
  138. int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num,
  139. struct ib_port_attr *port_attr);
  140. int bnxt_re_get_port_immutable(struct ib_device *ibdev, u8 port_num,
  141. struct ib_port_immutable *immutable);
  142. void bnxt_re_query_fw_str(struct ib_device *ibdev, char *str);
  143. int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num,
  144. u16 index, u16 *pkey);
  145. int bnxt_re_del_gid(const struct ib_gid_attr *attr, void **context);
  146. int bnxt_re_add_gid(const struct ib_gid_attr *attr, void **context);
  147. int bnxt_re_query_gid(struct ib_device *ibdev, u8 port_num,
  148. int index, union ib_gid *gid);
  149. enum rdma_link_layer bnxt_re_get_link_layer(struct ib_device *ibdev,
  150. u8 port_num);
  151. struct ib_pd *bnxt_re_alloc_pd(struct ib_device *ibdev,
  152. struct ib_ucontext *context,
  153. struct ib_udata *udata);
  154. int bnxt_re_dealloc_pd(struct ib_pd *pd);
  155. struct ib_ah *bnxt_re_create_ah(struct ib_pd *pd,
  156. struct rdma_ah_attr *ah_attr,
  157. struct ib_udata *udata);
  158. int bnxt_re_modify_ah(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
  159. int bnxt_re_query_ah(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
  160. int bnxt_re_destroy_ah(struct ib_ah *ah);
  161. struct ib_srq *bnxt_re_create_srq(struct ib_pd *pd,
  162. struct ib_srq_init_attr *srq_init_attr,
  163. struct ib_udata *udata);
  164. int bnxt_re_modify_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr,
  165. enum ib_srq_attr_mask srq_attr_mask,
  166. struct ib_udata *udata);
  167. int bnxt_re_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
  168. int bnxt_re_destroy_srq(struct ib_srq *srq);
  169. int bnxt_re_post_srq_recv(struct ib_srq *srq, const struct ib_recv_wr *recv_wr,
  170. const struct ib_recv_wr **bad_recv_wr);
  171. struct ib_qp *bnxt_re_create_qp(struct ib_pd *pd,
  172. struct ib_qp_init_attr *qp_init_attr,
  173. struct ib_udata *udata);
  174. int bnxt_re_modify_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
  175. int qp_attr_mask, struct ib_udata *udata);
  176. int bnxt_re_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
  177. int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);
  178. int bnxt_re_destroy_qp(struct ib_qp *qp);
  179. int bnxt_re_post_send(struct ib_qp *qp, const struct ib_send_wr *send_wr,
  180. const struct ib_send_wr **bad_send_wr);
  181. int bnxt_re_post_recv(struct ib_qp *qp, const struct ib_recv_wr *recv_wr,
  182. const struct ib_recv_wr **bad_recv_wr);
  183. struct ib_cq *bnxt_re_create_cq(struct ib_device *ibdev,
  184. const struct ib_cq_init_attr *attr,
  185. struct ib_ucontext *context,
  186. struct ib_udata *udata);
  187. int bnxt_re_destroy_cq(struct ib_cq *cq);
  188. int bnxt_re_poll_cq(struct ib_cq *cq, int num_entries, struct ib_wc *wc);
  189. int bnxt_re_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags);
  190. struct ib_mr *bnxt_re_get_dma_mr(struct ib_pd *pd, int mr_access_flags);
  191. int bnxt_re_map_mr_sg(struct ib_mr *ib_mr, struct scatterlist *sg, int sg_nents,
  192. unsigned int *sg_offset);
  193. struct ib_mr *bnxt_re_alloc_mr(struct ib_pd *ib_pd, enum ib_mr_type mr_type,
  194. u32 max_num_sg);
  195. int bnxt_re_dereg_mr(struct ib_mr *mr);
  196. struct ib_mw *bnxt_re_alloc_mw(struct ib_pd *ib_pd, enum ib_mw_type type,
  197. struct ib_udata *udata);
  198. int bnxt_re_dealloc_mw(struct ib_mw *mw);
  199. struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
  200. u64 virt_addr, int mr_access_flags,
  201. struct ib_udata *udata);
  202. struct ib_ucontext *bnxt_re_alloc_ucontext(struct ib_device *ibdev,
  203. struct ib_udata *udata);
  204. int bnxt_re_dealloc_ucontext(struct ib_ucontext *context);
  205. int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
  206. unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp);
  207. void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp, unsigned long flags);
  208. #endif /* __BNXT_RE_IB_VERBS_H__ */