| /** @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_SUCCESS 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; | |
| } |