[infiniband] Poll completion queues automatically
[people/peper/gpxe.git] / src / include / gpxe / ib_packet.h
1 #ifndef _GPXE_IB_PACKET_H
2 #define _GPXE_IB_PACKET_H
3
4 /** @file
5  *
6  * Infiniband packet format
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 struct ib_device;
13 struct ib_queue_pair;
14 struct ib_address_vector;
15 struct io_buffer;
16
17 /** Half of an Infiniband Global Identifier */
18 struct ib_gid_half {
19         uint8_t bytes[8];
20 };
21
22 /** An Infiniband Global Identifier */
23 struct ib_gid {
24         union {
25                 uint8_t bytes[16];
26                 uint16_t words[8];
27                 uint32_t dwords[4];
28                 struct ib_gid_half half[2];
29         } u;
30 };
31
32 /** An Infiniband Local Route Header */
33 struct ib_local_route_header {
34         /** Virtual lane and link version */
35         uint8_t vl__lver;
36         /** Service level and next link header */
37         uint8_t sl__lnh;
38         /** Destination LID */
39         uint16_t dlid;
40         /** Packet length */
41         uint16_t length;
42         /** Source LID */
43         uint16_t slid;
44 } __attribute__ (( packed ));
45
46 /** Infiniband virtual lanes */
47 enum ib_vl {
48         IB_VL_DEFAULT = 0,
49         IB_VL_SMP = 15,
50 };
51
52 /** An Infiniband Link Next Header value */
53 enum ib_lnh {
54         IB_LNH_RAW = 0,
55         IB_LNH_IPv6 = 1,
56         IB_LNH_BTH = 2,
57         IB_LNH_GRH = 3
58 };
59
60 /** Default Infiniband LID */
61 #define IB_LID_NONE 0xffff
62
63 /** Test for multicast LID */
64 #define IB_LID_MULTICAST( lid ) ( ( (lid) >= 0xc000 ) && ( (lid) <= 0xfffe ) )
65
66 /** An Infiniband Global Route Header */
67 struct ib_global_route_header {
68         /** IP version, traffic class, and flow label
69          *
70          *  4 bits : Version of the GRH
71          *  8 bits : Traffic class
72          * 20 bits : Flow label
73          */
74         uint32_t ipver__tclass__flowlabel;
75         /** Payload length */
76         uint16_t paylen;
77         /** Next header */
78         uint8_t nxthdr;
79         /** Hop limit */
80         uint8_t hoplmt;
81         /** Source GID */
82         struct ib_gid sgid;
83         /** Destiniation GID */
84         struct ib_gid dgid;
85 } __attribute__ (( packed ));
86
87 #define IB_GRH_IPVER_IPv6 0x06
88 #define IB_GRH_NXTHDR_IBA 0x1b
89
90 /** An Infiniband Base Transport Header */
91 struct ib_base_transport_header {
92         /** Opcode */
93         uint8_t opcode;
94         /** Transport header version, pad count, migration and solicitation */
95         uint8_t se__m__padcnt__tver;
96         /** Partition key */
97         uint16_t pkey;
98         /** Destination queue pair */
99         uint32_t dest_qp;
100         /** Packet sequence number and acknowledge request */
101         uint32_t ack__psn;
102 } __attribute__ (( packed ));
103
104 /** An Infiniband BTH opcode */
105 enum ib_bth_opcode {
106         BTH_OPCODE_UD_SEND = 0x64,
107 };
108
109 /** Default Infiniband partition key */
110 #define IB_PKEY_NONE 0xffff
111
112 /** Subnet management queue pair number */
113 #define IB_QPN_SMP 0
114
115 /** An Infiniband Datagram Extended Transport Header */
116 struct ib_datagram_extended_transport_header {
117         /** Queue key */
118         uint32_t qkey;
119         /** Source queue pair */
120         uint32_t src_qp;
121 } __attribute__ (( packed ));
122
123 /** All known IB header formats */
124 union ib_headers {
125         struct ib_local_route_header lrh;
126         struct {
127                 struct ib_local_route_header lrh;
128                 struct ib_global_route_header grh;
129                 struct ib_base_transport_header bth;
130                 struct ib_datagram_extended_transport_header deth;
131         } __attribute__ (( packed )) lrh__grh__bth__deth;
132         struct {
133                 struct ib_local_route_header lrh;
134                 struct ib_base_transport_header bth;
135                 struct ib_datagram_extended_transport_header deth;
136         } __attribute__ (( packed )) lrh__bth__deth;
137 } __attribute__ (( packed ));
138
139 /** Maximum size required for IB headers */
140 #define IB_MAX_HEADER_SIZE sizeof ( union ib_headers )
141
142 extern int ib_push ( struct ib_device *ibdev, struct io_buffer *iobuf,
143                      struct ib_queue_pair *qp, size_t payload_len,
144                      const struct ib_address_vector *av );
145 extern int ib_pull ( struct ib_device *ibdev, struct io_buffer *iobuf,
146                      struct ib_queue_pair **qp, size_t *payload_len,
147                      struct ib_address_vector *av );
148
149 #endif /* _GPXE_IB_PACKET_H */