diff options
author | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2012-01-30 18:57:30 +0000 |
---|---|---|
committer | andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524> | 2012-01-30 18:57:30 +0000 |
commit | 63f9b9b9312f3e08c92a2ea3cdbe01e723ef653b (patch) | |
tree | 343c98a61e10e79df6b01c2b3ea7a637ef80020f /EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c | |
parent | 8bb7441edd2d41b03af0666367ce0bc7a78080a5 (diff) | |
download | edk2-platforms-63f9b9b9312f3e08c92a2ea3cdbe01e723ef653b.tar.xz |
Add a new SMBIOS Library, and platform SMBIOS driver that does not use Framework or Hii.
Note: The SmbiosLib should probably be moved to MdePkg after a full code review.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12966 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c')
-rw-r--r-- | EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c new file mode 100644 index 0000000000..43bf17ec31 --- /dev/null +++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c @@ -0,0 +1,141 @@ +/** @file + Static SMBIOS Table for platform + + + Copyright (c) 2012, Apple Inc. 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. + +**/ + +#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 = SmbiosGetRecord (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 = SmbiosGetRecord (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; + + CreateSmbiosEntry ((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 +PlatfomrSmbiosDriverEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_SMBIOS_HANDLE SmbiosHandle; + SMBIOS_STRUCTURE_POINTER Smbios; + UINT8 SmbiosMajorVersion; + UINT8 SmbiosMinorVersion; + + Status = SmbiosGetVersion (&SmbiosMajorVersion, &SmbiosMinorVersion); + ASSERT_EFI_ERROR (Status); + + // 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 = InitializeSmbiosTableFromTemplate (gSmbiosTemplate); + ASSERT_EFI_ERROR (Status); + + // Phase 2 - Patch SMBIOS table entries + + Smbios.Hdr = SmbiosGetRecord (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; + + SmbiosUpdateUnicodeString ( + SmbiosHandle, + Smbios.Type0->BiosVersion, + (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString) + ); + SmbiosUpdateUnicodeString ( + 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 availible from EFI varaibles + // Also language types don't always match between EFI and SMBIOS + // CreateSmbiosLanguageInformation (1, gSmbiosLangToEfiLang); + + CreatePlatformSmbiosMemoryRecords (); + + return EFI_SUCCESS; +}
\ No newline at end of file |