Browse Source

[xsigo] Add support for Xsigo virtual Ethernet (XVE) EoIB devices

Add support for EoIB devices as implemented by Xsigo.  Based on the
public (but out-of-tree) Linux kernel drivers at

  https://oss.oracle.com/git/?p=linux-uek.git;a=log;h=v4.1.12-32.2.1

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 8 years ago
parent
commit
e44f6dcb89

+ 3
- 0
src/config/config_infiniband.c View File

@@ -44,6 +44,9 @@ REQUIRE_OBJECT ( ib_srp );
44 44
 #ifdef VNIC_IPOIB
45 45
 REQUIRE_OBJECT ( ipoib );
46 46
 #endif
47
+#ifdef VNIC_XSIGO
48
+REQUIRE_OBJECT ( xsigo );
49
+#endif
47 50
 
48 51
 /*
49 52
  * Drag in Infiniband-specific commands

+ 1
- 0
src/config/general.h View File

@@ -158,6 +158,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
158 158
  *
159 159
  */
160 160
 #define VNIC_IPOIB		/* Infiniband IPoIB virtual NICs */
161
+//#define VNIC_XSIGO		/* Infiniband Xsigo virtual NICs */
161 162
 
162 163
 /*
163 164
  * Error message tables to include

+ 1
- 0
src/include/ipxe/errfile.h View File

@@ -259,6 +259,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
259 259
 #define ERRFILE_peerdisc		( ERRFILE_NET | 0x00450000 )
260 260
 #define ERRFILE_peerblk			( ERRFILE_NET | 0x00460000 )
261 261
 #define ERRFILE_peermux			( ERRFILE_NET | 0x00470000 )
262
+#define ERRFILE_xsigo			( ERRFILE_NET | 0x00480000 )
262 263
 
263 264
 #define ERRFILE_image		      ( ERRFILE_IMAGE | 0x00000000 )
264 265
 #define ERRFILE_elf		      ( ERRFILE_IMAGE | 0x00010000 )

+ 406
- 0
src/include/ipxe/xsigo.h View File

@@ -0,0 +1,406 @@
1
+#ifndef _IPXE_XSIGO_H
2
+#define _IPXE_XSIGO_H
3
+
4
+/** @file
5
+ *
6
+ * Xsigo virtual Ethernet devices
7
+ *
8
+ */
9
+
10
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11
+
12
+#include <stdint.h>
13
+#include <ipxe/infiniband.h>
14
+#include <ipxe/eoib.h>
15
+
16
+/** Xsigo directory service record name */
17
+#define XDS_SERVICE_NAME "XSIGOXDS"
18
+
19
+/** Xsigo configuration manager service ID */
20
+#define XCM_SERVICE_ID { 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x97, 0x01 }
21
+
22
+/** Xsigo management class */
23
+#define XSIGO_MGMT_CLASS 0x0b
24
+
25
+/** Xsigo management class version */
26
+#define XSIGO_MGMT_CLASS_VERSION 2
27
+
28
+/** Xsigo configuration manager request MAD */
29
+#define XSIGO_ATTR_XCM_REQUEST 0xb002
30
+
31
+/** Generic operating system type */
32
+#define XSIGO_OS_TYPE_GENERIC 0x40
33
+
34
+/** Xsigo virtual Ethernet broadcast GID prefix */
35
+#define XVE_PREFIX 0xff15101cUL
36
+
37
+/** Xsigo resource types */
38
+enum xsigo_resource_type {
39
+	/** Virtual Ethernet resource type */
40
+	XSIGO_RESOURCE_XVE = ( 1 << 6 ),
41
+	/** Absence-of-high-availability "resource" type */
42
+	XSIGO_RESOURCE_NO_HA = ( 1 << 4 ),
43
+};
44
+
45
+/** A Xsigo server identifier */
46
+struct xsigo_server_id {
47
+	/** Virtual machine ID */
48
+	uint32_t vm;
49
+	/** Port GUID */
50
+	union ib_guid guid;
51
+} __attribute__ (( packed ));
52
+
53
+/** A Xsigo configuration manager identifier */
54
+struct xsigo_manager_id {
55
+	/** Port GUID */
56
+	union ib_guid guid;
57
+	/** LID */
58
+	uint16_t lid;
59
+	/** Reserved */
60
+	uint8_t reserved[10];
61
+} __attribute__ (( packed ));
62
+
63
+/** A Xsigo configuration manager request MAD */
64
+struct xsigo_managers_request {
65
+	/** MAD header */
66
+	struct ib_mad_hdr mad_hdr;
67
+	/** Reserved */
68
+	uint8_t reserved0[32];
69
+	/** Server ID */
70
+	struct xsigo_server_id server;
71
+	/** Hostname */
72
+	char hostname[ 65 /* Seriously, guys? */ ];
73
+	/** OS version */
74
+	char os_version[32];
75
+	/** CPU architecture */
76
+	char arch[16];
77
+	/** OS type */
78
+	uint8_t os_type;
79
+	/** Reserved */
80
+	uint8_t reserved1[3];
81
+	/** Firmware version */
82
+	uint64_t firmware_version;
83
+	/** Hardware version */
84
+	uint32_t hardware_version;
85
+	/** Driver version */
86
+	uint32_t driver_version;
87
+	/** System ID */
88
+	union ib_gid system_id;
89
+	/** Resource types */
90
+	uint16_t resources;
91
+	/** Reserved */
92
+	uint8_t reserved2[2];
93
+	/** Build version */
94
+	char build[16];
95
+	/** Reserved */
96
+	uint8_t reserved3[19];
97
+} __attribute__ (( packed ));
98
+
99
+/** Resource types are present */
100
+#define XSIGO_RESOURCES_PRESENT 0x8000
101
+
102
+/** A Xsigo configuration manager reply MAD */
103
+struct xsigo_managers_reply {
104
+	/** MAD header */
105
+	struct ib_mad_hdr mad_hdr;
106
+	/** Reserved */
107
+	uint8_t reserved0[32];
108
+	/** Server ID */
109
+	struct xsigo_server_id server;
110
+	/** Number of XCM records */
111
+	uint8_t count;
112
+	/** Version */
113
+	uint8_t version;
114
+	/** Reserved */
115
+	uint8_t reserved1[2];
116
+	/** Managers */
117
+	struct xsigo_manager_id manager[8];
118
+	/** Reserved */
119
+	uint8_t reserved2[24];
120
+} __attribute__ (( packed ));
121
+
122
+/** A Xsigo MAD */
123
+union xsigo_mad {
124
+	/** Generic MAD */
125
+	union ib_mad mad;
126
+	/** Configuration manager request */
127
+	struct xsigo_managers_request request;
128
+	/** Configuration manager reply */
129
+	struct xsigo_managers_reply reply;
130
+} __attribute__ (( packed ));
131
+
132
+/** An XSMP node identifier */
133
+struct xsmp_node_id {
134
+	/** Auxiliary ID (never used) */
135
+	uint32_t aux;
136
+	/** Port GUID */
137
+	union ib_guid guid;
138
+} __attribute__ (( packed ));
139
+
140
+/** An XSMP message header */
141
+struct xsmp_message_header {
142
+	/** Message type */
143
+	uint8_t type;
144
+	/** Reason code */
145
+	uint8_t code;
146
+	/** Length */
147
+	uint16_t len;
148
+	/** Sequence number */
149
+	uint32_t seq;
150
+	/** Source node ID */
151
+	struct xsmp_node_id src;
152
+	/** Destination node ID */
153
+	struct xsmp_node_id dst;
154
+} __attribute__ (( packed ));
155
+
156
+/** XSMP message types */
157
+enum xsmp_message_type {
158
+	/** Session message type */
159
+	XSMP_TYPE_SESSION = 1,
160
+	/** Virtual Ethernet message type */
161
+	XSMP_TYPE_XVE = 6,
162
+};
163
+
164
+/** An XSMP session message */
165
+struct xsmp_session_message {
166
+	/** Message header */
167
+	struct xsmp_message_header hdr;
168
+	/** Message type */
169
+	uint8_t type;
170
+	/** Reason code */
171
+	uint8_t code;
172
+	/** Length (excluding message header) */
173
+	uint16_t len;
174
+	/** Operating system type */
175
+	uint8_t os_type;
176
+	/** Reserved */
177
+	uint8_t reserved0;
178
+	/** Resource types */
179
+	uint16_t resources;
180
+	/** Driver version */
181
+	uint32_t driver_version;
182
+	/** Required chassis version */
183
+	uint32_t chassis_version;
184
+	/** Boot flags */
185
+	uint32_t boot;
186
+	/** Firmware version */
187
+	uint64_t firmware_version;
188
+	/** Hardware version */
189
+	uint32_t hardware_version;
190
+	/** Vendor part ID */
191
+	uint32_t vendor;
192
+	/** Protocol version */
193
+	uint32_t xsmp_version;
194
+	/** Chassis name */
195
+	char chassis[32];
196
+	/** Session name */
197
+	char session[32];
198
+	/** Reserved */
199
+	uint8_t reserved1[120];
200
+} __attribute__ (( packed ));
201
+
202
+/** XSMP session message types */
203
+enum xsmp_session_type {
204
+	/** Keepalive message */
205
+	XSMP_SESSION_TYPE_HELLO = 1,
206
+	/** Initial registration message */
207
+	XSMP_SESSION_TYPE_REGISTER = 2,
208
+	/** Registration confirmation message */
209
+	XSMP_SESSION_TYPE_CONFIRM = 3,
210
+	/** Registration rejection message */
211
+	XSMP_SESSION_TYPE_REJECT = 4,
212
+	/** Shutdown message */
213
+	XSMP_SESSION_TYPE_SHUTDOWN = 5,
214
+};
215
+
216
+/** XSMP boot flags */
217
+enum xsmp_session_boot {
218
+	/** PXE boot */
219
+	XSMP_BOOT_PXE = ( 1 << 0 ),
220
+};
221
+
222
+/** XSMP virtual Ethernet channel adapter parameters */
223
+struct xsmp_xve_ca {
224
+	/** Subnet prefix (little-endian) */
225
+	union ib_guid prefix_le;
226
+	/** Control queue pair number */
227
+	uint32_t ctrl;
228
+	/** Data queue pair number */
229
+	uint32_t data;
230
+	/** Partition key */
231
+	uint16_t pkey;
232
+	/** Queue key */
233
+	uint16_t qkey;
234
+} __attribute__ (( packed ));
235
+
236
+/** XSMP virtual Ethernet MAC address */
237
+struct xsmp_xve_mac {
238
+	/** High 16 bits */
239
+	uint16_t high;
240
+	/** Low 32 bits */
241
+	uint32_t low;
242
+} __attribute__ (( packed ));
243
+
244
+/** An XSMP virtual Ethernet message */
245
+struct xsmp_xve_message {
246
+	/** Message header */
247
+	struct xsmp_message_header hdr;
248
+	/** Message type */
249
+	uint8_t type;
250
+	/** Reason code */
251
+	uint8_t code;
252
+	/** Length (excluding message header) */
253
+	uint16_t len;
254
+	/** Update bitmask */
255
+	uint32_t update;
256
+	/** Resource identifier */
257
+	union ib_guid resource;
258
+	/** TCA GUID (little-endian) */
259
+	union ib_guid guid_le;
260
+	/** TCA LID */
261
+	uint16_t lid;
262
+	/** MAC address (little-endian) */
263
+	struct xsmp_xve_mac mac_le;
264
+	/** Rate */
265
+	uint16_t rate;
266
+	/** Administrative state (non-zero = "up") */
267
+	uint16_t state;
268
+	/** Encapsulation (apparently obsolete and unused) */
269
+	uint16_t encap;
270
+	/** MTU */
271
+	uint16_t mtu;
272
+	/** Installation flags (apparently obsolete and unused) */
273
+	uint32_t install;
274
+	/** Interface name */
275
+	char name[16];
276
+	/** Service level */
277
+	uint16_t sl;
278
+	/** Flow control enabled (apparently obsolete and unused) */
279
+	uint16_t flow;
280
+	/** Committed rate (in Mbps) */
281
+	uint16_t committed_mbps;
282
+	/** Peak rate (in Mbps) */
283
+	uint16_t peak_mbps;
284
+	/** Committed burst size (in bytes) */
285
+	uint32_t committed_burst;
286
+	/** Peak burst size (in bytes) */
287
+	uint32_t peak_burst;
288
+	/** VMware index */
289
+	uint8_t vmware;
290
+	/** Reserved */
291
+	uint8_t reserved0;
292
+	/** Multipath flags */
293
+	uint16_t multipath;
294
+	/** Multipath group name */
295
+	char group[48];
296
+	/** Link aggregation flag */
297
+	uint8_t agg;
298
+	/** Link aggregation policy */
299
+	uint8_t policy;
300
+	/** Network ID */
301
+	uint32_t network;
302
+	/** Mode */
303
+	uint8_t mode;
304
+	/** Uplink type */
305
+	uint8_t uplink;
306
+	/** Target channel adapter parameters */
307
+	struct xsmp_xve_ca tca;
308
+	/** Host channel adapter parameters */
309
+	struct xsmp_xve_ca hca;
310
+	/** Reserved */
311
+	uint8_t reserved1[336];
312
+} __attribute__ (( packed ));
313
+
314
+/** XSMP virtual Ethernet message types */
315
+enum xsmp_xve_type {
316
+	/** Install virtual NIC */
317
+	XSMP_XVE_TYPE_INSTALL = 1,
318
+	/** Delete virtual NIC */
319
+	XSMP_XVE_TYPE_DELETE = 2,
320
+	/** Update virtual NIC */
321
+	XSMP_XVE_TYPE_UPDATE = 3,
322
+	/** Set operational state up */
323
+	XSMP_XVE_TYPE_OPER_UP = 6,
324
+	/** Set operational state down */
325
+	XSMP_XVE_TYPE_OPER_DOWN = 7,
326
+	/** Get operational state */
327
+	XSMP_XVE_TYPE_OPER_REQ = 15,
328
+	/** Virtual NIC is ready */
329
+	XSMP_XVE_TYPE_READY = 20,
330
+};
331
+
332
+/** XSMP virtual Ethernet message codes */
333
+enum xsmp_xve_code {
334
+	/* Something went wrong */
335
+	XSMP_XVE_CODE_ERROR = 0x84,
336
+};
337
+
338
+/** XSMP virtual Ethernet update bitmask */
339
+enum xsmp_xve_update {
340
+	/** Update MTU */
341
+	XSMP_XVE_UPDATE_MTU = ( 1 << 2 ),
342
+	/** Update administrative state */
343
+	XSMP_XVE_UPDATE_STATE = ( 1 << 6 ),
344
+	/** Update gateway to mark as down */
345
+	XSMP_XVE_UPDATE_GW_DOWN = ( 1 << 30 ),
346
+	/** Update gateway information */
347
+	XSMP_XVE_UPDATE_GW_CHANGE = ( 1 << 31 ),
348
+};
349
+
350
+/** XSMP virtual Ethernet modes */
351
+enum xsmp_xve_mode {
352
+	/** Reliable Connected */
353
+	XSMP_XVE_MODE_RC = 1,
354
+	/** Unreliable Datagram */
355
+	XSMP_XVE_MODE_UD = 2,
356
+};
357
+
358
+/** XSMP virtual Ethernet uplink types */
359
+enum xsmp_xve_uplink {
360
+	/** No uplink */
361
+	XSMP_XVE_NO_UPLINK = 1,
362
+	/** Has uplink */
363
+	XSMP_XVE_UPLINK = 2,
364
+};
365
+
366
+/** An XSMP message */
367
+union xsmp_message {
368
+	/** Message header */
369
+	struct xsmp_message_header hdr;
370
+	/** Session message */
371
+	struct xsmp_session_message sess;
372
+	/** Virtual Ethernet message */
373
+	struct xsmp_xve_message xve;
374
+};
375
+
376
+/** Delay between attempts to open the Infiniband device
377
+ *
378
+ * This is a policy decision.
379
+ */
380
+#define XSIGO_OPEN_RETRY_DELAY ( 2 * TICKS_PER_SEC )
381
+
382
+/** Delay between unsuccessful discovery attempts
383
+ *
384
+ * This is a policy decision.
385
+ */
386
+#define XSIGO_DISCOVERY_FAILURE_DELAY ( 10 * TICKS_PER_SEC )
387
+
388
+/** Delay between successful discovery attempts
389
+ *
390
+ * This is a policy decision.
391
+ */
392
+#define XSIGO_DISCOVERY_SUCCESS_DELAY ( 20 * TICKS_PER_SEC )
393
+
394
+/** Delay between keepalive requests
395
+ *
396
+ * This is a policy decision.
397
+ */
398
+#define XSIGO_KEEPALIVE_INTERVAL ( 10 * TICKS_PER_SEC )
399
+
400
+/** Maximum time to wait for a keepalive response
401
+ *
402
+ * This is a policy decision.
403
+ */
404
+#define XSIGO_KEEPALIVE_MAX_WAIT ( 2 * TICKS_PER_SEC )
405
+
406
+#endif /* _IPXE_XSIGO_H */

+ 1858
- 0
src/net/infiniband/xsigo.c
File diff suppressed because it is too large
View File


Loading…
Cancel
Save