/**@file | |
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
Module Name: | |
MiscSubclassDriverEntryPoint.c | |
Abstract: | |
This driver parses the mMiscSubclassDataTable structure and reports | |
any generated data to the DataHub. | |
**/ | |
#include "MiscSubclassDriver.h" | |
EFI_HII_HANDLE mHiiHandle; | |
/** | |
This is the standard EFI driver point that detects whether there is a | |
MemoryConfigurationData Variable and, if so, reports memory configuration info | |
to the DataHub. | |
@param ImageHandle Handle for the image of this driver | |
@param SystemTable Pointer to the EFI System Table | |
@return EFI_SUCCESS if the data is successfully reported | |
@return EFI_NOT_FOUND if the HOB list could not be located. | |
**/ | |
EFI_STATUS | |
LogMemorySmbiosRecord ( | |
VOID | |
) | |
{ | |
EFI_STATUS Status; | |
UINT64 TotalMemorySize; | |
UINT8 NumSlots; | |
SMBIOS_TABLE_TYPE19 *Type19Record; | |
EFI_SMBIOS_HANDLE MemArrayMappedAddrSmbiosHandle; | |
EFI_SMBIOS_PROTOCOL *Smbios; | |
CHAR16 *Nt32MemString; | |
Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios); | |
ASSERT_EFI_ERROR (Status); | |
NumSlots = 1; | |
// | |
// Process Memory String in form size!size ... | |
// So 64!64 is 128 MB | |
// | |
Nt32MemString = PcdGetPtr (PcdWinNtMemorySize); | |
for (TotalMemorySize = 0; *Nt32MemString != '\0';) { | |
TotalMemorySize += StrDecimalToUint64 (Nt32MemString); | |
while (*Nt32MemString != '\0') { | |
if (*Nt32MemString == '!') { | |
Nt32MemString++; | |
break; | |
} | |
Nt32MemString++; | |
} | |
} | |
// | |
// Convert Total Memory Size to based on KiloByte | |
// | |
TotalMemorySize = LShiftU64 (TotalMemorySize, 20); | |
// | |
// Generate Memory Array Mapped Address info | |
// | |
Type19Record = AllocateZeroPool(sizeof (SMBIOS_TABLE_TYPE19) + 2); | |
Type19Record->Hdr.Type = EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS; | |
Type19Record->Hdr.Length = sizeof(SMBIOS_TABLE_TYPE19); | |
Type19Record->Hdr.Handle = 0; | |
Type19Record->StartingAddress = 0; | |
Type19Record->EndingAddress = (UINT32)RShiftU64(TotalMemorySize, 10) - 1; | |
Type19Record->MemoryArrayHandle = 0; | |
Type19Record->PartitionWidth = (UINT8)(NumSlots); | |
// | |
// Generate Memory Array Mapped Address info (TYPE 19) | |
// | |
Status = AddSmbiosRecord (Smbios, &MemArrayMappedAddrSmbiosHandle, (EFI_SMBIOS_TABLE_HEADER*) Type19Record); | |
FreePool(Type19Record); | |
ASSERT_EFI_ERROR (Status); | |
return Status; | |
} | |
EFI_STATUS | |
EFIAPI | |
MiscSubclassDriverEntryPoint ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
/*++ | |
Description: | |
Standard EFI driver point. This driver parses the mMiscSubclassDataTable | |
structure and reports any generated data to the DataHub. | |
Arguments: | |
ImageHandle | |
Handle for the image of this driver | |
SystemTable | |
Pointer to the EFI System Table | |
Returns: | |
EFI_SUCCESS | |
The data was successfully reported to the Data Hub. | |
--*/ | |
{ | |
UINTN Index; | |
EFI_STATUS EfiStatus; | |
EFI_SMBIOS_PROTOCOL *Smbios; | |
EfiStatus = gBS->LocateProtocol(&gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios); | |
if (EFI_ERROR(EfiStatus)) { | |
DEBUG((EFI_D_ERROR, "Could not locate SMBIOS protocol. %r\n", EfiStatus)); | |
return EfiStatus; | |
} | |
mHiiHandle = HiiAddPackages ( | |
&gEfiCallerIdGuid, | |
NULL, | |
MiscSubclassStrings, | |
NULL | |
); | |
ASSERT (mHiiHandle != NULL); | |
for (Index = 0; Index < mMiscSubclassDataTableEntries; ++Index) { | |
// | |
// If the entry have a function pointer, just log the data. | |
// | |
if (mMiscSubclassDataTable[Index].Function != NULL) { | |
EfiStatus = (*mMiscSubclassDataTable[Index].Function)( | |
mMiscSubclassDataTable[Index].RecordData, | |
Smbios | |
); | |
if (EFI_ERROR(EfiStatus)) { | |
DEBUG((EFI_D_ERROR, "Misc smbios store error. Index=%d, ReturnStatus=%r\n", Index, EfiStatus)); | |
return EfiStatus; | |
} | |
} | |
} | |
// | |
// Log Memory SMBIOS Record | |
// | |
EfiStatus = LogMemorySmbiosRecord(); | |
return EfiStatus; | |
} | |
/** | |
Add an SMBIOS record. | |
@param Smbios The EFI_SMBIOS_PROTOCOL instance. | |
@param SmbiosHandle A unique handle will be assigned to the SMBIOS record. | |
@param Record The data for the fixed portion of the SMBIOS record. The format of the record is | |
determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined | |
by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or | |
a set of null terminated strings and a null. | |
@retval EFI_SUCCESS Record was added. | |
@retval EFI_OUT_OF_RESOURCES Record was not added due to lack of system resources. | |
**/ | |
EFI_STATUS | |
AddSmbiosRecord ( | |
IN EFI_SMBIOS_PROTOCOL *Smbios, | |
OUT EFI_SMBIOS_HANDLE *SmbiosHandle, | |
IN EFI_SMBIOS_TABLE_HEADER *Record | |
) | |
{ | |
*SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; | |
return Smbios->Add ( | |
Smbios, | |
NULL, | |
SmbiosHandle, | |
Record | |
); | |
} | |