Broadcast GID is now calculated by IPoIB layer.
[people/pcmattman/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 #include <stdint.h>
11 #include <gpxe/device.h>
12
13 /** Subnet administrator QPN */
14 #define IB_SA_QPN       1
15
16 /** Subnet administrator queue key */
17 #define IB_GLOBAL_QKEY  0x80010000UL
18
19 /** An Infiniband Global Identifier */
20 struct ib_gid {
21         union {
22                 uint8_t bytes[16];
23                 uint16_t words[8];
24                 uint32_t dwords[4];
25         } u;
26 };
27
28 /** An Infiniband Global Route Header */
29 struct ib_global_route_header {
30         /** IP version, traffic class, and flow label
31          *
32          *  4 bits : Version of the GRH
33          *  8 bits : Traffic class
34          * 20 bits : Flow label
35          */
36         uint32_t ipver_tclass_flowlabel;
37         /** Payload length */
38         uint16_t paylen;
39         /** Next header */
40         uint8_t nxthdr;
41         /** Hop limit */
42         uint8_t hoplmt;
43         /** Source GID */
44         struct ib_gid sgid;
45         /** Destiniation GID */
46         struct ib_gid dgid;
47 } __attribute__ (( packed ));
48
49 struct ib_device;
50 struct ib_queue_pair;
51 struct ib_completion_queue;
52
53 /** An Infiniband Work Queue */
54 struct ib_work_queue {
55         /** Containing queue pair */
56         struct ib_queue_pair *qp;
57         /** "Is a send queue" flag */
58         int is_send;
59         /** Associated completion queue */
60         struct ib_completion_queue *cq;
61         /** List of work queues on this completion queue */
62         struct list_head list;
63         /** Number of work queue entries */
64         unsigned int num_wqes;
65         /** Next work queue entry index
66          *
67          * This is the index of the next entry to be filled (i.e. the
68          * first empty entry).  This value is not bounded by num_wqes;
69          * users must logical-AND with (num_wqes-1) to generate an
70          * array index.
71          */
72         unsigned long next_idx;
73         /** I/O buffers assigned to work queue */
74         struct io_buffer **iobufs;
75         /** Device private data */
76         void *dev_priv;
77 };
78
79 /** An Infiniband Queue Pair */
80 struct ib_queue_pair {
81         /** Queue Pair Number */
82         unsigned long qpn;
83         /** Queue key */
84         unsigned long qkey;
85         /** Send queue */
86         struct ib_work_queue send;
87         /** Receive queue */
88         struct ib_work_queue recv;
89         /** Device private data */
90         void *dev_priv;
91         /** Queue owner private data */
92         void *owner_priv;
93 };
94
95 /** An Infiniband Completion Queue */
96 struct ib_completion_queue {
97         /** Completion queue number */
98         unsigned long cqn;
99         /** Number of completion queue entries */
100         unsigned int num_cqes;
101         /** Next completion queue entry index
102          *
103          * This is the index of the next entry to be filled (i.e. the
104          * first empty entry).  This value is not bounded by num_wqes;
105          * users must logical-AND with (num_wqes-1) to generate an
106          * array index.
107          */
108         unsigned long next_idx;
109         /** List of work queues completing to this queue */
110         struct list_head work_queues;
111         /** Device private data */
112         void *dev_priv;
113 };
114
115 /** An Infiniband completion */
116 struct ib_completion {
117         /** Syndrome
118          *
119          * If non-zero, then the completion is in error.
120          */
121         unsigned int syndrome;
122         /** Length */
123         size_t len;
124 };
125
126 /** An Infiniband completion handler
127  *
128  * @v ibdev             Infiniband device
129  * @v qp                Queue pair
130  * @v completion        Completion
131  * @v iobuf             I/O buffer
132  */
133 typedef void ( * ib_completer_t ) ( struct ib_device *ibdev,
134                                     struct ib_queue_pair *qp,
135                                     struct ib_completion *completion,
136                                     struct io_buffer *iobuf );
137
138 /** An Infiniband Address Vector */
139 struct ib_address_vector {
140         /** Destination Queue Pair */
141         unsigned int dest_qp;
142         /** Queue key */
143         unsigned long qkey;
144         /** Destination Local ID */
145         unsigned int dlid;
146         /** Rate */
147         unsigned int rate;
148         /** Service level */
149         unsigned int sl;
150         /** GID is present */
151         unsigned int gid_present;
152         /** GID */
153         struct ib_gid gid;
154 };
155
156 /**
157  * Infiniband device operations
158  *
159  * These represent a subset of the Infiniband Verbs.
160  */
161 struct ib_device_operations {
162         /** Create completion queue
163          *
164          * @v ibdev             Infiniband device
165          * @v cq                Completion queue
166          * @ret rc              Return status code
167          */
168         int ( * create_cq ) ( struct ib_device *ibdev,
169                               struct ib_completion_queue *cq );
170         /** Destroy completion queue
171          *
172          * @v ibdev             Infiniband device
173          * @v cq                Completion queue
174          */
175         void ( * destroy_cq ) ( struct ib_device *ibdev,
176                                 struct ib_completion_queue *cq );
177         /** Create queue pair
178          *
179          * @v ibdev             Infiniband device
180          * @v qp                Queue pair
181          * @ret rc              Return status code
182          */
183         int ( * create_qp ) ( struct ib_device *ibdev,
184                               struct ib_queue_pair *qp );
185         /** Destroy queue pair
186          *
187          * @v ibdev             Infiniband device
188          * @v qp                Queue pair
189          */
190         void ( * destroy_qp ) ( struct ib_device *ibdev,
191                                 struct ib_queue_pair *qp );
192         /** Post send work queue entry
193          *
194          * @v ibdev             Infiniband device
195          * @v qp                Queue pair
196          * @v av                Address vector
197          * @v iobuf             I/O buffer
198          * @ret rc              Return status code
199          *
200          * If this method returns success, the I/O buffer remains
201          * owned by the queue pair.  If this method returns failure,
202          * the I/O buffer is immediately released; the failure is
203          * interpreted as "failure to enqueue buffer".
204          */
205         int ( * post_send ) ( struct ib_device *ibdev,
206                               struct ib_queue_pair *qp,
207                               struct ib_address_vector *av,
208                               struct io_buffer *iobuf );
209         /** Post receive work queue entry
210          *
211          * @v ibdev             Infiniband device
212          * @v qp                Queue pair
213          * @v iobuf             I/O buffer
214          * @ret rc              Return status code
215          *
216          * If this method returns success, the I/O buffer remains
217          * owned by the queue pair.  If this method returns failure,
218          * the I/O buffer is immediately released; the failure is
219          * interpreted as "failure to enqueue buffer".
220          */
221         int ( * post_recv ) ( struct ib_device *ibdev,
222                               struct ib_queue_pair *qp,
223                               struct io_buffer *iobuf );
224         /** Poll completion queue
225          *
226          * @v ibdev             Infiniband device
227          * @v cq                Completion queue
228          * @v complete_send     Send completion handler
229          * @v complete_recv     Receive completion handler
230          *
231          * The completion handler takes ownership of the I/O buffer.
232          */
233         void ( * poll_cq ) ( struct ib_device *ibdev,
234                              struct ib_completion_queue *cq,
235                              ib_completer_t complete_send,
236                              ib_completer_t complete_recv );
237         /** Attach to multicast group
238          *
239          * @v ibdev             Infiniband device
240          * @v qp                Queue pair
241          * @v gid               Multicast GID
242          * @ret rc              Return status code
243          */
244         int ( * mcast_attach ) ( struct ib_device *ibdev,
245                                  struct ib_queue_pair *qp,
246                                  struct ib_gid *gid );
247         /** Detach from multicast group
248          *
249          * @v ibdev             Infiniband device
250          * @v qp                Queue pair
251          * @v gid               Multicast GID
252          */
253         void ( * mcast_detach ) ( struct ib_device *ibdev,
254                                   struct ib_queue_pair *qp,
255                                   struct ib_gid *gid );
256 };
257
258 /** An Infiniband device */
259 struct ib_device {
260         /** Port GID */
261         struct ib_gid port_gid;
262         /** Subnet manager LID */
263         unsigned long sm_lid;
264         /** Partition key */
265         unsigned int pkey;
266         /** Underlying device */
267         struct device *dev;
268         /** Infiniband operations */
269         struct ib_device_operations *op;
270         /** Device private data */
271         void *dev_priv;
272         /** Owner private data */
273         void *owner_priv;
274 };
275
276 extern struct ib_completion_queue * ib_create_cq ( struct ib_device *ibdev,
277                                                    unsigned int num_cqes );
278 extern void ib_destroy_cq ( struct ib_device *ibdev,
279                             struct ib_completion_queue *cq );
280 extern struct ib_queue_pair *
281 ib_create_qp ( struct ib_device *ibdev, unsigned int num_send_wqes,
282                struct ib_completion_queue *send_cq, unsigned int num_recv_wqes,
283                struct ib_completion_queue *recv_cq, unsigned long qkey );
284 extern void ib_destroy_qp ( struct ib_device *ibdev,
285                             struct ib_queue_pair *qp );
286 extern struct ib_work_queue * ib_find_wq ( struct ib_completion_queue *cq,
287                                            unsigned long qpn, int is_send );
288 extern struct ib_device * alloc_ibdev ( size_t priv_size );
289 extern void free_ibdev ( struct ib_device *ibdev );
290
291 /**
292  * Post send work queue entry
293  *
294  * @v ibdev             Infiniband device
295  * @v qp                Queue pair
296  * @v av                Address vector
297  * @v iobuf             I/O buffer
298  * @ret rc              Return status code
299  */
300 static inline __attribute__ (( always_inline )) int
301 ib_post_send ( struct ib_device *ibdev, struct ib_queue_pair *qp,
302                struct ib_address_vector *av, struct io_buffer *iobuf ) {
303         return ibdev->op->post_send ( ibdev, qp, av, iobuf );
304 }
305
306 /**
307  * Post receive work queue entry
308  *
309  * @v ibdev             Infiniband device
310  * @v qp                Queue pair
311  * @v iobuf             I/O buffer
312  * @ret rc              Return status code
313  */
314 static inline __attribute__ (( always_inline )) int
315 ib_post_recv ( struct ib_device *ibdev, struct ib_queue_pair *qp,
316                struct io_buffer *iobuf ) {
317         return ibdev->op->post_recv ( ibdev, qp, iobuf );
318 }
319
320 /**
321  * Poll completion queue
322  *
323  * @v ibdev             Infiniband device
324  * @v cq                Completion queue
325  * @v complete_send     Send completion handler
326  * @v complete_recv     Receive completion handler
327  */
328 static inline __attribute__ (( always_inline )) void
329 ib_poll_cq ( struct ib_device *ibdev, struct ib_completion_queue *cq,
330              ib_completer_t complete_send, ib_completer_t complete_recv ) {
331         ibdev->op->poll_cq ( ibdev, cq, complete_send, complete_recv );
332 }
333
334
335 /**
336  * Attach to multicast group
337  *
338  * @v ibdev             Infiniband device
339  * @v qp                Queue pair
340  * @v gid               Multicast GID
341  * @ret rc              Return status code
342  */
343 static inline __attribute__ (( always_inline )) int
344 ib_mcast_attach ( struct ib_device *ibdev, struct ib_queue_pair *qp,
345                   struct ib_gid *gid ) {
346         return ibdev->op->mcast_attach ( ibdev, qp, gid );
347 }
348
349 /**
350  * Detach from multicast group
351  *
352  * @v ibdev             Infiniband device
353  * @v qp                Queue pair
354  * @v gid               Multicast GID
355  */
356 static inline __attribute__ (( always_inline )) void
357 ib_mcast_detach ( struct ib_device *ibdev, struct ib_queue_pair *qp,
358                   struct ib_gid *gid ) {
359         ibdev->op->mcast_detach ( ibdev, qp, gid );
360 }
361
362 /**
363  * Set Infiniband owner-private data
364  *
365  * @v pci               Infiniband device
366  * @v priv              Private data
367  */
368 static inline void ib_set_ownerdata ( struct ib_device *ibdev,
369                                       void *owner_priv ) {
370         ibdev->owner_priv = owner_priv;
371 }
372
373 /**
374  * Get Infiniband owner-private data
375  *
376  * @v pci               Infiniband device
377  * @ret priv            Private data
378  */
379 static inline void * ib_get_ownerdata ( struct ib_device *ibdev ) {
380         return ibdev->owner_priv;
381 }
382
383 /*****************************************************************************
384  *
385  * Management datagrams
386  *
387  * Portions Copyright (c) 2004 Mellanox Technologies Ltd.  All rights
388  * reserved.
389  *
390  */
391
392 /* Management base version */
393 #define IB_MGMT_BASE_VERSION                    1
394
395 /* Management classes */
396 #define IB_MGMT_CLASS_SUBN_LID_ROUTED           0x01
397 #define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE       0x81
398 #define IB_MGMT_CLASS_SUBN_ADM                  0x03
399 #define IB_MGMT_CLASS_PERF_MGMT                 0x04
400 #define IB_MGMT_CLASS_BM                        0x05
401 #define IB_MGMT_CLASS_DEVICE_MGMT               0x06
402 #define IB_MGMT_CLASS_CM                        0x07
403 #define IB_MGMT_CLASS_SNMP                      0x08
404 #define IB_MGMT_CLASS_VENDOR_RANGE2_START       0x30
405 #define IB_MGMT_CLASS_VENDOR_RANGE2_END         0x4F
406
407 /* Management methods */
408 #define IB_MGMT_METHOD_GET                      0x01
409 #define IB_MGMT_METHOD_SET                      0x02
410 #define IB_MGMT_METHOD_GET_RESP                 0x81
411 #define IB_MGMT_METHOD_SEND                     0x03
412 #define IB_MGMT_METHOD_TRAP                     0x05
413 #define IB_MGMT_METHOD_REPORT                   0x06
414 #define IB_MGMT_METHOD_REPORT_RESP              0x86
415 #define IB_MGMT_METHOD_TRAP_REPRESS             0x07
416 #define IB_MGMT_METHOD_DELETE                   0x15
417 #define IB_MGMT_METHOD_RESP                     0x80
418
419 /* Subnet management attributes */
420 #define IB_SMP_ATTR_NOTICE                      0x0002
421 #define IB_SMP_ATTR_NODE_DESC                   0x0010
422 #define IB_SMP_ATTR_NODE_INFO                   0x0011
423 #define IB_SMP_ATTR_SWITCH_INFO                 0x0012
424 #define IB_SMP_ATTR_GUID_INFO                   0x0014
425 #define IB_SMP_ATTR_PORT_INFO                   0x0015
426 #define IB_SMP_ATTR_PKEY_TABLE                  0x0016
427 #define IB_SMP_ATTR_SL_TO_VL_TABLE              0x0017
428 #define IB_SMP_ATTR_VL_ARB_TABLE                0x0018
429 #define IB_SMP_ATTR_LINEAR_FORWARD_TABLE        0x0019
430 #define IB_SMP_ATTR_RANDOM_FORWARD_TABLE        0x001A
431 #define IB_SMP_ATTR_MCAST_FORWARD_TABLE         0x001B
432 #define IB_SMP_ATTR_SM_INFO                     0x0020
433 #define IB_SMP_ATTR_VENDOR_DIAG                 0x0030
434 #define IB_SMP_ATTR_LED_INFO                    0x0031
435 #define IB_SMP_ATTR_VENDOR_MASK                 0xFF00
436
437 #define IB_SA_ATTR_MC_MEMBER_REC                0x38
438 #define IB_SA_ATTR_PATH_REC                     0x35
439
440 #define IB_SA_MCMEMBER_REC_MGID                 (1<<0)
441 #define IB_SA_MCMEMBER_REC_PORT_GID             (1<<1)
442 #define IB_SA_MCMEMBER_REC_QKEY                 (1<<2)
443 #define IB_SA_MCMEMBER_REC_MLID                 (1<<3)
444 #define IB_SA_MCMEMBER_REC_MTU_SELECTOR         (1<<4)
445 #define IB_SA_MCMEMBER_REC_MTU                  (1<<5)
446 #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS        (1<<6)
447 #define IB_SA_MCMEMBER_REC_PKEY                 (1<<7)
448 #define IB_SA_MCMEMBER_REC_RATE_SELECTOR        (1<<8)
449 #define IB_SA_MCMEMBER_REC_RATE                 (1<<9)
450 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR    (1<<10)
451 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME     (1<<11)
452 #define IB_SA_MCMEMBER_REC_SL                   (1<<12)
453 #define IB_SA_MCMEMBER_REC_FLOW_LABEL           (1<<13)
454 #define IB_SA_MCMEMBER_REC_HOP_LIMIT            (1<<14)
455 #define IB_SA_MCMEMBER_REC_SCOPE                (1<<15)
456 #define IB_SA_MCMEMBER_REC_JOIN_STATE           (1<<16)
457 #define IB_SA_MCMEMBER_REC_PROXY_JOIN           (1<<17)
458
459 #define IB_SA_PATH_REC_DGID                     (1<<2)
460 #define IB_SA_PATH_REC_SGID                     (1<<3)
461
462 struct ib_mad_hdr {
463         uint8_t base_version;
464         uint8_t mgmt_class;
465         uint8_t class_version;
466         uint8_t method;
467         uint16_t status;
468         uint16_t class_specific;
469         uint64_t tid;
470         uint16_t attr_id;
471         uint16_t resv;
472         uint32_t attr_mod;
473 } __attribute__ (( packed ));
474
475 struct ib_sa_hdr {
476         uint32_t sm_key[2];
477         uint16_t reserved;
478         uint16_t attrib_offset;
479         uint32_t comp_mask[2];
480 } __attribute__ (( packed ));
481
482 struct ib_rmpp_hdr {
483         uint32_t raw[3];
484 } __attribute__ (( packed ));
485
486 struct ib_mad_data {
487         struct ib_mad_hdr mad_hdr;
488         uint8_t data[232];
489 } __attribute__ (( packed ));
490
491 struct ib_mad_guid_info {
492         struct ib_mad_hdr mad_hdr;
493         uint32_t mkey[2];
494         uint32_t reserved[8];
495         uint8_t gid_local[8];
496 } __attribute__ (( packed ));
497
498 struct ib_mad_port_info {
499         struct ib_mad_hdr mad_hdr;
500         uint32_t mkey[2];
501         uint32_t reserved[8];
502         uint32_t mkey2[2];
503         uint8_t gid_prefix[8];
504         uint16_t lid;
505         uint16_t mastersm_lid;
506         uint32_t cap_mask;
507         uint16_t diag_code;
508         uint16_t mkey_lease_period;
509         uint8_t local_port_num;
510         uint8_t link_width_enabled;
511         uint8_t link_width_supported;
512         uint8_t link_width_active;
513         uint8_t port_state__link_speed_supported;
514         uint8_t link_down_def_state__port_phys_state;
515         uint8_t lmc__r1__mkey_prot_bits;
516         uint8_t link_speed_enabled__link_speed_active;
517 } __attribute__ (( packed ));
518
519 struct ib_mad_pkey_table {
520         struct ib_mad_hdr mad_hdr;
521         uint32_t mkey[2];
522         uint32_t reserved[8];
523         uint16_t pkey[16][2];
524 } __attribute__ (( packed ));
525
526 struct ib_mad_path_record {
527         struct ib_mad_hdr mad_hdr;
528         struct ib_rmpp_hdr rmpp_hdr;
529         struct ib_sa_hdr sa_hdr;
530         uint32_t reserved0[2];
531         struct ib_gid dgid;
532         struct ib_gid sgid;
533         uint16_t dlid;
534         uint16_t slid;
535         uint32_t hop_limit__flow_label__raw_traffic;
536         uint32_t pkey__numb_path__reversible__tclass;
537         uint8_t reserved1;
538         uint8_t reserved__sl;
539         uint8_t mtu_selector__mtu;
540         uint8_t rate_selector__rate;
541         uint32_t preference__packet_lifetime__packet_lifetime_selector;
542         uint32_t reserved2[35];
543 } __attribute__ (( packed ));
544
545 struct ib_mad_mc_member_record {
546         struct ib_mad_hdr mad_hdr;
547         struct ib_rmpp_hdr rmpp_hdr;
548         struct ib_sa_hdr sa_hdr;
549         struct ib_gid mgid;
550         struct ib_gid port_gid;
551         uint32_t qkey;
552         uint16_t mlid;
553         uint8_t mtu_selector__mtu;
554         uint8_t tclass;
555         uint16_t pkey;
556         uint8_t rate_selector__rate;
557         uint8_t packet_lifetime_selector__packet_lifetime;
558         uint32_t sl__flow_label__hop_limit;
559         uint8_t scope__join_state;
560         uint8_t proxy_join__reserved;
561         uint16_t reserved0;
562         uint32_t reserved1[37];
563 } __attribute__ (( packed ));
564
565 union ib_mad {
566         struct ib_mad_hdr mad_hdr;
567         struct ib_mad_data data;
568         struct ib_mad_guid_info guid_info;
569         struct ib_mad_port_info port_info;
570         struct ib_mad_pkey_table pkey_table;
571         struct ib_mad_path_record path_record;
572 } __attribute__ (( packed ));
573
574 #endif /* _GPXE_INFINIBAND_H */