From 8b8158cf564f95905867830e9a6e0c9925c516b5 Mon Sep 17 00:00:00 2001 From: Sergey Isakov Date: Tue, 3 Sep 2019 16:36:55 +0300 Subject: [PATCH] additional includes Signed-off-by: Sergey Isakov --- .../Include/Guid/AcpiVariableCompatibility.h | 69 + IntelFrameworkModulePkg/Include/Guid/BdsHii.h | 55 + .../Include/Guid/BdsLibHii.h | 25 + .../Include/Guid/BlockIoVendor.h | 31 + .../Include/Guid/CapsuleDataFile.h | 23 + .../Include/Guid/DataHubStatusCodeRecord.h | 61 + .../Include/Guid/HdBootVariable.h | 31 + .../Guid/IntelFrameworkModulePkgTokenSpace.h | 27 + .../Include/Guid/LastEnumLang.h | 31 + .../Include/Guid/LegacyBios.h | 36 + .../Include/Guid/LegacyDevOrder.h | 45 + .../Include/Guid/TianoDecompress.h | 28 + .../Include/Library/GenericBdsLib.h | 1114 +++++++ .../Include/Library/PlatformBdsLib.h | 156 + .../Include/Protocol/ExitPmAuth.h | 25 + .../Include/Protocol/IsaAcpi.h | 304 ++ .../Include/Protocol/IsaIo.h | 362 ++ .../Include/Protocol/OEMBadging.h | 88 + .../Include/Protocol/VgaMiniPort.h | 94 + IntelFrameworkPkg/Include/Guid/BlockIo.h | 51 + IntelFrameworkPkg/Include/Guid/Capsule.h | 147 + .../Include/Guid/DataHubRecords.h | 2935 +++++++++++++++++ .../Include/Guid/FirmwareFileSystem.h | 36 + .../Include/Guid/SmmCommunicate.h | 33 + .../Include/Guid/SmramMemoryReserve.h | 60 + .../Include/Ppi/BootScriptExecuter.h | 79 + IntelFrameworkPkg/Include/Ppi/FindFv.h | 68 + IntelFrameworkPkg/Include/Ppi/FvLoadFile.h | 68 + IntelFrameworkPkg/Include/Ppi/PciCfg.h | 110 + .../Include/Ppi/ReadOnlyVariable.h | 132 + IntelFrameworkPkg/Include/Ppi/S3Resume.h | 76 + .../Include/Ppi/SectionExtraction.h | 107 + IntelFrameworkPkg/Include/Ppi/Security.h | 68 + IntelFrameworkPkg/Include/Ppi/Smbus.h | 232 ++ .../Include/Protocol/AcpiS3Save.h | 128 + .../Include/Protocol/AcpiSupport.h | 148 + .../Include/Protocol/BootScriptSave.h | 86 + IntelFrameworkPkg/Include/Protocol/CpuIo.h | 46 + IntelFrameworkPkg/Include/Protocol/DataHub.h | 222 ++ .../Include/Protocol/FirmwareVolume.h | 346 ++ .../Protocol/FrameworkFirmwareVolumeBlock.h | 353 ++ .../Include/Protocol/FrameworkFormBrowser.h | 175 + .../Include/Protocol/FrameworkFormCallback.h | 222 ++ .../Include/Protocol/FrameworkHii.h | 1032 ++++++ .../Include/Protocol/FrameworkMpService.h | 662 ++++ .../Include/Protocol/Legacy8259.h | 297 ++ .../Include/Protocol/LegacyBios.h | 1559 +++++++++ .../Include/Protocol/LegacyBiosPlatform.h | 761 +++++ .../Include/Protocol/LegacyInterrupt.h | 128 + .../Include/Protocol/LegacyRegion.h | 125 + .../Include/Protocol/SectionExtraction.h | 161 + .../Include/Protocol/SmmAccess.h | 130 + IntelFrameworkPkg/Include/Protocol/SmmBase.h | 310 ++ .../Include/Protocol/SmmControl.h | 180 + IntelFrameworkPkg/Include/Protocol/SmmCpuIo.h | 88 + .../Include/Protocol/SmmCpuSaveState.h | 175 + .../Include/Protocol/SmmGpiDispatch.h | 136 + .../Include/Protocol/SmmIchnDispatch.h | 189 ++ .../Protocol/SmmPeriodicTimerDispatch.h | 176 + .../Include/Protocol/SmmPowerButtonDispatch.h | 141 + .../Protocol/SmmStandbyButtonDispatch.h | 143 + .../Include/Protocol/SmmSwDispatch.h | 151 + .../Include/Protocol/SmmSxDispatch.h | 135 + .../Include/Protocol/SmmUsbDispatch.h | 136 + edksetup.bat | 6 +- 65 files changed, 15351 insertions(+), 3 deletions(-) create mode 100644 IntelFrameworkModulePkg/Include/Guid/AcpiVariableCompatibility.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/BdsHii.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/BdsLibHii.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/BlockIoVendor.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/CapsuleDataFile.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/DataHubStatusCodeRecord.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/HdBootVariable.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/IntelFrameworkModulePkgTokenSpace.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/LastEnumLang.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/LegacyBios.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/LegacyDevOrder.h create mode 100644 IntelFrameworkModulePkg/Include/Guid/TianoDecompress.h create mode 100644 IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h create mode 100644 IntelFrameworkModulePkg/Include/Library/PlatformBdsLib.h create mode 100644 IntelFrameworkModulePkg/Include/Protocol/ExitPmAuth.h create mode 100644 IntelFrameworkModulePkg/Include/Protocol/IsaAcpi.h create mode 100644 IntelFrameworkModulePkg/Include/Protocol/IsaIo.h create mode 100644 IntelFrameworkModulePkg/Include/Protocol/OEMBadging.h create mode 100644 IntelFrameworkModulePkg/Include/Protocol/VgaMiniPort.h create mode 100644 IntelFrameworkPkg/Include/Guid/BlockIo.h create mode 100644 IntelFrameworkPkg/Include/Guid/Capsule.h create mode 100644 IntelFrameworkPkg/Include/Guid/DataHubRecords.h create mode 100644 IntelFrameworkPkg/Include/Guid/FirmwareFileSystem.h create mode 100644 IntelFrameworkPkg/Include/Guid/SmmCommunicate.h create mode 100644 IntelFrameworkPkg/Include/Guid/SmramMemoryReserve.h create mode 100644 IntelFrameworkPkg/Include/Ppi/BootScriptExecuter.h create mode 100644 IntelFrameworkPkg/Include/Ppi/FindFv.h create mode 100644 IntelFrameworkPkg/Include/Ppi/FvLoadFile.h create mode 100644 IntelFrameworkPkg/Include/Ppi/PciCfg.h create mode 100644 IntelFrameworkPkg/Include/Ppi/ReadOnlyVariable.h create mode 100644 IntelFrameworkPkg/Include/Ppi/S3Resume.h create mode 100644 IntelFrameworkPkg/Include/Ppi/SectionExtraction.h create mode 100644 IntelFrameworkPkg/Include/Ppi/Security.h create mode 100644 IntelFrameworkPkg/Include/Ppi/Smbus.h create mode 100644 IntelFrameworkPkg/Include/Protocol/AcpiS3Save.h create mode 100644 IntelFrameworkPkg/Include/Protocol/AcpiSupport.h create mode 100644 IntelFrameworkPkg/Include/Protocol/BootScriptSave.h create mode 100644 IntelFrameworkPkg/Include/Protocol/CpuIo.h create mode 100644 IntelFrameworkPkg/Include/Protocol/DataHub.h create mode 100644 IntelFrameworkPkg/Include/Protocol/FirmwareVolume.h create mode 100644 IntelFrameworkPkg/Include/Protocol/FrameworkFirmwareVolumeBlock.h create mode 100644 IntelFrameworkPkg/Include/Protocol/FrameworkFormBrowser.h create mode 100644 IntelFrameworkPkg/Include/Protocol/FrameworkFormCallback.h create mode 100644 IntelFrameworkPkg/Include/Protocol/FrameworkHii.h create mode 100644 IntelFrameworkPkg/Include/Protocol/FrameworkMpService.h create mode 100644 IntelFrameworkPkg/Include/Protocol/Legacy8259.h create mode 100644 IntelFrameworkPkg/Include/Protocol/LegacyBios.h create mode 100644 IntelFrameworkPkg/Include/Protocol/LegacyBiosPlatform.h create mode 100644 IntelFrameworkPkg/Include/Protocol/LegacyInterrupt.h create mode 100644 IntelFrameworkPkg/Include/Protocol/LegacyRegion.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SectionExtraction.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmAccess.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmBase.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmControl.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmCpuIo.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmCpuSaveState.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmGpiDispatch.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmIchnDispatch.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmPeriodicTimerDispatch.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmPowerButtonDispatch.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmStandbyButtonDispatch.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmSwDispatch.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmSxDispatch.h create mode 100644 IntelFrameworkPkg/Include/Protocol/SmmUsbDispatch.h diff --git a/IntelFrameworkModulePkg/Include/Guid/AcpiVariableCompatibility.h b/IntelFrameworkModulePkg/Include/Guid/AcpiVariableCompatibility.h new file mode 100644 index 000000000..6c9f85154 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/AcpiVariableCompatibility.h @@ -0,0 +1,69 @@ +/** @file + Definitions for data structures used in S3 resume. + +Copyright (c) 2011, 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. + +**/ + +#ifndef _ACPI_VARIABLE_COMPATIBILITY_H_ +#define _ACPI_VARIABLE_COMPATIBILITY_H_ + +#define EFI_ACPI_VARIABLE_COMPATIBILITY_GUID \ + { \ + 0xc020489e, 0x6db2, 0x4ef2, {0x9a, 0xa5, 0xca, 0x6, 0xfc, 0x11, 0xd3, 0x6a } \ + } + +#define ACPI_GLOBAL_VARIABLE L"AcpiGlobalVariable" + +extern EFI_GUID gEfiAcpiVariableCompatiblityGuid; + +typedef struct { + BOOLEAN APState; + BOOLEAN S3BootPath; + EFI_PHYSICAL_ADDRESS WakeUpBuffer; + EFI_PHYSICAL_ADDRESS GdtrProfile; + EFI_PHYSICAL_ADDRESS IdtrProfile; + EFI_PHYSICAL_ADDRESS CpuPrivateData; + EFI_PHYSICAL_ADDRESS StackAddress; + EFI_PHYSICAL_ADDRESS MicrocodePointerBuffer; + EFI_PHYSICAL_ADDRESS SmramBase; + EFI_PHYSICAL_ADDRESS SmmStartImageBase; + UINT32 SmmStartImageSize; + UINT32 NumberOfCpus; +} ACPI_CPU_DATA_COMPATIBILITY; + +typedef struct { + // + // Acpi Related variables + // + EFI_PHYSICAL_ADDRESS AcpiReservedMemoryBase; + UINT32 AcpiReservedMemorySize; + EFI_PHYSICAL_ADDRESS S3ReservedLowMemoryBase; + EFI_PHYSICAL_ADDRESS AcpiBootScriptTable; + EFI_PHYSICAL_ADDRESS RuntimeScriptTableBase; + EFI_PHYSICAL_ADDRESS AcpiFacsTable; + UINT64 SystemMemoryLength; + ACPI_CPU_DATA_COMPATIBILITY AcpiCpuData; + // + // VGA OPROM to support Video Re-POST for Linux S3 + // + EFI_PHYSICAL_ADDRESS VideoOpromAddress; + UINT32 VideoOpromSize; + + // + // S3 Debug extension + // + EFI_PHYSICAL_ADDRESS S3DebugBufferAddress; + EFI_PHYSICAL_ADDRESS S3ResumeNvsEntryPoint; +} ACPI_VARIABLE_SET_COMPATIBILITY; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/BdsHii.h b/IntelFrameworkModulePkg/Include/Guid/BdsHii.h new file mode 100644 index 000000000..e22babc5b --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/BdsHii.h @@ -0,0 +1,55 @@ +/** @file + GUIDs used as HII FormSet and HII Package list GUID in BdsDxe driver. + +Copyright (c) 2011, 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 that 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 __BDS_HII_GUIDS_H__ +#define __BDS_HII_GUIDS_H__ + +#define FRONT_PAGE_FORMSET_GUID \ + { \ + 0x9e0c30bc, 0x3f06, 0x4ba6, {0x82, 0x88, 0x9, 0x17, 0x9b, 0x85, 0x5d, 0xbe} \ + } + +#define BOOT_MANAGER_FORMSET_GUID \ + { \ + 0x847bc3fe, 0xb974, 0x446d, {0x94, 0x49, 0x5a, 0xd5, 0x41, 0x2e, 0x99, 0x3b} \ + } + +#define DEVICE_MANAGER_FORMSET_GUID \ + { \ + 0x3ebfa8e6, 0x511d, 0x4b5b, {0xa9, 0x5f, 0xfb, 0x38, 0x26, 0xf, 0x1c, 0x27} \ + } + +#define DRIVER_HEALTH_FORMSET_GUID \ + { \ + 0xf76e0a70, 0xb5ed, 0x4c38, {0xac, 0x9a, 0xe5, 0xf5, 0x4b, 0xf1, 0x6e, 0x34} \ + } + +#define BOOT_MAINT_FORMSET_GUID \ + { \ + 0x642237c7, 0x35d4, 0x472d, {0x83, 0x65, 0x12, 0xe0, 0xcc, 0xf2, 0x7a, 0x22} \ + } + +#define FILE_EXPLORE_FORMSET_GUID \ + { \ + 0x1f2d63e1, 0xfebd, 0x4dc7, {0x9c, 0xc5, 0xba, 0x2b, 0x1c, 0xef, 0x9c, 0x5b} \ + } + +extern EFI_GUID gFrontPageFormSetGuid; +extern EFI_GUID gBootMaintFormSetGuid; +extern EFI_GUID gFileExploreFormSetGuid; +extern EFI_GUID gBootManagerFormSetGuid; +extern EFI_GUID gDeviceManagerFormSetGuid; +extern EFI_GUID gDriverHealthFormSetGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/BdsLibHii.h b/IntelFrameworkModulePkg/Include/Guid/BdsLibHii.h new file mode 100644 index 000000000..1a2bb024c --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/BdsLibHii.h @@ -0,0 +1,25 @@ +/** @file + GUID used as HII Package list GUID in GenericBdsLib module. + +Copyright (c) 2011, 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 that 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 __BDS_LIB_HII_GUID_H__ +#define __BDS_LIB_HII_GUID_H__ + +#define BDS_LIB_STRING_PACKAGE_GUID \ + { \ + 0x3b4d9b23, 0x95ac, 0x44f6, { 0x9f, 0xcd, 0xe, 0x95, 0x94, 0x58, 0x6c, 0x72 } \ + } + +extern EFI_GUID gBdsLibStringPackageGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/BlockIoVendor.h b/IntelFrameworkModulePkg/Include/Guid/BlockIoVendor.h new file mode 100644 index 000000000..71aa05a59 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/BlockIoVendor.h @@ -0,0 +1,31 @@ +/** @file + Guid for unrecognized EDD 3.0 device. + +Copyright (c) 2011, 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 that 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 __BLOCKIO_VENDOR_H__ +#define __BLOCKIO_VENDOR_H__ + +// +// Guid is to specifiy the unrecognized EDD 3.0 device. +// +#define BLOCKIO_VENDOR_GUID \ + { 0xcf31fac5, 0xc24e, 0x11d2, {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} } + +typedef struct { + VENDOR_DEVICE_PATH DevicePath; + UINT8 LegacyDriveLetter; +} BLOCKIO_VENDOR_DEVICE_PATH; + +extern GUID gBlockIoVendorGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/CapsuleDataFile.h b/IntelFrameworkModulePkg/Include/Guid/CapsuleDataFile.h new file mode 100644 index 000000000..7e97d17f2 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/CapsuleDataFile.h @@ -0,0 +1,23 @@ +/** @file + GUID to specify which FFS file to store the updated capsule data. + +Copyright (c) 2011, 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 that 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 __UPDATE_DATA_FILE_GUID_H__ +#define __UPDATE_DATA_FILE_GUID_H__ + +#define EFI_UPDATE_DATA_FILE_GUID \ + { 0x283fa2ee, 0x532c, 0x484d, { 0x93, 0x83, 0x9f, 0x93, 0xb3, 0x6f, 0xb, 0x7e } } + +extern GUID gEfiUpdateDataFileGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/DataHubStatusCodeRecord.h b/IntelFrameworkModulePkg/Include/Guid/DataHubStatusCodeRecord.h new file mode 100644 index 000000000..a03a09712 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/DataHubStatusCodeRecord.h @@ -0,0 +1,61 @@ +/** @file + GUID used to identify Data Hub records logged by Status Code Protocol. + +Copyright (c) 2006 - 2010, 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 that 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 __DATA_HUB_STATUS_CODE_RECORD_H__ +#define __DATA_HUB_STATUS_CODE_RECORD_H__ + +/// +/// The Global ID used to identify a structure of type DATA_HUB_STATUS_CODE_DATA_RECORD. +/// +#define EFI_DATA_HUB_STATUS_CODE_RECORD_GUID \ + { \ + 0xd083e94c, 0x6560, 0x42e4, {0xb6, 0xd4, 0x2d, 0xf7, 0x5a, 0xdf, 0x6a, 0x2a } \ + } + +/// +/// The Data Hub data record that is used to store all the parameters passed into +/// the ReportStatusCode() service of the EFI_STATUS_CODE_PROTOCOL. +/// +typedef struct { + /// + /// Status Code type to be reported. + /// + EFI_STATUS_CODE_TYPE CodeType; + + /// + /// An operation, plus value information about the class and subclass, used to + /// classify the hardware and software entity. + /// + EFI_STATUS_CODE_VALUE Value; + + /// + /// The enumeration of a hardware or software entity within + /// the system. Valid instance numbers start with 1. + /// + UINT32 Instance; + + /// + /// Identify the caller. + /// + EFI_GUID CallerId; + + /// + /// Additional status code data. + /// + EFI_STATUS_CODE_DATA Data; +} DATA_HUB_STATUS_CODE_DATA_RECORD; + +extern EFI_GUID gEfiDataHubStatusCodeRecordGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/HdBootVariable.h b/IntelFrameworkModulePkg/Include/Guid/HdBootVariable.h new file mode 100644 index 000000000..fae083979 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/HdBootVariable.h @@ -0,0 +1,31 @@ +/** @file + GUID used as EFI Variable for the device path of Boot file on HardDevice. + +Copyright (c) 2011, 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 that 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 __HD_DEVICE_PATH_VARIABLE_GUID_H__ +#define __HD_DEVICE_PATH_VARIABLE_GUID_H__ + +/// +/// This GUID is used for an EFI Variable that stores the front device pathes +/// for a partial device path that starts with the HD node. +/// +#define HD_BOOT_DEVICE_PATH_VARIABLE_GUID \ + { \ + 0xfab7e9e1, 0x39dd, 0x4f2b, { 0x84, 0x8, 0xe2, 0xe, 0x90, 0x6c, 0xb6, 0xde } \ + } + +#define HD_BOOT_DEVICE_PATH_VARIABLE_NAME L"HDDP" + +extern EFI_GUID gHdBootDevicePathVariablGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/IntelFrameworkModulePkgTokenSpace.h b/IntelFrameworkModulePkg/Include/Guid/IntelFrameworkModulePkgTokenSpace.h new file mode 100644 index 000000000..a80c2315b --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/IntelFrameworkModulePkgTokenSpace.h @@ -0,0 +1,27 @@ +/** @file + GUID for IntelFrameworkModulePkg PCD Token Space + +Copyright (c) 2009 - 2010, 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 that 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 _INTEL_FRAMEWOKR_MODULEPKG_TOKEN_SPACE_GUID_H_ +#define _INTEL_FRAMEWOKR_MODULEPKG_TOKEN_SPACE_GUID_H_ + +/// +/// The Global ID for the IntelFrameworkModulePkg PCD Token Space . +/// +#define INTEL_FRAMEWORK_MODULEPKG_TOKEN_SPACE_GUID \ + { \ + 0xD3705011, 0xBC19, 0x4af7, { 0xBE, 0x16, 0xF6, 0x80, 0x30, 0x37, 0x8C, 0x15 } \ + } + +extern EFI_GUID gEfiIntelFrameworkModulePkgTokenSpaceGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/LastEnumLang.h b/IntelFrameworkModulePkg/Include/Guid/LastEnumLang.h new file mode 100644 index 000000000..8d9e37fab --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/LastEnumLang.h @@ -0,0 +1,31 @@ +/** @file + GUID used as EFI variable to store platform language at last time enumeration. + +Copyright (c) 2011, 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 that 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 __LAST_ENUM_LANGUAGE_GUID_H__ +#define __LAST_ENUM_LANGUAGE_GUID_H__ + +/// +/// This GUID is used for Set/Get platform language into/from variable at last time enumeration +/// to ensure the enumeration will only execute once. +/// +#define LAST_ENUM_LANGUAGE_GUID \ + { \ + 0xe8c545b, 0xa2ee, 0x470d, { 0x8e, 0x26, 0xbd, 0xa1, 0xa1, 0x3c, 0xa, 0xa3 } \ + } + +#define LAST_ENUM_LANGUAGE_VARIABLE_NAME L"LastEnumLang" + +extern EFI_GUID gLastEnumLangGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/LegacyBios.h b/IntelFrameworkModulePkg/Include/Guid/LegacyBios.h new file mode 100644 index 000000000..1fcea9ccf --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/LegacyBios.h @@ -0,0 +1,36 @@ +/** @file + Defines a Tag GUID used to mark a UEFI legacy BIOS thunk driver based + on legacy BIOS services and legacy option ROM. This Tag GUID must be installed on + the ImageHandle of any module that follows the EFI Driver Model and uses + the Int86() or FarCall() services of the Legacy Bios Protocol to produce + a standard UEFI I/O Protocol. + +Copyright (c) 2006 - 2010, 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. + +**/ + +#ifndef _LEGACY_BIOS_H_ +#define _LEGACY_BIOS_H_ + +/// +/// The Global ID for the Legacy BIOS GUID that must be installed onto the ImageHandle +/// of any module follows the EFI Driver Model and uses the Int86() or FarCall() +/// services of the Legacy BIOS Protocol to produce a standard UEFI I/O Protocol. +/// +#define EFI_LEGACY_BIOS_GUID \ + { \ + 0x2e3044ac, 0x879f, 0x490f, {0x97, 0x60, 0xbb, 0xdf, 0xaf, 0x69, 0x5f, 0x50 } \ + } + +extern EFI_GUID gEfiLegacyBiosGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/LegacyDevOrder.h b/IntelFrameworkModulePkg/Include/Guid/LegacyDevOrder.h new file mode 100644 index 000000000..684f098d5 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/LegacyDevOrder.h @@ -0,0 +1,45 @@ +/** @file + Guid of a NV Variable which store the information about the + FD/HD/CD/NET/BEV order. + +Copyright (c) 2011, 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 that 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 __LEGACY_DEV_ORDER_VARIABLE_GUID_H__ +#define __LEGACY_DEV_ORDER_VARIABLE_GUID_H__ + +/// +/// Name and Guid of a NV Variable which stores the information about the +/// FD/HD/CD/NET/BEV order +/// +#define EFI_LEGACY_DEV_ORDER_VARIABLE_GUID \ + { \ + 0xa56074db, 0x65fe, 0x45f7, {0xbd, 0x21, 0x2d, 0x2b, 0xdd, 0x8e, 0x96, 0x52} \ + } + +typedef UINT8 BBS_TYPE; + +#pragma pack(1) +typedef struct { + BBS_TYPE BbsType; + /// + /// Length = sizeof (UINT16) + sizeof (Data) + /// + UINT16 Length; + UINT16 Data[1]; +} LEGACY_DEV_ORDER_ENTRY; +#pragma pack() + +#define VAR_LEGACY_DEV_ORDER L"LegacyDevOrder" + +extern EFI_GUID gEfiLegacyDevOrderVariableGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Guid/TianoDecompress.h b/IntelFrameworkModulePkg/Include/Guid/TianoDecompress.h new file mode 100644 index 000000000..7c2a6a6b9 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Guid/TianoDecompress.h @@ -0,0 +1,28 @@ +/** @file + Tiano Custom decompress Guid definition. + +Copyright (c) 2006 - 2010, 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 that 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 __TIANO_CUSTOM_DECOMPRESS_GUID_H__ +#define __TIANO_CUSTOM_DECOMPRESS_GUID_H__ + +/// +/// The Global ID used to identify a section of an FFS file of type +/// EFI_SECTION_GUID_DEFINED, whose contents have been compressed using +/// Tiano Custom compression. +/// +#define TIANO_CUSTOM_DECOMPRESS_GUID \ + { 0xA31280AD, 0x481E, 0x41B6, { 0x95, 0xE8, 0x12, 0x7F, 0x4C, 0x98, 0x47, 0x79 } } + +extern GUID gTianoCustomDecompressGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h b/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h new file mode 100644 index 000000000..c338c4d02 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h @@ -0,0 +1,1114 @@ +/** @file + Generic BDS library defines general interfaces for a BDS driver, including: + 1) BDS boot policy interface. + 2) BDS boot device connect interface. + 3) BDS Misc interfaces for mainting boot variable, ouput string. + +Copyright (c) 2004 - 2013, 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 that 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 _GENERIC_BDS_LIB_H_ +#define _GENERIC_BDS_LIB_H_ + +#include + +/// +/// Constants which are variable names used to access variables. +/// +#define VAR_LEGACY_DEV_ORDER L"LegacyDevOrder" + +/// +/// Data structures and defines. +/// +#define FRONT_PAGE_QUESTION_ID 0x0000 +#define FRONT_PAGE_DATA_WIDTH 0x01 + +/// +/// ConnectType +/// +#define CONSOLE_OUT 0x00000001 +#define STD_ERROR 0x00000002 +#define CONSOLE_IN 0x00000004 +#define CONSOLE_ALL (CONSOLE_OUT | CONSOLE_IN | STD_ERROR) + +/// +/// Load Option Attributes +/// +#define LOAD_OPTION_ACTIVE 0x00000001 +#define LOAD_OPTION_FORCE_RECONNECT 0x00000002 + +#define LOAD_OPTION_HIDDEN 0x00000008 +#define LOAD_OPTION_CATEGORY 0x00001F00 + +#define LOAD_OPTION_CATEGORY_BOOT 0x00000000 +#define LOAD_OPTION_CATEGORY_APP 0x00000100 + +#define EFI_BOOT_OPTION_SUPPORT_KEY 0x00000001 +#define EFI_BOOT_OPTION_SUPPORT_APP 0x00000002 + +#define IS_LOAD_OPTION_TYPE(_c, _Mask) (BOOLEAN) (((_c) & (_Mask)) != 0) + +/// +/// Define the maximum characters that will be accepted. +/// +#define MAX_CHAR 480 +#define MAX_CHAR_SIZE (MAX_CHAR * 2) + +/// +/// Define maximum characters for boot option variable "BootXXXX". +/// +#define BOOT_OPTION_MAX_CHAR 10 + +// +// This data structure is the part of BDS_CONNECT_ENTRY +// +#define BDS_LOAD_OPTION_SIGNATURE SIGNATURE_32 ('B', 'd', 'C', 'O') + +typedef struct { + + UINTN Signature; + LIST_ENTRY Link; + + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + + CHAR16 *OptionName; + UINTN OptionNumber; + UINT16 BootCurrent; + UINT32 Attribute; + CHAR16 *Description; + VOID *LoadOptions; + UINT32 LoadOptionsSize; + CHAR16 *StatusString; + +} BDS_COMMON_OPTION; + +typedef struct { + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + UINTN ConnectType; +} BDS_CONSOLE_CONNECT_ENTRY; + +// +// Bds boot related lib functions +// +/** + Boot from the UEFI spec defined "BootNext" variable. + +**/ +VOID +EFIAPI +BdsLibBootNext ( + VOID + ); + +/** + Process the boot option according to the UEFI specification. The legacy boot option device path includes BBS_DEVICE_PATH. + + @param Option The boot option to be processed. + @param DevicePath The device path describing where to load the + boot image or the legcy BBS device path to boot + the legacy OS. + @param ExitDataSize The size of exit data. + @param ExitData Data returned when Boot image failed. + + @retval EFI_SUCCESS Boot from the input boot option succeeded. + @retval EFI_NOT_FOUND The Device Path is not found in the system. + +**/ +EFI_STATUS +EFIAPI +BdsLibBootViaBootOption ( + IN BDS_COMMON_OPTION * Option, + IN EFI_DEVICE_PATH_PROTOCOL * DevicePath, + OUT UINTN *ExitDataSize, + OUT CHAR16 **ExitData OPTIONAL + ); + + +/** + This function will enumerate all possible boot devices in the system, and + automatically create boot options for Network, Shell, Removable BlockIo, + and Non-BlockIo Simplefile devices. + + BDS separates EFI boot options into six types: + 1. Network - The boot option points to the SimpleNetworkProtocol device. + Bds will try to automatically create this type of boot option during enumeration. + 2. Shell - The boot option points to internal flash shell. + Bds will try to automatically create this type of boot option during enumeration. + 3. Removable BlockIo - The boot option points to a removable media + device, such as a USB flash drive or DVD drive. + These devices should contain a *removable* blockIo + protocol in their device handle. + Bds will try to automatically create this type boot option + when enumerate. + 4. Fixed BlockIo - The boot option points to a Fixed blockIo device, + such as a hard disk. + These devices should contain a *fixed* blockIo + protocol in their device handle. + BDS will skip fixed blockIo devices, and not + automatically create boot option for them. But BDS + will help to delete those fixed blockIo boot options, + whose description rules conflict with other auto-created + boot options. + 5. Non-BlockIo Simplefile - The boot option points to a device whose handle + has SimpleFileSystem Protocol, but has no blockio + protocol. These devices do not offer blockIo + protocol, but BDS still can get the + \EFI\BOOT\boot{machinename}.EFI by SimpleFileSystem + Protocol. + 6. File - The boot option points to a file. These boot options are usually + created by the user, either manually or with an OS loader. BDS will not delete or modify + these boot options. + + This function will enumerate all possible boot devices in the system, and + automatically create boot options for Network, Shell, Removable BlockIo, + and Non-BlockIo Simplefile devices. + It will execute once every boot. + + @param BdsBootOptionList The header of the linked list that indexed all + current boot options. + + @retval EFI_SUCCESS Finished all the boot device enumerations and + created the boot option based on the boot device. + + @retval EFI_OUT_OF_RESOURCES Failed to enumerate the boot device and create + the boot option list. +**/ +EFI_STATUS +EFIAPI +BdsLibEnumerateAllBootOption ( + IN OUT LIST_ENTRY *BdsBootOptionList + ); + +/** + Build the boot option with the handle parsed in. + + @param Handle The handle representing the device path for which + to create a boot option. + @param BdsBootOptionList The header of the link list that indexed all + current boot options. + @param String The description of the boot option. + +**/ +VOID +EFIAPI +BdsLibBuildOptionFromHandle ( + IN EFI_HANDLE Handle, + IN LIST_ENTRY *BdsBootOptionList, + IN CHAR16 *String + ); + + +/** + Build the on flash shell boot option with the handle parsed in. + + @param Handle The handle which present the device path to create + the on flash shell boot option. + @param BdsBootOptionList The header of the link list that indexed all + current boot options. + +**/ +VOID +EFIAPI +BdsLibBuildOptionFromShell ( + IN EFI_HANDLE Handle, + IN OUT LIST_ENTRY *BdsBootOptionList + ); + +// +// Bds misc lib functions +// +/** + Get boot mode by looking up the configuration table and parsing the HOB list. + + @param BootMode The boot mode from PEI handoff HOB. + + @retval EFI_SUCCESS Successfully got boot mode. + +**/ +EFI_STATUS +EFIAPI +BdsLibGetBootMode ( + OUT EFI_BOOT_MODE *BootMode + ); + + +/** + The function will go through the driver option link list, and then load and start + every driver to which the driver option device path points. + + @param BdsDriverLists The header of the current driver option link list. + +**/ +VOID +EFIAPI +BdsLibLoadDrivers ( + IN LIST_ENTRY *BdsDriverLists + ); + + +/** + This function processes BootOrder or DriverOrder variables, by calling + + BdsLibVariableToOption () for each UINT16 in the variables. + + @param BdsCommonOptionList The header of the option list base on the variable + VariableName. + @param VariableName An EFI Variable name indicate the BootOrder or + DriverOrder. + + @retval EFI_SUCCESS Successfully created the boot option or driver option + list. + @retval EFI_OUT_OF_RESOURCES Failed to get the boot option or the driver option list. +**/ +EFI_STATUS +EFIAPI +BdsLibBuildOptionFromVar ( + IN LIST_ENTRY *BdsCommonOptionList, + IN CHAR16 *VariableName + ); + +/** + This function reads the EFI variable (VendorGuid/Name) and returns a dynamically allocated + buffer and the size of the buffer. If it fails, return NULL. + + @param Name The string part of the EFI variable name. + @param VendorGuid The GUID part of the EFI variable name. + @param VariableSize Returns the size of the EFI variable that was read. + + @return Dynamically allocated memory that contains a copy + of the EFI variable. The caller is responsible for + freeing the buffer. + @retval NULL The variable was not read. + +**/ +VOID * +EFIAPI +BdsLibGetVariableAndSize ( + IN CHAR16 *Name, + IN EFI_GUID *VendorGuid, + OUT UINTN *VariableSize + ); + + +/** + This function prints a series of strings. + + @param ConOut A pointer to EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL. + @param ... A variable argument list containing a series of + strings, the last string must be NULL. + + @retval EFI_SUCCESS Successfully printed out the string using ConOut. + @retval EFI_STATUS Return the status of the ConOut->OutputString (). + +**/ +EFI_STATUS +EFIAPI +BdsLibOutputStrings ( + IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut, + ... + ); + +/** + Build the boot#### or driver#### option from the VariableName. The + build boot#### or driver#### will also be linked to BdsCommonOptionList. + + @param BdsCommonOptionList The header of the boot#### or driver#### option + link list. + @param VariableName EFI Variable name, indicates if it is boot#### or + driver####. + + @retval BDS_COMMON_OPTION The option that was created. + @retval NULL Failed to get the new option. + +**/ +BDS_COMMON_OPTION * +EFIAPI +BdsLibVariableToOption ( + IN OUT LIST_ENTRY *BdsCommonOptionList, + IN CHAR16 *VariableName + ); + +/** + This function registers the new boot#### or driver#### option based on + the VariableName. The new registered boot#### or driver#### will be linked + to BdsOptionList and also update to the VariableName. After the boot#### or + driver#### updated, the BootOrder or DriverOrder will also be updated. + + @param BdsOptionList The header of the boot#### or driver#### link list. + @param DevicePath The device path that the boot#### or driver#### + option present. + @param String The description of the boot#### or driver####. + @param VariableName Indicate if the boot#### or driver#### option. + + @retval EFI_SUCCESS The boot#### or driver#### have been successfully + registered. + @retval EFI_STATUS Return the status of gRT->SetVariable (). + +**/ +EFI_STATUS +EFIAPI +BdsLibRegisterNewOption ( + IN LIST_ENTRY *BdsOptionList, + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, + IN CHAR16 *String, + IN CHAR16 *VariableName + ); + +// +// Bds connect and disconnect driver lib funcions +// +/** + This function connects all system drivers with the corresponding controllers. + +**/ +VOID +EFIAPI +BdsLibConnectAllDriversToAllControllers ( + VOID + ); + +/** + This function connects all system drivers to controllers. + +**/ +VOID +EFIAPI +BdsLibConnectAll ( + VOID + ); + +/** + This function will create all handles associate with every device + path node. If the handle associate with one device path node can not + be created successfully, then still give chance to do the dispatch, + which load the missing drivers if possible. + + @param DevicePathToConnect The device path to be connected. Can be + a multi-instance device path. + + @retval EFI_SUCCESS All handles associates with every device path node + were created. + @retval EFI_OUT_OF_RESOURCES Not enough resources to create new handles. + @retval EFI_NOT_FOUND At least one handle could not be created. + +**/ +EFI_STATUS +EFIAPI +BdsLibConnectDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect + ); + +/** + This function will connect all current system handles recursively. + gBS->ConnectController() service is invoked for each handle exist in system handler buffer. + If the handle is bus type handler, all childrens also will be connected recursively by gBS->ConnectController(). + + @retval EFI_SUCCESS All handles and child handles have been + connected. + @retval EFI_STATUS Return the status of gBS->LocateHandleBuffer(). +**/ +EFI_STATUS +EFIAPI +BdsLibConnectAllEfi ( + VOID + ); + +/** + This function will disconnect all current system handles. + gBS->DisconnectController() is invoked for each handle exists in system handle buffer. + If handle is a bus type handle, all childrens also are disconnected recursively by gBS->DisconnectController(). + + @retval EFI_SUCCESS All handles have been disconnected. + @retval EFI_STATUS Error status returned by of gBS->LocateHandleBuffer(). + +**/ +EFI_STATUS +EFIAPI +BdsLibDisconnectAllEfi ( + VOID + ); + +// +// Bds console related lib functions +// +/** + This function will search every simpletxt device in the current system, + and make every simpletxt device a potential console device. + +**/ +VOID +EFIAPI +BdsLibConnectAllConsoles ( + VOID + ); + + +/** + This function will connect console device based on the console + device variable ConIn, ConOut and ErrOut. + + @retval EFI_SUCCESS At least one of the ConIn and ConOut devices have + been connected. + @retval EFI_STATUS Return the status of BdsLibConnectConsoleVariable (). + +**/ +EFI_STATUS +EFIAPI +BdsLibConnectAllDefaultConsoles ( + VOID + ); + + +/** + This function will connect console device except ConIn base on the console + device variable ConOut and ErrOut. + + @retval EFI_SUCCESS At least one of the ConOut device have + been connected success. + @retval EFI_STATUS Return the status of BdsLibConnectConsoleVariable (). + +**/ +EFI_STATUS +EFIAPI +BdsLibConnectAllDefaultConsolesWithOutConIn ( + VOID + ); + + +/** + This function updates the console variable based on ConVarName. It can + add or remove one specific console device path from the variable + + @param ConVarName The console-related variable name: ConIn, ConOut, + ErrOut. + @param CustomizedConDevicePath The console device path to be added to + the console variable ConVarName. Cannot be multi-instance. + @param ExclusiveDevicePath The console device path to be removed + from the console variable ConVarName. Cannot be multi-instance. + + @retval EFI_UNSUPPORTED The added device path is the same as a removed one. + @retval EFI_SUCCESS Successfully added or removed the device path from the + console variable. + +**/ +EFI_STATUS +EFIAPI +BdsLibUpdateConsoleVariable ( + IN CHAR16 *ConVarName, + IN EFI_DEVICE_PATH_PROTOCOL *CustomizedConDevicePath, + IN EFI_DEVICE_PATH_PROTOCOL *ExclusiveDevicePath + ); + +/** + Connect the console device base on the variable ConVarName, if + device path of the ConVarName is multi-instance device path and + anyone of the instances is connected success, then this function + will return success. + If the handle associate with one device path node can not + be created successfully, then still give chance to do the dispatch, + which load the missing drivers if possible. + + @param ConVarName Console related variable name, ConIn, ConOut, + ErrOut. + + @retval EFI_NOT_FOUND There is not any console devices connected + success + @retval EFI_SUCCESS Success connect any one instance of the console + device path base on the variable ConVarName. + +**/ +EFI_STATUS +EFIAPI +BdsLibConnectConsoleVariable ( + IN CHAR16 *ConVarName + ); + +// +// Bds device path related lib functions +// +/** + Delete the instance in Multi that overlaps with Single. + + @param Multi A pointer to a multi-instance device path data + structure. + @param Single A pointer to a single-instance device path data + structure. + + @return This function removes the device path instances in Multi that overlap + Single, and returns the resulting device path. If there is no + remaining device path as a result, this function will return NULL. + +**/ +EFI_DEVICE_PATH_PROTOCOL * +EFIAPI +BdsLibDelPartMatchInstance ( + IN EFI_DEVICE_PATH_PROTOCOL *Multi, + IN EFI_DEVICE_PATH_PROTOCOL *Single + ); + +/** + This function compares a device path data structure to that of all the nodes of a + second device path instance. + + @param Multi A pointer to a multi-instance device path data + structure. + @param Single A pointer to a single-instance device path data + structure. + + @retval TRUE If the Single device path is contained within a + Multi device path. + @retval FALSE The Single device path is not contained within a + Multi device path. + +**/ +BOOLEAN +EFIAPI +BdsLibMatchDevicePaths ( + IN EFI_DEVICE_PATH_PROTOCOL *Multi, + IN EFI_DEVICE_PATH_PROTOCOL *Single + ); + +/** + This function converts an input device structure to a Unicode string. + + @param DevPath A pointer to the device path structure. + + @return A newly allocated Unicode string that represents the device path. + +**/ +CHAR16 * +EFIAPI +DevicePathToStr ( + IN EFI_DEVICE_PATH_PROTOCOL *DevPath + ); + +// +// Internal definitions +// +typedef struct { + CHAR16 *Str; + UINTN Len; + UINTN Maxlen; +} POOL_PRINT; + +typedef +VOID +(*DEV_PATH_FUNCTION) ( + IN OUT POOL_PRINT *Str, + IN VOID *DevPath + ); + +typedef struct { + UINT8 Type; + UINT8 SubType; + DEV_PATH_FUNCTION Function; +} DEVICE_PATH_STRING_TABLE; + +typedef struct { + EFI_DEVICE_PATH_PROTOCOL Header; + EFI_GUID Guid; + UINT8 VendorDefinedData[1]; +} VENDOR_DEVICE_PATH_WITH_DATA; + +typedef struct { + EFI_DEVICE_PATH_PROTOCOL Header; + UINT16 NetworkProtocol; + UINT16 LoginOption; + UINT64 Lun; + UINT16 TargetPortalGroupTag; + CHAR16 TargetName[1]; +} ISCSI_DEVICE_PATH_WITH_NAME; + +// +// BBS support macros and functions +// + +#if defined(MDE_CPU_IA32) || defined(MDE_CPU_X64) +#define REFRESH_LEGACY_BOOT_OPTIONS \ + BdsDeleteAllInvalidLegacyBootOptions ();\ + BdsAddNonExistingLegacyBootOptions (); \ + BdsUpdateLegacyDevOrder () +#else +#define REFRESH_LEGACY_BOOT_OPTIONS +#endif + +/** + Delete all the invalid legacy boot options. + + @retval EFI_SUCCESS All invalid legacy boot options are deleted. + @retval EFI_OUT_OF_RESOURCES Failed to allocate necessary memory. + @retval EFI_NOT_FOUND Failed to retrieve variable of boot order. + +**/ +EFI_STATUS +EFIAPI +BdsDeleteAllInvalidLegacyBootOptions ( + VOID + ); + +/** + Add the legacy boot options from BBS table if they do not exist. + + @retval EFI_SUCCESS The boot options were added successfully, + or they are already in boot options. + @retval EFI_NOT_FOUND No legacy boot options is found. + @retval EFI_OUT_OF_RESOURCE No enough memory. + @return Other value LegacyBoot options are not added. +**/ +EFI_STATUS +EFIAPI +BdsAddNonExistingLegacyBootOptions ( + VOID + ); + +/** + Add the legacy boot devices from BBS table into + the legacy device boot order. + + @retval EFI_SUCCESS The boot devices were added successfully. + @retval EFI_NOT_FOUND The legacy boot devices are not found. + @retval EFI_OUT_OF_RESOURCES Memory or storage is not enough. + @retval EFI_DEVICE_ERROR Failed to add the legacy device boot order into EFI variable + because of a hardware error. +**/ +EFI_STATUS +EFIAPI +BdsUpdateLegacyDevOrder ( + VOID + ); + +/** + Refresh the boot priority for BBS entries based on boot option entry and boot order. + + @param Entry The boot option is to be checked for a refreshed BBS table. + + @retval EFI_SUCCESS The boot priority for BBS entries refreshed successfully. + @retval EFI_NOT_FOUND BBS entries can't be found. + @retval EFI_OUT_OF_RESOURCES Failed to get the legacy device boot order. +**/ +EFI_STATUS +EFIAPI +BdsRefreshBbsTableForBoot ( + IN BDS_COMMON_OPTION *Entry + ); + +/** + Delete the Boot Option from EFI Variable. The Boot Order Arrray + is also updated. + + @param OptionNumber The number of Boot options wanting to be deleted. + @param BootOrder The Boot Order array. + @param BootOrderSize The size of the Boot Order Array. + + @retval EFI_SUCCESS The Boot Option Variable was found and removed. + @retval EFI_UNSUPPORTED The Boot Option Variable store was inaccessible. + @retval EFI_NOT_FOUND The Boot Option Variable was not found. +**/ +EFI_STATUS +EFIAPI +BdsDeleteBootOption ( + IN UINTN OptionNumber, + IN OUT UINT16 *BootOrder, + IN OUT UINTN *BootOrderSize + ); + +// +//The interface functions related to the Setup Browser Reset Reminder feature +// +/** + Enable the setup browser reset reminder feature. + This routine is used in a platform tip. If the platform policy needs the feature, use the routine to enable it. + +**/ +VOID +EFIAPI +EnableResetReminderFeature ( + VOID + ); + +/** + Disable the setup browser reset reminder feature. + This routine is used in a platform tip. If the platform policy does not want the feature, use the routine to disable it. + +**/ +VOID +EFIAPI +DisableResetReminderFeature ( + VOID + ); + +/** + Record the info that a reset is required. + A module boolean variable is used to record whether a reset is required. + +**/ +VOID +EFIAPI +EnableResetRequired ( + VOID + ); + + +/** + Record the info that no reset is required. + A module boolean variable is used to record whether a reset is required. + +**/ +VOID +EFIAPI +DisableResetRequired ( + VOID + ); + +/** + Check whether platform policy enables the reset reminder feature. The default is enabled. + +**/ +BOOLEAN +EFIAPI +IsResetReminderFeatureEnable ( + VOID + ); + +/** + Check if the user changed any option setting that needs a system reset to be effective. + +**/ +BOOLEAN +EFIAPI +IsResetRequired ( + VOID + ); + +/** + Check whether a reset is needed, and finish the reset reminder feature. + If a reset is needed, pop up a menu to notice user, and finish the feature + according to the user selection. + +**/ +VOID +EFIAPI +SetupResetReminder ( + VOID + ); + + +/// +/// Define the boot type with which to classify the boot option type. +/// Different boot option types could have different boot behaviors. +/// Use their device path node (Type + SubType) as the type value. +/// The boot type here can be added according to requirements. +/// + +/// +/// ACPI boot type. For ACPI devices, using sub-types to distinguish devices is not allowed, so hardcode their values. +/// +#define BDS_EFI_ACPI_FLOPPY_BOOT 0x0201 +/// +/// Message boot type +/// If a device path of boot option only points to a message node, the boot option is a message boot type. +/// +#define BDS_EFI_MESSAGE_ATAPI_BOOT 0x0301 // Type 03; Sub-Type 01 +#define BDS_EFI_MESSAGE_SCSI_BOOT 0x0302 // Type 03; Sub-Type 02 +#define BDS_EFI_MESSAGE_USB_DEVICE_BOOT 0x0305 // Type 03; Sub-Type 05 +#define BDS_EFI_MESSAGE_SATA_BOOT 0x0312 // Type 03; Sub-Type 18 +#define BDS_EFI_MESSAGE_MAC_BOOT 0x030b // Type 03; Sub-Type 11 +#define BDS_EFI_MESSAGE_MISC_BOOT 0x03FF + +/// +/// Media boot type +/// If a device path of boot option contains a media node, the boot option is media boot type. +/// +#define BDS_EFI_MEDIA_HD_BOOT 0x0401 // Type 04; Sub-Type 01 +#define BDS_EFI_MEDIA_CDROM_BOOT 0x0402 // Type 04; Sub-Type 02 +/// +/// BBS boot type +/// If a device path of boot option contains a BBS node, the boot option is BBS boot type. +/// +#define BDS_LEGACY_BBS_BOOT 0x0501 // Type 05; Sub-Type 01 + +#define BDS_EFI_UNSUPPORT 0xFFFF + +/** + Check whether an instance in BlockIoDevicePath has the same partition node as the HardDriveDevicePath device path. + + @param BlockIoDevicePath Multi device path instances to check. + @param HardDriveDevicePath A device path starting with a hard drive media + device path. + + @retval TRUE There is a matched device path instance. + @retval FALSE There is no matched device path instance. + +**/ +BOOLEAN +EFIAPI +MatchPartitionDevicePathNode ( + IN EFI_DEVICE_PATH_PROTOCOL *BlockIoDevicePath, + IN HARDDRIVE_DEVICE_PATH *HardDriveDevicePath + ); + + +/** + Expand a device path that starts with a hard drive media device path node to be a + full device path that includes the full hardware path to the device. This function enables the device to boot. + To avoid requiring a connect on every boot, the front match is saved in a variable (the part point + to the partition node. E.g. ACPI() /PCI()/ATA()/Partition() ). + All successful history device paths + that point to the front part of the partition node will be saved. + + @param HardDriveDevicePath EFI Device Path to boot, if it starts with a hard + drive media device path. + @return A Pointer to the full device path, or NULL if a valid Hard Drive devic path + cannot be found. + +**/ +EFI_DEVICE_PATH_PROTOCOL * +EFIAPI +BdsExpandPartitionPartialDevicePathToFull ( + IN HARDDRIVE_DEVICE_PATH *HardDriveDevicePath + ); + +/** + Return the bootable media handle. + First, check whether the device is connected. + Second, check whether the device path points to a device that supports SimpleFileSystemProtocol. + Third, detect the the default boot file in the Media, and return the removable Media handle. + + @param DevicePath The Device Path to a bootable device. + + @return The bootable media handle. If the media on the DevicePath is not bootable, NULL will return. + +**/ +EFI_HANDLE +EFIAPI +BdsLibGetBootableHandle ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ); + + +/** + Checks whether the Device path in a boot option points to a valid bootable device, and if the device + is ready to boot now. + + @param DevPath The Device path in a boot option. + @param CheckMedia If true, check whether the device is ready to boot now. + + @retval TRUE The Device path is valid. + @retval FALSE The Device path is invalid. + +**/ +BOOLEAN +EFIAPI +BdsLibIsValidEFIBootOptDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *DevPath, + IN BOOLEAN CheckMedia + ); + +/** + Checks whether the Device path in a boot option points to a valid bootable device, and if the device + is ready to boot now. + If Description is not NULL and the device path points to a fixed BlockIo + device, this function checks whether the description conflicts with other auto-created + boot options. + + @param DevPath The Device path in a boot option. + @param CheckMedia If true, checks if the device is ready to boot now. + @param Description The description of a boot option. + + @retval TRUE The Device path is valid. + @retval FALSE The Device path is invalid. + +**/ +BOOLEAN +EFIAPI +BdsLibIsValidEFIBootOptDevicePathExt ( + IN EFI_DEVICE_PATH_PROTOCOL *DevPath, + IN BOOLEAN CheckMedia, + IN CHAR16 *Description + ); + +/** + For a bootable Device path, return its boot type. + + @param DevicePath The bootable device Path to check. + + @retval BDS_EFI_MEDIA_HD_BOOT The given device path contains MEDIA_DEVICE_PATH type device path node, + whose subtype is MEDIA_HARDDRIVE_DP. + @retval BDS_EFI_MEDIA_CDROM_BOOT If given device path contains MEDIA_DEVICE_PATH type device path node, + whose subtype is MEDIA_CDROM_DP. + @retval BDS_EFI_ACPI_FLOPPY_BOOT A given device path contains ACPI_DEVICE_PATH type device path node, + whose HID is floppy device. + @retval BDS_EFI_MESSAGE_ATAPI_BOOT A given device path contains MESSAGING_DEVICE_PATH type device path node, + and its last device path node's subtype is MSG_ATAPI_DP. + @retval BDS_EFI_MESSAGE_SCSI_BOOT A given device path contains MESSAGING_DEVICE_PATH type device path node, + and its last device path node's subtype is MSG_SCSI_DP. + @retval BDS_EFI_MESSAGE_USB_DEVICE_BOOT A given device path contains MESSAGING_DEVICE_PATH type device path node, + and its last device path node's subtype is MSG_USB_DP. + @retval BDS_EFI_MESSAGE_MISC_BOOT The device path does not contain any media device path node, and + its last device path node points to a message device path node. + @retval BDS_LEGACY_BBS_BOOT A given device path contains BBS_DEVICE_PATH type device path node. + @retval BDS_EFI_UNSUPPORT An EFI Removable BlockIO device path does not point to a media and message device. + + **/ +UINT32 +EFIAPI +BdsGetBootTypeFromDevicePath ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ); + + +/** + This routine registers a function to adjust the different types of memory page numbers + just before booting, and saves the updated info into the variable for the next boot to use. + +**/ +VOID +EFIAPI +BdsLibSaveMemoryTypeInformation ( + VOID + ); + +/** + Identify a user and, if authenticated, returns the current user profile handle. + + @param[out] User Points to the user profile handle. + + @retval EFI_SUCCESS The user is successfully identified, or user identification + is not supported. + @retval EFI_ACCESS_DENIED The user was not successfully identified. + +**/ +EFI_STATUS +EFIAPI +BdsLibUserIdentify ( + OUT EFI_USER_PROFILE_HANDLE *User + ); + +/** + This function checks if a Fv file device path is valid, according to a file GUID. If it is invalid, + it tries to return the valid device path. + FV address maybe changes for memory layout adjust from time to time, use this function + could promise the Fv file device path is right. + + @param DevicePath On input, the Fv file device path to check. On + output, the updated valid Fv file device path + @param FileGuid the Fv file GUID. + + @retval EFI_INVALID_PARAMETER The input DevicePath or FileGuid is invalid. + @retval EFI_UNSUPPORTED The input DevicePath does not contain an Fv file + GUID at all. + @retval EFI_ALREADY_STARTED The input DevicePath has pointed to the Fv file and is + valid. + @retval EFI_SUCCESS Successfully updated the invalid DevicePath + and returned the updated device path in DevicePath. + +**/ +EFI_STATUS +EFIAPI +BdsLibUpdateFvFileDevicePath ( + IN OUT EFI_DEVICE_PATH_PROTOCOL ** DevicePath, + IN EFI_GUID *FileGuid + ); + + +/** + Connect the specific USB device that matches the RemainingDevicePath, + and whose bus is determined by Host Controller (Uhci or Ehci). + + @param HostControllerPI Uhci (0x00) or Ehci (0x20) or Both uhci and ehci + (0xFF). + @param RemainingDevicePath A short-form device path that starts with the first + element being a USB WWID or a USB Class device + path. + + @retval EFI_SUCCESS The specific Usb device is connected successfully. + @retval EFI_INVALID_PARAMETER Invalid HostControllerPi (not 0x00, 0x20 or 0xFF) + or RemainingDevicePath is not the USB class device path. + @retval EFI_NOT_FOUND The device specified by device path is not found. + +**/ +EFI_STATUS +EFIAPI +BdsLibConnectUsbDevByShortFormDP( + IN UINT8 HostControllerPI, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + ); + + +// +// The implementation of this function is provided by Platform code. +// +/** + Convert Vendor device path to a device name. + + @param Str The buffer storing device name. + @param DevPath The pointer to vendor device path. + +**/ +VOID +DevPathVendor ( + IN OUT POOL_PRINT *Str, + IN VOID *DevPath + ); + +/** + Concatenates a formatted unicode string to an allocated pool. + The caller must free the resulting buffer. + + @param Str Tracks the allocated pool, size in use, and amount of pool allocated. + @param Fmt The format string. + @param ... The data will be printed. + + @return Allocated buffer with the formatted string printed in it. + The caller must free the allocated buffer. + The buffer allocation is not packed. + +**/ +CHAR16 * +EFIAPI +CatPrint ( + IN OUT POOL_PRINT *Str, + IN CHAR16 *Fmt, + ... + ); + +/** + Use SystemTable ConOut to stop video based Simple Text Out consoles from going + to the video device. Put up LogoFile on every video device that is a console. + + @param[in] LogoFile The file name of logo to display on the center of the screen. + + @retval EFI_SUCCESS ConsoleControl has been flipped to graphics and logo displayed. + @retval EFI_UNSUPPORTED Logo not found. + +**/ +EFI_STATUS +EFIAPI +EnableQuietBoot ( + IN EFI_GUID *LogoFile + ); + + +/** + Use SystemTable ConOut to turn on video based Simple Text Out consoles. The + Simple Text Out screens will now be synced up with all non-video output devices. + + @retval EFI_SUCCESS UGA devices are back in text mode and synced up. + +**/ +EFI_STATUS +EFIAPI +DisableQuietBoot ( + VOID + ); + +#endif + diff --git a/IntelFrameworkModulePkg/Include/Library/PlatformBdsLib.h b/IntelFrameworkModulePkg/Include/Library/PlatformBdsLib.h new file mode 100644 index 000000000..f971e670f --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Library/PlatformBdsLib.h @@ -0,0 +1,156 @@ +/** @file + Platform BDS library definition. A platform can implement + instances to support platform-specific behavior. + +Copyright (c) 2008 - 2010, 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 that 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 __PLATFORM_BDS_LIB_H_ +#define __PLATFORM_BDS_LIB_H_ + +#include +#include + +/** + Perform the memory test base on the memory test intensive level, + and update the memory resource. + + @param Level The memory test intensive level. + + @retval EFI_STATUS Successfully test all the system memory, and update + the memory resource + +**/ +typedef +EFI_STATUS +(EFIAPI *BASEM_MEMORY_TEST)( + IN EXTENDMEM_COVERAGE_LEVEL Level + ); + +/** + This routine is called to see if there are any capsules we need to process. + If the boot mode is not UPDATE, then we do nothing. Otherwise, find the + capsule HOBS and produce firmware volumes for them via the DXE service. + Then call the dispatcher to dispatch drivers from them. Finally, check + the status of the updates. + + This function should be called by BDS in case we need to do some + sort of processing even if there is no capsule to process. We + need to do this if an earlier update went away and we need to + clear the capsule variable so on the next reset PEI does not see it and + think there is a capsule available. + + @param BootMode The current boot mode + + @retval EFI_INVALID_PARAMETER The boot mode is not correct for an update. + @retval EFI_SUCCESS There is no error when processing a capsule. + +**/ +typedef +EFI_STATUS +(EFIAPI *PROCESS_CAPSULES)( + IN EFI_BOOT_MODE BootMode + ); + +/** + Platform Bds initialization. Includes the platform firmware vendor, revision + and so crc check. + +**/ +VOID +EFIAPI +PlatformBdsInit ( + VOID + ); + +/** + The function will execute with as the platform policy, current policy + is driven by boot mode. IBV/OEM can customize this code for their specific + policy action. + + @param DriverOptionList The header of the driver option link list + @param BootOptionList The header of the boot option link list + @param ProcessCapsules A pointer to ProcessCapsules() + @param BaseMemoryTest A pointer to BaseMemoryTest() + +**/ +VOID +EFIAPI +PlatformBdsPolicyBehavior ( + IN LIST_ENTRY *DriverOptionList, + IN LIST_ENTRY *BootOptionList, + IN PROCESS_CAPSULES ProcessCapsules, + IN BASEM_MEMORY_TEST BaseMemoryTest + ); + +/** + Hook point for a user-provided function, for after a boot attempt fails. + + @param Option A pointer to Boot Option that failed to boot. + @param Status The status returned from failed boot. + @param ExitData The exit data returned from failed boot. + @param ExitDataSize The exit data size returned from failed boot. + +**/ +VOID +EFIAPI +PlatformBdsBootFail ( + IN BDS_COMMON_OPTION *Option, + IN EFI_STATUS Status, + IN CHAR16 *ExitData, + IN UINTN ExitDataSize + ); + +/** + Hook point after a boot attempt succeeds. We don't expect a boot option to + return, so the UEFI 2.0 specification defines that you will default to an + interactive mode and stop processing the BootOrder list in this case. This + is also a platform implementation, and can be customized by an IBV/OEM. + + @param Option A pointer to the Boot Option that successfully booted. + +**/ +VOID +EFIAPI +PlatformBdsBootSuccess ( + IN BDS_COMMON_OPTION *Option + ); + + +/** + This function locks platform flash that is not allowed to be updated during normal boot path. + The flash layout is platform specific. + + **/ +VOID +EFIAPI +PlatformBdsLockNonUpdatableFlash ( + VOID + ); + +/** + Lock the ConsoleIn device in system table. All key + presses will be ignored until the Password is typed in. The only way to + disable the password is to type it in to a ConIn device. + + @param Password The password used to lock ConIn device. + + @retval EFI_SUCCESS Lock the Console In Spliter virtual handle successfully. + @retval EFI_UNSUPPORTED Password not found. + +**/ +EFI_STATUS +EFIAPI +LockKeyboards ( + IN CHAR16 *Password + ); + +#endif diff --git a/IntelFrameworkModulePkg/Include/Protocol/ExitPmAuth.h b/IntelFrameworkModulePkg/Include/Protocol/ExitPmAuth.h new file mode 100644 index 000000000..748ab9662 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Protocol/ExitPmAuth.h @@ -0,0 +1,25 @@ +/** @file + Defines the ExitPmAuth protocol. + +Copyright (c) 2010, 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. + +**/ + +#ifndef _EXIT_PM_AUTH_PROTOCOL_H_ +#define _EXIT_PM_AUTH_PROTOCOL_H_ + +#define EXIT_PM_AUTH_PROTOCOL_GUID \ + { 0xd088a413, 0xa70, 0x4217, { 0xba, 0x55, 0x9a, 0x3c, 0xb6, 0x5c, 0x41, 0xb3 }} + +extern EFI_GUID gExitPmAuthProtocolGuid; + +#endif // #ifndef _EXIT_PM_AUTH_PROTOCOL_H_ diff --git a/IntelFrameworkModulePkg/Include/Protocol/IsaAcpi.h b/IntelFrameworkModulePkg/Include/Protocol/IsaAcpi.h new file mode 100644 index 000000000..7de350441 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Protocol/IsaAcpi.h @@ -0,0 +1,304 @@ +/** @file + EFI ISA ACPI Protocol is used to enumerate and manage all the ISA controllers on + the platform's ISA Bus. + +Copyright (c) 2006 - 2010, 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 that 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 __ISA_ACPI_H_ +#define __ISA_ACPI_H_ + +/// +/// Global ID for the EFI ISA ACPI Protocol. +/// +#define EFI_ISA_ACPI_PROTOCOL_GUID \ + { \ + 0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \ + } + +/// +/// Forward declaration fo the EFI ISA ACPI Protocol +/// +typedef struct _EFI_ISA_ACPI_PROTOCOL EFI_ISA_ACPI_PROTOCOL; + +/// +/// ISA ACPI Protocol interrupt resource attributes. +/// +#define EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_EDGE_SENSITIVE 0x01 ///< Edge triggered interrupt on a rising edge. +#define EFI_ISA_ACPI_IRQ_TYPE_LOW_TRUE_EDGE_SENSITIVE 0x02 ///< Edge triggered interrupt on a falling edge. +#define EFI_ISA_ACPI_IRQ_TYPE_HIGH_TRUE_LEVEL_SENSITIVE 0x04 ///< Level sensitive interrupt active high. +#define EFI_ISA_ACPI_IRQ_TYPE_LOW_TRUE_LEVEL_SENSITIVE 0x08 ///< Level sensitive interrupt active low. + +/// +/// ISA ACPI Protocol DMA resource attributes. +/// +#define EFI_ISA_ACPI_DMA_SPEED_TYPE_MASK 0x03 ///< Bit mask of supported DMA speed attributes. +#define EFI_ISA_ACPI_DMA_SPEED_TYPE_COMPATIBILITY 0x00 ///< ISA controller supports compatibility mode DMA transfers. +#define EFI_ISA_ACPI_DMA_SPEED_TYPE_A 0x01 ///< ISA controller supports type A DMA transfers. +#define EFI_ISA_ACPI_DMA_SPEED_TYPE_B 0x02 ///< ISA controller supports type B DMA transfers. +#define EFI_ISA_ACPI_DMA_SPEED_TYPE_F 0x03 ///< ISA controller supports type F DMA transfers. +#define EFI_ISA_ACPI_DMA_COUNT_BY_BYTE 0x04 ///< ISA controller increments DMA address by bytes (8-bit). +#define EFI_ISA_ACPI_DMA_COUNT_BY_WORD 0x08 ///< ISA controller increments DMA address by words (16-bit). +#define EFI_ISA_ACPI_DMA_BUS_MASTER 0x10 ///< ISA controller is a DMA bus master. +#define EFI_ISA_ACPI_DMA_TRANSFER_TYPE_8_BIT 0x20 ///< ISA controller only supports 8-bit DMA transfers. +#define EFI_ISA_ACPI_DMA_TRANSFER_TYPE_8_BIT_AND_16_BIT 0x40 ///< ISA controller both 8-bit and 16-bit DMA transfers. +#define EFI_ISA_ACPI_DMA_TRANSFER_TYPE_16_BIT 0x80 ///< ISA controller only supports 16-bit DMA transfers. + +/// +/// ISA ACPI Protocol MMIO resource attributes +/// +#define EFI_ISA_ACPI_MEMORY_WIDTH_MASK 0x03 ///< Bit mask of supported ISA memory width attributes. +#define EFI_ISA_ACPI_MEMORY_WIDTH_8_BIT 0x00 ///< ISA MMIO region only supports 8-bit access. +#define EFI_ISA_ACPI_MEMORY_WIDTH_16_BIT 0x01 ///< ISA MMIO region only supports 16-bit access. +#define EFI_ISA_ACPI_MEMORY_WIDTH_8_BIT_AND_16_BIT 0x02 ///< ISA MMIO region supports both 8-bit and 16-bit access. +#define EFI_ISA_ACPI_MEMORY_WRITEABLE 0x04 ///< ISA MMIO region supports write transactions. +#define EFI_ISA_ACPI_MEMORY_CACHEABLE 0x08 ///< ISA MMIO region supports being cached. +#define EFI_ISA_ACPI_MEMORY_SHADOWABLE 0x10 ///< ISA MMIO region may be shadowed. +#define EFI_ISA_ACPI_MEMORY_EXPANSION_ROM 0x20 ///< ISA MMIO region is an expansion ROM. + +/// +/// ISA ACPI Protocol I/O resource attributes +/// +#define EFI_ISA_ACPI_IO_DECODE_10_BITS 0x01 ///< ISA controllers uses a 10-bit address decoder for I/O cycles. +#define EFI_ISA_ACPI_IO_DECODE_16_BITS 0x02 ///< ISA controllers uses a 16-bit address decoder for I/O cycles. + +/// +/// EFI ISA ACPI resource type +/// +typedef enum { + EfiIsaAcpiResourceEndOfList, ///< Marks the end if a resource list. + EfiIsaAcpiResourceIo, ///< ISA I/O port resource range. + EfiIsaAcpiResourceMemory, ///< ISA MMIO resource range. + EfiIsaAcpiResourceDma, ///< ISA DMA resource. + EfiIsaAcpiResourceInterrupt ///< ISA interrupt resource. +} EFI_ISA_ACPI_RESOURCE_TYPE; + +/// +/// EFI ISA ACPI generic resource structure +/// +typedef struct { + EFI_ISA_ACPI_RESOURCE_TYPE Type; ///< The type of resource (I/O, MMIO, DMA, Interrupt). + UINT32 Attribute; ///< Bit mask of attributes associated with this resource. See EFI_ISA_ACPI_xxx macros for valid combinations. + UINT32 StartRange; ///< The start of the resource range. + UINT32 EndRange; ///< The end of the resource range. +} EFI_ISA_ACPI_RESOURCE; + +/// +/// EFI ISA ACPI resource device identifier +/// +typedef struct { + UINT32 HID; ///< The ACPI Hardware Identifier value associated with an ISA controller. Matchs ACPI DSDT contents. + UINT32 UID; ///< The ACPI Unique Identifier value associated with an ISA controller. Matches ACPI DSDT contents. +} EFI_ISA_ACPI_DEVICE_ID; + +/// +/// EFI ISA ACPI resource list +/// +typedef struct { + EFI_ISA_ACPI_DEVICE_ID Device; ///< The ACPI HID/UID associated with an ISA controller. + EFI_ISA_ACPI_RESOURCE *ResourceItem; ///< A pointer to the list of resources associated with an ISA controller. +} EFI_ISA_ACPI_RESOURCE_LIST; + +/** + Enumerates the ISA controllers on an ISA bus. + + This service allows all the ISA controllers on an ISA bus to be enumerated. If + Device is a pointer to a NULL value, then the first ISA controller on the ISA + bus is returned in Device and EFI_SUCCESS is returned. If Device is a pointer + to a value that was returned on a prior call to DeviceEnumerate(), then the next + ISA controller on the ISA bus is returned in Device and EFI_SUCCESS is returned. + If Device is a pointer to the last ISA controller on the ISA bus, then + EFI_NOT_FOUND is returned. + + @param[in] This The pointer to the EFI_ISA_ACPI_PROTOCOL instance. + @param[out] Device The pointer to an ISA controller named by ACPI HID/UID. + + @retval EFI_SUCCESS The next ISA controller on the ISA bus was returned. + @retval EFI_NOT_FOUND No device found. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_ACPI_DEVICE_ENUMERATE)( + IN EFI_ISA_ACPI_PROTOCOL *This, + OUT EFI_ISA_ACPI_DEVICE_ID **Device + ); + +/** + Sets the power state of an ISA controller. + + This services sets the power state of the ISA controller specified by Device to + the power state specified by OnOff. TRUE denotes on, FALSE denotes off. + If the power state is sucessfully set on the ISA Controller, then + EFI_SUCCESS is returned. + + @param[in] This The pointer to the EFI_ISA_ACPI_PROTOCOL instance. + @param[in] Device The pointer to an ISA controller named by ACPI HID/UID. + @param[in] OnOff TRUE denotes on, FALSE denotes off. + + @retval EFI_SUCCESS Successfully set the power state of the ISA controller. + @retval Other The ISA controller could not be placed in the requested power state. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_ACPI_SET_DEVICE_POWER)( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN BOOLEAN OnOff + ); + +/** + Retrieves the current set of resources associated with an ISA controller. + + Retrieves the set of I/O, MMIO, DMA, and interrupt resources currently + assigned to the ISA controller specified by Device. These resources + are returned in ResourceList. + + @param[in] This The pointer to the EFI_ISA_ACPI_PROTOCOL instance. + @param[in] Device The pointer to an ISA controller named by ACPI HID/UID. + @param[out] ResourceList The pointer to the current resource list for Device. + + @retval EFI_SUCCESS Successfully retrieved the current resource list. + @retval EFI_NOT_FOUND The resource list could not be retrieved. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_ACPI_GET_CUR_RESOURCE)( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList + ); + +/** + Retrieves the set of possible resources that may be assigned to an ISA controller + with SetResource(). + + Retrieves the possible sets of I/O, MMIO, DMA, and interrupt resources for the + ISA controller specified by Device. The sets are returned in ResourceList. + + @param[in] This The pointer to the EFI_ISA_ACPI_PROTOCOL instance. + @param[in] Device The pointer to an ISA controller named by ACPI HID/UID. + @param[out] ResourceList The pointer to the returned list of resource lists. + + @retval EFI_UNSUPPORTED This service is not supported. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_ACPI_GET_POS_RESOURCE)( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + OUT EFI_ISA_ACPI_RESOURCE_LIST **ResourceList + ); + +/** + Assigns resources to an ISA controller. + + Assigns the I/O, MMIO, DMA, and interrupt resources specified by ResourceList + to the ISA controller specified by Device. ResourceList must match a resource list returned by GetPosResource() for the same ISA controller. + + @param[in] This The pointer to the EFI_ISA_ACPI_PROTOCOL instance. + @param[in] Device The pointer to an ISA controller named by ACPI HID/UID. + @param[in] ResourceList The pointer to a resources list that must be one of the + resource lists returned by GetPosResource() for the + ISA controller specified by Device. + + @retval EFI_SUCCESS Successfully set resources on the ISA controller. + @retval Other The resources could not be set for the ISA controller. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_ACPI_SET_RESOURCE)( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN EFI_ISA_ACPI_RESOURCE_LIST *ResourceList + ); + +/** + Enables or disables an ISA controller. + + @param[in] This The pointer to the EFI_ISA_ACPI_PROTOCOL instance. + @param[in] Device The pointer to the ISA controller to enable/disable. + @param[in] Enable TRUE to enable the ISA controller. FALSE to disable the + ISA controller. + + @retval EFI_SUCCESS Successfully enabled/disabled the ISA controller. + @retval Other The ISA controller could not be placed in the requested state. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_ACPI_ENABLE_DEVICE)( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device, + IN BOOLEAN Enable + ); + +/** + Initializes an ISA controller, so that it can be used. This service must be called + before SetResource(), EnableDevice(), or SetPower() will behave as expected. + + @param[in] This The pointer to the EFI_ISA_ACPI_PROTOCOL instance. + @param[in] Device The pointer to an ISA controller named by ACPI HID/UID. + + @retval EFI_SUCCESS Successfully initialized an ISA controller. + @retval Other The ISA controller could not be initialized. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_ACPI_INIT_DEVICE)( + IN EFI_ISA_ACPI_PROTOCOL *This, + IN EFI_ISA_ACPI_DEVICE_ID *Device + ); + +/** + Initializes all the HW states required for the ISA controllers on the ISA bus + to be enumerated and managed by the rest of the services in this prorotol. + This service must be called before any of the other services in this + protocol will function as expected. + + @param[in] This The pointer to the EFI_ISA_ACPI_PROTOCOL instance. + + @retval EFI_SUCCESS Successfully initialized all required hardware states. + @retval Other The ISA interface could not be initialized. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_ACPI_INTERFACE_INIT)( + IN EFI_ISA_ACPI_PROTOCOL *This + ); + +/// +/// The EFI_ISA_ACPI_PROTOCOL provides the services to enumerate and manage +/// ISA controllers on an ISA bus. These services include the ability to initialize, +/// enable, disable, and manage the power state of ISA controllers. It also +/// includes services to query current resources, query possible resources, +/// and assign resources to an ISA controller. +/// +struct _EFI_ISA_ACPI_PROTOCOL { + EFI_ISA_ACPI_DEVICE_ENUMERATE DeviceEnumerate; + EFI_ISA_ACPI_SET_DEVICE_POWER SetPower; + EFI_ISA_ACPI_GET_CUR_RESOURCE GetCurResource; + EFI_ISA_ACPI_GET_POS_RESOURCE GetPosResource; + EFI_ISA_ACPI_SET_RESOURCE SetResource; + EFI_ISA_ACPI_ENABLE_DEVICE EnableDevice; + EFI_ISA_ACPI_INIT_DEVICE InitDevice; + EFI_ISA_ACPI_INTERFACE_INIT InterfaceInit; +}; + +extern EFI_GUID gEfiIsaAcpiProtocolGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Protocol/IsaIo.h b/IntelFrameworkModulePkg/Include/Protocol/IsaIo.h new file mode 100644 index 000000000..cf6632e73 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Protocol/IsaIo.h @@ -0,0 +1,362 @@ +/** @file + ISA I/O Protocol is used by ISA device drivers to perform I/O, MMIO and DMA + operations on the ISA controllers they manage. + +Copyright (c) 2006 - 2010, 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 that 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 _EFI_ISA_IO_H_ +#define _EFI_ISA_IO_H_ + +#include + +/// +/// Global ID for the EFI_ISA_IO_PROTOCOL +/// +#define EFI_ISA_IO_PROTOCOL_GUID \ + { \ + 0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \ + } + +/// +/// Forward declaration for the EFI_ISA_IO_PROTOCOL. +/// +typedef struct _EFI_ISA_IO_PROTOCOL EFI_ISA_IO_PROTOCOL; + +/// +/// Width of EFI_ISA_IO_PROTOCOL I/O Port and MMIO operations. +/// +typedef enum { + EfiIsaIoWidthUint8 = 0, ///< 8-bit operation. + EfiIsaIoWidthUint16, ///< 16-bit operation. + EfiIsaIoWidthUint32, ///< 32-bit operation + EfiIsaIoWidthReserved, + EfiIsaIoWidthFifoUint8, ///< 8-bit FIFO operation. + EfiIsaIoWidthFifoUint16, ///< 16-bit FIFO operation. + EfiIsaIoWidthFifoUint32, ///< 32-bit FIFO operation. + EfiIsaIoWidthFifoReserved, + EfiIsaIoWidthFillUint8, ///< 8-bit Fill operation. + EfiIsaIoWidthFillUint16, ///< 16-bit Fill operation. + EfiIsaIoWidthFillUint32, ///< 32-bit Fill operation. + EfiIsaIoWidthFillReserved, + EfiIsaIoWidthMaximum +} EFI_ISA_IO_PROTOCOL_WIDTH; + +/// +/// Attributes for the EFI_ISA_IO_PROTOCOL common DMA buffer allocations. +/// +#define EFI_ISA_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x080 ///< Map a memory range so write are combined. +#define EFI_ISA_IO_ATTRIBUTE_MEMORY_CACHED 0x800 ///< Map a memory range so all read and write accesses are cached. +#define EFI_ISA_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000 ///< Disable a memory range. + +/// +/// Channel attribute for EFI_ISA_IO_PROTOCOL slave DMA requests +/// +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_COMPATIBLE 0x001 ///< Set the speed of the DMA transfer in compatible mode. +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_A 0x002 ///< Not supported. +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_B 0x004 ///< Not supported. +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SPEED_C 0x008 ///< Not supported. +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_8 0x010 ///< Request 8-bit DMA transfers. Only available on channels 0..3. +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_WIDTH_16 0x020 ///< Request 16-bit DMA transfers. Only available on channels 4..7. +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_SINGLE_MODE 0x040 ///< Request a single DMA transfer. +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_DEMAND_MODE 0x080 ///< Request multiple DMA transfers until TC (Terminal Count) or EOP (End of Process). +#define EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_AUTO_INITIALIZE 0x100 ///< Automatically reload base and count at the end of the DMA transfer. + +/// +/// The DMA opreration type for EFI_ISA_IO_PROTOCOL DMA requests. +/// +typedef enum { + /// + /// A read operation from system memory by a bus master. + /// + EfiIsaIoOperationBusMasterRead, + /// + /// A write operation to system memory by a bus master. + /// + EfiIsaIoOperationBusMasterWrite, + /// + /// Provides both read and write access to system memory by both the processor + /// and a bus master. The buffer is coherent from both the processor's and the + /// bus master's point of view. + /// + EfiIsaIoOperationBusMasterCommonBuffer, + /// + /// A read operation from system memory by a slave device. + /// + EfiIsaIoOperationSlaveRead, + /// + /// A write operation to system memory by a slave master. + /// + EfiIsaIoOperationSlaveWrite, + EfiIsaIoOperationMaximum +} EFI_ISA_IO_PROTOCOL_OPERATION; + +/** + Performs ISA I/O and MMIO Read/Write Cycles + + @param[in] This A pointer to the EFI_ISA_IO_PROTOCOL instance. + @param[in] Width Specifies the width of the I/O or MMIO operation. + @param[in] Offset The offset into the ISA I/O or MMIO space to start the + operation. + @param[in] Count The number of I/O or MMIO operations to perform. + @param[in, out] Buffer For read operations, the destination buffer to store + the results. For write operations, the source buffer to + write data from. + + @retval EFI_SUCCESS The data was successfully read from or written to the device. + @retval EFI_UNSUPPORTED The Offset is not valid for this device. + @retval EFI_INVALID_PARAMETER Width or Count, or both, were invalid. + @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_IO_PROTOCOL_IO_MEM)( + IN EFI_ISA_IO_PROTOCOL *This, + IN EFI_ISA_IO_PROTOCOL_WIDTH Width, + IN UINT32 Offset, + IN UINTN Count, + IN OUT VOID *Buffer + ); + +/// +/// Structure of functions for accessing ISA I/O and MMIO space. +/// +typedef struct { + /// + /// Read from ISA I/O or MMIO space. + /// + EFI_ISA_IO_PROTOCOL_IO_MEM Read; + /// + /// Write to ISA I/O or MMIO space. + /// + EFI_ISA_IO_PROTOCOL_IO_MEM Write; +} EFI_ISA_IO_PROTOCOL_ACCESS; + +/** + Copies data from one region of ISA MMIO space to another region of ISA + MMIO space. + + @param[in] This A pointer to the EFI_ISA_IO_PROTOCOL instance. + @param[in] Width Specifies the width of the MMIO copy operation. + @param[in] DestOffset The offset of the destination in ISA MMIO space. + @param[in] SrcOffset The offset of the source in ISA MMIO space. + @param[in] Count The number tranfers to perform for this copy operation. + + @retval EFI_SUCCESS The data was copied sucessfully. + @retval EFI_UNSUPPORTED The DestOffset or SrcOffset is not valid for this device. + @retval EFI_INVALID_PARAMETER Width or Count, or both, were invalid. + @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_IO_PROTOCOL_COPY_MEM)( + IN EFI_ISA_IO_PROTOCOL *This, + IN EFI_ISA_IO_PROTOCOL_WIDTH Width, + IN UINT32 DestOffset, + IN UINT32 SrcOffset, + IN UINTN Count + ); + +/** + Maps a memory region for DMA. + + This function returns the device-specific addresses required to access system memory. + This function is used to map system memory for ISA DMA operations. All ISA DMA + operations must be performed through their mapped addresses, and such mappings must + be freed with EFI_ISA_IO_PROTOCOL.Unmap() after the DMA operation is completed. + + If the DMA operation is a single read or write data transfer through an ISA bus + master, then EfiIsaIoOperationBusMasterRead or EfiIsaIoOperationBusMasterWrite + is used and the range is unmapped to complete the operation. If the DMA operation + is a single read or write data transfer through an ISA slave controller, then + EfiIsaIoOperationSlaveRead or EfiIsaIoOperationSlaveWrite is used and the range + is unmapped to complete the operation. + + If performing a DMA read operation, all the data must be present in system memory before the Map() is performed. Similarly, + if performing a DMA write operation, the data must not be accessed in system + memory until EFI_ISA_IO_PROTOCOL.Unmap() is performed. Bus master operations that + require both read and write access or require multiple host device interactions + within the same mapped region must use EfiIsaIoOperationBusMasterCommonBuffer. + However, only memory allocated via the EFI_ISA_IO_PROTOCOL.AllocateBuffer() interface + is guaranteed to be able to be mapped for this operation type. In all mapping + requests the NumberOfBytes returned may be less than originally requested. It is + the caller's responsibility to make additional requests to complete the entire + transfer. + + @param[in] This A pointer to the EFI_ISA_IO_PROTOCOL instance. + @param[in] Operation Indicates the type of DMA (slave or bus master), + and if the DMA operation is going to read or + write to system memory. + @param[in] ChannelNumber The slave channel number to use for this DMA + operation. If Operation and ChannelAttributes + shows that this device performs bus mastering + DMA, then this field is ignored. The legal + range for this field is 0..7. + @param[in] ChannelAttributes A bitmask of the attributes used to configure + the slave DMA channel for this DMA operation. + See EFI_ISA_IO_SLAVE_DMA_ATTRIBUTE_* for the + legal bit combinations. + @param[in] HostAddress The system memory address to map to the device. + @param[in, out] NumberOfBytes On input the number of bytes to map. On + output the number of bytes that were mapped. + @param[out] DeviceAddress The resulting map address for the bus master + device to use to access the hosts HostAddress. + @param[out] Mapping A returned value that must be passed to into + EFI_ISA_IO_PROTOCOL.Unmap() to free all the the + resources associated with this map request. + + @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. + @retval EFI_INVALID_PARAMETER The Operation is undefined. + @retval EFI_INVALID_PARAMETER The HostAddress is undefined. + @retval EFI_UNSUPPORTED The HostAddress can not be mapped as a common buffer. + @retval EFI_DEVICE_ERROR The system hardware could not map the requested address. + @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_IO_PROTOCOL_MAP)( + IN EFI_ISA_IO_PROTOCOL *This, + IN EFI_ISA_IO_PROTOCOL_OPERATION Operation, + IN UINT8 ChannelNumber OPTIONAL, + IN UINT32 ChannelAttributes, + IN VOID *HostAddress, + IN OUT UINTN *NumberOfBytes, + OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, + OUT VOID **Mapping + ); + +/** + Unmaps a memory region that was previously mapped with EFI_ISA_IO_PROTOCOL.Map(). + + The EFI_ISA_IO_PROTOCOL.Map() operation is completed and any corresponding + resources are released. If the operation was EfiIsaIoOperationSlaveWrite + or EfiIsaIoOperationBusMasterWrite, the data is committed to system memory. + Any resources used for the mapping are freed. + + @param[in] This A pointer to the EFI_ISA_IO_PROTOCOL instance. + @param[in] Mapping The mapping value returned from EFI_ISA_IO_PROTOCOL.Map(). + + @retval EFI_SUCCESS The memory region was unmapped. + @retval EFI_DEVICE_ERROR The data was not committed to the target system memory. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_IO_PROTOCOL_UNMAP)( + IN EFI_ISA_IO_PROTOCOL *This, + IN VOID *Mapping + ); + +/** + Allocates pages that are suitable for an EfiIsaIoOperationBusMasterCommonBuffer + mapping. + + @param[in] This A pointer to the EFI_ISA_IO_PROTOCOL instance. + @param[in] Type The type allocation to perform. + @param[in] MemoryType The type of memory to allocate. + @param[in] Pages The number of pages to allocate. + @param[out] HostAddress A pointer to store the base address of the allocated range. + @param[in] Attributes The requested bit mask of attributes for the allocated range. + + @retval EFI_SUCCESS The requested memory pages were allocated. + @retval EFI_INVALID_PARAMETER Type is invalid. + @retval EFI_INVALID_PARAMETER MemoryType is invalid. + @retval EFI_INVALID_PARAMETER HostAddress is NULL. + @retval EFI_UNSUPPORTED Attributes is unsupported. + @retval EFI_UNSUPPORTED The memory range specified by HostAddress, Pages, + and Type is not available for common buffer use. + @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_IO_PROTOCOL_ALLOCATE_BUFFER)( + IN EFI_ISA_IO_PROTOCOL *This, + IN EFI_ALLOCATE_TYPE Type, + IN EFI_MEMORY_TYPE MemoryType, + IN UINTN Pages, + OUT VOID **HostAddress, + IN UINT64 Attributes + ); + +/** + Frees a common buffer that was allocated with EFI_ISA_IO_PROTOCOL.AllocateBuffer(). + + @param[in] This A pointer to the EFI_ISA_IO_PROTOCOL instance. + @param[in] Pages The number of pages to free from the previously allocated common buffer. + @param[in] HostAddress The base address of the previously allocated common buffer. + + + @retval EFI_SUCCESS The requested memory pages were freed. + @retval EFI_INVALID_PARAMETER The memory was not allocated with EFI_ISA_IO.AllocateBufer(). + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_IO_PROTOCOL_FREE_BUFFER)( + IN EFI_ISA_IO_PROTOCOL *This, + IN UINTN Pages, + IN VOID *HostAddress + ); + +/** + Flushes a DMA buffer, which forces all DMA posted write transactions to complete. + + @param[in] This A pointer to the EFI_ISA_IO_PROTOCOL instance. + + @retval EFI_SUCCESS The DMA buffers were flushed. + @retval EFI_DEVICE_ERROR The buffers were not flushed due to a hardware error. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ISA_IO_PROTOCOL_FLUSH)( + IN EFI_ISA_IO_PROTOCOL *This + ); + +/// +/// The EFI_ISA_IO_PROTOCOL provides the basic Memory, I/O, and DMA interfaces +/// used to abstract accesses to ISA controllers. There is one EFI_ISA_IO_PROTOCOL +/// instance for each ISA controller on a ISA bus. A device driver that wishes +/// to manage an ISA controller in a system will have to retrieve the +/// ISA_PCI_IO_PROTOCOL instance associated with the ISA controller. +/// +struct _EFI_ISA_IO_PROTOCOL { + EFI_ISA_IO_PROTOCOL_ACCESS Mem; + EFI_ISA_IO_PROTOCOL_ACCESS Io; + EFI_ISA_IO_PROTOCOL_COPY_MEM CopyMem; + EFI_ISA_IO_PROTOCOL_MAP Map; + EFI_ISA_IO_PROTOCOL_UNMAP Unmap; + EFI_ISA_IO_PROTOCOL_ALLOCATE_BUFFER AllocateBuffer; + EFI_ISA_IO_PROTOCOL_FREE_BUFFER FreeBuffer; + EFI_ISA_IO_PROTOCOL_FLUSH Flush; + /// + /// The list of I/O , MMIO, DMA, and Interrupt resources associated with the + /// ISA controller abstracted by this instance of the EFI_ISA_IO_PROTOCOL. + /// + EFI_ISA_ACPI_RESOURCE_LIST *ResourceList; + /// + /// The size, in bytes, of the ROM image. + /// + UINT32 RomSize; + /// + /// A pointer to the in memory copy of the ROM image. The ISA Bus Driver is responsible + /// for allocating memory for the ROM image, and copying the contents of the ROM to memory + /// during ISA Bus initialization. + /// + VOID *RomImage; +}; + +extern EFI_GUID gEfiIsaIoProtocolGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Protocol/OEMBadging.h b/IntelFrameworkModulePkg/Include/Protocol/OEMBadging.h new file mode 100644 index 000000000..c56b7e725 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Protocol/OEMBadging.h @@ -0,0 +1,88 @@ +/** @file + The OEM Badging Protocol defines the interface to get the OEM badging + image with the display attribute. This protocol can be produced based on OEM badging images. + +Copyright (c) 2006 - 2010, 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 that 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 __EFI_OEM_BADGING_H__ +#define __EFI_OEM_BADGING_H__ + +// +// GUID for EFI OEM Badging Protocol +// +#define EFI_OEM_BADGING_PROTOCOL_GUID \ + { 0x170e13c0, 0xbf1b, 0x4218, {0x87, 0x1d, 0x2a, 0xbd, 0xc6, 0xf8, 0x87, 0xbc } } + + +typedef struct _EFI_OEM_BADGING_PROTOCOL EFI_OEM_BADGING_PROTOCOL; + +typedef enum { + EfiBadgingFormatBMP, + EfiBadgingFormatJPEG, + EfiBadgingFormatTIFF, + EfiBadgingFormatGIF, + EfiBadgingFormatUnknown +} EFI_BADGING_FORMAT; + +typedef enum { + EfiBadgingDisplayAttributeLeftTop, + EfiBadgingDisplayAttributeCenterTop, + EfiBadgingDisplayAttributeRightTop, + EfiBadgingDisplayAttributeCenterRight, + EfiBadgingDisplayAttributeRightBottom, + EfiBadgingDisplayAttributeCenterBottom, + EfiBadgingDisplayAttributeLeftBottom, + EfiBadgingDisplayAttributeCenterLeft, + EfiBadgingDisplayAttributeCenter, + EfiBadgingDisplayAttributeCustomized +} EFI_BADGING_DISPLAY_ATTRIBUTE; + +/** + + Load an OEM badge image and return its data and attributes. + + @param This The pointer to this protocol instance. + @param Instance The visible image instance is found. + @param Format The format of the image. Examples: BMP, JPEG. + @param ImageData The image data for the badge file. Currently only + supports the .bmp file format. + @param ImageSize The size of the image returned. + @param Attribute The display attributes of the image returned. + @param CoordinateX The X coordinate of the image. + @param CoordinateY The Y coordinate of the image. + + @retval EFI_SUCCESS The image was fetched successfully. + @retval EFI_NOT_FOUND The specified image could not be found. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_BADGING_GET_IMAGE)( + IN EFI_OEM_BADGING_PROTOCOL *This, + IN OUT UINT32 *Instance, + OUT EFI_BADGING_FORMAT *Format, + OUT UINT8 **ImageData, + OUT UINTN *ImageSize, + OUT EFI_BADGING_DISPLAY_ATTRIBUTE *Attribute, + OUT UINTN *CoordinateX, + OUT UINTN *CoordinateY +); + + +struct _EFI_OEM_BADGING_PROTOCOL { + EFI_BADGING_GET_IMAGE GetImage; +}; + + +extern EFI_GUID gEfiOEMBadgingProtocolGuid; + +#endif diff --git a/IntelFrameworkModulePkg/Include/Protocol/VgaMiniPort.h b/IntelFrameworkModulePkg/Include/Protocol/VgaMiniPort.h new file mode 100644 index 000000000..e912eed21 --- /dev/null +++ b/IntelFrameworkModulePkg/Include/Protocol/VgaMiniPort.h @@ -0,0 +1,94 @@ +/** @file + The VGA Mini Port Protocol used to set the text display mode of a VGA controller. + +Copyright (c) 2006 - 2010, 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 that 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 __VGA_MINI_PORT_H_ +#define __VGA_MINI_PORT_H_ + +/// +/// Global ID for the EFI_VGA_MINI_PORT_PROTOCOL. +/// +#define EFI_VGA_MINI_PORT_PROTOCOL_GUID \ + { \ + 0xc7735a2f, 0x88f5, 0x4882, {0xae, 0x63, 0xfa, 0xac, 0x8c, 0x8b, 0x86, 0xb3 } \ + } + +/// +/// Forward declaration for the EFI_VGA_MINI_PORT_PROTOCOL. +/// +typedef struct _EFI_VGA_MINI_PORT_PROTOCOL EFI_VGA_MINI_PORT_PROTOCOL; + +/** + Sets the text display mode of a VGA controller. + + Sets the text display mode of the VGA controller to the mode specified by + ModeNumber. A ModeNumber of 0 is a request for an 80x25 text mode. A + ModeNumber of 1 is a request for an 80x50 text mode. If ModeNumber is greater + than MaxModeNumber, then EFI_UNSUPPORTED is returned. If the VGA controller + is not functioning properly, then EFI_DEVICE_ERROR is returned. If the VGA + controller is sucessfully set to the mode number specified by ModeNumber, then + EFI_SUCCESS is returned. + + @param[in] This A pointer to the EFI_VGA_MINI_PORT_PROTOCOL instance. + @param[in] ModeNumber The requested mode number. 0 for 80x25. 1 for 80x5. + + @retval EFI_SUCCESS The mode number was set. + @retval EFI_UNSUPPORTED The mode number specified by ModeNumber is not supported. + @retval EFI_DEVICE_ERROR The device is not functioning properly. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_VGA_MINI_PORT_SET_MODE)( + IN EFI_VGA_MINI_PORT_PROTOCOL *This, + IN UINTN ModeNumber + ); + +struct _EFI_VGA_MINI_PORT_PROTOCOL { + EFI_VGA_MINI_PORT_SET_MODE SetMode; + /// + /// MMIO base address of the VGA text mode framebuffer. Typically set to 0xB8000. + /// + UINT64 VgaMemoryOffset; + /// + /// I/O Port address for the VGA CRTC address register. Typically set to 0x3D4. + /// + UINT64 CrtcAddressRegisterOffset; + /// + /// I/O Port address for the VGA CRTC data register. Typically set to 0x3D5. + /// + UINT64 CrtcDataRegisterOffset; + /// + /// PCI Controller MMIO BAR index of the VGA text mode frame buffer. Typically + /// set to EFI_PCI_IO_PASS_THROUGH_BAR + /// + UINT8 VgaMemoryBar; + /// + /// PCI Controller I/O BAR index of the VGA CRTC address register. Typically + /// set to EFI_PCI_IO_PASS_THROUGH_BAR + /// + UINT8 CrtcAddressRegisterBar; + /// + /// PCI Controller I/O BAR index of the VGA CRTC data register. Typically set + /// to EFI_PCI_IO_PASS_THROUGH_BAR + /// + UINT8 CrtcDataRegisterBar; + /// + /// The maximum number of text modes that this VGA controller supports. + /// + UINT8 MaxMode; +}; + +extern EFI_GUID gEfiVgaMiniPortProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Guid/BlockIo.h b/IntelFrameworkPkg/Include/Guid/BlockIo.h new file mode 100644 index 000000000..8f3fc7fea --- /dev/null +++ b/IntelFrameworkPkg/Include/Guid/BlockIo.h @@ -0,0 +1,51 @@ +/** @file + This file declares the hardware-device class GUIDs that may be used by the + PEIM that produces the Virtual Block I/O PPI. + + These GUIDs are hardware-device class GUIDs that would be imported only by the + Virtual Block I/O PEIM. This virtual PEIM imports only the actual Block I/O + PPIs from the device-class ones listed here and published a single instance of + the Block I/O PPI for consumption by the File System PEIM. In the parlance of + the Framework DXE software stack, this Virtual Block I/O PEIM is actually + embodying the functionality of the partition driver. Thsi Virtual Block I/O + PEIM has to multiple the multiple possible instances of Block I/O and also know + how to parse at least El Torito for CD-ROM, and perhaps Master Boot Record(MBR) + and GUID Partition Table(GPT) in the future. + +Copyright (c) 2009 - 2010, 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 that 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. + + @par Revision Reference: + These GUIDs are defined in Framework Recovery Specification Version 0.9 + +**/ + +#ifndef _PEI_BLOCK_IO_GUID_H_ +#define _PEI_BLOCK_IO_GUID_H_ + +/// +/// Global ID for an IDE class recovery device. +/// +#define EFI_PEI_IDE_BLOCK_IO_PPI \ + { \ + 0x0964e5b22, 0x6459, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \ + } + +/// +/// Global ID for a Floppy class recovery device. +/// +#define EFI_PEI_144_FLOPPY_BLOCK_IO_PPI \ + { \ + 0xda6855bd, 0x07b7, 0x4c05, { 0x9e, 0xd8, 0xe2, 0x59, 0xfd, 0x36, 0x0e, 0x22 } \ + } + +extern EFI_GUID gEfiPeiIdeBlockIoPpiGuid; +extern EFI_GUID gEfiPei144FloppyBlockIoPpiGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Guid/Capsule.h b/IntelFrameworkPkg/Include/Guid/Capsule.h new file mode 100644 index 000000000..b565b1417 --- /dev/null +++ b/IntelFrameworkPkg/Include/Guid/Capsule.h @@ -0,0 +1,147 @@ +/** @file + Framework Capule related Definition. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + Capsule Spec Version 0.9 +**/ + +#ifndef _CAPSULE_GUID_H__ +#define _CAPSULE_GUID_H__ + +// +// This is the GUID of the capsule header of the image on disk. +// +#define EFI_CAPSULE_GUID \ + { \ + 0x3B6686BD, 0x0D76, 0x4030, {0xB7, 0x0E, 0xB5, 0x51, 0x9E, 0x2F, 0xC5, 0xA0 } \ + } + +// +// This is the GUID of the configuration results file created by the capsule +// application. +// +#define EFI_CONFIG_FILE_NAME_GUID \ + { \ + 0x98B8D59B, 0xE8BA, 0x48EE, {0x98, 0xDD, 0xC2, 0x95, 0x39, 0x2F, 0x1E, 0xDB } \ + } + +/// +/// Bits in the flags field of the capsule header. +/// This flag is set if the capsule can support setup changes, and cleared if it cannot. +/// +#define EFI_CAPSULE_HEADER_FLAG_SETUP 0x00000001 + +#define CAPSULE_BLOCK_DESCRIPTOR_SIGNATURE SIGNATURE_32 ('C', 'B', 'D', 'S') + +// +// An array of these structs describe the blocks that make up a capsule for +// a capsule update. +// +typedef struct { + UINT64 Length; ///< Length of the data block. + EFI_PHYSICAL_ADDRESS Data; ///< Physical address of the data block. + UINT32 Signature; ///< CBDS. + UINT32 CheckSum; ///< To sum this structure to 0. +} FRAMEWORK_EFI_CAPSULE_BLOCK_DESCRIPTOR; + +typedef struct { + EFI_GUID OemGuid; + UINT32 HeaderSize; + // + // UINT8 OemHdrData[]; + // +} EFI_CAPSULE_OEM_HEADER; + +typedef struct { + /// + /// A defined GUID that indicates the start of a capsule. + /// + EFI_GUID CapsuleGuid; + /// + /// The size of the EFI_CAPSULE_HEADER structure. + /// + UINT32 HeaderSize; + /// + /// A bit-mapped list describing the capsule's attributes. + /// All undefined bits should be written as zero (0). + /// + UINT32 Flags; + /// + /// The length in bytes (27,415 for an image containing 27,415 bytes) of the entire image + /// including all headers. If this value is greater than the size of the data presented in + /// the capsule body, the image is separated across multiple media. If this + /// value is less than the size of the data, it is an error. + /// + UINT32 CapsuleImageSize; + /// + /// A zero-based number that enables a capsule to be split into pieces and then + /// recombined for easier transfer across media with limited size. The lower the + /// SequenceNumber, the earlier in the final image that the part of the capsule is to + /// appear. In capsules that are not split, this value shall be zero. + /// + UINT32 SequenceNumber; + /// + /// Used to group the various pieces of a split capsule to ensure that they comprise the + /// same base image. It is valid for this item to be zero, in which case the capsule cannot + /// be split into components. + /// + EFI_GUID InstanceId; + /// + /// The offset in bytes from the beginning of the header to the start of an EFI string that + /// contains a description of the identity of the subcapsules that make up the capsule. If + /// the capsule is not split, this value should be zero. The same string should be + /// presented for all subcapsules that constitute the same capsule. + /// + UINT32 OffsetToSplitInformation; + /// + /// The offset in bytes from the beginning of the header to the start of the part of the + /// capsule that is to be transferred to DXE. + /// + UINT32 OffsetToCapsuleBody; + /// + /// The offset in bytes from the beginning of the header to the start of the OEM-defined + /// header. This value must be less than OffsetToCapsuleBody. + /// + UINT32 OffsetToOemDefinedHeader; + /// + /// The offset in bytes from the beginning of the header to the start of human-readable + /// text that describes the entity that created the capsule. This value must be less than OffsetToCapsuleBody. + /// + UINT32 OffsetToAuthorInformation; + /// + /// The offset in bytes from the beginning of the header to the start of human-readable + /// text that describes the revision of the capsule and/or the capsule's contents. This + /// value must be less than OffsetToCapsuleBody. + /// + UINT32 OffsetToRevisionInformation; + /// + /// The offset in bytes from the beginning of the header to the start of a one-line (less + /// than 40 Unicode characters in any language) description of the capsule. It is intended + /// to be used by OS-present applications when providing a list of capsules from which + /// the user can choose. This value must be less than OffsetToCapsuleBody. + /// + UINT32 OffsetToShortDescription; + /// + /// The offset in bytes from the beginning of the header to the start of an EFI string + /// + UINT32 OffsetToLongDescription; + /// + /// This field is reserved for future use by this specification. For future compatibility, + /// this field must be set to zero + /// + UINT32 OffsetToApplicableDevices; +} FRAMEWORK_EFI_CAPSULE_HEADER; + +extern EFI_GUID gEfiCapsuleGuid; +extern EFI_GUID gEfiConfigFileNameGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Guid/DataHubRecords.h b/IntelFrameworkPkg/Include/Guid/DataHubRecords.h new file mode 100644 index 000000000..05b393b5e --- /dev/null +++ b/IntelFrameworkPkg/Include/Guid/DataHubRecords.h @@ -0,0 +1,2935 @@ +/** @file + DataHubRecord.h includes all data hub subclass GUID definitions. + + This file includes all data hub sub class defitions from + Cache subclass specification 0.9, DataHub SubClass specification 0.9, Memory SubClass Spec 0.9, + Processor Subclass specification 0.9, and Misc SubClass specification 0.9. + +Copyright (c) 2007 - 2011, 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 that 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 _DATAHUB_RECORDS_GUID_H_ +#define _DATAHUB_RECORDS_GUID_H_ + +// +// The include is required to retrieve type EFI_EXP_BASE10_DATA +// +#include + +#define EFI_PROCESSOR_SUBCLASS_GUID \ + { 0x26fdeb7e, 0xb8af, 0x4ccf, {0xaa, 0x97, 0x02, 0x63, 0x3c, 0xe4, 0x8c, 0xa7 } } + +extern EFI_GUID gEfiProcessorSubClassGuid; + + +#define EFI_CACHE_SUBCLASS_GUID \ + { 0x7f0013a7, 0xdc79, 0x4b22, {0x80, 0x99, 0x11, 0xf7, 0x5f, 0xdc, 0x82, 0x9d } } + +extern EFI_GUID gEfiCacheSubClassGuid; + +/// +/// The memory subclass belongs to the data class and is identified as the memory +/// subclass by the GUID. +/// +#define EFI_MEMORY_SUBCLASS_GUID \ + {0x4E8F4EBB, 0x64B9, 0x4e05, {0x9B, 0x18, 0x4C, 0xFE, 0x49, 0x23, 0x50, 0x97} } + +extern EFI_GUID gEfiMemorySubClassGuid; + +#define EFI_MISC_SUBCLASS_GUID \ + { 0x772484B2, 0x7482, 0x4b91, {0x9F, 0x9A, 0xAD, 0x43, 0xF8, 0x1C, 0x58, 0x81 } } + +extern EFI_GUID gEfiMiscSubClassGuid; + + +/// +/// Inconsistent with specification here: +/// In ProcSubclass specification 0.9, the value is 0x0100. +/// Keep it unchanged from the perspective of binary consistency. +/// +#define EFI_PROCESSOR_SUBCLASS_VERSION 0x00010000 + +#pragma pack(1) + +typedef struct _USB_PORT_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH PciBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} USB_PORT_DEVICE_PATH; + +// +// IDE +// +typedef struct _IDE_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH PciBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} IDE_DEVICE_PATH; + +// +// RMC Connector +// +typedef struct _RMC_CONN_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH PciBridgeDevicePath; + PCI_DEVICE_PATH PciBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} RMC_CONN_DEVICE_PATH; + +// +// RIDE +// +typedef struct _RIDE_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH PciBridgeDevicePath; + PCI_DEVICE_PATH PciBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} RIDE_DEVICE_PATH; + +// +// Gigabit NIC +// +typedef struct _GB_NIC_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH PciBridgeDevicePath; + PCI_DEVICE_PATH PciXBridgeDevicePath; + PCI_DEVICE_PATH PciXBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} GB_NIC_DEVICE_PATH; + +// +// P/S2 Connector +// +typedef struct _PS2_CONN_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH LpcBridgeDevicePath; + ACPI_HID_DEVICE_PATH LpcBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} PS2_CONN_DEVICE_PATH; + +// +// Serial Port Connector +// +typedef struct _SERIAL_CONN_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH LpcBridgeDevicePath; + ACPI_HID_DEVICE_PATH LpcBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} SERIAL_CONN_DEVICE_PATH; + +// +// Parallel Port Connector +// +typedef struct _PARALLEL_CONN_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH LpcBridgeDevicePath; + ACPI_HID_DEVICE_PATH LpcBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} PARALLEL_CONN_DEVICE_PATH; + +// +// Floopy Connector +// +typedef struct _FLOOPY_CONN_DEVICE_PATH { + ACPI_HID_DEVICE_PATH PciRootBridgeDevicePath; + PCI_DEVICE_PATH LpcBridgeDevicePath; + ACPI_HID_DEVICE_PATH LpcBusDevicePath; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath; +} FLOOPY_CONN_DEVICE_PATH; + +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined. +/// It's implementation-specific to simplify the code logic. +/// +typedef union _EFI_MISC_PORT_DEVICE_PATH { + USB_PORT_DEVICE_PATH UsbDevicePath; + IDE_DEVICE_PATH IdeDevicePath; + RMC_CONN_DEVICE_PATH RmcConnDevicePath; + RIDE_DEVICE_PATH RideDevicePath; + GB_NIC_DEVICE_PATH GbNicDevicePath; + PS2_CONN_DEVICE_PATH Ps2ConnDevicePath; + SERIAL_CONN_DEVICE_PATH SerialConnDevicePath; + PARALLEL_CONN_DEVICE_PATH ParallelConnDevicePath; + FLOOPY_CONN_DEVICE_PATH FloppyConnDevicePath; +} EFI_MISC_PORT_DEVICE_PATH; + +#pragma pack() + +/// +/// String Token Definition +/// +/// Inconsistent with specification here: +/// The macro isn't defined by any specification. +/// Keep it unchanged for backward compatibility. +/// +#define EFI_STRING_TOKEN UINT16 + +/// +/// Each data record that is a member of some subclass starts with a standard +/// header of type EFI_SUBCLASS_TYPE1_HEADER. +/// This header is only a guideline and applicable only to a data +/// subclass that is producing SMBIOS data records. A subclass can start with a +/// different header if needed. +/// +typedef struct { + /// + /// The version of the specification to which a specific subclass data record adheres. + /// + UINT32 Version; + /// + /// The size in bytes of this data class header. + /// + UINT32 HeaderSize; + /// + /// The instance number of the subclass with the same ProducerName. This number is + /// applicable in cases where multiple subclass instances that were produced by the same + /// driver exist in the system. This entry is 1 based; 0 means Reserved and -1 means Not + /// Applicable. All data consumer drivers should be able to handle all the possible values + /// of Instance, including Not Applicable and Reserved. + /// + UINT16 Instance; + /// + /// The instance number of the RecordType for the same Instance. This number is + /// applicable in cases where multiple instances of the RecordType exist for a specific + /// Instance. This entry is 1 based; 0 means Reserved and -1 means Not Applicable. + /// All data consumer drivers should be able to handle all the possible values of + /// SubInstance, including Not Applicable and Reserved. + /// + UINT16 SubInstance; + /// + /// The record number for the data record being specified. The numbering scheme and + /// definition is defined in the specific subclass specification. + /// + UINT32 RecordType; +} EFI_SUBCLASS_TYPE1_HEADER; + +/// +/// This structure is used to link data records in the same subclasses. A data record is +/// defined as a link to another data record in the same subclass using this structure. +/// +typedef struct { + /// + /// An EFI_GUID that identifies the component that produced this data record. Type + /// EFI_GUID is defined in InstallProtocolInterface() in the EFI 1.10 Specification. + /// + EFI_GUID ProducerName; + /// + /// The instance number of the subclass with the same ProducerName. This number is + /// applicable in cases where multiple subclass instances that were produced by the same + /// driver exist in the system. This entry is 1 based; 0 means Reserved and -1 means Not + /// Applicable. All data consumer drivers should be able to handle all the possible values + /// of Instance, including Not Applicable and Reserved. + /// + UINT16 Instance; + /// The instance number of the RecordType for the same Instance. This number is + /// applicable in cases where multiple instances of the RecordType exist for a specific + /// Instance. This entry is 1 based; 0 means Reserved and -1 means Not Applicable. + /// All data consumer drivers should be able to handle all the possible values of + /// SubInstance, including Not Applicable and Reserved. + UINT16 SubInstance; +} EFI_INTER_LINK_DATA; + +// +// EXP data +// +/// +/// This macro provides a calculation for base-10 representations. Value and Exponent are each +/// INT16. It is signed to cover negative values and is 16 bits wide (15 bits for data and 1 bit +/// for the sign). +/// +typedef struct { + /// + /// The INT16 number by which to multiply the base-10 representation. + /// + UINT16 Value; + /// + /// The INT16 number by which to raise the base-10 calculation. + /// + UINT16 Exponent; +} EFI_EXP_BASE2_DATA; + +typedef EFI_EXP_BASE10_DATA EFI_PROCESSOR_MAX_CORE_FREQUENCY_DATA; +typedef EFI_EXP_BASE10_DATA EFI_PROCESSOR_MAX_FSB_FREQUENCY_DATA; +typedef EFI_EXP_BASE10_DATA EFI_PROCESSOR_CORE_FREQUENCY_DATA; + +/// +/// This data record refers to the list of frequencies that the processor core supports. The list of +/// supported frequencies is determined by the firmware based on hardware capabilities--for example, +/// it could be a common subset of all processors and the chipset. The unit of measurement of this data +/// record is in Hertz. For asynchronous processors, the content of this data record is zero. +/// The list is terminated by -1 in the Value field of the last element. A Value field of zero means +/// that the processor/driver supports automatic frequency selection. +/// +/// Inconsistent with specification here: +/// According to MiscSubclass 0.9 specification, it should be a pointer since it refers to a list of frequencies. +/// +typedef EFI_EXP_BASE10_DATA *EFI_PROCESSOR_CORE_FREQUENCY_LIST_DATA; + +/// +/// This data record refers to the list of supported frequencies of the processor external bus. The list of +/// supported frequencies is determined by the firmware based on hardware capabilities--for example, +/// it could be a common subset of all processors and the chipset. The unit of measurement of this data +/// record is in Hertz. For asynchronous processors, the content of this data record is NULL. +/// The list is terminated by -1 in the Value field of the last element. A Value field of zero means +/// that the processor/driver supports automatic frequency selection. +/// +typedef EFI_EXP_BASE10_DATA *EFI_PROCESSOR_FSB_FREQUENCY_LIST_DATA; +typedef EFI_EXP_BASE10_DATA EFI_PROCESSOR_FSB_FREQUENCY_DATA; +typedef STRING_REF EFI_PROCESSOR_VERSION_DATA; +typedef STRING_REF EFI_PROCESSOR_MANUFACTURER_DATA; +typedef STRING_REF EFI_PROCESSOR_SERIAL_NUMBER_DATA; +typedef STRING_REF EFI_PROCESSOR_ASSET_TAG_DATA; +typedef STRING_REF EFI_PROCESSOR_PART_NUMBER_DATA; + +typedef struct { + UINT32 ProcessorSteppingId:4; + UINT32 ProcessorModel: 4; + UINT32 ProcessorFamily: 4; + UINT32 ProcessorType: 2; + UINT32 ProcessorReserved1: 2; + UINT32 ProcessorXModel: 4; + UINT32 ProcessorXFamily: 8; + UINT32 ProcessorReserved2: 4; +} EFI_PROCESSOR_SIGNATURE; + + +/// +/// Inconsistent with specification here: +/// The name of third field in ProcSubClass specification 0.9 is LogicalProcessorCount. +/// Keep it unchanged for backward compatibility. +/// +typedef struct { + UINT32 ProcessorBrandIndex :8; + UINT32 ProcessorClflush :8; + UINT32 ProcessorReserved :8; + UINT32 ProcessorDfltApicId :8; +} EFI_PROCESSOR_MISC_INFO; + +typedef struct { + UINT32 ProcessorFpu: 1; + UINT32 ProcessorVme: 1; + UINT32 ProcessorDe: 1; + UINT32 ProcessorPse: 1; + UINT32 ProcessorTsc: 1; + UINT32 ProcessorMsr: 1; + UINT32 ProcessorPae: 1; + UINT32 ProcessorMce: 1; + UINT32 ProcessorCx8: 1; + UINT32 ProcessorApic: 1; + UINT32 ProcessorReserved1: 1; + UINT32 ProcessorSep: 1; + UINT32 ProcessorMtrr: 1; + UINT32 ProcessorPge: 1; + UINT32 ProcessorMca: 1; + UINT32 ProcessorCmov: 1; + UINT32 ProcessorPat: 1; + UINT32 ProcessorPse36: 1; + UINT32 ProcessorPsn: 1; + UINT32 ProcessorClfsh: 1; + UINT32 ProcessorReserved2: 1; + UINT32 ProcessorDs: 1; + UINT32 ProcessorAcpi: 1; + UINT32 ProcessorMmx: 1; + UINT32 ProcessorFxsr: 1; + UINT32 ProcessorSse: 1; + UINT32 ProcessorSse2: 1; + UINT32 ProcessorSs: 1; + UINT32 ProcessorReserved3: 1; + UINT32 ProcessorTm: 1; + UINT32 ProcessorReserved4: 2; +} EFI_PROCESSOR_FEATURE_FLAGS; + +/// +/// This data record refers to the unique ID that identifies a set of processors. This data record is 16 +/// bytes in length. The data in this structure is processor specific and reserved values can be defined +/// for future use. The consumer of this data should not make any assumption and should use this data +/// with respect to the processor family defined in the Family record number. +/// +typedef struct { + /// + /// Identifies the processor. + /// + EFI_PROCESSOR_SIGNATURE Signature; + /// + /// Provides additional processor information. + /// + EFI_PROCESSOR_MISC_INFO MiscInfo; + /// + /// Reserved for future use. + /// + UINT32 Reserved; + /// + /// Provides additional processor information. + /// + EFI_PROCESSOR_FEATURE_FLAGS FeatureFlags; +} EFI_PROCESSOR_ID_DATA; + +/// +/// This data record refers to the general classification of the processor. This data record is 4 bytes in +/// length. +/// +typedef enum { + EfiProcessorOther = 1, + EfiProcessorUnknown = 2, + EfiCentralProcessor = 3, + EfiMathProcessor = 4, + EfiDspProcessor = 5, + EfiVideoProcessor = 6 +} EFI_PROCESSOR_TYPE_DATA; + +/// +/// This data record refers to the family of the processor as defined by the DMTF. +/// This data record is 4 bytes in length. +/// +typedef enum { + EfiProcessorFamilyOther = 0x01, + EfiProcessorFamilyUnknown = 0x02, + EfiProcessorFamily8086 = 0x03, + EfiProcessorFamily80286 = 0x04, + EfiProcessorFamilyIntel386 = 0x05, + EfiProcessorFamilyIntel486 = 0x06, + EfiProcessorFamily8087 = 0x07, + EfiProcessorFamily80287 = 0x08, + EfiProcessorFamily80387 = 0x09, + EfiProcessorFamily80487 = 0x0A, + EfiProcessorFamilyPentium = 0x0B, + EfiProcessorFamilyPentiumPro = 0x0C, + EfiProcessorFamilyPentiumII = 0x0D, + EfiProcessorFamilyPentiumMMX = 0x0E, + EfiProcessorFamilyCeleron = 0x0F, + EfiProcessorFamilyPentiumIIXeon = 0x10, + EfiProcessorFamilyPentiumIII = 0x11, + EfiProcessorFamilyM1 = 0x12, + EfiProcessorFamilyM2 = 0x13, + EfiProcessorFamilyM1Reserved2 = 0x14, + EfiProcessorFamilyM1Reserved3 = 0x15, + EfiProcessorFamilyM1Reserved4 = 0x16, + EfiProcessorFamilyM1Reserved5 = 0x17, + EfiProcessorFamilyAmdDuron = 0x18, + EfiProcessorFamilyK5 = 0x19, + EfiProcessorFamilyK6 = 0x1A, + EfiProcessorFamilyK6_2 = 0x1B, + EfiProcessorFamilyK6_3 = 0x1C, + EfiProcessorFamilyAmdAthlon = 0x1D, + EfiProcessorFamilyAmd29000 = 0x1E, + EfiProcessorFamilyK6_2Plus = 0x1F, + EfiProcessorFamilyPowerPC = 0x20, + EfiProcessorFamilyPowerPC601 = 0x21, + EfiProcessorFamilyPowerPC603 = 0x22, + EfiProcessorFamilyPowerPC603Plus = 0x23, + EfiProcessorFamilyPowerPC604 = 0x24, + EfiProcessorFamilyPowerPC620 = 0x25, + EfiProcessorFamilyPowerPCx704 = 0x26, + EfiProcessorFamilyPowerPC750 = 0x27, + EfiProcessorFamilyAlpha3 = 0x30, + EfiProcessorFamilyAlpha21064 = 0x31, + EfiProcessorFamilyAlpha21066 = 0x32, + EfiProcessorFamilyAlpha21164 = 0x33, + EfiProcessorFamilyAlpha21164PC = 0x34, + EfiProcessorFamilyAlpha21164a = 0x35, + EfiProcessorFamilyAlpha21264 = 0x36, + EfiProcessorFamilyAlpha21364 = 0x37, + EfiProcessorFamilyMips = 0x40, + EfiProcessorFamilyMIPSR4000 = 0x41, + EfiProcessorFamilyMIPSR4200 = 0x42, + EfiProcessorFamilyMIPSR4400 = 0x43, + EfiProcessorFamilyMIPSR4600 = 0x44, + EfiProcessorFamilyMIPSR10000 = 0x45, + EfiProcessorFamilySparc = 0x50, + EfiProcessorFamilySuperSparc = 0x51, + EfiProcessorFamilymicroSparcII = 0x52, + EfiProcessorFamilymicroSparcIIep = 0x53, + EfiProcessorFamilyUltraSparc = 0x54, + EfiProcessorFamilyUltraSparcII = 0x55, + EfiProcessorFamilyUltraSparcIIi = 0x56, + EfiProcessorFamilyUltraSparcIII = 0x57, + /// + /// Inconsistent with specification here: + /// This field in ProcSubClass specification 0.9 is defined as EfiProcessorFamilyUltraSparcIIi. + /// Change it to EfiProcessorFamilyUltraSparcIIIi to avoid build break. + /// + EfiProcessorFamilyUltraSparcIIIi = 0x58, + EfiProcessorFamily68040 = 0x60, + EfiProcessorFamily68xxx = 0x61, + EfiProcessorFamily68000 = 0x62, + EfiProcessorFamily68010 = 0x63, + EfiProcessorFamily68020 = 0x64, + EfiProcessorFamily68030 = 0x65, + EfiProcessorFamilyHobbit = 0x70, + EfiProcessorFamilyCrusoeTM5000 = 0x78, + EfiProcessorFamilyCrusoeTM3000 = 0x79, + EfiProcessorFamilyEfficeonTM8000 = 0x7A, + EfiProcessorFamilyWeitek = 0x80, + EfiProcessorFamilyItanium = 0x82, + EfiProcessorFamilyAmdAthlon64 = 0x83, + EfiProcessorFamilyAmdOpteron = 0x84, + EfiProcessorFamilyAmdSempron = 0x85, + EfiProcessorFamilyAmdTurion64Mobile = 0x86, + EfiProcessorFamilyDualCoreAmdOpteron = 0x87, + EfiProcessorFamilyAmdAthlon64X2DualCore = 0x88, + EfiProcessorFamilyAmdTurion64X2Mobile = 0x89, + EfiProcessorFamilyPARISC = 0x90, + EfiProcessorFamilyPaRisc8500 = 0x91, + EfiProcessorFamilyPaRisc8000 = 0x92, + EfiProcessorFamilyPaRisc7300LC = 0x93, + EfiProcessorFamilyPaRisc7200 = 0x94, + EfiProcessorFamilyPaRisc7100LC = 0x95, + EfiProcessorFamilyPaRisc7100 = 0x96, + EfiProcessorFamilyV30 = 0xA0, + EfiProcessorFamilyPentiumIIIXeon = 0xB0, + EfiProcessorFamilyPentiumIIISpeedStep = 0xB1, + EfiProcessorFamilyPentium4 = 0xB2, + EfiProcessorFamilyIntelXeon = 0xB3, + EfiProcessorFamilyAS400 = 0xB4, + EfiProcessorFamilyIntelXeonMP = 0xB5, + EfiProcessorFamilyAMDAthlonXP = 0xB6, + EfiProcessorFamilyAMDAthlonMP = 0xB7, + EfiProcessorFamilyIntelItanium2 = 0xB8, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyIntelPentiumM = 0xB9, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyIntelCeleronD = 0xBA, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyIntelPentiumD = 0xBB, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyIntelPentiumEx = 0xBC, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyIntelCoreSolo = 0xBD, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyReserved = 0xBE, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyIntelCore2 = 0xBF, + EfiProcessorFamilyIBM390 = 0xC8, + EfiProcessorFamilyG4 = 0xC9, + EfiProcessorFamilyG5 = 0xCA, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyG6 = 0xCB, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyzArchitectur = 0xCC, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyViaC7M = 0xD2, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyViaC7D = 0xD3, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyViaC7 = 0xD4, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyViaEden = 0xD5, + EfiProcessorFamilyi860 = 0xFA, + EfiProcessorFamilyi960 = 0xFB, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyIndicatorFamily2 = 0xFE, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorFamilyReserved1 = 0xFF +} EFI_PROCESSOR_FAMILY_DATA; + +typedef enum { + EfiProcessorFamilySh3 = 0x104, + EfiProcessorFamilySh4 = 0x105, + EfiProcessorFamilyArm = 0x118, + EfiProcessorFamilyStrongArm = 0x119, + EfiProcessorFamily6x86 = 0x12C, + EfiProcessorFamilyMediaGx = 0x12D, + EfiProcessorFamilyMii = 0x12E, + EfiProcessorFamilyWinChip = 0x140, + EfiProcessorFamilyDsp = 0x15E, + EfiProcessorFamilyVideo = 0x1F4 +} EFI_PROCESSOR_FAMILY2_DATA; + +/// +/// This data record refers to the core voltage of the processor being defined. The unit of measurement +/// of this data record is in volts. +/// +typedef EFI_EXP_BASE10_DATA EFI_PROCESSOR_VOLTAGE_DATA; + +/// +/// This data record refers to the base address of the APIC of the processor being defined. This data +/// record is a physical address location. +/// +typedef EFI_PHYSICAL_ADDRESS EFI_PROCESSOR_APIC_BASE_ADDRESS_DATA; + +/// +/// This data record refers to the ID of the APIC of the processor being defined. This data record is a +/// 4-byte entry. +/// +typedef UINT32 EFI_PROCESSOR_APIC_ID_DATA; + +/// +/// This data record refers to the version number of the APIC of the processor being defined. This data +/// record is a 4-byte entry. +/// +typedef UINT32 EFI_PROCESSOR_APIC_VERSION_NUMBER_DATA; + +typedef enum { + EfiProcessorIa32Microcode = 1, + EfiProcessorIpfPalAMicrocode = 2, + EfiProcessorIpfPalBMicrocode = 3 +} EFI_PROCESSOR_MICROCODE_TYPE; + +/// +/// This data record refers to the revision of the processor microcode that is loaded in the processor. +/// This data record is a 4-byte entry. +/// +typedef struct { + /// + /// Identifies what type of microcode the data is. + /// + EFI_PROCESSOR_MICROCODE_TYPE ProcessorMicrocodeType; + /// + /// Indicates the revision number of this microcode. + /// + UINT32 ProcessorMicrocodeRevisionNumber; +} EFI_PROCESSOR_MICROCODE_REVISION_DATA; + +/// +/// This data record refers to the status of the processor. +/// +typedef struct { + UINT32 CpuStatus :3; ///< Indicates the status of the processor. + UINT32 Reserved1 :3; ///< Reserved for future use. Should be set to zero. + UINT32 SocketPopulated :1; ///< Indicates if the processor is socketed or not. + UINT32 Reserved2 :1; ///< Reserved for future use. Should be set to zero. + UINT32 ApicEnable :1; ///< Indicates if the APIC is enabled or not. + UINT32 BootApplicationProcessor :1; ///< Indicates if this processor is the boot processor. + UINT32 Reserved3 :22;///< Reserved for future use. Should be set to zero. +} EFI_PROCESSOR_STATUS_DATA; + +typedef enum { + EfiCpuStatusUnknown = 0, + EfiCpuStatusEnabled = 1, + EfiCpuStatusDisabledByUser = 2, + EfiCpuStatusDisabledbyBios = 3, + EfiCpuStatusIdle = 4, + EfiCpuStatusOther = 7 +} EFI_CPU_STATUS; + +typedef enum { + EfiProcessorSocketOther = 1, + EfiProcessorSocketUnknown = 2, + EfiProcessorSocketDaughterBoard = 3, + EfiProcessorSocketZIF = 4, + EfiProcessorSocketReplacePiggyBack = 5, + EfiProcessorSocketNone = 6, + EfiProcessorSocketLIF = 7, + EfiProcessorSocketSlot1 = 8, + EfiProcessorSocketSlot2 = 9, + EfiProcessorSocket370Pin = 0xA, + EfiProcessorSocketSlotA = 0xB, + EfiProcessorSocketSlotM = 0xC, + EfiProcessorSocket423 = 0xD, + EfiProcessorSocketA462 = 0xE, + EfiProcessorSocket478 = 0xF, + EfiProcessorSocket754 = 0x10, + EfiProcessorSocket940 = 0x11, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorSocket939 = 0x12, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorSocketmPGA604 = 0x13, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorSocketLGA771 = 0x14, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in ProcSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiProcessorSocketLGA775 = 0x15 + +} EFI_PROCESSOR_SOCKET_TYPE_DATA; + +typedef STRING_REF EFI_PROCESSOR_SOCKET_NAME_DATA; + +/// +/// Inconsistent with specification here: +/// In ProcSubclass specification 0.9, the naming is EFI_PROCESSOR_CACHE_ASSOCIATION_DATA. +/// Keep it unchanged for backward compatibilty. +/// +typedef EFI_INTER_LINK_DATA EFI_CACHE_ASSOCIATION_DATA; + +/// +/// This data record refers to the health status of the processor. +/// +/// Inconsistent with specification here: +/// In ProcSubclass specification 0.9, the naming is EFI_PROCESSOR_HEALTH_STATUS_DATA. +/// Keep it unchanged for backward compatibilty. +/// +typedef enum { + EfiProcessorHealthy = 1, + EfiProcessorPerfRestricted = 2, + EfiProcessorFuncRestricted = 3 +} EFI_PROCESSOR_HEALTH_STATUS; + +/// +/// This data record refers to the package number of this processor. Multiple logical processors can +/// exist in a system and each logical processor can be correlated to the physical processor using this +/// record type. +/// +typedef UINTN EFI_PROCESSOR_PACKAGE_NUMBER_DATA; + +typedef UINT8 EFI_PROCESSOR_CORE_COUNT_DATA; +typedef UINT8 EFI_PROCESSOR_ENABLED_CORE_COUNT_DATA; +typedef UINT8 EFI_PROCESSOR_THREAD_COUNT_DATA; + +typedef struct { + UINT16 Reserved :1; + UINT16 Unknown :1; + UINT16 Capable64Bit :1; + UINT16 Reserved2 :13; +} EFI_PROCESSOR_CHARACTERISTICS_DATA; + +/// +/// Inconsistent with specification here: +/// In ProcSubclass specification 0.9, the enumeration type data structure is NOT defined. +/// The equivalent in specification is +/// #define EFI_PROCESSOR_FREQUENCY_RECORD_NUMBER 0x00000001 +/// #define EFI_PROCESSOR_BUS_FREQUENCY_RECORD_NUMBER 0x00000002 +/// #define EFI_PROCESSOR_VERSION_RECORD_NUMBER 0x00000003 +/// #define EFI_PROCESSOR_MANUFACTURER_RECORD_NUMBER 0x00000004 +/// #define EFI_PROCESSOR_SERIAL_NUMBER_RECORD_NUMBER 0x00000005 +/// #define EFI_PROCESSOR_ID_RECORD_NUMBER 0x00000006 +/// #define EFI_PROCESSOR_TYPE_RECORD_NUMBER 0x00000007 +/// #define EFI_PROCESSOR_FAMILY_RECORD_NUMBER 0x00000008 +/// #define EFI_PROCESSOR_VOLTAGE_RECORD_NUMBER 0x00000009 +/// #define EFI_PROCESSOR_APIC_BASE_ADDRESS_RECORD_NUMBER 0x0000000A +/// #define EFI_PROCESSOR_APIC_ID_RECORD_NUMBER 0x0000000B +/// #define EFI_PROCESSOR_APIC_VER_NUMBER_RECORD_NUMBER 0x0000000C +/// #define EFI_PROCESSOR_MICROCODE_REVISION_RECORD_NUMBER 0x0000000D +/// #define EFI_PROCESSOR_STATUS_RECORD_NUMBER 0x0000000E +/// #define EFI_PROCESSOR_SOCKET_TYPE_RECORD_NUMBER 0x0000000F +/// #define EFI_PROCESSOR_SOCKET_NAME_RECORD_NUMBER 0x00000010 +/// #define EFI_PROCESSOR_CACHE_ASSOCIATION_RECORD_NUMBER 0x00000011 +/// #define EFI_PROCESSOR_MAX_FREQUENCY_RECORD_NUMBER 0x00000012 +/// #define EFI_PROCESSOR_ASSET_TAG_RECORD_NUMBER 0x00000013 +/// #define EFI_PROCESSOR_MAX_FSB_FREQUENCY_RECORD_NUMBER 0x00000014 +/// #define EFI_PROCESSOR_PACKAGE_NUMBER_RECORD_NUMBER 0x00000015 +/// #define EFI_PROCESSOR_FREQUENCY_LIST_RECORD_NUMBER 0x00000016 +/// #define EFI_PROCESSOR_FSB_FREQUENCY_LIST_RECORD_NUMBER 0x00000017 +/// #define EFI_PROCESSOR_HEALTH_STATUS_RECORD_NUMBER 0x00000018 +/// +/// Keep the definition unchanged for backward compatibility. +typedef enum { + ProcessorCoreFrequencyRecordType = 1, + ProcessorFsbFrequencyRecordType = 2, + ProcessorVersionRecordType = 3, + ProcessorManufacturerRecordType = 4, + ProcessorSerialNumberRecordType = 5, + ProcessorIdRecordType = 6, + ProcessorTypeRecordType = 7, + ProcessorFamilyRecordType = 8, + ProcessorVoltageRecordType = 9, + ProcessorApicBaseAddressRecordType = 10, + ProcessorApicIdRecordType = 11, + ProcessorApicVersionNumberRecordType = 12, + CpuUcodeRevisionDataRecordType = 13, + ProcessorStatusRecordType = 14, + ProcessorSocketTypeRecordType = 15, + ProcessorSocketNameRecordType = 16, + CacheAssociationRecordType = 17, + ProcessorMaxCoreFrequencyRecordType = 18, + ProcessorAssetTagRecordType = 19, + ProcessorMaxFsbFrequencyRecordType = 20, + ProcessorPackageNumberRecordType = 21, + ProcessorCoreFrequencyListRecordType = 22, + ProcessorFsbFrequencyListRecordType = 23, + ProcessorHealthStatusRecordType = 24, + ProcessorCoreCountRecordType = 25, + ProcessorEnabledCoreCountRecordType = 26, + ProcessorThreadCountRecordType = 27, + ProcessorCharacteristicsRecordType = 28, + ProcessorFamily2RecordType = 29, + ProcessorPartNumberRecordType = 30, +} EFI_CPU_VARIABLE_RECORD_TYPE; + +/// +/// Inconsistent with specification here: +/// In ProcSubclass specification 0.9, the union type data structure is NOT defined. +/// It's implementation-specific to simplify the code logic. +/// +typedef union { + EFI_PROCESSOR_CORE_FREQUENCY_LIST_DATA ProcessorCoreFrequencyList; + EFI_PROCESSOR_FSB_FREQUENCY_LIST_DATA ProcessorFsbFrequencyList; + EFI_PROCESSOR_SERIAL_NUMBER_DATA ProcessorSerialNumber; + EFI_PROCESSOR_CORE_FREQUENCY_DATA ProcessorCoreFrequency; + EFI_PROCESSOR_FSB_FREQUENCY_DATA ProcessorFsbFrequency; + EFI_PROCESSOR_MAX_CORE_FREQUENCY_DATA ProcessorMaxCoreFrequency; + EFI_PROCESSOR_MAX_FSB_FREQUENCY_DATA ProcessorMaxFsbFrequency; + EFI_PROCESSOR_VERSION_DATA ProcessorVersion; + EFI_PROCESSOR_MANUFACTURER_DATA ProcessorManufacturer; + EFI_PROCESSOR_ID_DATA ProcessorId; + EFI_PROCESSOR_TYPE_DATA ProcessorType; + EFI_PROCESSOR_FAMILY_DATA ProcessorFamily; + EFI_PROCESSOR_VOLTAGE_DATA ProcessorVoltage; + EFI_PROCESSOR_APIC_BASE_ADDRESS_DATA ProcessorApicBase; + EFI_PROCESSOR_APIC_ID_DATA ProcessorApicId; + EFI_PROCESSOR_APIC_VERSION_NUMBER_DATA ProcessorApicVersionNumber; + EFI_PROCESSOR_MICROCODE_REVISION_DATA CpuUcodeRevisionData; + EFI_PROCESSOR_STATUS_DATA ProcessorStatus; + EFI_PROCESSOR_SOCKET_TYPE_DATA ProcessorSocketType; + EFI_PROCESSOR_SOCKET_NAME_DATA ProcessorSocketName; + EFI_PROCESSOR_ASSET_TAG_DATA ProcessorAssetTag; + EFI_PROCESSOR_PART_NUMBER_DATA ProcessorPartNumber; + EFI_PROCESSOR_HEALTH_STATUS ProcessorHealthStatus; + EFI_PROCESSOR_PACKAGE_NUMBER_DATA ProcessorPackageNumber; + EFI_PROCESSOR_CORE_COUNT_DATA ProcessorCoreCount; + EFI_PROCESSOR_ENABLED_CORE_COUNT_DATA ProcessorEnabledCoreCount; + EFI_PROCESSOR_THREAD_COUNT_DATA ProcessorThreadCount; + EFI_PROCESSOR_CHARACTERISTICS_DATA ProcessorCharacteristics; + EFI_PROCESSOR_FAMILY2_DATA ProcessorFamily2; +} EFI_CPU_VARIABLE_RECORD; + +typedef struct { + EFI_SUBCLASS_TYPE1_HEADER DataRecordHeader; + EFI_CPU_VARIABLE_RECORD VariableRecord; +} EFI_CPU_DATA_RECORD; + +#define EFI_CACHE_SUBCLASS_VERSION 0x00010000 + +typedef EFI_EXP_BASE2_DATA EFI_CACHE_SIZE_DATA; +/// +/// Inconsistent with specification here: +/// In CacheSubclass specification 0.9, the naming is EFI_CACHE_MAXIMUM_SIZE_DATA. +/// Keep it unchanged for backward compatibilty. +/// +typedef EFI_EXP_BASE2_DATA EFI_MAXIMUM_CACHE_SIZE_DATA; +typedef EFI_EXP_BASE10_DATA EFI_CACHE_SPEED_DATA; +typedef STRING_REF EFI_CACHE_SOCKET_DATA; + +typedef struct { + UINT32 Other :1; + UINT32 Unknown :1; + UINT32 NonBurst :1; + UINT32 Burst :1; + UINT32 PipelineBurst :1; + /// + /// Inconsistent between CacheSubclass 0.9 and SMBIOS specifications here: + /// In CacheSubclass specification 0.9, the sequence of Asynchronous and Synchronous fileds + /// are opposite to SMBIOS specification. + /// + UINT32 Asynchronous :1; + UINT32 Synchronous :1; + UINT32 Reserved :25; +} EFI_CACHE_SRAM_TYPE_DATA; + +typedef EFI_CACHE_SRAM_TYPE_DATA EFI_CACHE_SRAM_INSTALL_DATA; + +typedef enum { + EfiCacheErrorOther = 1, + EfiCacheErrorUnknown = 2, + EfiCacheErrorNone = 3, + EfiCacheErrorParity = 4, + EfiCacheErrorSingleBit = 5, + EfiCacheErrorMultiBit = 6 +} EFI_CACHE_ERROR_TYPE_DATA; + +typedef enum { + EfiCacheTypeOther = 1, + EfiCacheTypeUnknown = 2, + EfiCacheTypeInstruction = 3, + EfiCacheTypeData = 4, + EfiCacheTypeUnified = 5 +} EFI_CACHE_TYPE_DATA; + +typedef enum { + EfiCacheAssociativityOther = 1, + EfiCacheAssociativityUnknown = 2, + EfiCacheAssociativityDirectMapped = 3, + EfiCacheAssociativity2Way = 4, + EfiCacheAssociativity4Way = 5, + EfiCacheAssociativityFully = 6, + EfiCacheAssociativity8Way = 7, + EfiCacheAssociativity16Way = 8 +} EFI_CACHE_ASSOCIATIVITY_DATA; + +/// +/// Inconsistent with specification here: +/// In CacheSubclass 0.9 specification. It defines the field type as UINT16. +/// In fact, it should be UINT32 type because it refers to a 32bit width data. +/// +typedef struct { + UINT32 Level :3; + UINT32 Socketed :1; + UINT32 Reserved2 :1; + UINT32 Location :2; + UINT32 Enable :1; + UINT32 OperationalMode :2; + UINT32 Reserved1 :22; +} EFI_CACHE_CONFIGURATION_DATA; + +#define EFI_CACHE_L1 1 +#define EFI_CACHE_L2 2 +#define EFI_CACHE_L3 3 +#define EFI_CACHE_L4 4 +#define EFI_CACHE_LMAX EFI_CACHE_L4 + +#define EFI_CACHE_SOCKETED 1 +#define EFI_CACHE_NOT_SOCKETED 0 + +typedef enum { + EfiCacheInternal = 0, + EfiCacheExternal = 1, + EfiCacheReserved = 2, + EfiCacheUnknown = 3 +} EFI_CACHE_LOCATION; + +#define EFI_CACHE_ENABLED 1 +#define EFI_CACHE_DISABLED 0 + +typedef enum { + EfiCacheWriteThrough = 0, + EfiCacheWriteBack = 1, + EfiCacheDynamicMode = 2, + EfiCacheUnknownMode = 3 +} EFI_CACHE_OPERATIONAL_MODE; + + +/// +/// Inconsistent with specification here: +/// In CacheSubclass specification 0.9, the enumeration type data structure is NOT defined. +/// The equivalent in specification is +/// #define EFI_CACHE_SIZE_RECORD_NUMBER 0x00000001 +/// #define EFI_CACHE_MAXIMUM_SIZE_RECORD_NUMBER 0x00000002 +/// #define EFI_CACHE_SPEED_RECORD_NUMBER 0x00000003 +/// #define EFI_CACHE_SOCKET_RECORD_NUMBER 0x00000004 +/// #define EFI_CACHE_SRAM_SUPPORT_RECORD_NUMBER 0x00000005 +/// #define EFI_CACHE_SRAM_INSTALL_RECORD_NUMBER 0x00000006 +/// #define EFI_CACHE_ERROR_SUPPORT_RECORD_NUMBER 0x00000007 +/// #define EFI_CACHE_TYPE_RECORD_NUMBER 0x00000008 +/// #define EFI_CACHE_ASSOCIATIVITY_RECORD_NUMBER 0x00000009 +/// #define EFI_CACHE_CONFIGURATION_RECORD_NUMBER 0x0000000A +/// Keep the definition unchanged for backward compatibility. +/// +typedef enum { + CacheSizeRecordType = 1, + MaximumSizeCacheRecordType = 2, + CacheSpeedRecordType = 3, + CacheSocketRecordType = 4, + CacheSramTypeRecordType = 5, + CacheInstalledSramTypeRecordType = 6, + CacheErrorTypeRecordType = 7, + CacheTypeRecordType = 8, + CacheAssociativityRecordType = 9, + CacheConfigRecordType = 10 +} EFI_CACHE_VARIABLE_RECORD_TYPE; + +/// +/// Inconsistent with specification here: +/// In CacheSubclass specification 0.9, the union type data structure is NOT defined. +/// It's implementation-specific to simplify the code logic. +/// +typedef union { + EFI_CACHE_SIZE_DATA CacheSize; + EFI_MAXIMUM_CACHE_SIZE_DATA MaximumCacheSize; + EFI_CACHE_SPEED_DATA CacheSpeed; + EFI_CACHE_SOCKET_DATA CacheSocket; + EFI_CACHE_SRAM_TYPE_DATA CacheSramType; + EFI_CACHE_SRAM_TYPE_DATA CacheInstalledSramType; + EFI_CACHE_ERROR_TYPE_DATA CacheErrorType; + EFI_CACHE_TYPE_DATA CacheType; + EFI_CACHE_ASSOCIATIVITY_DATA CacheAssociativity; + EFI_CACHE_CONFIGURATION_DATA CacheConfig; + EFI_CACHE_ASSOCIATION_DATA CacheAssociation; +} EFI_CACHE_VARIABLE_RECORD; + +typedef struct { + EFI_SUBCLASS_TYPE1_HEADER DataRecordHeader; + EFI_CACHE_VARIABLE_RECORD VariableRecord; +} EFI_CACHE_DATA_RECORD; + +#define EFI_MEMORY_SUBCLASS_VERSION 0x0100 +#define EFI_MEMORY_SIZE_RECORD_NUMBER 0x00000001 + +typedef enum _EFI_MEMORY_REGION_TYPE { + EfiMemoryRegionMemory = 0x01, + EfiMemoryRegionReserved = 0x02, + EfiMemoryRegionAcpi = 0x03, + EfiMemoryRegionNvs = 0x04 +} EFI_MEMORY_REGION_TYPE; + +/// +/// This data record refers to the size of a memory region. The regions that are +/// described can refer to physical memory, memory-mapped I/O, or reserved BIOS memory regions. +/// The unit of measurement of this data record is in bytes. +/// +typedef struct { + /// + /// A zero-based value that indicates which processor(s) can access the memory region. + /// A value of 0xFFFF indicates the region is accessible by all processors. + /// + UINT32 ProcessorNumber; + /// + /// A zero-based value that indicates the starting bus that can access the memory region. + /// + UINT16 StartBusNumber; + /// + /// A zero-based value that indicates the ending bus that can access the memory region. + /// A value of 0xFF for a PCI system indicates the region is accessible by all buses and + /// is global in scope. An example of the EndBusNumber not being 0xFF is a system + /// with two or more peer-to-host PCI bridges. + /// + UINT16 EndBusNumber; + /// + /// The type of memory region from the operating system's point of view. + /// MemoryRegionType values are equivalent to the legacy INT 15 AX = E820 BIOS + /// command values. + /// + EFI_MEMORY_REGION_TYPE MemoryRegionType; + /// + /// The size of the memory region in bytes. + /// + EFI_EXP_BASE2_DATA MemorySize; + /// + /// The starting physical address of the memory region. + /// + EFI_PHYSICAL_ADDRESS MemoryStartAddress; +} EFI_MEMORY_SIZE_DATA; + + +#define EFI_MEMORY_ARRAY_LOCATION_RECORD_NUMBER 0x00000002 + +typedef enum _EFI_MEMORY_ARRAY_LOCATION { + EfiMemoryArrayLocationOther = 0x01, + EfiMemoryArrayLocationUnknown = 0x02, + EfiMemoryArrayLocationSystemBoard = 0x03, + EfiMemoryArrayLocationIsaAddonCard = 0x04, + EfiMemoryArrayLocationEisaAddonCard = 0x05, + EfiMemoryArrayLocationPciAddonCard = 0x06, + EfiMemoryArrayLocationMcaAddonCard = 0x07, + EfiMemoryArrayLocationPcmciaAddonCard = 0x08, + EfiMemoryArrayLocationProprietaryAddonCard = 0x09, + EfiMemoryArrayLocationNuBus = 0x0A, + EfiMemoryArrayLocationPc98C20AddonCard = 0xA0, + EfiMemoryArrayLocationPc98C24AddonCard = 0xA1, + EfiMemoryArrayLocationPc98EAddonCard = 0xA2, + EfiMemoryArrayLocationPc98LocalBusAddonCard = 0xA3 +} EFI_MEMORY_ARRAY_LOCATION; + +typedef enum _EFI_MEMORY_ARRAY_USE { + EfiMemoryArrayUseOther = 0x01, + EfiMemoryArrayUseUnknown = 0x02, + EfiMemoryArrayUseSystemMemory = 0x03, + EfiMemoryArrayUseVideoMemory = 0x04, + EfiMemoryArrayUseFlashMemory = 0x05, + EfiMemoryArrayUseNonVolatileRam = 0x06, + EfiMemoryArrayUseCacheMemory = 0x07 +} EFI_MEMORY_ARRAY_USE; + +typedef enum _EFI_MEMORY_ERROR_CORRECTION { + EfiMemoryErrorCorrectionOther = 0x01, + EfiMemoryErrorCorrectionUnknown = 0x02, + EfiMemoryErrorCorrectionNone = 0x03, + EfiMemoryErrorCorrectionParity = 0x04, + EfiMemoryErrorCorrectionSingleBitEcc = 0x05, + EfiMemoryErrorCorrectionMultiBitEcc = 0x06, + EfiMemoryErrorCorrectionCrc = 0x07 +} EFI_MEMORY_ERROR_CORRECTION; + +/// +/// This data record refers to the physical memory array. This data record is a structure. +/// The type definition structure for EFI_MEMORY_ARRAY_LOCATION_DATA is in SMBIOS 2.3.4: +/// - Table 3.3.17.1, Type 16, Offset 0x4 +/// - Table 3.3.17.2, Type 16, Offset 0x5 +/// - Table 3.3.17.3, Type 16, with the following offsets: +/// -- Offset 0x6 +/// -- Offset 0x7 +/// -- Offset 0xB +/// -- Offset 0xD +/// +typedef struct { + /// + /// The physical location of the memory array. + /// + EFI_MEMORY_ARRAY_LOCATION MemoryArrayLocation; + /// + /// The memory array usage. + /// + EFI_MEMORY_ARRAY_USE MemoryArrayUse; + /// + /// The primary error correction or detection supported by this memory array. + /// + EFI_MEMORY_ERROR_CORRECTION MemoryErrorCorrection; + /// + /// The maximum memory capacity size in kilobytes. If capacity is unknown, then + /// values of MaximumMemoryCapacity.Value = 0x00 and + /// MaximumMemoryCapacity.Exponent = 0x8000 are used. + /// + EFI_EXP_BASE2_DATA MaximumMemoryCapacity; + /// + /// The number of memory slots or sockets that are available for memory devices + /// in this array. + /// + UINT16 NumberMemoryDevices; +} EFI_MEMORY_ARRAY_LOCATION_DATA; + + +#define EFI_MEMORY_ARRAY_LINK_RECORD_NUMBER 0x00000003 + +typedef enum _EFI_MEMORY_FORM_FACTOR { + EfiMemoryFormFactorOther = 0x01, + EfiMemoryFormFactorUnknown = 0x02, + EfiMemoryFormFactorSimm = 0x03, + EfiMemoryFormFactorSip = 0x04, + EfiMemoryFormFactorChip = 0x05, + EfiMemoryFormFactorDip = 0x06, + EfiMemoryFormFactorZip = 0x07, + EfiMemoryFormFactorProprietaryCard = 0x08, + EfiMemoryFormFactorDimm = 0x09, + EfiMemoryFormFactorTsop = 0x0A, + EfiMemoryFormFactorRowOfChips = 0x0B, + EfiMemoryFormFactorRimm = 0x0C, + EfiMemoryFormFactorSodimm = 0x0D, + EfiMemoryFormFactorSrimm = 0x0E, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiMemoryFormFactorFbDimm = 0x0F +} EFI_MEMORY_FORM_FACTOR; + +typedef enum _EFI_MEMORY_ARRAY_TYPE { + EfiMemoryTypeOther = 0x01, + EfiMemoryTypeUnknown = 0x02, + EfiMemoryTypeDram = 0x03, + EfiMemoryTypeEdram = 0x04, + EfiMemoryTypeVram = 0x05, + EfiMemoryTypeSram = 0x06, + EfiMemoryTypeRam = 0x07, + EfiMemoryTypeRom = 0x08, + EfiMemoryTypeFlash = 0x09, + EfiMemoryTypeEeprom = 0x0A, + EfiMemoryTypeFeprom = 0x0B, + EfiMemoryTypeEprom = 0x0C, + EfiMemoryTypeCdram = 0x0D, + EfiMemoryType3Dram = 0x0E, + EfiMemoryTypeSdram = 0x0F, + EfiMemoryTypeSgram = 0x10, + EfiMemoryTypeRdram = 0x11, + EfiMemoryTypeDdr = 0x12, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiMemoryTypeDdr2 = 0x13, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiMemoryTypeDdr2FbDimm = 0x14 +} EFI_MEMORY_ARRAY_TYPE; + +typedef struct { + UINT32 Reserved :1; + UINT32 Other :1; + UINT32 Unknown :1; + UINT32 FastPaged :1; + UINT32 StaticColumn :1; + UINT32 PseudoStatic :1; + UINT32 Rambus :1; + UINT32 Synchronous :1; + UINT32 Cmos :1; + UINT32 Edo :1; + UINT32 WindowDram :1; + UINT32 CacheDram :1; + UINT32 Nonvolatile :1; + UINT32 Reserved1 :19; +} EFI_MEMORY_TYPE_DETAIL; + +typedef enum { + EfiMemoryStateEnabled = 0, + EfiMemoryStateUnknown = 1, + EfiMemoryStateUnsupported = 2, + EfiMemoryStateError = 3, + EfiMemoryStateAbsent = 4, + EfiMemoryStateDisabled = 5, + /// + /// Inconsistent with specification here: + /// This field is NOT defined in MemSubClass specification 0.9. It's introduced for SMBIOS2.6 specification. + /// + EfiMemoryStatePartial = 6 +} EFI_MEMORY_STATE; + +/// +/// This data record describes a memory device. This data record is a structure. +/// The type definition structure for EFI_MEMORY_ARRAY_LINK_DATA is in SMBIOS 2.3.4. +/// +typedef struct { + /// + /// A string that identifies the physically labeled socket or board position where the + /// memory device is located. + /// + STRING_REF MemoryDeviceLocator; + /// + /// A string denoting the physically labeled bank where the memory device is located. + /// + STRING_REF MemoryBankLocator; + /// + /// A string denoting the memory manufacturer. + /// + STRING_REF MemoryManufacturer; + /// + /// A string denoting the serial number of the memory device. + /// + STRING_REF MemorySerialNumber; + /// + /// The asset tag of the memory device. + /// + STRING_REF MemoryAssetTag; + /// + /// A string denoting the part number of the memory device. + /// + STRING_REF MemoryPartNumber; + /// + /// A link to a memory array structure set. + /// + EFI_INTER_LINK_DATA MemoryArrayLink; + /// + /// A link to a memory array structure set. + /// + EFI_INTER_LINK_DATA MemorySubArrayLink; + /// + /// The total width in bits of this memory device. If there are no error correcting bits, + /// then the total width equals the data width. If the width is unknown, then set the field + /// to 0xFFFF. + /// + UINT16 MemoryTotalWidth; + /// + /// The data width in bits of the memory device. A data width of 0x00 and a total width + /// of 0x08 indicate that the device is used solely for error correction. + /// + UINT16 MemoryDataWidth; + /// + /// The size in bytes of the memory device. A value of 0x00 denotes that no device is + /// installed, while a value of all Fs denotes that the size is not known. + /// + EFI_EXP_BASE2_DATA MemoryDeviceSize; + /// + /// The form factor of the memory device. + /// + EFI_MEMORY_FORM_FACTOR MemoryFormFactor; + /// + /// A memory device set that must be populated with all devices of the same type and + /// size. A value of 0x00 indicates that the device is not part of any set. A value of 0xFF + /// indicates that the attribute is unknown. Any other value denotes the set number. + /// + UINT8 MemoryDeviceSet; + /// + /// The memory type in the socket. + /// + EFI_MEMORY_ARRAY_TYPE MemoryType; + /// + /// The memory type details. + /// + EFI_MEMORY_TYPE_DETAIL MemoryTypeDetail; + /// + /// The memory speed in megahertz (MHz). A value of 0x00 denotes that + /// the speed is unknown. + /// Inconsistent with specification here: + /// In MemSubclass specification 0.9, the naming is MemoryTypeSpeed. + /// Keep it unchanged for backward compatibilty. + /// + EFI_EXP_BASE10_DATA MemorySpeed; + /// + /// The memory state. + /// + EFI_MEMORY_STATE MemoryState; +} EFI_MEMORY_ARRAY_LINK_DATA; + + +#define EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER 0x00000004 + +/// +/// This data record refers to a specified physical memory array associated with +/// a given memory range. +/// +typedef struct { + /// + /// The starting physical address in bytes of memory mapped to a specified physical + /// memory array. + /// + EFI_PHYSICAL_ADDRESS MemoryArrayStartAddress; + /// + /// The last physical address in bytes of memory mapped to a specified physical memory + /// array. + /// + EFI_PHYSICAL_ADDRESS MemoryArrayEndAddress; + /// + /// See Physical Memory Array (Type 16) for physical memory array structures. + /// + EFI_INTER_LINK_DATA PhysicalMemoryArrayLink; + /// + /// The number of memory devices that form a single row of memory for the address + /// partition. + /// + UINT16 MemoryArrayPartitionWidth; +} EFI_MEMORY_ARRAY_START_ADDRESS_DATA; + + +#define EFI_MEMORY_DEVICE_START_ADDRESS_RECORD_NUMBER 0x00000005 + +/// +/// This data record refers to a physical memory device that is associated with +/// a given memory range. +/// +typedef struct { + /// + /// The starting physical address that is associated with the device. + /// + EFI_PHYSICAL_ADDRESS MemoryDeviceStartAddress; + /// + /// The ending physical address that is associated with the device. + /// + EFI_PHYSICAL_ADDRESS MemoryDeviceEndAddress; + /// + /// A link to the memory device data structure. + /// + EFI_INTER_LINK_DATA PhysicalMemoryDeviceLink; + /// + /// A link to the memory array data structure. + /// + EFI_INTER_LINK_DATA PhysicalMemoryArrayLink; + /// + /// The position of the memory device in a row. A value of 0x00 is reserved and a value + /// of 0xFF indicates that the position is unknown. + /// + UINT8 MemoryDevicePartitionRowPosition; + /// + /// The position of the device in an interleave. + /// + UINT8 MemoryDeviceInterleavePosition; + /// + /// The maximum number of consecutive rows from the device that are accessed in a + /// single interleave transfer. A value of 0x00 indicates that the device is not interleaved + /// and a value of 0xFF indicates that the interleave configuration is unknown. + /// + UINT8 MemoryDeviceInterleaveDataDepth; +} EFI_MEMORY_DEVICE_START_ADDRESS_DATA; + + +// +// Memory. Channel Device Type - SMBIOS Type 37 +// + +#define EFI_MEMORY_CHANNEL_TYPE_RECORD_NUMBER 0x00000006 + +typedef enum _EFI_MEMORY_CHANNEL_TYPE { + EfiMemoryChannelTypeOther = 1, + EfiMemoryChannelTypeUnknown = 2, + EfiMemoryChannelTypeRambus = 3, + EfiMemoryChannelTypeSyncLink = 4 +} EFI_MEMORY_CHANNEL_TYPE; + +/// +/// This data record refers the type of memory that is associated with the channel. This data record is a +/// structure. +/// The type definition structure for EFI_MEMORY_CHANNEL_TYPE_DATA is in SMBIOS 2.3.4, +/// Table 3.3.38, Type 37, with the following offsets: +/// - Offset 0x4 +/// - Offset 0x5 +/// - Offset 0x6 +/// +typedef struct { + /// + /// The type of memory that is associated with the channel. + /// + EFI_MEMORY_CHANNEL_TYPE MemoryChannelType; + /// + /// The maximum load that is supported by the channel. + /// + UINT8 MemoryChannelMaximumLoad; + /// + /// The number of memory devices on this channel. + /// + UINT8 MemoryChannelDeviceCount; +} EFI_MEMORY_CHANNEL_TYPE_DATA; + +#define EFI_MEMORY_CHANNEL_DEVICE_RECORD_NUMBER 0x00000007 + +/// +/// This data record refers to the memory device that is associated with the memory channel. This data +/// record is a structure. +/// The type definition structure for EFI_MEMORY_CHANNEL_DEVICE_DATA is in SMBIOS 2.3.4, +/// Table 3.3.38, Type 37, with the following offsets: +/// - Offset 0x7 +/// - Offset 0x8 +/// +typedef struct { + /// + /// A number between one and MemoryChannelDeviceCount plus an arbitrary base. + /// + UINT8 DeviceId; + /// + /// The Link of the associated memory device. See Memory Device (Type 17) for + /// memory devices. + /// + EFI_INTER_LINK_DATA DeviceLink; + /// + /// The number of load units that this device consumes. + /// + UINT8 MemoryChannelDeviceLoad; +} EFI_MEMORY_CHANNEL_DEVICE_DATA; + +// +// Memory. Controller Information - SMBIOS Type 5 +// +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +#define EFI_MEMORY_CONTROLLER_INFORMATION_RECORD_NUMBER 0x00000008 + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +typedef enum { + EfiErrorDetectingMethodOther = 1, + EfiErrorDetectingMethodUnknown = 2, + EfiErrorDetectingMethodNone = 3, + EfiErrorDetectingMethodParity = 4, + EfiErrorDetectingMethod32Ecc = 5, + EfiErrorDetectingMethod64Ecc = 6, + EfiErrorDetectingMethod128Ecc = 7, + EfiErrorDetectingMethodCrc = 8 +} EFI_MEMORY_ERROR_DETECT_METHOD_TYPE; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +typedef struct { + UINT8 Other :1; + UINT8 Unknown :1; + UINT8 None :1; + UINT8 SingleBitErrorCorrect :1; + UINT8 DoubleBitErrorCorrect :1; + UINT8 ErrorScrubbing :1; + UINT8 Reserved :2; +} EFI_MEMORY_ERROR_CORRECT_CAPABILITY; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +typedef enum { + EfiMemoryInterleaveOther = 1, + EfiMemoryInterleaveUnknown = 2, + EfiMemoryInterleaveOneWay = 3, + EfiMemoryInterleaveTwoWay = 4, + EfiMemoryInterleaveFourWay = 5, + EfiMemoryInterleaveEightWay = 6, + EfiMemoryInterleaveSixteenWay = 7 +} EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +typedef struct { + UINT16 Other :1; + UINT16 Unknown :1; + UINT16 SeventyNs:1; + UINT16 SixtyNs :1; + UINT16 FiftyNs :1; + UINT16 Reserved :11; +} EFI_MEMORY_SPEED_TYPE; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +typedef struct { + UINT16 Other :1; + UINT16 Unknown :1; + UINT16 Standard :1; + UINT16 FastPageMode:1; + UINT16 EDO :1; + UINT16 Parity :1; + UINT16 ECC :1; + UINT16 SIMM :1; + UINT16 DIMM :1; + UINT16 BurstEdo :1; + UINT16 SDRAM :1; + UINT16 Reserved :5; +} EFI_MEMORY_SUPPORTED_TYPE; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +typedef struct { + UINT8 Five :1; + UINT8 Three :1; + UINT8 Two :1; + UINT8 Reserved:5; +} EFI_MEMORY_MODULE_VOLTAGE_TYPE; + +/// +/// EFI_MEMORY_CONTROLLER_INFORMATION is obsolete +/// Use EFI_MEMORY_CONTROLLER_INFORMATION_DATA instead +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +typedef struct { + EFI_MEMORY_ERROR_DETECT_METHOD_TYPE ErrorDetectingMethod; + EFI_MEMORY_ERROR_CORRECT_CAPABILITY ErrorCorrectingCapability; + EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE MemorySupportedInterleave; + EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE MemoryCurrentInterleave; + UINT8 MaxMemoryModuleSize; + EFI_MEMORY_SPEED_TYPE MemorySpeedType; + EFI_MEMORY_SUPPORTED_TYPE MemorySupportedType; + EFI_MEMORY_MODULE_VOLTAGE_TYPE MemoryModuleVoltage; + UINT8 NumberofMemorySlot; + EFI_MEMORY_ERROR_CORRECT_CAPABILITY EnabledCorrectingCapability; + UINT16 *MemoryModuleConfigHandles; +} EFI_MEMORY_CONTROLLER_INFORMATION; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 5. +/// +typedef struct { + EFI_MEMORY_ERROR_DETECT_METHOD_TYPE ErrorDetectingMethod; + EFI_MEMORY_ERROR_CORRECT_CAPABILITY ErrorCorrectingCapability; + EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE MemorySupportedInterleave; + EFI_MEMORY_SUPPORT_INTERLEAVE_TYPE MemoryCurrentInterleave; + UINT8 MaxMemoryModuleSize; + EFI_MEMORY_SPEED_TYPE MemorySpeedType; + EFI_MEMORY_SUPPORTED_TYPE MemorySupportedType; + EFI_MEMORY_MODULE_VOLTAGE_TYPE MemoryModuleVoltage; + UINT8 NumberofMemorySlot; + EFI_MEMORY_ERROR_CORRECT_CAPABILITY EnabledCorrectingCapability; + EFI_INTER_LINK_DATA MemoryModuleConfig[1]; +} EFI_MEMORY_CONTROLLER_INFORMATION_DATA; + +/// +/// Memory. Error Information - SMBIOS Type 18 +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 18. +/// +#define EFI_MEMORY_32BIT_ERROR_INFORMATION_RECORD_NUMBER 0x00000009 +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 18. +/// +typedef enum { + EfiMemoryErrorOther = 1, + EfiMemoryErrorUnknown = 2, + EfiMemoryErrorOk = 3, + EfiMemoryErrorBadRead = 4, + EfiMemoryErrorParity = 5, + EfiMemoryErrorSigleBit = 6, + EfiMemoryErrorDoubleBit = 7, + EfiMemoryErrorMultiBit = 8, + EfiMemoryErrorNibble = 9, + EfiMemoryErrorChecksum = 10, + EfiMemoryErrorCrc = 11, + EfiMemoryErrorCorrectSingleBit = 12, + EfiMemoryErrorCorrected = 13, + EfiMemoryErrorUnCorrectable = 14 +} EFI_MEMORY_ERROR_TYPE; +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 18. +/// +typedef enum { + EfiMemoryGranularityOther = 1, + EfiMemoryGranularityOtherUnknown = 2, + EfiMemoryGranularityDeviceLevel = 3, + EfiMemoryGranularityMemPartitionLevel = 4 +} EFI_MEMORY_ERROR_GRANULARITY_TYPE; +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 18. +/// +typedef enum { + EfiMemoryErrorOperationOther = 1, + EfiMemoryErrorOperationUnknown = 2, + EfiMemoryErrorOperationRead = 3, + EfiMemoryErrorOperationWrite = 4, + EfiMemoryErrorOperationPartialWrite = 5 +} EFI_MEMORY_ERROR_OPERATION_TYPE; +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 18. +/// +typedef struct { + EFI_MEMORY_ERROR_TYPE MemoryErrorType; + EFI_MEMORY_ERROR_GRANULARITY_TYPE MemoryErrorGranularity; + EFI_MEMORY_ERROR_OPERATION_TYPE MemoryErrorOperation; + UINT32 VendorSyndrome; + UINT32 MemoryArrayErrorAddress; + UINT32 DeviceErrorAddress; + UINT32 DeviceErrorResolution; +} EFI_MEMORY_32BIT_ERROR_INFORMATION; + +/// +/// Memory. Error Information - SMBIOS Type 33. +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 33. +/// +#define EFI_MEMORY_64BIT_ERROR_INFORMATION_RECORD_NUMBER 0x0000000A + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 type 33. +/// +typedef struct { + EFI_MEMORY_ERROR_TYPE MemoryErrorType; + EFI_MEMORY_ERROR_GRANULARITY_TYPE MemoryErrorGranularity; + EFI_MEMORY_ERROR_OPERATION_TYPE MemoryErrorOperation; + UINT32 VendorSyndrome; + UINT64 MemoryArrayErrorAddress; + UINT64 DeviceErrorAddress; + UINT32 DeviceErrorResolution; +} EFI_MEMORY_64BIT_ERROR_INFORMATION; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It is implementation-specific to simplify the code logic. +/// +typedef union _EFI_MEMORY_SUBCLASS_RECORDS { + EFI_MEMORY_SIZE_DATA SizeData; + EFI_MEMORY_ARRAY_LOCATION_DATA ArrayLocationData; + EFI_MEMORY_ARRAY_LINK_DATA ArrayLink; + EFI_MEMORY_ARRAY_START_ADDRESS_DATA ArrayStartAddress; + EFI_MEMORY_DEVICE_START_ADDRESS_DATA DeviceStartAddress; + EFI_MEMORY_CHANNEL_TYPE_DATA ChannelTypeData; + EFI_MEMORY_CHANNEL_DEVICE_DATA ChannelDeviceData; + EFI_MEMORY_CONTROLLER_INFORMATION MemoryControllerInfo; + EFI_MEMORY_32BIT_ERROR_INFORMATION Memory32bitErrorInfo; + EFI_MEMORY_64BIT_ERROR_INFORMATION Memory64bitErrorInfo; +} EFI_MEMORY_SUBCLASS_RECORDS; + +typedef struct { + EFI_SUBCLASS_TYPE1_HEADER Header; + EFI_MEMORY_SUBCLASS_RECORDS Record; +} EFI_MEMORY_SUBCLASS_DRIVER_DATA; + +#define EFI_MISC_SUBCLASS_VERSION 0x0100 + +#pragma pack(1) + +// +// Last PCI Bus Number +// +#define EFI_MISC_LAST_PCI_BUS_RECORD_NUMBER 0x00000001 + +typedef struct { + UINT8 LastPciBus; +} EFI_MISC_LAST_PCI_BUS_DATA; + +// +// Misc. BIOS Vendor - SMBIOS Type 0 +// +#define EFI_MISC_BIOS_VENDOR_RECORD_NUMBER 0x00000002 + +typedef struct { + UINT64 Reserved1 :2; + UINT64 Unknown :1; + UINT64 BiosCharacteristicsNotSupported :1; + UINT64 IsaIsSupported :1; + UINT64 McaIsSupported :1; + UINT64 EisaIsSupported :1; + UINT64 PciIsSupported :1; + UINT64 PcmciaIsSupported :1; + UINT64 PlugAndPlayIsSupported :1; + UINT64 ApmIsSupported :1; + UINT64 BiosIsUpgradable :1; + UINT64 BiosShadowingAllowed :1; + UINT64 VlVesaIsSupported :1; + UINT64 EscdSupportIsAvailable :1; + UINT64 BootFromCdIsSupported :1; + UINT64 SelectableBootIsSupported :1; + UINT64 RomBiosIsSocketed :1; + UINT64 BootFromPcmciaIsSupported :1; + UINT64 EDDSpecificationIsSupported :1; + UINT64 JapaneseNecFloppyIsSupported :1; + UINT64 JapaneseToshibaFloppyIsSupported :1; + UINT64 Floppy525_360IsSupported :1; + UINT64 Floppy525_12IsSupported :1; + UINT64 Floppy35_720IsSupported :1; + UINT64 Floppy35_288IsSupported :1; + UINT64 PrintScreenIsSupported :1; + UINT64 Keyboard8042IsSupported :1; + UINT64 SerialIsSupported :1; + UINT64 PrinterIsSupported :1; + UINT64 CgaMonoIsSupported :1; + UINT64 NecPc98 :1; + UINT64 AcpiIsSupported :1; + UINT64 UsbLegacyIsSupported :1; + UINT64 AgpIsSupported :1; + UINT64 I20BootIsSupported :1; + UINT64 Ls120BootIsSupported :1; + UINT64 AtapiZipDriveBootIsSupported :1; + UINT64 Boot1394IsSupported :1; + UINT64 SmartBatteryIsSupported :1; + UINT64 BiosBootSpecIsSupported :1; + UINT64 FunctionKeyNetworkBootIsSupported :1; + UINT64 Reserved :22; +} EFI_MISC_BIOS_CHARACTERISTICS; + +typedef struct { + UINT64 BiosReserved :16; + UINT64 SystemReserved:16; + UINT64 Reserved :32; +} EFI_MISC_BIOS_CHARACTERISTICS_EXTENSION; + +typedef struct { + STRING_REF BiosVendor; + STRING_REF BiosVersion; + STRING_REF BiosReleaseDate; + EFI_PHYSICAL_ADDRESS BiosStartingAddress; + EFI_EXP_BASE2_DATA BiosPhysicalDeviceSize; + EFI_MISC_BIOS_CHARACTERISTICS BiosCharacteristics1; + EFI_MISC_BIOS_CHARACTERISTICS_EXTENSION + BiosCharacteristics2; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined. + /// It's introduced for SmBios 2.6 specification type 0. + /// + UINT8 BiosMajorRelease; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined. + /// It's introduced for SmBios 2.6 specification type 0. + /// + UINT8 BiosMinorRelease; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined. + /// It's introduced for SmBios 2.6 specification type 0. + /// + UINT8 BiosEmbeddedFirmwareMajorRelease; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined. + /// It's introduced for SmBios 2.6 specification type 0. + /// + UINT8 BiosEmbeddedFirmwareMinorRelease; +} EFI_MISC_BIOS_VENDOR_DATA; + +// +// Misc. System Manufacturer - SMBIOS Type 1 +// +#define EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER 0x00000003 + +typedef enum { + EfiSystemWakeupTypeReserved = 0, + EfiSystemWakeupTypeOther = 1, + EfiSystemWakeupTypeUnknown = 2, + EfiSystemWakeupTypeApmTimer = 3, + EfiSystemWakeupTypeModemRing = 4, + EfiSystemWakeupTypeLanRemote = 5, + EfiSystemWakeupTypePowerSwitch = 6, + EfiSystemWakeupTypePciPme = 7, + EfiSystemWakeupTypeAcPowerRestored = 8 +} EFI_MISC_SYSTEM_WAKEUP_TYPE; + +typedef struct { + STRING_REF SystemManufacturer; + STRING_REF SystemProductName; + STRING_REF SystemVersion; + STRING_REF SystemSerialNumber; + EFI_GUID SystemUuid; + EFI_MISC_SYSTEM_WAKEUP_TYPE SystemWakeupType; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined. + /// It's introduced for SmBios 2.6 specification type 1. + /// + STRING_REF SystemSKUNumber; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this data structure and corrsponding fields are NOT defined. + /// It's introduced for SmBios 2.6 specification type 1. + /// + STRING_REF SystemFamily; +} EFI_MISC_SYSTEM_MANUFACTURER_DATA; + +// +// Misc. Base Board Manufacturer - SMBIOS Type 2 +// +#define EFI_MISC_BASE_BOARD_MANUFACTURER_RECORD_NUMBER 0x00000004 + +typedef struct { + UINT32 Motherboard :1; + UINT32 RequiresDaughterCard :1; + UINT32 Removable :1; + UINT32 Replaceable :1; + UINT32 HotSwappable :1; + UINT32 Reserved :27; +} EFI_BASE_BOARD_FEATURE_FLAGS; + +typedef enum { + EfiBaseBoardTypeUnknown = 1, + EfiBaseBoardTypeOther = 2, + EfiBaseBoardTypeServerBlade = 3, + EfiBaseBoardTypeConnectivitySwitch = 4, + EfiBaseBoardTypeSystemManagementModule = 5, + EfiBaseBoardTypeProcessorModule = 6, + EfiBaseBoardTypeIOModule = 7, + EfiBaseBoardTypeMemoryModule = 8, + EfiBaseBoardTypeDaughterBoard = 9, + EfiBaseBoardTypeMotherBoard = 0xA, + EfiBaseBoardTypeProcessorMemoryModule = 0xB, + EfiBaseBoardTypeProcessorIOModule = 0xC, + EfiBaseBoardTypeInterconnectBoard = 0xD +} EFI_BASE_BOARD_TYPE; + +typedef struct { + STRING_REF BaseBoardManufacturer; + STRING_REF BaseBoardProductName; + STRING_REF BaseBoardVersion; + STRING_REF BaseBoardSerialNumber; + STRING_REF BaseBoardAssetTag; + STRING_REF BaseBoardChassisLocation; + EFI_BASE_BOARD_FEATURE_FLAGS BaseBoardFeatureFlags; + EFI_BASE_BOARD_TYPE BaseBoardType; + EFI_INTER_LINK_DATA BaseBoardChassisLink; + UINT32 BaseBoardNumberLinks; + EFI_INTER_LINK_DATA LinkN; +} EFI_MISC_BASE_BOARD_MANUFACTURER_DATA; + +// +// Misc. System/Chassis Enclosure - SMBIOS Type 3 +// +#define EFI_MISC_CHASSIS_MANUFACTURER_RECORD_NUMBER 0x00000005 + +typedef enum { + EfiMiscChassisTypeOther = 0x1, + EfiMiscChassisTypeUnknown = 0x2, + EfiMiscChassisTypeDeskTop = 0x3, + EfiMiscChassisTypeLowProfileDesktop = 0x4, + EfiMiscChassisTypePizzaBox = 0x5, + EfiMiscChassisTypeMiniTower = 0x6, + EfiMiscChassisTypeTower = 0x7, + EfiMiscChassisTypePortable = 0x8, + EfiMiscChassisTypeLapTop = 0x9, + EfiMiscChassisTypeNotebook = 0xA, + EfiMiscChassisTypeHandHeld = 0xB, + EfiMiscChassisTypeDockingStation = 0xC, + EfiMiscChassisTypeAllInOne = 0xD, + EfiMiscChassisTypeSubNotebook = 0xE, + EfiMiscChassisTypeSpaceSaving = 0xF, + EfiMiscChassisTypeLunchBox = 0x10, + EfiMiscChassisTypeMainServerChassis = 0x11, + EfiMiscChassisTypeExpansionChassis = 0x12, + EfiMiscChassisTypeSubChassis = 0x13, + EfiMiscChassisTypeBusExpansionChassis = 0x14, + EfiMiscChassisTypePeripheralChassis = 0x15, + EfiMiscChassisTypeRaidChassis = 0x16, + EfiMiscChassisTypeRackMountChassis = 0x17, + EfiMiscChassisTypeSealedCasePc = 0x18, + EfiMiscChassisMultiSystemChassis = 0x19 +} EFI_MISC_CHASSIS_TYPE; + +typedef struct { + /// + /// Inconsistent with specification here: + /// In MiscSubclass 0.9 specification, it has the incorrect field name "EFI_MISC_CHASSIS_TYPE". + /// Change it to "ChassisType" to pass build. + /// + UINT32 ChassisType :16; + UINT32 ChassisLockPresent:1; + UINT32 Reserved :15; +} EFI_MISC_CHASSIS_STATUS; + +typedef enum { + EfiChassisStateOther = 0x01, + EfiChassisStateUnknown = 0x02, + EfiChassisStateSafe = 0x03, + EfiChassisStateWarning = 0x04, + EfiChassisStateCritical = 0x05, + EfiChassisStateNonRecoverable = 0x06 +} EFI_MISC_CHASSIS_STATE; + +typedef enum { + EfiChassisSecurityStatusOther = 0x01, + EfiChassisSecurityStatusUnknown = 0x02, + EfiChassisSecurityStatusNone = 0x03, + EfiChassisSecurityStatusExternalInterfaceLockedOut = 0x04, + EfiChassisSecurityStatusExternalInterfaceLockedEnabled = 0x05 +} EFI_MISC_CHASSIS_SECURITY_STATE; + +typedef struct { + UINT32 RecordType :1; + UINT32 Type :7; + UINT32 Reserved :24; +} EFI_MISC_ELEMENT_TYPE; + +typedef struct { + EFI_MISC_ELEMENT_TYPE ChassisElementType; + EFI_INTER_LINK_DATA ChassisElementStructure; + EFI_BASE_BOARD_TYPE ChassisBaseBoard; + UINT32 ChassisElementMinimum; + UINT32 ChassisElementMaximum; +} EFI_MISC_ELEMENTS; + +typedef struct { + STRING_REF ChassisManufacturer; + STRING_REF ChassisVersion; + STRING_REF ChassisSerialNumber; + STRING_REF ChassisAssetTag; + EFI_MISC_CHASSIS_STATUS ChassisType; + EFI_MISC_CHASSIS_STATE ChassisBootupState; + EFI_MISC_CHASSIS_STATE ChassisPowerSupplyState; + EFI_MISC_CHASSIS_STATE ChassisThermalState; + EFI_MISC_CHASSIS_SECURITY_STATE ChassisSecurityState; + UINT32 ChassisOemDefined; + UINT32 ChassisHeight; + UINT32 ChassisNumberPowerCords; + UINT32 ChassisElementCount; + UINT32 ChassisElementRecordLength; + EFI_MISC_ELEMENTS ChassisElements; +} EFI_MISC_CHASSIS_MANUFACTURER_DATA; + +// +// Misc. Port Connector Information - SMBIOS Type 8 +// +#define EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_RECORD_NUMBER 0x00000006 + +typedef enum { + EfiPortConnectorTypeNone = 0x00, + EfiPortConnectorTypeCentronics = 0x01, + EfiPortConnectorTypeMiniCentronics = 0x02, + EfiPortConnectorTypeProprietary = 0x03, + EfiPortConnectorTypeDB25Male = 0x04, + EfiPortConnectorTypeDB25Female = 0x05, + EfiPortConnectorTypeDB15Male = 0x06, + EfiPortConnectorTypeDB15Female = 0x07, + EfiPortConnectorTypeDB9Male = 0x08, + EfiPortConnectorTypeDB9Female = 0x09, + EfiPortConnectorTypeRJ11 = 0x0A, + EfiPortConnectorTypeRJ45 = 0x0B, + EfiPortConnectorType50PinMiniScsi = 0x0C, + EfiPortConnectorTypeMiniDin = 0x0D, + EfiPortConnectorTypeMicriDin = 0x0E, + EfiPortConnectorTypePS2 = 0x0F, + EfiPortConnectorTypeInfrared = 0x10, + EfiPortConnectorTypeHpHil = 0x11, + EfiPortConnectorTypeUsb = 0x12, + EfiPortConnectorTypeSsaScsi = 0x13, + EfiPortConnectorTypeCircularDin8Male = 0x14, + EfiPortConnectorTypeCircularDin8Female = 0x15, + EfiPortConnectorTypeOnboardIde = 0x16, + EfiPortConnectorTypeOnboardFloppy = 0x17, + EfiPortConnectorType9PinDualInline = 0x18, + EfiPortConnectorType25PinDualInline = 0x19, + EfiPortConnectorType50PinDualInline = 0x1A, + EfiPortConnectorType68PinDualInline = 0x1B, + EfiPortConnectorTypeOnboardSoundInput = 0x1C, + EfiPortConnectorTypeMiniCentronicsType14 = 0x1D, + EfiPortConnectorTypeMiniCentronicsType26 = 0x1E, + EfiPortConnectorTypeHeadPhoneMiniJack = 0x1F, + EfiPortConnectorTypeBNC = 0x20, + EfiPortConnectorType1394 = 0x21, + EfiPortConnectorTypePC98 = 0xA0, + EfiPortConnectorTypePC98Hireso = 0xA1, + EfiPortConnectorTypePCH98 = 0xA2, + EfiPortConnectorTypePC98Note = 0xA3, + EfiPortConnectorTypePC98Full = 0xA4, + EfiPortConnectorTypeOther = 0xFF +} EFI_MISC_PORT_CONNECTOR_TYPE; + +typedef enum { + EfiPortTypeNone = 0x00, + EfiPortTypeParallelXtAtCompatible = 0x01, + EfiPortTypeParallelPortPs2 = 0x02, + EfiPortTypeParallelPortEcp = 0x03, + EfiPortTypeParallelPortEpp = 0x04, + EfiPortTypeParallelPortEcpEpp = 0x05, + EfiPortTypeSerialXtAtCompatible = 0x06, + EfiPortTypeSerial16450Compatible = 0x07, + EfiPortTypeSerial16550Compatible = 0x08, + EfiPortTypeSerial16550ACompatible = 0x09, + EfiPortTypeScsi = 0x0A, + EfiPortTypeMidi = 0x0B, + EfiPortTypeJoyStick = 0x0C, + EfiPortTypeKeyboard = 0x0D, + EfiPortTypeMouse = 0x0E, + EfiPortTypeSsaScsi = 0x0F, + EfiPortTypeUsb = 0x10, + EfiPortTypeFireWire = 0x11, + EfiPortTypePcmciaTypeI = 0x12, + EfiPortTypePcmciaTypeII = 0x13, + EfiPortTypePcmciaTypeIII = 0x14, + EfiPortTypeCardBus = 0x15, + EfiPortTypeAccessBusPort = 0x16, + EfiPortTypeScsiII = 0x17, + EfiPortTypeScsiWide = 0x18, + EfiPortTypePC98 = 0x19, + EfiPortTypePC98Hireso = 0x1A, + EfiPortTypePCH98 = 0x1B, + EfiPortTypeVideoPort = 0x1C, + EfiPortTypeAudioPort = 0x1D, + EfiPortTypeModemPort = 0x1E, + EfiPortTypeNetworkPort = 0x1F, + EfiPortType8251Compatible = 0xA0, + EfiPortType8251FifoCompatible = 0xA1, + EfiPortTypeOther = 0xFF +} EFI_MISC_PORT_TYPE; + +typedef struct { + STRING_REF PortInternalConnectorDesignator; + STRING_REF PortExternalConnectorDesignator; + EFI_MISC_PORT_CONNECTOR_TYPE PortInternalConnectorType; + EFI_MISC_PORT_CONNECTOR_TYPE PortExternalConnectorType; + EFI_MISC_PORT_TYPE PortType; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this type of field is defined as EFI_DEVICE_PATH_PROTOCOL, + /// which causes the implementation some complexity. Keep it unchanged for backward + /// compatibility. + /// + EFI_MISC_PORT_DEVICE_PATH PortPath; +} EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA; + +// +// Misc. System Slots - SMBIOS Type 9 +// +#define EFI_MISC_SYSTEM_SLOT_DESIGNATION_RECORD_NUMBER 0x00000007 + +typedef enum { + EfiSlotTypeOther = 0x01, + EfiSlotTypeUnknown = 0x02, + EfiSlotTypeIsa = 0x03, + EfiSlotTypeMca = 0x04, + EfiSlotTypeEisa = 0x05, + EfiSlotTypePci = 0x06, + EfiSlotTypePcmcia = 0x07, + EfiSlotTypeVlVesa = 0x08, + EfiSlotTypeProprietary = 0x09, + EfiSlotTypeProcessorCardSlot = 0x0A, + EfiSlotTypeProprietaryMemoryCardSlot = 0x0B, + EfiSlotTypeIORiserCardSlot = 0x0C, + EfiSlotTypeNuBus = 0x0D, + EfiSlotTypePci66MhzCapable = 0x0E, + EfiSlotTypeAgp = 0x0F, + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, its naming should be EfiSlotTypeAgp2X + /// rather than EfiSlotTypeApg2X. + /// + EfiSlotTypeAgp2X = 0x10, + EfiSlotTypeAgp4X = 0x11, + EfiSlotTypePciX = 0x12, + EfiSlotTypeAgp8x = 0x13, + EfiSlotTypePC98C20 = 0xA0, + EfiSlotTypePC98C24 = 0xA1, + EfiSlotTypePC98E = 0xA2, + EfiSlotTypePC98LocalBus = 0xA3, + EfiSlotTypePC98Card = 0xA4, + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, these fields aren't defined. + /// They're introduced for SmBios 2.6 specification type 9. + /// + EfiSlotTypePciExpress = 0xA5, + EfiSlotTypePciExpressX1 = 0xA6, + EfiSlotTypePciExpressX2 = 0xA7, + EfiSlotTypePciExpressX4 = 0xA8, + EfiSlotTypePciExpressX8 = 0xA9, + EfiSlotTypePciExpressX16 = 0xAA +} EFI_MISC_SLOT_TYPE; + +typedef enum { + EfiSlotDataBusWidthOther = 0x01, + EfiSlotDataBusWidthUnknown = 0x02, + EfiSlotDataBusWidth8Bit = 0x03, + EfiSlotDataBusWidth16Bit = 0x04, + EfiSlotDataBusWidth32Bit = 0x05, + EfiSlotDataBusWidth64Bit = 0x06, + EfiSlotDataBusWidth128Bit = 0x07, + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, these fields aren't defined. + /// They're introduced for SmBios 2.6 specification type 9. + /// + EfiSlotDataBusWidth1xOrx1 = 0x8, + EfiSlotDataBusWidth2xOrx2 = 0x9, + EfiSlotDataBusWidth4xOrx4 = 0xA, + EfiSlotDataBusWidth8xOrx8 = 0xB, + EfiSlotDataBusWidth12xOrx12 = 0xC, + EfiSlotDataBusWidth16xOrx16 = 0xD, + EfiSlotDataBusWidth32xOrx32 = 0xE +} EFI_MISC_SLOT_DATA_BUS_WIDTH; + +typedef enum { + EfiSlotUsageOther = 1, + EfiSlotUsageUnknown = 2, + EfiSlotUsageAvailable = 3, + EfiSlotUsageInUse = 4 +} EFI_MISC_SLOT_USAGE; + +typedef enum { + EfiSlotLengthOther = 1, + EfiSlotLengthUnknown = 2, + EfiSlotLengthShort = 3, + EfiSlotLengthLong = 4 +} EFI_MISC_SLOT_LENGTH; + +typedef struct { + UINT32 CharacteristicsUnknown :1; + UINT32 Provides50Volts :1; + UINT32 Provides33Volts :1; + UINT32 SharedSlot :1; + UINT32 PcCard16Supported :1; + UINT32 CardBusSupported :1; + UINT32 ZoomVideoSupported :1; + UINT32 ModemRingResumeSupported:1; + UINT32 PmeSignalSupported :1; + UINT32 HotPlugDevicesSupported :1; + UINT32 SmbusSignalSupported :1; + UINT32 Reserved :21; +} EFI_MISC_SLOT_CHARACTERISTICS; + +typedef struct { + STRING_REF SlotDesignation; + EFI_MISC_SLOT_TYPE SlotType; + EFI_MISC_SLOT_DATA_BUS_WIDTH SlotDataBusWidth; + EFI_MISC_SLOT_USAGE SlotUsage; + EFI_MISC_SLOT_LENGTH SlotLength; + UINT16 SlotId; + EFI_MISC_SLOT_CHARACTERISTICS SlotCharacteristics; + EFI_DEVICE_PATH_PROTOCOL SlotDevicePath; +} EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA; + +// +// Misc. Onboard Device - SMBIOS Type 10 +// +#define EFI_MISC_ONBOARD_DEVICE_RECORD_NUMBER 0x00000008 + +typedef enum { + EfiOnBoardDeviceTypeOther = 1, + EfiOnBoardDeviceTypeUnknown = 2, + EfiOnBoardDeviceTypeVideo = 3, + EfiOnBoardDeviceTypeScsiController = 4, + EfiOnBoardDeviceTypeEthernet = 5, + EfiOnBoardDeviceTypeTokenRing = 6, + EfiOnBoardDeviceTypeSound = 7 +} EFI_MISC_ONBOARD_DEVICE_TYPE; + +typedef struct { + UINT32 DeviceType :16; + UINT32 DeviceEnabled :1; + UINT32 Reserved :15; +} EFI_MISC_ONBOARD_DEVICE_STATUS; + +typedef struct { + STRING_REF OnBoardDeviceDescription; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, the name is OnBoardDeviceType. + /// Keep it unchanged for backward compatibilty. + /// + EFI_MISC_ONBOARD_DEVICE_STATUS OnBoardDeviceStatus; + EFI_DEVICE_PATH_PROTOCOL OnBoardDevicePath; +} EFI_MISC_ONBOARD_DEVICE_DATA; + +// +// Misc. BIOS Language Information - SMBIOS Type 11 +// +#define EFI_MISC_OEM_STRING_RECORD_NUMBER 0x00000009 + +typedef struct { + STRING_REF OemStringRef[1]; +} EFI_MISC_OEM_STRING_DATA; + +// +// Misc. System Options - SMBIOS Type 12 +// +typedef struct { + STRING_REF SystemOptionStringRef[1]; +} EFI_MISC_SYSTEM_OPTION_STRING_DATA; + +#define EFI_MISC_SYSTEM_OPTION_STRING_RECORD_NUMBER 0x0000000A + +// +// Misc. Number of Installable Languages - SMBIOS Type 13 +// +#define EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_RECORD_NUMBER 0x0000000B + +typedef struct { + UINT32 AbbreviatedLanguageFormat :1; + UINT32 Reserved :31; +} EFI_MISC_LANGUAGE_FLAGS; + +typedef struct { + UINT16 NumberOfInstallableLanguages; + EFI_MISC_LANGUAGE_FLAGS LanguageFlags; + UINT16 CurrentLanguageNumber; +} EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA; + +// +// Misc. System Language String +// +#define EFI_MISC_SYSTEM_LANGUAGE_STRING_RECORD_NUMBER 0x0000000C + +typedef struct { + UINT16 LanguageId; + STRING_REF SystemLanguageString; +} EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA; + +// +// Group Associations - SMBIOS Type 14 +// +#define EFI_MISC_GROUP_NAME_RECORD_NUMBER 0x0000000D + +typedef struct { + STRING_REF GroupName; + UINT16 NumberGroupItems; + UINT16 GroupId; +} EFI_MISC_GROUP_NAME_DATA; + +// +// Group Item Set Element +// +#define EFI_MISC_GROUP_ITEM_SET_RECORD_NUMBER 0x0000000E + +typedef struct { + EFI_GUID SubClass; + EFI_INTER_LINK_DATA GroupLink; + UINT16 GroupId; + UINT16 GroupElementId; +} EFI_MISC_GROUP_ITEM_SET_DATA; + +// +// Misc. Pointing Device Type - SMBIOS Type 21 +// +#define EFI_MISC_POINTING_DEVICE_TYPE_RECORD_NUMBER 0x0000000F + +typedef enum { + EfiPointingDeviceTypeOther = 0x01, + EfiPointingDeviceTypeUnknown = 0x02, + EfiPointingDeviceTypeMouse = 0x03, + EfiPointingDeviceTypeTrackBall = 0x04, + EfiPointingDeviceTypeTrackPoint = 0x05, + EfiPointingDeviceTypeGlidePoint = 0x06, + EfiPointingDeviceTouchPad = 0x07, + EfiPointingDeviceTouchScreen = 0x08, + EfiPointingDeviceOpticalSensor = 0x09 +} EFI_MISC_POINTING_DEVICE_TYPE; + +typedef enum { + EfiPointingDeviceInterfaceOther = 0x01, + EfiPointingDeviceInterfaceUnknown = 0x02, + EfiPointingDeviceInterfaceSerial = 0x03, + EfiPointingDeviceInterfacePs2 = 0x04, + EfiPointingDeviceInterfaceInfrared = 0x05, + EfiPointingDeviceInterfaceHpHil = 0x06, + EfiPointingDeviceInterfaceBusMouse = 0x07, + EfiPointingDeviceInterfaceADB = 0x08, + EfiPointingDeviceInterfaceBusMouseDB9 = 0xA0, + EfiPointingDeviceInterfaceBusMouseMicroDin = 0xA1, + EfiPointingDeviceInterfaceUsb = 0xA2 +} EFI_MISC_POINTING_DEVICE_INTERFACE; + +typedef struct { + EFI_MISC_POINTING_DEVICE_TYPE PointingDeviceType; + EFI_MISC_POINTING_DEVICE_INTERFACE PointingDeviceInterface; + UINT16 NumberPointingDeviceButtons; + EFI_DEVICE_PATH_PROTOCOL PointingDevicePath; +} EFI_MISC_POINTING_DEVICE_TYPE_DATA; + +// +// Portable Battery - SMBIOS Type 22 +// +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the name is EFI_MISC_BATTERY_LOCATION_RECORD_NUMBER. +/// Keep it unchanged for backward compatibilty. +/// +#define EFI_MISC_PORTABLE_BATTERY_RECORD_NUMBER 0x00000010 + +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BATTERY_DEVICE_CHEMISTRY. +/// And all field namings are also different with specification. +/// Keep it unchanged for backward compatibilty. +/// +typedef enum { + EfiPortableBatteryDeviceChemistryOther = 1, + EfiPortableBatteryDeviceChemistryUnknown = 2, + EfiPortableBatteryDeviceChemistryLeadAcid = 3, + EfiPortableBatteryDeviceChemistryNickelCadmium = 4, + EfiPortableBatteryDeviceChemistryNickelMetalHydride = 5, + EfiPortableBatteryDeviceChemistryLithiumIon = 6, + EfiPortableBatteryDeviceChemistryZincAir = 7, + EfiPortableBatteryDeviceChemistryLithiumPolymer = 8 +} EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY; + +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BATTERY_LOCATION_DATA. +/// Also, the name and the order of the fields vary with specifications. +/// Keep it unchanged for backward compatibilty. +/// +typedef struct { + STRING_REF Location; + STRING_REF Manufacturer; + STRING_REF ManufactureDate; + STRING_REF SerialNumber; + STRING_REF DeviceName; + EFI_MISC_PORTABLE_BATTERY_DEVICE_CHEMISTRY + DeviceChemistry; + UINT16 DesignCapacity; + UINT16 DesignVoltage; + STRING_REF SBDSVersionNumber; + UINT8 MaximumError; + UINT16 SBDSSerialNumber; + UINT16 SBDSManufactureDate; + STRING_REF SBDSDeviceChemistry; + UINT8 DesignCapacityMultiplier; + UINT32 OEMSpecific; + UINT8 BatteryNumber; // Temporary + BOOLEAN Valid; // Is entry valid - Temporary +} EFI_MISC_PORTABLE_BATTERY; + + +// +// Misc. Reset Capabilities - SMBIOS Type 23 +// +#define EFI_MISC_RESET_CAPABILITIES_RECORD_NUMBER 0x00000011 + +typedef struct { + UINT32 Status :1; + UINT32 BootOption :2; + UINT32 BootOptionOnLimit :2; + UINT32 WatchdogTimerPresent:1; + UINT32 Reserved :26; +} EFI_MISC_RESET_CAPABILITIES_TYPE; + +typedef struct { + EFI_MISC_RESET_CAPABILITIES_TYPE ResetCapabilities; + UINT16 ResetCount; + UINT16 ResetLimit; + UINT16 ResetTimerInterval; + UINT16 ResetTimeout; +} EFI_MISC_RESET_CAPABILITIES; + +typedef struct { + EFI_MISC_RESET_CAPABILITIES ResetCapabilities; + UINT16 ResetCount; + UINT16 ResetLimit; + UINT16 ResetTimerInterval; + UINT16 ResetTimeout; +} EFI_MISC_RESET_CAPABILITIES_DATA; + +// +// Misc. Hardware Security - SMBIOS Type 24 +// +#define EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA_RECORD_NUMBER 0x00000012 + +/// +/// Inconsistent with specification here: +/// The MiscSubclass specification 0.9 only mentions the possible value of each field in +/// EFI_MISC_HARDWARE_SECURITY_SETTINGS. +/// It's implementation-specific in order to to simplify the code logic. +/// +typedef enum { + EfiHardwareSecurityStatusDisabled = 0, + EfiHardwareSecurityStatusEnabled = 1, + EfiHardwareSecurityStatusNotImplemented = 2, + EfiHardwareSecurityStatusUnknown = 3 +} EFI_MISC_HARDWARE_SECURITY_STATUS; + +typedef struct { + UINT32 FrontPanelResetStatus :2; + UINT32 AdministratorPasswordStatus :2; + UINT32 KeyboardPasswordStatus :2; + UINT32 PowerOnPasswordStatus :2; + UINT32 Reserved :24; +} EFI_MISC_HARDWARE_SECURITY_SETTINGS; + +typedef struct { + EFI_MISC_HARDWARE_SECURITY_SETTINGS HardwareSecuritySettings; +} EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA; + +// +// System Power Controls - SMBIOS Type 25 +// +#define EFI_MISC_SCHEDULED_POWER_ON_MONTH_RECORD_NUMBER 0x00000013 + +typedef struct { + UINT16 ScheduledPoweronMonth; + UINT16 ScheduledPoweronDayOfMonth; + UINT16 ScheduledPoweronHour; + UINT16 ScheduledPoweronMinute; + UINT16 ScheduledPoweronSecond; +} EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA; + +// +// Voltage Probe - SMBIOS Type 26 +// +#define EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_RECORD_NUMBER 0x00000014 + +typedef struct { + UINT32 VoltageProbeSite :5; + UINT32 VoltageProbeStatus :3; + UINT32 Reserved :24; +} EFI_MISC_VOLTAGE_PROBE_LOCATION; + +typedef struct { + STRING_REF VoltageProbeDescription; + EFI_MISC_VOLTAGE_PROBE_LOCATION VoltageProbeLocation; + EFI_EXP_BASE10_DATA VoltageProbeMaximumValue; + EFI_EXP_BASE10_DATA VoltageProbeMinimumValue; + EFI_EXP_BASE10_DATA VoltageProbeResolution; + EFI_EXP_BASE10_DATA VoltageProbeTolerance; + EFI_EXP_BASE10_DATA VoltageProbeAccuracy; + EFI_EXP_BASE10_DATA VoltageProbeNominalValue; + EFI_EXP_BASE10_DATA MDLowerNoncriticalThreshold; + EFI_EXP_BASE10_DATA MDUpperNoncriticalThreshold; + EFI_EXP_BASE10_DATA MDLowerCriticalThreshold; + EFI_EXP_BASE10_DATA MDUpperCriticalThreshold; + EFI_EXP_BASE10_DATA MDLowerNonrecoverableThreshold; + EFI_EXP_BASE10_DATA MDUpperNonrecoverableThreshold; + UINT32 VoltageProbeOemDefined; +} EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA; + +// +// Cooling Device - SMBIOS Type 27 +// +#define EFI_MISC_COOLING_DEVICE_TEMP_LINK_RECORD_NUMBER 0x00000015 + +typedef struct { + UINT32 CoolingDevice :5; + UINT32 CoolingDeviceStatus :3; + UINT32 Reserved :24; +} EFI_MISC_COOLING_DEVICE_TYPE; + +typedef struct { + EFI_MISC_COOLING_DEVICE_TYPE CoolingDeviceType; + EFI_INTER_LINK_DATA CoolingDeviceTemperatureLink; + UINT8 CoolingDeviceUnitGroup; + UINT16 CoolingDeviceNominalSpeed; + UINT32 CoolingDeviceOemDefined; +} EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA; + +// +// Temperature Probe - SMBIOS Type 28 +// +#define EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_RECORD_NUMBER 0x00000016 + +typedef struct { + UINT32 TemperatureProbeSite :5; + UINT32 TemperatureProbeStatus :3; + UINT32 Reserved :24; +} EFI_MISC_TEMPERATURE_PROBE_LOCATION; + +typedef struct { + STRING_REF TemperatureProbeDescription; + EFI_MISC_TEMPERATURE_PROBE_LOCATION + TemperatureProbeLocation; + /// + /// Inconsistent with specification here: + /// MiscSubclass 0.9 specification defines the fields type as EFI_EXP_BASE10_DATA. + /// In fact, they should be UINT16 type because they refer to 16bit width data. + /// Keeping this inconsistency for backward compatibility. + /// + UINT16 TemperatureProbeMaximumValue; + UINT16 TemperatureProbeMinimumValue; + UINT16 TemperatureProbeResolution; + UINT16 TemperatureProbeTolerance; + UINT16 TemperatureProbeAccuracy; + UINT16 TemperatureProbeNominalValue; + UINT16 MDLowerNoncriticalThreshold; + UINT16 MDUpperNoncriticalThreshold; + UINT16 MDLowerCriticalThreshold; + UINT16 MDUpperCriticalThreshold; + UINT16 MDLowerNonrecoverableThreshold; + UINT16 MDUpperNonrecoverableThreshold; + UINT32 TemperatureProbeOemDefined; +} EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA; + +// +// Electrical Current Probe - SMBIOS Type 29 +// + +#define EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_RECORD_NUMBER 0x00000017 + +typedef struct { + UINT32 ElectricalCurrentProbeSite :5; + UINT32 ElectricalCurrentProbeStatus :3; + UINT32 Reserved :24; +} EFI_MISC_ELECTRICAL_CURRENT_PROBE_LOCATION; + +typedef struct { + STRING_REF ElectricalCurrentProbeDescription; + EFI_MISC_ELECTRICAL_CURRENT_PROBE_LOCATION + ElectricalCurrentProbeLocation; + EFI_EXP_BASE10_DATA ElectricalCurrentProbeMaximumValue; + EFI_EXP_BASE10_DATA ElectricalCurrentProbeMinimumValue; + EFI_EXP_BASE10_DATA ElectricalCurrentProbeResolution; + EFI_EXP_BASE10_DATA ElectricalCurrentProbeTolerance; + EFI_EXP_BASE10_DATA ElectricalCurrentProbeAccuracy; + EFI_EXP_BASE10_DATA ElectricalCurrentProbeNominalValue; + EFI_EXP_BASE10_DATA MDLowerNoncriticalThreshold; + EFI_EXP_BASE10_DATA MDUpperNoncriticalThreshold; + EFI_EXP_BASE10_DATA MDLowerCriticalThreshold; + EFI_EXP_BASE10_DATA MDUpperCriticalThreshold; + EFI_EXP_BASE10_DATA MDLowerNonrecoverableThreshold; + EFI_EXP_BASE10_DATA MDUpperNonrecoverableThreshold; + UINT32 ElectricalCurrentProbeOemDefined; +} EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA; + +// +// Out-of-Band Remote Access - SMBIOS Type 30 +// + +#define EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_RECORD_NUMBER 0x00000018 + +typedef struct { + UINT32 InboundConnectionEnabled :1; + UINT32 OutboundConnectionEnabled :1; + UINT32 Reserved :30; +} EFI_MISC_REMOTE_ACCESS_CONNECTIONS; + +typedef struct { + STRING_REF RemoteAccessManufacturerNameDescription; + EFI_MISC_REMOTE_ACCESS_CONNECTIONS RemoteAccessConnections; +} EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA; + +// +// Misc. BIS Entry Point - SMBIOS Type 31 +// +#define EFI_MISC_BIS_ENTRY_POINT_RECORD_NUMBER 0x00000019 + +typedef struct { + EFI_PHYSICAL_ADDRESS BisEntryPoint; +} EFI_MISC_BIS_ENTRY_POINT_DATA; + +// +// Misc. Boot Information - SMBIOS Type 32 +// +#define EFI_MISC_BOOT_INFORMATION_STATUS_RECORD_NUMBER 0x0000001A + +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_BOOT_INFORMATION_STATUS_TYPE. +/// Keep it unchanged for backward compatibilty. +/// +typedef enum { + EfiBootInformationStatusNoError = 0x00, + EfiBootInformationStatusNoBootableMedia = 0x01, + EfiBootInformationStatusNormalOSFailedLoading = 0x02, + EfiBootInformationStatusFirmwareDetectedFailure = 0x03, + EfiBootInformationStatusOSDetectedFailure = 0x04, + EfiBootInformationStatusUserRequestedBoot = 0x05, + EfiBootInformationStatusSystemSecurityViolation = 0x06, + EfiBootInformationStatusPreviousRequestedImage = 0x07, + EfiBootInformationStatusWatchdogTimerExpired = 0x08, + EfiBootInformationStatusStartReserved = 0x09, + EfiBootInformationStatusStartOemSpecific = 0x80, + EfiBootInformationStatusStartProductSpecific = 0xC0 +} EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE; + +typedef struct { + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, the field name is EFI_MISC_BOOT_INFORMATION_STATUS_TYPE. + /// Keep it unchanged for backward compatibilty. + /// + EFI_MISC_BOOT_INFORMATION_STATUS_DATA_TYPE BootInformationStatus; + UINT8 BootInformationData[9]; +} EFI_MISC_BOOT_INFORMATION_STATUS_DATA; + +// +// Management Device - SMBIOS Type 34 +// +#define EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_RECORD_NUMBER 0x0000001B + +typedef enum { + EfiManagementDeviceTypeOther = 0x01, + EfiManagementDeviceTypeUnknown = 0x02, + EfiManagementDeviceTypeLm75 = 0x03, + EfiManagementDeviceTypeLm78 = 0x04, + EfiManagementDeviceTypeLm79 = 0x05, + EfiManagementDeviceTypeLm80 = 0x06, + EfiManagementDeviceTypeLm81 = 0x07, + EfiManagementDeviceTypeAdm9240 = 0x08, + EfiManagementDeviceTypeDs1780 = 0x09, + EfiManagementDeviceTypeMaxim1617 = 0x0A, + EfiManagementDeviceTypeGl518Sm = 0x0B, + EfiManagementDeviceTypeW83781D = 0x0C, + EfiManagementDeviceTypeHt82H791 = 0x0D +} EFI_MISC_MANAGEMENT_DEVICE_TYPE; + +typedef enum { + EfiManagementDeviceAddressTypeOther = 1, + EfiManagementDeviceAddressTypeUnknown = 2, + EfiManagementDeviceAddressTypeIOPort = 3, + EfiManagementDeviceAddressTypeMemory = 4, + EfiManagementDeviceAddressTypeSmbus = 5 +} EFI_MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE; + +typedef struct { + STRING_REF ManagementDeviceDescription; + EFI_MISC_MANAGEMENT_DEVICE_TYPE ManagementDeviceType; + UINTN ManagementDeviceAddress; + EFI_MISC_MANAGEMENT_DEVICE_ADDRESS_TYPE + ManagementDeviceAddressType; +} EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA; + +// +// Management Device Component - SMBIOS Type 35 +// + +#define EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_RECORD_NUMBER 0x0000001C + +typedef struct { + STRING_REF ManagementDeviceComponentDescription; + EFI_INTER_LINK_DATA ManagementDeviceLink; + EFI_INTER_LINK_DATA ManagementDeviceComponentLink; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this field is NOT defined. + /// It's introduced for SmBios 2.6 specification type 35. + /// + EFI_INTER_LINK_DATA ManagementDeviceThresholdLink; + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, this field is NOT defined. + /// It's implementation-specific to simplify the code logic. + /// + UINT8 ComponentType; +} EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA; + +// +// IPMI Data Record - SMBIOS Type 38 +// +typedef enum { + EfiIpmiOther = 0, + EfiIpmiKcs = 1, + EfiIpmiSmic = 2, + EfiIpmiBt = 3 +} EFI_MISC_IPMI_INTERFACE_TYPE; + +typedef struct { + UINT16 IpmiSpecLeastSignificantDigit:4; + UINT16 IpmiSpecMostSignificantDigit: 4; + UINT16 Reserved: 8; +} EFI_MISC_IPMI_SPECIFICATION_REVISION; + +typedef struct { + EFI_MISC_IPMI_INTERFACE_TYPE IpmiInterfaceType; + EFI_MISC_IPMI_SPECIFICATION_REVISION + IpmiSpecificationRevision; + UINT16 IpmiI2CSlaveAddress; + UINT16 IpmiNvDeviceAddress; + UINT64 IpmiBaseAddress; + EFI_DEVICE_PATH_PROTOCOL IpmiDevicePath; +} EFI_MISC_IPMI_INTERFACE_TYPE_DATA; + +#define EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER 0x0000001D +/// +/// The definition above is *NOT* defined in MiscSubclass specifications 0.9. +/// It's defined for backward compatibility. +/// +#define EFI_MISC_IPMI_INTERFACE_TYPE_DATA_RECORD_NUMBER EFI_MISC_IPMI_INTERFACE_TYPE_RECORD_NUMBER + +/// +/// System Power supply Record - SMBIOS Type 39 +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the type of all fields are UINT32. +/// Keep it unchanged for backward compatibilty. +/// +typedef struct { + UINT16 PowerSupplyHotReplaceable:1; + UINT16 PowerSupplyPresent :1; + UINT16 PowerSupplyUnplugged :1; + UINT16 InputVoltageRangeSwitch :4; + UINT16 PowerSupplyStatus :3; + UINT16 PowerSupplyType :4; + UINT16 Reserved :2; +} EFI_MISC_POWER_SUPPLY_CHARACTERISTICS; + +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the structure name is EFI_MISC_POWER_SUPPLY_UNIT_GROUP_DATA. +/// Keep it unchanged for backward compatibilty. +/// +typedef struct { + UINT16 PowerUnitGroup; + STRING_REF PowerSupplyLocation; + STRING_REF PowerSupplyDeviceName; + STRING_REF PowerSupplyManufacturer; + STRING_REF PowerSupplySerialNumber; + STRING_REF PowerSupplyAssetTagNumber; + STRING_REF PowerSupplyModelPartNumber; + STRING_REF PowerSupplyRevisionLevel; + UINT16 PowerSupplyMaxPowerCapacity; + EFI_MISC_POWER_SUPPLY_CHARACTERISTICS PowerSupplyCharacteristics; + EFI_INTER_LINK_DATA PowerSupplyInputVoltageProbeLink; + EFI_INTER_LINK_DATA PowerSupplyCoolingDeviceLink; + EFI_INTER_LINK_DATA PowerSupplyInputCurrentProbeLink; +} EFI_MISC_SYSTEM_POWER_SUPPLY_DATA; + +#define EFI_MISC_SYSTEM_POWER_SUPPLY_RECORD_NUMBER 0x0000001E + +/// +/// OEM Data Record - SMBIOS Type 0x80-0xFF +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the structure name is EFI_SMBIOS_STRUCTURE_HDR. +/// Due to this, the structure is commonly used by vendors to construct SmBios type 0x80~0xFF table, +/// Keep it unchanged for backward compatibilty. +/// +typedef struct { + UINT8 Type; + UINT8 Length; + UINT16 Handle; +} SMBIOS_STRUCTURE_HDR; + +typedef struct { + /// + /// Inconsistent with specification here: + /// In MiscSubclass specification 0.9, the field name is EFI_SMBIOS_STRUCTURE_HDR. + /// Keep it unchanged for backward compatibilty. + /// + SMBIOS_STRUCTURE_HDR Header; + UINT8 RawData[1]; +} EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA; + +#define EFI_MISC_SMBIOS_STRUCT_ENCAP_RECORD_NUMBER 0x0000001F + +/// +/// Misc. System Event Log - SMBIOS Type 15 +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 specification type 15. +/// +#define EFI_MISC_SYSTEM_EVENT_LOG_RECORD_NUMBER 0x00000020 + +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 specification type 15. +/// +typedef struct { + UINT16 LogAreaLength; + UINT16 LogHeaderStartOffset; + UINT16 LogDataStartOffset; + UINT8 AccessMethod; + UINT8 LogStatus; + UINT32 LogChangeToken; + UINT32 AccessMethodAddress; + UINT8 LogHeaderFormat; + UINT8 NumberOfSupportedLogType; + UINT8 LengthOfLogDescriptor; +} EFI_MISC_SYSTEM_EVENT_LOG_DATA; + +// +// Access Method. +// 0x00~0x04: as following definition +// 0x05~0x7f: Available for future assignment. +// 0x80~0xff: BIOS Vendor/OEM-specific. +// +#define ACCESS_INDEXIO_1INDEX8BIT_DATA8BIT 0x00 +#define ACCESS_INDEXIO_2INDEX8BIT_DATA8BIT 0X01 +#define ACCESS_INDEXIO_1INDEX16BIT_DATA8BIT 0X02 +#define ACCESS_MEMORY_MAPPED 0x03 +#define ACCESS_GPNV 0x04 + +/// +/// Management Device Threshold Data Record - SMBIOS Type 36 +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 specification type 36. +/// +#define EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD_RECORD_NUMBER 0x00000021 +/// +/// Inconsistent with specification here: +/// In MiscSubclass specification 0.9, the following data structures are NOT defined. +/// It's introduced for SmBios 2.6 specification type 36. +/// +typedef struct { + UINT16 LowerThresNonCritical; + UINT16 UpperThresNonCritical; + UINT16 LowerThresCritical; + UINT16 UpperThresCritical; + UINT16 LowerThresNonRecover; + UINT16 UpperThresNonRecover; +} EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD; + +// +// Declare the following strutures alias to use them more conviniently. +// +typedef EFI_MISC_LAST_PCI_BUS_DATA EFI_MISC_LAST_PCI_BUS; +typedef EFI_MISC_BIOS_VENDOR_DATA EFI_MISC_BIOS_VENDOR; +typedef EFI_MISC_SYSTEM_MANUFACTURER_DATA EFI_MISC_SYSTEM_MANUFACTURER; +typedef EFI_MISC_BASE_BOARD_MANUFACTURER_DATA EFI_MISC_BASE_BOARD_MANUFACTURER; +typedef EFI_MISC_CHASSIS_MANUFACTURER_DATA EFI_MISC_CHASSIS_MANUFACTURER; +typedef EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR; +typedef EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA EFI_MISC_SYSTEM_SLOT_DESIGNATION; +typedef EFI_MISC_ONBOARD_DEVICE_DATA EFI_MISC_ONBOARD_DEVICE; +typedef EFI_MISC_POINTING_DEVICE_TYPE_DATA EFI_MISC_ONBOARD_DEVICE_TYPE_DATA; +typedef EFI_MISC_OEM_STRING_DATA EFI_MISC_OEM_STRING; +typedef EFI_MISC_SYSTEM_OPTION_STRING_DATA EFI_MISC_SYSTEM_OPTION_STRING; +typedef EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES; +typedef EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA EFI_MISC_SYSTEM_LANGUAGE_STRING; +typedef EFI_MISC_SYSTEM_EVENT_LOG_DATA EFI_MISC_SYSTEM_EVENT_LOG; +typedef EFI_MISC_BIS_ENTRY_POINT_DATA EFI_MISC_BIS_ENTRY_POINT; +typedef EFI_MISC_BOOT_INFORMATION_STATUS_DATA EFI_MISC_BOOT_INFORMATION_STATUS; +typedef EFI_MISC_SYSTEM_POWER_SUPPLY_DATA EFI_MISC_SYSTEM_POWER_SUPPLY; +typedef EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION; +typedef EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA EFI_MISC_SCHEDULED_POWER_ON_MONTH; +typedef EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA EFI_MISC_VOLTAGE_PROBE_DESCRIPTION; +typedef EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA EFI_MISC_COOLING_DEVICE_TEMP_LINK; +typedef EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION; +typedef EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA + EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION; +typedef EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION; +typedef EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION; +typedef EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA + EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It is implementation-specific to simplify the code logic. +/// +typedef union { + EFI_MISC_LAST_PCI_BUS_DATA LastPciBus; + EFI_MISC_BIOS_VENDOR_DATA MiscBiosVendor; + EFI_MISC_SYSTEM_MANUFACTURER_DATA MiscSystemManufacturer; + EFI_MISC_BASE_BOARD_MANUFACTURER_DATA MiscBaseBoardManufacturer; + EFI_MISC_CHASSIS_MANUFACTURER_DATA MiscChassisManufacturer; + EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA MiscPortInternalConnectorDesignator; + EFI_MISC_SYSTEM_SLOT_DESIGNATION_DATA MiscSystemSlotDesignation; + EFI_MISC_ONBOARD_DEVICE_DATA MiscOnboardDevice; + EFI_MISC_OEM_STRING_DATA MiscOemString; + EFI_MISC_SYSTEM_OPTION_STRING_DATA MiscOptionString; + EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES_DATA NumberOfInstallableLanguages; + EFI_MISC_SYSTEM_LANGUAGE_STRING_DATA MiscSystemLanguageString; + EFI_MISC_SYSTEM_EVENT_LOG_DATA MiscSystemEventLog; + EFI_MISC_GROUP_NAME_DATA MiscGroupNameData; + EFI_MISC_GROUP_ITEM_SET_DATA MiscGroupItemSetData; + EFI_MISC_POINTING_DEVICE_TYPE_DATA MiscPointingDeviceTypeData; + EFI_MISC_RESET_CAPABILITIES_DATA MiscResetCapablilitiesData; + EFI_MISC_HARDWARE_SECURITY_SETTINGS_DATA MiscHardwareSecuritySettingsData; + EFI_MISC_SCHEDULED_POWER_ON_MONTH_DATA MiscScheduledPowerOnMonthData; + EFI_MISC_VOLTAGE_PROBE_DESCRIPTION_DATA MiscVoltagePorbeDescriptionData; + EFI_MISC_COOLING_DEVICE_TEMP_LINK_DATA MiscCoolingDeviceTempLinkData; + EFI_MISC_TEMPERATURE_PROBE_DESCRIPTION_DATA MiscTemperatureProbeDescriptionData; + EFI_MISC_ELECTRICAL_CURRENT_PROBE_DESCRIPTION_DATA MiscElectricalCurrentProbeDescriptionData; + EFI_MISC_REMOTE_ACCESS_MANUFACTURER_DESCRIPTION_DATA + MiscRemoteAccessManufacturerDescriptionData; + EFI_MISC_BIS_ENTRY_POINT_DATA MiscBisEntryPoint; + EFI_MISC_BOOT_INFORMATION_STATUS_DATA MiscBootInformationStatus; + EFI_MISC_MANAGEMENT_DEVICE_DESCRIPTION_DATA MiscMangementDeviceDescriptionData; + EFI_MISC_MANAGEMENT_DEVICE_COMPONENT_DESCRIPTION_DATA + MiscmangementDeviceComponentDescriptionData; + EFI_MISC_IPMI_INTERFACE_TYPE_DATA MiscIpmiInterfaceTypeData; + EFI_MISC_SYSTEM_POWER_SUPPLY_DATA MiscPowerSupplyInfo; + EFI_MISC_SMBIOS_STRUCT_ENCAPSULATION_DATA MiscSmbiosStructEncapsulation; + EFI_MISC_MANAGEMENT_DEVICE_THRESHOLD MiscManagementDeviceThreshold; +} EFI_MISC_SUBCLASS_RECORDS; + +/// +/// Inconsistent with specification here: +/// In MemSubclass specification 0.9, the following data structures are NOT defined. +/// It is implementation-specific to simplify the code logic. +/// +typedef struct { + EFI_SUBCLASS_TYPE1_HEADER Header; + EFI_MISC_SUBCLASS_RECORDS Record; +} EFI_MISC_SUBCLASS_DRIVER_DATA; +#pragma pack() + +/// +/// Inconsistent with specification here: +/// In DataHubSubclass specification 0.9 page 16, the following symbol is NOT defined. +/// But value is meaningful, 0 means Reserved. +/// +#define EFI_SUBCLASS_INSTANCE_RESERVED 0 +/// +/// Inconsistent with specification here: +/// In DataHubSubclass specification 0.9 page 16, the following symbol is NOT defined. +/// But value is meaningful, -1 means Not Applicable. +/// +#define EFI_SUBCLASS_INSTANCE_NON_APPLICABLE 0xFFFF + +#endif diff --git a/IntelFrameworkPkg/Include/Guid/FirmwareFileSystem.h b/IntelFrameworkPkg/Include/Guid/FirmwareFileSystem.h new file mode 100644 index 000000000..56c34765c --- /dev/null +++ b/IntelFrameworkPkg/Include/Guid/FirmwareFileSystem.h @@ -0,0 +1,36 @@ +/** @file + Guid used to define the Firmware File System. See the Framework Firmware + File System Specification for more details. + +Copyright (c) 2006 - 2010, 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 that 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. + + @par Revision Reference: + Guids defined in Firmware File System Spec 0.9. + +**/ + +#ifndef __FIRMWARE_FILE_SYSTEM_GUID_H__ +#define __FIRMWARE_FILE_SYSTEM_GUID_H__ + +/// +/// GUIDs defined by the FFS specification. +/// +#define EFI_FIRMWARE_FILE_SYSTEM_GUID \ + { 0x7A9354D9, 0x0468, 0x444a, {0x81, 0xCE, 0x0B, 0xF6, 0x17, 0xD8, 0x90, 0xDF }} + +typedef UINT16 EFI_FFS_FILE_TAIL; + +#define FFS_ATTRIB_TAIL_PRESENT 0x01 +#define FFS_ATTRIB_RECOVERY 0x02 +#define FFS_ATTRIB_HEADER_EXTENSION 0x04 + +extern EFI_GUID gEfiFirmwareFileSystemGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Guid/SmmCommunicate.h b/IntelFrameworkPkg/Include/Guid/SmmCommunicate.h new file mode 100644 index 000000000..9c7a3333b --- /dev/null +++ b/IntelFrameworkPkg/Include/Guid/SmmCommunicate.h @@ -0,0 +1,33 @@ +/** @file + Definitions EFI_SMM_COMMUNICATE_HEADER used by EFI_SMM_BASE_PROTOCOL.Communicate() + functions. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + GUIDs defined in SmmCis spec version 0.9. + +**/ + +#ifndef _SMM_COMMUNICATE_GUID_H_ +#define _SMM_COMMUNICATE_GUID_H_ + +/// +/// Inconsistent with specification here: +/// GUID definition format has been changed, because the GUID format in the Framework specification is incorrect. +/// +#define SMM_COMMUNICATE_HEADER_GUID \ + { \ + 0xf328e36c, 0x23b6, 0x4a95, {0x85, 0x4b, 0x32, 0xe1, 0x95, 0x34, 0xcd, 0x75 } \ + } + +extern EFI_GUID gSmmCommunicateHeaderGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Guid/SmramMemoryReserve.h b/IntelFrameworkPkg/Include/Guid/SmramMemoryReserve.h new file mode 100644 index 000000000..04589cf04 --- /dev/null +++ b/IntelFrameworkPkg/Include/Guid/SmramMemoryReserve.h @@ -0,0 +1,60 @@ +/** @file + Definition of GUIDed HOB for reserving SMRAM regions. + + This file defines: + * the GUID used to identify the GUID HOB for reserving SMRAM regions. + * the data structure of SMRAM descriptor to describe SMRAM candidate regions + * values of state of SMRAM candidate regions + * the GUID specific data structure of HOB for reserving SMRAM regions. + This GUIDed HOB can be used to convey the existence of the T-SEG reservation and H-SEG usage + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + GUIDs defined in SmmCis spec version 0.9. + +**/ + +#ifndef _EFI_SMM_PEI_SMRAM_MEMORY_RESERVE_H_ +#define _EFI_SMM_PEI_SMRAM_MEMORY_RESERVE_H_ + +#define EFI_SMM_PEI_SMRAM_MEMORY_RESERVE \ + { \ + 0x6dadf1d1, 0xd4cc, 0x4910, {0xbb, 0x6e, 0x82, 0xb1, 0xfd, 0x80, 0xff, 0x3d } \ + } + +/** +* GUID specific data structure of HOB for reserving SMRAM regions. +* +* Inconsistent with specification here: +* EFI_HOB_SMRAM_DESCRIPTOR_BLOCK has been changed to EFI_SMRAM_HOB_DESCRIPTOR_BLOCK. +* This inconsistency is kept in code in order for backward compatibility. +**/ +typedef struct { + /// + /// Designates the number of possible regions in the system + /// that can be usable for SMRAM. + /// + /// Inconsistent with specification here: + /// In Framework SMM CIS 0.91 specification, it defines the field type as UINTN. + /// However, HOBs are supposed to be CPU neutral, so UINT32 should be used instead. + /// + UINT32 NumberOfSmmReservedRegions; + /// + /// Used throughout this protocol to describe the candidate + /// regions for SMRAM that are supported by this platform. + /// + EFI_SMRAM_DESCRIPTOR Descriptor[1]; +} EFI_SMRAM_HOB_DESCRIPTOR_BLOCK; + +extern EFI_GUID gEfiSmmPeiSmramMemoryReserveGuid; + +#endif + diff --git a/IntelFrameworkPkg/Include/Ppi/BootScriptExecuter.h b/IntelFrameworkPkg/Include/Ppi/BootScriptExecuter.h new file mode 100644 index 000000000..db0f422da --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/BootScriptExecuter.h @@ -0,0 +1,79 @@ +/** @file + This file declares the Boot Script Executer PPI. + + This PPI is published by a PEIM upon dispatch and provides an execution engine for the + Framework boot script. This PEIM should be platform neutral and have no specific knowledge of + platform instructions or other information. The ability to interpret the boot script depends on the + abundance of other PPIs that are available. For example, if the script requests an SMBus command + execution, the PEIM looks for a relevant PPI that is available to execute it, rather than executing it + by issuing the native IA-32 instruction. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This PPI is defined in Framework of EFI BootScript spec. + Version 0.91. + +**/ + +#ifndef _PEI_BOOT_SCRIPT_EXECUTER_PPI_H_ +#define _PEI_BOOT_SCRIPT_EXECUTER_PPI_H_ + +#define EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI_GUID \ + { \ + 0xabd42895, 0x78cf, 0x4872, {0x84, 0x44, 0x1b, 0x5c, 0x18, 0x0b, 0xfb, 0xff } \ + } + +typedef struct _EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI; + +/** + Executes the Framework boot script table. + + @param PeiServices A pointer to the system PEI Services Table. + @param This A pointer to the EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI instance. + @param Address The physical memory address where the table is stored. + It must be zero if the table to be executed is stored in + a firmware volume file. + @param FvFile The firmware volume file name that contains the table to + be executed. It must be NULL if the table to be executed + is stored in physical memory. + + @retval EFI_SUCCESS The boot script table was executed successfully. + @retval EFI_INVALID_PARAMETER Address is zero and FvFile is NULL. + @retval EFI_NOT_FOUND The file name specified in FvFile cannot be found. + @retval EFI_UNSUPPORTED The format of the boot script table is invalid. + Or, an unsupported opcode occurred in the table. + Or there were opcode execution errors, such as an + insufficient dependency. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_BOOT_SCRIPT_EXECUTE)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI *This, + IN EFI_PHYSICAL_ADDRESS Address, + IN EFI_GUID *FvFile OPTIONAL + ); + +/// +/// EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI produces the function which interprets and +/// executes the Framework boot script table. +/// +struct _EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI { + /// + /// Executes a boot script table. + /// + EFI_PEI_BOOT_SCRIPT_EXECUTE Execute; +}; + +extern EFI_GUID gEfiPeiBootScriptExecuterPpiGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Ppi/FindFv.h b/IntelFrameworkPkg/Include/Ppi/FindFv.h new file mode 100644 index 000000000..14a9f82da --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/FindFv.h @@ -0,0 +1,68 @@ +/** @file + This file declares FindFv PPI, which is used to locate FVs that contain PEIMs in PEI. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This PPI is defined in PEI CIS + Version 0.91. + +**/ + +#ifndef _FIND_FV_H_ +#define _FIND_FV_H_ + +/// +/// Inconsistent with specification here: +/// GUID value format has been changed to the standard GUID format. +/// +#define EFI_PEI_FIND_FV_PPI_GUID \ + { \ + 0x36164812, 0xa023, 0x44e5, {0xbd, 0x85, 0x5, 0xbf, 0x3c, 0x77, 0x0, 0xaa } \ + } + +typedef struct _EFI_PEI_FIND_FV_PPI EFI_PEI_FIND_FV_PPI; + +/** + This interface returns the base address of the firmware volume whose index + was passed in FvNumber. Once this function reports a firmware volume + index/base address pair, that index/address pairing must continue throughout PEI. + + @param PeiServices The pointer to the PEI Services Table. + @param This Interface pointer that implements the Find FV service. + @param FvNumber The index of the firmware volume to locate. + @param FvAddress The address of the volume to discover. + + @retval EFI_SUCCESS An additional firmware volume was found. + @retval EFI_OUT_OF_RESOURCES There are no firmware volumes for the given FvNumber. + @retval EFI_INVALID_PARAMETER *FvAddress is NULL. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_FIND_FV_FINDFV)( + IN EFI_PEI_FIND_FV_PPI *This, + IN EFI_PEI_SERVICES **PeiServices, + IN UINT8 *FvNumber, + IN OUT EFI_FIRMWARE_VOLUME_HEADER **FVAddress + ); + +/** + Hardware mechanisms for locating FVs in a platform vary widely. + EFI_PEI_FIND_FV_PPI serves to abstract this variation so that the + PEI Foundation can remain standard across a wide variety of platforms. +**/ +struct _EFI_PEI_FIND_FV_PPI { + EFI_PEI_FIND_FV_FINDFV FindFv; ///< Service that abstracts the location of additional firmware volumes. +}; + +extern EFI_GUID gEfiFindFvPpiGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Ppi/FvLoadFile.h b/IntelFrameworkPkg/Include/Ppi/FvLoadFile.h new file mode 100644 index 000000000..b19be053a --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/FvLoadFile.h @@ -0,0 +1,68 @@ +/** @file + Load image file from fv to memory. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This PPI is defined in PEI CIS spec Version 0.91. + +**/ + +#ifndef _FV_FILE_LOADER_PPI_H_ +#define _FV_FILE_LOADER_PPI_H_ + +#define EFI_PEI_FV_FILE_LOADER_GUID \ + { \ + 0x7e1f0d85, 0x4ff, 0x4bb2, {0x86, 0x6a, 0x31, 0xa2, 0x99, 0x6a, 0x48, 0xa8 } \ + } + +typedef struct _EFI_PEI_FV_FILE_LOADER_PPI EFI_PEI_FV_FILE_LOADER_PPI; + +/** + Loads a PEIM into memory for subsequent execution. + + @param This Interface pointer that implements the Load File PPI instance. + @param FfsHeader The pointer to the FFS header of the file to load. + @param ImageAddress The pointer to the address of the loaded Image + @param ImageSize The pointer to the size of the loaded image. + @param EntryPoint The pointer to the entry point of the image. + + @retval EFI_SUCCESS The image was loaded successfully. + @retval EFI_OUT_OF_RESOURCES There was not enough memory. + @retval EFI_INVALID_PARAMETER The contents of the FFS file did not + contain a valid PE/COFF image that could be loaded. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_FV_LOAD_FILE)( + IN EFI_PEI_FV_FILE_LOADER_PPI *This, + IN EFI_FFS_FILE_HEADER *FfsHeader, + OUT EFI_PHYSICAL_ADDRESS *ImageAddress, + OUT UINT64 *ImageSize, + OUT EFI_PHYSICAL_ADDRESS *EntryPoint + ); + +/** + This PPI is a pointer to the Load File service. This service will be + published by a PEIM. The PEI Foundation will use this service to + launch the known non-XIP PE/COFF PEIM images. This service may + depend upon the presence of the EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI. +**/ +struct _EFI_PEI_FV_FILE_LOADER_PPI { + /// + /// Loads a PEIM into memory for subsequent execution. + /// + EFI_PEI_FV_LOAD_FILE FvLoadFile; +}; + +extern EFI_GUID gEfiPeiFvFileLoaderPpiGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Ppi/PciCfg.h b/IntelFrameworkPkg/Include/Ppi/PciCfg.h new file mode 100644 index 000000000..ded452a16 --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/PciCfg.h @@ -0,0 +1,110 @@ +/** @file + This file declares the PciCfg PPI used to access the PCI configuration space in PEI + +Copyright (c) 2006 - 2010, 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 that 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. + + @par Revision Reference: + This PPI is defined in PEI CIS + Version 0.91. + +**/ + +#ifndef __PEI_PCI_CFG_H__ +#define __PEI_PCI_CFG_H__ + +#include +// +// Get the common definitions for EFI_PEI_PCI_CFG_PPI_WIDTH. +// + +#define EFI_PEI_PCI_CFG_PPI_INSTALLED_GUID \ + { \ + 0xe1f2eba0, 0xf7b9, 0x4a26, {0x86, 0x20, 0x13, 0x12, 0x21, 0x64, 0x2a, 0x90 } \ + } + +typedef struct _EFI_PEI_PCI_CFG_PPI EFI_PEI_PCI_CFG_PPI; + +#define PEI_PCI_CFG_ADDRESS(bus, dev, func, reg) ( \ + (UINT64) ((((UINTN) bus) << 24) + (((UINTN) dev) << 16) + (((UINTN) func) << 8) + ((UINTN) reg)) \ + ) & 0x00000000ffffffff + +/** + PCI read and write operation. + + @param PeiServices An indirect pointer to the PEI Services Table + published by the PEI Foundation. + @param This Pointer to local data for the interface. + @param Width The width of the access. Enumerated in bytes. + @param Address The physical address of the access. + @param Buffer A pointer to the buffer of data. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_NOT_YET_AVAILABLE The service has not been installed. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_PCI_CFG_PPI_IO)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_PCI_CFG_PPI *This, + IN EFI_PEI_PCI_CFG_PPI_WIDTH Width, + IN UINT64 Address, + IN OUT VOID *Buffer + ); + +/** + PCI read-modify-write operation. + + @param PeiServices An indirect pointer to the PEI Services Table + published by the PEI Foundation. + @param This The pointer to local data for the interface. + @param Width The width of the access. Enumerated in bytes. + @param Address The physical address of the access. + @param SetBits Value of the bits to set. + @param ClearBits Value of the bits to clear. + + @retval EFI_SUCCESS The function completed successfully. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_PCI_CFG_PPI_RW)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_PCI_CFG_PPI *This, + IN EFI_PEI_PCI_CFG_PPI_WIDTH Width, + IN UINT64 Address, + IN UINTN SetBits, + IN UINTN ClearBits + ); + +/** + The EFI_PEI_PCI_CFG_PPI interfaces are used to abstract accesses to PCI + controllers behind a PCI root bridge controller. +**/ +struct _EFI_PEI_PCI_CFG_PPI { + /// + /// PCI read services. See the Read() function description. + /// + EFI_PEI_PCI_CFG_PPI_IO Read; + + /// + /// PCI write services. See the Write() function description. + /// + EFI_PEI_PCI_CFG_PPI_IO Write; + + /// + /// PCI read-modify-write services. See the Modify() function description. + /// + EFI_PEI_PCI_CFG_PPI_RW Modify; +}; + +extern EFI_GUID gEfiPciCfgPpiInServiceTableGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Ppi/ReadOnlyVariable.h b/IntelFrameworkPkg/Include/Ppi/ReadOnlyVariable.h new file mode 100644 index 000000000..167e3a889 --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/ReadOnlyVariable.h @@ -0,0 +1,132 @@ +/** @file + This file declares the Read-only Variable Service PPI, which is required by the framework spec. + + These services provide a lightweight, read-only variant of the full EFI variable services. The + reason that these services are read-only is to reduce the complexity of flash management. Also, + some implementation of the PEI may use the same physical flash part for variable and PEIM + storage. As such, a write command to certain technologies would alter the contents of the entire part, + making the PEIM execution in the original position not follow the required flow. + +Copyright (c) 2006 - 2010, 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 that 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. + + @par Revision Reference: + This PPI is defined in PEI CIS + Version 0.91. +**/ + +#ifndef __PEI_READ_ONLY_VARIABLE_PPI_H__ +#define __PEI_READ_ONLY_VARIABLE_PPI_H__ + +#define EFI_PEI_READ_ONLY_VARIABLE_ACCESS_PPI_GUID \ + { \ + 0x3cdc90c6, 0x13fb, 0x4a75, {0x9e, 0x79, 0x59, 0xe9, 0xdd, 0x78, 0xb9, 0xfa } \ + } + +typedef struct _EFI_PEI_READ_ONLY_VARIABLE_PPI EFI_PEI_READ_ONLY_VARIABLE_PPI; + +/// +/// Variable attributes. +///@{ +#define EFI_VARIABLE_NON_VOLATILE 0x00000001 +#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 +#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 +/// +/// Inconsistent with specification here: +/// In Framework Spec, PeiCis0.91, neither the macro or its value is defined. +/// Keeping this inconsistancy for backward compatibility. +/// +#define EFI_VARIABLE_READ_ONLY 0x00000008 +///@} + +/** + Get Variable value by Name and GUID pair. + + @param[in] PeiServices An indirect pointer to the PEI Services Table published + by the PEI Foundation. + @param[in] VariableName A NULL-terminated Unicode string that is the name of the vendor's variable. + @param[in] VendorGuid A unique identifier for the vendor. + @param[out] Attributes This OPTIONAL parameter may be either NULL or + a pointer to the location in which to return + the attributes bitmask for the variable. + @param[in,out] DataSize On input, the size in bytes of the return Data buffer. + On output, the size of data returned in Data. + @param[out] Data The buffer to return the contents of the variable. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_NOT_FOUND The variable was not found. + @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small for the result. + @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value. + @retval EFI_DEVICE_ERROR The variable could not be retrieved due to a hardware error. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_GET_VARIABLE)( + IN EFI_PEI_SERVICES **PeiServices, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Data + ); + +/** + This function can be called multiple times to retrieve the VariableName + and VendorGuid of all variables currently available in the system. On each call + to GetNextVariableName(), the previous results are passed into the interface, + and on output the interface returns the next variable name data. When the + entire variable list has been returned, the error EFI_NOT_FOUND is returned. + + @param[in] PeiServices An indirect pointer to the PEI Services Table + published by the PEI Foundation. + @param[in] VariableNameSize The size of the VariableName buffer. + @param[in] VariableName On input, supplies the last VariableName that was + returned by GetNextVariableName(). On output, + returns the Null-terminated Unicode string of the + current variable. + @param[in] VendorGuid On input, supplies the last VendorGuid that was + returned by GetNextVariableName(). On output, + returns the VendorGuid of the current variable. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_NOT_FOUND The next variable was not found. + @retval EFI_BUFFER_TOO_SMALL The VariableNameSize is too small for the result. + @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value. + @retval EFI_DEVICE_ERROR The variable name could not be retrieved due to + a hardware error. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_GET_NEXT_VARIABLE_NAME)( + IN EFI_PEI_SERVICES **PeiServices, + IN OUT UINTN *VariableNameSize, + IN OUT CHAR16 *VariableName, + IN OUT EFI_GUID *VendorGuid + ); + +/// +/// This PPI provides a lightweight, read-only variant of the full EFI +/// variable services. +/// +struct _EFI_PEI_READ_ONLY_VARIABLE_PPI { + /// + /// Inconsistent with specification here: + /// In Framework Spec, PeiCis0.91, the field is named as GetVariable and GetNextVariableName. + /// Keeping this inconsistancy for backward compatibility. + /// + EFI_PEI_GET_VARIABLE PeiGetVariable; ///< A service to ascertain a given variable name. + EFI_PEI_GET_NEXT_VARIABLE_NAME PeiGetNextVariableName; ///< A service to ascertain a variable based upon a given, known variable +}; + +extern EFI_GUID gEfiPeiReadOnlyVariablePpiGuid; + +#endif /* __PEI_READ_ONLY_VARIABLE_PPI_H__ */ + diff --git a/IntelFrameworkPkg/Include/Ppi/S3Resume.h b/IntelFrameworkPkg/Include/Ppi/S3Resume.h new file mode 100644 index 000000000..f78605623 --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/S3Resume.h @@ -0,0 +1,76 @@ +/** @file + This file declares S3 Resume PPI which accomplishes the firmware S3 resume boot path + and transfers control to OS. + + This PPI is published by the S3 resume PEIM and can be used on the S3 resume boot path to + restore the platform to its preboot configuration and transfer control to OS. The information that is + required for an S3 resume can be saved during the normal boot path using + EFI_ACPI_S3_SAVE_PROTOCOL. This presaved information can then be restored in the S3 + resume boot path using EFI_PEI_S3_RESUME_PPI. Architecturally, the S3 resume PEIM is the + last PEIM to be dispatched in the S3 resume boot path. + Before using this PPI, the caller must ensure the necessary information for the S3 resume, such as + the following, is available for the S3 resume boot path: + - EFI_ACPI_S3_RESUME_SCRIPT_TABLE script table. Type + EFI_ACPI_S3_RESUME_SCRIPT_TABLE is defined in the Intel Platform Innovation + Framework for EFI Boot Script Specification. + - OS waking vector. + - The reserved memory range to be used for the S3 resume. + Otherwise, the S3 resume boot path may fail. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This PPI is defined in Framework for EFI S3 Resume Boot Path spec. + Version 0.9. + +**/ + +#ifndef __PEI_S3_RESUME_PPI_H__ +#define __PEI_S3_RESUME_PPI_H__ + +#define EFI_PEI_S3_RESUME_PPI_GUID \ + { \ + 0x4426CCB2, 0xE684, 0x4a8a, {0xAE, 0x40, 0x20, 0xD4, 0xB0, 0x25, 0xB7, 0x10 } \ + } + +typedef struct _EFI_PEI_S3_RESUME_PPI EFI_PEI_S3_RESUME_PPI; + +/** + Restores the platform to its preboot configuration for an S3 resume and + jumps to the OS waking vector. + + @param PeiServices The pointer to the PEI Services Table + + @retval EFI_ABORTED Execution of the S3 resume boot script table failed. + @retval EFI_NOT_FOUND Could not be locate some necessary information that + is used for the S3 resume boot path d. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_S3_RESUME_PPI_RESTORE_CONFIG)( + IN EFI_PEI_SERVICES **PeiServices + ); + +/** + EFI_PEI_S3_RESUME_PPI accomplishes the firmware S3 resume boot + path and transfers control to OS. +**/ +struct _EFI_PEI_S3_RESUME_PPI { + /// + /// Restores the platform to its preboot configuration for an S3 resume and + /// jumps to the OS waking vector. + /// + EFI_PEI_S3_RESUME_PPI_RESTORE_CONFIG S3RestoreConfig; +}; + +extern EFI_GUID gEfiPeiS3ResumePpiGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Ppi/SectionExtraction.h b/IntelFrameworkPkg/Include/Ppi/SectionExtraction.h new file mode 100644 index 000000000..e1b5a0632 --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/SectionExtraction.h @@ -0,0 +1,107 @@ +/** @file + This file declares the Section Extraction PPI. + + This PPI is defined in PEI CIS version 0.91. It supports encapsulating sections, + such as GUIDed sections used to authenticate the file encapsulation of other domain-specific wrapping. + +Copyright (c) 2006 - 2010, 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 that 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 __SECTION_EXTRACTION_H__ +#define __SECTION_EXTRACTION_H__ + +#define EFI_PEI_SECTION_EXTRACTION_PPI_GUID \ + { \ + 0x4F89E208, 0xE144, 0x4804, {0x9E, 0xC8, 0x0F, 0x89, 0x4F, 0x7E, 0x36, 0xD7 } \ + } + +typedef struct _EFI_PEI_SECTION_EXTRACTION_PPI EFI_PEI_SECTION_EXTRACTION_PPI; + +// +// Bit values for AuthenticationStatus +// +#define EFI_AUTH_STATUS_PLATFORM_OVERRIDE 0x01 +#define EFI_AUTH_STATUS_IMAGE_SIGNED 0x02 +#define EFI_AUTH_STATUS_NOT_TESTED 0x04 +#define EFI_AUTH_STATUS_TEST_FAILED 0x08 + +/** + The function is used to retrieve a section from within a section file. + It will retrieve both encapsulation sections and leaf sections in their entirety, + exclusive of the section header. + + @param PeiServices The pointer to the PEI Services Table. + @param This Indicates the calling context + @param SectionType The pointer to an EFI_SECTION_TYPE. If + SectionType == NULL, the contents of the entire + section are returned in Buffer. If SectionType + is not NULL, only the requested section is returned. + @param SectionDefinitionGuid The pointer to an EFI_GUID. + If SectionType == EFI_SECTION_GUID_DEFINED, + SectionDefinitionGuid indicates for which section + GUID to search. If SectionType != EFI_SECTION_GUID_DEFINED, + SectionDefinitionGuid is unused and is ignored. + @param SectionInstance If SectionType is not NULL, indicates which + instance of the requested section type to return. + @param Buffer The pointer to a pointer to a buffer in which the + section contents are returned. + @param BufferSize A pointer to a caller-allocated UINT32. On input, + *BufferSize indicates the size in bytes of the + memory region pointed to by Buffer. On output, + *BufferSize contains the number of bytes required + to read the section. + @param AuthenticationStatus A pointer to a caller-allocated UINT32 in + which any metadata from encapsulating GUID-defined + sections is returned. + + @retval EFI_SUCCESS The section was successfully processed, and the section + contents were returned in Buffer. + @retval EFI_PROTOCOL_ERROR A GUID-defined section was encountered in + the file with its EFI_GUIDED_SECTION_PROCESSING_REQUIRED + bit set, but there was no corresponding GUIDed + Section Extraction Protocol in the handle database. + *Buffer is unmodified. + @retval EFI_NOT_FOUND The requested section does not exist.*Buffer is + unmodified. + @retval EFI_OUT_OF_RESOURCES The system has insufficient resources to process + the request. + @retval EFI_INVALID_PARAMETER The SectionStreamHandle does not exist. + @retval EFI_WARN_TOO_SMALL The size of the input buffer is insufficient to + contain the requested section. The input buffer + is filled and contents are section contents are + truncated. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_GET_SECTION)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_SECTION_EXTRACTION_PPI *This, + IN EFI_SECTION_TYPE *SectionType, + IN EFI_GUID *SectionDefinitionGuid, OPTIONAL + IN UINTN SectionInstance, + IN VOID **Buffer, + IN OUT UINT32 *BufferSize, + OUT UINT32 *AuthenticationStatus + ); + +/** + This PPI supports encapsulating sections, such as GUIDed sections used to + authenticate the file encapsulation of other domain-specific wrapping. +**/ +struct _EFI_PEI_SECTION_EXTRACTION_PPI { + EFI_PEI_GET_SECTION GetSection; ///< Retrieves a section from within a section file. +}; + +extern EFI_GUID gEfiPeiSectionExtractionPpiGuid; + +#endif + diff --git a/IntelFrameworkPkg/Include/Ppi/Security.h b/IntelFrameworkPkg/Include/Ppi/Security.h new file mode 100644 index 000000000..200bc3ca4 --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/Security.h @@ -0,0 +1,68 @@ +/** @file + This file declares the Security Architectural PPI. + + This PPI is installed by a platform PEIM that abstracts the security policy to the PEI + Foundation, namely the case of a PEIM's authentication state being returned during the PEI section + extraction process. + +Copyright (c) 2006 - 2010, 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 that 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. + + @par Revision Reference: + This PPI is defined in PEI CIS. + Version 0.91. + +**/ + +#ifndef __SECURITY_PPI_H__ +#define __SECURITY_PPI_H__ + +#define EFI_PEI_SECURITY_PPI_GUID \ + { \ + 0x1388066e, 0x3a57, 0x4efa, {0x98, 0xf3, 0xc1, 0x2f, 0x3a, 0x95, 0x8a, 0x29 } \ + } + +typedef struct _EFI_PEI_SECURITY_PPI EFI_PEI_SECURITY_PPI; + +/** + Allows the platform builder to implement a security policy in response + to varying file authentication states. + + @param PeiServices The pointer to the PEI Services Table. + @param This Interface pointer that implements the particular + EFI_PEI_SECURITY_PPI instance. + @param AuthenticationStatus Status returned by the verification service as + part of section extraction. + @param FfsFileHeader The pointer to the file under review. + @param DeferExecution The pointer to a variable that alerts the PEI + Foundation to defer execution of a PEIM. + + @retval EFI_SUCCESS The service performed its action successfully. + @retval EFI_SECURITY_VIOLATION The object cannot be trusted. +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_PEI_SECURITY_AUTHENTICATION_STATE)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_SECURITY_PPI *This, + IN UINT32 AuthenticationStatus, + IN EFI_FFS_FILE_HEADER *FfsFileHeader, + IN OUT BOOLEAN *DeferExecution + ); + +// +// PPI interface structure of Security PPI +// +struct _EFI_PEI_SECURITY_PPI { + FRAMEWORK_EFI_PEI_SECURITY_AUTHENTICATION_STATE AuthenticationState; +}; + +extern EFI_GUID gEfiPeiSecurityPpiGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Ppi/Smbus.h b/IntelFrameworkPkg/Include/Ppi/Smbus.h new file mode 100644 index 000000000..2a95fef5e --- /dev/null +++ b/IntelFrameworkPkg/Include/Ppi/Smbus.h @@ -0,0 +1,232 @@ +/** @file + This file declares the Smbus PPI, which provides the basic I/O interfaces that a PEIM + uses to access its SMBus controller and the slave devices attached to it. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This PPI is defined in Framework of EFI SmBus PPI spec. + Version 0.9. + +**/ + +#ifndef _PEI_SMBUS_PPI_H_ +#define _PEI_SMBUS_PPI_H_ + +#include + +#define EFI_PEI_SMBUS_PPI_GUID \ + { \ + 0xabd42895, 0x78cf, 0x4872, {0x84, 0x44, 0x1b, 0x5c, 0x18, 0xb, 0xfb, 0xda } \ + } + +typedef struct _EFI_PEI_SMBUS_PPI EFI_PEI_SMBUS_PPI; + +/** + Executes an SMBus operation to an SMBus controller. + + @param[in] PeiServices A pointer to the system PEI Services Table. + @param[in] This A pointer to the EFI_PEI_SMBUS_PPI instance. + @param[in] SlaveAddress The SMBUS hardware address to which the SMBUS + device is preassigned or allocated. + @param[in] Command This command is transmitted by the SMBus host + controller to the SMBus slave device, and the + interpretation is SMBus slave device specific. + @param[in] Operation Signifies which particular SMBus hardware protocol + instance to use to execute the SMBus transactions. + @param[in] PecCheck Defines if Packet Error Code (PEC) checking is + required for this operation. + @param[in, out] Length The number of bytes for this operation. + @param[in, out] Buffer Contains the value of data to execute to the SMBus + slave device. + + @retval EFI_SUCCESS The last data that was returned from the access + matched the poll exit criteria. + @retval EFI_CRC_ERROR The checksum is not correct (PEC is incorrect). + @retval EFI_TIMEOUT Timeout expired before the operation was completed. + Timeout is determined by the SMBus host controller device. + @retval EFI_OUT_OF_RESOURCES The request could not be completed + due to a lack of resources. + @retval EFI_DEVICE_ERROR The request was not completed because a failure + was recorded in the Host Status Register bit. + @retval EFI_INVALID_PARAMETER The operation is not defined in EFI_SMBUS_OPERATION. + @retval EFI_INVALID_PARAMETER Length/Buffer is NULL for operations except for + EfiSmbusQuickRead and EfiSmbusQuickWrite. Length + is outside the range of valid values. + @retval EFI_UNSUPPORTED The SMBus operation or PEC is not supported. + @retval EFI_BUFFER_TOO_SMALL Buffer is not sufficient for this operation. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_SMBUS_PPI_EXECUTE_OPERATION)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_SMBUS_PPI *This, + IN EFI_SMBUS_DEVICE_ADDRESS SlaveAddress, + IN EFI_SMBUS_DEVICE_COMMAND Command, + IN EFI_SMBUS_OPERATION Operation, + IN BOOLEAN PecCheck, + IN OUT UINTN *Length, + IN OUT VOID *Buffer + ); + +/** + This function is user-defined, and is called when the SlaveAddress/Data pair happens. + + @param[in] PeiServices A pointer to the system PEI Services Table. + @param[in] This A pointer to the EFI_PEI_SMBUS_PPI instance. + @param[in] SlaveAddress The SMBUS hardware address to which the SMBUS + device is preassigned or allocated. + @param[in] Data Data of the SMBus host notify command, which denotes that + the caller wants to be called. + + @return Status Code returned by callback function. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_SMBUS_NOTIFY_FUNCTION)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_SMBUS_PPI *SmbusPpi, + IN EFI_SMBUS_DEVICE_ADDRESS SlaveAddress, + IN UINTN Data + ); + +/** + The ArpDevice() function enumerates either the entire bus or a specific + device identified by SmbusUdid. + + @param[in] PeiServices A pointer to the system PEI Services Table. + @param[in] This A pointer to the EFI_PEI_SMBUS_PPI instance. + @param[in] ArpAll A Boolean expression that indicates if the host + drivers need to enumerate all the devices or to + enumerate only the device that is identified + by SmbusUdid. If ArpAll is TRUE, SmbusUdid and + SlaveAddress are optional and ignored if entered. + If ArpAll is FALSE, ArpDevice will enumerate + SmbusUdid, and the address will be at SlaveAddress. + @param[in] SmbusUdid The targeted SMBus Unique Device Identifier (UDID). + The UDID may not exist for SMBus devices with fixed + addresses. + @param[in, out] SlaveAddress The new SMBus address for the slave device for + which the operation is targeted. + This address may be NULL. + + @retval EFI_SUCCESS The SMBus slave device address was set. + @retval EFI_INVALID_PARAMETER SlaveAddress is NULL. + @retval EFI_OUT_OF_RESOURCES The request could not be completed + due to a lack of resources. + @retval EFI_TIMEOUT The SMBus slave device did not respond. + @retval EFI_DEVICE_ERROR The request was not completed because the transaction failed. + @retval EFI_UNSUPPORTED ArpDevice() is not implemented by this PEIM. + This return value is not defined in the Framework Specification. + This return value was introduced in the PI Specification. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_SMBUS_PPI_ARP_DEVICE)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_SMBUS_PPI *This, + IN BOOLEAN ArpAll, + IN EFI_SMBUS_UDID *SmbusUdid, OPTIONAL + IN OUT EFI_SMBUS_DEVICE_ADDRESS *SlaveAddress OPTIONAL + ); + +/** + The GetArpMap() function returns the mapping of all the SMBus devices + that are enumerated by the SMBus host driver. + + @param[in] PeiServices A pointer to the system PEI Services Table. + @param[in] This A pointer to the EFI_PEI_SMBUS_PPI instance. + @param[in, out] Length The size of the buffer that contains the SMBus device map. + @param[in, out] SmbusDeviceMap The pointer to the device map as enumerated + by the SMBus controller driver. + + @retval EFI_SUCCESS The device map was returned correctly in the buffer. + @retval EFI_UNSUPPORTED GetArpMap() are not implemented by this PEIM. + This return value was not defined in the Framework Specification. + This return value was introduced in the PI Specification. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_SMBUS_PPI_GET_ARP_MAP)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_SMBUS_PPI *This, + IN OUT UINTN *Length, + IN OUT EFI_SMBUS_DEVICE_MAP **SmbusDeviceMap + ); + +/** + Allows a device driver to register for a callback when the bus driver detects a state that it needs to + propagate to other PEIMs that are registered for a callback. + + The Notify() function registers all the callback functions to allow the + bus driver to call these functions when the SlaveAddress/Data pair occur. + All functions to be registered with EFI_PEI_SMBUS_PPI_NOTIFY must be of type + EFI_PEI_SMBUS_NOTIFY_FUNCTION. + + @param[in] PeiServices A pointer to the system PEI Services Table. + @param[in] This A pointer to the EFI_PEI_SMBUS_PPI instance. + @param[in] SlaveAddress The address that the host controller detects as + sending a message and triggers all the registered functions. + @param[in] Data Data that the host controller detects as sending a message + and triggers all the registered functions. + @param[in] NotifyFunction The function to call when the bus driver + detects the SlaveAddress and Data pair. + + @retval EFI_SUCCESS NotifyFunction has been registered. + @retval EFI_UNSUPPORTED Notify() are not implemented by this PEIM. + This return value is not defined in the Framework Specification. + This return value was introduced in the PI Specification. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_PEI_SMBUS_PPI_NOTIFY)( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_SMBUS_PPI *This, + IN EFI_SMBUS_DEVICE_ADDRESS SlaveAddress, + IN UINTN Data, + IN EFI_PEI_SMBUS_NOTIFY_FUNCTION NotifyFunction + ); + +/// +/// Provides the basic I/O interfaces that a PEIM uses to access +/// its SMBus controller and the slave devices attached to it. +/// +struct _EFI_PEI_SMBUS_PPI { + /// + /// Executes the SMBus operation to an SMBus slave device. + /// + EFI_PEI_SMBUS_PPI_EXECUTE_OPERATION Execute; + + /// + /// Allows an SMBus 2.0 device(s) to be Address Resolution Protocol (ARP) + /// + EFI_PEI_SMBUS_PPI_ARP_DEVICE ArpDevice; + + /// + /// Allows a PEIM to retrieve the address that was allocated by the SMBus + /// host controller during enumeration/ARP. + /// + EFI_PEI_SMBUS_PPI_GET_ARP_MAP GetArpMap; + + /// + /// Allows a driver to register for a callback to the SMBus host + /// controller driver when the bus issues a notification to the bus controller PEIM. + /// + EFI_PEI_SMBUS_PPI_NOTIFY Notify; +}; + +extern EFI_GUID gEfiPeiSmbusPpiGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/AcpiS3Save.h b/IntelFrameworkPkg/Include/Protocol/AcpiS3Save.h new file mode 100644 index 000000000..0d466bd50 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/AcpiS3Save.h @@ -0,0 +1,128 @@ +/** @file + This protocol is used to prepare all information that is needed for the S3 resume boot path. This + protocol is not required for all platforms. + +Copyright (c) 2006 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of S3 Resume Boot Path Spec. + Version 0.9. + +**/ + +#ifndef _ACPI_S3_SAVE_PROTOCOL_H_ +#define _ACPI_S3_SAVE_PROTOCOL_H_ + +// +// Forward reference for pure ANSI compatability +// +typedef struct _EFI_ACPI_S3_SAVE_PROTOCOL EFI_ACPI_S3_SAVE_PROTOCOL; + +// +// S3 Save Protocol GUID +// +#define EFI_ACPI_S3_SAVE_GUID \ + { \ + 0x125f2de1, 0xfb85, 0x440c, {0xa5, 0x4c, 0x4d, 0x99, 0x35, 0x8a, 0x8d, 0x38 } \ + } + +// +// Protocol Data Structures +// + +/** + This function is used to: + + - Prepare all information that is needed in the S3 resume boot path. This information can include + the following: + -- Framework boot script table + -- RSDT pointer + -- Reserved memory for the S3 resume + + - Get the minimum legacy memory length (meaning below 1 MB) that is required for the S3 resume boot path. + If LegacyMemoryAddress is NULL, the firmware will be unable to jump into a real-mode + waking vector. However, it might still be able to jump into a flat-mode waking vector as long as the + OS provides a flat-mode waking vector. It is the caller's responsibility to ensure the + LegacyMemoryAddress is valid. If the LegacyMemoryAddress is higher than 1 MB, + EFI_INVALID_PARAMETER will be returned. + + @param This A pointer to the EFI_ACPI_S3_SAVE_PROTOCOL instance. + @param LegacyMemoryAddress The base of legacy memory. + + @retval EFI_SUCCESS All information was saved successfully. + @retval EFI_INVALID_PARAMETER The memory range is not located below 1 MB. + @retval EFI_OUT_OF_RESOURCES Resources were insufficient to save all the information. + @retval EFI_NOT_FOUND Some necessary information cannot be found. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ACPI_S3_SAVE)( + IN EFI_ACPI_S3_SAVE_PROTOCOL * This, + IN VOID * LegacyMemoryAddress + ); + +/** + This function returns the size of the legacy memory (meaning below 1 MB) that is required during an S3 + resume. Before the Framework-based firmware transfers control to the OS, it has to transition from + flat mode into real mode in case the OS supplies only a real-mode waking vector. This transition + requires a certain amount of legacy memory. After getting the size of legacy memory + below, the caller is responsible for allocating the legacy memory below 1 MB according to + the size that is returned. The specific implementation of allocating the legacy memory is out of the + scope of this specification. + + @param This A pointer to the EFI_ACPI_S3_SAVE_PROTOCOL instance. + @param Size The returned size of legacy memory below 1MB. + + @retval EFI_SUCCESS Size was successfully returned. + @retval EFI_INVALID_PARAMETER The pointer Size is NULL. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ACPI_GET_LEGACY_MEMORY_SIZE)( + IN EFI_ACPI_S3_SAVE_PROTOCOL * This, + OUT UINTN * Size +); + +/** + The EFI_ACPI_S3_SAVE_PROTOCOL is responsible for preparing all the information that the + Framework needs to restore the platform's preboot state during an S3 resume boot. This + information can include the following: + - The Framework boot script table, containing all necessary operations to initialize the platform. + - ACPI table information, such as RSDT, through which the OS waking vector can be located. + - The range of reserved memory that can be used on the S3 resume boot path. + This protocol can be used after the Framework makes sure that the boot process is complete and + that no hardware has been left unconfigured. Where to call this protocol to save information is implementation-specific. + In the case of an EFI-aware OS, ExitBootServices() can be a choice to provide this hook. + The currently executing EFI OS loader image calls ExitBootServices()to terminate all boot + services. After ExitBootServices() successfully completes, the loader becomes responsible + for the continued operation of the system. + On a normal boot, ExitBootServices() checks if the platform supports S3 by looking for + EFI_ACPI_S3_SAVE_PROTOCOL. If the protocol exists, ExitBootServices()will assume + that the target platform supports an S3 resume and then call EFI_ACPI_S3_SAVE_PROTOCOL + to save the S3 resume information. The entire Framework boot script table will then be generated, + assuming the platform currently is in the preboot state. +**/ +struct _EFI_ACPI_S3_SAVE_PROTOCOL { + /// + /// Gets the size of legacy memory below 1 MB that is required for S3 resume. + /// + EFI_ACPI_GET_LEGACY_MEMORY_SIZE GetLegacyMemorySize; + + /// + /// Prepare all information for an S3 resume. + /// + EFI_ACPI_S3_SAVE S3Save; +}; + +extern EFI_GUID gEfiAcpiS3SaveProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/AcpiSupport.h b/IntelFrameworkPkg/Include/Protocol/AcpiSupport.h new file mode 100644 index 000000000..278ef8e42 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/AcpiSupport.h @@ -0,0 +1,148 @@ +/** @file + This protocol provides some basic services to support publishing ACPI system tables. The + services handle many of the more mundane tasks that are required to publish a set of tables. The + services will: + - Generate common tables. + - Update the table links. + - Ensure that tables are properly aligned and use correct types of memory. + - Update checksum values and IDs. + - Complete the final installation of the tables. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework ACPI Specification. + Version 0.9. + +**/ + +#ifndef _ACPI_SUPPORT_PROTOCOL_H_ +#define _ACPI_SUPPORT_PROTOCOL_H_ + +#include + +typedef struct _EFI_ACPI_SUPPORT_PROTOCOL EFI_ACPI_SUPPORT_PROTOCOL; + +// +// ACPI Support Protocol GUID +// +#define EFI_ACPI_SUPPORT_GUID \ + { \ + 0xdbff9d55, 0x89b7, 0x46da, {0xbd, 0xdf, 0x67, 0x7d, 0x3d, 0xc0, 0x24, 0x1d } \ + } + + +// +// Protocol Member Functions +// + +/** + Returns a requested ACPI table. + + @param This A pointer to the EFI_ACPI_SUPPORT_PROTOCOL instance. + @param Index The zero-based index of the table to retrieve. + @param Table The pointer for returning the table buffer. + @param Version Updated with the ACPI versions to which this table belongs. + @param Handle The pointer for identifying the table. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_NOT_FOUND The requested index is too large and a table was not found. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ACPI_GET_ACPI_TABLE)( + IN EFI_ACPI_SUPPORT_PROTOCOL *This, + IN INTN Index, + OUT VOID **Table, + OUT EFI_ACPI_TABLE_VERSION *Version, + OUT UINTN *Handle + ); + +/** + Used to add, remove, or update ACPI tables. + + @param This A pointer to the EFI_ACPI_SUPPORT_PROTOCOL instance. + @param Table The pointer to the new table to add or update. + @param Checksum If TRUE, indicates that the checksum should be + calculated for this table. + @param Version Indicates to which version(s) of ACPI the table should be added. + @param Handle The pointer to the handle of the table to remove or update. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_INVALID_PARAMETER *Handle was zero and Table was NULL. + @retval EFI_ABORTED Could not complete the desired action. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ACPI_SET_ACPI_TABLE)( + IN EFI_ACPI_SUPPORT_PROTOCOL *This, + IN VOID *Table OPTIONAL, + IN BOOLEAN Checksum, + IN EFI_ACPI_TABLE_VERSION Version, + IN OUT UINTN *Handle + ); + +/** + Causes one or more versions of the ACPI tables to be published in + the EFI system configuration tables. + + The PublishTables() function installs the ACPI tables for the versions that are specified in + Version. No tables are published for Version equal to EFI_ACPI_VERSION_NONE. Once + published, tables will continue to be updated as tables are modified with + EFI_ACPI_SUPPORT_PROTOCOL.SetAcpiTable(). + + @param This A pointer to the EFI_ACPI_SUPPORT_PROTOCOL instance. + @param Version Indicates to which version(s) of ACPI the table should be published. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_ABORTED An error occurred and the function could not complete successfully. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_ACPI_PUBLISH_TABLES)( + IN EFI_ACPI_SUPPORT_PROTOCOL *This, + IN EFI_ACPI_TABLE_VERSION Version + ); + +// +// ACPI Support Protocol +// +/** + This protocol provides some basic services to support publishing ACPI system + tables. The services handle many of the more mundane tasks that are required + to publish a set of tables. +**/ +struct _EFI_ACPI_SUPPORT_PROTOCOL { + /// + /// Returns a table specified by an index if it exists. + /// + EFI_ACPI_GET_ACPI_TABLE GetAcpiTable; + + /// + /// Adds, removes, or updates ACPI tables. + /// + EFI_ACPI_SET_ACPI_TABLE SetAcpiTable; + + /// + /// Publishes the ACPI tables. + /// + EFI_ACPI_PUBLISH_TABLES PublishTables; +}; + +// +// Extern the GUID for protocol users. +// +extern EFI_GUID gEfiAcpiSupportProtocolGuid; + +#endif + diff --git a/IntelFrameworkPkg/Include/Protocol/BootScriptSave.h b/IntelFrameworkPkg/Include/Protocol/BootScriptSave.h new file mode 100644 index 000000000..a8710abc8 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/BootScriptSave.h @@ -0,0 +1,86 @@ +/** @file + This protocol is used to store or record various boot scripts into boot + script tables. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This protocol defined in the Boot Script Specification, Version 0.91. + +**/ + +#ifndef _BOOT_SCRIPT_SAVE_PROTOCOL_H_ +#define _BOOT_SCRIPT_SAVE_PROTOCOL_H_ + +/// +/// S3 Save Protocol GUID. +/// +#define EFI_BOOT_SCRIPT_SAVE_PROTOCOL_GUID \ + { \ + 0x470e1529, 0xb79e, 0x4e32, {0xa0, 0xfe, 0x6a, 0x15, 0x6d, 0x29, 0xf9, 0xb2 } \ + } + +typedef struct _EFI_BOOT_SCRIPT_SAVE_PROTOCOL EFI_BOOT_SCRIPT_SAVE_PROTOCOL; + +/** + Adds a record into a specified Framework boot script table. + + @param This A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance. + @param TableName The name of the script table. Currently, the only meaningful + value is EFI_ACPI_S3_RESUME_SCRIPT_TABLE. + @param OpCode The operation code (opcode) number. + @param ... The argument list that is specific to each opcode. + + @retval EFI_SUCCESS The operation succeeded. A record was added into the specified script table. + @retval EFI_INVALID_PARAMETER The parameter is illegal, or the given boot script is not supported. + @retval EFI_OUT_OF_RESOURCES There is insufficient memory to store the boot script. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_BOOT_SCRIPT_WRITE)( + IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL *This, + IN UINT16 TableName, + IN UINT16 OpCode, + ... + ); + +/** + Closes the specified script table. + + @param This A pointer to the EFI_BOOT_SCRIPT_SAVE_PROTOCOL instance. + @param TableName The name of the script table. + @param Address A pointer to the physical address where the table begins. + + @retval EFI_SUCCESS The table was successfully returned. + @retval EFI_NOT_FOUND The specified table was not created previously. + @retval EFI_OUT_OF_RESOURCES Memory is insufficient to hold the reorganized boot script table. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_BOOT_SCRIPT_CLOSE_TABLE)( + IN EFI_BOOT_SCRIPT_SAVE_PROTOCOL *This, + IN UINT16 TableName, + OUT EFI_PHYSICAL_ADDRESS *Address + ); + +/// +/// The EFI_BOOT_SCRIPT_SAVE_PROTOCOL publishes the Framework boot script abstractions +/// to store or record various boot scripts into boot script tables. +/// +struct _EFI_BOOT_SCRIPT_SAVE_PROTOCOL { + EFI_BOOT_SCRIPT_WRITE Write; ///< Writes various boot scripts to a boot script table. + EFI_BOOT_SCRIPT_CLOSE_TABLE CloseTable; ///< Retrieves and closes a script table. +}; + +extern EFI_GUID gEfiBootScriptSaveProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/CpuIo.h b/IntelFrameworkPkg/Include/Protocol/CpuIo.h new file mode 100644 index 000000000..ec75da09f --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/CpuIo.h @@ -0,0 +1,46 @@ +/** @file + This code abstracts the CPU IO Protocol which installed by some platform or chipset-specific + PEIM that abstracts the processor-visible I/O operations. + + Note: This is a runtime protocol and can be used by runtime drivers after ExitBootServices(). + It is different from the PI 1.2 CPU I/O 2 Protocol, which is a boot services only protocol + and may not be used by runtime drivers after ExitBootServices(). + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + CPU IO Protocol is defined in Framework of EFI CPU IO Protocol Spec + Version 0.9. + +**/ + +#ifndef _CPUIO_H_ +#define _CPUIO_H_ + +#include + +#define EFI_CPU_IO_PROTOCOL_GUID \ + { \ + 0xB0732526, 0x38C8, 0x4b40, {0x88, 0x77, 0x61, 0xC7, 0xB0, 0x6A, 0xAC, 0x45 } \ + } + +// +// Framework CPU IO protocol structure is the same as CPU IO 2 protocol defined in PI 1.2 spec. +// However, there is a significant different between the Framework CPU I/O +// Protocol and the PI 1.2 CPU I/O 2 Protocol. The Framework one is a runtime +// protocol, which means it can be used by runtime drivers after ExitBootServices(). +// The PI one is not runtime safe, so it is a boot services only protocol and may +// not be used by runtime drivers after ExitBootServices(). +// +typedef EFI_CPU_IO2_PROTOCOL EFI_CPU_IO_PROTOCOL; + +extern EFI_GUID gEfiCpuIoProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/DataHub.h b/IntelFrameworkPkg/Include/Protocol/DataHub.h new file mode 100644 index 000000000..eb828fc6f --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/DataHub.h @@ -0,0 +1,222 @@ +/** @file + The data hub protocol is used both by agents wishing to log + data and those wishing to be made aware of all information that + has been logged. This protocol may only be called <= TPL_NOTIFY. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + The Data Hub Protocol is defined in Framework for EFI Data Hub Specification + Version 0.9. + +**/ + +#ifndef __DATA_HUB_H__ +#define __DATA_HUB_H__ + +#define EFI_DATA_HUB_PROTOCOL_GUID \ + { \ + 0xae80d021, 0x618e, 0x11d4, {0xbc, 0xd7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \ + } + +// +// EFI generic Data Hub Header +// +// A Data Record is an EFI_DATA_RECORD_HEADER followed by RecordSize bytes of +// data. The format of the data is defined by the DataRecordGuid. +// +// If EFI_DATA_RECORD_HEADER is extended in the future, the Version number and HeaderSize must +// change. +// +// The logger is responcible for initializing: +// Version, HeaderSize, RecordSize, DataRecordGuid, DataRecordClass +// +// The Data Hub driver is responcible for initializing: +// LogTime and LogMonotonicCount. +// +#define EFI_DATA_RECORD_HEADER_VERSION 0x0100 +typedef struct { + UINT16 Version; + UINT16 HeaderSize; + UINT32 RecordSize; + EFI_GUID DataRecordGuid; + EFI_GUID ProducerName; + UINT64 DataRecordClass; + EFI_TIME LogTime; + UINT64 LogMonotonicCount; +} EFI_DATA_RECORD_HEADER; + +// +// Definition of DataRecordClass. These are used to filter out class types +// at a very high level. The DataRecordGuid still defines the format of +// the data. See the Data Hub Specification for rules on what can and can not be a +// new DataRecordClass +// +#define EFI_DATA_RECORD_CLASS_DEBUG 0x0000000000000001 +#define EFI_DATA_RECORD_CLASS_ERROR 0x0000000000000002 +#define EFI_DATA_RECORD_CLASS_DATA 0x0000000000000004 +#define EFI_DATA_RECORD_CLASS_PROGRESS_CODE 0x0000000000000008 + +// +// Forward reference for pure ANSI compatability +// +typedef struct _EFI_DATA_HUB_PROTOCOL EFI_DATA_HUB_PROTOCOL; + +/** + Logs a data record to the system event log. + + @param This The EFI_DATA_HUB_PROTOCOL instance. + @param DataRecordGuid A GUID that indicates the format of the data passed into RawData. + @param ProducerName A GUID that indicates the identity of the caller to this API. + @param DataRecordClass This class indicates the generic type of the data record. + @param RawData The DataRecordGuid-defined data to be logged. + @param RawDataSize The size in bytes of RawData. + + @retval EFI_SUCCESS Data was logged. + @retval EFI_OUT_OF_RESOURCES Data was not logged due to lack of system resources. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_DATA_HUB_LOG_DATA)( + IN EFI_DATA_HUB_PROTOCOL *This, + IN EFI_GUID *DataRecordGuid, + IN EFI_GUID *ProducerName, + IN UINT64 DataRecordClass, + IN VOID *RawData, + IN UINT32 RawDataSize + ); + +/** + Allows the system data log to be searched. + + @param This The EFI_DATA_HUB_PROTOCOL instance. + @param MonotonicCount On input, it specifies the Record to return. + An input of zero means to return the first record, + as does an input of one. + @param FilterDriver If FilterDriver is not passed in a MonotonicCount + of zero, it means to return the first data record. + If FilterDriver is passed in, then a MonotonicCount + of zero means to return the first data not yet read + by FilterDriver. + @param Record Returns a dynamically allocated memory buffer with + a data record that matches MonotonicCount. + + @retval EFI_SUCCESS Data was returned in Record. + @retval EFI_INVALID_PARAMETER FilterDriver was passed in but does not exist. + @retval EFI_NOT_FOUND MonotonicCount does not match any data record + in the system. If a MonotonicCount of zero was + passed in, then no data records exist in the system. + @retval EFI_OUT_OF_RESOURCES Record was not returned due to lack + of system resources. + @note Inconsistent with specification here: + In Framework for EFI Data Hub Specification, Version 0.9, This definition + is named as EFI_DATA_HUB_GET_NEXT_DATA_RECORD. The inconsistency is + maintained for backward compatibility. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_DATA_HUB_GET_NEXT_RECORD)( + IN EFI_DATA_HUB_PROTOCOL *This, + IN OUT UINT64 *MonotonicCount, + IN EFI_EVENT *FilterDriver OPTIONAL, + OUT EFI_DATA_RECORD_HEADER **Record + ); + +/** + Registers an event to be signaled every time a data record is logged in the system. + + @param This The EFI_DATA_HUB_PROTOCOL instance. + @param FilterEvent The EFI_EVENT to signal whenever data that matches + FilterClass is logged in the system. + @param FilterTpl The maximum EFI_TPL at which FilterEvent can be + signaled. It is strongly recommended that you use + the lowest EFI_TPL possible. + @param FilterClass FilterEvent will be signaled whenever a bit + in EFI_DATA_RECORD_HEADER.DataRecordClass is also + set in FilterClass. If FilterClass is zero, no + class-based filtering will be performed. + @param FilterDataRecordGuid FilterEvent will be signaled whenever + FilterDataRecordGuid matches + EFI_DATA_RECORD_HEADER.DataRecordGuid. + If FilterDataRecordGuid is NULL, then no GUID-based + filtering will be performed. + + @retval EFI_SUCCESS The filter driver event was registered + @retval EFI_ALREADY_STARTED FilterEvent was previously registered and cannot + be registered again. + @retval EFI_OUT_OF_RESOURCES The filter driver event was not registered + due to lack of system resources. + @note Inconsistent with specification here: + In Framework for EFI Data Hub Specification, Version 0.9, This definition + is named as EFI_DATA_HUB_REGISTER_DATA_FILTER_DRIVER. The inconsistency + is maintained for backward compatibility. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_DATA_HUB_REGISTER_FILTER_DRIVER)( + IN EFI_DATA_HUB_PROTOCOL *This, + IN EFI_EVENT FilterEvent, + IN EFI_TPL FilterTpl, + IN UINT64 FilterClass, + IN EFI_GUID *FilterDataRecordGuid OPTIONAL + ); + +/** + Stops a filter driver from being notified when data records are logged. + + @param This The EFI_DATA_HUB_PROTOCOL instance. + @param FilterEvent The EFI_EVENT to remove from the list of events to be + signaled every time errors are logged. + + @retval EFI_SUCCESS The filter driver represented by FilterEvent was shut off. + @retval EFI_NOT_FOUND FilterEvent did not exist. + @note Inconsistent with specification here: + In Framework for EFI Data Hub Specification, Version 0.9, This definition + is named as EFI_DATA_HUB_UNREGISTER_DATA_FILTER_DRIVER. The inconsistency + is maintained for backward compatibility. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_DATA_HUB_UNREGISTER_FILTER_DRIVER)( + IN EFI_DATA_HUB_PROTOCOL *This, + IN EFI_EVENT FilterEvent + ); + +/** + This protocol is used to log information and register filter drivers + to receive data records. +**/ +struct _EFI_DATA_HUB_PROTOCOL { + /// + /// Logs a data record. + /// + EFI_DATA_HUB_LOG_DATA LogData; + + /// + /// Gets a data record. Used both to view the memory-based log and to + /// get information about which data records have been consumed by a filter driver. + /// + EFI_DATA_HUB_GET_NEXT_RECORD GetNextRecord; + + /// + /// Allows the registration of an EFI event to act as a filter driver for all data records that are logged. + /// + EFI_DATA_HUB_REGISTER_FILTER_DRIVER RegisterFilterDriver; + + /// + /// Used to remove a filter driver that was added with RegisterFilterDriver(). + /// + EFI_DATA_HUB_UNREGISTER_FILTER_DRIVER UnregisterFilterDriver; +}; + +extern EFI_GUID gEfiDataHubProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/FirmwareVolume.h b/IntelFrameworkPkg/Include/Protocol/FirmwareVolume.h new file mode 100644 index 000000000..8c19f0192 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/FirmwareVolume.h @@ -0,0 +1,346 @@ +/** @file + This file declares the Firmware Volume Protocol. + + The Firmware Volume Protocol provides file-level access to the firmware volume. + Each firmware volume driver must produce an instance of the Firmware Volume + Protocol if the firmware volume is to be visible to the system. The Firmware + Volume Protocol also provides mechanisms for determining and modifying some + attributes of the firmware volume. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This protocol is defined in Firmware Volume specification. + Version 0.9. + +**/ + +#ifndef _FIRMWARE_VOLUME_H_ +#define _FIRMWARE_VOLUME_H_ + + +// +// Firmware Volume Protocol GUID definition +// +#define EFI_FIRMWARE_VOLUME_PROTOCOL_GUID \ + { \ + 0x389F751F, 0x1838, 0x4388, {0x83, 0x90, 0xCD, 0x81, 0x54, 0xBD, 0x27, 0xF8 } \ + } + +#define FV_DEVICE_SIGNATURE SIGNATURE_32 ('_', 'F', 'V', '_') + +typedef struct _EFI_FIRMWARE_VOLUME_PROTOCOL EFI_FIRMWARE_VOLUME_PROTOCOL; + +// +// FRAMEWORK_EFI_FV_ATTRIBUTES bit definitions +// +typedef UINT64 FRAMEWORK_EFI_FV_ATTRIBUTES; + +// +// ************************************************************ +// FRAMEWORK_EFI_FV_ATTRIBUTES bit definitions +// ************************************************************ +// +#define EFI_FV_READ_DISABLE_CAP 0x0000000000000001ULL +#define EFI_FV_READ_ENABLE_CAP 0x0000000000000002ULL +#define EFI_FV_READ_STATUS 0x0000000000000004ULL + +#define EFI_FV_WRITE_DISABLE_CAP 0x0000000000000008ULL +#define EFI_FV_WRITE_ENABLE_CAP 0x0000000000000010ULL +#define EFI_FV_WRITE_STATUS 0x0000000000000020ULL + +#define EFI_FV_LOCK_CAP 0x0000000000000040ULL +#define EFI_FV_LOCK_STATUS 0x0000000000000080ULL +#define EFI_FV_WRITE_POLICY_RELIABLE 0x0000000000000100ULL + +#define EFI_FV_ALIGNMENT_CAP 0x0000000000008000ULL +#define EFI_FV_ALIGNMENT_2 0x0000000000010000ULL +#define EFI_FV_ALIGNMENT_4 0x0000000000020000ULL +#define EFI_FV_ALIGNMENT_8 0x0000000000040000ULL +#define EFI_FV_ALIGNMENT_16 0x0000000000080000ULL +#define EFI_FV_ALIGNMENT_32 0x0000000000100000ULL +#define EFI_FV_ALIGNMENT_64 0x0000000000200000ULL +#define EFI_FV_ALIGNMENT_128 0x0000000000400000ULL +#define EFI_FV_ALIGNMENT_256 0x0000000000800000ULL +#define EFI_FV_ALIGNMENT_512 0x0000000001000000ULL +#define EFI_FV_ALIGNMENT_1K 0x0000000002000000ULL +#define EFI_FV_ALIGNMENT_2K 0x0000000004000000ULL +#define EFI_FV_ALIGNMENT_4K 0x0000000008000000ULL +#define EFI_FV_ALIGNMENT_8K 0x0000000010000000ULL +#define EFI_FV_ALIGNMENT_16K 0x0000000020000000ULL +#define EFI_FV_ALIGNMENT_32K 0x0000000040000000ULL +#define EFI_FV_ALIGNMENT_64K 0x0000000080000000ULL + +// +// Protocol API definitions +// + +/** + Retrieves attributes, insures positive polarity of attribute bits, and returns + resulting attributes in an output parameter. + + @param This Indicates the EFI_FIRMWARE_VOLUME_PROTOCOL instance. + @param Attributes Output buffer containing attributes. + + @retval EFI_SUCCESS The firmware volume attributes were returned. +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_FV_GET_ATTRIBUTES)( + IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, + OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes + ); + +/** + Sets volume attributes + + @param This Indicates the EFI_FIRMWARE_VOLUME_PROTOCOL instance. + @param Attributes On input, Attributes is a pointer to an + EFI_FV_ATTRIBUTES containing the desired firmware + volume settings. On successful return, it contains + the new settings of the firmware volume. On + unsuccessful return, Attributes is not modified + and the firmware volume settings are not changed. + + @retval EFI_INVALID_PARAMETER A bit in Attributes was invalid. + @retval EFI_SUCCESS The requested firmware volume attributes were set + and the resulting EFI_FV_ATTRIBUTES is returned in + Attributes. + @retval EFI_ACCESS_DENIED The Device is locked and does not permit modification. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_FV_SET_ATTRIBUTES)( + IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, + IN OUT FRAMEWORK_EFI_FV_ATTRIBUTES *Attributes + ); + +/** + Read the requested file (NameGuid) or file information from the firmware volume + and returns data in Buffer. + + @param This The EFI_FIRMWARE_VOLUME_PROTOCOL instance. + @param NameGuid The pointer to EFI_GUID, which is the filename of + the file to read. + @param Buffer The pointer to pointer to buffer in which contents of file are returned. +
+ If Buffer is NULL, only type, attributes, and size + are returned as there is no output buffer. +
+ If Buffer != NULL and *Buffer == NULL, the output + buffer is allocated from BS pool by ReadFile. +
+ If Buffer != NULL and *Buffer != NULL, the output + buffer has been allocated by the caller and is being + passed in. + @param BufferSize On input: The buffer size. On output: The size + required to complete the read. + @param FoundType The pointer to the type of the file whose data + is returned. + @param FileAttributes The pointer to attributes of the file whose data + is returned. + @param AuthenticationStatus The pointer to the authentication status of the data. + + @retval EFI_SUCCESS The call completed successfully. + @retval EFI_WARN_BUFFER_TOO_SMALL The buffer is too small to contain the requested output. + The buffer filled, and the output is truncated. + @retval EFI_NOT_FOUND NameGuid was not found in the firmware volume. + @retval EFI_DEVICE_ERROR A hardware error occurred when attempting to + access the firmware volume. + @retval EFI_ACCESS_DENIED The firmware volume is configured to disallow reads. + @retval EFI_OUT_OF_RESOURCES An allocation failure occurred. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_FV_READ_FILE)( + IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, + IN EFI_GUID *NameGuid, + IN OUT VOID **Buffer, + IN OUT UINTN *BufferSize, + OUT EFI_FV_FILETYPE *FoundType, + OUT EFI_FV_FILE_ATTRIBUTES *FileAttributes, + OUT UINT32 *AuthenticationStatus + ); + +/** + Read the requested section from the specified file and returns data in Buffer. + + @param This Indicates the EFI_FIRMWARE_VOLUME_PROTOCOL instance. + @param NameGuid Filename identifying the file from which to read. + @param SectionType The section type to retrieve. + @param SectionInstance The instance of SectionType to retrieve. + @param Buffer Pointer to pointer to buffer in which contents of + a file are returned. +
+ If Buffer is NULL, only type, attributes, and size + are returned as there is no output buffer. +
+ If Buffer != NULL and *Buffer == NULL, the output + buffer is allocated from BS pool by ReadFile. +
+ If Buffer != NULL and *Buffer != NULL, the output + buffer has been allocated by the caller and is being + passed in. + @param BufferSize The pointer to the buffer size passed in, and on + output the size required to complete the read. + @param AuthenticationStatus The pointer to the authentication status of the data. + + @retval EFI_SUCCESS The call completed successfully. + @retval EFI_WARN_BUFFER_TOO_SMALL The buffer is too small to contain the requested output. + The buffer is filled and the output is truncated. + @retval EFI_OUT_OF_RESOURCES An allocation failure occurred. + @retval EFI_NOT_FOUND The name was not found in the firmware volume. + @retval EFI_DEVICE_ERROR A hardware error occurred when attempting to + access the firmware volume. + @retval EFI_ACCESS_DENIED The firmware volume is configured to disallow reads. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_FV_READ_SECTION)( + IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, + IN EFI_GUID *NameGuid, + IN EFI_SECTION_TYPE SectionType, + IN UINTN SectionInstance, + IN OUT VOID **Buffer, + IN OUT UINTN *BufferSize, + OUT UINT32 *AuthenticationStatus + ); + +typedef UINT32 FRAMEWORK_EFI_FV_WRITE_POLICY; + +#define FRAMEWORK_EFI_FV_UNRELIABLE_WRITE 0x00000000 +#define FRAMEWORK_EFI_FV_RELIABLE_WRITE 0x00000001 + +typedef struct { + EFI_GUID *NameGuid; + EFI_FV_FILETYPE Type; + EFI_FV_FILE_ATTRIBUTES FileAttributes; + VOID *Buffer; + UINT32 BufferSize; +} FRAMEWORK_EFI_FV_WRITE_FILE_DATA; + +/** + Write the supplied file (NameGuid) to the FV. + + @param This Indicates the EFI_FIRMWARE_VOLUME_PROTOCOL instance. + @param NumberOfFiles Indicates the number of file records pointed to + by FileData. + @param WritePolicy Indicates the level of reliability of the write + with respect to things like power failure events. + @param FileData A pointer to an array of EFI_FV_WRITE_FILE_DATA + structures. Each element in the array indicates + a file to write, and there are NumberOfFiles + elements in the input array. + + @retval EFI_SUCCESS The write completed successfully. + @retval EFI_OUT_OF_RESOURCES The firmware volume does not have enough free + space to store file(s). + @retval EFI_DEVICE_ERROR A hardware error occurred when attempting to + access the firmware volume. + @retval EFI_WRITE_PROTECTED The firmware volume is configured to disallow writes. + @retval EFI_NOT_FOUND A delete was requested, but the requested file was + not found in the firmware volume. + @retval EFI_INVALID_PARAMETER A delete was requested with a multiple file write. + An unsupported WritePolicy was requested. + An unknown file type was specified. + A file system specific error has occurred. +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_FV_WRITE_FILE)( + IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, + IN UINT32 NumberOfFiles, + IN FRAMEWORK_EFI_FV_WRITE_POLICY WritePolicy, + IN FRAMEWORK_EFI_FV_WRITE_FILE_DATA *FileData + ); + +/** + Given the input key, search for the next matching file in the volume. + + @param This Indicates the EFI_FIRMWARE_VOLUME_PROTOCOL instance. + @param Key Pointer to a caller allocated buffer that contains + an implementation-specific key that is used to track + where to begin searching on successive calls. + @param FileType The pointer to the file type to filter for. + @param NameGuid The pointer to Guid filename of the file found. + @param Attributes The pointer to Attributes of the file found. + @param Size The pointer to Size in bytes of the file found. + + @retval EFI_SUCCESS The output parameters are filled with data obtained from + the first matching file that was found. + @retval EFI_NOT_FOUND No files of type FileType were found. + @retval EFI_DEVICE_ERROR A hardware error occurred when attempting to access + the firmware volume. + @retval EFI_ACCESS_DENIED The firmware volume is configured to disallow reads. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_FV_GET_NEXT_FILE)( + IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, + IN OUT VOID *Key, + IN OUT EFI_FV_FILETYPE *FileType, + OUT EFI_GUID *NameGuid, + OUT EFI_FV_FILE_ATTRIBUTES *Attributes, + OUT UINTN *Size + ); + +// +// Protocol interface structure +// +struct _EFI_FIRMWARE_VOLUME_PROTOCOL { + /// + /// Retrieves volume capabilities and current settings. + /// + FRAMEWORK_EFI_FV_GET_ATTRIBUTES GetVolumeAttributes; + + /// + /// Modifies the current settings of the firmware volume. + /// + FRAMEWORK_EFI_FV_SET_ATTRIBUTES SetVolumeAttributes; + + /// + /// Reads an entire file from the firmware volume. + /// + FRAMEWORK_EFI_FV_READ_FILE ReadFile; + + /// + /// Reads a single section from a file into a buffer. + /// + FRAMEWORK_EFI_FV_READ_SECTION ReadSection; + + /// + /// Writes an entire file into the firmware volume. + /// + FRAMEWORK_EFI_FV_WRITE_FILE WriteFile; + + /// + /// Provides service to allow searching the firmware volume. + /// + FRAMEWORK_EFI_FV_GET_NEXT_FILE GetNextFile; + + /// + /// Data field that indicates the size in bytes of the Key input buffer for + /// the GetNextFile() API. + /// + UINT32 KeySize; + + /// + /// Handle of the parent firmware volume. + /// + EFI_HANDLE ParentHandle; +}; + +extern EFI_GUID gEfiFirmwareVolumeProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/FrameworkFirmwareVolumeBlock.h b/IntelFrameworkPkg/Include/Protocol/FrameworkFirmwareVolumeBlock.h new file mode 100644 index 000000000..3468ceb38 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/FrameworkFirmwareVolumeBlock.h @@ -0,0 +1,353 @@ +/** @file + This file provides control over block-oriented firmware devices. + +Copyright (c) 2006 - 2010, 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 that 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. + + @par Revision Reference: + This protocol is defined in framework spec: Firmware Volume Block Specification. + +**/ + +#ifndef __FRAMEWORK_FIRMWARE_VOLUME_BLOCK_H__ +#define __FRAMEWORK_FIRMWARE_VOLUME_BLOCK_H__ + +#define FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID \ +{ 0xDE28BC59, 0x6228, 0x41BD, {0xBD, 0xF6, 0xA3, 0xB9, 0xAD,0xB5, 0x8D, 0xA1 } } + +typedef struct _FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL; +/// +/// The type of EFI FVB attribute per the Framework specification. +/// +typedef UINT32 EFI_FVB_ATTRIBUTES; + +/** + The GetAttributes() function retrieves the attributes and + current settings of the block. + + @param This Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance. + + @param Attributes Pointer to EFI_FVB_ATTRIBUTES in which the + attributes and current settings are + returned. + + @retval EFI_SUCCESS The firmware volume attributes were + returned. + +**/ +typedef +EFI_STATUS +(EFIAPI * FRAMEWORK_EFI_FVB_GET_ATTRIBUTES)( + IN FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + OUT EFI_FVB_ATTRIBUTES *Attributes +); + + +/** + The SetAttributes() function sets configurable firmware volume + attributes and returns the new settings of the firmware volume. + + @param This Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance. + + @param Attributes On input, Attributes is a pointer to + EFI_FVB_ATTRIBUTES that contains the + desired firmware volume settings. On + successful return, it contains the new + settings of the firmware volume. + + @retval EFI_SUCCESS The firmware volume attributes were returned. + + @retval EFI_INVALID_PARAMETER The attributes requested are in + conflict with the capabilities + as declared in the firmware + volume header. + +**/ +typedef +EFI_STATUS +(EFIAPI * FRAMEWORK_EFI_FVB_SET_ATTRIBUTES)( + IN FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + IN OUT EFI_FVB_ATTRIBUTES *Attributes +); + + +/** + The GetPhysicalAddress() function retrieves the base address of + a memory-mapped firmware volume. This function should be called + only for memory-mapped firmware volumes. + + @param This Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance. + + @param Address Pointer to a caller-allocated + EFI_PHYSICAL_ADDRESS that, on successful + return from GetPhysicalAddress(), contains the + base address of the firmware volume. + + @retval EFI_SUCCESS The firmware volume base address is returned. + + @retval EFI_NOT_SUPPORTED The firmware volume is not memory mapped. + +**/ +typedef +EFI_STATUS +(EFIAPI * FRAMEWORK_EFI_FVB_GET_PHYSICAL_ADDRESS)( + IN FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + OUT EFI_PHYSICAL_ADDRESS *Address +); + +/** + The GetBlockSize() function retrieves the size of the requested + block. It also returns the number of additional blocks with + the identical size. The GetBlockSize() function is used to + retrieve the block map (see EFI_FIRMWARE_VOLUME_HEADER). + + + @param This Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance. + + @param Lba Indicates the block for which to return the size. + + @param BlockSize The pointer to a caller-allocated UINTN in which + the size of the block is returned. + + @param NumberOfBlocks The pointer to a caller-allocated UINTN in + which the number of consecutive blocks, + starting with Lba, is returned. All + blocks in this range have a size of + BlockSize. + + + @retval EFI_SUCCESS The firmware volume base address was returned. + + @retval EFI_INVALID_PARAMETER The requested LBA is out of range. + +**/ +typedef +EFI_STATUS +(EFIAPI * FRAMEWORK_EFI_FVB_GET_BLOCK_SIZE)( + IN FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + IN EFI_LBA Lba, + OUT UINTN *BlockSize, + OUT UINTN *NumberOfBlocks +); + + +/** + Reads the specified number of bytes into a buffer from the specified block. + + The Read() function reads the requested number of bytes from the + requested block and stores them in the provided buffer. + Implementations should be mindful that the firmware volume + might be in the ReadDisabled state. If it is in this state, + the Read() function must return the status code + EFI_ACCESS_DENIED without modifying the contents of the + buffer. The Read() function must also prevent spanning block + boundaries. If a read is requested that would span a block + boundary, the read must read up to the boundary but not + beyond. The output parameter NumBytes must be set to correctly + indicate the number of bytes actually read. The caller must be + aware that a read may be partially completed. + + @param This Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance. + + @param Lba The starting logical block index + from which to read. + + @param Offset Offset into the block at which to begin reading. + + @param NumBytes The pointer to a UINTN. At entry, *NumBytes + contains the total size of the buffer. At + exit, *NumBytes contains the total number of + bytes read. + + @param Buffer The pointer to a caller-allocated buffer that will + be used to hold the data that is read. + + @retval EFI_SUCCESS The firmware volume was read successfully + and contents are in Buffer. + + @retval EFI_BAD_BUFFER_SIZE A read was attempted across an LBA + boundary. On output, NumBytes + contains the total number of bytes + returned in Buffer. + + @retval EFI_ACCESS_DENIED The firmware volume is in the + ReadDisabled state. + + @retval EFI_DEVICE_ERROR The block device is not + functioning correctly and could + not be read. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_FVB_READ)( + IN FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN OUT UINT8 *Buffer +); + +/** + Writes the specified number of bytes from the input buffer to the block. + + The Write() function writes the specified number of bytes from + the provided buffer to the specified block and offset. If the + firmware volume is sticky write, the caller must ensure that + all the bits of the specified range to write are in the + EFI_FVB_ERASE_POLARITY state before calling the Write() + function, or else the result will be unpredictable. This + unpredictability arises because, for a sticky-write firmware + volume, a write may negate a bit in the EFI_FVB_ERASE_POLARITY + state but cannot flip it back again. In general, before + calling the Write() function, the caller should call the + EraseBlocks() function first to erase the specified block to + write. A block erase cycle will transition bits from the + (NOT)EFI_FVB_ERASE_POLARITY state back to the + EFI_FVB_ERASE_POLARITY state. Implementors should note + that the firmware volume might be in the WriteDisabled + state. If it is in this state, the Write() function must + return the status code EFI_ACCESS_DENIED without modifying the + contents of the firmware volume. The Write() function must + also prevent spanning block boundaries. If a write is + requested that spans a block boundary, the write must store up + to the boundary but not beyond. The output parameter NumBytes + must be set to correctly indicate the number of bytes actually + written. The caller must be aware that a write may be + partially completed. All writes, partial or otherwise, must be + fully flushed to the hardware before the Write() service + returns. + + @param This Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance. + + @param Lba The starting logical block index to write to. + + @param Offset Offset into the block at which to begin writing. + + @param NumBytes The pointer to a UINTN. Input: the total size of the buffer. + Output: the total number of bytes actually written. + + @param Buffer The pointer to a caller-allocated buffer that + contains the source for the write. + + @retval EFI_SUCCESS The firmware volume was written successfully. + + @retval EFI_BAD_BUFFER_SIZE The write was attempted across an + LBA boundary. On output, NumBytes + contains the total number of bytes + actually written. + + @retval EFI_ACCESS_DENIED The firmware volume is in the + WriteDisabled state. + + @retval EFI_DEVICE_ERROR The block device is malfunctioning + and could not be written. + + +**/ +typedef +EFI_STATUS +(EFIAPI * FRAMEWORK_EFI_FVB_WRITE)( + IN FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer +); + + + + +/// +/// EFI_LBA_LIST_TERMINATOR. +/// +#define FRAMEWORK_EFI_LBA_LIST_TERMINATOR 0xFFFFFFFFFFFFFFFFULL + + +/** + Erases and initializes a firmware volume block. + + The EraseBlocks() function erases one or more blocks as denoted + by the variable argument list. The entire parameter list of + blocks must be verified before erasing any blocks. If a block is + requested that does not exist within the associated firmware + volume (it has a larger index than the last block of the + firmware volume), the EraseBlocks() function must return the + status code EFI_INVALID_PARAMETER without modifying the contents + of the firmware volume. Implementors should note that + the firmware volume might be in the WriteDisabled state. If it + is in this state, the EraseBlocks() function must return the + status code EFI_ACCESS_DENIED without modifying the contents of + the firmware volume. All calls to EraseBlocks() must be fully + flushed to the hardware before the EraseBlocks() service + returns. + + @param This Indicates the FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL + instance. + + @param ... A list of tuples. + Each tuple describes a range of LBAs to erase + and consists of the following: + - An EFI_LBA that indicates the starting LBA + - A UINTN that indicates the number of blocks to + erase + + The list is terminated with an + EFI_LBA_LIST_TERMINATOR. For example, the + following indicates that two ranges of blocks + (5-7 and 10-11) are to be erased: EraseBlocks + (This, 5, 3, 10, 2, EFI_LBA_LIST_TERMINATOR); + + @retval EFI_SUCCESS The erase request successfully + completed. + + @retval EFI_ACCESS_DENIED The firmware volume is in the + WriteDisabled state. + @retval EFI_DEVICE_ERROR The block device is not functioning + correctly and could not be written. + The firmware device may have been + partially erased. + @retval EFI_INVALID_PARAMETER One or more of the LBAs listed + in the variable argument list do + not exist in the firmware volume. + +**/ +typedef +EFI_STATUS +(EFIAPI * FRAMEWORK_EFI_FVB_ERASE_BLOCKS)( + IN FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + ... +); + +/// +/// The Firmware Volume Block Protocol is the low-level interface +/// to a firmware volume. File-level access to a firmware volume +/// should not be done using the Firmware Volume Block Protocol. +/// Normal access to a firmware volume must use the Firmware +/// Volume Protocol. Typically, only the file system driver that +/// produces the Firmware Volume Protocol will bind to the +/// Firmware Volume Block Protocol. +/// +struct _FRAMEWORK_EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL { + FRAMEWORK_EFI_FVB_GET_ATTRIBUTES GetAttributes; + FRAMEWORK_EFI_FVB_SET_ATTRIBUTES SetAttributes; + FRAMEWORK_EFI_FVB_GET_PHYSICAL_ADDRESS GetPhysicalAddress; + FRAMEWORK_EFI_FVB_GET_BLOCK_SIZE GetBlockSize; + FRAMEWORK_EFI_FVB_READ Read; + FRAMEWORK_EFI_FVB_WRITE Write; + FRAMEWORK_EFI_FVB_ERASE_BLOCKS EraseBlocks; + /// + /// The handle of the parent firmware volume. + /// + EFI_HANDLE ParentHandle; +}; + +extern EFI_GUID gFramerworkEfiFirmwareVolumeBlockProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/FrameworkFormBrowser.h b/IntelFrameworkPkg/Include/Protocol/FrameworkFormBrowser.h new file mode 100644 index 000000000..74c25e273 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/FrameworkFormBrowser.h @@ -0,0 +1,175 @@ +/** @file + The EFI_FORM_BROWSER_PROTOCOL is the interface to the EFI + Configuration Driver. This interface enables the caller to direct the + configuration driver to use either the HII database or the passed-in + packet of data. This will also allow the caller to post messages + into the configuration drivers internal mailbox. + +Copyright (c) 2006 - 2010, 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 that 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: FrameworkFormBrowser.h + + @par Revision Reference: + This protocol is defined in HII spec 0.92. + +**/ + +#ifndef __FRAMEWORK_FORM_BROWSER_H__ +#define __FRAMEWORK_FORM_BROWSER_H__ + +#include + + +#define EFI_FORM_BROWSER_PROTOCOL_GUID \ + { \ + 0xe5a1333e, 0xe1b4, 0x4d55, {0xce, 0xeb, 0x35, 0xc3, 0xef, 0x13, 0x34, 0x43 } \ + } + +#define EFI_FORM_BROWSER_COMPATIBILITY_PROTOCOL_GUID \ + { \ + 0xfb7c852, 0xadca, 0x4853, { 0x8d, 0xf, 0xfb, 0xa7, 0x1b, 0x1c, 0xe1, 0x1a } \ + } + +typedef struct _EFI_FORM_BROWSER_PROTOCOL EFI_FORM_BROWSER_PROTOCOL; + +typedef struct { + UINT32 Length; + UINT16 Type; + UINT8 Data[1]; +} EFI_HII_PACKET; + +typedef struct { + EFI_HII_IFR_PACK *IfrData; + EFI_HII_STRING_PACK *StringData; +} EFI_IFR_PACKET; + +typedef struct { + UINTN LeftColumn; + UINTN RightColumn; + UINTN TopRow; + UINTN BottomRow; +} FRAMEWORK_EFI_SCREEN_DESCRIPTOR; + +/** + Provides direction to the configuration driver whether to use the HII + database or a passed-in set of data. This function also establishes a + pointer to the calling driver's callback interface. + + @param This A pointer to the EFI_FORM_BROWSER_PROTOCOL instance. + @param UseDatabase Determines whether the HII database is to be + used to gather information. If the value is FALSE, + the configuration driver will get the information + provided in the passed-in Packet parameters. + @param Handle A pointer to an array of HII handles to display. + This value should correspond to the value of the + HII form package that is required to be displayed. + @param HandleCount The number of handles in the array specified by Handle. + @param Packet A pointer to a set of data containing pointers to IFR + and/or string data. + @param CallbackHandle The handle to the driver's callback interface. + This parameter is used only when the UseDatabase + parameter is FALSE and an application wants to + register a callback with the browser. + @param NvMapOverride This buffer is used only when there is no NV variable + to define the current settings and the caller needs + to provide to the browser the current settings for + the "fake" NV variable. + @param ScreenDimensions Allows the browser to be called so that it occupies + a portion of the physical screen instead of dynamically + determining the screen dimensions. + @param ResetRequired This BOOLEAN value denotes whether a reset is required + based on the data that might have been changed. + The ResetRequired parameter is primarily applicable + for configuration applications, and is an + optional parameter. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_NOT_FOUND The variable was not found. + @retval EFI_BUFFER_TOO_SMALL The DataSize is too small for the result. + DataSize has been updated with the size needed to + complete the request. + @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value. + @retval EFI_DEVICE_ERROR The variable could not be saved due to a hardware failure. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SEND_FORM)( + IN EFI_FORM_BROWSER_PROTOCOL *This, + IN BOOLEAN UseDatabase, + IN FRAMEWORK_EFI_HII_HANDLE *Handle, + IN UINTN HandleCount, + IN EFI_IFR_PACKET *Packet, OPTIONAL + IN EFI_HANDLE CallbackHandle, OPTIONAL + IN UINT8 *NvMapOverride, OPTIONAL + IN FRAMEWORK_EFI_SCREEN_DESCRIPTOR *ScreenDimensions, OPTIONAL + OUT BOOLEAN *ResetRequired OPTIONAL + ); + +/** + Routine used to abstract a generic dialog interface and return the selected + key or string. + + @param NumberOfLines The number of lines for the dialog box. + @param HotKey Defines whether a single character is parsed (TRUE) + and returned in KeyValue, or if a string is returned + in StringBuffer. + @param MaximumStringSize The maximum size in bytes of a typed-in string. + Because each character is a CHAR16, the minimum + string returned is two bytes. + @param StringBuffer The passed-in pointer to the buffer that will hold + the typed in string if HotKey is FALSE. + @param KeyValue The EFI_INPUT_KEY value returned if HotKey is TRUE. + @param String The pointer to the first string in the list of strings + that comprise the dialog box. + @param ... A series of NumberOfLines text strings that will be used + to construct the dialog box. + + @retval EFI_SUCCESS The dialog was displayed and user interaction was received. + @retval EFI_DEVICE_ERROR The user typed in an ESC character to exit the routine. + @retval EFI_INVALID_PARAMETER One of the parameters was invalid + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_CREATE_POP_UP)( + IN UINTN NumberOfLines, + IN BOOLEAN HotKey, + IN UINTN MaximumStringSize, + OUT CHAR16 *StringBuffer, + OUT EFI_INPUT_KEY *KeyValue, + IN CHAR16 *String, + ... + ); + +/** + The EFI_FORM_BROWSER_PROTOCOL is the interface to call for drivers to + leverage the EFI configuration driver interface. +**/ +struct _EFI_FORM_BROWSER_PROTOCOL { + /// + /// Provides direction to the configuration driver whether to use the HII + /// database or to use a passed-in set of data. This function also establishes + /// a pointer to the calling driver's callback interface. + /// + EFI_SEND_FORM SendForm; + + /// + /// Routine used to abstract a generic dialog interface and return the + /// selected key or string. + /// + EFI_CREATE_POP_UP CreatePopUp; +}; + +extern EFI_GUID gEfiFormBrowserProtocolGuid; +extern EFI_GUID gEfiFormBrowserCompatibilityProtocolGuid; + + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/FrameworkFormCallback.h b/IntelFrameworkPkg/Include/Protocol/FrameworkFormCallback.h new file mode 100644 index 000000000..2d769bc3b --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/FrameworkFormCallback.h @@ -0,0 +1,222 @@ +/** @file + The EFI_FORM_CALLBACK_PROTOCOL is the defined interface for access to custom + NV storage devices and for communication of user selections in a more + interactive environment. This protocol should be published by hardware + specific drivers that want to export access to custom hardware storage or + publish IFR that need to call back the original driver. + +Copyright (c) 2006 - 2010, 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 that 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. + + @par Revision Reference: + This protocol is defined in HII spec 0.92. + +**/ + +#ifndef __FRAMEWORK_FORM_CALLBACK_H__ +#define __FRAMEWORK_FORM_CALLBACK_H__ + +#include +#include + +#define EFI_FORM_CALLBACK_PROTOCOL_GUID \ + { \ + 0xf3e4543d, 0xcf35, 0x6cef, {0x35, 0xc4, 0x4f, 0xe6, 0x34, 0x4d, 0xfc, 0x54 } \ + } + +// +// Forward reference for pure ANSI compatability +// +typedef struct _EFI_FORM_CALLBACK_PROTOCOL EFI_FORM_CALLBACK_PROTOCOL; + +/// +/// Inconsistent with specification here: +/// RESET_REQUIRED, EXIT_REQUIRED, SAVE_REQUIRED, NV_CHANGED and NV_NOT_CHANGED are not +/// defined in HII specification. These Flags of EFI_IFR_DATA_ENTRY should be defined +/// to describe the standard behavior of the browser after the callback. +/// +/// If this flag is set, the browser will exit and reset after processing callback results. +/// +#define RESET_REQUIRED 1 +/// +/// If this flag is set, the browser will exit after processing callback results. +/// +#define EXIT_REQUIRED 2 +/// +/// If this flag is set, the browser will save the NV data after processing callback results. +/// +#define SAVE_REQUIRED 4 +/// +/// If this flag is set, the browser will turn the NV flag on after processing callback results. +/// +#define NV_CHANGED 8 +/// +/// If this flag is set, the browser will turn the NV flag off after processing callback results. +/// +#define NV_NOT_CHANGED 16 + +#pragma pack(1) +typedef struct { + UINT8 OpCode; ///< Likely a string, numeric, or one-of + UINT8 Length; ///< Length of the EFI_IFR_DATA_ENTRY packet. + UINT16 Flags; ///< Flags settings to determine what behavior is desired from the browser after the callback. + VOID *Data; ///< The data in the form based on the op-code type. This is not a pointer to the data; the data follows immediately. + /// + /// If the OpCode is a OneOf or Numeric type - Data is a UINT16 value. + /// If the OpCode is a String type - Data is a CHAR16[x] type. + /// If the OpCode is a Checkbox type - Data is a UINT8 value. + /// If the OpCode is a NV Access type - Data is a EFI_IFR_NV_DATA structure. + /// +} EFI_IFR_DATA_ENTRY; + +typedef struct { + VOID *NvRamMap; ///< If the flag of the op-code specified retrieval of a copy of the NVRAM map. + // + // this is a pointer to a buffer copy + // + UINT32 EntryCount; ///< Number of EFI_IFR_DATA_ENTRY entries. + // + // EFI_IFR_DATA_ENTRY Data[1]; // The in-line Data entries. + // +} EFI_IFR_DATA_ARRAY; + + +typedef union { + EFI_IFR_DATA_ARRAY DataArray; ///< Primarily used by those that call back to their drivers and use HII as a repository. + EFI_IFR_PACKET DataPacket; ///< Primarily used by those that do not use HII as a repository. + CHAR16 String[1]; ///< If returning an error - fill the string with null-terminated contents. +} EFI_HII_CALLBACK_PACKET; + +typedef struct { + FRAMEWORK_EFI_IFR_OP_HEADER Header; + UINT16 QuestionId; ///< Offset into the map. + UINT8 StorageWidth; ///< Width of the value. + // + // CHAR8 Data[1]; // The Data itself + // +} EFI_IFR_NV_DATA; + +#pragma pack() +// +// The following types are currently defined: +// +/** + Returns the value of a variable. + + @param This A pointer to the EFI_FORM_CALLBACK_PROTOCOL instance. + @param VariableName A NULL-terminated Unicode string that is the + name of the vendor's variable. + @param VendorGuid A unique identifier for the vendor. + @param Attributes If not NULL, a pointer to the memory location to + return the attribute's bit-mask for the variable. + @param DataSize The size in bytes of the Buffer. A size of zero causes + the variable to be deleted. + @param Buffer The buffer to return the contents of the variable. + + @retval EFI_SUCCESS The function completed successfully. + @retval EFI_NOT_FOUND The variable was not found. + @retval EFI_BUFFER_TOO_SMALL The DataSize is too small for the result. + DataSize has been updated with the size needed to complete the request. + @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value. + @retval EFI_DEVICE_ERROR The variable could not be saved due to a hardware failure. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_NV_READ)( + IN EFI_FORM_CALLBACK_PROTOCOL *This, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Buffer + ); + +/** + Sets the value of a variable. + + @param This A pointer to the EFI_FORM_CALLBACK_PROTOCOL instance. + @param VariableName A NULL-terminated Unicode string that is the + name of the vendor's variable. Each VariableName + is unique for each VendorGuid. + @param VendorGuid A unique identifier for the vendor. + @param Attributes Attributes bit-mask to set for the variable. + Inconsistent with specification here: + Attributes data type has been changed from + UINT32 * to UINT32, because the input parameter is + not necessary to use a pointer date type. + @param DataSize The size in bytes of the Buffer. A size of zero causes + the variable to be deleted. + @param Buffer The buffer containing the contents of the variable. + @param ResetRequired Returns a value from the driver that abstracts this + information and will enable a system to know if a + system reset is required to achieve the configuration + changes being enabled through this function. + + @retval EFI_SUCCESS The firmware has successfully stored the variable and + its data as defined by the Attributes. + @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold + the variable and its data. + @retval EFI_INVALID_PARAMETER An invalid combination of Attributes bits + was supplied, or the DataSize exceeds the maximum allowed. + @retval EFI_DEVICE_ERROR The variable could not be saved due to a hardware failure. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_NV_WRITE)( + IN EFI_FORM_CALLBACK_PROTOCOL *This, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN UINT32 Attributes, + IN UINTN DataSize, + IN VOID *Buffer, + OUT BOOLEAN *ResetRequired + ); + +/** + This function is called to provide results data to the driver. + + @param This A pointer to the EFI_FORM_CALLBACK_PROTOCOL instance. + @param KeyValue A unique value which is sent to the original exporting + driver so that it can identify the type of data + to expect. The format of the data tends to vary based + on the opcode that generated the callback. + @param Data A pointer to the data being sent to the original exporting driver. + @param Packet A pointer to a packet of information that a driver passes + back to the browser. + + @return Status Code + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_FORM_CALLBACK)( + IN EFI_FORM_CALLBACK_PROTOCOL *This, + IN UINT16 KeyValue, + IN EFI_IFR_DATA_ARRAY *Data, + OUT EFI_HII_CALLBACK_PACKET **Packet + ); + +/** + The EFI_FORM_CALLBACK_PROTOCOL is the defined interface for access to + custom NVS devices as well as communication of user selections in a more + interactive environment. This protocol should be published by platform-specific + drivers that want to export access to custom hardware storage or publish IFR + that has a requirement to call back the original driver. +**/ +struct _EFI_FORM_CALLBACK_PROTOCOL { + EFI_NV_READ NvRead; ///< The read operation to access the NV data serviced by a hardware-specific driver. + EFI_NV_WRITE NvWrite; ///< The write operation to access the NV data serviced by a hardware-specific driver. + EFI_FORM_CALLBACK Callback; ///< The function that is called from the configuration browser to communicate key value pairs. +}; + +extern EFI_GUID gEfiFormCallbackProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/FrameworkHii.h b/IntelFrameworkPkg/Include/Protocol/FrameworkHii.h new file mode 100644 index 000000000..9f32805f8 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/FrameworkHii.h @@ -0,0 +1,1032 @@ +/** @file + This file defines the Human Interface Infrastructure protocol, which is + used by resources that want to publish IFR/Font/String data and have it + collected by the Configuration engine. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This protocol is defined in Framework for EFI Human Interface Infrastructure + Specification Version 0.92. + +**/ + +#ifndef _FRAMEWORK_HII_H_ +#define _FRAMEWORK_HII_H_ + +// +// EFI_GRAPHICS_OUTPUT_BLT_PIXEL is defined in MdePkg/Protocol/GraphicsOutput.h +// +#include +/// +/// In both EDK and EDK II, there is an incompatbile change in the Framework HII protocol. +/// This change should cause a change of GUID in both of code and HII specification. But we +/// updated the GUID in code in EDK and EDK II. The 0.92 specification is not updated. This +/// is a known issue. +/// +/// +/// Note that EFI_HII_PROTOCOL_GUID is different from that defined in the Framework HII +/// 0.92 specification because the specification changed part of HII interfaces but did not update the protocol +/// GUID. +/// +#define EFI_HII_PROTOCOL_GUID \ + { \ + 0xd7ad636e, 0xb997, 0x459b, {0xbf, 0x3f, 0x88, 0x46, 0x89, 0x79, 0x80, 0xe1} \ + } + +#define EFI_HII_COMPATIBILITY_PROTOCOL_GUID \ + { \ + 0x5542cce1, 0xdf5c, 0x4d1b, { 0xab, 0xca, 0x36, 0x4f, 0x77, 0xd3, 0x99, 0xfb } \ + } + +typedef UINT32 RELOFST; + +typedef struct _EFI_HII_PROTOCOL EFI_HII_PROTOCOL; + +/// +/// Note: Name difference between code and the Framework HII 0.92 specificaiton. +/// Add FRAMEWORK_ prefix to avoid a name confict with EFI_HII_HANDLE, defined in the +/// UEFI 2.1d specification. +/// +typedef UINT16 FRAMEWORK_EFI_HII_HANDLE; + +/// +/// HII package type values +/// +#define EFI_HII_FONT 1 +#define EFI_HII_STRING 2 +#define EFI_HII_IFR 3 +#define EFI_HII_KEYBOARD 4 +#define EFI_HII_HANDLES 5 +#define EFI_HII_VARIABLE 6 +#define EFI_HII_DEVICE_PATH 7 + +// +// References to string tokens must use this macro to enable scanning for +// token usages. +// +#define STRING_TOKEN(t) t + +// +// The following types are currently defined: +// EFI_FORM_ID has been defined in UEFI spec. +// +typedef UINT16 EFI_FORM_LABEL; + +#pragma pack(1) + +/// +/// The header found at the start of each package. +/// +typedef struct { + UINT32 Length; ///< The size of the package in bytes. + UINT16 Type; ///< The type of the package. +} EFI_HII_PACK_HEADER; + +/// +/// The IFR package structure. +/// Immediately following the EFI_HII_IFR_PACK structure will be a series of IFR opcodes. +/// +typedef struct { + EFI_HII_PACK_HEADER Header; ///< Header of the IFR package. +} EFI_HII_IFR_PACK; + +/// +/// HII Handle package structure. +/// +typedef struct { + /// + /// Header of the package. + /// + EFI_HII_PACK_HEADER Header; ///< Must be filled in. + /// + /// The image handle of the driver to which the package is referring. + /// + EFI_HANDLE ImageHandle; ///< Must be filled in. + /// + /// The handle of the device that is being described by this package. + /// + EFI_HANDLE DeviceHandle; ///< Optional. + /// + /// The handle of the parent of the device that is being described by this package. + /// + EFI_HANDLE ControllerHandle; ///< Optional. + /// + /// The handle that was registered to receive EFI_FORM_CALLBACK_PROTOCOL calls from other drivers. + /// + EFI_HANDLE CallbackHandle; ///< Optional. + /// + /// Note this field is not defined in the Framework HII 0.92 specificaiton. + /// Unused. Reserved for source code compatibility. + /// + EFI_HANDLE COBExportHandle; ///< Optional. +} EFI_HII_HANDLE_PACK; + +/// +/// The variable package structure. +/// +typedef struct { + /// + /// The header of the package. + /// + EFI_HII_PACK_HEADER Header; + /// + /// The GUID of the EFI variable. + /// + EFI_GUID VariableGuid; + /// + /// The length in bytes of the EFI variable. + /// + UINT32 VariableNameLength; + /// + /// The unique value for this variable. + /// + UINT16 VariableId; + // + // CHAR16 VariableName[]; //Null-terminated + // +} EFI_HII_VARIABLE_PACK; + +/// +/// The device path package structure. +/// +typedef struct { + /// + /// The header of the package. + /// + EFI_HII_PACK_HEADER Header; + // + // EFI_DEVICE_PATH DevicePath[]; + // +} EFI_HII_DEVICE_PATH_PACK; + +typedef struct { + /// + /// A unique value that correlates to the original HII handle. + /// + FRAMEWORK_EFI_HII_HANDLE HiiHandle; + /// + /// If an IFR pack exists in a data table that does not contain strings, + /// then the strings for that IFR pack are located in another data table + /// that contains a string pack and has a matching HiiDataTable.PackageGuid. + /// + EFI_GUID PackageGuid; + /// + /// The size of the EFI_HII_DATA_TABLE in bytes. + /// + UINT32 DataTableSize; + /// + /// The byte offset from the start of this structure to the IFR data. + /// If the offset value is 0, then no IFR data is enclosed. + /// + UINT32 IfrDataOffset; + /// + /// The byte offset from the start of this structure to the string data. + /// If the offset value is 0, then no string data is enclosed. + /// + UINT32 StringDataOffset; + /// + /// The byte offset from the start of this structure to the variable data. + /// If the offset value is 0, then no variable data is enclosed. + /// + UINT32 VariableDataOffset; + /// + /// The byte offset from the start of this structure to the device path data. + /// If the offset value is 0, then no DevicePath data is enclosed. + /// + UINT32 DevicePathOffset; + /// + /// The number of VariableData[] elements in the array. + /// + UINT32 NumberOfVariableData; + /// + /// The number of language string packages. + /// + UINT32 NumberOfLanguages; + // + // EFI_HII_DEVICE_PATH_PACK DevicePath[]; + // EFI_HII_VARIABLE_PACK VariableData[]; + // EFI_HII_IFR_PACK IfrData; + // EFI_HII_STRING_PACK StringData[]; + // +} EFI_HII_DATA_TABLE; + +/// +/// The structure defining the format for exporting data from the HII Database. +/// +typedef struct { + /// + /// Number of EFI_HII_DATA_TABLE entries. + /// + UINT32 NumberOfHiiDataTables; + /// + /// Defines the revision of the EFI_HII_DATA_TABLE structure. + /// + EFI_GUID Revision; + // + // EFI_HII_DATA_TABLE HiiDataTable[]; + // +} EFI_HII_EXPORT_TABLE; + +/// +/// The structure used to pass data to update a form or form package +/// that has previously been registered with the EFI HII database. +/// +typedef struct { + /// + /// If TRUE, indicates that the FormCallbackHandle value will + /// be used to update the contents of the CallBackHandle entry in the form set. + /// + BOOLEAN FormSetUpdate; + /// + /// This parameter is valid only when FormSetUpdate is TRUE. + /// The value in this parameter will be used to update the contents + /// of the CallbackHandle entry in the form set. + /// + EFI_PHYSICAL_ADDRESS FormCallbackHandle; + /// + /// If TRUE, indicates that the FormTitle contents will be + /// used to update the FormValue's title. + /// + BOOLEAN FormUpdate; + /// + /// Specifies which form is to be updated if the FormUpdate value is TRUE. + /// + UINT16 FormValue; + /// + /// This parameter is valid only when the FormUpdate parameter is TRUE. + /// The value in this parameter will be used to update the contents of the form title. + /// + STRING_REF FormTitle; + /// + /// The number of Data entries in this structure. + UINT16 DataCount; + /// + /// An array of 1+ opcodes, specified by DataCount. + /// + UINT8 *Data; +} EFI_HII_UPDATE_DATA; + +// +// String attributes +// +#define LANG_RIGHT_TO_LEFT 0x00000001 + +/// +/// A string package is used to localize strings to a particular +/// language. The package is associated with a particular driver +/// or set of drivers. Tools are used to associate tokens with +/// string references in forms and in programs. These tokens are +/// language agnostic. When paired with a language pack (directly +/// or indirectly), the string token resolves into an actual +/// UNICODE string. NumStringPointers determines how many +/// StringPointers (offset values) there are, as well as the total +/// number of Strings that are defined. +/// +typedef struct { + /// + /// The header of the package. + /// + EFI_HII_PACK_HEADER Header; + /// + /// The string containing one or more ISO 639-2 three-character designator(s) + /// of the language or languages whose translations are contained in this language pack. + /// The first designator indicates the primary language, while the others are secondary languages. + /// + RELOFST LanguageNameString; + /// + /// Contains the offset into this structure of a printable name of the language + /// for use when prompting the user. The language printed is to be the primary language. + /// + RELOFST PrintableLanguageName; + /// + /// The number of Strings and StringPointers contained within the string package. + /// + UINT32 NumStringPointers; + /// + /// Indicates the direction the language is to be printed. + /// + UINT32 Attributes; + // + // RELOFST StringPointers[]; + // EFI_STRING Strings[]; + // +} EFI_HII_STRING_PACK; + + +/// +/// A font list consists of a font header followed by a series +/// of glyph structures. Note that fonts are not language specific. +/// +typedef struct { + /// + /// The header of the package. + /// + EFI_HII_PACK_HEADER Header; + /// + /// The number of NarrowGlyphs that are included in the font package. + /// + UINT16 NumberOfNarrowGlyphs; + /// + /// The number of WideGlyphs that are included in the font package. + /// + UINT16 NumberOfWideGlyphs; + //EFI_NARROW_GLYPH NarrowGlyphs[]; + //EFI_WIDE_GLYPH WideGlyphs[]; +} EFI_HII_FONT_PACK; + +/// +/// The definition of a specific physical key +/// +/// Note: The name difference between code and the Framework HII 0.92 specification. +/// Add FRAMEWORK_ prefix to avoid name confict with EFI_KEY_DESCRIPTOR defined in the +/// UEFI 2.1d specification. +/// +typedef struct { + /// + /// Used to describe a physical key on a keyboard. + /// + EFI_KEY Key; + /// + /// The Unicode value for the Key. + CHAR16 Unicode; + /// + /// The Unicode value for the key with the shift key being held down. + /// + CHAR16 ShiftedUnicode; + /// + /// The Unicode value for the key with the Alt-GR being held down. + /// + CHAR16 AltGrUnicode; + /// + /// The Unicode value for the key with the Alt-GR and shift keys being held down. + /// + CHAR16 ShiftedAltGrUnicode; + /// + /// Modifier keys are defined to allow for special functionality that + /// is not necessarily accomplished by a printable character. + /// + UINT16 Modifier; +} FRAMEWORK_EFI_KEY_DESCRIPTOR; + +/// +/// This structure allows a sparse set of keys to be redefined +/// or a complete redefinition of the keyboard layout. Most +/// keyboards have a lot of commonality in their layouts, therefore +/// only defining those keys that need to change from the default +/// minimizes the passed in information. +/// +/// Additionally, when an update occurs, the active keyboard layout +/// will be switched to the newly updated keyboard layout. This +/// allows for situations that when a keyboard layout driver is +/// loaded as part of system initialization, the system will default +/// the keyboard behavior to the new layout. +/// +typedef struct { + /// + /// The header of the package. + EFI_HII_PACK_HEADER Header; + /// + /// A pointer to a buffer containing an array of EFI_KEY_DESCRIPTOR entries. + /// Each entry will reflect the definition of a specific physical key. + /// + FRAMEWORK_EFI_KEY_DESCRIPTOR *Descriptor; + /// + /// The number of Descriptor entries being described. + /// + UINT8 DescriptorCount; +} EFI_HII_KEYBOARD_PACK; + +/// +/// The packages structure that will be used to pass contents into the HII database. +/// +/// The EFI_HII_PACKAGES can contain various number of packages of different types just +/// after the structure as inline data. +/// +typedef struct { + /// + /// The number of packages being defined in this structure. + /// + UINTN NumberOfPackages; + /// + /// The GUID to be used to identify this set of packages that are being exported + /// to the HII database. + /// + EFI_GUID *GuidId; + // + // EFI_HII_HANDLE_PACK *HandlePack; // Only one pack. + // EFI_HII_IFR_PACK *IfrPack; // Only one pack. + // EFI_HII_FONT_PACK *FontPack[]; // Multiple packs ok + // EFI_HII_STRING_PACK *StringPack[]; // Multiple packs ok + // EFI_HII_KEYBOARD_PACK *KeyboardPack[]; // Multiple packs ok + // +} EFI_HII_PACKAGES; + +/// +/// The packed link list that contains all the discernable defaults of variables +/// for the opcodes that are defined in this Handle's domain of data. +/// +typedef struct _EFI_HII_VARIABLE_PACK_LIST { + /// + /// A pointer points to the next data structure of type + /// EFI_HII_VARIABLE_PACK_LIST in the packed link list. + /// + struct _EFI_HII_VARIABLE_PACK_LIST *NextVariablePack; + /// + /// A pointer points to the content of the variable entry defined by GUID/name/data. + /// + EFI_HII_VARIABLE_PACK *VariablePack; + //EFI_HII_VARIABLE_PACK Content +} EFI_HII_VARIABLE_PACK_LIST; + + +#pragma pack() + +/** + Registers the various packs that are passed in via the Packages parameter. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Packages A pointer to an EFI_HII_PACKAGES package instance. + @param Handle A pointer to the FRAMEWORK_EFI_HII_HANDLE instance. + + @retval EFI_SUCCESS Data was extracted from Packages, the database + was updated with the data, and Handle returned successfully. + @retval EFI_INVALID_PARAMETER The content of Packages was invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_NEW_PACK)( + IN EFI_HII_PROTOCOL *This, + IN EFI_HII_PACKAGES *Packages, + OUT FRAMEWORK_EFI_HII_HANDLE *Handle + ); + +/** + Removes a package from the HII database. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle The handle that was registered to the data that + is requested for removal. + + @retval EFI_SUCCESS The data associated with the Handle was removed + from the HII database. + @retval EFI_INVALID_PARAMETER The Handle was not valid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_REMOVE_PACK)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle + ); + +/** + Determines the handles that are currently active in the database. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param HandleBufferLength On input, a pointer to the length of the handle + buffer. On output, the length of the handle buffer that is required + for the handles found. + @param Handle An array of FRAMEWORK_EFI_HII_HANDLE instances returned. + + @retval EFI_SUCCESS Handle was updated successfully. + @retval EFI_BUFFER_TOO_SMALL The HandleBufferLength parameter indicates + that Handle is too small to support the number of handles. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_FIND_HANDLES)( + IN EFI_HII_PROTOCOL *This, + IN OUT UINT16 *HandleBufferLength, + OUT FRAMEWORK_EFI_HII_HANDLE *Handle + ); + +/** + Exports the contents of the database into a buffer. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle A FRAMEWORK_EFI_HII_HANDLE that corresponds to the desired + handle to export. If the value is 0, the entire database will be exported. + The data is exported in a format described by the + structure definition of EFI_HII_EXPORT_TABLE. + @param BufferSize + On input, a pointer to the length of the buffer. On output, the length + of the buffer that is required for the export data. + @param Buffer A pointer to a buffer that will contain the results of the export function. + + @retval EFI_SUCCESS The buffer was successfully filled with BufferSize amount of data. + @retval EFI_BUFFER_TOO_SMALL The value in BufferSize was too small to contain the export data. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_EXPORT)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ); + +/** + Remove any new strings that were added after the initial string export + for this handle. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle The handle on which the string resides. + + @retval EFI_SUCCESS Successfully removed strings from the handle. + @retval EFI_INVALID_PARAMETER The Handle was unknown. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_RESET_STRINGS)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle + ); + +/** + Tests if all of the characters in a string have corresponding font characters. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param StringToTest A pointer to a Unicode string. + @param FirstMissing A pointer to an index into the string. On input, + the index of the first character in the StringToTest + to examine. On exit, the index of the first character + encountered for which a glyph is unavailable. + If all glyphs in the string are available, the + index is the index of the terminator of the string. + @param GlyphBufferSize A pointer to a value. On output, if the function + returns EFI_SUCCESS, it contains the amount of + memory that is required to store the string's + glyph equivalent. + + @retval EFI_SUCCESS All glyphs are available. Note that an empty string + always returns this value. + @retval EFI_NOT_FOUND A glyph was not found for a character. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_TEST_STRING)( + IN EFI_HII_PROTOCOL *This, + IN CHAR16 *StringToTest, + IN OUT UINT32 *FirstMissing, + OUT UINT32 *GlyphBufferSize + ); + +/** + Translates a Unicode character into the corresponding font glyph. + + Note that this function prototype name is different from that in the Framework HII 0.92 specification + to avoid name confict with EFI_HII_GET_GLYPH defined in the UEFI 2.1d specification. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Source A pointer to a Unicode string. + @param Index On input, the offset into the string from which to + fetch the character. On successful completion, the + index is updated to the first character past the + character(s) making up the just extracted glyph. + @param GlyphBuffer Pointer to an array where the glyphs corresponding + to the characters in the source may be stored. + GlyphBuffer is assumed to be wide enough to accept + a wide glyph character. + @param BitWidth If EFI_SUCCESS was returned, the UINT16 pointed to by + this value is filled with the length of the glyph in + pixels. It is unchanged if the call was unsuccessful. + @param InternalStatus The cell pointed to by this parameter must be + initialized to zero prior to invoking the call the + first time for any string. + + @retval EFI_SUCCESS Found the corresponding font glyph for a Unicode + character. + @retval EFI_NOT_FOUND A glyph for a character was not found. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_HII_GET_GLYPH)( + IN EFI_HII_PROTOCOL *This, + IN CHAR16 *Source, + IN OUT UINT16 *Index, + OUT UINT8 **GlyphBuffer, + OUT UINT16 *BitWidth, + IN OUT UINT32 *InternalStatus + ); + +/** + Translates a glyph into the format required for input to the Universal + Graphics Adapter (UGA) Block Transfer (BLT) routines. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param GlyphBuffer A pointer to the buffer that contains glyph data. + @param Foreground The foreground setting requested to be used for the + generated BltBuffer data. + @param Background The background setting requested to be used for the + generated BltBuffer data. + @param Count The entry in the BltBuffer upon which to act. + @param Width The width in bits of the glyph being converted. + @param Height The height in bits of the glyph being converted + @param BltBuffer A pointer to the buffer that contains the data that is + ready to be used by the UGA BLT routines. + + @retval EFI_SUCCESS Successfully translated a glyph into the required + format for input to UGA BLT routines. + @retval EFI_NOT_FOUND A glyph for a character was not found. + @note Inconsistent with specification here: + In Framework Spec, HII specification 0.92. The type of 3rd, 4th and 8th parameter is EFI_UGA_PIXEL. + Here the definition uses the EFI_GRAPHICS_OUTPUT_BLT_PIXEL, which is defined in UEFI 2.1 specification. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_GLYPH_TO_BLT)( + IN EFI_HII_PROTOCOL *This, + IN UINT8 *GlyphBuffer, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground, + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background, + IN UINTN Count, + IN UINTN Width, + IN UINTN Height, + IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer + ); + +/** + Allows a new string to be added to an already existing string package. + + Note that this function prototype name is different from that in the Framework HII 0.92 specification + to avoid name confict with EFI_HII_NEW_STRING defined in the UEFI 2.1d specification. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Pointer to a NULL-terminated string containing a single + ISO 639-2 language identifier, indicating the language + in which the string is translated. + @param Handle The handle of the language pack to which the string + is to be added. + @param Reference The identifier of the string to be added. If the + reference value is zero, then the string will be + assigned a new identifier on that handle for + the language specified. Otherwise, the string will + be updated with the NewString Value. + @param NewString The string to be added. + + @retval EFI_SUCCESS The string was effectively registered. + @retval EFI_INVALID_PARAMETER The Handle was unknown. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_HII_NEW_STRING)( + IN EFI_HII_PROTOCOL *This, + IN CHAR16 *Language, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + IN OUT STRING_REF *Reference, + IN CHAR16 *NewString + ); + +/** + Allows a program to determine the primary languages that are supported + on a given handle. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle The handle on which the strings reside. + @param LanguageString A string allocated by GetPrimaryLanguages() that + contains a list of all primary languages registered + on the handle. + + @retval EFI_SUCCESS LanguageString was correctly returned. + @retval EFI_INVALID_PARAMETER The Handle was unknown. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_GET_PRI_LANGUAGES)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + OUT EFI_STRING *LanguageString + ); + +/** + Allows a program to determine which secondary languages are supported + on a given handle for a given primary language. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle The handle on which the strings reside. + @param PrimaryLanguage Pointer to a NULL-terminated string containing a + single ISO 639-2 language identifier, indicating + the primary language. + @param LanguageString A string allocated by GetSecondaryLanguages() + containing a list of all secondary languages + registered on the handle. + + @retval EFI_SUCCESS LanguageString was correctly returned. + @retval EFI_INVALID_PARAMETER The Handle was unknown. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_GET_SEC_LANGUAGES)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + IN CHAR16 *PrimaryLanguage, + OUT EFI_STRING *LanguageString + ); + +/** + Extracts a string from a package already registered with the EFI HII database. + + Note that this function prototype name is different from that in the Framework HII 0.92 specification + to avoid name confict with EFI_HII_GET_STRING defined in the UEFI 2.1d specification. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle The handle on which the string resides. + @param Token The string token assigned to the string. + @param Raw If TRUE, the string is returned unedited in the + internal storage format. If false, the string + returned is edited by replacing with + and by removing special characters such as the + prefix. + @param LanguageString Pointer to a NULL-terminated string containing a + single ISO 639-2 language identifier, indicating + the language to print. If the LanguageString is + empty (starts with a NULL), the default system + language will be used to determine the language. + @param BufferLength Length of the StringBuffer. + @param StringBuffer The buffer designed to receive the characters in the string. + + @retval EFI_SUCCESS StringBuffer is filled with a NULL-terminated string. + @retval EFI_INVALID_PARAMETER The handle or string token is unknown. + @retval EFI_BUFFER_TOO_SMALL The buffer provided was not large enough to + allow the entire string to be stored. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_HII_GET_STRING)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + IN STRING_REF Token, + IN BOOLEAN Raw, + IN CHAR16 *LanguageString, + IN OUT UINTN *BufferLength, + OUT EFI_STRING StringBuffer + ); + +/** + Allows a program to extract a part of a string of not more than a given width. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle The handle on which the string resides. + @param Token The string token assigned to the string. + @param Index On input, the offset into the string where the + line is to start. On output, the index is updated + to point beyond the last character returned in + the call. + @param LineWidth The maximum width of the line in units of narrow glyphs. + @param LanguageString The pointer to a NULL-terminated string containing a + single ISO 639-2 language identifier, indicating + the language to print. + @param BufferLength The pointer to the length of the StringBuffer. + @param StringBuffer The buffer designed to receive the characters in + the string. + + @retval EFI_SUCCESS StringBuffer filled with characters that will fit + on the line. + @retval EFI_NOT_FOUND The font glyph for at least one of the characters in + the string is not in the font database. + @retval EFI_BUFFER_TOO_SMALL The buffer provided was not large enough + to allow the entire string to be stored. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_GET_LINE)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + IN STRING_REF Token, + IN OUT UINT16 *Index, + IN UINT16 LineWidth, + IN CHAR16 *LanguageString, + IN OUT UINT16 *BufferLength, + OUT EFI_STRING StringBuffer + ); + +/** + Allows a program to extract a form or form package that has previously + been registered with the HII database. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle Handle on which the form resides. + @param FormId The ID of the form to return. If the ID is zero, + the entire form package is returned. + @param BufferLength On input, the length of the Buffer. On output, + the length of the returned buffer, + @param Buffer The buffer designed to receive the form(s). + + @retval EFI_SUCCESS Buffer filled with the requested forms. BufferLength + was updated. + @retval EFI_INVALID_PARAMETER The handle is unknown. + @retval EFI_NOT_FOUND A form on the requested handle cannot be found with + the requested FormId. + @retval EFI_BUFFER_TOO_SMALL The buffer provided was not large enough + to allow the form to be stored. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_GET_FORMS)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + IN EFI_FORM_ID FormId, + IN OUT UINTN *BufferLength, + OUT UINT8 *Buffer + ); + +/** + Extracts the defaults that are associated with a given handle in the HII database. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle The HII handle from which will have default data retrieved. + @param DefaultMask The mask used to specify some type of default + override when extracting the default image data. + @param VariablePackList An indirect pointer to the first entry of a link + list with type EFI_HII_VARIABLE_PACK_LIST. + + @retval EFI_SUCCESS The VariablePackList was populated with the appropriate + default setting data. + @retval EFI_NOT_FOUND The IFR does not have any explicit or default map(s). + @retval EFI_INVALID_PARAMETER The HII database entry associated with Handle + contains invalid data. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_GET_DEFAULT_IMAGE)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + IN UINTN DefaultMask, + OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList + ); + +/** + Allows the caller to update a form or form package that has previously been + registered with the EFI HII database. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param Handle Handle of the package where the form to be updated resides. + @param Label The label inside the form package where the update is to take place. + @param AddData If TRUE, adding data at a given Label; otherwise, + if FALSE, removing data at a given Label. + @param Data The buffer containing the new tags to insert after the Label + + @retval EFI_SUCCESS The form was updated with the new tags. + @retval EFI_INVALID_PARAMETER The buffer for the buffer length does not + contain an integral number of tags. + @retval EFI_NOT_FOUND The Handle, Label, or FormId was not found. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_HII_UPDATE_FORM)( + IN EFI_HII_PROTOCOL *This, + IN FRAMEWORK_EFI_HII_HANDLE Handle, + IN EFI_FORM_LABEL Label, + IN BOOLEAN AddData, + IN EFI_HII_UPDATE_DATA *Data + ); + +/** + Retrieves the current keyboard layout. + + Note that this function prototype name is different from that in the Framework HII 0.92 specification + to avoid name confict with EFI_HII_GET_KEYBOARD_LAYOUT defined in the UEFI 2.1d specification. + + @param This A pointer to the EFI_HII_PROTOCOL instance. + @param DescriptorCount A pointer to the number of Descriptor entries being + described in the keyboard layout being retrieved. + @param Descriptor A pointer to a buffer containing an array of + FRAMEWORK_EFI_KEY_DESCRIPTOR entries. Each entry + will reflect the definition of a specific physical key. + + @retval EFI_SUCCESS The keyboard layout was retrieved successfully. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_HII_GET_KEYBOARD_LAYOUT)( + IN EFI_HII_PROTOCOL *This, + OUT UINT16 *DescriptorCount, + OUT FRAMEWORK_EFI_KEY_DESCRIPTOR *Descriptor + ); + +/// +/// The HII Protocol manages the HII database, which is a repository for data +/// having to do with fonts, strings, forms, keyboards, and other future human +/// interface items. +/// +struct _EFI_HII_PROTOCOL { + /// + /// Extracts the various packs from a package list. + /// + EFI_HII_NEW_PACK NewPack; + + /// + /// Removes a package from the HII database. + /// + EFI_HII_REMOVE_PACK RemovePack; + + /// + /// Determines the handles that are currently active in the database. + /// + EFI_HII_FIND_HANDLES FindHandles; + + /// + /// Exports the entire contents of the database to a buffer. + /// + EFI_HII_EXPORT ExportDatabase; + + /// + /// Tests if all of the characters in a string have corresponding font characters. + /// + EFI_HII_TEST_STRING TestString; + + /// + /// Translates a Unicode character into the corresponding font glyph. + /// + FRAMEWORK_EFI_HII_GET_GLYPH GetGlyph; + + /// + /// Converts a glyph value into a format that is ready for a UGA BLT command. + /// + EFI_HII_GLYPH_TO_BLT GlyphToBlt; + + /// + /// Allows a new string to be added to an already existing string package. + /// + FRAMEWORK_EFI_HII_NEW_STRING NewString; + + /// + /// Allows a program to determine the primary languages that are supported + /// on a given handle. + /// + EFI_HII_GET_PRI_LANGUAGES GetPrimaryLanguages; + + /// + /// Allows a program to determine which secondary languages are supported + /// on a given handle for a given primary language. + /// + EFI_HII_GET_SEC_LANGUAGES GetSecondaryLanguages; + + /// + /// Extracts a string from a package that is already registered with the + /// EFI HII database. + /// + FRAMEWORK_EFI_HII_GET_STRING GetString; + + /// + /// Removes any new strings that were added after the initial string export + /// for this handle. + /// + /// Note this function is not defined in the Framework HII 0.92 specification. + /// + EFI_HII_RESET_STRINGS ResetStrings; + + /// + /// Allows a program to extract a part of a string of not more than a given width. + /// + EFI_HII_GET_LINE GetLine; + + /// + /// Allows a program to extract a form or form package that has been previously registered. + /// + EFI_HII_GET_FORMS GetForms; + + /// + /// Allows a program to extract the nonvolatile image that represents the default storage image. + /// + EFI_HII_GET_DEFAULT_IMAGE GetDefaultImage; + + /// + /// Allows a program to update a previously registered form. + /// + EFI_HII_UPDATE_FORM UpdateForm; + + /// + /// Allows a program to extract the current keyboard layout. + /// + FRAMEWORK_EFI_HII_GET_KEYBOARD_LAYOUT GetKeyboardLayout; +}; + +extern EFI_GUID gEfiHiiProtocolGuid; +extern EFI_GUID gEfiHiiCompatibilityProtocolGuid; + +#endif + diff --git a/IntelFrameworkPkg/Include/Protocol/FrameworkMpService.h b/IntelFrameworkPkg/Include/Protocol/FrameworkMpService.h new file mode 100644 index 000000000..b1c8f5515 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/FrameworkMpService.h @@ -0,0 +1,662 @@ +/** @file + When installed, the Framework MP Services Protocol produces a collection of + services that are needed for MP management, such as initialization and management + of application processors. + + @par Note: + This protocol has been deprecated and has been replaced by the MP Services + Protocol from the UEFI Platform Initialization Specification 1.2, Volume 2: + Driver Execution Environment Core Interface. + + The MP Services Protocol provides a generalized way of performing following tasks: + - Retrieving information of multi-processor environment and MP-related status of + specific processors. + - Dispatching user-provided function to APs. + - Maintain MP-related processor status. + + The MP Services Protocol must be produced on any system with more than one logical + processor. + + The Protocol is available only during boot time. + + MP Services Protocol is hardware-independent. Most of the logic of this protocol + is architecturally neutral. It abstracts the multi-processor environment and + status of processors, and provides interfaces to retrieve information, maintain, + and dispatch. + + MP Services Protocol may be consumed by ACPI module. The ACPI module may use this + protocol to retrieve data that are needed for an MP platform and report them to OS. + MP Services Protocol may also be used to program and configure processors, such + as MTRR synchronization for memory space attributes setting in DXE Services. + MP Services Protocol may be used by non-CPU DXE drivers to speed up platform boot + by taking advantage of the processing capabilities of the APs, for example, using + APs to help test system memory in parallel with other device initialization. + Diagnostics applications may also use this protocol for multi-processor. + +Copyright (c) 1999 - 2010, 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 that 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 _FRAMEWORK_MP_SERVICE_PROTOCOL_H_ +#define _FRAMEWORK_MP_SERVICE_PROTOCOL_H_ + +#include + +/// +/// Global ID for the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL. +/// +#define FRAMEWORK_EFI_MP_SERVICES_PROTOCOL_GUID \ + { \ + 0xf33261e7, 0x23cb, 0x11d5, {0xbd, 0x5c, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \ + } + +/// +/// Forward declaration for the EFI_MP_SERVICES_PROTOCOL. +/// +typedef struct _FRAMEWORK_EFI_MP_SERVICES_PROTOCOL FRAMEWORK_EFI_MP_SERVICES_PROTOCOL; + +/// +/// Fixed delivery mode that may be used as the DeliveryMode parameter in SendIpi(). +/// +#define DELIVERY_MODE_FIXED 0x0 + +/// +/// Lowest priority delivery mode that may be used as the DeliveryMode parameter in SendIpi(). +/// +#define DELIVERY_MODE_LOWEST_PRIORITY 0x1 + +/// +/// SMI delivery mode that may be used as the DeliveryMode parameter in SendIpi(). +/// +#define DELIVERY_MODE_SMI 0x2 + +/// +/// Remote read delivery mode that may be used as the DeliveryMode parameter in SendIpi(). +/// +#define DELIVERY_MODE_REMOTE_READ 0x3 + +/// +/// NMI delivery mode that may be used as the DeliveryMode parameter in SendIpi(). +/// +#define DELIVERY_MODE_NMI 0x4 + +/// +/// INIT delivery mode that may be used as the DeliveryMode parameter in SendIpi(). +/// +#define DELIVERY_MODE_INIT 0x5 + +/// +/// Startup IPI delivery mode that may be used as the DeliveryMode parameter in SendIpi(). +/// +#define DELIVERY_MODE_SIPI 0x6 + +/// +/// The DeliveryMode parameter in SendIpi() must be less than this maximum value. +/// +#define DELIVERY_MODE_MAX 0x7 + +/// +/// IPF specific value for the state field of the Self Test State Parameter. +/// +#define EFI_MP_HEALTH_FLAGS_STATUS_HEALTHY 0x0 + +/// +/// IPF specific value for the state field of the Self Test State Parameter. +/// +#define EFI_MP_HEALTH_FLAGS_STATUS_PERFORMANCE_RESTRICTED 0x1 + +/// +/// IPF specific value for the state field of the Self Test State Parameter. +/// +#define EFI_MP_HEALTH_FLAGS_STATUS_FUNCTIONALLY_RESTRICTED 0x2 + +typedef union { + /// + /// Bitfield structure for the IPF Self Test State Parameter. + /// + struct { + UINT32 Status:2; + UINT32 Tested:1; + UINT32 Reserved1:13; + UINT32 VirtualMemoryUnavailable:1; + UINT32 Ia32ExecutionUnavailable:1; + UINT32 FloatingPointUnavailable:1; + UINT32 MiscFeaturesUnavailable:1; + UINT32 Reserved2:12; + } Bits; + /// + /// IA32 and X64 BIST data of the processor. + /// + UINT32 Uint32; +} EFI_MP_HEALTH_FLAGS; + +typedef struct { + /// + /// @par IA32, X64: + /// BIST (built-in self-test) data of the processor. + /// + /// @par IPF: + /// Lower 32 bits of the self-test state parameter. For definition of self-test + /// state parameter, please refer to Intel(R) Itanium(R) Architecture Software + /// Developer's Manual, Volume 2: System Architecture. + /// + EFI_MP_HEALTH_FLAGS Flags; + /// + /// @par IA32, X64: + /// Not used. + /// + /// @par IPF: + /// Higher 32 bits of self test state parameter. + /// + UINT32 TestStatus; +} EFI_MP_HEALTH; + +typedef enum { + EfiCpuAP = 0, ///< The CPU is an AP (Application Processor). + EfiCpuBSP, ///< The CPU is the BSP (Boot-Strap Processor). + EfiCpuDesignationMaximum +} EFI_CPU_DESIGNATION; + +typedef struct { + /// + /// @par IA32, X64: + /// The lower 8 bits contains local APIC ID, and higher bits are reserved. + /// + /// @par IPF: + /// The lower 16 bits contains id/eid as physical address of local SAPIC + /// unit, and higher bits are reserved. + /// + UINT32 ApicID; + /// + /// This field indicates whether the processor is enabled. If the value is + /// TRUE, then the processor is enabled. Otherwise, it is disabled. + /// + BOOLEAN Enabled; + /// + /// This field indicates whether the processor is playing the role of BSP. + /// If the value is EfiCpuAP, then the processor is AP. If the value is + /// EfiCpuBSP, then the processor is BSP. + /// + EFI_CPU_DESIGNATION Designation; + /// + /// @par IA32, X64: + /// The Flags field of this EFI_MP_HEALTH data structure holds BIST (built-in + /// self test) data of the processor. The TestStatus field is not used, and + /// the value is always zero. + /// + /// @par IPF: + /// Bit format of this field is the same as the definition of self-test state + /// parameter, in Intel(R) Itanium(R) Architecture Software Developer's Manual, + /// Volume 2: System Architecture. + /// + EFI_MP_HEALTH Health; + /// + /// Zero-based physical package number that identifies the cartridge of the + /// processor. + /// + UINTN PackageNumber; + /// + /// Zero-based physical core number within package of the processor. + /// + UINTN NumberOfCores; + /// + /// Zero-based logical thread number within core of the processor. + /// + UINTN NumberOfThreads; + /// + /// This field is reserved. + /// + UINT64 ProcessorPALCompatibilityFlags; + /// + /// @par IA32, X64: + /// This field is not used, and the value is always zero. + /// + /// @par IPF: + /// This field is a mask number that is handed off by the PAL about which + /// processor tests are performed and which are masked. + /// + UINT64 ProcessorTestMask; +} EFI_MP_PROC_CONTEXT; + +/** + This service retrieves general information of multiprocessors in the system. + + This function is used to get the following information: + - Number of logical processors in system + - Maximal number of logical processors supported by system + - Number of enabled logical processors. + - Rendezvous interrupt number (IPF-specific) + - Length of the rendezvous procedure. + + @param[in] This The pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL + instance. + @param[out] NumberOfCPUs The pointer to the total number of logical processors + in the system, including the BSP and disabled + APs. If NULL, this parameter is ignored. + @param[out] MaximumNumberOfCPUs Pointer to the maximum number of processors + supported by the system. If NULL, this + parameter is ignored. + @param[out] NumberOfEnabledCPUs The pointer to the number of enabled logical + processors that exist in system, including + the BSP. If NULL, this parameter is ignored. + @param[out] RendezvousIntNumber This parameter is only meaningful for IPF. + - IA32, X64: The returned value is zero. + If NULL, this parameter is ignored. + - IPF: Pointer to the rendezvous interrupt + number that is used for AP wake-up. + @param[out] RendezvousProcLength The pointer to the length of rendezvous procedure. + - IA32, X64: The returned value is 0x1000. + If NULL, this parameter is ignored. + - IPF: The returned value is zero. + + @retval EFI_SUCCESS Multiprocessor general information was successfully retrieved. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_MP_SERVICES_GET_GENERAL_MP_INFO)( + IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This, + OUT UINTN *NumberOfCPUs OPTIONAL, + OUT UINTN *MaximumNumberOfCPUs OPTIONAL, + OUT UINTN *NumberOfEnabledCPUs OPTIONAL, + OUT UINTN *RendezvousIntNumber OPTIONAL, + OUT UINTN *RendezvousProcLength OPTIONAL + ); + +/** + This service gets detailed MP-related information of the requested processor. + + This service gets detailed MP-related information of the requested processor + at the instant this call is made. Note the following: + - The processor information may change during the course of a boot session. + - The data of information presented here is entirely MP related. + Information regarding the number of caches and their sizes, frequency of operation, + slot numbers is all considered platform-related information and will not be + presented here. + + @param[in] This The pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL + instance. + @param[in] ProcessorNumber The handle number of the processor. The range + is from 0 to the total number of logical + processors minus 1. The total number of + logical processors can be retrieved by + GetGeneralMPInfo(). + @param[in,out] BufferLength On input, pointer to the size in bytes of + ProcessorContextBuffer. On output, if the + size of ProcessorContextBuffer is not large + enough, the value pointed by this parameter + is updated to size in bytes that is needed. + If the size of ProcessorContextBuffer is + sufficient, the value is not changed from + input. + @param[out] ProcessorContextBuffer The pointer to the buffer where the data of + requested processor will be deposited. + The buffer is allocated by caller. + + @retval EFI_SUCCESS Processor information was successfully returned. + @retval EFI_BUFFER_TOO_SMALL The size of ProcessorContextBuffer is too small. + The value pointed by BufferLength has been updated + to size in bytes that is needed. + @retval EFI_INVALID_PARAMETER IA32, X64:BufferLength is NULL. + @retval EFI_INVALID_PARAMETER IA32, X64:ProcessorContextBuffer is NULL. + @retval EFI_INVALID_PARAMETER IA32, X64:Processor with the handle specified by + ProcessorNumber does not exist. + @retval EFI_NOT_FOUND IPF: Processor with the handle specified by + ProcessorNumber does not exist. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_MP_SERVICES_GET_PROCESSOR_CONTEXT)( + IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This, + IN UINTN ProcessorNumber, + IN OUT UINTN *BufferLength, + OUT EFI_MP_PROC_CONTEXT *ProcessorContextBuffer + ); + +/** + This function is used to dispatch all enabled APs to the function specified + by Procedure. APs can run either simultaneously or one by one. The caller can + also configure the BSP to either wait for APs or just proceed with the next + task. It is the responsibility of the caller of the StartupAllAPs() to make + sure that the nature of the code that will be run on the BSP and the dispatched + APs is well controlled. The MP Services Protocol does not guarantee that the + function that either processor is executing is MP-safe. Hence, the tasks that + can be run in parallel are limited to certain independent tasks and well- + controlled exclusive code. EFI services and protocols may not be called by APs + unless otherwise specified. + + @param[in] This The pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL + instance. + @param[in] Procedure A pointer to the function to be run on enabled + APs of the system. + @param[in] SingleThread Flag that requests APs to execute one at a + time or simultaneously. + - IA32, X64: + If TRUE, then all the enabled APs execute + the function specified by Procedure one by + one, in ascending order of processor handle + number. If FALSE, then all the enabled APs + execute the function specified by Procedure + simultaneously. + - IPF: + If TRUE, then all the enabled APs execute + the function specified by Procedure simultaneously. + If FALSE, then all the enabled APs execute the + function specified by Procedure one by one, in + ascending order of processor handle number. The + time interval of AP dispatching is determined + by WaitEvent and TimeoutInMicrosecs. + @param[in] WaitEvent Event to signal when APs have finished. + - IA32, X64: + If not NULL, when all APs finish after timeout + expires, the event will be signaled. If NULL, + the parameter is ignored. + - IPF: + If SingleThread is TRUE, this parameter + is ignored. If SingleThread is FALSE (i.e. + dispatch APs one by one), this parameter + determines whether the BSP waits after each + AP is dispatched. If it is NULL, the BSP + does not wait after each AP is dispatched. + If it is not NULL, the BSP waits after each + AP is dispatched, and the time interval is + determined by TimeoutInMicrosecs. Type + EFI_EVENT is defined in CreateEvent() in + the Unified Extensible Firmware Interface + Specification. + @param[in] TimeoutInMicrosecsond Time to wait for APs to finish. + - IA32, X64: + If the value is zero, it means no timeout + limit. The BSP waits until all APs finish. + If the value is not zero, the BSP waits + until all APs finish or timeout expires. + If timeout expires, EFI_TIMEOUT is returned, + and the BSP will then check APs?status + periodically, with time interval of 16 + microseconds. + - IPF: + If SingleThread is TRUE and FailedCPUList + is NULL, this parameter is ignored. If + SingleThread is TRUE and FailedCPUList is + not NULL, this parameter determines whether + the BSP waits until all APs finish their + procedure. If it is zero, the BSP does not + wait for APs. If it is non-zero, it waits + until all APs finish. If SingleThread is + FALSE and WaitEvent is NULL, this parameter + is ignored. If SingleThread is FALSE and + WaitEvent is not NULL, the BSP waits after + each AP is dispatched and this value + determines time interval. If the value is + zero, the length of time interval is 10ms. + If the value is non-zero, the BSP waits + until dispatched AP finishes and then + dispatch the next. + @param[in] ProcedureArgument The pointer to the optional parameter of the + function specified by Procedure. + @param[out] FailedCPUList List of APs that did not finish. + - IA32, X64: + If not NULL, it records handle numbers of + all logical processors that fail to accept + caller-provided function (busy or disabled). + If NULL, this parameter is ignored. + - IPF: + If not NULL, it records status of all + logical processors, with processor handle + number as index. If a logical processor + fails to accept caller-provided function + because it is busy, the status is EFI_NOT_READY. + If it fails to accept function due to other + reasons, the status is EFI_NOT_AVAILABLE_YET. + If timeout expires, the status is EFI_TIMEOUT. + Otherwise, the value is EFI_SUCCESS. If NULL, + this parameter is ignored. + + @retval EFI_SUCCESS IA32, X64: All dispatched APs have finished + before the timeout expires. + @retval EFI_SUCCESS IA32, X64: Only 1 logical processor exists + in system. + @retval EFI_INVALID_PARAMETER IA32, X64: Procedure is NULL. + @retval EFI_TIMEOUT IA32, X64: The timeout expires before all + dispatched APs have finished. + @retval EFI_SUCCESS IPF: This function always returns EFI_SUCCESS. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_STARTUP_ALL_APS)( + IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This, + IN FRAMEWORK_EFI_AP_PROCEDURE Procedure, + IN BOOLEAN SingleThread, + IN EFI_EVENT WaitEvent OPTIONAL, + IN UINTN TimeoutInMicroSecs, + IN VOID *ProcArguments OPTIONAL, + OUT UINTN *FailedCPUList OPTIONAL + ); + +/** + This function is used to dispatch one enabled AP to the function provided by + the caller. The caller can request the BSP to either wait for the AP or just + proceed with the next task. + + @param[in] This The pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL + instance. + @param[in] Procedure A pointer to the function to be run on the + designated AP. + @param[in] ProcessorNumber The handle number of AP. The range is from + 0 to the total number of logical processors + minus 1. The total number of logical + processors can be retrieved by GetGeneralMPInfo(). + @param[in] WaitEvent Event to signal when APs have finished. + - IA32, X64: + If not NULL, when the AP finishes after timeout + expires, the event will be signaled. If NULL, + the parameter is ignored. + - IPF: + This parameter determines whether the BSP + waits after the AP is dispatched. If it is + NULL, the BSP does not wait after the AP + is dispatched. If it is not NULL, the BSP + waits after the AP is dispatched, and the + time interval is determined by TimeoutInMicrosecs. + Type EFI_EVENT is defined in CreateEvent() + in the Unified Extensible Firmware Interface + Specification. + @param[in] TimeoutInMicrosecsond Time to wait for APs to finish. + - IA32, X64: + If the value is zero, it means no timeout + limit. The BSP waits until the AP finishes. + If the value is not zero, the BSP waits until + the AP finishes or timeout expires. If timeout + expires, EFI_TIMEOUT is returned, and the + BSP will then check the AP's status periodically, + with time interval of 16 microseconds. + - IPF: + If WaitEvent is NULL, this parameter is ignored. + If WaitEvent is not NULL, the BSP waits after + the AP is dispatched and this value determines + time interval. If the value is zero, the length + of time interval is 10ms. If the value is + non-zero, the BSP waits until the AP finishes. + @param[in] ProcedureArgument The pointer to the optional parameter of the + function specified by Procedure. + + @retval EFI_SUCCESS Specified AP has finished before the timeout + expires. + @retval EFI_TIMEOUT The timeout expires before specified AP has + finished. + @retval EFI_INVALID_PARAMETER IA32, X64: Processor with the handle specified + by ProcessorNumber does not exist. + @retval EFI_INVALID_PARAMETER IA32, X64: Specified AP is busy or disabled. + @retval EFI_INVALID_PARAMETER IA32, X64: Procedure is NULL. + @retval EFI_INVALID_PARAMETER IA32, X64: ProcessorNumber specifies the BSP + @retval EFI_NOT_READY IPF: Specified AP is busy + @retval EFI_NOT_AVAILABLE_YET IPF: ProcessorNumber specifies the BSP + @retval EFI_NOT_AVAILABLE_YET IPF: Specified AP is disabled. + @retval EFI_NOT_AVAILABLE_YET IPF: Specified AP is unhealthy or untested. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_STARTUP_THIS_AP)( + IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This, + IN FRAMEWORK_EFI_AP_PROCEDURE Procedure, + IN UINTN ProcessorNumber, + IN EFI_EVENT WaitEvent OPTIONAL, + IN UINTN TimeoutInMicroSecs, + IN OUT VOID *ProcArguments OPTIONAL + ); + +/** + This service switches the requested AP to be the BSP from that point onward. + The new BSP can take over the execution of the old BSP and continue seamlessly + from where the old one left off. This call can only be performed by the + current BSP. + + @param[in] This The pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL + instance. + @param[in] ProcessorNumber The handle number of AP. The range is from 0 to + the total number of logical processors minus 1. + The total number of logical processors can be + retrieved by GetGeneralMPInfo(). + @param[in] EnableOldBSP If TRUE, then the old BSP will be listed as an + enabled AP. Otherwise, it will be disabled. + + @retval EFI_SUCCESS BSP successfully switched. + @retval EFI_INVALID_PARAMETER The processor with the handle specified by + ProcessorNumber does not exist. + @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP. + @retval EFI_NOT_READY IA32, X64: Specified AP is busy or disabled. + @retval EFI_INVALID_PARAMETER IPF: Specified AP is disabled. + @retval EFI_INVALID_PARAMETER IPF: Specified AP is unhealthy or untested. + @retval EFI_NOT_READY IPF: Specified AP is busy. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_SWITCH_BSP)( + IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This, + IN UINTN ProcessorNumber, + IN BOOLEAN EnableOldBSP + ); + +/** + This service sends an IPI to a specified AP. Caller can specify vector number + and delivery mode of the interrupt. + + @param[in] This The pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL + instance. + @param[in] ProcessorNumber The handle number of AP. The range is from 0 to + the total number of logical processors minus 1. + The total number of logical processors can be + retrieved by GetGeneralMPInfo(). + @param[in] VectorNumber The vector number of the interrupt. + @param[in] DeliveryMode The delivery mode of the interrupt. + + @retval EFI_SUCCESS IPI was successfully sent. + @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP. + @retval EFI_INVALID_PARAMETER IA32, X64: Processor with the handle specified + by ProcessorNumber does not exist. + @retval EFI_INVALID_PARAMETER IA32, X64: VectorNumber is greater than 255. + @retval EFI_INVALID_PARAMETER IA32, X64: DeliveryMode is greater than or equal + to DELIVERY_MODE_MAX. + @retval EFI_NOT_READY IA32, X64: IPI is not accepted by the target + processor within 10 microseconds. + @retval EFI_INVALID_PARAMETER IPF: Specified AP is disabled. + @retval EFI_INVALID_PARAMETER IPF: Specified AP is unhealthy or untested. + @retval EFI_NOT_READY IPF: Specified AP is busy. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_MP_SERVICES_SEND_IPI)( + IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This, + IN UINTN ProcessorNumber, + IN UINTN VectorNumber, + IN UINTN DeliveryMode + ); + +/** + This service lets the caller enable or disable an AP. The caller can optionally + specify the health status of the AP by Health. It is usually used to update the + health status of the processor after some processor test. + + @param[in] This The pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL + instance. + @param[in] ProcessorNumber The handle number of AP. The range is from 0 to + the total number of logical processors minus 1. + The total number of logical processors can be + retrieved by GetGeneralMPInfo(). + @param[in] NewAPState Indicates whether the new, desired state of the + AP is enabled or disabled. TRUE for enabling, + FALSE otherwise. + @param[in] HealthState If not NULL, it points to the value that specifies + the new health status of the AP. If it is NULL, + this parameter is ignored. + + @retval EFI_SUCCESS AP successfully enabled or disabled. + @retval EFI_INVALID_PARAMETER ProcessorNumber specifies the BSP. + @retval EFI_INVALID_PARAMETER IA32, X64: Processor with the handle specified + by ProcessorNumber does not exist. + @retval EFI_INVALID_PARAMETER IPF: If an unhealthy or untested AP is to be + enabled. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_ENABLEDISABLEAP)( + IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This, + IN UINTN ProcessorNumber, + IN BOOLEAN NewAPState, + IN EFI_MP_HEALTH *HealthState OPTIONAL + ); + +/** + This service lets the caller processor get its handle number, with which any + processor in the system can be uniquely identified. The range is from 0 to the + total number of logical processors minus 1. The total number of logical + processors can be retrieved by GetGeneralMPInfo(). This service may be called + from the BSP and APs. + + @param[in] This The pointer to the FRAMEWORK_EFI_MP_SERVICES_PROTOCOL + instance. + @param[out] ProcessorNumber A pointer to the handle number of AP. The range is + from 0 to the total number of logical processors + minus 1. The total number of logical processors + can be retrieved by GetGeneralMPInfo(). + +@retval EFI_SUCCESS This function always returns EFI_SUCCESS. + +**/ +typedef +EFI_STATUS +(EFIAPI *FRAMEWORK_EFI_MP_SERVICES_WHOAMI)( + IN FRAMEWORK_EFI_MP_SERVICES_PROTOCOL *This, + OUT UINTN *ProcessorNumber + ); + +/// +/// Framework MP Services Protocol structure. +/// +struct _FRAMEWORK_EFI_MP_SERVICES_PROTOCOL { + EFI_MP_SERVICES_GET_GENERAL_MP_INFO GetGeneralMPInfo; + EFI_MP_SERVICES_GET_PROCESSOR_CONTEXT GetProcessorContext; + FRAMEWORK_EFI_MP_SERVICES_STARTUP_ALL_APS StartupAllAPs; + FRAMEWORK_EFI_MP_SERVICES_STARTUP_THIS_AP StartupThisAP; + FRAMEWORK_EFI_MP_SERVICES_SWITCH_BSP SwitchBSP; + EFI_MP_SERVICES_SEND_IPI SendIPI; + FRAMEWORK_EFI_MP_SERVICES_ENABLEDISABLEAP EnableDisableAP; + FRAMEWORK_EFI_MP_SERVICES_WHOAMI WhoAmI; +}; + +extern EFI_GUID gFrameworkEfiMpServiceProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/Legacy8259.h b/IntelFrameworkPkg/Include/Protocol/Legacy8259.h new file mode 100644 index 000000000..c843de101 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/Legacy8259.h @@ -0,0 +1,297 @@ +/** @file + This protocol abstracts the 8259 interrupt controller. This includes + PCI IRQ routing needed to program the PCI Interrupt Line register. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This protocol is defined in Framework for EFI Compatibility Support Module spec + Version 0.97. + +**/ + +#ifndef _EFI_LEGACY_8259_H_ +#define _EFI_LEGACY_8259_H_ + + +#define EFI_LEGACY_8259_PROTOCOL_GUID \ + { \ + 0x38321dba, 0x4fe0, 0x4e17, {0x8a, 0xec, 0x41, 0x30, 0x55, 0xea, 0xed, 0xc1 } \ + } + +typedef struct _EFI_LEGACY_8259_PROTOCOL EFI_LEGACY_8259_PROTOCOL; + +typedef enum { + Efi8259Irq0, + Efi8259Irq1, + Efi8259Irq2, + Efi8259Irq3, + Efi8259Irq4, + Efi8259Irq5, + Efi8259Irq6, + Efi8259Irq7, + Efi8259Irq8, + Efi8259Irq9, + Efi8259Irq10, + Efi8259Irq11, + Efi8259Irq12, + Efi8259Irq13, + Efi8259Irq14, + Efi8259Irq15, + Efi8259IrqMax +} EFI_8259_IRQ; + +typedef enum { + Efi8259LegacyMode, + Efi8259ProtectedMode, + Efi8259MaxMode +} EFI_8259_MODE; + +/** + Get the 8259 interrupt masks for Irq0 - Irq15. A different mask exists for + the legacy mode mask and the protected mode mask. The base address for the 8259 + is different for legacy and protected mode, so two masks are required. + + @param This The protocol instance pointer. + @param MasterBase The base vector for the Master PIC in the 8259 controller. + @param SlaveBase The base vector for the Slave PIC in the 8259 controller. + + @retval EFI_SUCCESS The new bases were programmed. + @retval EFI_DEVICE_ERROR A device error occured programming the vector bases. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_SET_VECTOR_BASE)( + IN EFI_LEGACY_8259_PROTOCOL *This, + IN UINT8 MasterBase, + IN UINT8 SlaveBase + ); + +/** + Get the 8259 interrupt masks for Irq0 - Irq15. A different mask exists for + the legacy mode mask and the protected mode mask. The base address for the 8259 + is different for legacy and protected mode, so two masks are required. + + @param This The protocol instance pointer. + @param LegacyMask Bit 0 is Irq0 - Bit 15 is Irq15. + @param LegacyEdgeLevel Bit 0 is Irq0 - Bit 15 is Irq15. + @param ProtectedMask Bit 0 is Irq0 - Bit 15 is Irq15. + @param ProtectedEdgeLevel Bit 0 is Irq0 - Bit 15 is Irq15. + + @retval EFI_SUCCESS 8259 status returned. + @retval EFI_DEVICE_ERROR Error reading 8259. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_GET_MASK)( + IN EFI_LEGACY_8259_PROTOCOL *This, + OUT UINT16 *LegacyMask, OPTIONAL + OUT UINT16 *LegacyEdgeLevel, OPTIONAL + OUT UINT16 *ProtectedMask, OPTIONAL + OUT UINT16 *ProtectedEdgeLevel OPTIONAL + ); + +/** + Set the 8259 interrupt masks for Irq0 - Irq15. A different mask exists for + the legacy mode mask and the protected mode mask. The base address for the 8259 + is different for legacy and protected mode, so two masks are required. + Also set the edge/level masks. + + @param This The protocol instance pointer. + @param LegacyMask Bit 0 is Irq0 - Bit 15 is Irq15. + @param LegacyEdgeLevel Bit 0 is Irq0 - Bit 15 is Irq15. + @param ProtectedMask Bit 0 is Irq0 - Bit 15 is Irq15. + @param ProtectedEdgeLevel Bit 0 is Irq0 - Bit 15 is Irq15. + + @retval EFI_SUCCESS 8259 status returned. + @retval EFI_DEVICE_ERROR Error writing 8259. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_SET_MASK)( + IN EFI_LEGACY_8259_PROTOCOL *This, + IN UINT16 *LegacyMask, OPTIONAL + IN UINT16 *LegacyEdgeLevel, OPTIONAL + IN UINT16 *ProtectedMask, OPTIONAL + IN UINT16 *ProtectedEdgeLevel OPTIONAL + ); + +/** + Set the 8259 mode of operation. The base address for the 8259 is different for + legacy and protected mode. The legacy mode requires the master 8259 to have a + master base of 0x08 and the slave base of 0x70. The protected mode base locations + are not defined. Interrupts must be masked by the caller before this function + is called. The interrupt mask from the current mode is saved. The interrupt + mask for the new mode is Mask, or if Mask does not exist the previously saved + mask is used. + + @param This The protocol instance pointer. + @param Mode The mode of operation. i.e. the real mode or protected mode. + @param Mask Optional interupt mask for the new mode. + @param EdgeLevel Optional trigger mask for the new mode. + + @retval EFI_SUCCESS 8259 programmed. + @retval EFI_DEVICE_ERROR Error writing to 8259. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_SET_MODE)( + IN EFI_LEGACY_8259_PROTOCOL *This, + IN EFI_8259_MODE Mode, + IN UINT16 *Mask, OPTIONAL + IN UINT16 *EdgeLevel OPTIONAL + ); + +/** + Convert from IRQ to processor interrupt vector number. + + @param This The protocol instance pointer. + @param Irq 8259 IRQ0 - IRQ15. + @param Vector The processor vector number that matches an Irq. + + @retval EFI_SUCCESS The Vector matching Irq is returned. + @retval EFI_INVALID_PARAMETER The Irq not valid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_GET_VECTOR)( + IN EFI_LEGACY_8259_PROTOCOL *This, + IN EFI_8259_IRQ Irq, + OUT UINT8 *Vector + ); + +/** + Enable Irq by unmasking interrupt in 8259 + + @param This The protocol instance pointer. + @param Irq 8259 IRQ0 - IRQ15. + @param LevelTriggered TRUE if level triggered. FALSE if edge triggered. + + @retval EFI_SUCCESS The Irq was enabled on 8259. + @retval EFI_INVALID_PARAMETER The Irq is not valid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_ENABLE_IRQ)( + IN EFI_LEGACY_8259_PROTOCOL *This, + IN EFI_8259_IRQ Irq, + IN BOOLEAN LevelTriggered + ); + +/** + Disable Irq by masking interrupt in 8259 + + @param This The protocol instance pointer. + @param Irq 8259 IRQ0 - IRQ15. + + @retval EFI_SUCCESS The Irq was disabled on 8259. + @retval EFI_INVALID_PARAMETER The Irq is not valid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_DISABLE_IRQ)( + IN EFI_LEGACY_8259_PROTOCOL *This, + IN EFI_8259_IRQ Irq + ); + +/** + PciHandle represents a PCI config space of a PCI function. Vector + represents Interrupt Pin (from PCI config space) and it is the data + that is programmed into the Interrupt Line (from the PCI config space) + register. + + @param This The protocol instance pointer. + @param PciHandle The PCI function to return the vector for. + @param Vector The vector for the function it matches. + + @retval EFI_SUCCESS A valid Vector was returned. + @retval EFI_INVALID_PARAMETER PciHandle not valid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_GET_INTERRUPT_LINE)( + IN EFI_LEGACY_8259_PROTOCOL *This, + IN EFI_HANDLE PciHandle, + OUT UINT8 *Vector + ); + +/** + Send an EOI to 8259 + + @param This The protocol instance pointer. + @param Irq 8259 IRQ0 - IRQ15. + + @retval EFI_SUCCESS EOI was successfully sent to 8259. + @retval EFI_INVALID_PARAMETER The Irq isnot valid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_8259_END_OF_INTERRUPT)( + IN EFI_LEGACY_8259_PROTOCOL *This, + IN EFI_8259_IRQ Irq + ); + +/** + @par Protocol Description: + Abstracts the 8259 and APIC hardware control between EFI usage and + Compatibility16 usage. + + @param SetVectorBase + Sets the vector bases for master and slave PICs. + + @param GetMask + Gets IRQ and edge/level masks for 16-bit real mode and 32-bit protected mode. + + @param SetMask + Sets the IRQ and edge\level masks for 16-bit real mode and 32-bit protected mode. + + @param SetMode + Sets PIC mode to 16-bit real mode or 32-bit protected mode. + + @param GetVector + Gets the base vector assigned to an IRQ. + + @param EnableIrq + Enables an IRQ. + + @param DisableIrq + Disables an IRQ. + + @param GetInterruptLine + Gets an IRQ that is assigned to a PCI device. + + @param EndOfInterrupt + Issues the end of interrupt command. + +**/ +struct _EFI_LEGACY_8259_PROTOCOL { + EFI_LEGACY_8259_SET_VECTOR_BASE SetVectorBase; + EFI_LEGACY_8259_GET_MASK GetMask; + EFI_LEGACY_8259_SET_MASK SetMask; + EFI_LEGACY_8259_SET_MODE SetMode; + EFI_LEGACY_8259_GET_VECTOR GetVector; + EFI_LEGACY_8259_ENABLE_IRQ EnableIrq; + EFI_LEGACY_8259_DISABLE_IRQ DisableIrq; + EFI_LEGACY_8259_GET_INTERRUPT_LINE GetInterruptLine; + EFI_LEGACY_8259_END_OF_INTERRUPT EndOfInterrupt; +}; + +extern EFI_GUID gEfiLegacy8259ProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/LegacyBios.h b/IntelFrameworkPkg/Include/Protocol/LegacyBios.h new file mode 100644 index 000000000..00a149e38 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/LegacyBios.h @@ -0,0 +1,1559 @@ +/** @file + The EFI Legacy BIOS Protocol is used to abstract legacy Option ROM usage + under EFI and Legacy OS boot. This file also includes all the related + COMPATIBILIY16 structures and defintions. + + Note: The names for EFI_IA32_REGISTER_SET elements were picked to follow + well known naming conventions. + + Thunk is the code that switches from 32-bit protected environment into the 16-bit real-mode + environment. Reverse thunk is the code that does the opposite. + +Copyright (c) 2007 - 2015, 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 that 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. + + @par Revision Reference: + This protocol is defined in Framework for EFI Compatibility Support Module spec + Version 0.98. + +**/ + +#ifndef _EFI_LEGACY_BIOS_H_ +#define _EFI_LEGACY_BIOS_H_ + +/// +/// +/// +#pragma pack(1) + +typedef UINT8 SERIAL_MODE; +typedef UINT8 PARALLEL_MODE; + +#define EFI_COMPATIBILITY16_TABLE_SIGNATURE SIGNATURE_32 ('I', 'F', 'E', '$') + +/// +/// There is a table located within the traditional BIOS in either the 0xF000:xxxx or 0xE000:xxxx +/// physical address range. It is located on a 16-byte boundary and provides the physical address of the +/// entry point for the Compatibility16 functions. These functions provide the platform-specific +/// information that is required by the generic EfiCompatibility code. The functions are invoked via +/// thunking by using EFI_LEGACY_BIOS_PROTOCOL.FarCall86() with the 32-bit physical +/// entry point. +/// +typedef struct { + /// + /// The string "$EFI" denotes the start of the EfiCompatibility table. Byte 0 is "I," byte + /// 1 is "F," byte 2 is "E," and byte 3 is "$" and is normally accessed as a DWORD or UINT32. + /// + UINT32 Signature; + + /// + /// The value required such that byte checksum of TableLength equals zero. + /// + UINT8 TableChecksum; + + /// + /// The length of this table. + /// + UINT8 TableLength; + + /// + /// The major EFI revision for which this table was generated. + /// + UINT8 EfiMajorRevision; + + /// + /// The minor EFI revision for which this table was generated. + /// + UINT8 EfiMinorRevision; + + /// + /// The major revision of this table. + /// + UINT8 TableMajorRevision; + + /// + /// The minor revision of this table. + /// + UINT8 TableMinorRevision; + + /// + /// Reserved for future usage. + /// + UINT16 Reserved; + + /// + /// The segment of the entry point within the traditional BIOS for Compatibility16 functions. + /// + UINT16 Compatibility16CallSegment; + + /// + /// The offset of the entry point within the traditional BIOS for Compatibility16 functions. + /// + UINT16 Compatibility16CallOffset; + + /// + /// The segment of the entry point within the traditional BIOS for EfiCompatibility + /// to invoke the PnP installation check. + /// + UINT16 PnPInstallationCheckSegment; + + /// + /// The Offset of the entry point within the traditional BIOS for EfiCompatibility + /// to invoke the PnP installation check. + /// + UINT16 PnPInstallationCheckOffset; + + /// + /// EFI system resources table. Type EFI_SYSTEM_TABLE is defined in the IntelPlatform + ///Innovation Framework for EFI Driver Execution Environment Core Interface Specification (DXE CIS). + /// + UINT32 EfiSystemTable; + + /// + /// The address of an OEM-provided identifier string. The string is null terminated. + /// + UINT32 OemIdStringPointer; + + /// + /// The 32-bit physical address where ACPI RSD PTR is stored within the traditional + /// BIOS. The remained of the ACPI tables are located at their EFI addresses. The size + /// reserved is the maximum for ACPI 2.0. The EfiCompatibility will fill in the ACPI + /// RSD PTR with either the ACPI 1.0b or 2.0 values. + /// + UINT32 AcpiRsdPtrPointer; + + /// + /// The OEM revision number. Usage is undefined but provided for OEM module usage. + /// + UINT16 OemRevision; + + /// + /// The 32-bit physical address where INT15 E820 data is stored within the traditional + /// BIOS. The EfiCompatibility code will fill in the E820Pointer value and copy the + /// data to the indicated area. + /// + UINT32 E820Pointer; + + /// + /// The length of the E820 data and is filled in by the EfiCompatibility code. + /// + UINT32 E820Length; + + /// + /// The 32-bit physical address where the $PIR table is stored in the traditional BIOS. + /// The EfiCompatibility code will fill in the IrqRoutingTablePointer value and + /// copy the data to the indicated area. + /// + UINT32 IrqRoutingTablePointer; + + /// + /// The length of the $PIR table and is filled in by the EfiCompatibility code. + /// + UINT32 IrqRoutingTableLength; + + /// + /// The 32-bit physical address where the MP table is stored in the traditional BIOS. + /// The EfiCompatibility code will fill in the MpTablePtr value and copy the data + /// to the indicated area. + /// + UINT32 MpTablePtr; + + /// + /// The length of the MP table and is filled in by the EfiCompatibility code. + /// + UINT32 MpTableLength; + + /// + /// The segment of the OEM-specific INT table/code. + /// + UINT16 OemIntSegment; + + /// + /// The offset of the OEM-specific INT table/code. + /// + UINT16 OemIntOffset; + + /// + /// The segment of the OEM-specific 32-bit table/code. + /// + UINT16 Oem32Segment; + + /// + /// The offset of the OEM-specific 32-bit table/code. + /// + UINT16 Oem32Offset; + + /// + /// The segment of the OEM-specific 16-bit table/code. + /// + UINT16 Oem16Segment; + + /// + /// The offset of the OEM-specific 16-bit table/code. + /// + UINT16 Oem16Offset; + + /// + /// The segment of the TPM binary passed to 16-bit CSM. + /// + UINT16 TpmSegment; + + /// + /// The offset of the TPM binary passed to 16-bit CSM. + /// + UINT16 TpmOffset; + + /// + /// A pointer to a string identifying the independent BIOS vendor. + /// + UINT32 IbvPointer; + + /// + /// This field is NULL for all systems not supporting PCI Express. This field is the base + /// value of the start of the PCI Express memory-mapped configuration registers and + /// must be filled in prior to EfiCompatibility code issuing the Compatibility16 function + /// Compatibility16InitializeYourself(). + /// Compatibility16InitializeYourself() is defined in Compatability16 + /// Functions. + /// + UINT32 PciExpressBase; + + /// + /// Maximum PCI bus number assigned. + /// + UINT8 LastPciBus; + + /// + /// Start Address of Upper Memory Area (UMA) to be set as Read/Write. If + /// UmaAddress is a valid address in the shadow RAM, it also indicates that the region + /// from 0xC0000 to (UmaAddress - 1) can be used for Option ROM. + /// + UINT32 UmaAddress; + + /// + /// Upper Memory Area size in bytes to be set as Read/Write. If zero, no UMA region + /// will be set as Read/Write (i.e. all Shadow RAM is set as Read-Only). + /// + UINT32 UmaSize; + + /// + /// Start Address of high memory that can be used for permanent allocation. If zero, + /// high memory is not available for permanent allocation. + /// + UINT32 HiPermanentMemoryAddress; + + /// + /// Size of high memory that can be used for permanent allocation in bytes. If zero, + /// high memory is not available for permanent allocation. + /// + UINT32 HiPermanentMemorySize; +} EFI_COMPATIBILITY16_TABLE; + +/// +/// Functions provided by the CSM binary which communicate between the EfiCompatibility +/// and Compatability16 code. +/// +/// Inconsistent with the specification here: +/// The member's name started with "Compatibility16" [defined in Intel Framework +/// Compatibility Support Module Specification / 0.97 version] +/// has been changed to "Legacy16" since keeping backward compatible. +/// +typedef enum { + /// + /// Causes the Compatibility16 code to do any internal initialization required. + /// Input: + /// AX = Compatibility16InitializeYourself + /// ES:BX = Pointer to EFI_TO_COMPATIBILITY16_INIT_TABLE + /// Return: + /// AX = Return Status codes + /// + Legacy16InitializeYourself = 0x0000, + + /// + /// Causes the Compatibility16 BIOS to perform any drive number translations to match the boot sequence. + /// Input: + /// AX = Compatibility16UpdateBbs + /// ES:BX = Pointer to EFI_TO_COMPATIBILITY16_BOOT_TABLE + /// Return: + /// AX = Returned status codes + /// + Legacy16UpdateBbs = 0x0001, + + /// + /// Allows the Compatibility16 code to perform any final actions before booting. The Compatibility16 + /// code is read/write. + /// Input: + /// AX = Compatibility16PrepareToBoot + /// ES:BX = Pointer to EFI_TO_COMPATIBILITY16_BOOT_TABLE structure + /// Return: + /// AX = Returned status codes + /// + Legacy16PrepareToBoot = 0x0002, + + /// + /// Causes the Compatibility16 BIOS to boot. The Compatibility16 code is Read/Only. + /// Input: + /// AX = Compatibility16Boot + /// Output: + /// AX = Returned status codes + /// + Legacy16Boot = 0x0003, + + /// + /// Allows the Compatibility16 code to get the last device from which a boot was attempted. This is + /// stored in CMOS and is the priority number of the last attempted boot device. + /// Input: + /// AX = Compatibility16RetrieveLastBootDevice + /// Output: + /// AX = Returned status codes + /// BX = Priority number of the boot device. + /// + Legacy16RetrieveLastBootDevice = 0x0004, + + /// + /// Allows the Compatibility16 code rehook INT13, INT18, and/or INT19 after dispatching a legacy OpROM. + /// Input: + /// AX = Compatibility16DispatchOprom + /// ES:BX = Pointer to EFI_DISPATCH_OPROM_TABLE + /// Output: + /// AX = Returned status codes + /// BX = Number of non-BBS-compliant devices found. Equals 0 if BBS compliant. + /// + Legacy16DispatchOprom = 0x0005, + + /// + /// Finds a free area in the 0xFxxxx or 0xExxxx region of the specified length and returns the address + /// of that region. + /// Input: + /// AX = Compatibility16GetTableAddress + /// BX = Allocation region + /// 00 = Allocate from either 0xE0000 or 0xF0000 64 KB blocks. + /// Bit 0 = 1 Allocate from 0xF0000 64 KB block + /// Bit 1 = 1 Allocate from 0xE0000 64 KB block + /// CX = Requested length in bytes. + /// DX = Required address alignment. Bit mapped. First non-zero bit from the right is the alignment. + /// Output: + /// AX = Returned status codes + /// DS:BX = Address of the region + /// + Legacy16GetTableAddress = 0x0006, + + /// + /// Enables the EfiCompatibility module to do any nonstandard processing of keyboard LEDs or state. + /// Input: + /// AX = Compatibility16SetKeyboardLeds + /// CL = LED status. + /// Bit 0 Scroll Lock 0 = Off + /// Bit 1 NumLock + /// Bit 2 Caps Lock + /// Output: + /// AX = Returned status codes + /// + Legacy16SetKeyboardLeds = 0x0007, + + /// + /// Enables the EfiCompatibility module to install an interrupt handler for PCI mass media devices that + /// do not have an OpROM associated with them. An example is SATA. + /// Input: + /// AX = Compatibility16InstallPciHandler + /// ES:BX = Pointer to EFI_LEGACY_INSTALL_PCI_HANDLER structure + /// Output: + /// AX = Returned status codes + /// + Legacy16InstallPciHandler = 0x0008 +} EFI_COMPATIBILITY_FUNCTIONS; + + +/// +/// EFI_DISPATCH_OPROM_TABLE +/// +typedef struct { + UINT16 PnPInstallationCheckSegment; ///< A pointer to the PnpInstallationCheck data structure. + UINT16 PnPInstallationCheckOffset; ///< A pointer to the PnpInstallationCheck data structure. + UINT16 OpromSegment; ///< The segment where the OpROM was placed. Offset is assumed to be 3. + UINT8 PciBus; ///< The PCI bus. + UINT8 PciDeviceFunction; ///< The PCI device * 0x08 | PCI function. + UINT8 NumberBbsEntries; ///< The number of valid BBS table entries upon entry and exit. The IBV code may + ///< increase this number, if BBS-compliant devices also hook INTs in order to force the + ///< OpROM BIOS Setup to be executed. + UINT32 BbsTablePointer; ///< A pointer to the BBS table. + UINT16 RuntimeSegment; ///< The segment where the OpROM can be relocated to. If this value is 0x0000, this + ///< means that the relocation of this run time code is not supported. + ///< Inconsistent with specification here: + ///< The member's name "OpromDestinationSegment" [defined in Intel Framework Compatibility Support Module Specification / 0.97 version] + ///< has been changed to "RuntimeSegment" since keeping backward compatible. + +} EFI_DISPATCH_OPROM_TABLE; + +/// +/// EFI_TO_COMPATIBILITY16_INIT_TABLE +/// +typedef struct { + /// + /// Starting address of memory under 1 MB. The ending address is assumed to be 640 KB or 0x9FFFF. + /// + UINT32 BiosLessThan1MB; + + /// + /// The starting address of the high memory block. + /// + UINT32 HiPmmMemory; + + /// + /// The length of high memory block. + /// + UINT32 HiPmmMemorySizeInBytes; + + /// + /// The segment of the reverse thunk call code. + /// + UINT16 ReverseThunkCallSegment; + + /// + /// The offset of the reverse thunk call code. + /// + UINT16 ReverseThunkCallOffset; + + /// + /// The number of E820 entries copied to the Compatibility16 BIOS. + /// + UINT32 NumberE820Entries; + + /// + /// The amount of usable memory above 1 MB, e.g., E820 type 1 memory. + /// + UINT32 OsMemoryAbove1Mb; + + /// + /// The start of thunk code in main memory. Memory cannot be used by BIOS or PMM. + /// + UINT32 ThunkStart; + + /// + /// The size of the thunk code. + /// + UINT32 ThunkSizeInBytes; + + /// + /// Starting address of memory under 1 MB. + /// + UINT32 LowPmmMemory; + + /// + /// The length of low Memory block. + /// + UINT32 LowPmmMemorySizeInBytes; +} EFI_TO_COMPATIBILITY16_INIT_TABLE; + +/// +/// DEVICE_PRODUCER_SERIAL. +/// +typedef struct { + UINT16 Address; ///< I/O address assigned to the serial port. + UINT8 Irq; ///< IRQ assigned to the serial port. + SERIAL_MODE Mode; ///< Mode of serial port. Values are defined below. +} DEVICE_PRODUCER_SERIAL; + +/// +/// DEVICE_PRODUCER_SERIAL's modes. +///@{ +#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 +///@) + +/// +/// DEVICE_PRODUCER_PARALLEL. +/// +typedef struct { + UINT16 Address; ///< I/O address assigned to the parallel port. + UINT8 Irq; ///< IRQ assigned to the parallel port. + UINT8 Dma; ///< DMA assigned to the parallel port. + PARALLEL_MODE Mode; ///< Mode of the parallel port. Values are defined below. +} DEVICE_PRODUCER_PARALLEL; + +/// +/// DEVICE_PRODUCER_PARALLEL's modes. +///@{ +#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 +///@} + +/// +/// DEVICE_PRODUCER_FLOPPY +/// +typedef struct { + UINT16 Address; ///< I/O address assigned to the floppy. + UINT8 Irq; ///< IRQ assigned to the floppy. + UINT8 Dma; ///< DMA assigned to the floppy. + UINT8 NumberOfFloppy; ///< Number of floppies in the system. +} DEVICE_PRODUCER_FLOPPY; + +/// +/// LEGACY_DEVICE_FLAGS +/// +typedef struct { + UINT32 A20Kybd : 1; ///< A20 controller by keyboard controller. + UINT32 A20Port90 : 1; ///< A20 controlled by port 0x92. + UINT32 Reserved : 30; ///< Reserved for future usage. +} LEGACY_DEVICE_FLAGS; + +/// +/// DEVICE_PRODUCER_DATA_HEADER +/// +typedef struct { + DEVICE_PRODUCER_SERIAL Serial[4]; ///< Data for serial port x. Type DEVICE_PRODUCER_SERIAL is defined below. + DEVICE_PRODUCER_PARALLEL Parallel[3]; ///< Data for parallel port x. Type DEVICE_PRODUCER_PARALLEL is defined below. + DEVICE_PRODUCER_FLOPPY Floppy; ///< Data for floppy. Type DEVICE_PRODUCER_FLOPPY is defined below. + UINT8 MousePresent; ///< Flag to indicate if mouse is present. + LEGACY_DEVICE_FLAGS Flags; ///< Miscellaneous Boolean state information passed to CSM. +} DEVICE_PRODUCER_DATA_HEADER; + +/// +/// ATAPI_IDENTIFY +/// +typedef struct { + UINT16 Raw[256]; ///< Raw data from the IDE IdentifyDrive command. +} ATAPI_IDENTIFY; + +/// +/// HDD_INFO +/// +typedef struct { + /// + /// Status of IDE device. Values are defined below. There is one HDD_INFO structure + /// per IDE controller. The IdentifyDrive is per drive. Index 0 is master and index + /// 1 is slave. + /// + UINT16 Status; + + /// + /// PCI bus of IDE controller. + /// + UINT32 Bus; + + /// + /// PCI device of IDE controller. + /// + UINT32 Device; + + /// + /// PCI function of IDE controller. + /// + UINT32 Function; + + /// + /// Command ports base address. + /// + UINT16 CommandBaseAddress; + + /// + /// Control ports base address. + /// + UINT16 ControlBaseAddress; + + /// + /// Bus master address. + /// + UINT16 BusMasterAddress; + + UINT8 HddIrq; + + /// + /// Data that identifies the drive data; one per possible attached drive. + /// + ATAPI_IDENTIFY IdentifyDrive[2]; +} HDD_INFO; + +/// +/// HDD_INFO status bits +/// +#define HDD_PRIMARY 0x01 +#define HDD_SECONDARY 0x02 +#define HDD_MASTER_ATAPI_CDROM 0x04 +#define HDD_SLAVE_ATAPI_CDROM 0x08 +#define HDD_MASTER_IDE 0x20 +#define HDD_SLAVE_IDE 0x40 +#define HDD_MASTER_ATAPI_ZIPDISK 0x10 +#define HDD_SLAVE_ATAPI_ZIPDISK 0x80 + +/// +/// BBS_STATUS_FLAGS;\. +/// +typedef struct { + UINT16 OldPosition : 4; ///< Prior priority. + UINT16 Reserved1 : 4; ///< Reserved for future use. + UINT16 Enabled : 1; ///< If 0, ignore this entry. + UINT16 Failed : 1; ///< 0 = Not known if boot failure occurred. + ///< 1 = Boot attempted failed. + + /// + /// State of media present. + /// 00 = No bootable media is present in the device. + /// 01 = Unknown if a bootable media present. + /// 10 = Media is present and appears bootable. + /// 11 = Reserved. + /// + UINT16 MediaPresent : 2; + UINT16 Reserved2 : 4; ///< Reserved for future use. +} BBS_STATUS_FLAGS; + +/// +/// BBS_TABLE, device type values & boot priority values. +/// +typedef struct { + /// + /// The boot priority for this boot device. Values are defined below. + /// + UINT16 BootPriority; + + /// + /// The PCI bus for this boot device. + /// + UINT32 Bus; + + /// + /// The PCI device for this boot device. + /// + UINT32 Device; + + /// + /// The PCI function for the boot device. + /// + UINT32 Function; + + /// + /// The PCI class for this boot device. + /// + UINT8 Class; + + /// + /// The PCI Subclass for this boot device. + /// + UINT8 SubClass; + + /// + /// Segment:offset address of an ASCIIZ description string describing the manufacturer. + /// + UINT16 MfgStringOffset; + + /// + /// Segment:offset address of an ASCIIZ description string describing the manufacturer. + /// + UINT16 MfgStringSegment; + + /// + /// BBS device type. BBS device types are defined below. + /// + UINT16 DeviceType; + + /// + /// Status of this boot device. Type BBS_STATUS_FLAGS is defined below. + /// + BBS_STATUS_FLAGS StatusFlags; + + /// + /// Segment:Offset address of boot loader for IPL devices or install INT13 handler for + /// BCV devices. + /// + UINT16 BootHandlerOffset; + + /// + /// Segment:Offset address of boot loader for IPL devices or install INT13 handler for + /// BCV devices. + /// + UINT16 BootHandlerSegment; + + /// + /// Segment:offset address of an ASCIIZ description string describing this device. + /// + UINT16 DescStringOffset; + + /// + /// Segment:offset address of an ASCIIZ description string describing this device. + /// + UINT16 DescStringSegment; + + /// + /// Reserved. + /// + UINT32 InitPerReserved; + + /// + /// The use of these fields is IBV dependent. They can be used to flag that an OpROM + /// has hooked the specified IRQ. The OpROM may be BBS compliant as some SCSI + /// BBS-compliant OpROMs also hook IRQ vectors in order to run their BIOS Setup + /// + UINT32 AdditionalIrq13Handler; + + /// + /// The use of these fields is IBV dependent. They can be used to flag that an OpROM + /// has hooked the specified IRQ. The OpROM may be BBS compliant as some SCSI + /// BBS-compliant OpROMs also hook IRQ vectors in order to run their BIOS Setup + /// + UINT32 AdditionalIrq18Handler; + + /// + /// The use of these fields is IBV dependent. They can be used to flag that an OpROM + /// has hooked the specified IRQ. The OpROM may be BBS compliant as some SCSI + /// BBS-compliant OpROMs also hook IRQ vectors in order to run their BIOS Setup + /// + UINT32 AdditionalIrq19Handler; + + /// + /// The use of these fields is IBV dependent. They can be used to flag that an OpROM + /// has hooked the specified IRQ. The OpROM may be BBS compliant as some SCSI + /// BBS-compliant OpROMs also hook IRQ vectors in order to run their BIOS Setup + /// + UINT32 AdditionalIrq40Handler; + UINT8 AssignedDriveNumber; + UINT32 AdditionalIrq41Handler; + UINT32 AdditionalIrq46Handler; + UINT32 IBV1; + UINT32 IBV2; +} BBS_TABLE; + +/// +/// BBS device type values +///@{ +#define BBS_FLOPPY 0x01 +#define BBS_HARDDISK 0x02 +#define BBS_CDROM 0x03 +#define BBS_PCMCIA 0x04 +#define BBS_USB 0x05 +#define BBS_EMBED_NETWORK 0x06 +#define BBS_BEV_DEVICE 0x80 +#define BBS_UNKNOWN 0xff +///@} + +/// +/// BBS boot priority values +///@{ +#define BBS_DO_NOT_BOOT_FROM 0xFFFC +#define BBS_LOWEST_PRIORITY 0xFFFD +#define BBS_UNPRIORITIZED_ENTRY 0xFFFE +#define BBS_IGNORE_ENTRY 0xFFFF +///@} + +/// +/// SMM_ATTRIBUTES +/// +typedef struct { + /// + /// Access mechanism used to generate the soft SMI. Defined types are below. The other + /// values are reserved for future usage. + /// + UINT16 Type : 3; + + /// + /// The size of "port" in bits. Defined values are below. + /// + UINT16 PortGranularity : 3; + + /// + /// The size of data in bits. Defined values are below. + /// + UINT16 DataGranularity : 3; + + /// + /// Reserved for future use. + /// + UINT16 Reserved : 7; +} SMM_ATTRIBUTES; + +/// +/// SMM_ATTRIBUTES type values. +///@{ +#define STANDARD_IO 0x00 +#define STANDARD_MEMORY 0x01 +///@} + +/// +/// SMM_ATTRIBUTES port size constants. +///@{ +#define PORT_SIZE_8 0x00 +#define PORT_SIZE_16 0x01 +#define PORT_SIZE_32 0x02 +#define PORT_SIZE_64 0x03 +///@} + +/// +/// SMM_ATTRIBUTES data size constants. +///@{ +#define DATA_SIZE_8 0x00 +#define DATA_SIZE_16 0x01 +#define DATA_SIZE_32 0x02 +#define DATA_SIZE_64 0x03 +///@} + +/// +/// SMM_FUNCTION & relating constants. +/// +typedef struct { + UINT16 Function : 15; + UINT16 Owner : 1; +} SMM_FUNCTION; + +/// +/// SMM_FUNCTION Function constants. +///@{ +#define INT15_D042 0x0000 +#define GET_USB_BOOT_INFO 0x0001 +#define DMI_PNP_50_57 0x0002 +///@} + +/// +/// SMM_FUNCTION Owner constants. +///@{ +#define STANDARD_OWNER 0x0 +#define OEM_OWNER 0x1 +///@} + +/// +/// This structure assumes both port and data sizes are 1. SmmAttribute must be +/// properly to reflect that assumption. +/// +typedef struct { + /// + /// Describes the access mechanism, SmmPort, and SmmData sizes. Type + /// SMM_ATTRIBUTES is defined below. + /// + SMM_ATTRIBUTES SmmAttributes; + + /// + /// Function Soft SMI is to perform. Type SMM_FUNCTION is defined below. + /// + SMM_FUNCTION SmmFunction; + + /// + /// SmmPort size depends upon SmmAttributes and ranges from2 bytes to 16 bytes. + /// + UINT8 SmmPort; + + /// + /// SmmData size depends upon SmmAttributes and ranges from2 bytes to 16 bytes. + /// + UINT8 SmmData; +} SMM_ENTRY; + +/// +/// SMM_TABLE +/// +typedef struct { + UINT16 NumSmmEntries; ///< Number of entries represented by SmmEntry. + SMM_ENTRY SmmEntry; ///< One entry per function. Type SMM_ENTRY is defined below. +} SMM_TABLE; + +/// +/// UDC_ATTRIBUTES +/// +typedef struct { + /// + /// This bit set indicates that the ServiceAreaData is valid. + /// + UINT8 DirectoryServiceValidity : 1; + + /// + /// This bit set indicates to use the Reserve Area Boot Code Address (RACBA) only if + /// DirectoryServiceValidity is 0. + /// + UINT8 RabcaUsedFlag : 1; + + /// + /// This bit set indicates to execute hard disk diagnostics. + /// + UINT8 ExecuteHddDiagnosticsFlag : 1; + + /// + /// Reserved for future use. Set to 0. + /// + UINT8 Reserved : 5; +} UDC_ATTRIBUTES; + +/// +/// UD_TABLE +/// +typedef struct { + /// + /// This field contains the bit-mapped attributes of the PARTIES information. Type + /// UDC_ATTRIBUTES is defined below. + /// + UDC_ATTRIBUTES Attributes; + + /// + /// This field contains the zero-based device on which the selected + /// ServiceDataArea is present. It is 0 for master and 1 for the slave device. + /// + UINT8 DeviceNumber; + + /// + /// This field contains the zero-based index into the BbsTable for the parent device. + /// This index allows the user to reference the parent device information such as PCI + /// bus, device function. + /// + UINT8 BbsTableEntryNumberForParentDevice; + + /// + /// This field contains the zero-based index into the BbsTable for the boot entry. + /// + UINT8 BbsTableEntryNumberForBoot; + + /// + /// This field contains the zero-based index into the BbsTable for the HDD diagnostics entry. + /// + UINT8 BbsTableEntryNumberForHddDiag; + + /// + /// The raw Beer data. + /// + UINT8 BeerData[128]; + + /// + /// The raw data of selected service area. + /// + UINT8 ServiceAreaData[64]; +} UD_TABLE; + +#define EFI_TO_LEGACY_MAJOR_VERSION 0x02 +#define EFI_TO_LEGACY_MINOR_VERSION 0x00 +#define MAX_IDE_CONTROLLER 8 + +/// +/// EFI_TO_COMPATIBILITY16_BOOT_TABLE +/// +typedef struct { + UINT16 MajorVersion; ///< The EfiCompatibility major version number. + UINT16 MinorVersion; ///< The EfiCompatibility minor version number. + UINT32 AcpiTable; ///< The location of the RSDT ACPI table. < 4G range. + UINT32 SmbiosTable; ///< The location of the SMBIOS table in EFI memory. < 4G range. + UINT32 SmbiosTableLength; + // + // Legacy SIO state + // + DEVICE_PRODUCER_DATA_HEADER SioData; ///< Standard traditional device information. + UINT16 DevicePathType; ///< The default boot type. + UINT16 PciIrqMask; ///< Mask of which IRQs have been assigned to PCI. + UINT32 NumberE820Entries; ///< Number of E820 entries. The number can change from the + ///< Compatibility16InitializeYourself() function. + // + // Controller & Drive Identify[2] per controller information + // + HDD_INFO HddInfo[MAX_IDE_CONTROLLER]; ///< Hard disk drive information, including raw Identify Drive data. + UINT32 NumberBbsEntries; ///< Number of entries in the BBS table + UINT32 BbsTable; ///< A pointer to the BBS table. Type BBS_TABLE is defined below. + UINT32 SmmTable; ///< A pointer to the SMM table. Type SMM_TABLE is defined below. + UINT32 OsMemoryAbove1Mb; ///< The amount of usable memory above 1 MB, i.e. E820 type 1 memory. This value can + ///< differ from the value in EFI_TO_COMPATIBILITY16_INIT_TABLE as more + ///< memory may have been discovered. + UINT32 UnconventionalDeviceTable; ///< Information to boot off an unconventional device like a PARTIES partition. Type + ///< UD_TABLE is defined below. +} EFI_TO_COMPATIBILITY16_BOOT_TABLE; + +/// +/// EFI_LEGACY_INSTALL_PCI_HANDLER +/// +typedef struct { + UINT8 PciBus; ///< The PCI bus of the device. + UINT8 PciDeviceFun; ///< The PCI device in bits 7:3 and function in bits 2:0. + UINT8 PciSegment; ///< The PCI segment of the device. + UINT8 PciClass; ///< The PCI class code of the device. + UINT8 PciSubclass; ///< The PCI subclass code of the device. + UINT8 PciInterface; ///< The PCI interface code of the device. + // + // Primary section + // + UINT8 PrimaryIrq; ///< The primary device IRQ. + UINT8 PrimaryReserved; ///< Reserved. + UINT16 PrimaryControl; ///< The primary device control I/O base. + UINT16 PrimaryBase; ///< The primary device I/O base. + UINT16 PrimaryBusMaster; ///< The primary device bus master I/O base. + // + // Secondary Section + // + UINT8 SecondaryIrq; ///< The secondary device IRQ. + UINT8 SecondaryReserved; ///< Reserved. + UINT16 SecondaryControl; ///< The secondary device control I/O base. + UINT16 SecondaryBase; ///< The secondary device I/O base. + UINT16 SecondaryBusMaster; ///< The secondary device bus master I/O base. +} EFI_LEGACY_INSTALL_PCI_HANDLER; + +// +// Restore default pack value +// +#pragma pack() + +#define EFI_LEGACY_BIOS_PROTOCOL_GUID \ + { \ + 0xdb9a1e3d, 0x45cb, 0x4abb, {0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d } \ + } + +typedef struct _EFI_LEGACY_BIOS_PROTOCOL EFI_LEGACY_BIOS_PROTOCOL; + +/// +/// Flags returned by CheckPciRom(). +/// +#define NO_ROM 0x00 +#define ROM_FOUND 0x01 +#define VALID_LEGACY_ROM 0x02 +#define ROM_WITH_CONFIG 0x04 ///< Not defined in the Framework CSM Specification. + +/// +/// The following macros do not appear in the Framework CSM Specification and +/// are kept for backward compatibility only. They convert 32-bit address (_Adr) +/// to Segment:Offset 16-bit form. +/// +///@{ +#define EFI_SEGMENT(_Adr) (UINT16) ((UINT16) (((UINTN) (_Adr)) >> 4) & 0xf000) +#define EFI_OFFSET(_Adr) (UINT16) (((UINT16) ((UINTN) (_Adr))) & 0xffff) +///@} + +#define CARRY_FLAG 0x01 + +/// +/// EFI_EFLAGS_REG +/// +typedef struct { + UINT32 CF:1; + UINT32 Reserved1:1; + UINT32 PF:1; + UINT32 Reserved2:1; + UINT32 AF:1; + UINT32 Reserved3:1; + UINT32 ZF:1; + UINT32 SF:1; + UINT32 TF:1; + UINT32 IF:1; + UINT32 DF:1; + UINT32 OF:1; + UINT32 IOPL:2; + UINT32 NT:1; + UINT32 Reserved4:2; + UINT32 VM:1; + UINT32 Reserved5:14; +} EFI_EFLAGS_REG; + +/// +/// EFI_DWORD_REGS +/// +typedef struct { + UINT32 EAX; + UINT32 EBX; + UINT32 ECX; + UINT32 EDX; + UINT32 ESI; + UINT32 EDI; + EFI_EFLAGS_REG EFlags; + UINT16 ES; + UINT16 CS; + UINT16 SS; + UINT16 DS; + UINT16 FS; + UINT16 GS; + UINT32 EBP; + UINT32 ESP; +} EFI_DWORD_REGS; + +/// +/// EFI_FLAGS_REG +/// +typedef struct { + UINT16 CF:1; + UINT16 Reserved1:1; + UINT16 PF:1; + UINT16 Reserved2:1; + UINT16 AF:1; + UINT16 Reserved3:1; + UINT16 ZF:1; + UINT16 SF:1; + UINT16 TF:1; + UINT16 IF:1; + UINT16 DF:1; + UINT16 OF:1; + UINT16 IOPL:2; + UINT16 NT:1; + UINT16 Reserved4:1; +} EFI_FLAGS_REG; + +/// +/// EFI_WORD_REGS +/// +typedef struct { + UINT16 AX; + UINT16 ReservedAX; + UINT16 BX; + UINT16 ReservedBX; + UINT16 CX; + UINT16 ReservedCX; + UINT16 DX; + UINT16 ReservedDX; + UINT16 SI; + UINT16 ReservedSI; + UINT16 DI; + UINT16 ReservedDI; + EFI_FLAGS_REG Flags; + UINT16 ReservedFlags; + UINT16 ES; + UINT16 CS; + UINT16 SS; + UINT16 DS; + UINT16 FS; + UINT16 GS; + UINT16 BP; + UINT16 ReservedBP; + UINT16 SP; + UINT16 ReservedSP; +} EFI_WORD_REGS; + +/// +/// EFI_BYTE_REGS +/// +typedef struct { + UINT8 AL, AH; + UINT16 ReservedAX; + UINT8 BL, BH; + UINT16 ReservedBX; + UINT8 CL, CH; + UINT16 ReservedCX; + UINT8 DL, DH; + UINT16 ReservedDX; +} EFI_BYTE_REGS; + +/// +/// EFI_IA32_REGISTER_SET +/// +typedef union { + EFI_DWORD_REGS E; + EFI_WORD_REGS X; + EFI_BYTE_REGS H; +} EFI_IA32_REGISTER_SET; + +/** + Thunk to 16-bit real mode and execute a software interrupt with a vector + of BiosInt. Regs will contain the 16-bit register context on entry and + exit. + + @param[in] This The protocol instance pointer. + @param[in] BiosInt The processor interrupt vector to invoke. + @param[in,out] Reg Register contexted passed into (and returned) from thunk to + 16-bit mode. + + @retval TRUE Thunk completed with no BIOS errors in the target code. See Regs for status. + @retval FALSE There was a BIOS error in the target code. +**/ +typedef +BOOLEAN +(EFIAPI *EFI_LEGACY_BIOS_INT86)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN UINT8 BiosInt, + IN OUT EFI_IA32_REGISTER_SET *Regs + ); + +/** + Thunk to 16-bit real mode and call Segment:Offset. Regs will contain the + 16-bit register context on entry and exit. Arguments can be passed on + the Stack argument + + @param[in] This The protocol instance pointer. + @param[in] Segment The segemnt of 16-bit mode call. + @param[in] Offset The offset of 16-bit mdoe call. + @param[in] Reg Register contexted passed into (and returned) from thunk to + 16-bit mode. + @param[in] Stack The caller allocated stack used to pass arguments. + @param[in] StackSize The size of Stack in bytes. + + @retval FALSE Thunk completed with no BIOS errors in the target code. See Regs for status. @retval TRUE There was a BIOS error in the target code. +**/ +typedef +BOOLEAN +(EFIAPI *EFI_LEGACY_BIOS_FARCALL86)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN UINT16 Segment, + IN UINT16 Offset, + IN EFI_IA32_REGISTER_SET *Regs, + IN VOID *Stack, + IN UINTN StackSize + ); + +/** + Test to see if a legacy PCI ROM exists for this device. Optionally return + the Legacy ROM instance for this PCI device. + + @param[in] This The protocol instance pointer. + @param[in] PciHandle The PCI PC-AT OPROM from this devices ROM BAR will be loaded + @param[out] RomImage Return the legacy PCI ROM for this device. + @param[out] RomSize The size of ROM Image. + @param[out] Flags Indicates if ROM found and if PC-AT. Multiple bits can be set as follows: + - 00 = No ROM. + - 01 = ROM Found. + - 02 = ROM is a valid legacy ROM. + + @retval EFI_SUCCESS The Legacy Option ROM available for this device + @retval EFI_UNSUPPORTED The Legacy Option ROM is not supported. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_CHECK_ROM)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN EFI_HANDLE PciHandle, + OUT VOID **RomImage, OPTIONAL + OUT UINTN *RomSize, OPTIONAL + OUT UINTN *Flags + ); + +/** + Load a legacy PC-AT OPROM on the PciHandle device. Return information + about how many disks were added by the OPROM and the shadow address and + size. DiskStart & DiskEnd are INT 13h drive letters. Thus 0x80 is C: + + @param[in] This The protocol instance pointer. + @param[in] PciHandle The PCI PC-AT OPROM from this devices ROM BAR will be loaded. + This value is NULL if RomImage is non-NULL. This is the normal + case. + @param[in] RomImage A PCI PC-AT ROM image. This argument is non-NULL if there is + no hardware associated with the ROM and thus no PciHandle, + otherwise is must be NULL. + Example is PXE base code. + @param[out] Flags The type of ROM discovered. Multiple bits can be set, as follows: + - 00 = No ROM. + - 01 = ROM found. + - 02 = ROM is a valid legacy ROM. + @param[out] DiskStart The disk number of first device hooked by the ROM. If DiskStart + is the same as DiskEnd no disked were hooked. + @param[out] DiskEnd disk number of the last device hooked by the ROM. + @param[out] RomShadowAddress Shadow address of PC-AT ROM. + @param[out] RomShadowSize Size of RomShadowAddress in bytes. + + @retval EFI_SUCCESS Thunk completed, see Regs for status. + @retval EFI_INVALID_PARAMETER PciHandle not found + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_INSTALL_ROM)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN EFI_HANDLE PciHandle, + IN VOID **RomImage, + OUT UINTN *Flags, + OUT UINT8 *DiskStart, OPTIONAL + OUT UINT8 *DiskEnd, OPTIONAL + OUT VOID **RomShadowAddress, OPTIONAL + OUT UINT32 *ShadowedRomSize OPTIONAL + ); + +/** + This function attempts to traditionally boot the specified BootOption. If the EFI context has + been compromised, this function will not return. This procedure is not used for loading an EFI-aware + OS off a traditional device. The following actions occur: + - Get EFI SMBIOS data structures, convert them to a traditional format, and copy to + Compatibility16. + - Get a pointer to ACPI data structures and copy the Compatibility16 RSD PTR to F0000 block. + - Find the traditional SMI handler from a firmware volume and register the traditional SMI + handler with the EFI SMI handler. + - Build onboard IDE information and pass this information to the Compatibility16 code. + - Make sure all PCI Interrupt Line registers are programmed to match 8259. + - Reconfigure SIO devices from EFI mode (polled) into traditional mode (interrupt driven). + - Shadow all PCI ROMs. + - Set up BDA and EBDA standard areas before the legacy boot. + - Construct the Compatibility16 boot memory map and pass it to the Compatibility16 code. + - Invoke the Compatibility16 table function Compatibility16PrepareToBoot(). This + invocation causes a thunk into the Compatibility16 code, which sets all appropriate internal + data structures. The boot device list is a parameter. + - Invoke the Compatibility16 Table function Compatibility16Boot(). This invocation + causes a thunk into the Compatibility16 code, which does an INT19. + - If the Compatibility16Boot() function returns, then the boot failed in a graceful + manner--meaning that the EFI code is still valid. An ungraceful boot failure causes a reset because the state + of EFI code is unknown. + + @param[in] This The protocol instance pointer. + @param[in] BootOption The EFI Device Path from BootXXXX variable. + @param[in] LoadOptionSize The size of LoadOption in size. + @param[in] LoadOption LThe oadOption from BootXXXX variable. + + @retval EFI_DEVICE_ERROR Failed to boot from any boot device and memory is uncorrupted. Note: This function normally does not returns. It will either boot the OS or reset the system if memory has been "corrupted" by loading a boot sector and passing control to it. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_BOOT)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN BBS_BBS_DEVICE_PATH *BootOption, + IN UINT32 LoadOptionsSize, + IN VOID *LoadOptions + ); + +/** + This function takes the Leds input parameter and sets/resets the BDA accordingly. + Leds is also passed to Compatibility16 code, in case any special processing is required. + This function is normally called from EFI Setup drivers that handle user-selectable + keyboard options such as boot with NUM LOCK on/off. This function does not + touch the keyboard or keyboard LEDs but only the BDA. + + @param[in] This The protocol instance pointer. + @param[in] Leds The status of current Scroll, Num & Cap lock LEDS: + - Bit 0 is Scroll Lock 0 = Not locked. + - Bit 1 is Num Lock. + - Bit 2 is Caps Lock. + + @retval EFI_SUCCESS The BDA was updated successfully. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_UPDATE_KEYBOARD_LED_STATUS)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN UINT8 Leds + ); + +/** + Retrieve legacy BBS info and assign boot priority. + + @param[in] This The protocol instance pointer. + @param[out] HddCount The number of HDD_INFO structures. + @param[out] HddInfo Onboard IDE controller information. + @param[out] BbsCount The number of BBS_TABLE structures. + @param[in,out] BbsTable Points to List of BBS_TABLE. + + @retval EFI_SUCCESS Tables were returned. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_GET_BBS_INFO)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + OUT UINT16 *HddCount, + OUT HDD_INFO **HddInfo, + OUT UINT16 *BbsCount, + IN OUT BBS_TABLE **BbsTable + ); + +/** + Assign drive number to legacy HDD drives prior to booting an EFI + aware OS so the OS can access drives without an EFI driver. + + @param[in] This The protocol instance pointer. + @param[out] BbsCount The number of BBS_TABLE structures + @param[out] BbsTable List of BBS entries + + @retval EFI_SUCCESS Drive numbers assigned. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_PREPARE_TO_BOOT_EFI)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + OUT UINT16 *BbsCount, + OUT BBS_TABLE **BbsTable + ); + +/** + To boot from an unconventional device like parties and/or execute + HDD diagnostics. + + @param[in] This The protocol instance pointer. + @param[in] Attributes How to interpret the other input parameters. + @param[in] BbsEntry The 0-based index into the BbsTable for the parent + device. + @param[in] BeerData A pointer to the 128 bytes of ram BEER data. + @param[in] ServiceAreaData A pointer to the 64 bytes of raw Service Area data. The + caller must provide a pointer to the specific Service + Area and not the start all Service Areas. + + @retval EFI_INVALID_PARAMETER If error. Does NOT return if no error. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_BOOT_UNCONVENTIONAL_DEVICE)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN UDC_ATTRIBUTES Attributes, + IN UINTN BbsEntry, + IN VOID *BeerData, + IN VOID *ServiceAreaData + ); + +/** + Shadow all legacy16 OPROMs that haven't been shadowed. + Warning: Use this with caution. This routine disconnects all EFI + drivers. If used externally, then the caller must re-connect EFI + drivers. + + @param[in] This The protocol instance pointer. + + @retval EFI_SUCCESS OPROMs were shadowed. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_SHADOW_ALL_LEGACY_OPROMS)( + IN EFI_LEGACY_BIOS_PROTOCOL *This + ); + +/** + Get a region from the LegacyBios for S3 usage. + + @param[in] This The protocol instance pointer. + @param[in] LegacyMemorySize The size of required region. + @param[in] Region The region to use. + 00 = Either 0xE0000 or 0xF0000 block. + - Bit0 = 1 0xF0000 block. + - Bit1 = 1 0xE0000 block. + @param[in] Alignment Address alignment. Bit mapped. The first non-zero + bit from right is alignment. + @param[out] LegacyMemoryAddress The Region Assigned + + @retval EFI_SUCCESS The Region was assigned. + @retval EFI_ACCESS_DENIED The function was previously invoked. + @retval Other The Region was not assigned. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_GET_LEGACY_REGION)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN UINTN LegacyMemorySize, + IN UINTN Region, + IN UINTN Alignment, + OUT VOID **LegacyMemoryAddress + ); + +/** + Get a region from the LegacyBios for Tiano usage. Can only be invoked once. + + @param[in] This The protocol instance pointer. + @param[in] LegacyMemorySize The size of data to copy. + @param[in] LegacyMemoryAddress The Legacy Region destination address. + Note: must be in region assigned by + LegacyBiosGetLegacyRegion. + @param[in] LegacyMemorySourceAddress The source of the data to copy. + + @retval EFI_SUCCESS The Region assigned. + @retval EFI_ACCESS_DENIED Destination was outside an assigned region. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_COPY_LEGACY_REGION)( + IN EFI_LEGACY_BIOS_PROTOCOL *This, + IN UINTN LegacyMemorySize, + IN VOID *LegacyMemoryAddress, + IN VOID *LegacyMemorySourceAddress + ); + +/// +/// Abstracts the traditional BIOS from the rest of EFI. The LegacyBoot() +/// member function allows the BDS to support booting a traditional OS. +/// EFI thunks drivers that make EFI bindings for BIOS INT services use +/// all the other member functions. +/// +struct _EFI_LEGACY_BIOS_PROTOCOL { + /// + /// Performs traditional software INT. See the Int86() function description. + /// + EFI_LEGACY_BIOS_INT86 Int86; + + /// + /// Performs a far call into Compatibility16 or traditional OpROM code. + /// + EFI_LEGACY_BIOS_FARCALL86 FarCall86; + + /// + /// Checks if a traditional OpROM exists for this device. + /// + EFI_LEGACY_BIOS_CHECK_ROM CheckPciRom; + + /// + /// Loads a traditional OpROM in traditional OpROM address space. + /// + EFI_LEGACY_BIOS_INSTALL_ROM InstallPciRom; + + /// + /// Boots a traditional OS. + /// + EFI_LEGACY_BIOS_BOOT LegacyBoot; + + /// + /// Updates BDA to reflect the current EFI keyboard LED status. + /// + EFI_LEGACY_BIOS_UPDATE_KEYBOARD_LED_STATUS UpdateKeyboardLedStatus; + + /// + /// Allows an external agent, such as BIOS Setup, to get the BBS data. + /// + EFI_LEGACY_BIOS_GET_BBS_INFO GetBbsInfo; + + /// + /// Causes all legacy OpROMs to be shadowed. + /// + EFI_LEGACY_BIOS_SHADOW_ALL_LEGACY_OPROMS ShadowAllLegacyOproms; + + /// + /// Performs all actions prior to boot. Used when booting an EFI-aware OS + /// rather than a legacy OS. + /// + EFI_LEGACY_BIOS_PREPARE_TO_BOOT_EFI PrepareToBootEfi; + + /// + /// Allows EFI to reserve an area in the 0xE0000 or 0xF0000 block. + /// + EFI_LEGACY_BIOS_GET_LEGACY_REGION GetLegacyRegion; + + /// + /// Allows EFI to copy data to the area specified by GetLegacyRegion. + /// + EFI_LEGACY_BIOS_COPY_LEGACY_REGION CopyLegacyRegion; + + /// + /// Allows the user to boot off an unconventional device such as a PARTIES partition. + /// + EFI_LEGACY_BIOS_BOOT_UNCONVENTIONAL_DEVICE BootUnconventionalDevice; +}; + +// +// Legacy BIOS needs to access memory in page 0 (0-4095), which is disabled if +// NULL pointer detection feature is enabled. Following macro can be used to +// enable/disable page 0 before/after accessing it. +// +#define ACCESS_PAGE0_CODE(statements) \ + do { \ + EFI_STATUS Status_; \ + EFI_GCD_MEMORY_SPACE_DESCRIPTOR Desc_; \ + \ + Desc_.Attributes = 0; \ + Status_ = gDS->GetMemorySpaceDescriptor (0, &Desc_); \ + ASSERT_EFI_ERROR (Status_); \ + if ((Desc_.Attributes & EFI_MEMORY_RP) != 0) { \ + Status_ = gDS->SetMemorySpaceAttributes ( \ + 0, \ + EFI_PAGES_TO_SIZE(1), \ + Desc_.Attributes & ~(UINT64)EFI_MEMORY_RP \ + ); \ + ASSERT_EFI_ERROR (Status_); \ + } \ + \ + { \ + statements; \ + } \ + \ + if ((Desc_.Attributes & EFI_MEMORY_RP) != 0) { \ + Status_ = gDS->SetMemorySpaceAttributes ( \ + 0, \ + EFI_PAGES_TO_SIZE(1), \ + Desc_.Attributes \ + ); \ + ASSERT_EFI_ERROR (Status_); \ + } \ + } while (FALSE) + +extern EFI_GUID gEfiLegacyBiosProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/LegacyBiosPlatform.h b/IntelFrameworkPkg/Include/Protocol/LegacyBiosPlatform.h new file mode 100644 index 000000000..0d309b5f1 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/LegacyBiosPlatform.h @@ -0,0 +1,761 @@ +/** @file + The EFI Legacy BIOS Patform Protocol is used to mate a Legacy16 + implementation with this EFI code. The EFI driver that produces + the Legacy BIOS protocol is generic and consumes this protocol. + A driver that matches the Legacy16 produces this protocol + +Copyright (c) 2007 - 2011, 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 that 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. + + @par Revision Reference: + This protocol is defined in Framework for EFI Compatibility Support Module spec + Version 0.97. + +**/ + +#ifndef _EFI_LEGACY_BIOS_PLATFORM_H_ +#define _EFI_LEGACY_BIOS_PLATFORM_H_ + +/// +/// Legacy BIOS Platform depends on HDD_INFO and EFI_COMPATIBILITY16_TABLE that +/// are defined with the Legacy BIOS Protocol +/// +#include + +#define EFI_LEGACY_BIOS_PLATFORM_PROTOCOL_GUID \ + { \ + 0x783658a3, 0x4172, 0x4421, {0xa2, 0x99, 0xe0, 0x9, 0x7, 0x9c, 0xc, 0xb4 } \ + } + +typedef struct _EFI_LEGACY_BIOS_PLATFORM_PROTOCOL EFI_LEGACY_BIOS_PLATFORM_PROTOCOL; + +/** + This enum specifies the Mode param values for GetPlatformInfo() +**/ +typedef enum { + /// + /// This mode is invoked twice. The first invocation has LegacySegment and + /// LegacyOffset set to 0. The mode returns the MP table address in EFI memory, along with its size. + /// The second invocation has LegacySegment and LegacyOffset set to the location + /// in the 0xF0000 or 0xE0000 block to which the MP table is to be copied. The second + /// invocation allows any MP table address fixes to occur in the EFI memory copy of the + /// MP table. The caller, not EfiGetPlatformBinaryMpTable, copies the modified MP + /// table to the allocated region in 0xF0000 or 0xE0000 block after the second invocation. + /// + /// The function parameters associated with this mode are: + /// + /// Table Pointer to the MP table. + /// + /// TableSize Size in bytes of the MP table. + /// + /// Location Location to place table. 0x00. Either 0xE0000 or 0xF0000 64 KB blocks. + /// Bit 0 = 1 0xF0000 64 KB block. + /// Bit 1 = 1 0xE0000 64 KB block. + /// Multiple bits can be set. + /// + /// Alignment Bit-mapped address alignment granularity. + /// The first nonzero bit from the right is the address granularity. + /// + // LegacySegment Segment in which EfiCompatibility code will place the MP table. + /// + /// LegacyOffset Offset in which EfiCompatibility code will place the MP table. + /// + /// The return values associated with this mode are: + /// + /// EFI_SUCCESS The MP table was returned. + /// + /// EFI_UNSUPPORTED The MP table is not supported on this platform. + /// + EfiGetPlatformBinaryMpTable = 0, + /// + /// This mode returns a block of data. The content and usage is IBV or OEM defined. + /// OEMs or IBVs normally use this function for nonstandard Compatibility16 runtime soft + /// INTs. It is the responsibility of this routine to coalesce multiple OEM 16 bit functions, if + /// they exist, into one coherent package that is understandable by the Compatibility16 code. + /// This function is invoked twice. The first invocation has LegacySegment and + /// LegacyOffset set to 0. The function returns the table address in EFI memory, as well as its size. + /// The second invocation has LegacySegment and LegacyOffset set to the location + /// in the 0xF0000 or 0xE0000 block to which the data (table) is to be copied. The second + /// invocation allows any data (table) address fixes to occur in the EFI memory copy of + /// the table. The caller, not GetOemIntData(), copies the modified data (table) to the + /// allocated region in 0xF0000 or 0xE0000 block after the second invocation. + /// + /// The function parameters associated with this mode are: + /// + /// Table Pointer to OEM legacy 16 bit code or data. + /// + /// TableSize Size of data. + /// + /// Location Location to place table. 0x00. Either 0xE0000 or 0xF0000 64 KB blocks. + /// Bit 0 = 1 0xF0000 64 KB block. + /// Bit 1 = 1 0xE0000 64 KB block. + /// Multiple bits can be set. + /// + /// Alignment Bit mapped address alignment granularity. + /// The first nonzero bit from the right is the address granularity. + /// + /// LegacySegment Segment in which EfiCompatibility code will place the table or data. + /// + /// LegacyOffset Offset in which EfiCompatibility code will place the table or data. + /// + /// The return values associated with this mode are: + /// + /// EFI_SUCCESS The data was returned successfully. + /// + /// EFI_UNSUPPORTED Oem INT is not supported on this platform. + /// + EfiGetPlatformBinaryOemIntData = 1, + /// + /// This mode returns a block of data. The content and usage is IBV defined. OEMs or + /// IBVs normally use this mode for nonstandard Compatibility16 runtime 16 bit routines. It + /// is the responsibility of this routine to coalesce multiple OEM 16 bit functions, if they + /// exist, into one coherent package that is understandable by the Compatibility16 code. + /// + /// Example usage: A legacy mobile BIOS that has a pre-existing runtime + /// interface to return the battery status to calling applications. + /// + /// This mode is invoked twice. The first invocation has LegacySegment and + /// LegacyOffset set to 0. The mode returns the table address in EFI memory and its size. + /// The second invocation has LegacySegment and LegacyOffset set to the location + /// in the 0xF0000 or 0xE0000 block to which the table is to be copied. The second + /// invocation allows any table address fixes to occur in the EFI memory copy of the table. + /// The caller, not EfiGetPlatformBinaryOem16Data, copies the modified table to + /// the allocated region in 0xF0000 or 0xE0000 block after the second invocation. + /// + /// The function parameters associated with this mode are: + /// + /// Table Pointer to OEM legacy 16 bit code or data. + /// + /// TableSize Size of data. + /// + /// Location Location to place the table. 0x00. Either 0xE0000 or 0xF0000 64 KB blocks. + /// Bit 0 = 1 0xF0000 64 KB block. + /// Bit 1 = 1 0xE0000 64 KB block. + /// Multiple bits can be set. + /// + /// Alignment Bit mapped address alignment granularity. + /// The first nonzero bit from the right is the address granularity. + /// + /// LegacySegment Segment in which EfiCompatibility code will place the table or data. + /// + /// LegacyOffset Offset in which EfiCompatibility code will place the table or data. + /// + /// The return values associated with this mode are: + /// + /// EFI_SUCCESS The data was returned successfully. + /// + /// EFI_UNSUPPORTED Oem16 is not supported on this platform. + /// + EfiGetPlatformBinaryOem16Data = 2, +/// +/// This mode returns a block of data. The content and usage are IBV defined. OEMs or +/// IBVs normally use this mode for nonstandard Compatibility16 runtime 32 bit routines. It +/// is the responsibility of this routine to coalesce multiple OEM 32 bit functions, if they +/// exist, into one coherent package that is understandable by the Compatibility16 code. +/// +/// Example usage: A legacy mobile BIOS that has a pre existing runtime +/// interface to return the battery status to calling applications. +/// +/// This mode is invoked twice. The first invocation has LegacySegment and +/// LegacyOffset set to 0. The mode returns the table address in EFI memory and its size. +/// +/// The second invocation has LegacySegment and LegacyOffset set to the location +/// in the 0xF0000 or 0xE0000 block to which the table is to be copied. The second +/// invocation allows any table address fix ups to occur in the EFI memory copy of the table. +/// The caller, not EfiGetPlatformBinaryOem32Data, copies the modified table to +/// the allocated region in 0xF0000 or 0xE0000 block after the second invocation.. +/// +/// Note: There are two generic mechanisms by which this mode can be used. +/// Mechanism 1: This mode returns the data and the Legacy BIOS Protocol copies +/// the data into the F0000 or E0000 block in the Compatibility16 code. The +/// EFI_COMPATIBILITY16_TABLE entries Oem32Segment and Oem32Offset can +/// be viewed as two UINT16 entries. +/// Mechanism 2: This mode directly fills in the EFI_COMPATIBILITY16_TABLE with +/// a pointer to the INT15 E820 region containing the 32 bit code. It returns +/// EFI_UNSUPPORTED. The EFI_COMPATIBILITY16_TABLE entries, +/// Oem32Segment and Oem32Offset, can be viewed as two UINT16 entries or +/// as a single UINT32 entry as determined by the IBV. +/// +/// The function parameters associated with this mode are: +/// +/// TableSize Size of data. +/// +/// Location Location to place the table. 0x00 or 0xE0000 or 0xF0000 64 KB blocks. +/// Bit 0 = 1 0xF0000 64 KB block. +/// Bit 1 = 1 0xE0000 64 KB block. +/// Multiple bits can be set. +/// +/// Alignment Bit mapped address alignment granularity. +/// The first nonzero bit from the right is the address granularity. +/// +/// LegacySegment Segment in which EfiCompatibility code will place the table or data. +/// +/// LegacyOffset Offset in which EfiCompatibility code will place the table or data. +/// +/// The return values associated with this mode are: +/// EFI_SUCCESS The data was returned successfully. +/// EFI_UNSUPPORTED Oem32 is not supported on this platform. +/// +EfiGetPlatformBinaryOem32Data = 3, + /// + /// This mode returns a TPM binary image for the onboard TPM device. + /// + /// The function parameters associated with this mode are: + /// + /// Table TPM binary image for the onboard TPM device. + /// + /// TableSize Size of BinaryImage in bytes. + /// + /// Location Location to place the table. 0x00. Either 0xE0000 or 0xF0000 64 KB blocks. + /// Bit 0 = 1 0xF0000 64 KB block. + /// Bit 1 = 1 0xE0000 64 KB block. + /// Multiple bits can be set. + /// + /// Alignment Bit mapped address alignment granularity. + /// The first nonzero bit from the right is the address granularity. + /// + /// LegacySegment Segment in which EfiCompatibility code will place the table or data. + /// + /// LegacyOffset Offset in which EfiCompatibility code will place the table or data. + /// + /// The return values associated with this mode are: + /// + /// EFI_SUCCESS BinaryImage is valid. + /// + /// EFI_UNSUPPORTED Mode is not supported on this platform. + /// + /// EFI_NOT_FOUND No BinaryImage was found. + /// + EfiGetPlatformBinaryTpmBinary = 4, + /// + /// The mode finds the Compatibility16 Rom Image. + /// + /// The function parameters associated with this mode are: + /// + /// System ROM image for the platform. + /// + /// TableSize Size of Table in bytes. + /// + /// Location Ignored. + /// + /// Alignment Ignored. + /// + /// LegacySegment Ignored. + /// + /// LegacyOffset Ignored. + /// + /// The return values associated with this mode are: + /// + /// EFI_SUCCESS ROM image found. + /// + /// EFI_NOT_FOUND ROM not found. + /// + EfiGetPlatformBinarySystemRom = 5, + /// + /// This mode returns the Base address of PciExpress memory mapped configuration + /// address space. + /// + /// The function parameters associated with this mode are: + /// + /// Table System ROM image for the platform. + /// + /// TableSize Size of Table in bytes. + /// + /// Location Ignored. + /// + /// Alignment Ignored. + /// + /// LegacySegment Ignored. + /// + /// LegacyOffset Ignored. + /// + /// The return values associated with this mode are: + /// + /// EFI_SUCCESS Address is valid. + /// + /// EFI_UNSUPPORTED System does not PciExpress. + /// + EfiGetPlatformPciExpressBase = 6, + /// + EfiGetPlatformPmmSize = 7, + /// + EfiGetPlatformEndOpromShadowAddr = 8, + /// +} EFI_GET_PLATFORM_INFO_MODE; + +/** + This enum specifies the Mode param values for GetPlatformHandle(). +**/ +typedef enum { + /// + /// This mode returns the Compatibility16 policy for the device that should be the VGA + /// controller used during a Compatibility16 boot. + /// + /// The function parameters associated with this mode are: + /// + /// Type 0x00. + /// + /// HandleBuffer Buffer of all VGA handles found. + /// + /// HandleCount Number of VGA handles found. + /// + /// AdditionalData NULL. + /// + EfiGetPlatformVgaHandle = 0, + /// + /// This mode returns the Compatibility16 policy for the device that should be the IDE + /// controller used during a Compatibility16 boot. + /// + /// The function parameters associated with this mode are: + /// + /// Type 0x00. + /// + /// HandleBuffer Buffer of all IDE handles found. + /// + /// HandleCount Number of IDE handles found. + /// + /// AdditionalData Pointer to HddInfo. + /// Information about all onboard IDE controllers. + /// + EfiGetPlatformIdeHandle = 1, + /// + /// This mode returns the Compatibility16 policy for the device that should be the ISA bus + /// controller used during a Compatibility16 boot. + /// + /// The function parameters associated with this mode are: + /// + /// Type 0x00. + /// + /// HandleBuffer Buffer of all ISA bus handles found. + /// + /// HandleCount Number of ISA bus handles found. + /// + /// AdditionalData NULL. + /// + EfiGetPlatformIsaBusHandle = 2, + /// + /// This mode returns the Compatibility16 policy for the device that should be the USB + /// device used during a Compatibility16 boot. + /// + /// The function parameters associated with this mode are: + /// + /// Type 0x00. + /// + /// HandleBuffer Buffer of all USB handles found. + /// + /// HandleCount Number of USB bus handles found. + /// + /// AdditionalData NULL. + /// + EfiGetPlatformUsbHandle = 3 +} EFI_GET_PLATFORM_HANDLE_MODE; + +/** + This enum specifies the Mode param values for PlatformHooks(). + Note: Any OEM defined hooks start with 0x8000. +**/ +typedef enum { + /// + /// This mode allows any preprocessing before scanning OpROMs. + /// + /// The function parameters associated with this mode are: + /// + /// Type 0. + /// + /// DeviceHandle Handle of device OpROM is associated with. + /// + /// ShadowAddress Address where OpROM is shadowed. + /// + /// Compatibility16Table NULL. + /// + /// AdditionalData NULL. + /// + EfiPlatformHookPrepareToScanRom = 0, + /// + /// This mode shadows legacy OpROMS that may not have a physical device associated with + /// them. It returns EFI_SUCCESS if the ROM was shadowed. + /// + /// The function parameters associated with this mode are: + /// + /// Type 0. + /// + /// DeviceHandle 0. + /// + /// ShadowAddress First free OpROM area, after other OpROMs have been dispatched.. + /// + /// Compatibility16Table Pointer to the Compatability16 Table. + /// + /// AdditionalData NULL. + /// + EfiPlatformHookShadowServiceRoms= 1, + /// + /// This mode allows platform to perform any required operation after an OpROM has + /// completed its initialization. + /// + /// The function parameters associated with this mode are: + /// + /// Type 0. + /// + /// DeviceHandle Handle of device OpROM is associated with. + /// + /// ShadowAddress Address where OpROM is shadowed. + /// + /// Compatibility16Table NULL. + /// + /// AdditionalData NULL. + /// + EfiPlatformHookAfterRomInit = 2 +} EFI_GET_PLATFORM_HOOK_MODE; + +/// +/// This IRQ has not been assigned to PCI. +/// +#define PCI_UNUSED 0x00 +/// +/// This IRQ has been assigned to PCI. +/// +#define PCI_USED 0xFF +/// +/// This IRQ has been used by an SIO legacy device and cannot be used by PCI. +/// +#define LEGACY_USED 0xFE + +#pragma pack(1) + +typedef struct { + /// + /// IRQ for this entry. + /// + UINT8 Irq; + /// + /// Status of this IRQ. + /// + /// PCI_UNUSED 0x00. This IRQ has not been assigned to PCI. + /// + /// PCI_USED 0xFF. This IRQ has been assigned to PCI. + /// + /// LEGACY_USED 0xFE. This IRQ has been used by an SIO legacy + /// device and cannot be used by PCI. + /// + UINT8 Used; +} EFI_LEGACY_IRQ_PRIORITY_TABLE_ENTRY; + +// +// Define PIR table structures +// +#define EFI_LEGACY_PIRQ_TABLE_SIGNATURE SIGNATURE_32 ('$', 'P', 'I', 'R') + +typedef struct { + /// + /// $PIR. + /// + UINT32 Signature; + /// + /// 0x00. + /// + UINT8 MinorVersion; + /// + /// 0x01 for table version 1.0. + /// + UINT8 MajorVersion; + /// + /// 0x20 + RoutingTableEntries * 0x10. + /// + UINT16 TableSize; + /// + /// PCI interrupt router bus. + /// + UINT8 Bus; + /// + /// PCI interrupt router device/function. + /// + UINT8 DevFun; + /// + /// If nonzero, bit map of IRQs reserved for PCI. + /// + UINT16 PciOnlyIrq; + /// + /// Vendor ID of a compatible PCI interrupt router. + /// + UINT16 CompatibleVid; + /// + /// Device ID of a compatible PCI interrupt router. + /// + UINT16 CompatibleDid; + /// + /// If nonzero, a value passed directly to the IRQ miniport's Initialize function. + /// + UINT32 Miniport; + /// + /// Reserved for future usage. + /// + UINT8 Reserved[11]; + /// + /// This byte plus the sum of all other bytes in the LocalPirqTable equal 0x00. + /// + UINT8 Checksum; +} EFI_LEGACY_PIRQ_TABLE_HEADER; + + +typedef struct { + /// + /// If nonzero, a value assigned by the IBV. + /// + UINT8 Pirq; + /// + /// If nonzero, the IRQs that can be assigned to this device. + /// + UINT16 IrqMask; +} EFI_LEGACY_PIRQ_ENTRY; + +typedef struct { + /// + /// PCI bus of the entry. + /// + UINT8 Bus; + /// + /// PCI device of this entry. + /// + UINT8 Device; + /// + /// An IBV value and IRQ mask for PIRQ pins A through D. + /// + EFI_LEGACY_PIRQ_ENTRY PirqEntry[4]; + /// + /// If nonzero, the slot number assigned by the board manufacturer. + /// + UINT8 Slot; + /// + /// Reserved for future use. + /// + UINT8 Reserved; +} EFI_LEGACY_IRQ_ROUTING_ENTRY; + +#pragma pack() + + +/** + Finds the binary data or other platform information. + + @param This The protocol instance pointer. + @param Mode Specifies what data to return. See See EFI_GET_PLATFORM_INFO_MODE enum. + @param Table Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum. + @param TableSize Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum. + @param Location Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum. + @param Alignment Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum. + @param LegacySegment Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum. + @param LegacyOffset Mode specific. See EFI_GET_PLATFORM_INFO_MODE enum. + + @retval EFI_SUCCESS Data returned successfully. + @retval EFI_UNSUPPORTED Mode is not supported on the platform. + @retval EFI_NOT_FOUND Binary image or table not found. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_PLATFORM_GET_PLATFORM_INFO)( + IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This, + IN EFI_GET_PLATFORM_INFO_MODE Mode, + OUT VOID **Table, + OUT UINTN *TableSize, + OUT UINTN *Location, + OUT UINTN *Alignment, + IN UINT16 LegacySegment, + IN UINT16 LegacyOffset + ); + +/** + Returns a buffer of handles for the requested subfunction. + + @param This The protocol instance pointer. + @param Mode Specifies what handle to return. See EFI_GET_PLATFORM_HANDLE_MODE enum. + @param Type Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum. + @param HandleBuffer Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum. + @param HandleCount Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum. + @param AdditionalData Mode specific. See EFI_GET_PLATFORM_HANDLE_MODE enum. + + @retval EFI_SUCCESS Handle is valid. + @retval EFI_UNSUPPORTED Mode is not supported on the platform. + @retval EFI_NOT_FOUND Handle is not known. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_PLATFORM_GET_PLATFORM_HANDLE)( + IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This, + IN EFI_GET_PLATFORM_HANDLE_MODE Mode, + IN UINT16 Type, + OUT EFI_HANDLE **HandleBuffer, + OUT UINTN *HandleCount, + IN VOID **AdditionalData OPTIONAL + ); + +/** + Load and initialize the Legacy BIOS SMM handler. + + @param This The protocol instance pointer. + @param EfiToLegacy16BootTable A pointer to Legacy16 boot table. + + @retval EFI_SUCCESS SMM code loaded. + @retval EFI_DEVICE_ERROR SMM code failed to load + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_PLATFORM_SMM_INIT)( + IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This, + IN VOID *EfiToLegacy16BootTable + ); + +/** + Allows platform to perform any required action after a LegacyBios operation. + Invokes the specific sub function specified by Mode. + + @param This The protocol instance pointer. + @param Mode Specifies what handle to return. See EFI_GET_PLATFORM_HOOK_MODE enum. + @param Type Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum. + @param DeviceHandle Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum. + @param ShadowAddress Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum. + @param Compatibility16Table Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum. + @param AdditionalData Mode specific. See EFI_GET_PLATFORM_HOOK_MODE enum. + + @retval EFI_SUCCESS The operation performed successfully. Mode specific. + @retval EFI_UNSUPPORTED Mode is not supported on the platform. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_PLATFORM_HOOKS)( + IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This, + IN EFI_GET_PLATFORM_HOOK_MODE Mode, + IN UINT16 Type, + IN EFI_HANDLE DeviceHandle, OPTIONAL + IN OUT UINTN *ShadowAddress, OPTIONAL + IN EFI_COMPATIBILITY16_TABLE *Compatibility16Table, OPTIONAL + OUT VOID **AdditionalData OPTIONAL + ); + +/** + Returns information associated with PCI IRQ routing. + This function returns the following information associated with PCI IRQ routing: + * An IRQ routing table and number of entries in the table. + * The $PIR table and its size. + * A list of PCI IRQs and the priority order to assign them. + + @param This The protocol instance pointer. + @param RoutingTable The pointer to PCI IRQ Routing table. + This location is the $PIR table minus the header. + @param RoutingTableEntries The number of entries in table. + @param LocalPirqTable $PIR table. + @param PirqTableSize $PIR table size. + @param LocalIrqPriorityTable A list of interrupts in priority order to assign. + @param IrqPriorityTableEntries The number of entries in the priority table. + + @retval EFI_SUCCESS Data was successfully returned. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_PLATFORM_GET_ROUTING_TABLE)( + IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This, + OUT VOID **RoutingTable, + OUT UINTN *RoutingTableEntries, + OUT VOID **LocalPirqTable, OPTIONAL + OUT UINTN *PirqTableSize, OPTIONAL + OUT VOID **LocalIrqPriorityTable, OPTIONAL + OUT UINTN *IrqPriorityTableEntries OPTIONAL + ); + +/** + Translates the given PIRQ accounting for bridge. + This function translates the given PIRQ back through all buses, if required, + and returns the true PIRQ and associated IRQ. + + @param This The protocol instance pointer. + @param PciBus The PCI bus number for this device. + @param PciDevice The PCI device number for this device. + @param PciFunction The PCI function number for this device. + @param Pirq Input is PIRQ reported by device, and output is true PIRQ. + @param PciIrq The IRQ already assigned to the PIRQ, or the IRQ to be + assigned to the PIRQ. + + @retval EFI_SUCCESS The PIRQ was translated. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_PLATFORM_TRANSLATE_PIRQ)( + IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This, + IN UINTN PciBus, + IN UINTN PciDevice, + IN UINTN PciFunction, + IN OUT UINT8 *Pirq, + OUT UINT8 *PciIrq + ); + +/** + Attempt to legacy boot the BootOption. If the EFI contexted has been + compromised this function will not return. + + @param This The protocol instance pointer. + @param BbsDevicePath The EFI Device Path from BootXXXX variable. + @param BbsTable The Internal BBS table. + @param LoadOptionSize The size of LoadOption in size. + @param LoadOption The LoadOption from BootXXXX variable + @param EfiToLegacy16BootTable A pointer to BootTable structure + + @retval EFI_SUCCESS Ready to boot. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_BIOS_PLATFORM_PREPARE_TO_BOOT)( + IN EFI_LEGACY_BIOS_PLATFORM_PROTOCOL *This, + IN BBS_BBS_DEVICE_PATH *BbsDevicePath, + IN VOID *BbsTable, + IN UINT32 LoadOptionsSize, + IN VOID *LoadOptions, + IN VOID *EfiToLegacy16BootTable + ); + +/** + This protocol abstracts the platform portion of the traditional BIOS. +**/ +struct _EFI_LEGACY_BIOS_PLATFORM_PROTOCOL { + /// + /// Gets binary data or other platform information. + /// + EFI_LEGACY_BIOS_PLATFORM_GET_PLATFORM_INFO GetPlatformInfo; + /// + /// Returns a buffer of all handles matching the requested subfunction. + /// + EFI_LEGACY_BIOS_PLATFORM_GET_PLATFORM_HANDLE GetPlatformHandle; + /// + /// Loads and initializes the traditional BIOS SMM handler. + EFI_LEGACY_BIOS_PLATFORM_SMM_INIT SmmInit; + /// + /// Allows platform to perform any required actions after a LegacyBios operation. + /// + EFI_LEGACY_BIOS_PLATFORM_HOOKS PlatformHooks; + /// + /// Gets $PIR table. + EFI_LEGACY_BIOS_PLATFORM_GET_ROUTING_TABLE GetRoutingTable; + /// + /// Translates the given PIRQ to the final value after traversing any PCI bridges. + /// + EFI_LEGACY_BIOS_PLATFORM_TRANSLATE_PIRQ TranslatePirq; + /// + /// Final platform function before the system attempts to boot to a traditional OS. + /// + EFI_LEGACY_BIOS_PLATFORM_PREPARE_TO_BOOT PrepareToBoot; +}; + +extern EFI_GUID gEfiLegacyBiosPlatformProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/LegacyInterrupt.h b/IntelFrameworkPkg/Include/Protocol/LegacyInterrupt.h new file mode 100644 index 000000000..8b2d56b2d --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/LegacyInterrupt.h @@ -0,0 +1,128 @@ +/** @file + This protocol abstracts the PIRQ programming from the generic EFI Compatibility Support Modules (CSMs). + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This protocol is defined in Framework for the EFI Compatibility Support Module specification. + Version 0.97. + +**/ + +#ifndef _EFI_LEGACY_INTERRUPT_H_ +#define _EFI_LEGACY_INTERRUPT_H_ + + +#define EFI_LEGACY_INTERRUPT_PROTOCOL_GUID \ + { \ + 0x31ce593d, 0x108a, 0x485d, {0xad, 0xb2, 0x78, 0xf2, 0x1f, 0x29, 0x66, 0xbe } \ + } + +typedef struct _EFI_LEGACY_INTERRUPT_PROTOCOL EFI_LEGACY_INTERRUPT_PROTOCOL; + +/** + Get the number of PIRQs this hardware supports. + + @param This The protocol instance pointer. + @param NumberPirsq The number of PIRQs that are supported. + + @retval EFI_SUCCESS The number of PIRQs was returned successfully. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_INTERRUPT_GET_NUMBER_PIRQS)( + IN EFI_LEGACY_INTERRUPT_PROTOCOL *This, + OUT UINT8 *NumberPirqs + ); + +/** + Gets the PCI location associated with this protocol. + + @param This The Protocol instance pointer. + @param Bus The PCI Bus. + @param Device The PCI Device. + @param Function The PCI Function. + + @retval EFI_SUCCESS The Bus, Device, and Function were returned successfully. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_INTERRUPT_GET_LOCATION)( + IN EFI_LEGACY_INTERRUPT_PROTOCOL *This, + OUT UINT8 *Bus, + OUT UINT8 *Device, + OUT UINT8 *Function + ); + +/** + Read the PIRQ register and return the data + + @param This The protocol instance pointer. + @param PirqNumber The PIRQ register to read. + @param PirqData The data read. + + @retval EFI_SUCCESS The data was read. + @retval EFI_INVALID_PARAMETER Invalid PIRQ number. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_INTERRUPT_READ_PIRQ)( + IN EFI_LEGACY_INTERRUPT_PROTOCOL *This, + IN UINT8 PirqNumber, + OUT UINT8 *PirqData + ); + +/** + Write the specified PIRQ register with the given data. + + @param This The protocol instance pointer. + @param PirqNumber A PIRQ register to read. + @param PirqData The data to write. + + @retval EFI_SUCCESS The PIRQ was programmed. + @retval EFI_INVALID_PARAMETER Invalid PIRQ number. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_INTERRUPT_WRITE_PIRQ)( + IN EFI_LEGACY_INTERRUPT_PROTOCOL *This, + IN UINT8 PirqNumber, + IN UINT8 PirqData + ); + +struct _EFI_LEGACY_INTERRUPT_PROTOCOL { + /// + /// Gets the number of PIRQs supported. + /// + EFI_LEGACY_INTERRUPT_GET_NUMBER_PIRQS GetNumberPirqs; + + /// + /// Gets the PCI bus, device, and function that is associated with this protocol. + /// + EFI_LEGACY_INTERRUPT_GET_LOCATION GetLocation; + + /// + /// Reads the indicated PIRQ register. + /// + EFI_LEGACY_INTERRUPT_READ_PIRQ ReadPirq; + + /// + /// Writes to the indicated PIRQ register. + /// + EFI_LEGACY_INTERRUPT_WRITE_PIRQ WritePirq; +}; + +extern EFI_GUID gEfiLegacyInterruptProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/LegacyRegion.h b/IntelFrameworkPkg/Include/Protocol/LegacyRegion.h new file mode 100644 index 000000000..b18e8bc40 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/LegacyRegion.h @@ -0,0 +1,125 @@ +/** @file + This protocol manages the legacy memory regions between 0xc0000 - 0xfffff. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This protocol is defined in Framework for EFI Compatibility Support Module spec + Version 0.97. + +**/ + +#ifndef _EFI_LEGACY_REGION_H_ +#define _EFI_LEGACY_REGION_H_ + + +#define EFI_LEGACY_REGION_PROTOCOL_GUID \ + { \ + 0xfc9013a, 0x568, 0x4ba9, {0x9b, 0x7e, 0xc9, 0xc3, 0x90, 0xa6, 0x60, 0x9b } \ + } + +typedef struct _EFI_LEGACY_REGION_PROTOCOL EFI_LEGACY_REGION_PROTOCOL; + +/** + Sets hardware to decode or not decode a region. + + @param This Indicates the EFI_LEGACY_REGION_PROTOCOL instance + @param Start The start of the region to decode. + @param Length The size in bytes of the region. + @param On The decode/nondecode flag. + + @retval EFI_SUCCESS The decode range successfully changed. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_REGION_DECODE)( + IN EFI_LEGACY_REGION_PROTOCOL *This, + IN UINT32 Start, + IN UINT32 Length, + IN BOOLEAN *On + ); + +/** + Sets a region to read only. + + @param This Indicates the EFI_LEGACY_REGION_PROTOCOL instance. + @param Start The start of region to lock. + @param Length The size in bytes of the region. + @param Granularity Lock attribute affects this granularity in bytes. + + @retval EFI_SUCCESS The region was made read only. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_REGION_LOCK)( + IN EFI_LEGACY_REGION_PROTOCOL *This, + IN UINT32 Start, + IN UINT32 Length, + OUT UINT32 *Granularity OPTIONAL + ); + +/** + Sets a region to read only and ensures that flash is locked from being + inadvertently modified. + + @param This Indicates the EFI_LEGACY_REGION_PROTOCOL instance + @param Start The start of region to lock. + @param Length The size in bytes of the region. + @param Granularity Lock attribute affects this granularity in bytes. + + @retval EFI_SUCCESS The region was made read only and flash is locked. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_REGION_BOOT_LOCK)( + IN EFI_LEGACY_REGION_PROTOCOL *This, + IN UINT32 Start, + IN UINT32 Length, + OUT UINT32 *Granularity OPTIONAL + ); + +/** + Sets a region to read-write. + + @param This Indicates the EFI_LEGACY_REGION_PROTOCOL instance + @param Start The start of region to lock. + @param Length The size in bytes of the region. + @param Granularity Lock attribute affects this granularity in bytes. + + @retval EFI_SUCCESS The region was successfully made read-write. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_LEGACY_REGION_UNLOCK)( + IN EFI_LEGACY_REGION_PROTOCOL *This, + IN UINT32 Start, + IN UINT32 Length, + OUT UINT32 *Granularity OPTIONAL + ); + +/** + Abstracts the hardware control of the physical address region 0xC0000-C0xFFFFF + for the traditional BIOS. +**/ +struct _EFI_LEGACY_REGION_PROTOCOL { + EFI_LEGACY_REGION_DECODE Decode; ///< Specifies a region for the chipset to decode. + EFI_LEGACY_REGION_LOCK Lock; ///< Makes the specified OpROM region read only or locked. + EFI_LEGACY_REGION_BOOT_LOCK BootLock; ///< Sets a region to read only and ensures tat flash is locked from. + ///< inadvertent modification. + EFI_LEGACY_REGION_UNLOCK UnLock; ///< Makes the specified OpROM region read-write or unlocked. +}; + +extern EFI_GUID gEfiLegacyRegionProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SectionExtraction.h b/IntelFrameworkPkg/Include/Protocol/SectionExtraction.h new file mode 100644 index 000000000..ef1d24ae5 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SectionExtraction.h @@ -0,0 +1,161 @@ +/** @file + This file declares Section Extraction Protocol. + + This interface provides a means of decoding a set of sections into a linked list of + leaf sections. This provides for an extensible and flexible file format. + +Copyright (c) 2006 - 2010, 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 that 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. + + @par Revision Reference: + This protocol is defined in Firmware Volume Specification. + Version 0.9. + +**/ + +#ifndef _SECTION_EXTRACTION_PROTOCOL_H_ +#define _SECTION_EXTRACTION_PROTOCOL_H_ + +// +// Protocol GUID definition +// +#define EFI_SECTION_EXTRACTION_PROTOCOL_GUID \ + { \ + 0x448F5DA4, 0x6DD7, 0x4FE1, {0x93, 0x07, 0x69, 0x22, 0x41, 0x92, 0x21, 0x5D } \ + } + +typedef struct _EFI_SECTION_EXTRACTION_PROTOCOL EFI_SECTION_EXTRACTION_PROTOCOL; + +// +// Protocol member functions +// +/** + Creates and returns a new section stream handle to represent the new section stream. + + @param This Indicates the EFI_SECTION_EXTRACTION_PROTOCOL instance. + @param SectionStreamLength The size in bytes of the section stream. + @param SectionStream A buffer containing the new section stream. + @param SectionStreamHandle A pointer to a caller-allocated UINTN that, + on output, contains the new section stream handle. + + @retval EFI_SUCCESS The SectionStream was successfully processed, and + the section stream handle was returned. + @retval EFI_OUT_OF_RESOURCES The system has insufficient resources to + process the request. + @retval EFI_INVALID_PARAMETER The section stream may be corrupt or the value + of SectionStreamLength may be incorrect. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_OPEN_SECTION_STREAM)( + IN EFI_SECTION_EXTRACTION_PROTOCOL *This, + IN UINTN SectionStreamLength, + IN VOID *SectionStream, + OUT UINTN *SectionStreamHandle + ); + +/** + Reads and returns a single section from a section stream. + + @param This Indicates the EFI_SECTION_EXTRACTION_PROTOCOL instance. + @param SectionStreamHandle Indicates from which section stream to read. + @param SectionType The pointer to an EFI_SECTION_TYPE. If SectionType == NULL, + the contents of the entire section stream are returned + in Buffer. If SectionType is not NULL, only the + requested section is returned. EFI_SECTION_ALL + matches all section types and can be used as a + wild card to extract all sections in order. + @param SectionDefinitionGuid The pointer to an EFI_GUID. If SectionType == + EFI_SECTION_GUID_DEFINED, SectionDefinitionGuid + indicates what section GUID to search for. If + SectionType !=EFI_SECTION_GUID_DEFINED, then + SectionDefinitionGuid is unused and is ignored. + @param SectionInstance Indicates which instance of the requested section + type to return when SectionType is not NULL. + @param SectionStreamHandle A pointer to a caller-allocated UINTN that, on output, + contains the new section stream handle. + @param Buffer Pointer to a pointer to a buffer in which the section + contents are returned. + @param BufferSize A pointer to a caller-allocated UINTN. + @param AuthenticationStatus A pointer to a caller-allocated UINT32 in + which any meta-data from encapsulation GUID-defined + sections is returned. + + @retval EFI_SUCCESS The SectionStream was successfully processed and + the section contents were returned in Buffer. + @retval EFI_PROTOCOL_ERROR A GUID-defined section was encountered inthe section + stream with its EFI_GUIDED_SECTION_PROCESSING_REQUIRED + bit set, but there was no corresponding GUIDed + Section Extraction Protocol in the handle database. + @retval EFI_NOT_FOUND An error was encountered when parsing the SectionStream, + which indicates that the SectionStream is not + correctly formatted. Or, the requested section does not exist. + @retval EFI_OUT_OF_RESOURCES The system has insufficient resources to process + the request. + @retval EFI_INVALID_PARAMETER The SectionStreamHandle does not exist. + @retval EFI_WARN_BUFFER_TOO_SMALL The size of the input buffer is insufficient + to contain the requested section. The input + buffer is filled and section contents are truncated. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_GET_SECTION)( + IN EFI_SECTION_EXTRACTION_PROTOCOL *This, + IN UINTN SectionStreamHandle, + IN EFI_SECTION_TYPE *SectionType, + IN EFI_GUID *SectionDefinitionGuid, + IN UINTN SectionInstance, + IN VOID **Buffer, + IN OUT UINTN *BufferSize, + OUT UINT32 *AuthenticationStatus + ); + +/** + Deletes a section stream handle and returns all associated resources to the system. + + @param This Indicates the EFI_SECTION_EXTRACTION_PROTOCOL instance. + @param SectionStreamHandle Indicates the section stream to close. + @retval EFI_SUCCESS The SectionStream was successfully processed and + the section stream handle was returned. + @retval EFI_INVALID_PARAMETER The SectionStreamHandle does not exist. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_CLOSE_SECTION_STREAM)( + IN EFI_SECTION_EXTRACTION_PROTOCOL *This, + IN UINTN SectionStreamHandle + ); + +// +// Protocol definition +// +struct _EFI_SECTION_EXTRACTION_PROTOCOL { + /// + /// Takes a bounded stream of sections and returns a section stream handle. + /// + EFI_OPEN_SECTION_STREAM OpenSectionStream; + + /// + /// Given a section stream handle, retrieves the requested section and + /// meta-data from the section stream. + /// + EFI_GET_SECTION GetSection; + + /// + /// Given a section stream handle, closes the section stream. + /// + EFI_CLOSE_SECTION_STREAM CloseSectionStream; +}; + +extern EFI_GUID gEfiSectionExtractionProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmAccess.h b/IntelFrameworkPkg/Include/Protocol/SmmAccess.h new file mode 100644 index 000000000..16d66b93a --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmAccess.h @@ -0,0 +1,130 @@ +/** @file + This file declares the SMM SMRAM Access abstraction protocol, which is used to control + the visibility of the SMRAM on the platform. The expectation is + that the north bridge or memory controller would publish this protocol. + For example, the Memory Controller Hub (MCH) has the hardware provision for this + type of control. Because of the protected, distinguished class of memory for IA-32 + systems, the expectation is that this protocol would be supported only on IA-32 systems. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. +**/ + +#ifndef _SMM_ACCESS_H_ +#define _SMM_ACCESS_H_ + +#include + +typedef struct _EFI_SMM_ACCESS_PROTOCOL EFI_SMM_ACCESS_PROTOCOL; + +#define EFI_SMM_ACCESS_PROTOCOL_GUID \ + { \ + 0x3792095a, 0xe309, 0x4c1e, {0xaa, 0x01, 0x85, 0xf5, 0x65, 0x5a, 0x17, 0xf1 } \ + } + +// +// SMM Access specification Member Function +// +/** + Opens the SMRAM area to be accessible by a boot-service driver. + + @param This The EFI_SMM_ACCESS_PROTOCOL instance. + @param DescriptorIndex Indicates that the driver wishes to open + the memory tagged by this index. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_INVALID_PARAMETER The given DescriptorIndex is not supported. + @retval EFI_NOT_STARTED The SMM base service has not been initialized. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_OPEN)( + IN EFI_SMM_ACCESS_PROTOCOL *This, + UINTN DescriptorIndex + ); + +/** + Inhibits access to the SMRAM. + + @param This The EFI_SMM_ACCESS_PROTOCOL instance. + @param DescriptorIndex Indicates that the driver wishes to close + the memory tagged by this index. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_DEVICE_ERROR The given DescriptorIndex is not open. + @retval EFI_INVALID_PARAMETER The given DescriptorIndex is not supported. + @retval EFI_NOT_STARTED The SMM base service has not been initialized. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_CLOSE)( + IN EFI_SMM_ACCESS_PROTOCOL *This, + UINTN DescriptorIndex + ); + +/** + Inhibits access to the SMRAM. + + @param This The EFI_SMM_ACCESS_PROTOCOL instance. + @param DescriptorIndex Indicates that the driver wishes to lock + the memory tagged by this index. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_DEVICE_ERROR The given DescriptorIndex is not open. + @retval EFI_INVALID_PARAMETER The given DescriptorIndex is not supported. + @retval EFI_NOT_STARTED The SMM base service has not been initialized. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_LOCK)( + IN EFI_SMM_ACCESS_PROTOCOL *This, + UINTN DescriptorIndex + ); + +/** + Queries the memory controller for the possible regions that will support SMRAM. + + @param This The EFI_SMM_ACCESS_PROTOCOL instance. + @param SmramMapSize A pointer to the size, in bytes, of the SmramMemoryMap buffer. + @param SmramMap A pointer to the buffer in which firmware places the current memory map. + + @retval EFI_SUCCESS The chipset supported the given resource. + @retval EFI_BUFFER_TOO_SMALL The SmramMap parameter was too small. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_CAPABILITIES)( + IN EFI_SMM_ACCESS_PROTOCOL *This, + IN OUT UINTN *SmramMapSize, + IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap + ); + +/** + This protocol is used to control the visibility of the SMRAM on the platform. +**/ +struct _EFI_SMM_ACCESS_PROTOCOL { + EFI_SMM_OPEN Open; ///< Opens the SMRAM. + EFI_SMM_CLOSE Close; ///< Closes the SMRAM. + EFI_SMM_LOCK Lock; ///< Locks the SMRAM. + EFI_SMM_CAPABILITIES GetCapabilities; ///< Gets information on possible SMRAM regions. + BOOLEAN LockState; ///< Indicates the current state of the SMRAM. Set to TRUE if any region is locked. + BOOLEAN OpenState; ///< Indicates the current state of the SMRAM. Set to TRUE if any region is open. +}; + +extern EFI_GUID gEfiSmmAccessProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmBase.h b/IntelFrameworkPkg/Include/Protocol/SmmBase.h new file mode 100644 index 000000000..0429c574d --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmBase.h @@ -0,0 +1,310 @@ +/** @file + This file declares SMM Base abstraction protocol. + This protocol is used to install SMM handlers for support of subsequent SMI/PMI activations. This + protocol is available on both IA-32 and Itanium-based systems. + + The EFI_SMM_BASE_PROTOCOL is a set of services that is exported by a processor device. It is + a required protocol for the platform processor. This protocol can be used in both boot services and + runtime mode. However, only the following member functions need to exist during runtime: + - InSmm() + - Communicate() + This protocol is responsible for registering the handler services. The order in which the handlers are + executed is prescribed only with respect to the MakeLast flag in the RegisterCallback() + service. The driver exports these registration and unregistration services in boot services mode, but + the registered handlers will execute through the preboot and runtime. The only way to change the + behavior of a registered driver after ExitBootServices() has been invoked is to use some + private communication mechanism with the driver to order it to quiesce. This model permits typical + use cases, such as invoking the handler to enter ACPI mode, where the OS loader would make this + call before boot services are terminated. On the other hand, handlers for services such as chipset + workarounds for the century rollover in CMOS should provide commensurate services throughout + preboot and OS runtime. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _SMM_BASE_H_ +#define _SMM_BASE_H_ + +// +// Share some common definitions with PI SMM +// +#include +#include + +/// +/// Global ID for the EFI_SMM_BASE_PROTOCOL. +/// +#define EFI_SMM_BASE_PROTOCOL_GUID \ + { \ + 0x1390954D, 0xda95, 0x4227, {0x93, 0x28, 0x72, 0x82, 0xc2, 0x17, 0xda, 0xa8 } \ + } + +/// +/// Forward declaration for EFI_SMM_BASE_PROTOCOL. +/// +typedef struct _EFI_SMM_BASE_PROTOCOL EFI_SMM_BASE_PROTOCOL; + +/// +/// EFI SMM Handler return codes +/// +///@{ +#define EFI_HANDLER_SUCCESS 0x0000 +#define EFI_HANDLER_CRITICAL_EXIT 0x0001 +#define EFI_HANDLER_SOURCE_QUIESCED 0x0002 +#define EFI_HANDLER_SOURCE_PENDING 0x0003 +///@} + +/** + Entry Point to Callback service + + @param[in] SmmImageHandle A handle allocated by the SMM infrastructure code + to uniquely designate a specific DXE SMM driver. + @param[in] CommunicationBuffer A pointer to a collection of data in memory + that will be conveyed from a non-SMM environment + into an SMM environment. The buffer must be + contiguous and physically mapped, and must be + a physical address. + @param[in] SourceSize The size of the CommunicationBuffer. + + @return Status code + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_CALLBACK_ENTRY_POINT)( + IN EFI_HANDLE SmmImageHandle, + IN OUT VOID *CommunicationBuffer OPTIONAL, + IN OUT UINTN *SourceSize OPTIONAL + ); + +// +// SMM Base Protocol Definition +// +/** + Register a given driver into SMRAM. This is the equivalent of performing + the LoadImage/StartImage into System Management Mode. + + @param[in] This The protocol instance pointer. + @param[in] FilePath The location of the image to be installed as the handler. + @param[in] SourceBuffer An optional source buffer in case the image file + is in memory. + @param[in] SourceSize The size of the source image file, if in memory. + @param[out] ImageHandle The handle that the base driver uses to decode + the handler. Unique among SMM handlers only; + not unique across DXE/EFI. + @param[in] LegacyIA32Binary An optional parameter specifying that the associated + file is a real-mode IA-32 binary. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_OUT_OF_RESOURCES There were no additional SMRAM resources to load the handler + @retval EFI_UNSUPPORTED This platform does not support 16-bit handlers. + @retval EFI_UNSUPPORTED The platform is in runtime. + @retval EFI_INVALID_PARAMETER The handlers were not the correct image type. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_REGISTER_HANDLER)( + IN EFI_SMM_BASE_PROTOCOL *This, + IN EFI_DEVICE_PATH_PROTOCOL *FilePath, + IN VOID *SourceBuffer OPTIONAL, + IN UINTN SourceSize, + OUT EFI_HANDLE *ImageHandle, + IN BOOLEAN LegacyIA32Binary OPTIONAL + ); + +/** + Removes a handler from execution within SMRAM. This is the equivalent of performing + the UnloadImage in System Management Mode. + + @param[in] This The protocol instance pointer. + @param[in] ImageHandle The handler to be removed. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_INVALID_PARAMETER The handler did not exist. + @retval EFI_UNSUPPORTED The platform is in runtime. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_UNREGISTER_HANDLER)( + IN EFI_SMM_BASE_PROTOCOL *This, + IN EFI_HANDLE ImageHandle + ); + +/** + The SMM Inter-module Communicate Service Communicate() function + provides a service to send/receive messages from a registered + EFI service. The BASE protocol driver is responsible for doing + any of the copies such that the data lives in boot-service-accessible RAM. + + @param[in] This The protocol instance pointer. + @param[in] ImageHandle The handle of the registered driver. + @param[in,out] CommunicationBuffer The pointer to the buffer to convey into SMRAM. + @param[in,out] SourceSize The size of the data buffer being passed in. + On exit, the size of data being returned. + Zero if the handler does not wish to reply with any data. + + @retval EFI_SUCCESS The message was successfully posted. + @retval EFI_INVALID_PARAMETER The buffer was NULL. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_COMMUNICATE)( + IN EFI_SMM_BASE_PROTOCOL *This, + IN EFI_HANDLE ImageHandle, + IN OUT VOID *CommunicationBuffer, + IN OUT UINTN *SourceSize + ); + +/** + Register a callback to execute within SMM. + This allows receipt of messages created with EFI_SMM_BASE_PROTOCOL.Communicate(). + + @param[in] This Protocol instance pointer. + @param[in] SmmImageHandle Handle of the callback service. + @param[in] CallbackAddress Address of the callback service. + @param[in] MakeLast If present, will stipulate that the handler is posted to + be executed last in the dispatch table. + @param[in] FloatingPointSave An optional parameter that informs the + EFI_SMM_ACCESS_PROTOCOL Driver core if it needs to save + the floating point register state. If any handler + require this, the state will be saved for all handlers. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_OUT_OF_RESOURCES Not enough space in the dispatch queue. + @retval EFI_UNSUPPORTED The platform is in runtime. + @retval EFI_UNSUPPORTED The caller is not in SMM. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_CALLBACK_SERVICE)( + IN EFI_SMM_BASE_PROTOCOL *This, + IN EFI_HANDLE SmmImageHandle, + IN EFI_SMM_CALLBACK_ENTRY_POINT CallbackAddress, + IN BOOLEAN MakeLast OPTIONAL, + IN BOOLEAN FloatingPointSave OPTIONAL + ); + +/** + The SmmAllocatePool() function allocates a memory region of Size bytes from memory of + type PoolType and returns the address of the allocated memory in the location referenced + by Buffer. This function allocates pages from EFI SMRAM Memory as needed to grow the + requested pool type. All allocations are eight-byte aligned. + + @param[in] This Protocol instance pointer. + @param[in] PoolType The type of pool to allocate. + The only supported type is EfiRuntimeServicesData; + the interface will internally map this runtime request to + SMRAM for IA-32 and leave as this type for the Itanium + processor family. Other types can be ignored. + @param[in] Size The number of bytes to allocate from the pool. + @param[out] Buffer A pointer to a pointer to the allocated buffer if the call + succeeds; undefined otherwise. + + @retval EFI_SUCCESS The requested number of bytes was allocated. + @retval EFI_OUT_OF_RESOURCES The pool requested could not be allocated. + @retval EFI_UNSUPPORTED The platform is in runtime. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_ALLOCATE_POOL)( + IN EFI_SMM_BASE_PROTOCOL *This, + IN EFI_MEMORY_TYPE PoolType, + IN UINTN Size, + OUT VOID **Buffer + ); + +/** + The SmmFreePool() function returns the memory specified by Buffer to the system. + On return, the memory's type is EFI SMRAM Memory. The Buffer that is freed must + have been allocated by SmmAllocatePool(). + + @param[in] This The protocol instance pointer. + @param[in] Buffer The pointer to the buffer allocation. + + @retval EFI_SUCCESS The memory was returned to the system. + @retval EFI_INVALID_PARAMETER The buffer was invalid. + @retval EFI_UNSUPPORTED The platform is in runtime. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_FREE_POOL)( + IN EFI_SMM_BASE_PROTOCOL *This, + IN VOID *Buffer + ); + +/** + This routine tells caller if execution context is SMM or not. + + @param[in] This The protocol instance pointer. + @param[out] InSmm Whether the caller is inside SMM for IA-32 + or servicing a PMI for the Itanium processor + family. + + @retval EFI_SUCCESS The operation was successful. + @retval EFI_INVALID_PARAMETER InSmm was NULL. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_INSIDE_OUT)( + IN EFI_SMM_BASE_PROTOCOL *This, + OUT BOOLEAN *InSmm + ); + +/** + The GetSmstLocation() function returns the location of the System Management + Service Table. The use of the API is such that a driver can discover the + location of the SMST in its entry point and then cache it in some driver + global variable so that the SMST can be invoked in subsequent callbacks. + + @param[in] This The protocol instance pointer. + @param[in] Smst The pointer to the SMST. + + @retval EFI_SUCCESS The operation was successful + @retval EFI_INVALID_PARAMETER Smst was invalid. + @retval EFI_UNSUPPORTED Not in SMM. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_GET_SMST_LOCATION)( + IN EFI_SMM_BASE_PROTOCOL *This, + IN OUT EFI_SMM_SYSTEM_TABLE **Smst + ); + +/// +/// This protocol is used to install SMM handlers for support of subsequent SMI/PMI +/// activations. This protocol is available on both IA-32 and Itanium-based systems. +/// +struct _EFI_SMM_BASE_PROTOCOL { + EFI_SMM_REGISTER_HANDLER Register; + EFI_SMM_UNREGISTER_HANDLER UnRegister; + EFI_SMM_COMMUNICATE Communicate; + EFI_SMM_CALLBACK_SERVICE RegisterCallback; + EFI_SMM_INSIDE_OUT InSmm; + EFI_SMM_ALLOCATE_POOL SmmAllocatePool; + EFI_SMM_FREE_POOL SmmFreePool; + EFI_SMM_GET_SMST_LOCATION GetSmstLocation; +}; + +extern EFI_GUID gEfiSmmBaseProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmControl.h b/IntelFrameworkPkg/Include/Protocol/SmmControl.h new file mode 100644 index 000000000..d49831ca9 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmControl.h @@ -0,0 +1,180 @@ +/** @file + This file declares the SMM Control abstraction protocol. + This protocol is used to initiate SMI/PMI activations. This protocol could be published by either: + - A processor driver to abstract the SMI/PMI IPI + - The driver that abstracts the ASIC that is supporting the APM port, such as the ICH in an + Intel chipset + Because of the possibility of performing SMI or PMI IPI transactions, the ability to generate this + event from a platform chipset agent is an optional capability for both IA-32 and Itanium-based + systems. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _SMM_CONTROL_H_ +#define _SMM_CONTROL_H_ + + +typedef struct _EFI_SMM_CONTROL_PROTOCOL EFI_SMM_CONTROL_PROTOCOL; + +#define EFI_SMM_CONTROL_PROTOCOL_GUID \ + { \ + 0x8d12e231, 0xc667, 0x4fd1, {0x98, 0xf2, 0x24, 0x49, 0xa7, 0xe7, 0xb2, 0xe5 } \ + } +// +// SMM Access specification Data Structures +// +typedef struct { + /// + /// Describes the I/O location of the particular port that engendered the synchronous + /// SMI. For example, this location can include but is not limited to the traditional + /// PCAT* APM port of 0B2h. + /// + UINT8 SmiTriggerRegister; + /// + /// Describes the value that was written to the respective activation port. + /// + UINT8 SmiDataRegister; +} EFI_SMM_CONTROL_REGISTER; + +// +// SMM Control specification member function +// +/** + Invokes SMI activation from either the preboot or runtime environment. + + @param This The EFI_SMM_CONTROL_PROTOCOL instance. + @param ArgumentBuffer The optional sized data to pass into the protocol activation. + @param ArgumentBufferSize The optional size of the data. + @param Periodic An optional mechanism to periodically repeat activation. + @param ActivationInterval An optional parameter to repeat at this period one + time or, if the Periodic Boolean is set, periodically. + + @retval EFI_SUCCESS The SMI/PMI has been engendered. + @retval EFI_DEVICE_ERROR The timing is unsupported. + @retval EFI_INVALID_PARAMETER The activation period is unsupported. + @retval EFI_NOT_STARTED The SMM base service has not been initialized. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_ACTIVATE)( + IN EFI_SMM_CONTROL_PROTOCOL *This, + IN OUT INT8 *ArgumentBuffer OPTIONAL, + IN OUT UINTN *ArgumentBufferSize OPTIONAL, + IN BOOLEAN Periodic OPTIONAL, + IN UINTN ActivationInterval OPTIONAL + ); + +/** + Clears any system state that was created in response to the Active call. + + @param This The EFI_SMM_CONTROL_PROTOCOL instance. + @param Periodic Optional parameter to repeat at this period one + time or, if the Periodic Boolean is set, periodically. + + @retval EFI_SUCCESS The SMI/PMI has been engendered. + @retval EFI_DEVICE_ERROR The source could not be cleared. + @retval EFI_INVALID_PARAMETER The service did not support the Periodic input argument. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_DEACTIVATE)( + IN EFI_SMM_CONTROL_PROTOCOL *This, + IN BOOLEAN Periodic OPTIONAL + ); + +/** + Provides information on the source register used to generate the SMI. + + @param This The EFI_SMM_CONTROL_PROTOCOL instance. + @param SmiRegister A pointer to the SMI register description structure. + + @retval EFI_SUCCESS The register structure has been returned. + @retval EFI_DEVICE_ERROR The source could not be cleared. + @retval EFI_INVALID_PARAMETER The service did not support the Periodic input argument. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_GET_REGISTER_INFO)( + IN EFI_SMM_CONTROL_PROTOCOL *This, + IN OUT EFI_SMM_CONTROL_REGISTER *SmiRegister + ); + +/** + @par Protocol Description: + This protocol is used to initiate SMI/PMI activations. + + @param Trigger + Initiates the SMI/PMI activation. + + @param Clear + Quiesces the SMI/PMI activation. + + @param GetRegisterInfo + Provides data on the register used as the source of the SMI. + + @param MinimumTriggerPeriod + Minimum interval at which the platform can set the period. + + @retval EFI_SUCCESS The register structure has been returned. +**/ + +// +// SMM Control Protocol +// +/** + This protocol is used to initiate SMI/PMI activations. + This protocol could be published by either: + - A processor driver to abstract the SMI/PMI IPI. + - The driver that abstracts the ASIC that is supporting the APM port, such as the ICH in an Intel chipset. + Because of the possibility of performing SMI or PMI IPI transactions, the ability to generate this. + + The EFI_SMM_CONTROL_PROTOCOL is used by the platform chipset or processor driver. This + protocol is usable both in boot services and at runtime. The runtime aspect enables an + implementation of EFI_SMM_BASE_PROTOCOL.Communicate() to layer upon this service + and provide an SMI callback from a general EFI runtime driver. + This protocol provides an abstraction to the platform hardware that generates an + SMI or PMI. There are often I/O ports that, when accessed, will engender the SMI or PMI. + Also, this hardware optionally supports the periodic genearation of these signals. + +**/ +struct _EFI_SMM_CONTROL_PROTOCOL { + /// + /// Initiates the SMI/PMI activation. + /// + EFI_SMM_ACTIVATE Trigger; + /// + /// Quiesces the SMI/PMI activation. + /// + EFI_SMM_DEACTIVATE Clear; + /// + /// Provides data on the register used as the source of the SMI. + /// + EFI_SMM_GET_REGISTER_INFO GetRegisterInfo; + /// + /// Minimum interval at which the platform can set the period. A maximum is not + /// specified in that the SMM infrastructure code can emulate a maximum interval that is + /// greater than the hardware capabilities by using software emulation in the SMM + /// infrastructure code. + /// + UINTN MinimumTriggerPeriod; +}; + +extern EFI_GUID gEfiSmmControlProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmCpuIo.h b/IntelFrameworkPkg/Include/Protocol/SmmCpuIo.h new file mode 100644 index 000000000..53c49b56f --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmCpuIo.h @@ -0,0 +1,88 @@ +/** @file + SMM CPU I/O protocol as defined in the Intel Framework specification. + + This protocol provides CPU I/O and memory access within SMM. + +Copyright (c) 2009 - 2010, 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 that 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 _SMM_CPU_IO_H_ +#define _SMM_CPU_IO_H_ + +#include + +#define EFI_SMM_CPU_IO_GUID \ + { \ + 0x5f439a0b, 0x45d8, 0x4682, {0xa4, 0xf4, 0xf0, 0x57, 0x6b, 0x51, 0x34, 0x41} \ + } + +typedef struct _EFI_SMM_CPU_IO_INTERFACE EFI_SMM_CPU_IO_INTERFACE; + +/** + Provides the basic memory and I/O interfaces used to abstract accesses to devices. + + The I/O operations are carried out exactly as requested. The caller is + responsible for any alignment and I/O width issues that the bus, device, + platform, or type of I/O might require. + + @param[in] This The EFI_SMM_CPU_IO_INTERFACE instance. + @param[in] Width Signifies the width of the I/O operations. + @param[in] Address The base address of the I/O operations. The caller is + responsible for aligning the Address, if required. + @param[in] Count The number of I/O operations to perform. + @param[in,out] Buffer For read operations, the destination buffer to store + the results. For write operations, the source buffer + from which to write data. + + @retval EFI_SUCCESS The data was read from or written to the device. + @retval EFI_UNSUPPORTED The Address is not valid for this system. + @retval EFI_INVALID_PARAMETER Width or Count, or both, were invalid. + @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack + of resources. +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_CPU_IO)( + IN EFI_SMM_CPU_IO_INTERFACE *This, + IN EFI_SMM_IO_WIDTH Width, + IN UINT64 Address, + IN UINTN Count, + IN OUT VOID *Buffer + ); + +typedef struct { + /// + /// This service provides the various modalities of memory and I/O read. + /// + EFI_SMM_CPU_IO Read; + /// + /// This service provides the various modalities of memory and I/O write. + /// + EFI_SMM_CPU_IO Write; +} EFI_SMM_IO_ACCESS; + +/// +/// SMM CPU I/O Protocol provides CPU I/O and memory access within SMM. +/// +struct _EFI_SMM_CPU_IO_INTERFACE { + /// + /// Allows reads and writes to memory-mapped I/O space. + /// + EFI_SMM_IO_ACCESS Mem; + /// + /// Allows reads and writes to I/O space. + /// + EFI_SMM_IO_ACCESS Io; +}; + +extern EFI_GUID gEfiSmmCpuIoGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmCpuSaveState.h b/IntelFrameworkPkg/Include/Protocol/SmmCpuSaveState.h new file mode 100644 index 000000000..ba0d03339 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmCpuSaveState.h @@ -0,0 +1,175 @@ +/** @file + This file declares the SMM CPU Save State protocol, which provides the processor + save-state information for IA-32 and Itanium processors. + +Copyright (c) 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.91. +**/ + +#ifndef _SMM_CPU_SAVE_STATE_H_ +#define _SMM_CPU_SAVE_STATE_H_ + +#define EFI_SMM_CPU_SAVE_STATE_PROTOCOL_GUID \ + { \ + 0x21f302ad, 0x6e94, 0x471b, {0x84, 0xbc, 0xb1, 0x48, 0x0, 0x40, 0x3a, 0x1d} \ + } + +typedef struct _EFI_SMM_CPU_SAVE_STATE_PROTOCOL EFI_SMM_CPU_SAVE_STATE_PROTOCOL; + +#define EFI_SMM_MIN_REV_ID_x64 0x30006 + +#pragma pack (1) + +/// +/// CPU save-state strcuture for IA32 and X64. +/// +/// This struct declaration does not exctly match the Framework SMM CIS 0.91 because the +/// union in the Framework SMM CIS 0.91 contains an unnamed union member that causes build +/// breaks on many compilers with high warning levels. Instead, the UINT8 Reserved[0x200] +/// field has been moved into EFI_SMM_CPU_STATE32. This maintains binary compatibility for +/// the layout and also maintains source comaptibility for access of all fields in this +/// union. +/// +/// This struct declaration does not exctly match the Framework SMM CIS 0.91 because +/// the Framework SMM CIS 0.91 uses ASM_XXX for base types in this structure. These +/// have been changed to use the base types defined in the UEFI Specification. +/// +typedef struct { + UINT8 Reserved[0x200]; + UINT8 Reserved1[0xf8]; // fe00h + UINT32 SMBASE; // fef8h + UINT32 SMMRevId; // fefch + UINT16 IORestart; // ff00h + UINT16 AutoHALTRestart; // ff02h + UINT32 IEDBASE; // ff04h + UINT8 Reserved2[0x98]; // ff08h + UINT32 IOMemAddr; // ffa0h + UINT32 IOMisc; // ffa4h + UINT32 _ES; + UINT32 _CS; + UINT32 _SS; + UINT32 _DS; + UINT32 _FS; + UINT32 _GS; + UINT32 _LDTBase; + UINT32 _TR; + UINT32 _DR7; + UINT32 _DR6; + UINT32 _EAX; + UINT32 _ECX; + UINT32 _EDX; + UINT32 _EBX; + UINT32 _ESP; + UINT32 _EBP; + UINT32 _ESI; + UINT32 _EDI; + UINT32 _EIP; + UINT32 _EFLAGS; + UINT32 _CR3; + UINT32 _CR0; +} EFI_SMM_CPU_STATE32; + +/// +/// This struct declaration does not exctly match the Framework SMM CIS 0.91 because +/// the Framework SMM CIS 0.91 uses ASM_XXX for base types in this structure. These +/// have been changed to use the base types defined in the UEFI Specification. +/// +typedef struct { + UINT8 Reserved1[0x1d0]; // fc00h + UINT32 GdtBaseHiDword; // fdd0h + UINT32 LdtBaseHiDword; // fdd4h + UINT32 IdtBaseHiDword; // fdd8h + UINT8 Reserved2[0xc]; // fddch + UINT64 IO_EIP; // fde8h + UINT8 Reserved3[0x50]; // fdf0h + UINT32 _CR4; // fe40h + UINT8 Reserved4[0x48]; // fe44h + UINT32 GdtBaseLoDword; // fe8ch + UINT32 GdtLimit; // fe90h + UINT32 IdtBaseLoDword; // fe94h + UINT32 IdtLimit; // fe98h + UINT32 LdtBaseLoDword; // fe9ch + UINT32 LdtLimit; // fea0h + UINT32 LdtInfo; // fea4h + UINT8 Reserved5[0x50]; // fea8h + UINT32 SMBASE; // fef8h + UINT32 SMMRevId; // fefch + UINT16 AutoHALTRestart; // ff00h + UINT16 IORestart; // ff02h + UINT32 IEDBASE; // ff04h + UINT8 Reserved6[0x14]; // ff08h + UINT64 _R15; // ff1ch + UINT64 _R14; + UINT64 _R13; + UINT64 _R12; + UINT64 _R11; + UINT64 _R10; + UINT64 _R9; + UINT64 _R8; + UINT64 _RAX; // ff5ch + UINT64 _RCX; + UINT64 _RDX; + UINT64 _RBX; + UINT64 _RSP; + UINT64 _RBP; + UINT64 _RSI; + UINT64 _RDI; + UINT64 IOMemAddr; // ff9ch + UINT32 IOMisc; // ffa4h + UINT32 _ES; // ffa8h + UINT32 _CS; + UINT32 _SS; + UINT32 _DS; + UINT32 _FS; + UINT32 _GS; + UINT32 _LDTR; // ffc0h + UINT32 _TR; + UINT64 _DR7; // ffc8h + UINT64 _DR6; + UINT64 _RIP; // ffd8h + UINT64 IA32_EFER; // ffe0h + UINT64 _RFLAGS; // ffe8h + UINT64 _CR3; // fff0h + UINT64 _CR0; // fff8h +} EFI_SMM_CPU_STATE64; + +/// +/// Union of CPU save-state strcutures for IA32 and X64. +/// +/// This union declaration does not exctly match the Framework SMM CIS 0.91 because the +/// union in the Framework SMM CIS 0.91 contains an unnamed union member that causes build +/// breaks on many compilers with high warning levels. Instead, the UINT8 Reserved[0x200] +/// field has been moved into EFI_SMM_CPU_STATE32. This maintains binary compatibility for +/// the layout and also maintains source comaptibility for access of all fields in this +/// union. +/// +typedef union { + EFI_SMM_CPU_STATE32 x86; + EFI_SMM_CPU_STATE64 x64; +} EFI_SMM_CPU_STATE; + +#pragma pack () + +/// +/// Provides a programatic means to access SMM save state. +/// +struct _EFI_SMM_CPU_SAVE_STATE_PROTOCOL { + /// + /// Reference to a list of save states. + /// + EFI_SMM_CPU_STATE **CpuSaveState; +}; + +extern EFI_GUID gEfiSmmCpuSaveStateProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmGpiDispatch.h b/IntelFrameworkPkg/Include/Protocol/SmmGpiDispatch.h new file mode 100644 index 000000000..62f9a5160 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmGpiDispatch.h @@ -0,0 +1,136 @@ +/** @file + This file declares the Smm Gpi Smi Child Protocol. + + The EFI_SMM_GPI_DISPATCH_PROTOCOL is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. It provides the ability to install child handlers for the given event types. + Several inputs can be enabled. This purpose of this interface is to generate an + SMI in response to any of these inputs having a true value provided. + +Copyright (c) 2007 - 2010, 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 that 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 _SMM_GPI_DISPATCH_H_ +#define _SMM_GPI_DISPATCH_H_ + + +// +// Global ID for the GPI SMI Protocol +// +#define EFI_SMM_GPI_DISPATCH_PROTOCOL_GUID \ + { \ + 0xe0744b81, 0x9513, 0x49cd, {0x8c, 0xea, 0xe9, 0x24, 0x5e, 0x70, 0x39, 0xda } \ + } + +typedef struct _EFI_SMM_GPI_DISPATCH_PROTOCOL EFI_SMM_GPI_DISPATCH_PROTOCOL; + +// +// Related Definitions +// + +// +// GpiMask is a bit mask of 32 possible general purpose inputs that can generate +// an SMI. Bit 0 corresponds to logical GPI[0], 1 corresponds to logical GPI[1], and so on. +// +// The logical GPI index to physical pin on device is described by the GPI device name +// found on the same handle as the GpiSmi child dispatch protocol. The GPI device name +// is defined as protocol with a GUID name and NULL protocol pointer. +// +typedef struct { + UINTN GpiNum; +} EFI_SMM_GPI_DISPATCH_CONTEXT; + +// +// Member functions +// + +/** + Dispatch function for a GPI SMI handler. + + @param DispatchHandle The handle of this dispatch function. + @param DispatchContext The pointer to the dispatch function's context. + The DispatchContext fields are filled in by the + dispatching driver prior to invoking this dispatch + function. +**/ +typedef +VOID +(EFIAPI *EFI_SMM_GPI_DISPATCH)( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_GPI_DISPATCH_CONTEXT *DispatchContext + ); + +/** + Register a child SMI source dispatch function with a parent SMM driver + + @param This The pointer to the EFI_SMM_GPI_DISPATCH_PROTOCOL instance. + @param DispatchFunction Function to install. + @param DispatchContext The pointer to the dispatch function's context. + Indicates to the register + function the GPI(s) for which the dispatch function + should be invoked. + @param DispatchHandle The handle generated by the dispatcher to track the + function instance. + + @retval EFI_SUCCESS The dispatch function has been successfully + registered, and the SMI source has been enabled. + @retval EFI_DEVICE_ERROR The driver was unable to enable the SMI source. + @retval EFI_OUT_OF_RESOURCES Not enough memory (system or SMM) to manage this + child. + @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The GPI input value + is not within valid range. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_GPI_REGISTER)( + IN EFI_SMM_GPI_DISPATCH_PROTOCOL *This, + IN EFI_SMM_GPI_DISPATCH DispatchFunction, + IN EFI_SMM_GPI_DISPATCH_CONTEXT *DispatchContext, + OUT EFI_HANDLE *DispatchHandle + ); + +/** + Unregisters a General Purpose Input (GPI) service. + + @param This The pointer to the EFI_SMM_GPI_DISPATCH_PROTOCOL instance. + @param DispatchHandle The handle of the service to remove. + + @retval EFI_SUCCESS The dispatch function has been successfully + unregistered, and the SMI source has been disabled, + if there are no other registered child dispatch + functions for this SMI source. + @retval EFI_INVALID_PARAMETER DispatchHandle is invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_GPI_UNREGISTER)( + IN EFI_SMM_GPI_DISPATCH_PROTOCOL *This, + IN EFI_HANDLE DispatchHandle + ); + +// +// Interface structure for the SMM GPI SMI Dispatch Protocol +// +struct _EFI_SMM_GPI_DISPATCH_PROTOCOL { + EFI_SMM_GPI_REGISTER Register; + EFI_SMM_GPI_UNREGISTER UnRegister; + + /// + /// Denotes the maximum value of inputs that can have handlers attached. + /// + UINTN NumSupportedGpis; +}; + +extern EFI_GUID gEfiSmmGpiDispatchProtocolGuid; + +#endif + diff --git a/IntelFrameworkPkg/Include/Protocol/SmmIchnDispatch.h b/IntelFrameworkPkg/Include/Protocol/SmmIchnDispatch.h new file mode 100644 index 000000000..56e9e3844 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmIchnDispatch.h @@ -0,0 +1,189 @@ +/** @file + Provides the parent dispatch service for a given SMI source generator. + The EFI_SMM_ICHN_DISPATCH_PROTOCOL provides the ability to install child handlers for + the given event types. + +Copyright (c) 2008 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _EFI_SMM_ICHN_DISPATCH_H_ +#define _EFI_SMM_ICHN_DISPATCH_H_ + + +// +// Global ID for the ICH SMI Protocol +// +#define EFI_SMM_ICHN_DISPATCH_PROTOCOL_GUID \ + { \ + 0xc50b323e, 0x9075, 0x4f2a, {0xac, 0x8e, 0xd2, 0x59, 0x6a, 0x10, 0x85, 0xcc } \ + } + +typedef struct _EFI_SMM_ICHN_DISPATCH_PROTOCOL EFI_SMM_ICHN_DISPATCH_PROTOCOL; + +// +// Related Definitions +// +// +// ICHN Specific SMIs. These are miscellaneous SMI sources that are supported by the +// ICHN specific SMI implementation. These may change over time. TrapNumber is only +// valid if the Type is Trap. +// +typedef enum { + // + // NOTE: NEVER delete items from this list/enumeration! Doing so will prevent other versions + // of the code from compiling. If the ICH version your driver is written for doesn't support + // some of these SMIs, then simply return EFI_UNSUPPORTED when a child/client tries to register + // for them. + // + IchnMch, + IchnPme, + IchnRtcAlarm, + IchnRingIndicate, + IchnAc97Wake, + IchnSerialIrq, + IchnY2KRollover, + IchnTcoTimeout, + IchnOsTco, + IchnNmi, + IchnIntruderDetect, + IchnBiosWp, + IchnMcSmi, + IchnPmeB0, + IchnThrmSts, + IchnSmBus, + IchnIntelUsb2, + IchnMonSmi7, + IchnMonSmi6, + IchnMonSmi5, + IchnMonSmi4, + IchnDevTrap13, + IchnDevTrap12, + IchnDevTrap11, + IchnDevTrap10, + IchnDevTrap9, + IchnDevTrap8, + IchnDevTrap7, + IchnDevTrap6, + IchnDevTrap5, + IchnDevTrap3, + IchnDevTrap2, + IchnDevTrap1, + IchnDevTrap0, + IchnIoTrap3, + IchnIoTrap2, + IchnIoTrap1, + IchnIoTrap0, + IchnPciExpress, + IchnMonitor, + IchnSpi, + IchnQRT, + IchnGpioUnlock, + // + // INSERT NEW ITEMS JUST BEFORE THIS LINE + // + NUM_ICHN_TYPES // the number of items in this enumeration +} EFI_SMM_ICHN_SMI_TYPE; + +typedef struct { + EFI_SMM_ICHN_SMI_TYPE Type; +} EFI_SMM_ICHN_DISPATCH_CONTEXT; + +// +// Member functions +// +/** + Dispatch function for a ICHN specific SMI handler. + + @param DispatchHandle The handle of this dispatch function. + @param DispatchContext The pointer to the dispatch function's context. + The DispatchContext fields are filled in + by the dispatching driver prior to + invoking this dispatch function. + + @return None + +**/ +typedef +VOID +(EFIAPI *EFI_SMM_ICHN_DISPATCH)( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_ICHN_DISPATCH_CONTEXT *DispatchContext + ); + +/** + Register a child SMI source dispatch function with a parent SMM driver. + + @param This The pointer to the EFI_SMM_ICHN_DISPATCH_PROTOCOL instance. + @param DispatchFunction The function to install. + @param DispatchContext The pointer to the dispatch function's context. + The caller fills in this context before calling + the register function to indicate to the register + function the ICHN SMI source for which the dispatch + function should be invoked. + @param DispatchHandle The handle generated by the dispatcher to track the function + instance. + + @retval EFI_SUCCESS The dispatch function has been successfully + registered and the SMI source has been enabled. + @retval EFI_DEVICE_ERROR The driver could not enable the SMI source. + @retval EFI_OUT_OF_RESOURCES Not enough memory (system or SMM) to manage this + child. + @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The ICHN input value + is not within valid range. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_ICHN_REGISTER)( + IN EFI_SMM_ICHN_DISPATCH_PROTOCOL *This, + IN EFI_SMM_ICHN_DISPATCH DispatchFunction, + IN EFI_SMM_ICHN_DISPATCH_CONTEXT *DispatchContext, + OUT EFI_HANDLE *DispatchHandle + ); + +/** + Unregister a child SMI source dispatch function with a parent SMM driver + + @param This The pointer to the EFI_SMM_ICHN_DISPATCH_PROTOCOL instance. + @param DispatchHandle The handle of the service to remove. + + @retval EFI_SUCCESS The dispatch function has been successfully + unregistered, and the SMI source has been disabled, + if there are no other registered child dispatch + functions for this SMI source. + @retval EFI_INVALID_PARAMETER The handle is invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_ICHN_UNREGISTER)( + IN EFI_SMM_ICHN_DISPATCH_PROTOCOL *This, + IN EFI_HANDLE DispatchHandle + ); + +// +// Interface structure for the SMM ICHN specific SMI Dispatch Protocol +// +/** + Provides the parent dispatch service for a given SMI source generator. +**/ +struct _EFI_SMM_ICHN_DISPATCH_PROTOCOL { + EFI_SMM_ICHN_REGISTER Register; ///< Installs a child service to be dispatched by this protocol. + EFI_SMM_ICHN_UNREGISTER UnRegister; ///< Removes a child service dispatched by this protocol. +}; + +extern EFI_GUID gEfiSmmIchnDispatchProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmPeriodicTimerDispatch.h b/IntelFrameworkPkg/Include/Protocol/SmmPeriodicTimerDispatch.h new file mode 100644 index 000000000..962665f38 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmPeriodicTimerDispatch.h @@ -0,0 +1,176 @@ +/** @file + Provides the parent dispatch service for the periodical timer SMI source generator. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _EFI_SMM_PERIODIC_TIMER_DISPATCH_H_ +#define _EFI_SMM_PERIODIC_TIMER_DISPATCH_H_ + + +// +// Global ID for the Periodic Timer SMI Protocol +// +#define EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL_GUID \ + { \ + 0x9cca03fc, 0x4c9e, 0x4a19, {0x9b, 0x6, 0xed, 0x7b, 0x47, 0x9b, 0xde, 0x55 } \ + } + +typedef struct _EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL; + +// +// Related Definitions +// + +typedef struct { + /// + /// The minimum period of time that the child gets called, in 100 nanosecond units. + /// The child will be called back after a time greater than the time Period. + /// + UINT64 Period; + /// + /// The period of time interval between SMIs. Children of this interface + /// should use this field when registering for periodic timer intervals when a finer + /// granularity periodic SMI is desired. Valid values for this field are those returned + /// by GetNextInterval. A value of 0 indicates the parent is allowed to use any SMI + /// interval period to satisfy the requested period. + /// + UINT64 SmiTickInterval; + /// + /// The actual time in 100 nanosecond units elapsed since last called. A + /// value of 0 indicates an unknown amount of time. + /// + UINT64 ElapsedTime; +} EFI_SMM_PERIODIC_TIMER_DISPATCH_CONTEXT; + +// +// Member functions +// +/** + Dispatch function for a Periodic Timer SMI handler. + + @param DispatchHandle The handle of this dispatch function. + @param DispatchContext The pointer to the dispatch function's context. + The DispatchContext fields are filled in + by the dispatching driver prior to + invoking this dispatch function. + + @return None + +**/ +typedef +VOID +(EFIAPI *EFI_SMM_PERIODIC_TIMER_DISPATCH)( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_PERIODIC_TIMER_DISPATCH_CONTEXT *DispatchContext + ); + +/** + Returns the next SMI tick period supported by the chipset. The order + returned is from longest to shortest interval period. + + @param This The protocol instance pointer. + @param SmiTickInterval The pointer to pointer of next shorter SMI interval + period supported by the child. This parameter works as a get-first, + get-next field. The first time this function is called, *SmiTickInterval + should be set to NULL to get the longest SMI interval. The returned + *SmiTickInterval should be passed in on subsequent calls to get the + next shorter interval period until *SmiTickInterval = NULL. + + @retval EFI_SUCCESS The service returned successfully. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_PERIODIC_TIMER_INTERVAL)( + IN EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL *This, + IN OUT UINT64 **SmiTickInterval + ); + +/** + Register a child SMI source dispatch function with a parent SMM driver + + @param This The pointer to the EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL instance. + @param DispatchFunction The function to install. + @param DispatchContext The pointer to the dispatch function's context. + Indicates to the register + function the period at which the dispatch function + should be invoked. + @param DispatchHandle The handle generated by the dispatcher to track the function instance. + + @retval EFI_SUCCESS The dispatch function has been successfully + registered, and the SMI source has been enabled. + @retval EFI_DEVICE_ERROR The driver was unable to enable the SMI source. + @retval EFI_OUT_OF_RESOURCES Not enough memory (system or SMM) to manage this + child. + @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The period input value + is not within valid range. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_PERIODIC_TIMER_REGISTER)( + IN EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL *This, + IN EFI_SMM_PERIODIC_TIMER_DISPATCH DispatchFunction, + IN EFI_SMM_PERIODIC_TIMER_DISPATCH_CONTEXT *DispatchContext, + OUT EFI_HANDLE *DispatchHandle + ); + +/** + Unregisters a periodic timer service. + + @param This The pointer to the EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL instance. + @param DispatchHandle The handle of the service to remove. + + @retval EFI_SUCCESS The dispatch function has been successfully + unregistered, and the SMI source has been disabled + if there are no other registered child dispatch + functions for this SMI source. + @retval EFI_INVALID_PARAMETER The handle is invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_PERIODIC_TIMER_UNREGISTER)( + IN EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL *This, + IN EFI_HANDLE DispatchHandle + ); + +// +// Interface structure for the SMM Periodic Timer Dispatch Protocol +// +/** + Provides the parent dispatch service for the periodical timer SMI source generator. +**/ +struct _EFI_SMM_PERIODIC_TIMER_DISPATCH_PROTOCOL { + /// + /// Installs a child service to be dispatched by this protocol. + /// + EFI_SMM_PERIODIC_TIMER_REGISTER Register; + + /// + /// Removes a child service dispatched by this protocol. + /// + EFI_SMM_PERIODIC_TIMER_UNREGISTER UnRegister; + + /// + /// Returns the next SMI tick period that is supported by the chipset. + /// + EFI_SMM_PERIODIC_TIMER_INTERVAL GetNextShorterInterval; +}; + +extern EFI_GUID gEfiSmmPeriodicTimerDispatchProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmPowerButtonDispatch.h b/IntelFrameworkPkg/Include/Protocol/SmmPowerButtonDispatch.h new file mode 100644 index 000000000..eaf5aa637 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmPowerButtonDispatch.h @@ -0,0 +1,141 @@ +/** @file + Provides the parent dispatch service for the power button SMI source generator. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _EFI_SMM_POWER_BUTTON_DISPATCH_H_ +#define _EFI_SMM_POWER_BUTTON_DISPATCH_H_ + + +// +// Global ID for the Power Button SMI Protocol +// +#define EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL_GUID \ + { \ + 0xb709efa0, 0x47a6, 0x4b41, {0xb9, 0x31, 0x12, 0xec, 0xe7, 0xa8, 0xee, 0x56 } \ + } + +typedef struct _EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL; + +// +// Related Definitions +// +// +// Power Button. Example, Use for changing LEDs before ACPI OS is on. +// - DXE/BDS Phase +// - OS Install Phase +// +typedef enum { + PowerButtonEntry, + PowerButtonExit +} EFI_POWER_BUTTON_PHASE; + +typedef struct { + EFI_POWER_BUTTON_PHASE Phase; +} EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT; + +// +// Member functions +// +/** + Dispatch function for a Power Button SMI handler. + + @param[in] DispatchHandle The handle of this dispatch function. + @param[in] DispatchContext The pointer to the dispatch function's context. + The DispatchContext fields are filled in + by the dispatching driver prior to + invoking this dispatch function. + +**/ +typedef +VOID +(EFIAPI *EFI_SMM_POWER_BUTTON_DISPATCH)( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT *DispatchContext + ); + +/** + Provides the parent dispatch service for a given SMI source generator + + @param[in] This The pointer to the + EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL instance. + @param[in] DispatchFunction The function to install. + @param[in] DispatchContext The pointer to the dispatch function's context. + Indicates to the register + function the Power Button SMI phase for which + to invoke the dispatch function. + @param[out] DispatchHandle Handle generated by the dispatcher to track + the function instance. + + @retval EFI_SUCCESS The dispatch function has been successfully + registered and the SMI source has been enabled. + @retval EFI_DEVICE_ERROR The driver was unable to enable the SMI source. + @retval EFI_OUT_OF_RESOURCES Not enough memory (system or SMM) to manage this + child. + @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The Power Button SMI + phase is not within valid range. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_POWER_BUTTON_REGISTER)( + IN EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL *This, + IN EFI_SMM_POWER_BUTTON_DISPATCH DispatchFunction, + IN EFI_SMM_POWER_BUTTON_DISPATCH_CONTEXT *DispatchContext, + OUT EFI_HANDLE *DispatchHandle + ); + +/** + Unregisters a power-button service. + + @param[in] This The pointer to the EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL instance. + @param[in] DispatchHandle The handle of the service to remove. + + @retval EFI_SUCCESS The dispatch function has been successfully + unregistered, and the SMI source has been + disabled, if there are no other registered + child dispatch functions for this SMI + source. + @retval EFI_INVALID_PARAMETER The handle is invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_POWER_BUTTON_UNREGISTER)( + IN EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL *This, + IN EFI_HANDLE DispatchHandle + ); + +/** + @par Protocol Description: + Provides the parent dispatch service for the SMM power button SMI source generator. + +**/ +struct _EFI_SMM_POWER_BUTTON_DISPATCH_PROTOCOL { + /// + /// Installs a child service to be dispatched by this protocol. + /// + EFI_SMM_POWER_BUTTON_REGISTER Register; + + /// + /// Removes a child service dispatched by this protocol. + /// + EFI_SMM_POWER_BUTTON_UNREGISTER UnRegister; +}; + +extern EFI_GUID gEfiSmmPowerButtonDispatchProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmStandbyButtonDispatch.h b/IntelFrameworkPkg/Include/Protocol/SmmStandbyButtonDispatch.h new file mode 100644 index 000000000..bb6e6ac79 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmStandbyButtonDispatch.h @@ -0,0 +1,143 @@ +/** @file + Provides the parent dispatch service for the standby button SMI source generator. + + The SMM Standby Button Dispatch Protocol is defined in + the Intel Platform Innovation Framework for EFI SMM Core Interface Specification + (SMM CIS) Version 0.9. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _EFI_SMM_STANDBY_BUTTON_DISPATCH_H_ +#define _EFI_SMM_STANDBY_BUTTON_DISPATCH_H_ + +// +// Share some common definitions with PI SMM +// +#include + +// +// Global ID for the Standby Button SMI Protocol +// +#define EFI_SMM_STANDBY_BUTTON_DISPATCH_PROTOCOL_GUID \ + { \ + 0x78965b98, 0xb0bf, 0x449e, {0x8b, 0x22, 0xd2, 0x91, 0x4e, 0x49, 0x8a, 0x98 } \ + } + +typedef struct _EFI_SMM_STANDBY_BUTTON_DISPATCH_PROTOCOL EFI_SMM_STANDBY_BUTTON_DISPATCH_PROTOCOL; + +// +// Related Definitions +// + +typedef struct { + /// Describes whether the child handler should be invoked upon the entry to the button + /// activation or upon exit (i.e., upon receipt of the button press event or upon release of + /// the event). + EFI_STANDBY_BUTTON_PHASE Phase; +} EFI_SMM_STANDBY_BUTTON_DISPATCH_CONTEXT; + +// +// Member functions +// + +/** + Dispatch function for a Standby Button SMI handler. + + @param DispatchHandle The handle of this dispatch function. + @param DispatchContext The pointer to the dispatch function's context. + The DispatchContext fields are filled in + by the dispatching driver prior to + invoking this dispatch function. + +**/ +typedef +VOID +(EFIAPI *EFI_SMM_STANDBY_BUTTON_DISPATCH)( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_STANDBY_BUTTON_DISPATCH_CONTEXT *DispatchContext + ); + +/** + Provides the parent dispatch service for a given SMI source generator + + @param This The pointer to the EFI_SMM_STANDBY_BUTTON_DISPATCH_PROTOCOL instance. + @param DispatchFunction The function to install. + @param DispatchContext The pointer to the dispatch function's context. + Indicates to the register function the Standby + Button SMI phase for which to invoke the dispatch + function. + @param DispatchHandle The handle generated by the dispatcher to track the + function instance. + + @retval EFI_SUCCESS The dispatch function has been successfully + registered, and the SMI source has been enabled. + @retval EFI_DEVICE_ERROR The driver could not enable the SMI source. + @retval EFI_OUT_OF_RESOURCES Not enough memory (system or SMM) to manage this + child. + @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The Standby Button SMI + phase is not within valid range. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_STANDBY_BUTTON_REGISTER)( + IN EFI_SMM_STANDBY_BUTTON_DISPATCH_PROTOCOL *This, + IN EFI_SMM_STANDBY_BUTTON_DISPATCH DispatchFunction, + IN EFI_SMM_STANDBY_BUTTON_DISPATCH_CONTEXT *DispatchContext, + OUT EFI_HANDLE *DispatchHandle + ); + +/** + Unregister a child SMI source dispatch function with a parent SMM driver. + + @param This The pointer to the EFI_SMM_STANDBY_BUTTON_DISPATCH_PROTOCOL instance. + @param DispatchHandle The handle of the service to remove. + + @retval EFI_SUCCESS The dispatch function has been successfully + unregistered, and the SMI source has been disabled, + if there are no other registered child dispatch + functions for this SMI source. + @retval EFI_INVALID_PARAMETER The handle is invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_STANDBY_BUTTON_UNREGISTER)( + IN EFI_SMM_STANDBY_BUTTON_DISPATCH_PROTOCOL *This, + IN EFI_HANDLE DispatchHandle + ); + +// +// Interface structure for the SMM Standby Button SMI Dispatch Protocol +// +/** + This protocol provices the parent dispatch service for the standby button SMI source generator. + Provides the ability to install child handlers for the given event types. + **/ +struct _EFI_SMM_STANDBY_BUTTON_DISPATCH_PROTOCOL { + /// + /// Installs a child service to be dispatched by this protocol. + /// + EFI_SMM_STANDBY_BUTTON_REGISTER Register;\ + /// + /// Removes a child service dispatched by this protocol. + /// + EFI_SMM_STANDBY_BUTTON_UNREGISTER UnRegister; +}; + +extern EFI_GUID gEfiSmmStandbyButtonDispatchProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmSwDispatch.h b/IntelFrameworkPkg/Include/Protocol/SmmSwDispatch.h new file mode 100644 index 000000000..de19e536e --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmSwDispatch.h @@ -0,0 +1,151 @@ +/** @file + Provides the parent dispatch service for a given SMI source generator. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework for EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _EFI_SMM_SW_DISPATCH_H_ +#define _EFI_SMM_SW_DISPATCH_H_ + + +// +// Global ID for the SW SMI Protocol +// +#define EFI_SMM_SW_DISPATCH_PROTOCOL_GUID \ + { \ + 0xe541b773, 0xdd11, 0x420c, {0xb0, 0x26, 0xdf, 0x99, 0x36, 0x53, 0xf8, 0xbf } \ + } + +typedef struct _EFI_SMM_SW_DISPATCH_PROTOCOL EFI_SMM_SW_DISPATCH_PROTOCOL; + +// +// Related Definitions +// +// +// A particular chipset may not support all possible software SMI input values. +// For example, the ICH supports only values 00h to 0FFh. The parent only allows a single +// child registration for each SwSmiInputValue. +// +typedef struct { + UINTN SwSmiInputValue; +} EFI_SMM_SW_DISPATCH_CONTEXT; + +// +// Member functions +// +/** + Dispatch function for a Software SMI handler. + + @param DispatchHandle The handle of this dispatch function. + @param DispatchContext The pointer to the dispatch function's context. + The SwSmiInputValue field is filled in + by the software dispatch driver prior to + invoking this dispatch function. + The dispatch function will only be called + for input values for which it is registered. + + @return None + +**/ +typedef +VOID +(EFIAPI *EFI_SMM_SW_DISPATCH)( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_SW_DISPATCH_CONTEXT *DispatchContext + ); + +/** + Register a child SMI source dispatch function with a parent SMM driver. + + @param This The pointer to the EFI_SMM_SW_DISPATCH_PROTOCOL instance. + @param DispatchFunction The function to install. + @param DispatchContext The pointer to the dispatch function's context. + Indicates to the register + function the Software SMI input value for which + to invoke the dispatch function. + @param DispatchHandle The handle generated by the dispatcher to track + the function instance. + + @retval EFI_SUCCESS The dispatch function has been successfully + registered and the SMI source has been enabled. + @retval EFI_DEVICE_ERROR The SW driver could not enable the SMI source. + @retval EFI_OUT_OF_RESOURCES Not enough memory (system or SMM) to manage this + child. + @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The SW SMI input value + is not within valid range. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_SW_REGISTER)( + IN EFI_SMM_SW_DISPATCH_PROTOCOL *This, + IN EFI_SMM_SW_DISPATCH DispatchFunction, + IN EFI_SMM_SW_DISPATCH_CONTEXT *DispatchContext, + OUT EFI_HANDLE *DispatchHandle + ); + +/** + Unregister a child SMI source dispatch function with a parent SMM driver + + @param This The pointer to the EFI_SMM_SW_DISPATCH_PROTOCOL instance. + @param DispatchHandle The handle of the service to remove. + + @retval EFI_SUCCESS The dispatch function has been successfully + unregistered and the SMI source has been disabled + if there are no other registered child dispatch + functions for this SMI source. + @retval EFI_INVALID_PARAMETER The handle is invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_SW_UNREGISTER)( + IN EFI_SMM_SW_DISPATCH_PROTOCOL *This, + IN EFI_HANDLE DispatchHandle + ); + + +// +// Interface structure for the SMM Software SMI Dispatch Protocol +// +/** + Provides the parent dispatch service for a given SMI source generator. +**/ +/// +/// Inconsistent with the specification here: +/// In The Framework specification SmmCis, this definition is named as +/// _EFI_SMM_ICHN_DISPATCH_PROTOCOL by mistake. +/// +struct _EFI_SMM_SW_DISPATCH_PROTOCOL { + /// + /// Installs a child service to be dispatched by this protocol. + /// + EFI_SMM_SW_REGISTER Register; + + /// + /// Removes a child service dispatched by this protocol. + /// + EFI_SMM_SW_UNREGISTER UnRegister; + + /// + /// A read-only field that describes the maximum value that can be used + /// in the EFI_SMM_SW_DISPATCH_PROTOCOL.Register() service. + /// + UINTN MaximumSwiValue; +}; + +extern EFI_GUID gEfiSmmSwDispatchProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmSxDispatch.h b/IntelFrameworkPkg/Include/Protocol/SmmSxDispatch.h new file mode 100644 index 000000000..7d1dec47f --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmSxDispatch.h @@ -0,0 +1,135 @@ +/** @file + Provides the parent dispatch service for a given Sx-state source generator. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _EFI_SMM_SX_DISPATCH_H_ +#define _EFI_SMM_SX_DISPATCH_H_ + +// +// Share some common definitions with PI SMM +// +#include + +// +// Global ID for the Sx SMI Protocol +// +#define EFI_SMM_SX_DISPATCH_PROTOCOL_GUID \ + { \ + 0x14fc52be, 0x1dc, 0x426c, {0x91, 0xae, 0xa2, 0x3c, 0x3e, 0x22, 0xa, 0xe8 } \ + } + +typedef struct _EFI_SMM_SX_DISPATCH_PROTOCOL EFI_SMM_SX_DISPATCH_PROTOCOL; + +typedef struct { + EFI_SLEEP_TYPE Type; + EFI_SLEEP_PHASE Phase; +} EFI_SMM_SX_DISPATCH_CONTEXT; + +// +// Member functions +// +/** + Dispatch function for a Sx state SMI handler. + + @param DispatchHandle The handle of this dispatch function. + @param DispatchContext The pointer to the dispatch function's context. + The Type and Phase fields are filled in by the Sx dispatch driver + prior to invoking this dispatch function. For this interface, + the Sx driver will call the dispatch function for all Sx type + and phases, so the Sx state handler(s) must check the Type and + Phase field of EFI_SMM_SX_DISPATCH_CONTEXT, and act accordingly. + + @return None + +**/ +typedef +VOID +(EFIAPI *EFI_SMM_SX_DISPATCH)( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_SX_DISPATCH_CONTEXT *DispatchContext + ); + +/** + Register a child SMI source dispatch function with a parent SMM driver. + + @param This The pointer to the EFI_SMM_SX_DISPATCH_PROTOCOL instance. + @param DispatchFunction The function to install. + @param DispatchContext The pointer to the dispatch function's context. + The caller fills in this context before calling + the register function to indicates to the register + function which Sx state type and phase the caller + wishes to be called back on. For this interface, + the Sx driver will call the registered handlers for + all Sx type and phases, so the Sx state handler(s) + must check the Type and Phase field of the Dispatch + context, and act accordingly. + @param DispatchHandle The handle of dispatch function, for interfacing + with the parent Sx state SMM driver. + + @retval EFI_SUCCESS The dispatch function has been successfully + registered and the SMI source has been enabled. + @retval EFI_UNSUPPORTED The Sx driver or hardware does not support that + Sx Type/Phase. + @retval EFI_DEVICE_ERROR The Sx driver was unable to enable the SMI source. + @retval EFI_OUT_OF_RESOURCES Not enough memory (system or SMM) to manage this + child. + @retval EFI_INVALID_PARAMETER DispatchContext is invalid. Type & Phase are not + within a valid range. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_SX_REGISTER)( + IN EFI_SMM_SX_DISPATCH_PROTOCOL *This, + IN EFI_SMM_SX_DISPATCH DispatchFunction, + IN EFI_SMM_SX_DISPATCH_CONTEXT *DispatchContext, + OUT EFI_HANDLE *DispatchHandle + ); + +/** + Unregisters an Sx-state service + + @param This The pointer to the EFI_SMM_SX_DISPATCH_PROTOCOL instance. + @param DispatchHandle The handle of the service to remove. + + @retval EFI_SUCCESS The dispatch function has been successfully unregistered, and the + SMI source has been disabled, if there are no other registered child + dispatch functions for this SMI source. + @retval EFI_INVALID_PARAMETER Handle is invalid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_SX_UNREGISTER)( + IN EFI_SMM_SX_DISPATCH_PROTOCOL *This, + IN EFI_HANDLE DispatchHandle + ); + +// +// Interface structure for the SMM Child Dispatch Protocol +// +/** + Provides the parent dispatch service for a given Sx-state source generator. +**/ +struct _EFI_SMM_SX_DISPATCH_PROTOCOL { + EFI_SMM_SX_REGISTER Register; ///< Installs a child service to be dispatched by this protocol. + EFI_SMM_SX_UNREGISTER UnRegister; ///< Removes a child service dispatched by this protocol. +}; + +extern EFI_GUID gEfiSmmSxDispatchProtocolGuid; + +#endif diff --git a/IntelFrameworkPkg/Include/Protocol/SmmUsbDispatch.h b/IntelFrameworkPkg/Include/Protocol/SmmUsbDispatch.h new file mode 100644 index 000000000..c3e081321 --- /dev/null +++ b/IntelFrameworkPkg/Include/Protocol/SmmUsbDispatch.h @@ -0,0 +1,136 @@ +/** @file + Provides the parent dispatch service for the USB SMI source generator. + +Copyright (c) 2007 - 2010, 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 that 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. + + @par Revision Reference: + This Protocol is defined in Framework of EFI SMM Core Interface Spec + Version 0.9. + +**/ + +#ifndef _EFI_SMM_USB_DISPATCH_H_ +#define _EFI_SMM_USB_DISPATCH_H_ + +// +// Share some common definitions with PI SMM +// +#include + +// +// Global ID for the USB Protocol +// +#define EFI_SMM_USB_DISPATCH_PROTOCOL_GUID \ + { \ + 0xa05b6ffd, 0x87af, 0x4e42, {0x95, 0xc9, 0x62, 0x28, 0xb6, 0x3c, 0xf3, 0xf3 } \ + } + +typedef struct _EFI_SMM_USB_DISPATCH_PROTOCOL EFI_SMM_USB_DISPATCH_PROTOCOL; + +typedef struct { + /// + /// Describes whether this child handler will be invoked in response to a USB legacy + /// emulation event, such as port-trap on the PS/2* keyboard control registers, or to a + /// USB wake event, such as resumption from a sleep state. + /// + EFI_USB_SMI_TYPE Type; + /// + /// The device path is part of the context structure and describes the location of the + /// particular USB host controller in the system for which this register event will occur. + /// This location is important because of the possible integration of several USB host + /// controllers in a system. + /// + EFI_DEVICE_PATH_PROTOCOL *Device; +} EFI_SMM_USB_DISPATCH_CONTEXT; + +// +// Member functions +// +/** + Dispatch function for a USB SMI handler. + + @param[in] DispatchHandle Handle of this dispatch function. + @param[in] DispatchContext Pointer to the dispatch function's context. + The DispatchContext fields are filled in + by the dispatching driver prior to + invoking this dispatch function. + +**/ +typedef +VOID +(EFIAPI *EFI_SMM_USB_DISPATCH)( + IN EFI_HANDLE DispatchHandle, + IN EFI_SMM_USB_DISPATCH_CONTEXT *DispatchContext + ); + +/** + Register a child SMI source dispatch function with a parent SMM driver. + + @param[in] This The pointer to the EFI_SMM_USB_DISPATCH_PROTOCOL instance. + @param[in] DispatchFunction The pointer to dispatch function to be invoked + for this SMI source. + @param[in] DispatchContext The pointer to the dispatch function's context. + The caller fills this context in before calling + the register function to indicate to the register + function the USB SMI types for which the dispatch + function should be invoked. + @param[out] DispatchHandle The handle generated by the dispatcher to track the + function instance. + + @retval EFI_SUCCESS The dispatch function has been successfully + registered and the SMI source has been enabled. + @retval EFI_DEVICE_ERROR The driver was unable to enable the SMI source. + @retval EFI_OUT_OF_RESOURCES Not enough memory (system or SMM) to manage this + child. + @retval EFI_INVALID_PARAMETER DispatchContext is invalid. The USB SMI type + is not within valid range. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_USB_REGISTER)( + IN EFI_SMM_USB_DISPATCH_PROTOCOL *This, + IN EFI_SMM_USB_DISPATCH DispatchFunction, + IN EFI_SMM_USB_DISPATCH_CONTEXT *DispatchContext, + OUT EFI_HANDLE *DispatchHandle + ); + +/** + Unregisters a USB service. + + @param[in] This The pointer to the EFI_SMM_USB_DISPATCH_PROTOCOL instance. + @param[in] DispatchHandle Handle of the service to remove. + + @retval EFI_SUCCESS The dispatch function has been successfully + unregistered and the SMI source has been disabled + if there are no other registered child dispatch + functions for this SMI source. + @retval EFI_INVALID_PARAMETER The DispatchHandle was not valid. + +**/ +typedef +EFI_STATUS +(EFIAPI *EFI_SMM_USB_UNREGISTER)( + IN EFI_SMM_USB_DISPATCH_PROTOCOL *This, + IN EFI_HANDLE DispatchHandle + ); + +/// +/// The EFI_SMM_USB_DISPATCH_PROTOCOL provides the ability to install child handlers for the +/// given event types. +/// +struct _EFI_SMM_USB_DISPATCH_PROTOCOL { + EFI_SMM_USB_REGISTER Register; + EFI_SMM_USB_UNREGISTER UnRegister; +}; + +extern EFI_GUID gEfiSmmUsbDispatchProtocolGuid; + +#endif diff --git a/edksetup.bat b/edksetup.bat index 0a5c6466f..5afb9b59f 100644 --- a/edksetup.bat +++ b/edksetup.bat @@ -118,9 +118,9 @@ goto check_cygwin if not defined NASM_PREFIX ( @echo. @echo !!! WARNING !!! NASM_PREFIX environment variable is not set - @if exist "C:\nasm\nasm.exe" @set "NASM_PREFIX=C:\nasm\" - @if exist "C:\nasm\nasm.exe" @echo Found nasm.exe, setting the environment variable to C:\nasm\ - @if not exist "C:\nasm\nasm.exe" echo Attempting to build modules that require NASM will fail. + @if exist "C:\Program Files (x86)\NASM\nasm.exe" @set "NASM_PREFIX=C:\Program Files (x86)\NASM\" + @if exist "C:\Program Files (x86)\NASM\nasm.exe" @echo Found nasm.exe, setting the environment variable to C:\Program Files (x86)\NASM + @if not exist "C:\Program Files (x86)\NASM\nasm.exe" echo Attempting to build modules that require NASM will fail. ) :check_cygwin