1 /* 2 * IBM eServer eHCA Infiniband device driver for Linux on POWER 3 * 4 * Function definitions for internal functions 5 * 6 * Authors: Heiko J Schick <schickhj@de.ibm.com> 7 * Dietmar Decker <ddecker@de.ibm.com> 8 * 9 * Copyright (c) 2005 IBM Corporation 10 * 11 * All rights reserved. 12 * 13 * This source code is distributed under a dual license of GPL v2.0 and OpenIB 14 * BSD. 15 * 16 * OpenIB BSD License 17 * 18 * Redistribution and use in source and binary forms, with or without 19 * modification, are permitted provided that the following conditions are met: 20 * 21 * Redistributions of source code must retain the above copyright notice, this 22 * list of conditions and the following disclaimer. 23 * 24 * Redistributions in binary form must reproduce the above copyright notice, 25 * this list of conditions and the following disclaimer in the documentation 26 * and/or other materials 27 * provided with the distribution. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 30 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 33 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 34 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 35 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 36 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 37 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 39 * POSSIBILITY OF SUCH DAMAGE. 40 */ 41 42 #ifndef __EHCA_IVERBS_H__ 43 #define __EHCA_IVERBS_H__ 44 45 #include "ehca_classes.h" 46 47 int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 48 struct ib_udata *uhw); 49 50 int ehca_query_port(struct ib_device *ibdev, u8 port, 51 struct ib_port_attr *props); 52 53 enum rdma_protocol_type 54 ehca_query_protocol(struct ib_device *device, u8 port_num); 55 56 int ehca_query_sma_attr(struct ehca_shca *shca, u8 port, 57 struct ehca_sma_attr *attr); 58 59 int ehca_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 * pkey); 60 61 int ehca_query_gid(struct ib_device *ibdev, u8 port, int index, 62 union ib_gid *gid); 63 64 int ehca_modify_port(struct ib_device *ibdev, u8 port, int port_modify_mask, 65 struct ib_port_modify *props); 66 67 struct ib_pd *ehca_alloc_pd(struct ib_device *device, 68 struct ib_ucontext *context, 69 struct ib_udata *udata); 70 71 int ehca_dealloc_pd(struct ib_pd *pd); 72 73 struct ib_ah *ehca_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr); 74 75 int ehca_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr); 76 77 int ehca_query_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr); 78 79 int ehca_destroy_ah(struct ib_ah *ah); 80 81 struct ib_mr *ehca_get_dma_mr(struct ib_pd *pd, int mr_access_flags); 82 83 struct ib_mr *ehca_reg_phys_mr(struct ib_pd *pd, 84 struct ib_phys_buf *phys_buf_array, 85 int num_phys_buf, 86 int mr_access_flags, u64 *iova_start); 87 88 struct ib_mr *ehca_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, 89 u64 virt, int mr_access_flags, 90 struct ib_udata *udata); 91 92 int ehca_rereg_phys_mr(struct ib_mr *mr, 93 int mr_rereg_mask, 94 struct ib_pd *pd, 95 struct ib_phys_buf *phys_buf_array, 96 int num_phys_buf, int mr_access_flags, u64 *iova_start); 97 98 int ehca_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr); 99 100 int ehca_dereg_mr(struct ib_mr *mr); 101 102 struct ib_mw *ehca_alloc_mw(struct ib_pd *pd, enum ib_mw_type type); 103 104 int ehca_bind_mw(struct ib_qp *qp, struct ib_mw *mw, 105 struct ib_mw_bind *mw_bind); 106 107 int ehca_dealloc_mw(struct ib_mw *mw); 108 109 struct ib_fmr *ehca_alloc_fmr(struct ib_pd *pd, 110 int mr_access_flags, 111 struct ib_fmr_attr *fmr_attr); 112 113 int ehca_map_phys_fmr(struct ib_fmr *fmr, 114 u64 *page_list, int list_len, u64 iova); 115 116 int ehca_unmap_fmr(struct list_head *fmr_list); 117 118 int ehca_dealloc_fmr(struct ib_fmr *fmr); 119 120 enum ehca_eq_type { 121 EHCA_EQ = 0, /* Event Queue */ 122 EHCA_NEQ /* Notification Event Queue */ 123 }; 124 125 int ehca_create_eq(struct ehca_shca *shca, struct ehca_eq *eq, 126 enum ehca_eq_type type, const u32 length); 127 128 int ehca_destroy_eq(struct ehca_shca *shca, struct ehca_eq *eq); 129 130 void *ehca_poll_eq(struct ehca_shca *shca, struct ehca_eq *eq); 131 132 133 struct ib_cq *ehca_create_cq(struct ib_device *device, 134 const struct ib_cq_init_attr *attr, 135 struct ib_ucontext *context, 136 struct ib_udata *udata); 137 138 int ehca_destroy_cq(struct ib_cq *cq); 139 140 int ehca_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata); 141 142 int ehca_poll_cq(struct ib_cq *cq, int num_entries, struct ib_wc *wc); 143 144 int ehca_peek_cq(struct ib_cq *cq, int wc_cnt); 145 146 int ehca_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags notify_flags); 147 148 struct ib_qp *ehca_create_qp(struct ib_pd *pd, 149 struct ib_qp_init_attr *init_attr, 150 struct ib_udata *udata); 151 152 int ehca_destroy_qp(struct ib_qp *qp); 153 154 int ehca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask, 155 struct ib_udata *udata); 156 157 int ehca_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr, 158 int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr); 159 160 int ehca_post_send(struct ib_qp *qp, struct ib_send_wr *send_wr, 161 struct ib_send_wr **bad_send_wr); 162 163 int ehca_post_recv(struct ib_qp *qp, struct ib_recv_wr *recv_wr, 164 struct ib_recv_wr **bad_recv_wr); 165 166 int ehca_post_srq_recv(struct ib_srq *srq, 167 struct ib_recv_wr *recv_wr, 168 struct ib_recv_wr **bad_recv_wr); 169 170 struct ib_srq *ehca_create_srq(struct ib_pd *pd, 171 struct ib_srq_init_attr *init_attr, 172 struct ib_udata *udata); 173 174 int ehca_modify_srq(struct ib_srq *srq, struct ib_srq_attr *attr, 175 enum ib_srq_attr_mask attr_mask, struct ib_udata *udata); 176 177 int ehca_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr); 178 179 int ehca_destroy_srq(struct ib_srq *srq); 180 181 u64 ehca_define_sqp(struct ehca_shca *shca, struct ehca_qp *ibqp, 182 struct ib_qp_init_attr *qp_init_attr); 183 184 int ehca_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid); 185 186 int ehca_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid); 187 188 struct ib_ucontext *ehca_alloc_ucontext(struct ib_device *device, 189 struct ib_udata *udata); 190 191 int ehca_dealloc_ucontext(struct ib_ucontext *context); 192 193 int ehca_mmap(struct ib_ucontext *context, struct vm_area_struct *vma); 194 195 int ehca_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, 196 const struct ib_wc *in_wc, const struct ib_grh *in_grh, 197 const struct ib_mad_hdr *in, size_t in_mad_size, 198 struct ib_mad_hdr *out, size_t *out_mad_size, 199 u16 *out_mad_pkey_index); 200 201 void ehca_poll_eqs(unsigned long data); 202 203 int ehca_calc_ipd(struct ehca_shca *shca, int port, 204 enum ib_rate path_rate, u32 *ipd); 205 206 void ehca_add_to_err_list(struct ehca_qp *qp, int on_sq); 207 208 #ifdef CONFIG_PPC_64K_PAGES 209 void *ehca_alloc_fw_ctrlblock(gfp_t flags); 210 void ehca_free_fw_ctrlblock(void *ptr); 211 #else 212 #define ehca_alloc_fw_ctrlblock(flags) ((void *)get_zeroed_page(flags)) 213 #define ehca_free_fw_ctrlblock(ptr) free_page((unsigned long)(ptr)) 214 #endif 215 216 void ehca_recover_sqp(struct ib_qp *sqp); 217 218 #endif 219