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