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