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
|
||||
REQUIRE_OBJECT ( ipoib );
|
||||
#endif
|
||||
#ifdef VNIC_XSIGO
|
||||
REQUIRE_OBJECT ( xsigo );
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 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_XSIGO /* Infiniband Xsigo virtual NICs */
|
||||
|
||||
/*
|
||||
* Error message tables to include
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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