summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown2016-03-09 01:27:15 +0100
committerMichael Brown2016-03-09 09:46:24 +0100
commite44f6dcb8994a3c5c29b16aacd97ac095f4588c6 (patch)
tree57b7610a6447d6a28ef5be1f786b48217ef507d4 /src/include
parent[eoib] Support non-FullMember gateway devices (diff)
downloadipxe-e44f6dcb8994a3c5c29b16aacd97ac095f4588c6.tar.gz
ipxe-e44f6dcb8994a3c5c29b16aacd97ac095f4588c6.tar.xz
ipxe-e44f6dcb8994a3c5c29b16aacd97ac095f4588c6.zip
[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>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/ipxe/errfile.h1
-rw-r--r--src/include/ipxe/xsigo.h406
2 files changed, 407 insertions, 0 deletions
diff --git a/src/include/ipxe/errfile.h b/src/include/ipxe/errfile.h
index e64ccc39..4129861a 100644
--- a/src/include/ipxe/errfile.h
+++ b/src/include/ipxe/errfile.h
@@ -259,6 +259,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define ERRFILE_peerdisc ( ERRFILE_NET | 0x00450000 )
#define ERRFILE_peerblk ( ERRFILE_NET | 0x00460000 )
#define ERRFILE_peermux ( ERRFILE_NET | 0x00470000 )
+#define ERRFILE_xsigo ( ERRFILE_NET | 0x00480000 )
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )
diff --git a/src/include/ipxe/xsigo.h b/src/include/ipxe/xsigo.h
new file mode 100644
index 00000000..f4f14c48
--- /dev/null
+++ b/src/include/ipxe/xsigo.h
@@ -0,0 +1,406 @@
+#ifndef _IPXE_XSIGO_H
+#define _IPXE_XSIGO_H
+
+/** @file
+ *
+ * Xsigo virtual Ethernet devices
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <stdint.h>
+#include <ipxe/infiniband.h>
+#include <ipxe/eoib.h>
+
+/** Xsigo directory service record name */
+#define XDS_SERVICE_NAME "XSIGOXDS"
+
+/** Xsigo configuration manager service ID */
+#define XCM_SERVICE_ID { 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x97, 0x01 }
+
+/** Xsigo management class */
+#define XSIGO_MGMT_CLASS 0x0b
+
+/** Xsigo management class version */
+#define XSIGO_MGMT_CLASS_VERSION 2
+
+/** Xsigo configuration manager request MAD */
+#define XSIGO_ATTR_XCM_REQUEST 0xb002
+
+/** Generic operating system type */
+#define XSIGO_OS_TYPE_GENERIC 0x40
+
+/** Xsigo virtual Ethernet broadcast GID prefix */
+#define XVE_PREFIX 0xff15101cUL
+
+/** Xsigo resource types */
+enum xsigo_resource_type {
+ /** Virtual Ethernet resource type */
+ XSIGO_RESOURCE_XVE = ( 1 << 6 ),
+ /** Absence-of-high-availability "resource" type */
+ XSIGO_RESOURCE_NO_HA = ( 1 << 4 ),
+};
+
+/** A Xsigo server identifier */
+struct xsigo_server_id {
+ /** Virtual machine ID */
+ uint32_t vm;
+ /** Port GUID */
+ union ib_guid guid;
+} __attribute__ (( packed ));
+
+/** A Xsigo configuration manager identifier */
+struct xsigo_manager_id {
+ /** Port GUID */
+ union ib_guid guid;
+ /** LID */
+ uint16_t lid;
+ /** Reserved */
+ uint8_t reserved[10];
+} __attribute__ (( packed ));
+
+/** A Xsigo configuration manager request MAD */
+struct xsigo_managers_request {
+ /** MAD header */
+ struct ib_mad_hdr mad_hdr;
+ /** Reserved */
+ uint8_t reserved0[32];
+ /** Server ID */
+ struct xsigo_server_id server;
+ /** Hostname */
+ char hostname[ 65 /* Seriously, guys? */ ];
+ /** OS version */
+ char os_version[32];
+ /** CPU architecture */
+ char arch[16];
+ /** OS type */
+ uint8_t os_type;
+ /** Reserved */
+ uint8_t reserved1[3];
+ /** Firmware version */
+ uint64_t firmware_version;
+ /** Hardware version */
+ uint32_t hardware_version;
+ /** Driver version */
+ uint32_t driver_version;
+ /** System ID */
+ union ib_gid system_id;
+ /** Resource types */
+ uint16_t resources;
+ /** Reserved */
+ uint8_t reserved2[2];
+ /** Build version */
+ char build[16];
+ /** Reserved */
+ uint8_t reserved3[19];
+} __attribute__ (( packed ));
+
+/** Resource types are present */
+#define XSIGO_RESOURCES_PRESENT 0x8000
+
+/** A Xsigo configuration manager reply MAD */
+struct xsigo_managers_reply {
+ /** MAD header */
+ struct ib_mad_hdr mad_hdr;
+ /** Reserved */
+ uint8_t reserved0[32];
+ /** Server ID */
+ struct xsigo_server_id server;
+ /** Number of XCM records */
+ uint8_t count;
+ /** Version */
+ uint8_t version;
+ /** Reserved */
+ uint8_t reserved1[2];
+ /** Managers */
+ struct xsigo_manager_id manager[8];
+ /** Reserved */
+ uint8_t reserved2[24];
+} __attribute__ (( packed ));
+
+/** A Xsigo MAD */
+union xsigo_mad {
+ /** Generic MAD */
+ union ib_mad mad;
+ /** Configuration manager request */
+ struct xsigo_managers_request request;
+ /** Configuration manager reply */
+ struct xsigo_managers_reply reply;
+} __attribute__ (( packed ));
+
+/** An XSMP node identifier */
+struct xsmp_node_id {
+ /** Auxiliary ID (never used) */
+ uint32_t aux;
+ /** Port GUID */
+ union ib_guid guid;
+} __attribute__ (( packed ));
+
+/** An XSMP message header */
+struct xsmp_message_header {
+ /** Message type */
+ uint8_t type;
+ /** Reason code */
+ uint8_t code;
+ /** Length */
+ uint16_t len;
+ /** Sequence number */
+ uint32_t seq;
+ /** Source node ID */
+ struct xsmp_node_id src;
+ /** Destination node ID */
+ struct xsmp_node_id dst;
+} __attribute__ (( packed ));
+
+/** XSMP message types */
+enum xsmp_message_type {
+ /** Session message type */
+ XSMP_TYPE_SESSION = 1,
+ /** Virtual Ethernet message type */
+ XSMP_TYPE_XVE = 6,
+};
+
+/** An XSMP session message */
+struct xsmp_session_message {
+ /** Message header */
+ struct xsmp_message_header hdr;
+ /** Message type */
+ uint8_t type;
+ /** Reason code */
+ uint8_t code;
+ /** Length (excluding message header) */
+ uint16_t len;
+ /** Operating system type */
+ uint8_t os_type;
+ /** Reserved */
+ uint8_t reserved0;
+ /** Resource types */
+ uint16_t resources;
+ /** Driver version */
+ uint32_t driver_version;
+ /** Required chassis version */
+ uint32_t chassis_version;
+ /** Boot flags */
+ uint32_t boot;
+ /** Firmware version */
+ uint64_t firmware_version;
+ /** Hardware version */
+ uint32_t hardware_version;
+ /** Vendor part ID */
+ uint32_t vendor;
+ /** Protocol version */
+ uint32_t xsmp_version;
+ /** Chassis name */
+ char chassis[32];
+ /** Session name */
+ char session[32];
+ /** Reserved */
+ uint8_t reserved1[120];
+} __attribute__ (( packed ));
+
+/** XSMP session message types */
+enum xsmp_session_type {
+ /** Keepalive message */
+ XSMP_SESSION_TYPE_HELLO = 1,
+ /** Initial registration message */
+ XSMP_SESSION_TYPE_REGISTER = 2,
+ /** Registration confirmation message */
+ XSMP_SESSION_TYPE_CONFIRM = 3,
+ /** Registration rejection message */
+ XSMP_SESSION_TYPE_REJECT = 4,
+ /** Shutdown message */
+ XSMP_SESSION_TYPE_SHUTDOWN = 5,
+};
+
+/** XSMP boot flags */
+enum xsmp_session_boot {
+ /** PXE boot */
+ XSMP_BOOT_PXE = ( 1 << 0 ),
+};
+
+/** XSMP virtual Ethernet channel adapter parameters */
+struct xsmp_xve_ca {
+ /** Subnet prefix (little-endian) */
+ union ib_guid prefix_le;
+ /** Control queue pair number */
+ uint32_t ctrl;
+ /** Data queue pair number */
+ uint32_t data;
+ /** Partition key */
+ uint16_t pkey;
+ /** Queue key */
+ uint16_t qkey;
+} __attribute__ (( packed ));
+
+/** XSMP virtual Ethernet MAC address */
+struct xsmp_xve_mac {
+ /** High 16 bits */
+ uint16_t high;
+ /** Low 32 bits */
+ uint32_t low;
+} __attribute__ (( packed ));
+
+/** An XSMP virtual Ethernet message */
+struct xsmp_xve_message {
+ /** Message header */
+ struct xsmp_message_header hdr;
+ /** Message type */
+ uint8_t type;
+ /** Reason code */
+ uint8_t code;
+ /** Length (excluding message header) */
+ uint16_t len;
+ /** Update bitmask */
+ uint32_t update;
+ /** Resource identifier */
+ union ib_guid resource;
+ /** TCA GUID (little-endian) */
+ union ib_guid guid_le;
+ /** TCA LID */
+ uint16_t lid;
+ /** MAC address (little-endian) */
+ struct xsmp_xve_mac mac_le;
+ /** Rate */
+ uint16_t rate;
+ /** Administrative state (non-zero = "up") */
+ uint16_t state;
+ /** Encapsulation (apparently obsolete and unused) */
+ uint16_t encap;
+ /** MTU */
+ uint16_t mtu;
+ /** Installation flags (apparently obsolete and unused) */
+ uint32_t install;
+ /** Interface name */
+ char name[16];
+ /** Service level */
+ uint16_t sl;
+ /** Flow control enabled (apparently obsolete and unused) */
+ uint16_t flow;
+ /** Committed rate (in Mbps) */
+ uint16_t committed_mbps;
+ /** Peak rate (in Mbps) */
+ uint16_t peak_mbps;
+ /** Committed burst size (in bytes) */
+ uint32_t committed_burst;
+ /** Peak burst size (in bytes) */
+ uint32_t peak_burst;
+ /** VMware index */
+ uint8_t vmware;
+ /** Reserved */
+ uint8_t reserved0;
+ /** Multipath flags */
+ uint16_t multipath;
+ /** Multipath group name */
+ char group[48];
+ /** Link aggregation flag */
+ uint8_t agg;
+ /** Link aggregation policy */
+ uint8_t policy;
+ /** Network ID */
+ uint32_t network;
+ /** Mode */
+ uint8_t mode;
+ /** Uplink type */
+ uint8_t uplink;
+ /** Target channel adapter parameters */
+ struct xsmp_xve_ca tca;
+ /** Host channel adapter parameters */
+ struct xsmp_xve_ca hca;
+ /** Reserved */
+ uint8_t reserved1[336];
+} __attribute__ (( packed ));
+
+/** XSMP virtual Ethernet message types */
+enum xsmp_xve_type {
+ /** Install virtual NIC */
+ XSMP_XVE_TYPE_INSTALL = 1,
+ /** Delete virtual NIC */
+ XSMP_XVE_TYPE_DELETE = 2,
+ /** Update virtual NIC */
+ XSMP_XVE_TYPE_UPDATE = 3,
+ /** Set operational state up */
+ XSMP_XVE_TYPE_OPER_UP = 6,
+ /** Set operational state down */
+ XSMP_XVE_TYPE_OPER_DOWN = 7,
+ /** Get operational state */
+ XSMP_XVE_TYPE_OPER_REQ = 15,
+ /** Virtual NIC is ready */
+ XSMP_XVE_TYPE_READY = 20,
+};
+
+/** XSMP virtual Ethernet message codes */
+enum xsmp_xve_code {
+ /* Something went wrong */
+ XSMP_XVE_CODE_ERROR = 0x84,
+};
+
+/** XSMP virtual Ethernet update bitmask */
+enum xsmp_xve_update {
+ /** Update MTU */
+ XSMP_XVE_UPDATE_MTU = ( 1 << 2 ),
+ /** Update administrative state */
+ XSMP_XVE_UPDATE_STATE = ( 1 << 6 ),
+ /** Update gateway to mark as down */
+ XSMP_XVE_UPDATE_GW_DOWN = ( 1 << 30 ),
+ /** Update gateway information */
+ XSMP_XVE_UPDATE_GW_CHANGE = ( 1 << 31 ),
+};
+
+/** XSMP virtual Ethernet modes */
+enum xsmp_xve_mode {
+ /** Reliable Connected */
+ XSMP_XVE_MODE_RC = 1,
+ /** Unreliable Datagram */
+ XSMP_XVE_MODE_UD = 2,
+};
+
+/** XSMP virtual Ethernet uplink types */
+enum xsmp_xve_uplink {
+ /** No uplink */
+ XSMP_XVE_NO_UPLINK = 1,
+ /** Has uplink */
+ XSMP_XVE_UPLINK = 2,
+};
+
+/** An XSMP message */
+union xsmp_message {
+ /** Message header */
+ struct xsmp_message_header hdr;
+ /** Session message */
+ struct xsmp_session_message sess;
+ /** Virtual Ethernet message */
+ struct xsmp_xve_message xve;
+};
+
+/** Delay between attempts to open the Infiniband device
+ *
+ * This is a policy decision.
+ */
+#define XSIGO_OPEN_RETRY_DELAY ( 2 * TICKS_PER_SEC )
+
+/** Delay between unsuccessful discovery attempts
+ *
+ * This is a policy decision.
+ */
+#define XSIGO_DISCOVERY_FAILURE_DELAY ( 10 * TICKS_PER_SEC )
+
+/** Delay between successful discovery attempts
+ *
+ * This is a policy decision.
+ */
+#define XSIGO_DISCOVERY_SUCCESS_DELAY ( 20 * TICKS_PER_SEC )
+
+/** Delay between keepalive requests
+ *
+ * This is a policy decision.
+ */
+#define XSIGO_KEEPALIVE_INTERVAL ( 10 * TICKS_PER_SEC )
+
+/** Maximum time to wait for a keepalive response
+ *
+ * This is a policy decision.
+ */
+#define XSIGO_KEEPALIVE_MAX_WAIT ( 2 * TICKS_PER_SEC )
+
+#endif /* _IPXE_XSIGO_H */