blob: 7100abeb913d02d0dd7e9483838c8b24db770c7f [file] [log] [blame]
/** @file
Static SMBIOS Table for platform
Copyright (c) 2012, Apple Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiDxe.h>
#include <IndustryStandard/SmBios.h>
#include <Protocol/Smbios.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/SmbiosLib.h>
#include <Library/HobLib.h>
extern SMBIOS_TEMPLATE_ENTRY gSmbiosTemplate[];
SMBIOS_TABLE_TYPE19 gSmbiosType19Template = {
{ EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, sizeof (SMBIOS_TABLE_TYPE19), 0 },
0xffffffff, // StartingAddress;
0xffffffff, // EndingAddress;
0, // MemoryArrayHandle;
1, // PartitionWidth;
0, // ExtendedStartingAddress;
0, // ExtendedEndingAddress;
};
VOID
CreatePlatformSmbiosMemoryRecords (
VOID
)
{
EFI_PEI_HOB_POINTERS HobPtr;
SMBIOS_STRUCTURE_POINTER Smbios16;
SMBIOS_STRUCTURE_POINTER Smbios17;
EFI_SMBIOS_HANDLE PhyscialMemoryArrayHandle;
EFI_SMBIOS_HANDLE SmbiosHandle;
Smbios16.Hdr = SmbiosLibGetRecord (EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, 0, &PhyscialMemoryArrayHandle);
if (Smbios16.Hdr == NULL) {
// Only make a Type19 entry if a Type16 entry exists.
return;
}
Smbios17.Hdr = SmbiosLibGetRecord (EFI_SMBIOS_TYPE_MEMORY_DEVICE, 0, &SmbiosHandle);
if (Smbios17.Hdr == NULL) {
// if type17 exits update with type16 Smbios handle
Smbios17.Type17->MemoryArrayHandle = PhyscialMemoryArrayHandle;
}
// Generate Type16 records
gSmbiosType19Template.MemoryArrayHandle = PhyscialMemoryArrayHandle;
HobPtr.Raw = GetHobList ();
while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, HobPtr.Raw)) != NULL) {
if (HobPtr.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
gSmbiosType19Template.ExtendedStartingAddress = HobPtr.ResourceDescriptor->PhysicalStart;
gSmbiosType19Template.ExtendedEndingAddress =
HobPtr.ResourceDescriptor->PhysicalStart +
HobPtr.ResourceDescriptor->ResourceLength - 1;
SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, NULL);
}
HobPtr.Raw = GET_NEXT_HOB (HobPtr);
}
}
/**
Main entry for this driver.
@param ImageHandle Image handle this driver.
@param SystemTable Pointer to SystemTable.
@retval EFI_SUCESS This function always complete successfully.
**/
EFI_STATUS
EFIAPI
PlatformSmbiosDriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_SMBIOS_HANDLE SmbiosHandle;
SMBIOS_STRUCTURE_POINTER Smbios;
// Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
// to an early version of the specification.
// Phase 1 - Initialize SMBIOS tables from template
Status = SmbiosLibInitializeFromTemplate (gSmbiosTemplate);
ASSERT_EFI_ERROR (Status);
// Phase 2 - Patch SMBIOS table entries
Smbios.Hdr = SmbiosLibGetRecord (EFI_SMBIOS_TYPE_BIOS_INFORMATION, 0, &SmbiosHandle);
if (Smbios.Type0 != NULL) {
// 64K * (n+1) bytes
Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64 (PcdEmuFirmwareFdSize), 64*1024) - 1;
SmbiosLibUpdateUnicodeString (
SmbiosHandle,
Smbios.Type0->BiosVersion,
(CHAR16 *)PcdGetPtr (PcdFirmwareVersionString)
);
SmbiosLibUpdateUnicodeString (
SmbiosHandle,
Smbios.Type0->BiosReleaseDate,
(CHAR16 *)PcdGetPtr (PcdFirmwareReleaseDateString)
);
}
// Phase 3 - Create tables from scratch
// Create Type 13 record from EFI Variables
// Do we need this record for EFI as the info is available from EFI varaibles
// Also language types don't always match between EFI and SMBIOS
// CreateSmbiosLanguageInformation (1, gSmbiosLangToEfiLang);
CreatePlatformSmbiosMemoryRecords ();
return EFI_SUCCESS;
}