cfd8ef9aaf926680bbe9785140324a7555229919
[people/peper/gpxe.git] / src / include / gpxe / ib_mad.h
1 #ifndef _GPXE_IB_MAD_H
2 #define _GPXE_IB_MAD_H
3
4 /** @file
5  *
6  * Infiniband management datagrams
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 #include <stdint.h>
13 #include <gpxe/ib_packet.h>
14
15 /*****************************************************************************
16  *
17  * Subnet management MADs
18  *
19  *****************************************************************************
20  */
21
22 /** A subnet management header
23  *
24  * Defined in sections 14.2.1.1 and 14.2.1.2 of the IBA.
25  */
26 struct ib_smp_hdr {
27         uint64_t mkey;
28         uint16_t slid;
29         uint16_t dlid;
30         uint8_t reserved[28];
31 } __attribute__ (( packed ));
32
33 /** Bits to ignore in the management class for subnet management MADs */
34 #define IB_SMP_CLASS_IGNORE                     0x80
35
36 /** Subnet management class version */
37 #define IB_SMP_CLASS_VERSION                    1
38
39 /** Subnet management direction bit
40  *
41  * This bit resides in the "status" field in the MAD header.
42  */
43 #define IB_SMP_STATUS_D_INBOUND                 0x8000
44
45 /* Subnet management attributes */
46 #define IB_SMP_ATTR_NOTICE                      0x0002
47 #define IB_SMP_ATTR_NODE_DESC                   0x0010
48 #define IB_SMP_ATTR_NODE_INFO                   0x0011
49 #define IB_SMP_ATTR_SWITCH_INFO                 0x0012
50 #define IB_SMP_ATTR_GUID_INFO                   0x0014
51 #define IB_SMP_ATTR_PORT_INFO                   0x0015
52 #define IB_SMP_ATTR_PKEY_TABLE                  0x0016
53 #define IB_SMP_ATTR_SL_TO_VL_TABLE              0x0017
54 #define IB_SMP_ATTR_VL_ARB_TABLE                0x0018
55 #define IB_SMP_ATTR_LINEAR_FORWARD_TABLE        0x0019
56 #define IB_SMP_ATTR_RANDOM_FORWARD_TABLE        0x001A
57 #define IB_SMP_ATTR_MCAST_FORWARD_TABLE         0x001B
58 #define IB_SMP_ATTR_SM_INFO                     0x0020
59 #define IB_SMP_ATTR_VENDOR_DIAG                 0x0030
60 #define IB_SMP_ATTR_LED_INFO                    0x0031
61 #define IB_SMP_ATTR_VENDOR_MASK                 0xFF00
62
63 /**
64  * A Node Description attribute
65  *
66  * Defined in section 14.2.5.2 of the IBA
67  */
68 struct ib_node_desc {
69         char node_string[64];
70 } __attribute__ (( packed ));
71
72 /** A Node Information attribute
73  *
74  * Defined in section 14.2.5.3 of the IBA.
75  */
76 struct ib_node_info {
77         uint8_t base_version;
78         uint8_t class_version;
79         uint8_t node_type;
80         uint8_t num_ports;
81         struct ib_gid_half sys_guid;
82         struct ib_gid_half node_guid;
83         struct ib_gid_half port_guid;
84         uint16_t partition_cap;
85         uint16_t device_id;
86         uint32_t revision;
87         uint8_t local_port_num;
88         uint8_t vendor_id[3];
89 } __attribute__ ((packed));
90
91 #define IB_NODE_TYPE_HCA                0x01
92 #define IB_NODE_TYPE_SWITCH             0x02
93 #define IB_NODE_TYPE_ROUTER             0x03
94
95 /** A GUID Information attribute
96  *
97  * Defined in section 14.2.5.5 of the IBA.
98  */
99 struct ib_guid_info {
100         uint8_t guid[8][8];
101 } __attribute__ (( packed ));
102
103 /** A Port Information attribute
104  *
105  * Defined in section 14.2.5.6 of the IBA.
106  */
107 struct ib_port_info {
108         uint64_t mkey;
109         uint8_t gid_prefix[8];
110         uint16_t lid;
111         uint16_t mastersm_lid;
112         uint32_t cap_mask;
113         uint16_t diag_code;
114         uint16_t mkey_lease_period;
115         uint8_t local_port_num;
116         uint8_t link_width_enabled;
117         uint8_t link_width_supported;
118         uint8_t link_width_active;
119         uint8_t link_speed_supported__port_state;
120         uint8_t port_phys_state__link_down_def_state;
121         uint8_t mkey_prot_bits__lmc;
122         uint8_t link_speed_active__link_speed_enabled;
123         uint8_t neighbour_mtu__mastersm_sl;
124         uint8_t vl_cap__init_type;
125         uint8_t vl_high_limit;
126         uint8_t vl_arbitration_high_cap;
127         uint8_t vl_arbitration_low_cap;
128         uint8_t init_type_reply__mtu_cap;
129         uint8_t vl_stall_count__hoq_life;
130         uint8_t operational_vls__enforcement;
131         uint16_t mkey_violations;
132         uint16_t pkey_violations;
133         uint16_t qkey_violations;
134         uint8_t guid_cap;
135         uint8_t client_reregister__subnet_timeout;
136         uint8_t resp_time_value;
137         uint8_t local_phy_errors__overrun_errors;
138         uint16_t max_credit_hint;
139         uint32_t link_round_trip_latency;
140 } __attribute__ (( packed ));
141
142 #define IB_LINK_WIDTH_1X                0x01
143 #define IB_LINK_WIDTH_4X                0x02
144 #define IB_LINK_WIDTH_8X                0x04
145 #define IB_LINK_WIDTH_12X               0x08
146
147 #define IB_LINK_SPEED_SDR               0x01
148 #define IB_LINK_SPEED_DDR               0x02
149 #define IB_LINK_SPEED_QDR               0x04
150
151 #define IB_PORT_STATE_DOWN              0x01
152 #define IB_PORT_STATE_INIT              0x02
153 #define IB_PORT_STATE_ARMED             0x03
154 #define IB_PORT_STATE_ACTIVE            0x04
155
156 #define IB_PORT_PHYS_STATE_SLEEP        0x01
157 #define IB_PORT_PHYS_STATE_POLLING      0x02
158
159 #define IB_MTU_256                      0x01
160 #define IB_MTU_512                      0x02
161 #define IB_MTU_1024                     0x03
162 #define IB_MTU_2048                     0x04
163 #define IB_MTU_4096                     0x05
164
165 #define IB_VL_0                         0x01
166 #define IB_VL_0_1                       0x02
167 #define IB_VL_0_3                       0x03
168 #define IB_VL_0_7                       0x04
169 #define IB_VL_0_14                      0x05
170
171 /** A Partition Key Table attribute
172  *
173  * Defined in section 14.2.5.7 of the IBA.
174  */
175 struct ib_pkey_table {
176         uint16_t pkey[32];
177 } __attribute__ (( packed ));
178
179 /** A subnet management attribute */
180 union ib_smp_data {
181         struct ib_node_desc node_desc;
182         struct ib_node_info node_info;
183         struct ib_guid_info guid_info;
184         struct ib_port_info port_info;
185         struct ib_pkey_table pkey_table;
186         uint8_t bytes[64];
187 } __attribute__ (( packed ));
188
189 /** A subnet management directed route path */
190 struct ib_smp_dr_path {
191         uint8_t hops[64];
192 } __attribute__ (( packed ));
193
194 /** Subnet management MAD class-specific data */
195 struct ib_smp_class_specific {
196         uint8_t hop_pointer;
197         uint8_t hop_count;
198 } __attribute__ (( packed ));
199
200 /*****************************************************************************
201  *
202  * Subnet administration MADs
203  *
204  *****************************************************************************
205  */
206
207 #define IB_SA_CLASS_VERSION                     2
208
209 #define IB_SA_METHOD_DELETE_RESP                0x95
210
211 struct ib_rmpp_hdr {
212         uint32_t raw[3];
213 } __attribute__ (( packed ));
214
215 struct ib_sa_hdr {
216         uint32_t sm_key[2];
217         uint16_t reserved;
218         uint16_t attrib_offset;
219         uint32_t comp_mask[2];
220 } __attribute__ (( packed ));
221
222 #define IB_SA_ATTR_MC_MEMBER_REC                0x38
223 #define IB_SA_ATTR_PATH_REC                     0x35
224
225 struct ib_path_record {
226         uint32_t reserved0[2];
227         struct ib_gid dgid;
228         struct ib_gid sgid;
229         uint16_t dlid;
230         uint16_t slid;
231         uint32_t hop_limit__flow_label__raw_traffic;
232         uint32_t pkey__numb_path__reversible__tclass;
233         uint8_t reserved1;
234         uint8_t reserved__sl;
235         uint8_t mtu_selector__mtu;
236         uint8_t rate_selector__rate;
237         uint32_t preference__packet_lifetime__packet_lifetime_selector;
238         uint32_t reserved2[35];
239 } __attribute__ (( packed ));
240
241 #define IB_SA_PATH_REC_DGID                     (1<<2)
242 #define IB_SA_PATH_REC_SGID                     (1<<3)
243
244 struct ib_mc_member_record {
245         struct ib_gid mgid;
246         struct ib_gid port_gid;
247         uint32_t qkey;
248         uint16_t mlid;
249         uint8_t mtu_selector__mtu;
250         uint8_t tclass;
251         uint16_t pkey;
252         uint8_t rate_selector__rate;
253         uint8_t packet_lifetime_selector__packet_lifetime;
254         uint32_t sl__flow_label__hop_limit;
255         uint8_t scope__join_state;
256         uint8_t proxy_join__reserved;
257         uint16_t reserved0;
258         uint32_t reserved1[37];
259 } __attribute__ (( packed ));
260
261 #define IB_SA_MCMEMBER_REC_MGID                 (1<<0)
262 #define IB_SA_MCMEMBER_REC_PORT_GID             (1<<1)
263 #define IB_SA_MCMEMBER_REC_QKEY                 (1<<2)
264 #define IB_SA_MCMEMBER_REC_MLID                 (1<<3)
265 #define IB_SA_MCMEMBER_REC_MTU_SELECTOR         (1<<4)
266 #define IB_SA_MCMEMBER_REC_MTU                  (1<<5)
267 #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS        (1<<6)
268 #define IB_SA_MCMEMBER_REC_PKEY                 (1<<7)
269 #define IB_SA_MCMEMBER_REC_RATE_SELECTOR        (1<<8)
270 #define IB_SA_MCMEMBER_REC_RATE                 (1<<9)
271 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR    (1<<10)
272 #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME     (1<<11)
273 #define IB_SA_MCMEMBER_REC_SL                   (1<<12)
274 #define IB_SA_MCMEMBER_REC_FLOW_LABEL           (1<<13)
275 #define IB_SA_MCMEMBER_REC_HOP_LIMIT            (1<<14)
276 #define IB_SA_MCMEMBER_REC_SCOPE                (1<<15)
277 #define IB_SA_MCMEMBER_REC_JOIN_STATE           (1<<16)
278 #define IB_SA_MCMEMBER_REC_PROXY_JOIN           (1<<17)
279
280 union ib_sa_data {
281         struct ib_path_record path_record;
282         struct ib_mc_member_record mc_member_record;
283 } __attribute__ (( packed ));
284
285 /*****************************************************************************
286  *
287  * Communication management MADs
288  *
289  *****************************************************************************
290  */
291
292 /** Communication management class version */
293 #define IB_CM_CLASS_VERSION                     2
294
295 /* Communication management attributes */
296 #define IB_CM_ATTR_CLASS_PORT_INFO              0x0001
297 #define IB_CM_ATTR_CONNECT_REQUEST              0x0010
298 #define IB_CM_ATTR_MSG_RCPT_ACK                 0x0011
299 #define IB_CM_ATTR_CONNECT_REJECT               0x0012
300 #define IB_CM_ATTR_CONNECT_REPLY                0x0013
301 #define IB_CM_ATTR_READY_TO_USE                 0x0014
302 #define IB_CM_ATTR_DISCONNECT_REQUEST           0x0015
303 #define IB_CM_ATTR_DISCONNECT_REPLY             0x0016
304 #define IB_CM_ATTR_SERVICE_ID_RES_REQ           0x0016
305 #define IB_CM_ATTR_SERVICE_ID_RES_REQ_RESP      0x0018
306 #define IB_CM_ATTR_LOAD_ALTERNATE_PATH          0x0019
307 #define IB_CM_ATTR_ALTERNATE_PATH_RESPONSE      0x001a
308
309 /** A communication management path */
310 struct ib_cm_path {
311         /** Local port LID */
312         uint16_t local_lid;
313         /** Remote port LID */
314         uint16_t remote_lid;
315         /** Local port GID */
316         struct ib_gid local_gid;
317         /** Remote port GID */
318         struct ib_gid remote_gid;
319         /** Flow label and rate */
320         uint32_t flow_label__rate;
321         /** Traffic class */
322         uint8_t tc;
323         /** Hop limit */
324         uint8_t hop_limit;
325         /** SL and subnet local*/
326         uint8_t sl__subnet_local;
327         /** Local ACK timeout */
328         uint8_t local_ack_timeout;
329 } __attribute__ (( packed ));
330
331 /** A communication management connection request
332  *
333  * Defined in section 12.6.5 of the IBA.
334  */
335 struct ib_cm_connect_request {
336         /** Local communication ID */
337         uint32_t local_id;
338         /** Reserved */
339         uint32_t reserved0[1];
340         /** Service ID */
341         struct ib_gid_half service_id;
342         /** Local CA GUID */
343         struct ib_gid_half local_ca;
344         /** Reserved */
345         uint32_t reserved1[1];
346         /** Local queue key */
347         uint32_t local_qkey;
348         /** Local QPN and responder resources*/
349         uint32_t local_qpn__responder_resources;
350         /** Local EECN and initiator depth */
351         uint32_t local_eecn__initiator_depth;
352         /** Remote EECN, remote CM response timeout, transport service
353          * type, EE flow control
354          */
355         uint32_t remote_eecn__remote_timeout__service_type__ee_flow_ctrl;
356         /** Starting PSN, local CM response timeout and retry count */
357         uint32_t starting_psn__local_timeout__retry_count;
358         /** Partition key */
359         uint16_t pkey;
360         /** Path packet payload MTU, RDC exists, RNR retry count */
361         uint8_t payload_mtu__rdc_exists__rnr_retry;
362         /** Max CM retries and SRQ */
363         uint8_t max_cm_retries__srq;
364         /** Primary path */
365         struct ib_cm_path primary;
366         /** Alternate path */
367         struct ib_cm_path alternate;
368         /** Private data */
369         uint8_t private_data[92];
370 } __attribute__ (( packed ));
371
372 /** CM transport types */
373 #define IB_CM_TRANSPORT_RC              0
374 #define IB_CM_TRANSPORT_UC              1
375 #define IB_CM_TRANSPORT_RD              2
376
377 /** A communication management connection rejection
378  *
379  * Defined in section 12.6.7 of the IBA.
380  */
381 struct ib_cm_connect_reject {
382         /** Local communication ID */
383         uint32_t local_id;
384         /** Remote communication ID */
385         uint32_t remote_id;
386         /** Message rejected */
387         uint8_t message;
388         /** Reject information length */
389         uint8_t info_len;
390         /** Rejection reason */
391         uint16_t reason;
392         /** Additional rejection information */
393         uint8_t info[72];
394         /** Private data */
395         uint8_t private_data[148];
396 } __attribute__ (( packed ));
397
398 /** A communication management connection reply
399  *
400  * Defined in section 12.6.8 of the IBA.
401  */
402 struct ib_cm_connect_reply {
403         /** Local communication ID */
404         uint32_t local_id;
405         /** Remote communication ID */
406         uint32_t remote_id;
407         /** Local queue key */
408         uint32_t local_qkey;
409         /** Local QPN */
410         uint32_t local_qpn;
411         /** Local EECN */
412         uint32_t local_eecn;
413         /** Starting PSN */
414         uint32_t starting_psn;
415         /** Responder resources */
416         uint8_t responder_resources;
417         /** Initiator depth */
418         uint8_t initiator_depth;
419         /** Target ACK delay, failover accepted, and end-to-end flow control */
420         uint8_t target_ack_delay__failover_accepted__ee_flow_ctrl;
421         /** RNR retry count, SRQ */
422         uint8_t rnr_retry__srq;
423         /** Local CA GUID */
424         struct ib_gid_half local_ca;
425         /** Private data */
426         uint8_t private_data[196];
427 } __attribute__ (( packed ));
428
429 /** A communication management ready to use reply
430  *
431  * Defined in section 12.6.9 of the IBA.
432  */
433 struct ib_cm_ready_to_use {
434         /** Local communication ID */
435         uint32_t local_id;
436         /** Remote communication ID */
437         uint32_t remote_id;
438         /** Private data */
439         uint8_t private_data[224];
440 } __attribute__ (( packed ));
441
442 /** A communication management attribute */
443 union ib_cm_data {
444         struct ib_cm_connect_request connect_request;
445         struct ib_cm_connect_reject connect_reject;
446         struct ib_cm_connect_reply connect_reply;
447         struct ib_cm_ready_to_use ready_to_use;
448         uint8_t bytes[232];
449 } __attribute__ (( packed ));
450
451 /*****************************************************************************
452  *
453  * MADs
454  *
455  *****************************************************************************
456  */
457
458 /** Management datagram class_specific data */
459 union ib_mad_class_specific {
460         uint16_t raw;
461         struct ib_smp_class_specific smp;
462 } __attribute__ (( packed ));
463
464 /** A management datagram common header
465  *
466  * Defined in section 13.4.2 of the IBA.
467  */
468 struct ib_mad_hdr {
469         uint8_t base_version;
470         uint8_t mgmt_class;
471         uint8_t class_version;
472         uint8_t method;
473         uint16_t status;
474         union ib_mad_class_specific class_specific;
475         uint32_t tid[2];
476         uint16_t attr_id;
477         uint8_t reserved[2];
478         uint32_t attr_mod;
479 } __attribute__ (( packed ));
480
481 /* Management base version */
482 #define IB_MGMT_BASE_VERSION                    1
483
484 /* Management classes */
485 #define IB_MGMT_CLASS_SUBN_LID_ROUTED           0x01
486 #define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE       0x81
487 #define IB_MGMT_CLASS_SUBN_ADM                  0x03
488 #define IB_MGMT_CLASS_PERF_MGMT                 0x04
489 #define IB_MGMT_CLASS_BM                        0x05
490 #define IB_MGMT_CLASS_DEVICE_MGMT               0x06
491 #define IB_MGMT_CLASS_CM                        0x07
492 #define IB_MGMT_CLASS_SNMP                      0x08
493 #define IB_MGMT_CLASS_VENDOR_RANGE2_START       0x30
494 #define IB_MGMT_CLASS_VENDOR_RANGE2_END         0x4f
495
496 #define IB_MGMT_CLASS_MASK                      0x7f
497
498 /* Management methods */
499 #define IB_MGMT_METHOD_GET                      0x01
500 #define IB_MGMT_METHOD_SET                      0x02
501 #define IB_MGMT_METHOD_GET_RESP                 0x81
502 #define IB_MGMT_METHOD_SEND                     0x03
503 #define IB_MGMT_METHOD_TRAP                     0x05
504 #define IB_MGMT_METHOD_REPORT                   0x06
505 #define IB_MGMT_METHOD_REPORT_RESP              0x86
506 #define IB_MGMT_METHOD_TRAP_REPRESS             0x07
507 #define IB_MGMT_METHOD_DELETE                   0x15
508
509 /* Status codes */
510 #define IB_MGMT_STATUS_OK                       0x0000
511 #define IB_MGMT_STATUS_BAD_VERSION              0x0001
512 #define IB_MGMT_STATUS_UNSUPPORTED_METHOD       0x0002
513 #define IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR  0x0003
514 #define IB_MGMT_STATUS_INVALID_VALUE            0x0004
515
516 /** A subnet management MAD */
517 struct ib_mad_smp {
518         struct ib_mad_hdr mad_hdr;
519         struct ib_smp_hdr smp_hdr;
520         union ib_smp_data smp_data;
521         struct ib_smp_dr_path initial_path;
522         struct ib_smp_dr_path return_path;
523 } __attribute__ (( packed ));
524
525 /** A subnet administration MAD */
526 struct ib_mad_sa {
527         struct ib_mad_hdr mad_hdr;
528         struct ib_rmpp_hdr rmpp_hdr;
529         struct ib_sa_hdr sa_hdr;
530         union ib_sa_data sa_data;
531 } __attribute__ (( packed ));
532
533 /** A communication management MAD */
534 struct ib_mad_cm {
535         struct ib_mad_hdr mad_hdr;
536         union ib_cm_data cm_data;
537 } __attribute__ (( packed ));
538
539 /** A management datagram */
540 union ib_mad {
541         struct ib_mad_hdr hdr;
542         struct ib_mad_smp smp;
543         struct ib_mad_sa sa;
544         struct ib_mad_cm cm;
545         uint8_t bytes[256];
546 } __attribute__ (( packed ));
547
548 #endif /* _GPXE_IB_MAD_H */