summaryrefslogtreecommitdiff
path: root/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2012-01-30 18:57:30 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2012-01-30 18:57:30 +0000
commit63f9b9b9312f3e08c92a2ea3cdbe01e723ef653b (patch)
tree343c98a61e10e79df6b01c2b3ea7a637ef80020f /EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
parent8bb7441edd2d41b03af0666367ce0bc7a78080a5 (diff)
downloadedk2-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.c141
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