mirror of https://github.com/ipxe/ipxe.git
[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>pull/46/head
parent
3144e4fb64
commit
e44f6dcb89
|
@ -44,6 +44,9 @@ REQUIRE_OBJECT ( ib_srp );
|
||||||
#ifdef VNIC_IPOIB
|
#ifdef VNIC_IPOIB
|
||||||
REQUIRE_OBJECT ( ipoib );
|
REQUIRE_OBJECT ( ipoib );
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef VNIC_XSIGO
|
||||||
|
REQUIRE_OBJECT ( xsigo );
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Drag in Infiniband-specific commands
|
* Drag in Infiniband-specific commands
|
||||||
|
|
|
@ -158,6 +158,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define VNIC_IPOIB /* Infiniband IPoIB virtual NICs */
|
#define VNIC_IPOIB /* Infiniband IPoIB virtual NICs */
|
||||||
|
//#define VNIC_XSIGO /* Infiniband Xsigo virtual NICs */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Error message tables to include
|
* Error message tables to include
|
||||||
|
|
|
@ -259,6 +259,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
#define ERRFILE_peerdisc ( ERRFILE_NET | 0x00450000 )
|
#define ERRFILE_peerdisc ( ERRFILE_NET | 0x00450000 )
|
||||||
#define ERRFILE_peerblk ( ERRFILE_NET | 0x00460000 )
|
#define ERRFILE_peerblk ( ERRFILE_NET | 0x00460000 )
|
||||||
#define ERRFILE_peermux ( ERRFILE_NET | 0x00470000 )
|
#define ERRFILE_peermux ( ERRFILE_NET | 0x00470000 )
|
||||||
|
#define ERRFILE_xsigo ( ERRFILE_NET | 0x00480000 )
|
||||||
|
|
||||||
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
|
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
|
||||||
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )
|
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )
|
||||||
|
|
|
@ -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 */
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue