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