| /** @file | |
| Include file to suport EDD 3.0. | |
| This file is coded to T13 D1386 Revision 3 | |
| Availible on http://www.t13.org/#Project drafts | |
| Currently at ftp://fission.dt.wdc.com/pub/standards/x3t13/project/d1386r3.pdf | |
| Copyright (c) 1999 - 2010, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions | |
| of the BSD License which accompanies this distribution. The | |
| full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #ifndef _EDD_H_ | |
| #define _EDD_H_ | |
| // | |
| // packing with no compiler padding, so that the fields | |
| // of the following architected structures can be | |
| // properly accessed from C code. | |
| // | |
| #pragma pack(1) | |
| typedef struct { | |
| UINT8 Bus; | |
| UINT8 Device; | |
| UINT8 Function; | |
| UINT8 Controller; | |
| UINT32 Reserved; | |
| } EDD_PCI; | |
| typedef struct { | |
| UINT16 Base; | |
| UINT16 Reserved; | |
| UINT32 Reserved2; | |
| } EDD_LEGACY; | |
| typedef union { | |
| EDD_PCI Pci; | |
| EDD_LEGACY Legacy; | |
| } EDD_INTERFACE_PATH; | |
| typedef struct { | |
| UINT8 Master; | |
| UINT8 Reserved[15]; | |
| } EDD_ATA; | |
| typedef struct { | |
| UINT8 Master; | |
| UINT8 Lun; | |
| UINT8 Reserved[14]; | |
| } EDD_ATAPI; | |
| typedef struct { | |
| UINT16 Pun; | |
| UINT64 Lun; | |
| UINT8 Reserved[6]; | |
| } EDD_SCSI; | |
| typedef struct { | |
| UINT64 SerialNumber; | |
| UINT64 Reserved; | |
| } EDD_USB; | |
| typedef struct { | |
| UINT64 Guid; | |
| UINT64 Reserved; | |
| } EDD_1394; | |
| typedef struct { | |
| UINT64 Wwn; | |
| UINT64 Lun; | |
| } EDD_FIBRE; | |
| typedef union { | |
| EDD_ATA Ata; | |
| EDD_ATAPI Atapi; | |
| EDD_SCSI Scsi; | |
| EDD_USB Usb; | |
| EDD_1394 FireWire; | |
| EDD_FIBRE FibreChannel; | |
| } EDD_DEVICE_PATH; | |
| typedef struct { | |
| UINT16 StructureSize; | |
| UINT16 Flags; | |
| UINT32 MaxCylinders; | |
| UINT32 MaxHeads; | |
| UINT32 SectorsPerTrack; | |
| UINT64 PhysicalSectors; | |
| UINT16 BytesPerSector; | |
| UINT32 Fdpt; | |
| UINT16 Key; | |
| UINT8 DevicePathLength; | |
| UINT8 Reserved1; | |
| UINT16 Reserved2; | |
| CHAR8 HostBusType[4]; | |
| CHAR8 InterfaceType[8]; | |
| EDD_INTERFACE_PATH InterfacePath; | |
| EDD_DEVICE_PATH DevicePath; | |
| UINT8 Reserved3; | |
| UINT8 Checksum; | |
| } EDD_DRIVE_PARAMETERS; | |
| // | |
| // EDD_DRIVE_PARAMETERS.Flags defines | |
| // | |
| #define EDD_GEOMETRY_VALID 0x02 | |
| #define EDD_DEVICE_REMOVABLE 0x04 | |
| #define EDD_WRITE_VERIFY_SUPPORTED 0x08 | |
| #define EDD_DEVICE_CHANGE 0x10 | |
| #define EDD_DEVICE_LOCKABLE 0x20 | |
| // | |
| // BUGBUG: This bit does not follow the spec. It tends to be always set | |
| // to work properly with Win98. | |
| // | |
| #define EDD_DEVICE_GEOMETRY_MAX 0x40 | |
| typedef struct { | |
| UINT8 PacketSizeInBytes; // 0x18 | |
| UINT8 Zero; | |
| UINT8 NumberOfBlocks; // Max 0x7f | |
| UINT8 Zero2; | |
| UINT32 SegOffset; | |
| UINT64 Lba; | |
| UINT64 TransferBuffer; | |
| UINT32 ExtendedBlockCount; // Max 0xffffffff | |
| UINT32 Zero3; | |
| } EDD_DEVICE_ADDRESS_PACKET; | |
| #define EDD_VERSION_30 0x30 | |
| // | |
| // Int 13 BIOS Errors | |
| // | |
| #define BIOS_PASS 0x00 | |
| #define BIOS_WRITE_PROTECTED 0x03 | |
| #define BIOS_SECTOR_NOT_FOUND 0x04 | |
| #define BIOS_RESET_FAILED 0x05 | |
| #define BIOS_DISK_CHANGED 0x06 | |
| #define BIOS_DRIVE_DOES_NOT_EXIST 0x07 | |
| #define BIOS_DMA_ERROR 0x08 | |
| #define BIOS_DATA_BOUNDRY_ERROR 0x09 | |
| #define BIOS_BAD_SECTOR 0x0a | |
| #define BIOS_BAD_TRACK 0x0b | |
| #define BIOS_MEADIA_TYPE_NOT_FOUND 0x0c | |
| #define BIOS_INVALED_FORMAT 0x0d | |
| #define BIOS_ECC_ERROR 0x10 | |
| #define BIOS_ECC_CORRECTED_ERROR 0x11 | |
| #define BIOS_HARD_DRIVE_FAILURE 0x20 | |
| #define BIOS_SEEK_FAILED 0x40 | |
| #define BIOS_DRIVE_TIMEOUT 0x80 | |
| #define BIOS_DRIVE_NOT_READY 0xaa | |
| #define BIOS_UNDEFINED_ERROR 0xbb | |
| #define BIOS_WRITE_FAULT 0xcc | |
| #define BIOS_SENSE_FAILED 0xff | |
| #define MAX_EDD11_XFER 0xfe00 | |
| #pragma pack() | |
| // | |
| // Internal Data Structures | |
| // | |
| typedef struct { | |
| CHAR8 Letter; | |
| UINT8 Number; | |
| UINT8 EddVersion; | |
| BOOLEAN ExtendedInt13; | |
| BOOLEAN DriveLockingAndEjecting; | |
| BOOLEAN Edd; | |
| BOOLEAN Extensions64Bit; | |
| BOOLEAN ParametersValid; | |
| UINT8 ErrorCode; | |
| VOID *FdptPointer; | |
| BOOLEAN Floppy; | |
| BOOLEAN AtapiFloppy; | |
| UINT8 MaxHead; | |
| UINT8 MaxSector; | |
| UINT16 MaxCylinder; | |
| UINT16 Pad; | |
| EDD_DRIVE_PARAMETERS Parameters; | |
| } BIOS_LEGACY_DRIVE; | |
| #define BIOS_CONSOLE_BLOCK_IO_DEV_SIGNATURE SIGNATURE_32 ('b', 'b', 'i', 'o') | |
| typedef struct { | |
| UINTN Signature; | |
| EFI_HANDLE Handle; | |
| EFI_HANDLE ControllerHandle; | |
| EFI_BLOCK_IO_PROTOCOL BlockIo; | |
| EFI_BLOCK_IO_MEDIA BlockMedia; | |
| EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
| EFI_PCI_IO_PROTOCOL *PciIo; | |
| EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; | |
| BIOS_LEGACY_DRIVE Bios; | |
| } BIOS_BLOCK_IO_DEV; | |
| #define BIOS_BLOCK_IO_FROM_THIS(a) CR (a, BIOS_BLOCK_IO_DEV, BlockIo, BIOS_CONSOLE_BLOCK_IO_DEV_SIGNATURE) | |
| #endif |