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