diff options
author | Bryan O'Sullivan <bos@pathscale.com> | 2006-03-29 18:23:33 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2006-03-31 16:14:20 -0500 |
commit | aa735edf5dffbe43463c3d1218912fa54a8ec724 (patch) | |
tree | f5ac10f3ff06a3e7dfc6a2e68be0064fbd8a1847 /drivers/infiniband/hw/ipath/ipath_verbs.h | |
parent | 889ab795a34247c8085e65648051e34f9fec952c (diff) |
IB/ipath: infiniband header files
These header files are used by the layered Infiniband driver.
Signed-off-by: Bryan O'Sullivan <bos@pathscale.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/ipath/ipath_verbs.h')
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_verbs.h | 697 |
1 files changed, 697 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.h b/drivers/infiniband/hw/ipath/ipath_verbs.h new file mode 100644 index 000000000000..b824632b2a8c --- /dev/null +++ b/drivers/infiniband/hw/ipath/ipath_verbs.h | |||
@@ -0,0 +1,697 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. | ||
3 | * | ||
4 | * This software is available to you under a choice of one of two | ||
5 | * licenses. You may choose to be licensed under the terms of the GNU | ||
6 | * General Public License (GPL) Version 2, available from the file | ||
7 | * COPYING in the main directory of this source tree, or the | ||
8 | * OpenIB.org BSD license below: | ||
9 | * | ||
10 | * Redistribution and use in source and binary forms, with or | ||
11 | * without modification, are permitted provided that the following | ||
12 | * conditions are met: | ||
13 | * | ||
14 | * - Redistributions of source code must retain the above | ||
15 | * copyright notice, this list of conditions and the following | ||
16 | * disclaimer. | ||
17 | * | ||
18 | * - Redistributions in binary form must reproduce the above | ||
19 | * copyright notice, this list of conditions and the following | ||
20 | * disclaimer in the documentation and/or other materials | ||
21 | * provided with the distribution. | ||
22 | * | ||
23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
24 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
25 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
26 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | ||
27 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
28 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||
29 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
30 | * SOFTWARE. | ||
31 | */ | ||
32 | |||
33 | #ifndef IPATH_VERBS_H | ||
34 | #define IPATH_VERBS_H | ||
35 | |||
36 | #include <linux/types.h> | ||
37 | #include <linux/spinlock.h> | ||
38 | #include <linux/kernel.h> | ||
39 | #include <linux/interrupt.h> | ||
40 | #include <rdma/ib_pack.h> | ||
41 | |||
42 | #include "ipath_layer.h" | ||
43 | #include "verbs_debug.h" | ||
44 | |||
45 | #define QPN_MAX (1 << 24) | ||
46 | #define QPNMAP_ENTRIES (QPN_MAX / PAGE_SIZE / BITS_PER_BYTE) | ||
47 | |||
48 | /* | ||
49 | * Increment this value if any changes that break userspace ABI | ||
50 | * compatibility are made. | ||
51 | */ | ||
52 | #define IPATH_UVERBS_ABI_VERSION 1 | ||
53 | |||
54 | /* | ||
55 | * Define an ib_cq_notify value that is not valid so we know when CQ | ||
56 | * notifications are armed. | ||
57 | */ | ||
58 | #define IB_CQ_NONE (IB_CQ_NEXT_COMP + 1) | ||
59 | |||
60 | #define IB_RNR_NAK 0x20 | ||
61 | #define IB_NAK_PSN_ERROR 0x60 | ||
62 | #define IB_NAK_INVALID_REQUEST 0x61 | ||
63 | #define IB_NAK_REMOTE_ACCESS_ERROR 0x62 | ||
64 | #define IB_NAK_REMOTE_OPERATIONAL_ERROR 0x63 | ||
65 | #define IB_NAK_INVALID_RD_REQUEST 0x64 | ||
66 | |||
67 | #define IPATH_POST_SEND_OK 0x01 | ||
68 | #define IPATH_POST_RECV_OK 0x02 | ||
69 | #define IPATH_PROCESS_RECV_OK 0x04 | ||
70 | #define IPATH_PROCESS_SEND_OK 0x08 | ||
71 | |||
72 | /* IB Performance Manager status values */ | ||
73 | #define IB_PMA_SAMPLE_STATUS_DONE 0x00 | ||
74 | #define IB_PMA_SAMPLE_STATUS_STARTED 0x01 | ||
75 | #define IB_PMA_SAMPLE_STATUS_RUNNING 0x02 | ||
76 | |||
77 | /* Mandatory IB performance counter select values. */ | ||
78 | #define IB_PMA_PORT_XMIT_DATA __constant_htons(0x0001) | ||
79 | #define IB_PMA_PORT_RCV_DATA __constant_htons(0x0002) | ||
80 | #define IB_PMA_PORT_XMIT_PKTS __constant_htons(0x0003) | ||
81 | #define IB_PMA_PORT_RCV_PKTS __constant_htons(0x0004) | ||
82 | #define IB_PMA_PORT_XMIT_WAIT __constant_htons(0x0005) | ||
83 | |||
84 | struct ib_reth { | ||
85 | __be64 vaddr; | ||
86 | __be32 rkey; | ||
87 | __be32 length; | ||
88 | } __attribute__ ((packed)); | ||
89 | |||
90 | struct ib_atomic_eth { | ||
91 | __be64 vaddr; | ||
92 | __be32 rkey; | ||
93 | __be64 swap_data; | ||
94 | __be64 compare_data; | ||
95 | } __attribute__ ((packed)); | ||
96 | |||
97 | struct ipath_other_headers { | ||
98 | __be32 bth[3]; | ||
99 | union { | ||
100 | struct { | ||
101 | __be32 deth[2]; | ||
102 | __be32 imm_data; | ||
103 | } ud; | ||
104 | struct { | ||
105 | struct ib_reth reth; | ||
106 | __be32 imm_data; | ||
107 | } rc; | ||
108 | struct { | ||
109 | __be32 aeth; | ||
110 | __be64 atomic_ack_eth; | ||
111 | } at; | ||
112 | __be32 imm_data; | ||
113 | __be32 aeth; | ||
114 | struct ib_atomic_eth atomic_eth; | ||
115 | } u; | ||
116 | } __attribute__ ((packed)); | ||
117 | |||
118 | /* | ||
119 | * Note that UD packets with a GRH header are 8+40+12+8 = 68 bytes | ||
120 | * long (72 w/ imm_data). Only the first 56 bytes of the IB header | ||
121 | * will be in the eager header buffer. The remaining 12 or 16 bytes | ||
122 | * are in the data buffer. | ||
123 | */ | ||
124 | struct ipath_ib_header { | ||
125 | __be16 lrh[4]; | ||
126 | union { | ||
127 | struct { | ||
128 | struct ib_grh grh; | ||
129 | struct ipath_other_headers oth; | ||
130 | } l; | ||
131 | struct ipath_other_headers oth; | ||
132 | } u; | ||
133 | } __attribute__ ((packed)); | ||
134 | |||
135 | /* | ||
136 | * There is one struct ipath_mcast for each multicast GID. | ||
137 | * All attached QPs are then stored as a list of | ||
138 | * struct ipath_mcast_qp. | ||
139 | */ | ||
140 | struct ipath_mcast_qp { | ||
141 | struct list_head list; | ||
142 | struct ipath_qp *qp; | ||
143 | }; | ||
144 | |||
145 | struct ipath_mcast { | ||
146 | struct rb_node rb_node; | ||
147 | union ib_gid mgid; | ||
148 | struct list_head qp_list; | ||
149 | wait_queue_head_t wait; | ||
150 | atomic_t refcount; | ||
151 | }; | ||
152 | |||
153 | /* Memory region */ | ||
154 | struct ipath_mr { | ||
155 | struct ib_mr ibmr; | ||
156 | struct ipath_mregion mr; /* must be last */ | ||
157 | }; | ||
158 | |||
159 | /* Fast memory region */ | ||
160 | struct ipath_fmr { | ||
161 | struct ib_fmr ibfmr; | ||
162 | u8 page_shift; | ||
163 | struct ipath_mregion mr; /* must be last */ | ||
164 | }; | ||
165 | |||
166 | /* Protection domain */ | ||
167 | struct ipath_pd { | ||
168 | struct ib_pd ibpd; | ||
169 | int user; /* non-zero if created from user space */ | ||
170 | }; | ||
171 | |||
172 | /* Address Handle */ | ||
173 | struct ipath_ah { | ||
174 | struct ib_ah ibah; | ||
175 | struct ib_ah_attr attr; | ||
176 | }; | ||
177 | |||
178 | /* | ||
179 | * Quick description of our CQ/QP locking scheme: | ||
180 | * | ||
181 | * We have one global lock that protects dev->cq/qp_table. Each | ||
182 | * struct ipath_cq/qp also has its own lock. An individual qp lock | ||
183 | * may be taken inside of an individual cq lock. Both cqs attached to | ||
184 | * a qp may be locked, with the send cq locked first. No other | ||
185 | * nesting should be done. | ||
186 | * | ||
187 | * Each struct ipath_cq/qp also has an atomic_t ref count. The | ||
188 | * pointer from the cq/qp_table to the struct counts as one reference. | ||
189 | * This reference also is good for access through the consumer API, so | ||
190 | * modifying the CQ/QP etc doesn't need to take another reference. | ||
191 | * Access because of a completion being polled does need a reference. | ||
192 | * | ||
193 | * Finally, each struct ipath_cq/qp has a wait_queue_head_t for the | ||
194 | * destroy function to sleep on. | ||
195 | * | ||
196 | * This means that access from the consumer API requires nothing but | ||
197 | * taking the struct's lock. | ||
198 | * | ||
199 | * Access because of a completion event should go as follows: | ||
200 | * - lock cq/qp_table and look up struct | ||
201 | * - increment ref count in struct | ||
202 | * - drop cq/qp_table lock | ||
203 | * - lock struct, do your thing, and unlock struct | ||
204 | * - decrement ref count; if zero, wake up waiters | ||
205 | * | ||
206 | * To destroy a CQ/QP, we can do the following: | ||
207 | * - lock cq/qp_table, remove pointer, unlock cq/qp_table lock | ||
208 | * - decrement ref count | ||
209 | * - wait_event until ref count is zero | ||
210 | * | ||
211 | * It is the consumer's responsibilty to make sure that no QP | ||
212 | * operations (WQE posting or state modification) are pending when the | ||
213 | * QP is destroyed. Also, the consumer must make sure that calls to | ||
214 | * qp_modify are serialized. | ||
215 | * | ||
216 | * Possible optimizations (wait for profile data to see if/where we | ||
217 | * have locks bouncing between CPUs): | ||
218 | * - split cq/qp table lock into n separate (cache-aligned) locks, | ||
219 | * indexed (say) by the page in the table | ||
220 | */ | ||
221 | |||
222 | struct ipath_cq { | ||
223 | struct ib_cq ibcq; | ||
224 | struct tasklet_struct comptask; | ||
225 | spinlock_t lock; | ||
226 | u8 notify; | ||
227 | u8 triggered; | ||
228 | u32 head; /* new records added to the head */ | ||
229 | u32 tail; /* poll_cq() reads from here. */ | ||
230 | struct ib_wc *queue; /* this is actually ibcq.cqe + 1 */ | ||
231 | }; | ||
232 | |||
233 | /* | ||
234 | * Send work request queue entry. | ||
235 | * The size of the sg_list is determined when the QP is created and stored | ||
236 | * in qp->s_max_sge. | ||
237 | */ | ||
238 | struct ipath_swqe { | ||
239 | struct ib_send_wr wr; /* don't use wr.sg_list */ | ||
240 | u32 psn; /* first packet sequence number */ | ||
241 | u32 lpsn; /* last packet sequence number */ | ||
242 | u32 ssn; /* send sequence number */ | ||
243 | u32 length; /* total length of data in sg_list */ | ||
244 | struct ipath_sge sg_list[0]; | ||
245 | }; | ||
246 | |||
247 | /* | ||
248 | * Receive work request queue entry. | ||
249 | * The size of the sg_list is determined when the QP is created and stored | ||
250 | * in qp->r_max_sge. | ||
251 | */ | ||
252 | struct ipath_rwqe { | ||
253 | u64 wr_id; | ||
254 | u32 length; /* total length of data in sg_list */ | ||
255 | u8 num_sge; | ||
256 | struct ipath_sge sg_list[0]; | ||
257 | }; | ||
258 | |||
259 | struct ipath_rq { | ||
260 | spinlock_t lock; | ||
261 | u32 head; /* new work requests posted to the head */ | ||
262 | u32 tail; /* receives pull requests from here. */ | ||
263 | u32 size; /* size of RWQE array */ | ||
264 | u8 max_sge; | ||
265 | struct ipath_rwqe *wq; /* RWQE array */ | ||
266 | }; | ||
267 | |||
268 | struct ipath_srq { | ||
269 | struct ib_srq ibsrq; | ||
270 | struct ipath_rq rq; | ||
271 | /* send signal when number of RWQEs < limit */ | ||
272 | u32 limit; | ||
273 | }; | ||
274 | |||
275 | /* | ||
276 | * Variables prefixed with s_ are for the requester (sender). | ||
277 | * Variables prefixed with r_ are for the responder (receiver). | ||
278 | * Variables prefixed with ack_ are for responder replies. | ||
279 | * | ||
280 | * Common variables are protected by both r_rq.lock and s_lock in that order | ||
281 | * which only happens in modify_qp() or changing the QP 'state'. | ||
282 | */ | ||
283 | struct ipath_qp { | ||
284 | struct ib_qp ibqp; | ||
285 | struct ipath_qp *next; /* link list for QPN hash table */ | ||
286 | struct list_head piowait; /* link for wait PIO buf */ | ||
287 | struct list_head timerwait; /* link for waiting for timeouts */ | ||
288 | struct ib_ah_attr remote_ah_attr; | ||
289 | struct ipath_ib_header s_hdr; /* next packet header to send */ | ||
290 | atomic_t refcount; | ||
291 | wait_queue_head_t wait; | ||
292 | struct tasklet_struct s_task; | ||
293 | struct ipath_sge_state *s_cur_sge; | ||
294 | struct ipath_sge_state s_sge; /* current send request data */ | ||
295 | /* current RDMA read send data */ | ||
296 | struct ipath_sge_state s_rdma_sge; | ||
297 | struct ipath_sge_state r_sge; /* current receive data */ | ||
298 | spinlock_t s_lock; | ||
299 | unsigned long s_flags; | ||
300 | u32 s_hdrwords; /* size of s_hdr in 32 bit words */ | ||
301 | u32 s_cur_size; /* size of send packet in bytes */ | ||
302 | u32 s_len; /* total length of s_sge */ | ||
303 | u32 s_rdma_len; /* total length of s_rdma_sge */ | ||
304 | u32 s_next_psn; /* PSN for next request */ | ||
305 | u32 s_last_psn; /* last response PSN processed */ | ||
306 | u32 s_psn; /* current packet sequence number */ | ||
307 | u32 s_rnr_timeout; /* number of milliseconds for RNR timeout */ | ||
308 | u32 s_ack_psn; /* PSN for next ACK or RDMA_READ */ | ||
309 | u64 s_ack_atomic; /* data for atomic ACK */ | ||
310 | u64 r_wr_id; /* ID for current receive WQE */ | ||
311 | u64 r_atomic_data; /* data for last atomic op */ | ||
312 | u32 r_atomic_psn; /* PSN of last atomic op */ | ||
313 | u32 r_len; /* total length of r_sge */ | ||
314 | u32 r_rcv_len; /* receive data len processed */ | ||
315 | u32 r_psn; /* expected rcv packet sequence number */ | ||
316 | u8 state; /* QP state */ | ||
317 | u8 s_state; /* opcode of last packet sent */ | ||
318 | u8 s_ack_state; /* opcode of packet to ACK */ | ||
319 | u8 s_nak_state; /* non-zero if NAK is pending */ | ||
320 | u8 r_state; /* opcode of last packet received */ | ||
321 | u8 r_reuse_sge; /* for UC receive errors */ | ||
322 | u8 r_sge_inx; /* current index into sg_list */ | ||
323 | u8 s_max_sge; /* size of s_wq->sg_list */ | ||
324 | u8 qp_access_flags; | ||
325 | u8 s_retry_cnt; /* number of times to retry */ | ||
326 | u8 s_rnr_retry_cnt; | ||
327 | u8 s_min_rnr_timer; | ||
328 | u8 s_retry; /* requester retry counter */ | ||
329 | u8 s_rnr_retry; /* requester RNR retry counter */ | ||
330 | u8 s_pkey_index; /* PKEY index to use */ | ||
331 | enum ib_mtu path_mtu; | ||
332 | atomic_t msn; /* message sequence number */ | ||
333 | u32 remote_qpn; | ||
334 | u32 qkey; /* QKEY for this QP (for UD or RD) */ | ||
335 | u32 s_size; /* send work queue size */ | ||
336 | u32 s_head; /* new entries added here */ | ||
337 | u32 s_tail; /* next entry to process */ | ||
338 | u32 s_cur; /* current work queue entry */ | ||
339 | u32 s_last; /* last un-ACK'ed entry */ | ||
340 | u32 s_ssn; /* SSN of tail entry */ | ||
341 | u32 s_lsn; /* limit sequence number (credit) */ | ||
342 | struct ipath_swqe *s_wq; /* send work queue */ | ||
343 | struct ipath_rq r_rq; /* receive work queue */ | ||
344 | }; | ||
345 | |||
346 | /* | ||
347 | * Bit definitions for s_flags. | ||
348 | */ | ||
349 | #define IPATH_S_BUSY 0 | ||
350 | #define IPATH_S_SIGNAL_REQ_WR 1 | ||
351 | |||
352 | /* | ||
353 | * Since struct ipath_swqe is not a fixed size, we can't simply index into | ||
354 | * struct ipath_qp.s_wq. This function does the array index computation. | ||
355 | */ | ||
356 | static inline struct ipath_swqe *get_swqe_ptr(struct ipath_qp *qp, | ||
357 | unsigned n) | ||
358 | { | ||
359 | return (struct ipath_swqe *)((char *)qp->s_wq + | ||
360 | (sizeof(struct ipath_swqe) + | ||
361 | qp->s_max_sge * | ||
362 | sizeof(struct ipath_sge)) * n); | ||
363 | } | ||
364 | |||
365 | /* | ||
366 | * Since struct ipath_rwqe is not a fixed size, we can't simply index into | ||
367 | * struct ipath_rq.wq. This function does the array index computation. | ||
368 | */ | ||
369 | static inline struct ipath_rwqe *get_rwqe_ptr(struct ipath_rq *rq, | ||
370 | unsigned n) | ||
371 | { | ||
372 | return (struct ipath_rwqe *) | ||
373 | ((char *) rq->wq + | ||
374 | (sizeof(struct ipath_rwqe) + | ||
375 | rq->max_sge * sizeof(struct ipath_sge)) * n); | ||
376 | } | ||
377 | |||
378 | /* | ||
379 | * QPN-map pages start out as NULL, they get allocated upon | ||
380 | * first use and are never deallocated. This way, | ||
381 | * large bitmaps are not allocated unless large numbers of QPs are used. | ||
382 | */ | ||
383 | struct qpn_map { | ||
384 | atomic_t n_free; | ||
385 | void *page; | ||
386 | }; | ||
387 | |||
388 | struct ipath_qp_table { | ||
389 | spinlock_t lock; | ||
390 | u32 last; /* last QP number allocated */ | ||
391 | u32 max; /* size of the hash table */ | ||
392 | u32 nmaps; /* size of the map table */ | ||
393 | struct ipath_qp **table; | ||
394 | /* bit map of free numbers */ | ||
395 | struct qpn_map map[QPNMAP_ENTRIES]; | ||
396 | }; | ||
397 | |||
398 | struct ipath_lkey_table { | ||
399 | spinlock_t lock; | ||
400 | u32 next; /* next unused index (speeds search) */ | ||
401 | u32 gen; /* generation count */ | ||
402 | u32 max; /* size of the table */ | ||
403 | struct ipath_mregion **table; | ||
404 | }; | ||
405 | |||
406 | struct ipath_opcode_stats { | ||
407 | u64 n_packets; /* number of packets */ | ||
408 | u64 n_bytes; /* total number of bytes */ | ||
409 | }; | ||
410 | |||
411 | struct ipath_ibdev { | ||
412 | struct ib_device ibdev; | ||
413 | struct list_head dev_list; | ||
414 | struct ipath_devdata *dd; | ||
415 | int ib_unit; /* This is the device number */ | ||
416 | u16 sm_lid; /* in host order */ | ||
417 | u8 sm_sl; | ||
418 | u8 mkeyprot_resv_lmc; | ||
419 | /* non-zero when timer is set */ | ||
420 | unsigned long mkey_lease_timeout; | ||
421 | |||
422 | /* The following fields are really per port. */ | ||
423 | struct ipath_qp_table qp_table; | ||
424 | struct ipath_lkey_table lk_table; | ||
425 | struct list_head pending[3]; /* FIFO of QPs waiting for ACKs */ | ||
426 | struct list_head piowait; /* list for wait PIO buf */ | ||
427 | /* list of QPs waiting for RNR timer */ | ||
428 | struct list_head rnrwait; | ||
429 | spinlock_t pending_lock; | ||
430 | __be64 sys_image_guid; /* in network order */ | ||
431 | __be64 gid_prefix; /* in network order */ | ||
432 | __be64 mkey; | ||
433 | u64 ipath_sword; /* total dwords sent (sample result) */ | ||
434 | u64 ipath_rword; /* total dwords received (sample result) */ | ||
435 | u64 ipath_spkts; /* total packets sent (sample result) */ | ||
436 | u64 ipath_rpkts; /* total packets received (sample result) */ | ||
437 | /* # of ticks no data sent (sample result) */ | ||
438 | u64 ipath_xmit_wait; | ||
439 | u64 rcv_errors; /* # of packets with SW detected rcv errs */ | ||
440 | u64 n_unicast_xmit; /* total unicast packets sent */ | ||
441 | u64 n_unicast_rcv; /* total unicast packets received */ | ||
442 | u64 n_multicast_xmit; /* total multicast packets sent */ | ||
443 | u64 n_multicast_rcv; /* total multicast packets received */ | ||
444 | u64 n_symbol_error_counter; /* starting count for PMA */ | ||
445 | u64 n_link_error_recovery_counter; /* starting count for PMA */ | ||
446 | u64 n_link_downed_counter; /* starting count for PMA */ | ||
447 | u64 n_port_rcv_errors; /* starting count for PMA */ | ||
448 | u64 n_port_rcv_remphys_errors; /* starting count for PMA */ | ||
449 | u64 n_port_xmit_discards; /* starting count for PMA */ | ||
450 | u64 n_port_xmit_data; /* starting count for PMA */ | ||
451 | u64 n_port_rcv_data; /* starting count for PMA */ | ||
452 | u64 n_port_xmit_packets; /* starting count for PMA */ | ||
453 | u64 n_port_rcv_packets; /* starting count for PMA */ | ||
454 | u32 n_pkey_violations; /* starting count for PMA */ | ||
455 | u32 n_rc_resends; | ||
456 | u32 n_rc_acks; | ||
457 | u32 n_rc_qacks; | ||
458 | u32 n_seq_naks; | ||
459 | u32 n_rdma_seq; | ||
460 | u32 n_rnr_naks; | ||
461 | u32 n_other_naks; | ||
462 | u32 n_timeouts; | ||
463 | u32 n_pkt_drops; | ||
464 | u32 n_wqe_errs; | ||
465 | u32 n_rdma_dup_busy; | ||
466 | u32 n_piowait; | ||
467 | u32 n_no_piobuf; | ||
468 | u32 port_cap_flags; | ||
469 | u32 pma_sample_start; | ||
470 | u32 pma_sample_interval; | ||
471 | __be16 pma_counter_select[5]; | ||
472 | u16 pma_tag; | ||
473 | u16 qkey_violations; | ||
474 | u16 mkey_violations; | ||
475 | u16 mkey_lease_period; | ||
476 | u16 pending_index; /* which pending queue is active */ | ||
477 | u8 pma_sample_status; | ||
478 | u8 subnet_timeout; | ||
479 | u8 link_width_enabled; | ||
480 | u8 vl_high_limit; | ||
481 | struct ipath_opcode_stats opstats[128]; | ||
482 | }; | ||
483 | |||
484 | struct ipath_ucontext { | ||
485 | struct ib_ucontext ibucontext; | ||
486 | }; | ||
487 | |||
488 | static inline struct ipath_mr *to_imr(struct ib_mr *ibmr) | ||
489 | { | ||
490 | return container_of(ibmr, struct ipath_mr, ibmr); | ||
491 | } | ||
492 | |||
493 | static inline struct ipath_fmr *to_ifmr(struct ib_fmr *ibfmr) | ||
494 | { | ||
495 | return container_of(ibfmr, struct ipath_fmr, ibfmr); | ||
496 | } | ||
497 | |||
498 | static inline struct ipath_pd *to_ipd(struct ib_pd *ibpd) | ||
499 | { | ||
500 | return container_of(ibpd, struct ipath_pd, ibpd); | ||
501 | } | ||
502 | |||
503 | static inline struct ipath_ah *to_iah(struct ib_ah *ibah) | ||
504 | { | ||
505 | return container_of(ibah, struct ipath_ah, ibah); | ||
506 | } | ||
507 | |||
508 | static inline struct ipath_cq *to_icq(struct ib_cq *ibcq) | ||
509 | { | ||
510 | return container_of(ibcq, struct ipath_cq, ibcq); | ||
511 | } | ||
512 | |||
513 | static inline struct ipath_srq *to_isrq(struct ib_srq *ibsrq) | ||
514 | { | ||
515 | return container_of(ibsrq, struct ipath_srq, ibsrq); | ||
516 | } | ||
517 | |||
518 | static inline struct ipath_qp *to_iqp(struct ib_qp *ibqp) | ||
519 | { | ||
520 | return container_of(ibqp, struct ipath_qp, ibqp); | ||
521 | } | ||
522 | |||
523 | static inline struct ipath_ibdev *to_idev(struct ib_device *ibdev) | ||
524 | { | ||
525 | return container_of(ibdev, struct ipath_ibdev, ibdev); | ||
526 | } | ||
527 | |||
528 | int ipath_process_mad(struct ib_device *ibdev, | ||
529 | int mad_flags, | ||
530 | u8 port_num, | ||
531 | struct ib_wc *in_wc, | ||
532 | struct ib_grh *in_grh, | ||
533 | struct ib_mad *in_mad, struct ib_mad *out_mad); | ||
534 | |||
535 | static inline struct ipath_ucontext *to_iucontext(struct ib_ucontext | ||
536 | *ibucontext) | ||
537 | { | ||
538 | return container_of(ibucontext, struct ipath_ucontext, ibucontext); | ||
539 | } | ||
540 | |||
541 | /* | ||
542 | * Compare the lower 24 bits of the two values. | ||
543 | * Returns an integer <, ==, or > than zero. | ||
544 | */ | ||
545 | static inline int ipath_cmp24(u32 a, u32 b) | ||
546 | { | ||
547 | return (((int) a) - ((int) b)) << 8; | ||
548 | } | ||
549 | |||
550 | struct ipath_mcast *ipath_mcast_find(union ib_gid *mgid); | ||
551 | |||
552 | int ipath_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); | ||
553 | |||
554 | int ipath_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); | ||
555 | |||
556 | int ipath_mcast_tree_empty(void); | ||
557 | |||
558 | __be32 ipath_compute_aeth(struct ipath_qp *qp); | ||
559 | |||
560 | struct ipath_qp *ipath_lookup_qpn(struct ipath_qp_table *qpt, u32 qpn); | ||
561 | |||
562 | struct ib_qp *ipath_create_qp(struct ib_pd *ibpd, | ||
563 | struct ib_qp_init_attr *init_attr, | ||
564 | struct ib_udata *udata); | ||
565 | |||
566 | int ipath_destroy_qp(struct ib_qp *ibqp); | ||
567 | |||
568 | int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | ||
569 | int attr_mask); | ||
570 | |||
571 | int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | ||
572 | int attr_mask, struct ib_qp_init_attr *init_attr); | ||
573 | |||
574 | void ipath_free_all_qps(struct ipath_qp_table *qpt); | ||
575 | |||
576 | int ipath_init_qp_table(struct ipath_ibdev *idev, int size); | ||
577 | |||
578 | void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc); | ||
579 | |||
580 | void ipath_error_qp(struct ipath_qp *qp); | ||
581 | |||
582 | void ipath_get_credit(struct ipath_qp *qp, u32 aeth); | ||
583 | |||
584 | void ipath_do_rc_send(unsigned long data); | ||
585 | |||
586 | void ipath_do_uc_send(unsigned long data); | ||
587 | |||
588 | void ipath_cq_enter(struct ipath_cq *cq, struct ib_wc *entry, int sig); | ||
589 | |||
590 | int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss, | ||
591 | u32 len, u64 vaddr, u32 rkey, int acc); | ||
592 | |||
593 | int ipath_lkey_ok(struct ipath_lkey_table *rkt, struct ipath_sge *isge, | ||
594 | struct ib_sge *sge, int acc); | ||
595 | |||
596 | void ipath_copy_sge(struct ipath_sge_state *ss, void *data, u32 length); | ||
597 | |||
598 | void ipath_skip_sge(struct ipath_sge_state *ss, u32 length); | ||
599 | |||
600 | int ipath_post_rc_send(struct ipath_qp *qp, struct ib_send_wr *wr); | ||
601 | |||
602 | void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | ||
603 | int has_grh, void *data, u32 tlen, struct ipath_qp *qp); | ||
604 | |||
605 | void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | ||
606 | int has_grh, void *data, u32 tlen, struct ipath_qp *qp); | ||
607 | |||
608 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc); | ||
609 | |||
610 | void ipath_ud_loopback(struct ipath_qp *sqp, struct ipath_sge_state *ss, | ||
611 | u32 length, struct ib_send_wr *wr, struct ib_wc *wc); | ||
612 | |||
613 | int ipath_post_ud_send(struct ipath_qp *qp, struct ib_send_wr *wr); | ||
614 | |||
615 | void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | ||
616 | int has_grh, void *data, u32 tlen, struct ipath_qp *qp); | ||
617 | |||
618 | int ipath_alloc_lkey(struct ipath_lkey_table *rkt, | ||
619 | struct ipath_mregion *mr); | ||
620 | |||
621 | void ipath_free_lkey(struct ipath_lkey_table *rkt, u32 lkey); | ||
622 | |||
623 | int ipath_lkey_ok(struct ipath_lkey_table *rkt, struct ipath_sge *isge, | ||
624 | struct ib_sge *sge, int acc); | ||
625 | |||
626 | int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss, | ||
627 | u32 len, u64 vaddr, u32 rkey, int acc); | ||
628 | |||
629 | int ipath_post_srq_receive(struct ib_srq *ibsrq, struct ib_recv_wr *wr, | ||
630 | struct ib_recv_wr **bad_wr); | ||
631 | |||
632 | struct ib_srq *ipath_create_srq(struct ib_pd *ibpd, | ||
633 | struct ib_srq_init_attr *srq_init_attr, | ||
634 | struct ib_udata *udata); | ||
635 | |||
636 | int ipath_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr, | ||
637 | enum ib_srq_attr_mask attr_mask); | ||
638 | |||
639 | int ipath_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr); | ||
640 | |||
641 | int ipath_destroy_srq(struct ib_srq *ibsrq); | ||
642 | |||
643 | void ipath_cq_enter(struct ipath_cq *cq, struct ib_wc *entry, int sig); | ||
644 | |||
645 | int ipath_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry); | ||
646 | |||
647 | struct ib_cq *ipath_create_cq(struct ib_device *ibdev, int entries, | ||
648 | struct ib_ucontext *context, | ||
649 | struct ib_udata *udata); | ||
650 | |||
651 | int ipath_destroy_cq(struct ib_cq *ibcq); | ||
652 | |||
653 | int ipath_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify notify); | ||
654 | |||
655 | int ipath_resize_cq(struct ib_cq *ibcq, int cqe, struct ib_udata *udata); | ||
656 | |||
657 | struct ib_mr *ipath_get_dma_mr(struct ib_pd *pd, int acc); | ||
658 | |||
659 | struct ib_mr *ipath_reg_phys_mr(struct ib_pd *pd, | ||
660 | struct ib_phys_buf *buffer_list, | ||
661 | int num_phys_buf, int acc, u64 *iova_start); | ||
662 | |||
663 | struct ib_mr *ipath_reg_user_mr(struct ib_pd *pd, struct ib_umem *region, | ||
664 | int mr_access_flags, | ||
665 | struct ib_udata *udata); | ||
666 | |||
667 | int ipath_dereg_mr(struct ib_mr *ibmr); | ||
668 | |||
669 | struct ib_fmr *ipath_alloc_fmr(struct ib_pd *pd, int mr_access_flags, | ||
670 | struct ib_fmr_attr *fmr_attr); | ||
671 | |||
672 | int ipath_map_phys_fmr(struct ib_fmr *ibfmr, u64 * page_list, | ||
673 | int list_len, u64 iova); | ||
674 | |||
675 | int ipath_unmap_fmr(struct list_head *fmr_list); | ||
676 | |||
677 | int ipath_dealloc_fmr(struct ib_fmr *ibfmr); | ||
678 | |||
679 | void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev); | ||
680 | |||
681 | void ipath_insert_rnr_queue(struct ipath_qp *qp); | ||
682 | |||
683 | int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only); | ||
684 | |||
685 | void ipath_ruc_loopback(struct ipath_qp *sqp, struct ib_wc *wc); | ||
686 | |||
687 | extern const enum ib_wc_opcode ib_ipath_wc_opcode[]; | ||
688 | |||
689 | extern const u8 ipath_cvt_physportstate[]; | ||
690 | |||
691 | extern const int ib_ipath_state_ops[]; | ||
692 | |||
693 | extern unsigned int ib_ipath_lkey_table_size; | ||
694 | |||
695 | extern const u32 ib_ipath_rnr_table[]; | ||
696 | |||
697 | #endif /* IPATH_VERBS_H */ | ||