[ipoib] Always set the "full membership" bit in the IPv4 broadcast GID
[people/peper/gpxe.git] / src / include / gpxe / infiniband.h
1 #ifndef _GPXE_INFINIBAND_H
2 #define _GPXE_INFINIBAND_H
3
4 /** @file
5  *
6  * Infiniband protocol
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 #include <stdint.h>
13 #include <gpxe/refcnt.h>
14 #include <gpxe/device.h>
15 #include <gpxe/ib_packet.h>
16 #include <gpxe/ib_mad.h>
17
18 /** Subnet management interface QPN */
19 #define IB_QPN_SMI 0
20
21 /** Subnet management interface queue key */
22 #define IB_QKEY_SMI 0
23
24 /** General service interface QPN */
25 #define IB_QPN_GSI 1
26
27 /** General service interface queue key */
28 #define IB_QKEY_GSI 0x80010000UL
29
30 /** Broadcast QPN */
31 #define IB_QPN_BROADCAST 0xffffffUL
32
33 /** Default Infiniband partition key */
34 #define IB_PKEY_DEFAULT 0xffff
35
36 /** Infiniband partition key full membership flag */
37 #define IB_PKEY_FULL 0x8000
38
39 /**
40  * Maximum payload size
41  *
42  * This is currently hard-coded in various places (drivers, subnet
43  * management agent, etc.) to 2048.
44  */
45 #define IB_MAX_PAYLOAD_SIZE 2048
46
47 struct ib_device;
48 struct ib_queue_pair;
49 struct ib_address_vector;
50 struct ib_completion_queue;
51 struct ib_mad_interface;
52
53 /** Infiniband transmission rates */
54 enum ib_rate {
55         IB_RATE_2_5 = 2,
56         IB_RATE_10 = 3,
57         IB_RATE_30 = 4,
58         IB_RATE_5 = 5,
59         IB_RATE_20 = 6,
60         IB_RATE_40 = 7,
61         IB_RATE_60 = 8,
62         IB_RATE_80 = 9,
63         IB_RATE_120 = 10,
64 };
65
66 /** An Infiniband Address Vector */
67 struct ib_address_vector {
68         /** Queue Pair Number */
69         unsigned long qpn;
70         /** Queue key
71          *
72          * Not specified for received packets.
73          */
74         unsigned long qkey;
75         /** Local ID */
76         unsigned int lid;
77         /** Rate
78          *
79          * Not specified for received packets.
80          */
81         enum ib_rate rate;
82         /** Service level */
83         unsigned int sl;
84         /** GID is present */
85         unsigned int gid_present;
86         /** GID, if present */
87         struct ib_gid gid;
88 };
89
90 /** An Infiniband Work Queue */
91 struct ib_work_queue {
92         /** Containing queue pair */
93         struct ib_queue_pair *qp;
94         /** "Is a send queue" flag */
95         int is_send;
96         /** Associated completion queue */
97         struct ib_completion_queue *cq;
98         /** List of work queues on this completion queue */
99         struct list_head list;
100         /** Packet sequence number */
101         uint32_t psn;
102         /** Number of work queue entries */
103         unsigned int num_wqes;
104         /** Number of occupied work queue entries */
105         unsigned int fill;
106         /** Next work queue entry index
107          *
108          * This is the index of the next entry to be filled (i.e. the
109          * first empty entry).  This value is not bounded by num_wqes;
110          * users must logical-AND with (num_wqes-1) to generate an
111          * array index.
112          */
113         unsigned long next_idx;
114         /** I/O buffers assigned to work queue */
115         struct io_buffer **iobufs;
116         /** Driver private data */
117         void *drv_priv;
118 };
119
120 /** An Infiniband multicast GID */
121 struct ib_multicast_gid {
122         /** List of multicast GIDs on this QP */
123         struct list_head list;
124         /** Multicast GID */
125         struct ib_gid gid;
126 };
127
128 /** An Infiniband queue pair type */
129 enum ib_queue_pair_type {
130         IB_QPT_SMI,
131         IB_QPT_GSI,
132         IB_QPT_UD,
133         IB_QPT_RC,
134 };
135
136 /** An Infiniband Queue Pair */
137 struct ib_queue_pair {
138         /** Containing Infiniband device */
139         struct ib_device *ibdev;
140         /** List of queue pairs on this Infiniband device */
141         struct list_head list;
142         /** Queue pair number */
143         unsigned long qpn;
144         /** Externally-visible queue pair number
145          *
146          * This may differ from the real queue pair number (e.g. when
147          * the HCA cannot use the management QPNs 0 and 1 as hardware
148          * QPNs and needs to remap them).
149          */
150         unsigned long ext_qpn;
151         /** Queue pair type */
152         enum ib_queue_pair_type type;
153         /** Queue key */
154         unsigned long qkey;
155         /** Send queue */
156         struct ib_work_queue send;
157         /** Receive queue */
158         struct ib_work_queue recv;
159         /** List of multicast GIDs */
160         struct list_head mgids;
161         /** Address vector */
162         struct ib_address_vector av;
163         /** Driver private data */
164         void *drv_priv;
165         /** Queue owner private data */
166         void *owner_priv;
167 };
168
169 /** Infiniband completion queue operations */
170 struct ib_completion_queue_operations {
171         /**
172          * Complete Send WQE
173          *
174          * @v ibdev             Infiniband device
175          * @v qp                Queue pair
176          * @v iobuf             I/O buffer
177          * @v rc                Completion status code
178          */
179         void ( * complete_send ) ( struct ib_device *ibdev,
180                                    struct ib_queue_pair *qp,
181                                    struct io_buffer *iobuf, int rc );
182         /**
183          * Complete Receive WQE
184          *
185          * @v ibdev             Infiniband device
186          * @v qp                Queue pair
187          * @v av                Address vector, or NULL
188          * @v iobuf             I/O buffer
189          * @v rc                Completion status code
190          */
191         void ( * complete_recv ) ( struct ib_device *ibdev,
192                                    struct ib_queue_pair *qp,
193                                    struct ib_address_vector *av,
194                                    struct io_buffer *iobuf, int rc );
195 };
196
197 /** An Infiniband Completion Queue */
198 struct ib_completion_queue {
199         /** Containing Infiniband device */
200         struct ib_device *ibdev;
201         /** List of completion queues on this Infiniband device */
202         struct list_head list;
203         /** Completion queue number */
204         unsigned long cqn;
205         /** Number of completion queue entries */
206         unsigned int num_cqes;
207         /** Next completion queue entry index
208          *
209          * This is the index of the next entry to be filled (i.e. the
210          * first empty entry).  This value is not bounded by num_wqes;
211          * users must logical-AND with (num_wqes-1) to generate an
212          * array index.
213          */
214         unsigned long next_idx;
215         /** List of work queues completing to this queue */
216         struct list_head work_queues;
217         /** Completion queue operations */
218         struct ib_completion_queue_operations *op;
219         /** Driver private data */
220         void *drv_priv;
221 };
222
223 /**
224  * Infiniband device operations
225  *
226  * These represent a subset of the Infiniband Verbs.
227  */
228 struct ib_device_operations {
229         /** Create completion queue
230          *
231          * @v ibdev             Infiniband device
232          * @v cq                Completion queue
233          * @ret rc              Return status code
234          */
235         int ( * create_cq ) ( struct ib_device *ibdev,
236                               struct ib_completion_queue *cq );
237         /** Destroy completion queue
238          *
239          * @v ibdev             Infiniband device
240          * @v cq                Completion queue
241          */
242         void ( * destroy_cq ) ( struct ib_device *ibdev,
243                                 struct ib_completion_queue *cq );
244         /** Create queue pair
245          *
246          * @v ibdev             Infiniband device
247          * @v qp                Queue pair
248          * @ret rc              Return status code
249          */
250         int ( * create_qp ) ( struct ib_device *ibdev,
251                               struct ib_queue_pair *qp );
252         /** Modify queue pair
253          *
254          * @v ibdev             Infiniband device
255          * @v qp                Queue pair
256          * @ret rc              Return status code
257          */
258         int ( * modify_qp ) ( struct ib_device *ibdev,
259                               struct ib_queue_pair *qp );
260         /** Destroy queue pair
261          *
262          * @v ibdev             Infiniband device
263          * @v qp                Queue pair
264          */
265         void ( * destroy_qp ) ( struct ib_device *ibdev,
266                                 struct ib_queue_pair *qp );
267         /** Post send work queue entry
268          *
269          * @v ibdev             Infiniband device
270          * @v qp                Queue pair
271          * @v av                Address vector
272          * @v iobuf             I/O buffer
273          * @ret rc              Return status code
274          *
275          * If this method returns success, the I/O buffer remains
276          * owned by the queue pair.  If this method returns failure,
277          * the I/O buffer is immediately released; the failure is
278          * interpreted as "failure to enqueue buffer".
279          */
280         int ( * post_send ) ( struct ib_device *ibdev,
281                               struct ib_queue_pair *qp,
282                               struct ib_address_vector *av,
283                               struct io_buffer *iobuf );
284         /** Post receive work queue entry
285          *
286          * @v ibdev             Infiniband device
287          * @v qp                Queue pair
288          * @v iobuf             I/O buffer
289          * @ret rc              Return status code
290          *
291          * If this method returns success, the I/O buffer remains
292          * owned by the queue pair.  If this method returns failure,
293          * the I/O buffer is immediately released; the failure is
294          * interpreted as "failure to enqueue buffer".
295          */
296         int ( * post_recv ) ( struct ib_device *ibdev,
297                               struct ib_queue_pair *qp,
298                               struct io_buffer *iobuf );
299         /** Poll completion queue
300          *
301          * @v ibdev             Infiniband device
302          * @v cq                Completion queue
303          *
304          * The relevant completion handler (specified at completion
305          * queue creation time) takes ownership of the I/O buffer.
306          */
307         void ( * poll_cq ) ( struct ib_device *ibdev,
308                              struct ib_completion_queue *cq );
309         /**
310          * Poll event queue
311          *
312          * @v ibdev             Infiniband device
313          */
314         void ( * poll_eq ) ( struct ib_device *ibdev );
315         /**
316          * Open port
317          *
318          * @v ibdev             Infiniband device
319          * @ret rc              Return status code
320          */
321         int ( * open ) ( struct ib_device *ibdev );
322         /**
323          * Close port
324          *
325          * @v ibdev             Infiniband device
326          */
327         void ( * close ) ( struct ib_device *ibdev );
328         /** Attach to multicast group
329          *
330          * @v ibdev             Infiniband device
331          * @v qp                Queue pair
332          * @v gid               Multicast GID
333          * @ret rc              Return status code
334          */
335         int ( * mcast_attach ) ( struct ib_device *ibdev,
336                                  struct ib_queue_pair *qp,
337                                  struct ib_gid *gid );
338         /** Detach from multicast group
339          *
340          * @v ibdev             Infiniband device
341          * @v qp                Queue pair
342          * @v gid               Multicast GID
343          */
344         void ( * mcast_detach ) ( struct ib_device *ibdev,
345                                   struct ib_queue_pair *qp,
346                                   struct ib_gid *gid );
347         /** Set port information
348          *
349          * @v ibdev             Infiniband device
350          * @v mad               Set port information MAD
351          *
352          * This method is required only by adapters that do not have
353          * an embedded SMA.
354          */
355         int ( * set_port_info ) ( struct ib_device *ibdev, union ib_mad *mad );
356         /** Set partition key table
357          *
358          * @v ibdev             Infiniband device
359          * @v mad               Set partition key table MAD
360          *
361          * This method is required only by adapters that do not have
362          * an embedded SMA.
363          */
364         int ( * set_pkey_table ) ( struct ib_device *ibdev,
365                                    union ib_mad *mad );
366 };
367
368 /** An Infiniband device */
369 struct ib_device {
370         /** Reference counter */
371         struct refcnt refcnt;
372         /** List of Infiniband devices */
373         struct list_head list;
374         /** List of open Infiniband devices */
375         struct list_head open_list;
376         /** Underlying device */
377         struct device *dev;
378         /** List of completion queues */
379         struct list_head cqs;
380         /** List of queue pairs */
381         struct list_head qps;
382         /** Infiniband operations */
383         struct ib_device_operations *op;
384         /** Port number */
385         unsigned int port;
386         /** Port open request counter */
387         unsigned int open_count;
388
389         /** Port state */
390         uint8_t port_state;
391         /** Link width supported */
392         uint8_t link_width_supported;
393         /** Link width enabled */
394         uint8_t link_width_enabled;
395         /** Link width active */
396         uint8_t link_width_active;
397         /** Link speed supported */
398         uint8_t link_speed_supported;
399         /** Link speed enabled */
400         uint8_t link_speed_enabled;
401         /** Link speed active */
402         uint8_t link_speed_active;
403         /** Port GID */
404         struct ib_gid gid;
405         /** Port LID */
406         uint16_t lid;
407         /** Subnet manager LID */
408         uint16_t sm_lid;
409         /** Subnet manager SL */
410         uint8_t sm_sl;
411         /** Partition key */
412         uint16_t pkey;
413
414         /** RDMA key
415          *
416          * This is a single key allowing unrestricted access to
417          * memory.
418          */
419         uint32_t rdma_key;
420
421         /** Subnet management interface */
422         struct ib_mad_interface *smi;
423         /** General services interface */
424         struct ib_mad_interface *gsi;
425
426         /** Driver private data */
427         void *drv_priv;
428         /** Owner private data */
429         void *owner_priv;
430 };
431
432 extern struct ib_completion_queue *
433 ib_create_cq ( struct ib_device *ibdev, unsigned int num_cqes,
434                struct ib_completion_queue_operations *op );
435 extern void ib_destroy_cq ( struct ib_device *ibdev,
436                             struct ib_completion_queue *cq );
437 extern void ib_poll_cq ( struct ib_device *ibdev,
438                          struct ib_completion_queue *cq );
439 extern struct ib_queue_pair *
440 ib_create_qp ( struct ib_device *ibdev, enum ib_queue_pair_type type,
441                unsigned int num_send_wqes, struct ib_completion_queue *send_cq,
442                unsigned int num_recv_wqes,
443                struct ib_completion_queue *recv_cq );
444 extern int ib_modify_qp ( struct ib_device *ibdev, struct ib_queue_pair *qp );
445 extern void ib_destroy_qp ( struct ib_device *ibdev,
446                             struct ib_queue_pair *qp );
447 extern struct ib_queue_pair * ib_find_qp_qpn ( struct ib_device *ibdev,
448                                                unsigned long qpn );
449 extern struct ib_queue_pair * ib_find_qp_mgid ( struct ib_device *ibdev,
450                                                 struct ib_gid *gid );
451 extern struct ib_work_queue * ib_find_wq ( struct ib_completion_queue *cq,
452                                            unsigned long qpn, int is_send );
453 extern int ib_post_send ( struct ib_device *ibdev, struct ib_queue_pair *qp,
454                           struct ib_address_vector *av,
455                           struct io_buffer *iobuf );
456 extern int ib_post_recv ( struct ib_device *ibdev, struct ib_queue_pair *qp,
457                           struct io_buffer *iobuf );
458 extern void ib_complete_send ( struct ib_device *ibdev,
459                                struct ib_queue_pair *qp,
460                                struct io_buffer *iobuf, int rc );
461 extern void ib_complete_recv ( struct ib_device *ibdev,
462                                struct ib_queue_pair *qp,
463                                struct ib_address_vector *av,
464                                struct io_buffer *iobuf, int rc );
465 extern void ib_refill_recv ( struct ib_device *ibdev,
466                              struct ib_queue_pair *qp );
467 extern int ib_open ( struct ib_device *ibdev );
468 extern void ib_close ( struct ib_device *ibdev );
469 extern int ib_link_rc ( struct ib_device *ibdev );
470 extern int ib_mcast_attach ( struct ib_device *ibdev, struct ib_queue_pair *qp,
471                              struct ib_gid *gid );
472 extern void ib_mcast_detach ( struct ib_device *ibdev,
473                               struct ib_queue_pair *qp, struct ib_gid *gid );
474 extern int ib_get_hca_info ( struct ib_device *ibdev,
475                              struct ib_gid_half *hca_guid );
476 extern int ib_set_port_info ( struct ib_device *ibdev, union ib_mad *mad );
477 extern int ib_set_pkey_table ( struct ib_device *ibdev, union ib_mad *mad );
478 extern struct ib_device * alloc_ibdev ( size_t priv_size );
479 extern int register_ibdev ( struct ib_device *ibdev );
480 extern void unregister_ibdev ( struct ib_device *ibdev );
481 extern struct ib_device * find_ibdev ( struct ib_gid *gid );
482 extern struct ib_device * last_opened_ibdev ( void );
483 extern void ib_link_state_changed ( struct ib_device *ibdev );
484 extern void ib_poll_eq ( struct ib_device *ibdev );
485 extern struct list_head ib_devices;
486
487 /** Iterate over all network devices */
488 #define for_each_ibdev( ibdev ) \
489         list_for_each_entry ( (ibdev), &ib_devices, list )
490
491 /**
492  * Check link state
493  *
494  * @v ibdev             Infiniband device
495  * @ret link_up         Link is up
496  */
497 static inline __always_inline int
498 ib_link_ok ( struct ib_device *ibdev ) {
499         return ( ibdev->port_state == IB_PORT_STATE_ACTIVE );
500 }
501
502 /**
503  * Get reference to Infiniband device
504  *
505  * @v ibdev             Infiniband device
506  * @ret ibdev           Infiniband device
507  */
508 static inline __always_inline struct ib_device *
509 ibdev_get ( struct ib_device *ibdev ) {
510         ref_get ( &ibdev->refcnt );
511         return ibdev;
512 }
513
514 /**
515  * Drop reference to Infiniband device
516  *
517  * @v ibdev             Infiniband device
518  */
519 static inline __always_inline void
520 ibdev_put ( struct ib_device *ibdev ) {
521         ref_put ( &ibdev->refcnt );
522 }
523
524 /**
525  * Set Infiniband work queue driver-private data
526  *
527  * @v wq                Work queue
528  * @v priv              Private data
529  */
530 static inline __always_inline void
531 ib_wq_set_drvdata ( struct ib_work_queue *wq, void *priv ) {
532         wq->drv_priv = priv;
533 }
534
535 /**
536  * Get Infiniband work queue driver-private data
537  *
538  * @v wq                Work queue
539  * @ret priv            Private data
540  */
541 static inline __always_inline void *
542 ib_wq_get_drvdata ( struct ib_work_queue *wq ) {
543         return wq->drv_priv;
544 }
545
546 /**
547  * Set Infiniband queue pair driver-private data
548  *
549  * @v qp                Queue pair
550  * @v priv              Private data
551  */
552 static inline __always_inline void
553 ib_qp_set_drvdata ( struct ib_queue_pair *qp, void *priv ) {
554         qp->drv_priv = priv;
555 }
556
557 /**
558  * Get Infiniband queue pair driver-private data
559  *
560  * @v qp                Queue pair
561  * @ret priv            Private data
562  */
563 static inline __always_inline void *
564 ib_qp_get_drvdata ( struct ib_queue_pair *qp ) {
565         return qp->drv_priv;
566 }
567
568 /**
569  * Set Infiniband queue pair owner-private data
570  *
571  * @v qp                Queue pair
572  * @v priv              Private data
573  */
574 static inline __always_inline void
575 ib_qp_set_ownerdata ( struct ib_queue_pair *qp, void *priv ) {
576         qp->owner_priv = priv;
577 }
578
579 /**
580  * Get Infiniband queue pair owner-private data
581  *
582  * @v qp                Queue pair
583  * @ret priv            Private data
584  */
585 static inline __always_inline void *
586 ib_qp_get_ownerdata ( struct ib_queue_pair *qp ) {
587         return qp->owner_priv;
588 }
589
590 /**
591  * Set Infiniband completion queue driver-private data
592  *
593  * @v cq                Completion queue
594  * @v priv              Private data
595  */
596 static inline __always_inline void
597 ib_cq_set_drvdata ( struct ib_completion_queue *cq, void *priv ) {
598         cq->drv_priv = priv;
599 }
600
601 /**
602  * Get Infiniband completion queue driver-private data
603  *
604  * @v cq                Completion queue
605  * @ret priv            Private data
606  */
607 static inline __always_inline void *
608 ib_cq_get_drvdata ( struct ib_completion_queue *cq ) {
609         return cq->drv_priv;
610 }
611
612 /**
613  * Set Infiniband device driver-private data
614  *
615  * @v ibdev             Infiniband device
616  * @v priv              Private data
617  */
618 static inline __always_inline void
619 ib_set_drvdata ( struct ib_device *ibdev, void *priv ) {
620         ibdev->drv_priv = priv;
621 }
622
623 /**
624  * Get Infiniband device driver-private data
625  *
626  * @v ibdev             Infiniband device
627  * @ret priv            Private data
628  */
629 static inline __always_inline void *
630 ib_get_drvdata ( struct ib_device *ibdev ) {
631         return ibdev->drv_priv;
632 }
633
634 /**
635  * Set Infiniband device owner-private data
636  *
637  * @v ibdev             Infiniband device
638  * @v priv              Private data
639  */
640 static inline __always_inline void
641 ib_set_ownerdata ( struct ib_device *ibdev, void *priv ) {
642         ibdev->owner_priv = priv;
643 }
644
645 /**
646  * Get Infiniband device owner-private data
647  *
648  * @v ibdev             Infiniband device
649  * @ret priv            Private data
650  */
651 static inline __always_inline void *
652 ib_get_ownerdata ( struct ib_device *ibdev ) {
653         return ibdev->owner_priv;
654 }
655
656 #endif /* _GPXE_INFINIBAND_H */