2008-06-30 07:08:49 +02:00
|
|
|
/*++
|
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
Copyright (c) 2006 - 2009, Intel Corporation
|
2008-06-30 07:08:49 +02:00
|
|
|
All rights reserved. This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
|
|
|
Module Name:
|
|
|
|
|
|
|
|
MiscSubclassDriverEntryPoint.c
|
|
|
|
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
This driver parses the mMiscSubclassDataTable structure and reports
|
|
|
|
any generated data to the DataHub.
|
|
|
|
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#include "MiscSubClassDriver.h"
|
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
EFI_HII_HANDLE mHiiHandle;
|
2008-06-30 07:08:49 +02:00
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
/**
|
|
|
|
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.
|
2008-06-30 07:08:49 +02:00
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
@param ImageHandle Handle for the image of this driver
|
|
|
|
@param SystemTable Pointer to the EFI System Table
|
2008-06-30 07:08:49 +02:00
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
@return EFI_SUCCESS if the data is successfully reported
|
|
|
|
@return EFI_NOT_FOUND if the HOB list could not be located.
|
2008-06-30 07:08:49 +02:00
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
**/
|
|
|
|
EFI_STATUS
|
|
|
|
LogMemorySmbiosRecord (
|
|
|
|
VOID
|
|
|
|
)
|
2008-06-30 07:08:49 +02:00
|
|
|
{
|
2009-11-20 05:02:34 +01:00
|
|
|
EFI_STATUS Status;
|
|
|
|
UINT64 TotalMemorySize;
|
|
|
|
UINT8 NumSlots;
|
|
|
|
SMBIOS_TABLE_TYPE19 *Type19Record;
|
|
|
|
EFI_SMBIOS_HANDLE MemArrayMappedAddrSmbiosHandle;
|
|
|
|
EFI_SMBIOS_PROTOCOL *Smbios;
|
|
|
|
CHAR16 *UnixMemString;
|
|
|
|
|
|
|
|
Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios);
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
|
|
|
|
NumSlots = 1;
|
2008-06-30 07:08:49 +02:00
|
|
|
|
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
// Process Memory String in form size!size ...
|
|
|
|
// So 64!64 is 128 MB
|
2008-06-30 07:08:49 +02:00
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
UnixMemString = PcdGetPtr (PcdUnixMemorySize);
|
|
|
|
for (TotalMemorySize = 0; *UnixMemString != '\0';) {
|
|
|
|
TotalMemorySize += StrDecimalToUint64 (UnixMemString);
|
|
|
|
while (*UnixMemString != '\0') {
|
|
|
|
if (*UnixMemString == '!') {
|
|
|
|
UnixMemString++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
UnixMemString++;
|
|
|
|
}
|
2008-06-30 07:08:49 +02:00
|
|
|
}
|
2009-11-20 05:02:34 +01:00
|
|
|
|
|
|
|
//
|
|
|
|
// Convert Total Memory Size to based on KiloByte
|
2008-06-30 07:08:49 +02:00
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
TotalMemorySize = LShiftU64 (TotalMemorySize, 20);
|
2008-06-30 07:08:49 +02:00
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
// Generate Memory Array Mapped Address info
|
|
|
|
//
|
|
|
|
Type19Record = AllocatePool(sizeof (SMBIOS_TABLE_TYPE19));
|
|
|
|
ZeroMem(Type19Record, sizeof(SMBIOS_TABLE_TYPE19));
|
|
|
|
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);
|
2008-06-30 07:08:49 +02:00
|
|
|
|
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
// Generate Memory Array Mapped Address info (TYPE 19)
|
2008-06-30 07:08:49 +02:00
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
MemArrayMappedAddrSmbiosHandle = 0;
|
|
|
|
Status = Smbios->Add (Smbios, NULL, &MemArrayMappedAddrSmbiosHandle, (EFI_SMBIOS_TABLE_HEADER*) Type19Record);
|
|
|
|
FreePool(Type19Record);
|
|
|
|
ASSERT_EFI_ERROR (Status);
|
2008-06-30 07:08:49 +02:00
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
return Status;
|
2008-06-30 07:08:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
--*/
|
|
|
|
{
|
2009-11-20 05:02:34 +01:00
|
|
|
UINTN Index;
|
|
|
|
EFI_STATUS EfiStatus;
|
|
|
|
EFI_SMBIOS_PROTOCOL *Smbios;
|
2008-06-30 07:08:49 +02:00
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
EfiStatus = gBS->LocateProtocol(&gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios);
|
2008-06-30 07:08:49 +02:00
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
if (EFI_ERROR(EfiStatus)) {
|
|
|
|
DEBUG((EFI_D_ERROR, "Could not locate SMBIOS protocol. %r\n", EfiStatus));
|
2008-06-30 07:08:49 +02:00
|
|
|
return EfiStatus;
|
|
|
|
}
|
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
mHiiHandle = HiiAddPackages (
|
|
|
|
&gEfiCallerIdGuid,
|
|
|
|
NULL,
|
|
|
|
MiscSubclassStrings,
|
|
|
|
NULL
|
|
|
|
);
|
|
|
|
ASSERT (mHiiHandle != NULL);
|
2009-04-14 12:47:19 +02:00
|
|
|
|
2008-06-30 07:08:49 +02:00
|
|
|
for (Index = 0; Index < mMiscSubclassDataTableEntries; ++Index) {
|
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
// If the entry have a function pointer, just log the data.
|
2008-06-30 07:08:49 +02:00
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
if (mMiscSubclassDataTable[Index].Function != NULL) {
|
|
|
|
EfiStatus = (*mMiscSubclassDataTable[Index].Function)(
|
2008-06-30 07:08:49 +02:00
|
|
|
mMiscSubclassDataTable[Index].RecordData,
|
2009-11-20 05:02:34 +01:00
|
|
|
Smbios
|
2008-06-30 07:08:49 +02:00
|
|
|
);
|
|
|
|
|
2009-11-20 05:02:34 +01:00
|
|
|
if (EFI_ERROR(EfiStatus)) {
|
|
|
|
DEBUG((EFI_D_ERROR, "Misc smbios store error. Index=%d, ReturnStatus=%r\n", Index, EfiStatus));
|
|
|
|
return EfiStatus;
|
2008-06-30 07:08:49 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
// Log Memory SMBIOS Record
|
2008-06-30 07:08:49 +02:00
|
|
|
//
|
2009-11-20 05:02:34 +01:00
|
|
|
EfiStatus = LogMemorySmbiosRecord();
|
|
|
|
return EfiStatus;
|
2008-06-30 07:08:49 +02:00
|
|
|
}
|