1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#ifndef MTHCA_PROVIDER_H
38#define MTHCA_PROVIDER_H
39
40#include <rdma/ib_verbs.h>
41#include <rdma/ib_pack.h>
42
43#define MTHCA_MPT_FLAG_ATOMIC (1 << 14)
44#define MTHCA_MPT_FLAG_REMOTE_WRITE (1 << 13)
45#define MTHCA_MPT_FLAG_REMOTE_READ (1 << 12)
46#define MTHCA_MPT_FLAG_LOCAL_WRITE (1 << 11)
47#define MTHCA_MPT_FLAG_LOCAL_READ (1 << 10)
48
49struct mthca_buf_list {
50 void *buf;
51 DECLARE_PCI_UNMAP_ADDR(mapping)
52};
53
54union mthca_buf {
55 struct mthca_buf_list direct;
56 struct mthca_buf_list *page_list;
57};
58
59struct mthca_uar {
60 unsigned long pfn;
61 int index;
62};
63
64struct mthca_user_db_table;
65
66struct mthca_ucontext {
67 struct ib_ucontext ibucontext;
68 struct mthca_uar uar;
69 struct mthca_user_db_table *db_tab;
70};
71
72struct mthca_mtt;
73
74struct mthca_mr {
75 struct ib_mr ibmr;
76 struct mthca_mtt *mtt;
77};
78
79struct mthca_fmr {
80 struct ib_fmr ibmr;
81 struct ib_fmr_attr attr;
82 struct mthca_mtt *mtt;
83 int maps;
84 union {
85 struct {
86 struct mthca_mpt_entry __iomem *mpt;
87 u64 __iomem *mtts;
88 } tavor;
89 struct {
90 struct mthca_mpt_entry *mpt;
91 __be64 *mtts;
92 } arbel;
93 } mem;
94};
95
96struct mthca_pd {
97 struct ib_pd ibpd;
98 u32 pd_num;
99 atomic_t sqp_count;
100 struct mthca_mr ntmr;
101 int privileged;
102};
103
104struct mthca_eq {
105 struct mthca_dev *dev;
106 int eqn;
107 u32 eqn_mask;
108 u32 cons_index;
109 u16 msi_x_vector;
110 u16 msi_x_entry;
111 int have_irq;
112 int nent;
113 struct mthca_buf_list *page_list;
114 struct mthca_mr mr;
115};
116
117struct mthca_av;
118
119enum mthca_ah_type {
120 MTHCA_AH_ON_HCA,
121 MTHCA_AH_PCI_POOL,
122 MTHCA_AH_KMALLOC
123};
124
125struct mthca_ah {
126 struct ib_ah ibah;
127 enum mthca_ah_type type;
128 u32 key;
129 struct mthca_av *av;
130 dma_addr_t avdma;
131};
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183struct mthca_cq_buf {
184 union mthca_buf queue;
185 struct mthca_mr mr;
186 int is_direct;
187};
188
189struct mthca_cq_resize {
190 struct mthca_cq_buf buf;
191 int cqe;
192 enum {
193 CQ_RESIZE_ALLOC,
194 CQ_RESIZE_READY,
195 CQ_RESIZE_SWAPPED
196 } state;
197};
198
199struct mthca_cq {
200 struct ib_cq ibcq;
201 spinlock_t lock;
202 int refcount;
203 int cqn;
204 u32 cons_index;
205 struct mthca_cq_buf buf;
206 struct mthca_cq_resize *resize_buf;
207 int is_kernel;
208
209
210 int set_ci_db_index;
211 __be32 *set_ci_db;
212 int arm_db_index;
213 __be32 *arm_db;
214 int arm_sn;
215
216 wait_queue_head_t wait;
217 struct mutex mutex;
218};
219
220struct mthca_srq {
221 struct ib_srq ibsrq;
222 spinlock_t lock;
223 int refcount;
224 int srqn;
225 int max;
226 int max_gs;
227 int wqe_shift;
228 int first_free;
229 int last_free;
230 u16 counter;
231 int db_index;
232 __be32 *db;
233 void *last;
234
235 int is_direct;
236 u64 *wrid;
237 union mthca_buf queue;
238 struct mthca_mr mr;
239
240 wait_queue_head_t wait;
241 struct mutex mutex;
242};
243
244struct mthca_wq {
245 spinlock_t lock;
246 int max;
247 unsigned next_ind;
248 unsigned last_comp;
249 unsigned head;
250 unsigned tail;
251 void *last;
252 int max_gs;
253 int wqe_shift;
254
255 int db_index;
256 __be32 *db;
257};
258
259struct mthca_qp {
260 struct ib_qp ibqp;
261 int refcount;
262 u32 qpn;
263 int is_direct;
264 u8 port;
265 u8 alt_port;
266 u8 transport;
267 u8 state;
268 u8 atomic_rd_en;
269 u8 resp_depth;
270
271 struct mthca_mr mr;
272
273 struct mthca_wq rq;
274 struct mthca_wq sq;
275 enum ib_sig_type sq_policy;
276 int send_wqe_offset;
277 int max_inline_data;
278
279 u64 *wrid;
280 union mthca_buf queue;
281
282 wait_queue_head_t wait;
283 struct mutex mutex;
284};
285
286struct mthca_sqp {
287 struct mthca_qp qp;
288 int pkey_index;
289 u32 qkey;
290 u32 send_psn;
291 struct ib_ud_header ud_header;
292 int header_buf_size;
293 void *header_buf;
294 dma_addr_t header_dma;
295};
296
297static inline struct mthca_ucontext *to_mucontext(struct ib_ucontext *ibucontext)
298{
299 return container_of(ibucontext, struct mthca_ucontext, ibucontext);
300}
301
302static inline struct mthca_fmr *to_mfmr(struct ib_fmr *ibmr)
303{
304 return container_of(ibmr, struct mthca_fmr, ibmr);
305}
306
307static inline struct mthca_mr *to_mmr(struct ib_mr *ibmr)
308{
309 return container_of(ibmr, struct mthca_mr, ibmr);
310}
311
312static inline struct mthca_pd *to_mpd(struct ib_pd *ibpd)
313{
314 return container_of(ibpd, struct mthca_pd, ibpd);
315}
316
317static inline struct mthca_ah *to_mah(struct ib_ah *ibah)
318{
319 return container_of(ibah, struct mthca_ah, ibah);
320}
321
322static inline struct mthca_cq *to_mcq(struct ib_cq *ibcq)
323{
324 return container_of(ibcq, struct mthca_cq, ibcq);
325}
326
327static inline struct mthca_srq *to_msrq(struct ib_srq *ibsrq)
328{
329 return container_of(ibsrq, struct mthca_srq, ibsrq);
330}
331
332static inline struct mthca_qp *to_mqp(struct ib_qp *ibqp)
333{
334 return container_of(ibqp, struct mthca_qp, ibqp);
335}
336
337static inline struct mthca_sqp *to_msqp(struct mthca_qp *qp)
338{
339 return container_of(qp, struct mthca_sqp, qp);
340}
341
342#endif
343