diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /Chipset/NB/SystemAgentWrap/MiscSubclass/MiscSubclassDxe.c | |
download | zprj-master.tar.xz |
Diffstat (limited to 'Chipset/NB/SystemAgentWrap/MiscSubclass/MiscSubclassDxe.c')
-rw-r--r-- | Chipset/NB/SystemAgentWrap/MiscSubclass/MiscSubclassDxe.c | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/Chipset/NB/SystemAgentWrap/MiscSubclass/MiscSubclassDxe.c b/Chipset/NB/SystemAgentWrap/MiscSubclass/MiscSubclassDxe.c new file mode 100644 index 0000000..8f87be9 --- /dev/null +++ b/Chipset/NB/SystemAgentWrap/MiscSubclass/MiscSubclassDxe.c @@ -0,0 +1,483 @@ +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* + +//************************************************************************* +// $Header: /Alaska/BIN/Chipset/Intel/NorthBridge/Haswell/Intel SystemAgent NB Chipset/SystemAgentWrap/MiscSubclass/MiscSubclassDxe.c 1 2/08/12 4:36a Yurenlai $ +// +// $Revision: 1 $ +// +// $Date: 2/08/12 4:36a $ +//************************************************************************* +// Revision History +// ---------------- +// $Log: /Alaska/BIN/Chipset/Intel/NorthBridge/Haswell/Intel SystemAgent NB Chipset/SystemAgentWrap/MiscSubclass/MiscSubclassDxe.c $ +// +// 1 2/08/12 4:36a Yurenlai +// Intel Haswell/NB eChipset initially releases. +// +//************************************************************************* +//<AMI_FHDR_START> +// +// Name: MiscSubclassDxe.c +// +// Description: This file for init Hii data base in BIOS id. +// +//<AMI_FHDR_END> +//************************************************************************* + +//--------------------------------------------------------------------------- +// Include(s) +//--------------------------------------------------------------------------- + +#include <Efi.h> +#include <token.h> +#include <AmiLib.h> +#include <AmiDxeLib.h> +#include <Setup.h> +#include <Dxe.h> +#include <PCI.h> +#include <AmiHobs.h> +#include <AmiCspLib.h> + +// Produced Protocols + +// Consumed Protocols + +#include <Protocol\DataHub.h> +#include <Include\DataHubSubClass.h> + +#if EFI_SPECIFICATION_VERSION >= 0x2000A +#include "Include\UefiHii.h" +#include "Protocol\HiiDatabase.h" +#include "Protocol\HiiString.h" +#else +#include <Protocol/Hii.h> +#endif + +//--------------------------------------------------------------------------- +// Constant, Macro and Type Definition(s) +//--------------------------------------------------------------------------- +// Constant Definition(s) + +// Macro Definition(s) +#define EFI_MISC_SUBCLASS_GUID \ +{ 0x772484B2, 0x7482, 0x4b91, 0x9F, 0x9A, 0xAD, 0x43, 0xF8, 0x1C, 0x58, 0x81 } + +#define EFI_MISC_SUBCLASS_DRIVER_GUID \ + { 0xF50E702C, 0x8653, 0x4CDE, 0xBB, 0xCE, 0x43, 0xB4, 0xD5, 0x5B, 0x34, 0xB8 } + +// Type Definition(s) + +#define EFI_MISC_SUBCLASS_VERSION 0x0100 +#define EFI_DATA_RECORD_CLASS_DATA 0x0000000000000004 +#define EFI_MISC_BIOS_VENDOR_RECORD_NUMBER 0x00000002 + +#define EFI_SUBCLASS_INSTANCE_NON_APPLICABLE 0xFFFF //16 bit +// Function Prototype(s) + +//--------------------------------------------------------------------------- +// Variable and External Declaration(s) +//--------------------------------------------------------------------------- +// Variable Declaration(s) + +// GUID Definition(s) +EFI_GUID gEfiMiscSubClassGuid = EFI_MISC_SUBCLASS_GUID; +EFI_GUID gEfiMiscSubClassDriverGuid = EFI_MISC_SUBCLASS_DRIVER_GUID; +EFI_GUID gEfiDataHubProtocolGuid = EFI_DATA_HUB_PROTOCOL_GUID; + +// Protocol Definition(s) + +// External Declaration(s) + +// Function Definition(s) +EFI_STATUS InstallMiscSubClassData ( + IN EFI_HANDLE ImageHandle +); + + +typedef struct { + UINT8 LastPciBus; +} EFI_MISC_LAST_PCI_BUS; + +typedef struct { + UINT32 Reserved1 :2; + UINT32 Unknown :1; + UINT32 BiosCharacteristicsNotSupported :1; + UINT32 IsaIsSupported :1; + UINT32 McaIsSupported :1; + UINT32 EisaIsSupported :1; + UINT32 PciIsSupported :1; + UINT32 PcmciaIsSupported :1; + UINT32 PlugAndPlayIsSupported :1; + UINT32 ApmIsSupported :1; + UINT32 BiosIsUpgradable :1; + UINT32 BiosShadowingAllowed :1; + UINT32 VlVesaIsSupported :1; + UINT32 EscdSupportIsAvailable :1; + UINT32 BootFromCdIsSupported :1; + UINT32 SelectableBootIsSupported :1; + UINT32 RomBiosIsSocketed :1; + UINT32 BootFromPcmciaIsSupported :1; + UINT32 EDDSpecificationIsSupported :1; + UINT32 JapaneseNecFloppyIsSupported :1; + UINT32 JapaneseToshibaFloppyIsSupported :1; + UINT32 Floppy525_360IsSupported :1; + UINT32 Floppy525_12IsSupported :1; + UINT32 Floppy35_720IsSupported :1; + UINT32 Floppy35_288IsSupported :1; + UINT32 PrintScreenIsSupported :1; + UINT32 Keyboard8042IsSupported :1; + UINT32 SerialIsSupported :1; + UINT32 PrinterIsSupported :1; + UINT32 CgaMonoIsSupported :1; + UINT32 NecPc98 :1; + UINT32 AcpiIsSupported :1; + UINT32 UsbLegacyIsSupported :1; + UINT32 AgpIsSupported :1; + UINT32 I20BootIsSupported :1; + UINT32 Ls120BootIsSupported :1; + UINT32 AtapiZipDriveBootIsSupported :1; + UINT32 Boot1394IsSupported :1; + UINT32 SmartBatteryIsSupported :1; + UINT32 BiosBootSpecIsSupported :1; + UINT32 FunctionKeyNetworkBootIsSupported :1; + UINT32 TargetContentDistributionEnabled :1; + UINT32 Reserved :21; +} EFI_MISC_BIOS_CHARACTERISTICS; + +typedef struct { + UINT32 BiosReserved :16; + UINT32 SystemReserved :16; + UINT32 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; + UINT8 BiosMajorRelease; + UINT8 BiosMinorRelease; + UINT8 BiosEmbeddedFirmwareMajorRelease; + UINT8 BiosEmbeddedFirmwareMinorRelease; +} EFI_MISC_BIOS_VENDOR; + +typedef union { + EFI_MISC_LAST_PCI_BUS LastPciBus; + EFI_MISC_BIOS_VENDOR MiscBiosVendor; +} EFI_MISC_SUBCLASS_RECORDS; + +typedef struct { + EFI_SUBCLASS_TYPE1_HEADER Header; + EFI_MISC_SUBCLASS_RECORDS Record; +} EFI_MISC_SUBCLASS_DRIVER_DATA; + +extern UINT8 MiscSubclass[]; + +//--------------------------------------------------------------------------- + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: MiscSubclassDxe_Init +// +// Description: This function is the entry point for MiscSubclass DXE driver. +// This function initializes the MiscSubclass in DXE phase. +// +// Input: ImageHandle - Image handle +// SystemTable - Pointer to the system table +// +// Output: EFI_SUCCESS +// +// Notes: +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> + +EFI_STATUS MiscSubclassDxe_Init ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) +{ + EFI_STATUS Status = EFI_SUCCESS; + + InitAmiLib(ImageHandle, SystemTable); + + Status = InstallMiscSubClassData (ImageHandle); + ASSERT_EFI_ERROR(Status); + + return EFI_SUCCESS; +} + + +#if EFI_SPECIFICATION_VERSION >= 0x2000A +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: PreparePackageList +// +// Description: +// Assemble EFI_HII_PACKAGE_LIST according to the passed in packages. +// +// Input: NumberOfPackages - Number of packages. +// GuidId - Package GUID. +// +// +// Output: Pointer of EFI_HII_PACKAGE_LIST_HEADER. +// +// Notes: +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_HII_PACKAGE_LIST_HEADER * +PreparePackageList ( + IN UINTN NumberOfPackages, + IN EFI_GUID *GuidId, + IN ... +) +{ + va_list Marker; + EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader = NULL; + UINT8 *PackageListData; + UINT32 PackageListLength; + UINT32 PackageLength; + EFI_HII_PACKAGE_HEADER PackageHeader; + UINT8 *PackageArray; + UINTN Index; + + PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER); + + va_start (Marker, GuidId); + for (Index = 0; Index < NumberOfPackages; Index++) { + pBS->CopyMem (&PackageLength, va_arg (Marker, VOID *), sizeof (UINT32)); + PackageListLength += (PackageLength - sizeof (UINT32)); + } + va_end (Marker); + + // + // Include the lenght of EFI_HII_PACKAGE_END + // + PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER); + //PackageListHeader = EfiLibAllocateZeroPool (PackageListLength); + + // PackageListHeader = EfiLibAllocatePool (PackageListLength); + pBS->AllocatePool (EfiBootServicesData, PackageListLength, &PackageListHeader); + + if (PackageListHeader != NULL) { + pBS->SetMem (PackageListHeader, PackageListLength, 0); + } + + ASSERT (PackageListHeader != NULL); + pBS->CopyMem (&PackageListHeader->PackageListGuid, GuidId, sizeof (EFI_GUID)); + PackageListHeader->PackageLength = PackageListLength; + + PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER); + + va_start (Marker, GuidId); + for (Index = 0; Index < NumberOfPackages; Index++) { + PackageArray = (UINT8 *) va_arg (Marker, VOID *); + pBS->CopyMem (&PackageLength, PackageArray, sizeof (UINT32)); + PackageLength -= sizeof (UINT32); + PackageArray += sizeof (UINT32); + pBS->CopyMem (PackageListData, PackageArray, PackageLength); + PackageListData += PackageLength; + } + va_end (Marker); + + // + // Append EFI_HII_PACKAGE_END + // + PackageHeader.Type = EFI_HII_PACKAGE_END; + PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER); + pBS->CopyMem (PackageListData, &PackageHeader, PackageHeader.Length); + + return PackageListHeader; +} + +#else +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: PreparePackages +// +// Description: +// Assemble EFI_HII_PACKAGE_LIST according to the passed in packages. +// +// Input: NumberOfPackages - Number of packages. +// GuidId - Package GUID. +// +// +// Output: Pointer of EFI_HII_PACKAGE_LIST_HEADER. +// +// Notes: +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_HII_PACKAGES * +PreparePackages ( + IN UINTN NumberOfPackages, + IN EFI_GUID *GuidId, + IN ... +) +{ + va_list args; + EFI_HII_PACKAGES *HiiPackages; + VOID **Package; + UINTN Index; + EFI_STATUS Status; + ASSERT (NumberOfPackages > 0); + + Status = pBS->AllocatePool(EfiBootServicesData, (sizeof (EFI_HII_PACKAGES)) + NumberOfPackages * sizeof (VOID *), &HiiPackages); + HiiPackages->GuidId = GuidId; + HiiPackages->NumberOfPackages = NumberOfPackages; + Package = (VOID **) (((UINT8 *) HiiPackages) + sizeof (EFI_HII_PACKAGES)); + + va_start (args, GuidId); + + for (Index = 0; Index < NumberOfPackages; Index++) { + *Package = va_arg (args, VOID *); + Package++; + } + + va_end (args); + + return HiiPackages; +} + +#endif + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Procedure: InstallMiscSubClassData +// +// Description: +// Install MiscSubClassData for IgdOpRegion. +// +// Input: ImageHandle +// +// +// Output: Status. +// +// Notes: +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS InstallMiscSubClassData ( + IN EFI_HANDLE ImageHandle +) +{ + EFI_STATUS Status; + EFI_DATA_HUB_PROTOCOL *DataHub; + EFI_MISC_SUBCLASS_DRIVER_DATA MiscSubClassData; + EFI_STRING StringBuffer; + EFI_HII_HANDLE HiiHandle; +#if EFI_SPECIFICATION_VERSION >= 0x2000A + CHAR8 Language[]="en-US"; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_HII_STRING_PROTOCOL *HiiString; + EFI_HII_PACKAGE_LIST_HEADER *PackageList; +#else + EFI_HII_PROTOCOL *Hii; + EFI_HII_PACKAGES *PackageList; +#endif + + Status = pBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, &DataHub); + ASSERT_EFI_ERROR (Status); + +#if EFI_SPECIFICATION_VERSION >= 0x2000A + // There should only be one HII Database protocol + Status = pBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, &HiiDatabase); + ASSERT_EFI_ERROR (Status); + + Status = pBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, &HiiString); + ASSERT_EFI_ERROR (Status); + +#else + // There should only be one HII protocol + Status = pBS->LocateProtocol (&gEfiHiiProtocolGuid, NULL, &Hii); + ASSERT_EFI_ERROR (Status); +#endif + + MiscSubClassData.Header.Version = EFI_MISC_SUBCLASS_VERSION; + MiscSubClassData.Header.HeaderSize = sizeof (EFI_SUBCLASS_TYPE1_HEADER); + MiscSubClassData.Header.Instance = 1; + MiscSubClassData.Header.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE; + MiscSubClassData.Header.RecordType = EFI_MISC_BIOS_VENDOR_RECORD_NUMBER; + + Status = pBS->AllocatePool(EfiBootServicesData, (sizeof (CHAR16)) * 100, &StringBuffer); + pBS->SetMem(StringBuffer, (sizeof(CHAR16)) * 100, 0); + + Strcpy ((char*)StringBuffer, CONVERT_TO_STRING(BIOSID)); + +#if EFI_SPECIFICATION_VERSION >= 0x2000A + + PackageList = PreparePackageList (1, &gEfiMiscSubClassDriverGuid, MiscSubclass); + + Status = HiiDatabase->NewPackageList ( + HiiDatabase, + PackageList, + ImageHandle, + &HiiHandle + ); + +#else + PackageList = PreparePackages (1, &gEfiMiscSubClassDriverGuid, MiscSubclass); + Status = Hii->NewPack (Hii, PackageList, &HiiHandle); +#endif + ASSERT_EFI_ERROR (Status); + pBS->FreePool (PackageList); + + MiscSubClassData.Record.MiscBiosVendor.BiosVersion = (STRING_REF)0; +#if EFI_SPECIFICATION_VERSION >= 0x2000A + Status = HiiString->NewString (HiiString, HiiHandle, &MiscSubClassData.Record.MiscBiosVendor.BiosVersion, Language, NULL, StringBuffer, NULL); + +// Status = HiiLibSetString(HiiHandle, MiscSubClassData.Record.MiscBiosVendor.BiosVersion, StringBuffer); + if (EFI_ERROR(Status)) return Status; +#else + Hii->NewString ( + Hii, + NULL, + HiiHandle, + &MiscSubClassData.Record.MiscBiosVendor.BiosVersion, + StringBuffer + ); +#endif + + + Status = DataHub->LogData ( + DataHub, + &gEfiMiscSubClassGuid, + &gEfiMiscSubClassDriverGuid, + EFI_DATA_RECORD_CLASS_DATA, + &MiscSubClassData, + sizeof (EFI_SUBCLASS_TYPE1_HEADER) + sizeof (EFI_MISC_BIOS_VENDOR) + ); + + pBS->FreePool(StringBuffer); + + return Status; +} + +//************************************************************************* +//************************************************************************* +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Parkway, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//************************************************************************* +//************************************************************************* |