[infiniband] Pass a generic MAD to ib_set_port_info()
[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
18 /** Subnet management QPN */
19 #define IB_QPN_SMA 0
20
21 /** Subnet management queue key */
22 #define IB_QKEY_SMA 0
23
24 /** General management QPN */
25 #define IB_QPN_GMA 1
26
27 /** General management queue key */
28 #define IB_QKEY_GMA 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_gma;
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         /** Externally-visible queue pair number
102          *
103          * This may differ from the real queue pair number (e.g. when
104          * the HCA cannot use the management QPNs 0 and 1 as hardware
105          * QPNs and needs to remap them).
106          */
107         unsigned long ext_qpn;
108         /** Queue pair type */
109         enum ib_queue_pair_type type;
110         /** Queue key */
111         unsigned long qkey;
112         /** Send queue */
113         struct ib_work_queue send;
114         /** Receive queue */
115         struct ib_work_queue recv;
116         /** List of multicast GIDs */
117         struct list_head mgids;
118         /** Driver private data */
119         void *drv_priv;
120         /** Queue owner private data */
121         void *owner_priv;
122 };
123
124 /** Infiniband queue pair modification flags */
125 enum ib_queue_pair_mods {
126         IB_MODIFY_QKEY = 0x0001,
127 };
128
129 /** An Infiniband Address Vector */
130 struct ib_address_vector {
131         /** Queue Pair Number */
132         unsigned long qpn;
133         /** Queue key
134          *
135          * Not specified for received packets.
136          */
137         unsigned long qkey;
138         /** Local ID */
139         unsigned int lid;
140         /** Rate
141          *
142          * Not specified for received packets.
143          */
144         unsigned int rate;
145         /** Service level */
146         unsigned int sl;
147         /** GID is present */
148         unsigned int gid_present;
149         /** GID, if present */
150         struct ib_gid gid;
151 };
152
153 /** Infiniband transmission rates */
154 enum ib_rate {
155         IB_RATE_2_5 = 2,
156         IB_RATE_10 = 3,
157         IB_RATE_30 = 4,
158         IB_RATE_5 = 5,
159         IB_RATE_20 = 6,
160         IB_RATE_40 = 7,
161         IB_RATE_60 = 8,
162         IB_RATE_80 = 9,
163         IB_RATE_120 = 10,
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          * @v mod_list          Modification list
254          * @ret rc              Return status code
255          */
256         int ( * modify_qp ) ( struct ib_device *ibdev,
257                               struct ib_queue_pair *qp,
258                               unsigned long mod_list );
259         /** Destroy queue pair
260          *
261          * @v ibdev             Infiniband device
262          * @v qp                Queue pair
263          */
264         void ( * destroy_qp ) ( struct ib_device *ibdev,
265                                 struct ib_queue_pair *qp );
266         /** Post send work queue entry
267          *
268          * @v ibdev             Infiniband device
269          * @v qp                Queue pair
270          * @v av                Address vector
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_send ) ( struct ib_device *ibdev,
280                               struct ib_queue_pair *qp,
281                               struct ib_address_vector *av,
282                               struct io_buffer *iobuf );
283         /** Post receive work queue entry
284          *
285          * @v ibdev             Infiniband device
286          * @v qp                Queue pair
287          * @v iobuf             I/O buffer
288          * @ret rc              Return status code
289          *
290          * If this method returns success, the I/O buffer remains
291          * owned by the queue pair.  If this method returns failure,
292          * the I/O buffer is immediately released; the failure is
293          * interpreted as "failure to enqueue buffer".
294          */
295         int ( * post_recv ) ( struct ib_device *ibdev,
296                               struct ib_queue_pair *qp,
297                               struct io_buffer *iobuf );
298         /** Poll completion queue
299          *
300          * @v ibdev             Infiniband device
301          * @v cq                Completion queue
302          *
303          * The relevant completion handler (specified at completion
304          * queue creation time) takes ownership of the I/O buffer.
305          */
306         void ( * poll_cq ) ( struct ib_device *ibdev,
307                              struct ib_completion_queue *cq );
308         /**
309          * Poll event queue
310          *
311          * @v ibdev             Infiniband device
312          */
313         void ( * poll_eq ) ( struct ib_device *ibdev );
314         /**
315          * Open port
316          *
317          * @v ibdev             Infiniband device
318          * @ret rc              Return status code
319          */
320         int ( * open ) ( struct ib_device *ibdev );
321         /**
322          * Close port
323          *
324          * @v ibdev             Infiniband device
325          */
326         void ( * close ) ( struct ib_device *ibdev );
327         /** Attach to multicast group
328          *
329          * @v ibdev             Infiniband device
330          * @v qp                Queue pair
331          * @v gid               Multicast GID
332          * @ret rc              Return status code
333          */
334         int ( * mcast_attach ) ( struct ib_device *ibdev,
335                                  struct ib_queue_pair *qp,
336                                  struct ib_gid *gid );
337         /** Detach from multicast group
338          *
339          * @v ibdev             Infiniband device
340          * @v qp                Queue pair
341          * @v gid               Multicast GID
342          */
343         void ( * mcast_detach ) ( struct ib_device *ibdev,
344                                   struct ib_queue_pair *qp,
345                                   struct ib_gid *gid );
346         /** Set port information
347          *
348          * @v ibdev             Infiniband device
349          * @v mad               Set port information MAD
350          *
351          * This method is required only by adapters that do not have
352          * an embedded SMA.
353          */
354         int ( * set_port_info ) ( struct ib_device *ibdev, union ib_mad *mad );
355 };
356
357 /** An Infiniband device */
358 struct ib_device {
359         /** Reference counter */
360         struct refcnt refcnt;
361         /** List of Infiniband devices */
362         struct list_head list;
363         /** Underlying device */
364         struct device *dev;
365         /** List of completion queues */
366         struct list_head cqs;
367         /** List of queue pairs */
368         struct list_head qps;
369         /** Infiniband operations */
370         struct ib_device_operations *op;
371         /** Port number */
372         unsigned int port;
373         /** Port open request counter */
374         unsigned int open_count;
375
376         /** Port state */
377         uint8_t port_state;
378         /** Link width supported */
379         uint8_t link_width_supported;
380         /** Link width enabled */
381         uint8_t link_width_enabled;
382         /** Link width active */
383         uint8_t link_width_active;
384         /** Link speed supported */
385         uint8_t link_speed_supported;
386         /** Link speed enabled */
387         uint8_t link_speed_enabled;
388         /** Link speed active */
389         uint8_t link_speed_active;
390         /** Port GID */
391         struct ib_gid gid;
392         /** Port LID */
393         uint16_t lid;
394         /** Subnet manager LID */
395         uint16_t sm_lid;
396         /** Subnet manager SL */
397         uint8_t sm_sl;
398         /** Partition key */
399         uint16_t pkey;
400
401         /** Outbound packet sequence number */
402         uint32_t psn;
403
404         /** Subnet management agent */
405         struct ib_gma *sma;
406         /** General management agent */
407         struct ib_gma *gma;
408
409         /** Driver private data */
410         void *drv_priv;
411         /** Owner private data */
412         void *owner_priv;
413 };
414
415 extern struct ib_completion_queue *
416 ib_create_cq ( struct ib_device *ibdev, unsigned int num_cqes,
417                struct ib_completion_queue_operations *op );
418 extern void ib_destroy_cq ( struct ib_device *ibdev,
419                             struct ib_completion_queue *cq );
420 extern void ib_poll_cq ( struct ib_device *ibdev,
421                          struct ib_completion_queue *cq );
422 extern struct ib_queue_pair *
423 ib_create_qp ( struct ib_device *ibdev, enum ib_queue_pair_type type,
424                unsigned int num_send_wqes, struct ib_completion_queue *send_cq,
425                unsigned int num_recv_wqes, struct ib_completion_queue *recv_cq,
426                unsigned long qkey );
427 extern int ib_modify_qp ( struct ib_device *ibdev, struct ib_queue_pair *qp,
428                           unsigned long mod_list, unsigned long qkey );
429 extern void ib_destroy_qp ( struct ib_device *ibdev,
430                             struct ib_queue_pair *qp );
431 extern struct ib_queue_pair * ib_find_qp_qpn ( struct ib_device *ibdev,
432                                                unsigned long qpn );
433 extern struct ib_queue_pair * ib_find_qp_mgid ( struct ib_device *ibdev,
434                                                 struct ib_gid *gid );
435 extern struct ib_work_queue * ib_find_wq ( struct ib_completion_queue *cq,
436                                            unsigned long qpn, int is_send );
437 extern int ib_post_send ( struct ib_device *ibdev, struct ib_queue_pair *qp,
438                           struct ib_address_vector *av,
439                           struct io_buffer *iobuf );
440 extern int ib_post_recv ( struct ib_device *ibdev, struct ib_queue_pair *qp,
441                           struct io_buffer *iobuf );
442 extern void ib_complete_send ( struct ib_device *ibdev,
443                                struct ib_queue_pair *qp,
444                                struct io_buffer *iobuf, int rc );
445 extern void ib_complete_recv ( struct ib_device *ibdev,
446                                struct ib_queue_pair *qp,
447                                struct ib_address_vector *av,
448                                struct io_buffer *iobuf, int rc );
449 extern void ib_refill_recv ( struct ib_device *ibdev,
450                              struct ib_queue_pair *qp );
451 extern int ib_open ( struct ib_device *ibdev );
452 extern void ib_close ( struct ib_device *ibdev );
453 extern int ib_mcast_attach ( struct ib_device *ibdev, struct ib_queue_pair *qp,
454                              struct ib_gid *gid );
455 extern void ib_mcast_detach ( struct ib_device *ibdev,
456                               struct ib_queue_pair *qp, struct ib_gid *gid );
457 extern int ib_get_hca_info ( struct ib_device *ibdev,
458                              struct ib_gid_half *hca_guid );
459 extern int ib_set_port_info ( struct ib_device *ibdev, union ib_mad *mad );
460 extern struct ib_device * alloc_ibdev ( size_t priv_size );
461 extern int register_ibdev ( struct ib_device *ibdev );
462 extern void unregister_ibdev ( struct ib_device *ibdev );
463 extern void ib_link_state_changed ( struct ib_device *ibdev );
464 extern void ib_poll_eq ( struct ib_device *ibdev );
465 extern struct list_head ib_devices;
466
467 /** Iterate over all network devices */
468 #define for_each_ibdev( ibdev ) \
469         list_for_each_entry ( (ibdev), &ib_devices, list )
470
471 /**
472  * Check link state
473  *
474  * @v ibdev             Infiniband device
475  * @ret link_up         Link is up
476  */
477 static inline __always_inline int
478 ib_link_ok ( struct ib_device *ibdev ) {
479         return ( ibdev->port_state == IB_PORT_STATE_ACTIVE );
480 }
481
482 /**
483  * Get reference to Infiniband device
484  *
485  * @v ibdev             Infiniband device
486  * @ret ibdev           Infiniband device
487  */
488 static inline __always_inline struct ib_device *
489 ibdev_get ( struct ib_device *ibdev ) {
490         ref_get ( &ibdev->refcnt );
491         return ibdev;
492 }
493
494 /**
495  * Drop reference to Infiniband device
496  *
497  * @v ibdev             Infiniband device
498  */
499 static inline __always_inline void
500 ibdev_put ( struct ib_device *ibdev ) {
501         ref_put ( &ibdev->refcnt );
502 }
503
504 /**
505  * Set Infiniband work queue driver-private data
506  *
507  * @v wq                Work queue
508  * @v priv              Private data
509  */
510 static inline __always_inline void
511 ib_wq_set_drvdata ( struct ib_work_queue *wq, void *priv ) {
512         wq->drv_priv = priv;
513 }
514
515 /**
516  * Get Infiniband work queue driver-private data
517  *
518  * @v wq                Work queue
519  * @ret priv            Private data
520  */
521 static inline __always_inline void *
522 ib_wq_get_drvdata ( struct ib_work_queue *wq ) {
523         return wq->drv_priv;
524 }
525
526 /**
527  * Set Infiniband queue pair driver-private data
528  *
529  * @v qp                Queue pair
530  * @v priv              Private data
531  */
532 static inline __always_inline void
533 ib_qp_set_drvdata ( struct ib_queue_pair *qp, void *priv ) {
534         qp->drv_priv = priv;
535 }
536
537 /**
538  * Get Infiniband queue pair driver-private data
539  *
540  * @v qp                Queue pair
541  * @ret priv            Private data
542  */
543 static inline __always_inline void *
544 ib_qp_get_drvdata ( struct ib_queue_pair *qp ) {
545         return qp->drv_priv;
546 }
547
548 /**
549  * Set Infiniband queue pair owner-private data
550  *
551  * @v qp                Queue pair
552  * @v priv              Private data
553  */
554 static inline __always_inline void
555 ib_qp_set_ownerdata ( struct ib_queue_pair *qp, void *priv ) {
556         qp->owner_priv = priv;
557 }
558
559 /**
560  * Get Infiniband queue pair owner-private data
561  *
562  * @v qp                Queue pair
563  * @ret priv            Private data
564  */
565 static inline __always_inline void *
566 ib_qp_get_ownerdata ( struct ib_queue_pair *qp ) {
567         return qp->owner_priv;
568 }
569
570 /**
571  * Set Infiniband completion queue driver-private data
572  *
573  * @v cq                Completion queue
574  * @v priv              Private data
575  */
576 static inline __always_inline void
577 ib_cq_set_drvdata ( struct ib_completion_queue *cq, void *priv ) {
578         cq->drv_priv = priv;
579 }
580
581 /**
582  * Get Infiniband completion queue driver-private data
583  *
584  * @v cq                Completion queue
585  * @ret priv            Private data
586  */
587 static inline __always_inline void *
588 ib_cq_get_drvdata ( struct ib_completion_queue *cq ) {
589         return cq->drv_priv;
590 }
591
592 /**
593  * Set Infiniband device driver-private data
594  *
595  * @v ibdev             Infiniband device
596  * @v priv              Private data
597  */
598 static inline __always_inline void
599 ib_set_drvdata ( struct ib_device *ibdev, void *priv ) {
600         ibdev->drv_priv = priv;
601 }
602
603 /**
604  * Get Infiniband device driver-private data
605  *
606  * @v ibdev             Infiniband device
607  * @ret priv            Private data
608  */
609 static inline __always_inline void *
610 ib_get_drvdata ( struct ib_device *ibdev ) {
611         return ibdev->drv_priv;
612 }
613
614 /**
615  * Set Infiniband device owner-private data
616  *
617  * @v ibdev             Infiniband device
618  * @v priv              Private data
619  */
620 static inline __always_inline void
621 ib_set_ownerdata ( struct ib_device *ibdev, void *priv ) {
622         ibdev->owner_priv = priv;
623 }
624
625 /**
626  * Get Infiniband device owner-private data
627  *
628  * @v ibdev             Infiniband device
629  * @ret priv            Private data
630  */
631 static inline __always_inline void *
632 ib_get_ownerdata ( struct ib_device *ibdev ) {
633         return ibdev->owner_priv;
634 }
635
636 #endif /* _GPXE_INFINIBAND_H */