diff options
Diffstat (limited to 'qemu/roms/ipxe/src/include/ipxe/edd.h')
-rw-r--r-- | qemu/roms/ipxe/src/include/ipxe/edd.h | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/qemu/roms/ipxe/src/include/ipxe/edd.h b/qemu/roms/ipxe/src/include/ipxe/edd.h new file mode 100644 index 000000000..0c25593d5 --- /dev/null +++ b/qemu/roms/ipxe/src/include/ipxe/edd.h @@ -0,0 +1,193 @@ +#ifndef _IPXE_EDD_H +#define _IPXE_EDD_H + +/** @file + * + * Enhanced Disk Drive specification + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include <stdint.h> +#include <ipxe/interface.h> + +/** An EDD host bus type */ +struct edd_host_bus_type { + /** Type */ + uint32_t type; +} __attribute__ (( packed )); + +/** EDD bus type */ +#define EDD_BUS_TYPE_FIXED( a, b, c, d, ... ) \ + ( ( (a) << 0 ) | ( (b) << 8 ) | ( (c) << 16 ) | ( (d) << 24 ) ) +#define EDD_BUS_TYPE( ... ) \ + EDD_BUS_TYPE_FIXED ( __VA_ARGS__, ' ', ' ', ' ', ' ' ) +/** EDD PCI bus type */ +#define EDD_BUS_TYPE_PCI EDD_BUS_TYPE ( 'P', 'C', 'I' ) +/** EDD ISA bus type */ +#define EDD_BUS_TYPE_ISA EDD_BUS_TYPE ( 'I', 'S', 'A' ) +/** EDD PCI-X bus type */ +#define EDD_BUS_TYPE_PCIX EDD_BUS_TYPE ( 'P', 'C', 'I', 'X' ) +/** EDD Infiniband bus type */ +#define EDD_BUS_TYPE_IBND EDD_BUS_TYPE ( 'I', 'B', 'N', 'D' ) +/** EDD PCI Express bus type */ +#define EDD_BUS_TYPE_XPRS EDD_BUS_TYPE ( 'X', 'P', 'R', 'S' ) +/** EDD HyperTransport bus type */ +#define EDD_BUS_TYPE_HTPT EDD_BUS_TYPE ( 'H', 'T', 'P', 'T' ) + +/** An EDD interface type */ +struct edd_interface_type { + /** Type */ + uint64_t type; +} __attribute__ (( packed )); + +/** EDD interface type */ +#define EDD_INTF_TYPE_FIXED( a, b, c, d, e, f, g, h, ... ) \ + ( ( ( ( uint64_t ) (a) ) << 0 ) | ( ( ( uint64_t ) (b) ) << 8 ) | \ + ( ( ( uint64_t ) (c) ) << 16 ) | ( ( ( uint64_t ) (d) ) << 24 ) | \ + ( ( ( uint64_t ) (e) ) << 32 ) | ( ( ( uint64_t ) (f) ) << 40 ) | \ + ( ( ( uint64_t ) (g) ) << 48 ) | ( ( ( uint64_t ) (h) ) << 56 ) ) +#define EDD_INTF_TYPE( ... ) \ + EDD_INTF_TYPE_FIXED ( __VA_ARGS__, \ + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ) +/** EDD ATA interface type */ +#define EDD_INTF_TYPE_ATA EDD_INTF_TYPE ( 'A', 'T', 'A' ) +/** EDD ATAPI interface type */ +#define EDD_INTF_TYPE_ATAPI EDD_INTF_TYPE ( 'A', 'T', 'A', 'P', 'I' ) +/** EDD SCSI interface type */ +#define EDD_INTF_TYPE_SCSI EDD_INTF_TYPE ( 'S', 'C', 'S', 'I' ) +/** EDD USB interface type */ +#define EDD_INTF_TYPE_USB EDD_INTF_TYPE ( 'U', 'S', 'B' ) +/** EDD 1394 interface type */ +#define EDD_INTF_TYPE_1394 EDD_INTF_TYPE ( '1', '3', '9', '4' ) +/** EDD Fibre Channel interface type */ +#define EDD_INTF_TYPE_FIBRE EDD_INTF_TYPE ( 'F', 'I', 'B', 'R', 'E' ) +/** EDD I2O interface type */ +#define EDD_INTF_TYPE_I2O EDD_INTF_TYPE ( 'I', '2', 'O' ) +/** EDD RAID interface type */ +#define EDD_INTF_TYPE_RAID EDD_INTF_TYPE ( 'R', 'A', 'I', 'D' ) +/** EDD SATA interface type */ +#define EDD_INTF_TYPE_SATA EDD_INTF_TYPE ( 'S', 'A', 'T', 'A' ) +/** EDD SAS interface type */ +#define EDD_INTF_TYPE_SAS EDD_INTF_TYPE ( 'S', 'A', 'S' ) + +/** An EDD interface path */ +union edd_interface_path { + /** Legacy bus type */ + struct { + /** Base address */ + uint16_t base; + } __attribute__ (( packed )) legacy; + /** PCI, PCI-X, PCI Express, or HyperTransport bus type */ + struct { + /** Bus */ + uint8_t bus; + /** Slot */ + uint8_t slot; + /** Function */ + uint8_t function; + /** Channel number */ + uint8_t channel; + } __attribute__ (( packed )) pci; + /** Padding */ + uint8_t pad[8]; +} __attribute__ (( packed )); + +/** An EDD device path */ +union edd_device_path { + /** ATA interface type */ + struct { + /** Slave */ + uint8_t slave; + } __attribute__ (( packed )) ata; + /** ATAPI interface type */ + struct { + /** Slave */ + uint8_t slave; + /** Logical Unit Number */ + uint8_t lun; + } __attribute__ (( packed )) atapi; + /** SCSI interface type */ + struct { + /** SCSI ID */ + uint16_t id; + /** Logical Unit Number */ + uint64_t lun; + } __attribute__ (( packed )) scsi; + /** USB interface type */ + struct { + /** Serial number */ + uint64_t serial; + } __attribute__ (( packed )) usb; + /** IEEE1394 interface type */ + struct { + /** GUID */ + uint64_t guid; + } __attribute__ (( packed )) ieee1394; + /** Fibre Channel interface type */ + struct { + /** WWN */ + uint64_t wwn; + /** Logical Unit Number */ + uint64_t lun; + } __attribute__ (( packed )) fibre; + /** I2O interface type */ + struct { + /** Identity tag */ + uint64_t tag; + } __attribute__ (( packed )) i2o; + /** RAID interface type */ + struct { + /** Array number */ + uint32_t array; + } __attribute__ (( packed )) raid; + /** SATA interface type */ + struct { + /** Port number */ + uint8_t port; + /** Port multiplier number */ + uint8_t multiplier; + } __attribute__ (( packed )) sata; + /** SAS interface type */ + struct { + /** Address */ + uint64_t address; + } __attribute__ (( packed )) sas; + /** Padding */ + uint8_t pad[16]; +} __attribute__ (( packed )); + +/** EDD device path information */ +struct edd_device_path_information { + /** Key */ + uint16_t key; + /** Length of this structure */ + uint8_t len; + /** Reserved */ + uint8_t reserved_a[3]; + /** Host bus type */ + struct edd_host_bus_type host_bus_type; + /** Interface type */ + struct edd_interface_type interface_type; + /** Interface path */ + union edd_interface_path interface_path; + /** Device path */ + union edd_device_path device_path; + /** Reserved */ + uint8_t reserved_b; + /** Checksum */ + uint8_t checksum; +} __attribute__ (( packed )); + +/** EDD device path information key */ +#define EDD_DEVICE_PATH_INFO_KEY 0xbedd + +extern int edd_describe ( struct interface *intf, + struct edd_interface_type *type, + union edd_device_path *path ); +#define edd_describe_TYPE( object_type ) \ + typeof ( int ( object_type, struct edd_interface_type *type, \ + union edd_device_path *path ) ) + +#endif /* _IPXE_EDD_H */ |