| #ifndef _IPXE_EDD_H |
| #define _IPXE_EDD_H |
| |
| /** @file |
| * |
| * Enhanced Disk Drive specification |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); |
| |
| #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 */ |