/** @file Static SMBIOS Table for platform Copyright (c) 2012, Apple Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include 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; }