/** @file | |
API between 16-bit Legacy BIOS and EFI | |
We need to figure out what the 16-bit code is going to use to | |
represent these data structures. Is a pointer SEG:OFF or 32-bit... | |
Copyright (c) 2006, Intel Corporation | |
All rights reserved. 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. | |
Module Name: Legacy16.h | |
@par Revision Reference: | |
These definitions are from Compatibility Support Module Spec Version 0.96. | |
**/ | |
#ifndef LEGACY_16_H_ | |
#define LEGACY_16_H_ | |
#define EFI_TO_LEGACY_MAJOR_VERSION 0x02 | |
#define EFI_TO_LEGACY_MINOR_VERSION 0x00 | |
#pragma pack(1) | |
// | |
// EFI Legacy to Legacy16 data | |
// EFI_COMPATIBILITY16_TABLE has been moved to LegacyBios protocol defn file. | |
// | |
typedef struct { | |
// | |
// Memory map used to start up Legacy16 code | |
// | |
UINT32 BiosLessThan1MB; | |
UINT32 HiPmmMemory; | |
UINT32 PmmMemorySizeInBytes; | |
UINT16 ReverseThunkCallSegment; | |
UINT16 ReverseThunkCallOffset; | |
UINT32 NumberE820Entries; | |
UINT32 OsMemoryAbove1Mb; | |
UINT32 ThunkStart; | |
UINT32 ThunkSizeInBytes; | |
UINT32 LowPmmMemory; | |
UINT32 LowPmmMemorySizeInBytes; | |
} EFI_TO_COMPATIBILITY16_INIT_TABLE; | |
#pragma pack() | |
// | |
// Legacy16 Call types | |
// | |
typedef enum { | |
Legacy16InitializeYourself = 0x0000, | |
Legacy16UpdateBbs = 0x0001, | |
Legacy16PrepareToBoot = 0x0002, | |
Legacy16Boot = 0x0003, | |
Legacy16RetrieveLastBootDevice= 0x0004, | |
Legacy16DispatchOprom = 0x0005, | |
Legacy16GetTableAddress = 0x0006, | |
Legacy16SetKeyboardLeds = 0x0007, | |
Legacy16InstallPciHandler = 0x0008, | |
} EFI_COMPATIBILITY_FUNCTIONS; | |
#define F0000Region 0x01 | |
#define E0000Region 0x02 | |
// | |
// Legacy16 call prototypes | |
// Input: AX = EFI_COMPATIBILITY16_FUNCTIONS for all functions. | |
// Output: AX = Return status for all functions. It follows EFI error | |
// codes. | |
// | |
// Legacy16InitializeYourself | |
// Description: This is the first call to 16-bit code. It allows the | |
// 16-bit to perform any internal initialization. | |
// Input: ES:BX pointer to EFI_TO_LEGACY16_INIT_TABLE | |
// Output: | |
// Legacy16UpdateBbs | |
// Description: The 16-bit code updates the BBS table for non-compliant | |
// devices. | |
// Input: ES:BX pointer to EFI_TO_COMPATIBILITY16_BOOT_TABLE | |
// Output: | |
// Legacy16PrepareToBoot | |
// Description: This is the last call to 16-bit code where 0xE0000 -0xFFFFF | |
// is read/write. 16-bit code does any final clean up. | |
// Input: ES:BX pointer to EFI_TO_COMPATIBILITY16_BOOT_TABLE | |
// Output: | |
// Legacy16Boot | |
// Description: Do INT19. | |
// Input: | |
// Output: | |
// Legacy16RetrieveLastBootDevice | |
// Description: Return the priority number of the device that booted. | |
// Input: | |
// Output: BX = priority number of the last attempted boot device. | |
// Legacy16DispatchOprom | |
// Description: Pass control to the specified OPROM. Allows the 16-bit | |
// code to rehook INT 13,18 and/or 19 from non-BBS | |
// compliant devices. | |
// Input: ES:DI = Segment:Offset of PnPInstallationCheck | |
// SI = OPROM segment. Offset assumed to be 3. | |
// BH = PCI bus number. | |
// BL = PCI device * 8 | PCI function. | |
// Output: BX = Number of BBS non-compliant drives detected. Return | |
// zero for BBS compliant devices. | |
// Legacy16GetTableAddress | |
// Description: Allocate an area in the 0xE0000-0xFFFFF region. | |
// Input: BX = Allocation region. | |
// 0x0 = Any region | |
// Bit 0 = 0xF0000 region | |
// Bit 1 = 0xE0000 region | |
// Multiple bits can be set. | |
// CX = Length in bytes requested | |
// DX = Required address alignment | |
// Bit mapped. First non-zero bit from right to left is | |
// alignment. | |
// Output: DS:BX is assigned region. | |
// AX = EFI_OUT_OF_RESOURCES if request cannot be granted. | |
// Legacy16SetKeyboardLeds | |
// Description: Perform any special action when keyboard LEDS change. | |
// Other code performs the LED change and updates standard | |
// BDA locations. This is for non-standard operations. | |
// Input: CL = LED status. 1 = set. | |
// Bit 0 = Scroll lock | |
// Bit 1 = Num lock | |
// Bit 2 = Caps lock | |
// Output: | |
// Legacy16InstallPciHandler | |
// Description: Provides 16-bit code a hook to establish an interrupt | |
// handler for any PCI device requiring a PCI interrupt | |
// but having no OPROM. This is called before interrupt | |
// is assigned. 8259 will be disabled(even if sharded) | |
// and PCI Interrupt Line unprogrammed. Other code will | |
// program 8259 and PCI Interrupt Line. | |
// Input: ES:BX Pointer to EFI_LEGACY_INSTALL_PCI_HANDLER strcture | |
// Output: | |
// | |
typedef UINT8 SERIAL_MODE; | |
typedef UINT8 PARALLEL_MODE; | |
#pragma pack(1) | |
#define DEVICE_SERIAL_MODE_NORMAL 0x00 | |
#define DEVICE_SERIAL_MODE_IRDA 0x01 | |
#define DEVICE_SERIAL_MODE_ASK_IR 0x02 | |
#define DEVICE_SERIAL_MODE_DUPLEX_HALF 0x00 | |
#define DEVICE_SERIAL_MODE_DUPLEX_FULL 0x10 | |
#define DEVICE_PARALLEL_MODE_MODE_OUTPUT_ONLY 0x00 | |
#define DEVICE_PARALLEL_MODE_MODE_BIDIRECTIONAL 0x01 | |
#define DEVICE_PARALLEL_MODE_MODE_EPP 0x02 | |
#define DEVICE_PARALLEL_MODE_MODE_ECP 0x03 | |
typedef struct { | |
UINT16 Address; | |
UINT8 Irq; | |
SERIAL_MODE Mode; | |
} DEVICE_PRODUCER_SERIAL; | |
typedef struct { | |
UINT16 Address; | |
UINT8 Irq; | |
UINT8 Dma; | |
PARALLEL_MODE Mode; | |
} DEVICE_PRODUCER_PARALLEL; | |
typedef struct { | |
UINT16 Address; | |
UINT8 Irq; | |
UINT8 Dma; | |
UINT8 NumberOfFloppy; | |
} DEVICE_PRODUCER_FLOPPY; | |
typedef struct { | |
UINT32 A20Kybd : 1; | |
UINT32 A20Port90 : 1; | |
UINT32 Reserved : 30; | |
} LEGACY_DEVICE_FLAGS; | |
typedef struct { | |
DEVICE_PRODUCER_SERIAL Serial[4]; | |
DEVICE_PRODUCER_PARALLEL Parallel[3]; | |
DEVICE_PRODUCER_FLOPPY Floppy; | |
UINT8 MousePresent; | |
LEGACY_DEVICE_FLAGS Flags; | |
} DEVICE_PRODUCER_DATA_HEADER; | |
// | |
// SMM Table definitions | |
// SMM table has a header that provides the number of entries. Following | |
// the header is a variable length amount of data. | |
// | |
#define STANDARD_IO 0x00 | |
#define STANDARD_MEMORY 0x01 | |
#define PORT_SIZE_8 0x00 | |
#define PORT_SIZE_16 0x01 | |
#define PORT_SIZE_32 0x02 | |
#define PORT_SIZE_64 0x03 | |
#define DATA_SIZE_8 0x00 | |
#define DATA_SIZE_16 0x01 | |
#define DATA_SIZE_32 0x02 | |
#define DATA_SIZE_64 0x03 | |
typedef struct { | |
UINT16 Type : 3; | |
UINT16 PortGranularity : 3; | |
UINT16 DataGranularity : 3; | |
UINT16 Reserved : 7; | |
} SMM_ATTRIBUTES; | |
#define INT15_D042 0x0000 | |
#define GET_USB_BOOT_INFO 0x0001 | |
#define DMI_PNP_50_57 0x0002 | |
#define STANDARD_OWNER 0x0 | |
#define OEM_OWNER 0x1 | |
typedef struct { | |
UINT16 Function : 15; | |
UINT16 Owner : 1; | |
} SMM_FUNCTION; | |
typedef struct { | |
SMM_ATTRIBUTES SmmAttributes; | |
SMM_FUNCTION SmmFunction; | |
// | |
// Data size depends upon SmmAttributes and ranges from 2 bytes to | |
// 16 bytes | |
// | |
// bugbug how to do variable length Data | |
// | |
UINT8 SmmPort; | |
UINT8 SmmData; | |
} SMM_ENTRY; | |
typedef struct { | |
UINT16 NumSmmEntries; | |
SMM_ENTRY SmmEntry; | |
} SMM_TABLE; | |
// | |
// If MAX_IDE_CONTROLLER changes value 16-bit legacy code needs to change | |
// | |
#define MAX_IDE_CONTROLLER 8 | |
typedef struct { | |
UINT16 MajorVersion; | |
UINT16 MinorVersion; | |
UINT32 AcpiTable; // 4 GB range | |
UINT32 SmbiosTable; // 4 GB range | |
UINT32 SmbiosTableLength; | |
// | |
// Legacy SIO state | |
// | |
DEVICE_PRODUCER_DATA_HEADER SioData; | |
UINT16 DevicePathType; | |
UINT16 PciIrqMask; | |
UINT32 NumberE820Entries; | |
// | |
// Controller & Drive Identify[2] per controller information | |
// | |
HDD_INFO HddInfo[MAX_IDE_CONTROLLER]; | |
UINT32 NumberBbsEntries; | |
UINT32 BbsTable; | |
UINT32 SmmTable; | |
UINT32 OsMemoryAbove1Mb; | |
UINT32 UnconventionalDeviceTable; | |
} EFI_TO_COMPATIBILITY16_BOOT_TABLE; | |
typedef struct { | |
UINT8 PciBus; | |
UINT8 PciDeviceFun; | |
UINT8 PciSegment; | |
UINT8 PciClass; | |
UINT8 PciSubclass; | |
UINT8 PciInterface; | |
UINT8 PrimaryIrq; | |
UINT8 PrimaryReserved; | |
UINT16 PrimaryControl; | |
UINT16 PrimaryBase; | |
UINT16 PrimaryBusMaster; | |
UINT8 SecondaryIrq; | |
UINT8 SecondaryReserved; | |
UINT16 SecondaryControl; | |
UINT16 SecondaryBase; | |
UINT16 SecondaryBusMaster; | |
} EFI_LEGACY_INSTALL_PCI_HANDLER; | |
typedef struct { | |
UINT16 PnPInstallationCheckSegment; | |
UINT16 PnPInstallationCheckOffset; | |
UINT16 OpromSegment; | |
UINT8 PciBus; | |
UINT8 PciDeviceFunction; | |
UINT8 NumberBbsEntries; | |
VOID *BbsTablePointer; | |
} EFI_DISPATCH_OPROM_TABLE; | |
#pragma pack() | |
#endif |