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
38
39#if !defined(IB_VERBS_H)
40#define IB_VERBS_H
41
42#include <linux/types.h>
43#include <linux/device.h>
44#include <linux/mm.h>
45#include <linux/dma-mapping.h>
46#include <linux/kref.h>
47#include <linux/list.h>
48#include <linux/rwsem.h>
49#include <linux/scatterlist.h>
50
51#include <asm/atomic.h>
52#include <asm/uaccess.h>
53
54union ib_gid {
55 u8 raw[16];
56 struct {
57 __be64 subnet_prefix;
58 __be64 interface_id;
59 } global;
60};
61
62enum rdma_node_type {
63
64 RDMA_NODE_IB_CA = 1,
65 RDMA_NODE_IB_SWITCH,
66 RDMA_NODE_IB_ROUTER,
67 RDMA_NODE_RNIC
68};
69
70enum rdma_transport_type {
71 RDMA_TRANSPORT_IB,
72 RDMA_TRANSPORT_IWARP
73};
74
75enum rdma_transport_type
76rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__;
77
78enum ib_device_cap_flags {
79 IB_DEVICE_RESIZE_MAX_WR = 1,
80 IB_DEVICE_BAD_PKEY_CNTR = (1<<1),
81 IB_DEVICE_BAD_QKEY_CNTR = (1<<2),
82 IB_DEVICE_RAW_MULTI = (1<<3),
83 IB_DEVICE_AUTO_PATH_MIG = (1<<4),
84 IB_DEVICE_CHANGE_PHY_PORT = (1<<5),
85 IB_DEVICE_UD_AV_PORT_ENFORCE = (1<<6),
86 IB_DEVICE_CURR_QP_STATE_MOD = (1<<7),
87 IB_DEVICE_SHUTDOWN_PORT = (1<<8),
88 IB_DEVICE_INIT_TYPE = (1<<9),
89 IB_DEVICE_PORT_ACTIVE_EVENT = (1<<10),
90 IB_DEVICE_SYS_IMAGE_GUID = (1<<11),
91 IB_DEVICE_RC_RNR_NAK_GEN = (1<<12),
92 IB_DEVICE_SRQ_RESIZE = (1<<13),
93 IB_DEVICE_N_NOTIFY_CQ = (1<<14),
94 IB_DEVICE_LOCAL_DMA_LKEY = (1<<15),
95 IB_DEVICE_RESERVED = (1<<16),
96 IB_DEVICE_MEM_WINDOW = (1<<17),
97
98
99
100
101
102
103
104 IB_DEVICE_UD_IP_CSUM = (1<<18),
105 IB_DEVICE_UD_TSO = (1<<19),
106 IB_DEVICE_MEM_MGT_EXTENSIONS = (1<<21),
107 IB_DEVICE_BLOCK_MULTICAST_LOOPBACK = (1<<22),
108};
109
110enum ib_atomic_cap {
111 IB_ATOMIC_NONE,
112 IB_ATOMIC_HCA,
113 IB_ATOMIC_GLOB
114};
115
116struct ib_device_attr {
117 u64 fw_ver;
118 __be64 sys_image_guid;
119 u64 max_mr_size;
120 u64 page_size_cap;
121 u32 vendor_id;
122 u32 vendor_part_id;
123 u32 hw_ver;
124 int max_qp;
125 int max_qp_wr;
126 int device_cap_flags;
127 int max_sge;
128 int max_sge_rd;
129 int max_cq;
130 int max_cqe;
131 int max_mr;
132 int max_pd;
133 int max_qp_rd_atom;
134 int max_ee_rd_atom;
135 int max_res_rd_atom;
136 int max_qp_init_rd_atom;
137 int max_ee_init_rd_atom;
138 enum ib_atomic_cap atomic_cap;
139 enum ib_atomic_cap masked_atomic_cap;
140 int max_ee;
141 int max_rdd;
142 int max_mw;
143 int max_raw_ipv6_qp;
144 int max_raw_ethy_qp;
145 int max_mcast_grp;
146 int max_mcast_qp_attach;
147 int max_total_mcast_qp_attach;
148 int max_ah;
149 int max_fmr;
150 int max_map_per_fmr;
151 int max_srq;
152 int max_srq_wr;
153 int max_srq_sge;
154 unsigned int max_fast_reg_page_list_len;
155 u16 max_pkeys;
156 u8 local_ca_ack_delay;
157};
158
159enum ib_mtu {
160 IB_MTU_256 = 1,
161 IB_MTU_512 = 2,
162 IB_MTU_1024 = 3,
163 IB_MTU_2048 = 4,
164 IB_MTU_4096 = 5
165};
166
167static inline int ib_mtu_enum_to_int(enum ib_mtu mtu)
168{
169 switch (mtu) {
170 case IB_MTU_256: return 256;
171 case IB_MTU_512: return 512;
172 case IB_MTU_1024: return 1024;
173 case IB_MTU_2048: return 2048;
174 case IB_MTU_4096: return 4096;
175 default: return -1;
176 }
177}
178
179enum ib_port_state {
180 IB_PORT_NOP = 0,
181 IB_PORT_DOWN = 1,
182 IB_PORT_INIT = 2,
183 IB_PORT_ARMED = 3,
184 IB_PORT_ACTIVE = 4,
185 IB_PORT_ACTIVE_DEFER = 5
186};
187
188enum ib_port_cap_flags {
189 IB_PORT_SM = 1 << 1,
190 IB_PORT_NOTICE_SUP = 1 << 2,
191 IB_PORT_TRAP_SUP = 1 << 3,
192 IB_PORT_OPT_IPD_SUP = 1 << 4,
193 IB_PORT_AUTO_MIGR_SUP = 1 << 5,
194 IB_PORT_SL_MAP_SUP = 1 << 6,
195 IB_PORT_MKEY_NVRAM = 1 << 7,
196 IB_PORT_PKEY_NVRAM = 1 << 8,
197 IB_PORT_LED_INFO_SUP = 1 << 9,
198 IB_PORT_SM_DISABLED = 1 << 10,
199 IB_PORT_SYS_IMAGE_GUID_SUP = 1 << 11,
200 IB_PORT_PKEY_SW_EXT_PORT_TRAP_SUP = 1 << 12,
201 IB_PORT_CM_SUP = 1 << 16,
202 IB_PORT_SNMP_TUNNEL_SUP = 1 << 17,
203 IB_PORT_REINIT_SUP = 1 << 18,
204 IB_PORT_DEVICE_MGMT_SUP = 1 << 19,
205 IB_PORT_VENDOR_CLASS_SUP = 1 << 20,
206 IB_PORT_DR_NOTICE_SUP = 1 << 21,
207 IB_PORT_CAP_MASK_NOTICE_SUP = 1 << 22,
208 IB_PORT_BOOT_MGMT_SUP = 1 << 23,
209 IB_PORT_LINK_LATENCY_SUP = 1 << 24,
210 IB_PORT_CLIENT_REG_SUP = 1 << 25
211};
212
213enum ib_port_width {
214 IB_WIDTH_1X = 1,
215 IB_WIDTH_4X = 2,
216 IB_WIDTH_8X = 4,
217 IB_WIDTH_12X = 8
218};
219
220static inline int ib_width_enum_to_int(enum ib_port_width width)
221{
222 switch (width) {
223 case IB_WIDTH_1X: return 1;
224 case IB_WIDTH_4X: return 4;
225 case IB_WIDTH_8X: return 8;
226 case IB_WIDTH_12X: return 12;
227 default: return -1;
228 }
229}
230
231struct ib_protocol_stats {
232
233};
234
235struct iw_protocol_stats {
236 u64 ipInReceives;
237 u64 ipInHdrErrors;
238 u64 ipInTooBigErrors;
239 u64 ipInNoRoutes;
240 u64 ipInAddrErrors;
241 u64 ipInUnknownProtos;
242 u64 ipInTruncatedPkts;
243 u64 ipInDiscards;
244 u64 ipInDelivers;
245 u64 ipOutForwDatagrams;
246 u64 ipOutRequests;
247 u64 ipOutDiscards;
248 u64 ipOutNoRoutes;
249 u64 ipReasmTimeout;
250 u64 ipReasmReqds;
251 u64 ipReasmOKs;
252 u64 ipReasmFails;
253 u64 ipFragOKs;
254 u64 ipFragFails;
255 u64 ipFragCreates;
256 u64 ipInMcastPkts;
257 u64 ipOutMcastPkts;
258 u64 ipInBcastPkts;
259 u64 ipOutBcastPkts;
260
261 u64 tcpRtoAlgorithm;
262 u64 tcpRtoMin;
263 u64 tcpRtoMax;
264 u64 tcpMaxConn;
265 u64 tcpActiveOpens;
266 u64 tcpPassiveOpens;
267 u64 tcpAttemptFails;
268 u64 tcpEstabResets;
269 u64 tcpCurrEstab;
270 u64 tcpInSegs;
271 u64 tcpOutSegs;
272 u64 tcpRetransSegs;
273 u64 tcpInErrs;
274 u64 tcpOutRsts;
275};
276
277union rdma_protocol_stats {
278 struct ib_protocol_stats ib;
279 struct iw_protocol_stats iw;
280};
281
282struct ib_port_attr {
283 enum ib_port_state state;
284 enum ib_mtu max_mtu;
285 enum ib_mtu active_mtu;
286 int gid_tbl_len;
287 u32 port_cap_flags;
288 u32 max_msg_sz;
289 u32 bad_pkey_cntr;
290 u32 qkey_viol_cntr;
291 u16 pkey_tbl_len;
292 u16 lid;
293 u16 sm_lid;
294 u8 lmc;
295 u8 max_vl_num;
296 u8 sm_sl;
297 u8 subnet_timeout;
298 u8 init_type_reply;
299 u8 active_width;
300 u8 active_speed;
301 u8 phys_state;
302};
303
304enum ib_device_modify_flags {
305 IB_DEVICE_MODIFY_SYS_IMAGE_GUID = 1 << 0,
306 IB_DEVICE_MODIFY_NODE_DESC = 1 << 1
307};
308
309struct ib_device_modify {
310 u64 sys_image_guid;
311 char node_desc[64];
312};
313
314enum ib_port_modify_flags {
315 IB_PORT_SHUTDOWN = 1,
316 IB_PORT_INIT_TYPE = (1<<2),
317 IB_PORT_RESET_QKEY_CNTR = (1<<3)
318};
319
320struct ib_port_modify {
321 u32 set_port_cap_mask;
322 u32 clr_port_cap_mask;
323 u8 init_type;
324};
325
326enum ib_event_type {
327 IB_EVENT_CQ_ERR,
328 IB_EVENT_QP_FATAL,
329 IB_EVENT_QP_REQ_ERR,
330 IB_EVENT_QP_ACCESS_ERR,
331 IB_EVENT_COMM_EST,
332 IB_EVENT_SQ_DRAINED,
333 IB_EVENT_PATH_MIG,
334 IB_EVENT_PATH_MIG_ERR,
335 IB_EVENT_DEVICE_FATAL,
336 IB_EVENT_PORT_ACTIVE,
337 IB_EVENT_PORT_ERR,
338 IB_EVENT_LID_CHANGE,
339 IB_EVENT_PKEY_CHANGE,
340 IB_EVENT_SM_CHANGE,
341 IB_EVENT_SRQ_ERR,
342 IB_EVENT_SRQ_LIMIT_REACHED,
343 IB_EVENT_QP_LAST_WQE_REACHED,
344 IB_EVENT_CLIENT_REREGISTER
345};
346
347struct ib_event {
348 struct ib_device *device;
349 union {
350 struct ib_cq *cq;
351 struct ib_qp *qp;
352 struct ib_srq *srq;
353 u8 port_num;
354 } element;
355 enum ib_event_type event;
356};
357
358struct ib_event_handler {
359 struct ib_device *device;
360 void (*handler)(struct ib_event_handler *, struct ib_event *);
361 struct list_head list;
362};
363
364#define INIT_IB_EVENT_HANDLER(_ptr, _device, _handler) \
365 do { \
366 (_ptr)->device = _device; \
367 (_ptr)->handler = _handler; \
368 INIT_LIST_HEAD(&(_ptr)->list); \
369 } while (0)
370
371struct ib_global_route {
372 union ib_gid dgid;
373 u32 flow_label;
374 u8 sgid_index;
375 u8 hop_limit;
376 u8 traffic_class;
377};
378
379struct ib_grh {
380 __be32 version_tclass_flow;
381 __be16 paylen;
382 u8 next_hdr;
383 u8 hop_limit;
384 union ib_gid sgid;
385 union ib_gid dgid;
386};
387
388enum {
389 IB_MULTICAST_QPN = 0xffffff
390};
391
392#define IB_LID_PERMISSIVE cpu_to_be16(0xFFFF)
393
394enum ib_ah_flags {
395 IB_AH_GRH = 1
396};
397
398enum ib_rate {
399 IB_RATE_PORT_CURRENT = 0,
400 IB_RATE_2_5_GBPS = 2,
401 IB_RATE_5_GBPS = 5,
402 IB_RATE_10_GBPS = 3,
403 IB_RATE_20_GBPS = 6,
404 IB_RATE_30_GBPS = 4,
405 IB_RATE_40_GBPS = 7,
406 IB_RATE_60_GBPS = 8,
407 IB_RATE_80_GBPS = 9,
408 IB_RATE_120_GBPS = 10
409};
410
411
412
413
414
415
416
417int ib_rate_to_mult(enum ib_rate rate) __attribute_const__;
418
419
420
421
422
423
424enum ib_rate mult_to_ib_rate(int mult) __attribute_const__;
425
426struct ib_ah_attr {
427 struct ib_global_route grh;
428 u16 dlid;
429 u8 sl;
430 u8 src_path_bits;
431 u8 static_rate;
432 u8 ah_flags;
433 u8 port_num;
434};
435
436enum ib_wc_status {
437 IB_WC_SUCCESS,
438 IB_WC_LOC_LEN_ERR,
439 IB_WC_LOC_QP_OP_ERR,
440 IB_WC_LOC_EEC_OP_ERR,
441 IB_WC_LOC_PROT_ERR,
442 IB_WC_WR_FLUSH_ERR,
443 IB_WC_MW_BIND_ERR,
444 IB_WC_BAD_RESP_ERR,
445 IB_WC_LOC_ACCESS_ERR,
446 IB_WC_REM_INV_REQ_ERR,
447 IB_WC_REM_ACCESS_ERR,
448 IB_WC_REM_OP_ERR,
449 IB_WC_RETRY_EXC_ERR,
450 IB_WC_RNR_RETRY_EXC_ERR,
451 IB_WC_LOC_RDD_VIOL_ERR,
452 IB_WC_REM_INV_RD_REQ_ERR,
453 IB_WC_REM_ABORT_ERR,
454 IB_WC_INV_EECN_ERR,
455 IB_WC_INV_EEC_STATE_ERR,
456 IB_WC_FATAL_ERR,
457 IB_WC_RESP_TIMEOUT_ERR,
458 IB_WC_GENERAL_ERR
459};
460
461enum ib_wc_opcode {
462 IB_WC_SEND,
463 IB_WC_RDMA_WRITE,
464 IB_WC_RDMA_READ,
465 IB_WC_COMP_SWAP,
466 IB_WC_FETCH_ADD,
467 IB_WC_BIND_MW,
468 IB_WC_LSO,
469 IB_WC_LOCAL_INV,
470 IB_WC_FAST_REG_MR,
471 IB_WC_MASKED_COMP_SWAP,
472 IB_WC_MASKED_FETCH_ADD,
473
474
475
476
477 IB_WC_RECV = 1 << 7,
478 IB_WC_RECV_RDMA_WITH_IMM
479};
480
481enum ib_wc_flags {
482 IB_WC_GRH = 1,
483 IB_WC_WITH_IMM = (1<<1),
484 IB_WC_WITH_INVALIDATE = (1<<2),
485};
486
487struct ib_wc {
488 u64 wr_id;
489 enum ib_wc_status status;
490 enum ib_wc_opcode opcode;
491 u32 vendor_err;
492 u32 byte_len;
493 struct ib_qp *qp;
494 union {
495 __be32 imm_data;
496 u32 invalidate_rkey;
497 } ex;
498 u32 src_qp;
499 int wc_flags;
500 u16 pkey_index;
501 u16 slid;
502 u8 sl;
503 u8 dlid_path_bits;
504 u8 port_num;
505 int csum_ok;
506};
507
508enum ib_cq_notify_flags {
509 IB_CQ_SOLICITED = 1 << 0,
510 IB_CQ_NEXT_COMP = 1 << 1,
511 IB_CQ_SOLICITED_MASK = IB_CQ_SOLICITED | IB_CQ_NEXT_COMP,
512 IB_CQ_REPORT_MISSED_EVENTS = 1 << 2,
513};
514
515enum ib_srq_attr_mask {
516 IB_SRQ_MAX_WR = 1 << 0,
517 IB_SRQ_LIMIT = 1 << 1,
518};
519
520struct ib_srq_attr {
521 u32 max_wr;
522 u32 max_sge;
523 u32 srq_limit;
524};
525
526struct ib_srq_init_attr {
527 void (*event_handler)(struct ib_event *, void *);
528 void *srq_context;
529 struct ib_srq_attr attr;
530};
531
532struct ib_qp_cap {
533 u32 max_send_wr;
534 u32 max_recv_wr;
535 u32 max_send_sge;
536 u32 max_recv_sge;
537 u32 max_inline_data;
538};
539
540enum ib_sig_type {
541 IB_SIGNAL_ALL_WR,
542 IB_SIGNAL_REQ_WR
543};
544
545enum ib_qp_type {
546
547
548
549
550
551 IB_QPT_SMI,
552 IB_QPT_GSI,
553
554 IB_QPT_RC,
555 IB_QPT_UC,
556 IB_QPT_UD,
557 IB_QPT_RAW_IPV6,
558 IB_QPT_RAW_ETY
559};
560
561enum ib_qp_create_flags {
562 IB_QP_CREATE_IPOIB_UD_LSO = 1 << 0,
563 IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 1 << 1,
564};
565
566struct ib_qp_init_attr {
567 void (*event_handler)(struct ib_event *, void *);
568 void *qp_context;
569 struct ib_cq *send_cq;
570 struct ib_cq *recv_cq;
571 struct ib_srq *srq;
572 struct ib_qp_cap cap;
573 enum ib_sig_type sq_sig_type;
574 enum ib_qp_type qp_type;
575 enum ib_qp_create_flags create_flags;
576 u8 port_num;
577};
578
579enum ib_rnr_timeout {
580 IB_RNR_TIMER_655_36 = 0,
581 IB_RNR_TIMER_000_01 = 1,
582 IB_RNR_TIMER_000_02 = 2,
583 IB_RNR_TIMER_000_03 = 3,
584 IB_RNR_TIMER_000_04 = 4,
585 IB_RNR_TIMER_000_06 = 5,
586 IB_RNR_TIMER_000_08 = 6,
587 IB_RNR_TIMER_000_12 = 7,
588 IB_RNR_TIMER_000_16 = 8,
589 IB_RNR_TIMER_000_24 = 9,
590 IB_RNR_TIMER_000_32 = 10,
591 IB_RNR_TIMER_000_48 = 11,
592 IB_RNR_TIMER_000_64 = 12,
593 IB_RNR_TIMER_000_96 = 13,
594 IB_RNR_TIMER_001_28 = 14,
595 IB_RNR_TIMER_001_92 = 15,
596 IB_RNR_TIMER_002_56 = 16,
597 IB_RNR_TIMER_003_84 = 17,
598 IB_RNR_TIMER_005_12 = 18,
599 IB_RNR_TIMER_007_68 = 19,
600 IB_RNR_TIMER_010_24 = 20,
601 IB_RNR_TIMER_015_36 = 21,
602 IB_RNR_TIMER_020_48 = 22,
603 IB_RNR_TIMER_030_72 = 23,
604 IB_RNR_TIMER_040_96 = 24,
605 IB_RNR_TIMER_061_44 = 25,
606 IB_RNR_TIMER_081_92 = 26,
607 IB_RNR_TIMER_122_88 = 27,
608 IB_RNR_TIMER_163_84 = 28,
609 IB_RNR_TIMER_245_76 = 29,
610 IB_RNR_TIMER_327_68 = 30,
611 IB_RNR_TIMER_491_52 = 31
612};
613
614enum ib_qp_attr_mask {
615 IB_QP_STATE = 1,
616 IB_QP_CUR_STATE = (1<<1),
617 IB_QP_EN_SQD_ASYNC_NOTIFY = (1<<2),
618 IB_QP_ACCESS_FLAGS = (1<<3),
619 IB_QP_PKEY_INDEX = (1<<4),
620 IB_QP_PORT = (1<<5),
621 IB_QP_QKEY = (1<<6),
622 IB_QP_AV = (1<<7),
623 IB_QP_PATH_MTU = (1<<8),
624 IB_QP_TIMEOUT = (1<<9),
625 IB_QP_RETRY_CNT = (1<<10),
626 IB_QP_RNR_RETRY = (1<<11),
627 IB_QP_RQ_PSN = (1<<12),
628 IB_QP_MAX_QP_RD_ATOMIC = (1<<13),
629 IB_QP_ALT_PATH = (1<<14),
630 IB_QP_MIN_RNR_TIMER = (1<<15),
631 IB_QP_SQ_PSN = (1<<16),
632 IB_QP_MAX_DEST_RD_ATOMIC = (1<<17),
633 IB_QP_PATH_MIG_STATE = (1<<18),
634 IB_QP_CAP = (1<<19),
635 IB_QP_DEST_QPN = (1<<20)
636};
637
638enum ib_qp_state {
639 IB_QPS_RESET,
640 IB_QPS_INIT,
641 IB_QPS_RTR,
642 IB_QPS_RTS,
643 IB_QPS_SQD,
644 IB_QPS_SQE,
645 IB_QPS_ERR
646};
647
648enum ib_mig_state {
649 IB_MIG_MIGRATED,
650 IB_MIG_REARM,
651 IB_MIG_ARMED
652};
653
654struct ib_qp_attr {
655 enum ib_qp_state qp_state;
656 enum ib_qp_state cur_qp_state;
657 enum ib_mtu path_mtu;
658 enum ib_mig_state path_mig_state;
659 u32 qkey;
660 u32 rq_psn;
661 u32 sq_psn;
662 u32 dest_qp_num;
663 int qp_access_flags;
664 struct ib_qp_cap cap;
665 struct ib_ah_attr ah_attr;
666 struct ib_ah_attr alt_ah_attr;
667 u16 pkey_index;
668 u16 alt_pkey_index;
669 u8 en_sqd_async_notify;
670 u8 sq_draining;
671 u8 max_rd_atomic;
672 u8 max_dest_rd_atomic;
673 u8 min_rnr_timer;
674 u8 port_num;
675 u8 timeout;
676 u8 retry_cnt;
677 u8 rnr_retry;
678 u8 alt_port_num;
679 u8 alt_timeout;
680};
681
682enum ib_wr_opcode {
683 IB_WR_RDMA_WRITE,
684 IB_WR_RDMA_WRITE_WITH_IMM,
685 IB_WR_SEND,
686 IB_WR_SEND_WITH_IMM,
687 IB_WR_RDMA_READ,
688 IB_WR_ATOMIC_CMP_AND_SWP,
689 IB_WR_ATOMIC_FETCH_AND_ADD,
690 IB_WR_LSO,
691 IB_WR_SEND_WITH_INV,
692 IB_WR_RDMA_READ_WITH_INV,
693 IB_WR_LOCAL_INV,
694 IB_WR_FAST_REG_MR,
695 IB_WR_MASKED_ATOMIC_CMP_AND_SWP,
696 IB_WR_MASKED_ATOMIC_FETCH_AND_ADD,
697};
698
699enum ib_send_flags {
700 IB_SEND_FENCE = 1,
701 IB_SEND_SIGNALED = (1<<1),
702 IB_SEND_SOLICITED = (1<<2),
703 IB_SEND_INLINE = (1<<3),
704 IB_SEND_IP_CSUM = (1<<4)
705};
706
707struct ib_sge {
708 u64 addr;
709 u32 length;
710 u32 lkey;
711};
712
713struct ib_fast_reg_page_list {
714 struct ib_device *device;
715 u64 *page_list;
716 unsigned int max_page_list_len;
717};
718
719struct ib_send_wr {
720 struct ib_send_wr *next;
721 u64 wr_id;
722 struct ib_sge *sg_list;
723 int num_sge;
724 enum ib_wr_opcode opcode;
725 int send_flags;
726 union {
727 __be32 imm_data;
728 u32 invalidate_rkey;
729 } ex;
730 union {
731 struct {
732 u64 remote_addr;
733 u32 rkey;
734 } rdma;
735 struct {
736 u64 remote_addr;
737 u64 compare_add;
738 u64 swap;
739 u64 compare_add_mask;
740 u64 swap_mask;
741 u32 rkey;
742 } atomic;
743 struct {
744 struct ib_ah *ah;
745 void *header;
746 int hlen;
747 int mss;
748 u32 remote_qpn;
749 u32 remote_qkey;
750 u16 pkey_index;
751 u8 port_num;
752 } ud;
753 struct {
754 u64 iova_start;
755 struct ib_fast_reg_page_list *page_list;
756 unsigned int page_shift;
757 unsigned int page_list_len;
758 u32 length;
759 int access_flags;
760 u32 rkey;
761 } fast_reg;
762 } wr;
763};
764
765struct ib_recv_wr {
766 struct ib_recv_wr *next;
767 u64 wr_id;
768 struct ib_sge *sg_list;
769 int num_sge;
770};
771
772enum ib_access_flags {
773 IB_ACCESS_LOCAL_WRITE = 1,
774 IB_ACCESS_REMOTE_WRITE = (1<<1),
775 IB_ACCESS_REMOTE_READ = (1<<2),
776 IB_ACCESS_REMOTE_ATOMIC = (1<<3),
777 IB_ACCESS_MW_BIND = (1<<4)
778};
779
780struct ib_phys_buf {
781 u64 addr;
782 u64 size;
783};
784
785struct ib_mr_attr {
786 struct ib_pd *pd;
787 u64 device_virt_addr;
788 u64 size;
789 int mr_access_flags;
790 u32 lkey;
791 u32 rkey;
792};
793
794enum ib_mr_rereg_flags {
795 IB_MR_REREG_TRANS = 1,
796 IB_MR_REREG_PD = (1<<1),
797 IB_MR_REREG_ACCESS = (1<<2)
798};
799
800struct ib_mw_bind {
801 struct ib_mr *mr;
802 u64 wr_id;
803 u64 addr;
804 u32 length;
805 int send_flags;
806 int mw_access_flags;
807};
808
809struct ib_fmr_attr {
810 int max_pages;
811 int max_maps;
812 u8 page_shift;
813};
814
815struct ib_ucontext {
816 struct ib_device *device;
817 struct list_head pd_list;
818 struct list_head mr_list;
819 struct list_head mw_list;
820 struct list_head cq_list;
821 struct list_head qp_list;
822 struct list_head srq_list;
823 struct list_head ah_list;
824 int closing;
825};
826
827struct ib_uobject {
828 u64 user_handle;
829 struct ib_ucontext *context;
830 void *object;
831 struct list_head list;
832 int id;
833 struct kref ref;
834 struct rw_semaphore mutex;
835 int live;
836};
837
838struct ib_udata {
839 void __user *inbuf;
840 void __user *outbuf;
841 size_t inlen;
842 size_t outlen;
843};
844
845struct ib_pd {
846 struct ib_device *device;
847 struct ib_uobject *uobject;
848 atomic_t usecnt;
849};
850
851struct ib_ah {
852 struct ib_device *device;
853 struct ib_pd *pd;
854 struct ib_uobject *uobject;
855};
856
857typedef void (*ib_comp_handler)(struct ib_cq *cq, void *cq_context);
858
859struct ib_cq {
860 struct ib_device *device;
861 struct ib_uobject *uobject;
862 ib_comp_handler comp_handler;
863 void (*event_handler)(struct ib_event *, void *);
864 void *cq_context;
865 int cqe;
866 atomic_t usecnt;
867};
868
869struct ib_srq {
870 struct ib_device *device;
871 struct ib_pd *pd;
872 struct ib_uobject *uobject;
873 void (*event_handler)(struct ib_event *, void *);
874 void *srq_context;
875 atomic_t usecnt;
876};
877
878struct ib_qp {
879 struct ib_device *device;
880 struct ib_pd *pd;
881 struct ib_cq *send_cq;
882 struct ib_cq *recv_cq;
883 struct ib_srq *srq;
884 struct ib_uobject *uobject;
885 void (*event_handler)(struct ib_event *, void *);
886 void *qp_context;
887 u32 qp_num;
888 enum ib_qp_type qp_type;
889};
890
891struct ib_mr {
892 struct ib_device *device;
893 struct ib_pd *pd;
894 struct ib_uobject *uobject;
895 u32 lkey;
896 u32 rkey;
897 atomic_t usecnt;
898};
899
900struct ib_mw {
901 struct ib_device *device;
902 struct ib_pd *pd;
903 struct ib_uobject *uobject;
904 u32 rkey;
905};
906
907struct ib_fmr {
908 struct ib_device *device;
909 struct ib_pd *pd;
910 struct list_head list;
911 u32 lkey;
912 u32 rkey;
913};
914
915struct ib_mad;
916struct ib_grh;
917
918enum ib_process_mad_flags {
919 IB_MAD_IGNORE_MKEY = 1,
920 IB_MAD_IGNORE_BKEY = 2,
921 IB_MAD_IGNORE_ALL = IB_MAD_IGNORE_MKEY | IB_MAD_IGNORE_BKEY
922};
923
924enum ib_mad_result {
925 IB_MAD_RESULT_FAILURE = 0,
926 IB_MAD_RESULT_SUCCESS = 1 << 0,
927 IB_MAD_RESULT_REPLY = 1 << 1,
928 IB_MAD_RESULT_CONSUMED = 1 << 2
929};
930
931#define IB_DEVICE_NAME_MAX 64
932
933struct ib_cache {
934 rwlock_t lock;
935 struct ib_event_handler event_handler;
936 struct ib_pkey_cache **pkey_cache;
937 struct ib_gid_cache **gid_cache;
938 u8 *lmc_cache;
939};
940
941struct ib_dma_mapping_ops {
942 int (*mapping_error)(struct ib_device *dev,
943 u64 dma_addr);
944 u64 (*map_single)(struct ib_device *dev,
945 void *ptr, size_t size,
946 enum dma_data_direction direction);
947 void (*unmap_single)(struct ib_device *dev,
948 u64 addr, size_t size,
949 enum dma_data_direction direction);
950 u64 (*map_page)(struct ib_device *dev,
951 struct page *page, unsigned long offset,
952 size_t size,
953 enum dma_data_direction direction);
954 void (*unmap_page)(struct ib_device *dev,
955 u64 addr, size_t size,
956 enum dma_data_direction direction);
957 int (*map_sg)(struct ib_device *dev,
958 struct scatterlist *sg, int nents,
959 enum dma_data_direction direction);
960 void (*unmap_sg)(struct ib_device *dev,
961 struct scatterlist *sg, int nents,
962 enum dma_data_direction direction);
963 u64 (*dma_address)(struct ib_device *dev,
964 struct scatterlist *sg);
965 unsigned int (*dma_len)(struct ib_device *dev,
966 struct scatterlist *sg);
967 void (*sync_single_for_cpu)(struct ib_device *dev,
968 u64 dma_handle,
969 size_t size,
970 enum dma_data_direction dir);
971 void (*sync_single_for_device)(struct ib_device *dev,
972 u64 dma_handle,
973 size_t size,
974 enum dma_data_direction dir);
975 void *(*alloc_coherent)(struct ib_device *dev,
976 size_t size,
977 u64 *dma_handle,
978 gfp_t flag);
979 void (*free_coherent)(struct ib_device *dev,
980 size_t size, void *cpu_addr,
981 u64 dma_handle);
982};
983
984struct iw_cm_verbs;
985
986struct ib_device {
987 struct device *dma_device;
988
989 char name[IB_DEVICE_NAME_MAX];
990
991 struct list_head event_handler_list;
992 spinlock_t event_handler_lock;
993
994 spinlock_t client_data_lock;
995 struct list_head core_list;
996 struct list_head client_data_list;
997
998 struct ib_cache cache;
999 int *pkey_tbl_len;
1000 int *gid_tbl_len;
1001
1002 int num_comp_vectors;
1003
1004 struct iw_cm_verbs *iwcm;
1005
1006 int (*get_protocol_stats)(struct ib_device *device,
1007 union rdma_protocol_stats *stats);
1008 int (*query_device)(struct ib_device *device,
1009 struct ib_device_attr *device_attr);
1010 int (*query_port)(struct ib_device *device,
1011 u8 port_num,
1012 struct ib_port_attr *port_attr);
1013 int (*query_gid)(struct ib_device *device,
1014 u8 port_num, int index,
1015 union ib_gid *gid);
1016 int (*query_pkey)(struct ib_device *device,
1017 u8 port_num, u16 index, u16 *pkey);
1018 int (*modify_device)(struct ib_device *device,
1019 int device_modify_mask,
1020 struct ib_device_modify *device_modify);
1021 int (*modify_port)(struct ib_device *device,
1022 u8 port_num, int port_modify_mask,
1023 struct ib_port_modify *port_modify);
1024 struct ib_ucontext * (*alloc_ucontext)(struct ib_device *device,
1025 struct ib_udata *udata);
1026 int (*dealloc_ucontext)(struct ib_ucontext *context);
1027 int (*mmap)(struct ib_ucontext *context,
1028 struct vm_area_struct *vma);
1029 struct ib_pd * (*alloc_pd)(struct ib_device *device,
1030 struct ib_ucontext *context,
1031 struct ib_udata *udata);
1032 int (*dealloc_pd)(struct ib_pd *pd);
1033 struct ib_ah * (*create_ah)(struct ib_pd *pd,
1034 struct ib_ah_attr *ah_attr);
1035 int (*modify_ah)(struct ib_ah *ah,
1036 struct ib_ah_attr *ah_attr);
1037 int (*query_ah)(struct ib_ah *ah,
1038 struct ib_ah_attr *ah_attr);
1039 int (*destroy_ah)(struct ib_ah *ah);
1040 struct ib_srq * (*create_srq)(struct ib_pd *pd,
1041 struct ib_srq_init_attr *srq_init_attr,
1042 struct ib_udata *udata);
1043 int (*modify_srq)(struct ib_srq *srq,
1044 struct ib_srq_attr *srq_attr,
1045 enum ib_srq_attr_mask srq_attr_mask,
1046 struct ib_udata *udata);
1047 int (*query_srq)(struct ib_srq *srq,
1048 struct ib_srq_attr *srq_attr);
1049 int (*destroy_srq)(struct ib_srq *srq);
1050 int (*post_srq_recv)(struct ib_srq *srq,
1051 struct ib_recv_wr *recv_wr,
1052 struct ib_recv_wr **bad_recv_wr);
1053 struct ib_qp * (*create_qp)(struct ib_pd *pd,
1054 struct ib_qp_init_attr *qp_init_attr,
1055 struct ib_udata *udata);
1056 int (*modify_qp)(struct ib_qp *qp,
1057 struct ib_qp_attr *qp_attr,
1058 int qp_attr_mask,
1059 struct ib_udata *udata);
1060 int (*query_qp)(struct ib_qp *qp,
1061 struct ib_qp_attr *qp_attr,
1062 int qp_attr_mask,
1063 struct ib_qp_init_attr *qp_init_attr);
1064 int (*destroy_qp)(struct ib_qp *qp);
1065 int (*post_send)(struct ib_qp *qp,
1066 struct ib_send_wr *send_wr,
1067 struct ib_send_wr **bad_send_wr);
1068 int (*post_recv)(struct ib_qp *qp,
1069 struct ib_recv_wr *recv_wr,
1070 struct ib_recv_wr **bad_recv_wr);
1071 struct ib_cq * (*create_cq)(struct ib_device *device, int cqe,
1072 int comp_vector,
1073 struct ib_ucontext *context,
1074 struct ib_udata *udata);
1075 int (*modify_cq)(struct ib_cq *cq, u16 cq_count,
1076 u16 cq_period);
1077 int (*destroy_cq)(struct ib_cq *cq);
1078 int (*resize_cq)(struct ib_cq *cq, int cqe,
1079 struct ib_udata *udata);
1080 int (*poll_cq)(struct ib_cq *cq, int num_entries,
1081 struct ib_wc *wc);
1082 int (*peek_cq)(struct ib_cq *cq, int wc_cnt);
1083 int (*req_notify_cq)(struct ib_cq *cq,
1084 enum ib_cq_notify_flags flags);
1085 int (*req_ncomp_notif)(struct ib_cq *cq,
1086 int wc_cnt);
1087 struct ib_mr * (*get_dma_mr)(struct ib_pd *pd,
1088 int mr_access_flags);
1089 struct ib_mr * (*reg_phys_mr)(struct ib_pd *pd,
1090 struct ib_phys_buf *phys_buf_array,
1091 int num_phys_buf,
1092 int mr_access_flags,
1093 u64 *iova_start);
1094 struct ib_mr * (*reg_user_mr)(struct ib_pd *pd,
1095 u64 start, u64 length,
1096 u64 virt_addr,
1097 int mr_access_flags,
1098 struct ib_udata *udata);
1099 int (*query_mr)(struct ib_mr *mr,
1100 struct ib_mr_attr *mr_attr);
1101 int (*dereg_mr)(struct ib_mr *mr);
1102 struct ib_mr * (*alloc_fast_reg_mr)(struct ib_pd *pd,
1103 int max_page_list_len);
1104 struct ib_fast_reg_page_list * (*alloc_fast_reg_page_list)(struct ib_device *device,
1105 int page_list_len);
1106 void (*free_fast_reg_page_list)(struct ib_fast_reg_page_list *page_list);
1107 int (*rereg_phys_mr)(struct ib_mr *mr,
1108 int mr_rereg_mask,
1109 struct ib_pd *pd,
1110 struct ib_phys_buf *phys_buf_array,
1111 int num_phys_buf,
1112 int mr_access_flags,
1113 u64 *iova_start);
1114 struct ib_mw * (*alloc_mw)(struct ib_pd *pd);
1115 int (*bind_mw)(struct ib_qp *qp,
1116 struct ib_mw *mw,
1117 struct ib_mw_bind *mw_bind);
1118 int (*dealloc_mw)(struct ib_mw *mw);
1119 struct ib_fmr * (*alloc_fmr)(struct ib_pd *pd,
1120 int mr_access_flags,
1121 struct ib_fmr_attr *fmr_attr);
1122 int (*map_phys_fmr)(struct ib_fmr *fmr,
1123 u64 *page_list, int list_len,
1124 u64 iova);
1125 int (*unmap_fmr)(struct list_head *fmr_list);
1126 int (*dealloc_fmr)(struct ib_fmr *fmr);
1127 int (*attach_mcast)(struct ib_qp *qp,
1128 union ib_gid *gid,
1129 u16 lid);
1130 int (*detach_mcast)(struct ib_qp *qp,
1131 union ib_gid *gid,
1132 u16 lid);
1133 int (*process_mad)(struct ib_device *device,
1134 int process_mad_flags,
1135 u8 port_num,
1136 struct ib_wc *in_wc,
1137 struct ib_grh *in_grh,
1138 struct ib_mad *in_mad,
1139 struct ib_mad *out_mad);
1140
1141 struct ib_dma_mapping_ops *dma_ops;
1142
1143 struct module *owner;
1144 struct device dev;
1145 struct kobject *ports_parent;
1146 struct list_head port_list;
1147
1148 enum {
1149 IB_DEV_UNINITIALIZED,
1150 IB_DEV_REGISTERED,
1151 IB_DEV_UNREGISTERED
1152 } reg_state;
1153
1154 int uverbs_abi_ver;
1155 u64 uverbs_cmd_mask;
1156
1157 char node_desc[64];
1158 __be64 node_guid;
1159 u32 local_dma_lkey;
1160 u8 node_type;
1161 u8 phys_port_cnt;
1162};
1163
1164struct ib_client {
1165 char *name;
1166 void (*add) (struct ib_device *);
1167 void (*remove)(struct ib_device *);
1168
1169 struct list_head list;
1170};
1171
1172struct ib_device *ib_alloc_device(size_t size);
1173void ib_dealloc_device(struct ib_device *device);
1174
1175int ib_register_device(struct ib_device *device,
1176 int (*port_callback)(struct ib_device *,
1177 u8, struct kobject *));
1178void ib_unregister_device(struct ib_device *device);
1179
1180int ib_register_client (struct ib_client *client);
1181void ib_unregister_client(struct ib_client *client);
1182
1183void *ib_get_client_data(struct ib_device *device, struct ib_client *client);
1184void ib_set_client_data(struct ib_device *device, struct ib_client *client,
1185 void *data);
1186
1187static inline int ib_copy_from_udata(void *dest, struct ib_udata *udata, size_t len)
1188{
1189 return copy_from_user(dest, udata->inbuf, len) ? -EFAULT : 0;
1190}
1191
1192static inline int ib_copy_to_udata(struct ib_udata *udata, void *src, size_t len)
1193{
1194 return copy_to_user(udata->outbuf, src, len) ? -EFAULT : 0;
1195}
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
1213 enum ib_qp_type type, enum ib_qp_attr_mask mask);
1214
1215int ib_register_event_handler (struct ib_event_handler *event_handler);
1216int ib_unregister_event_handler(struct ib_event_handler *event_handler);
1217void ib_dispatch_event(struct ib_event *event);
1218
1219int ib_query_device(struct ib_device *device,
1220 struct ib_device_attr *device_attr);
1221
1222int ib_query_port(struct ib_device *device,
1223 u8 port_num, struct ib_port_attr *port_attr);
1224
1225int ib_query_gid(struct ib_device *device,
1226 u8 port_num, int index, union ib_gid *gid);
1227
1228int ib_query_pkey(struct ib_device *device,
1229 u8 port_num, u16 index, u16 *pkey);
1230
1231int ib_modify_device(struct ib_device *device,
1232 int device_modify_mask,
1233 struct ib_device_modify *device_modify);
1234
1235int ib_modify_port(struct ib_device *device,
1236 u8 port_num, int port_modify_mask,
1237 struct ib_port_modify *port_modify);
1238
1239int ib_find_gid(struct ib_device *device, union ib_gid *gid,
1240 u8 *port_num, u16 *index);
1241
1242int ib_find_pkey(struct ib_device *device,
1243 u8 port_num, u16 pkey, u16 *index);
1244
1245
1246
1247
1248
1249
1250
1251
1252struct ib_pd *ib_alloc_pd(struct ib_device *device);
1253
1254
1255
1256
1257
1258int ib_dealloc_pd(struct ib_pd *pd);
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr);
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281int ib_init_ah_from_wc(struct ib_device *device, u8 port_num, struct ib_wc *wc,
1282 struct ib_grh *grh, struct ib_ah_attr *ah_attr);
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296struct ib_ah *ib_create_ah_from_wc(struct ib_pd *pd, struct ib_wc *wc,
1297 struct ib_grh *grh, u8 port_num);
1298
1299
1300
1301
1302
1303
1304
1305
1306int ib_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr);
1307
1308
1309
1310
1311
1312
1313
1314
1315int ib_query_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr);
1316
1317
1318
1319
1320
1321int ib_destroy_ah(struct ib_ah *ah);
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336struct ib_srq *ib_create_srq(struct ib_pd *pd,
1337 struct ib_srq_init_attr *srq_init_attr);
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351int ib_modify_srq(struct ib_srq *srq,
1352 struct ib_srq_attr *srq_attr,
1353 enum ib_srq_attr_mask srq_attr_mask);
1354
1355
1356
1357
1358
1359
1360
1361int ib_query_srq(struct ib_srq *srq,
1362 struct ib_srq_attr *srq_attr);
1363
1364
1365
1366
1367
1368int ib_destroy_srq(struct ib_srq *srq);
1369
1370
1371
1372
1373
1374
1375
1376
1377static inline int ib_post_srq_recv(struct ib_srq *srq,
1378 struct ib_recv_wr *recv_wr,
1379 struct ib_recv_wr **bad_recv_wr)
1380{
1381 return srq->device->post_srq_recv(srq, recv_wr, bad_recv_wr);
1382}
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392struct ib_qp *ib_create_qp(struct ib_pd *pd,
1393 struct ib_qp_init_attr *qp_init_attr);
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404int ib_modify_qp(struct ib_qp *qp,
1405 struct ib_qp_attr *qp_attr,
1406 int qp_attr_mask);
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419int ib_query_qp(struct ib_qp *qp,
1420 struct ib_qp_attr *qp_attr,
1421 int qp_attr_mask,
1422 struct ib_qp_init_attr *qp_init_attr);
1423
1424
1425
1426
1427
1428int ib_destroy_qp(struct ib_qp *qp);
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443static inline int ib_post_send(struct ib_qp *qp,
1444 struct ib_send_wr *send_wr,
1445 struct ib_send_wr **bad_send_wr)
1446{
1447 return qp->device->post_send(qp, send_wr, bad_send_wr);
1448}
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458static inline int ib_post_recv(struct ib_qp *qp,
1459 struct ib_recv_wr *recv_wr,
1460 struct ib_recv_wr **bad_recv_wr)
1461{
1462 return qp->device->post_recv(qp, recv_wr, bad_recv_wr);
1463}
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480struct ib_cq *ib_create_cq(struct ib_device *device,
1481 ib_comp_handler comp_handler,
1482 void (*event_handler)(struct ib_event *, void *),
1483 void *cq_context, int cqe, int comp_vector);
1484
1485
1486
1487
1488
1489
1490
1491
1492int ib_resize_cq(struct ib_cq *cq, int cqe);
1493
1494
1495
1496
1497
1498
1499
1500
1501int ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period);
1502
1503
1504
1505
1506
1507int ib_destroy_cq(struct ib_cq *cq);
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521static inline int ib_poll_cq(struct ib_cq *cq, int num_entries,
1522 struct ib_wc *wc)
1523{
1524 return cq->device->poll_cq(cq, num_entries, wc);
1525}
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537int ib_peek_cq(struct ib_cq *cq, int wc_cnt);
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566static inline int ib_req_notify_cq(struct ib_cq *cq,
1567 enum ib_cq_notify_flags flags)
1568{
1569 return cq->device->req_notify_cq(cq, flags);
1570}
1571
1572
1573
1574
1575
1576
1577
1578
1579static inline int ib_req_ncomp_notif(struct ib_cq *cq, int wc_cnt)
1580{
1581 return cq->device->req_ncomp_notif ?
1582 cq->device->req_ncomp_notif(cq, wc_cnt) :
1583 -ENOSYS;
1584}
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596struct ib_mr *ib_get_dma_mr(struct ib_pd *pd, int mr_access_flags);
1597
1598
1599
1600
1601
1602
1603static inline int ib_dma_mapping_error(struct ib_device *dev, u64 dma_addr)
1604{
1605 if (dev->dma_ops)
1606 return dev->dma_ops->mapping_error(dev, dma_addr);
1607 return dma_mapping_error(dev->dma_device, dma_addr);
1608}
1609
1610
1611
1612
1613
1614
1615
1616
1617static inline u64 ib_dma_map_single(struct ib_device *dev,
1618 void *cpu_addr, size_t size,
1619 enum dma_data_direction direction)
1620{
1621 if (dev->dma_ops)
1622 return dev->dma_ops->map_single(dev, cpu_addr, size, direction);
1623 return dma_map_single(dev->dma_device, cpu_addr, size, direction);
1624}
1625
1626
1627
1628
1629
1630
1631
1632
1633static inline void ib_dma_unmap_single(struct ib_device *dev,
1634 u64 addr, size_t size,
1635 enum dma_data_direction direction)
1636{
1637 if (dev->dma_ops)
1638 dev->dma_ops->unmap_single(dev, addr, size, direction);
1639 else
1640 dma_unmap_single(dev->dma_device, addr, size, direction);
1641}
1642
1643static inline u64 ib_dma_map_single_attrs(struct ib_device *dev,
1644 void *cpu_addr, size_t size,
1645 enum dma_data_direction direction,
1646 struct dma_attrs *attrs)
1647{
1648 return dma_map_single_attrs(dev->dma_device, cpu_addr, size,
1649 direction, attrs);
1650}
1651
1652static inline void ib_dma_unmap_single_attrs(struct ib_device *dev,
1653 u64 addr, size_t size,
1654 enum dma_data_direction direction,
1655 struct dma_attrs *attrs)
1656{
1657 return dma_unmap_single_attrs(dev->dma_device, addr, size,
1658 direction, attrs);
1659}
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669static inline u64 ib_dma_map_page(struct ib_device *dev,
1670 struct page *page,
1671 unsigned long offset,
1672 size_t size,
1673 enum dma_data_direction direction)
1674{
1675 if (dev->dma_ops)
1676 return dev->dma_ops->map_page(dev, page, offset, size, direction);
1677 return dma_map_page(dev->dma_device, page, offset, size, direction);
1678}
1679
1680
1681
1682
1683
1684
1685
1686
1687static inline void ib_dma_unmap_page(struct ib_device *dev,
1688 u64 addr, size_t size,
1689 enum dma_data_direction direction)
1690{
1691 if (dev->dma_ops)
1692 dev->dma_ops->unmap_page(dev, addr, size, direction);
1693 else
1694 dma_unmap_page(dev->dma_device, addr, size, direction);
1695}
1696
1697
1698
1699
1700
1701
1702
1703
1704static inline int ib_dma_map_sg(struct ib_device *dev,
1705 struct scatterlist *sg, int nents,
1706 enum dma_data_direction direction)
1707{
1708 if (dev->dma_ops)
1709 return dev->dma_ops->map_sg(dev, sg, nents, direction);
1710 return dma_map_sg(dev->dma_device, sg, nents, direction);
1711}
1712
1713
1714
1715
1716
1717
1718
1719
1720static inline void ib_dma_unmap_sg(struct ib_device *dev,
1721 struct scatterlist *sg, int nents,
1722 enum dma_data_direction direction)
1723{
1724 if (dev->dma_ops)
1725 dev->dma_ops->unmap_sg(dev, sg, nents, direction);
1726 else
1727 dma_unmap_sg(dev->dma_device, sg, nents, direction);
1728}
1729
1730static inline int ib_dma_map_sg_attrs(struct ib_device *dev,
1731 struct scatterlist *sg, int nents,
1732 enum dma_data_direction direction,
1733 struct dma_attrs *attrs)
1734{
1735 return dma_map_sg_attrs(dev->dma_device, sg, nents, direction, attrs);
1736}
1737
1738static inline void ib_dma_unmap_sg_attrs(struct ib_device *dev,
1739 struct scatterlist *sg, int nents,
1740 enum dma_data_direction direction,
1741 struct dma_attrs *attrs)
1742{
1743 dma_unmap_sg_attrs(dev->dma_device, sg, nents, direction, attrs);
1744}
1745
1746
1747
1748
1749
1750static inline u64 ib_sg_dma_address(struct ib_device *dev,
1751 struct scatterlist *sg)
1752{
1753 if (dev->dma_ops)
1754 return dev->dma_ops->dma_address(dev, sg);
1755 return sg_dma_address(sg);
1756}
1757
1758
1759
1760
1761
1762
1763static inline unsigned int ib_sg_dma_len(struct ib_device *dev,
1764 struct scatterlist *sg)
1765{
1766 if (dev->dma_ops)
1767 return dev->dma_ops->dma_len(dev, sg);
1768 return sg_dma_len(sg);
1769}
1770
1771
1772
1773
1774
1775
1776
1777
1778static inline void ib_dma_sync_single_for_cpu(struct ib_device *dev,
1779 u64 addr,
1780 size_t size,
1781 enum dma_data_direction dir)
1782{
1783 if (dev->dma_ops)
1784 dev->dma_ops->sync_single_for_cpu(dev, addr, size, dir);
1785 else
1786 dma_sync_single_for_cpu(dev->dma_device, addr, size, dir);
1787}
1788
1789
1790
1791
1792
1793
1794
1795
1796static inline void ib_dma_sync_single_for_device(struct ib_device *dev,
1797 u64 addr,
1798 size_t size,
1799 enum dma_data_direction dir)
1800{
1801 if (dev->dma_ops)
1802 dev->dma_ops->sync_single_for_device(dev, addr, size, dir);
1803 else
1804 dma_sync_single_for_device(dev->dma_device, addr, size, dir);
1805}
1806
1807
1808
1809
1810
1811
1812
1813
1814static inline void *ib_dma_alloc_coherent(struct ib_device *dev,
1815 size_t size,
1816 u64 *dma_handle,
1817 gfp_t flag)
1818{
1819 if (dev->dma_ops)
1820 return dev->dma_ops->alloc_coherent(dev, size, dma_handle, flag);
1821 else {
1822 dma_addr_t handle;
1823 void *ret;
1824
1825 ret = dma_alloc_coherent(dev->dma_device, size, &handle, flag);
1826 *dma_handle = handle;
1827 return ret;
1828 }
1829}
1830
1831
1832
1833
1834
1835
1836
1837
1838static inline void ib_dma_free_coherent(struct ib_device *dev,
1839 size_t size, void *cpu_addr,
1840 u64 dma_handle)
1841{
1842 if (dev->dma_ops)
1843 dev->dma_ops->free_coherent(dev, size, cpu_addr, dma_handle);
1844 else
1845 dma_free_coherent(dev->dma_device, size, cpu_addr, dma_handle);
1846}
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858struct ib_mr *ib_reg_phys_mr(struct ib_pd *pd,
1859 struct ib_phys_buf *phys_buf_array,
1860 int num_phys_buf,
1861 int mr_access_flags,
1862 u64 *iova_start);
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886int ib_rereg_phys_mr(struct ib_mr *mr,
1887 int mr_rereg_mask,
1888 struct ib_pd *pd,
1889 struct ib_phys_buf *phys_buf_array,
1890 int num_phys_buf,
1891 int mr_access_flags,
1892 u64 *iova_start);
1893
1894
1895
1896
1897
1898
1899int ib_query_mr(struct ib_mr *mr, struct ib_mr_attr *mr_attr);
1900
1901
1902
1903
1904
1905
1906int ib_dereg_mr(struct ib_mr *mr);
1907
1908
1909
1910
1911
1912
1913
1914
1915struct ib_mr *ib_alloc_fast_reg_mr(struct ib_pd *pd, int max_page_list_len);
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934struct ib_fast_reg_page_list *ib_alloc_fast_reg_page_list(
1935 struct ib_device *device, int page_list_len);
1936
1937
1938
1939
1940
1941
1942void ib_free_fast_reg_page_list(struct ib_fast_reg_page_list *page_list);
1943
1944
1945
1946
1947
1948
1949
1950static inline void ib_update_fast_reg_key(struct ib_mr *mr, u8 newkey)
1951{
1952 mr->lkey = (mr->lkey & 0xffffff00) | newkey;
1953 mr->rkey = (mr->rkey & 0xffffff00) | newkey;
1954}
1955
1956
1957
1958
1959
1960struct ib_mw *ib_alloc_mw(struct ib_pd *pd);
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971static inline int ib_bind_mw(struct ib_qp *qp,
1972 struct ib_mw *mw,
1973 struct ib_mw_bind *mw_bind)
1974{
1975
1976 return mw->device->bind_mw ?
1977 mw->device->bind_mw(qp, mw, mw_bind) :
1978 -ENOSYS;
1979}
1980
1981
1982
1983
1984
1985int ib_dealloc_mw(struct ib_mw *mw);
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996struct ib_fmr *ib_alloc_fmr(struct ib_pd *pd,
1997 int mr_access_flags,
1998 struct ib_fmr_attr *fmr_attr);
1999
2000
2001
2002
2003
2004
2005
2006
2007static inline int ib_map_phys_fmr(struct ib_fmr *fmr,
2008 u64 *page_list, int list_len,
2009 u64 iova)
2010{
2011 return fmr->device->map_phys_fmr(fmr, page_list, list_len, iova);
2012}
2013
2014
2015
2016
2017
2018int ib_unmap_fmr(struct list_head *fmr_list);
2019
2020
2021
2022
2023
2024int ib_dealloc_fmr(struct ib_fmr *fmr);
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038int ib_attach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid);
2039
2040
2041
2042
2043
2044
2045
2046int ib_detach_mcast(struct ib_qp *qp, union ib_gid *gid, u16 lid);
2047
2048#endif
2049