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