mirror of https://github.com/acidanthera/audk.git
201 lines
5.8 KiB
C
201 lines
5.8 KiB
C
/**@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
|
|
);
|
|
}
|
|
|