/** @file This driver installs SMBIOS information for QSP Copyright (c) 2011, Bei Guan Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SmbiosPlatformDxe.h" /** Get the system memory size below 4GB @return The size of system memory below 4GB **/ UINT32 GetSystemMemorySizeBelow4gb( VOID ) { UINT32 Size; // // CMOS 0x34/0x35 specifies the system memory above 16 MB. // * The size is specified in 64kb chunks // * Since this is memory above 16MB, the 16MB must be added // into the calculation to get the total memory size. // Size = (UINT32) ((CmosRead16 (CMOS_SYSTEM_MEM_ABOVE_16MB_LOW_BYTE) << 16) + SIZE_16MB); return Size; } /** Get the system memory size above 4GB @return The size of system memory above 4GB **/ STATIC UINT64 GetSystemMemorySizeAbove4gb( VOID ) { UINT32 Size; // // CMOS 0x5b-0x5d specifies the system memory above 4GB MB. // * The size is specified in 64kb chunks // Size = (CmosRead16 (CMOS_SYSTEM_MEM_ABOVE_4GB_MIDDLE_BYTE) << 8) + CmosRead8 (CMOS_SYSTEM_MEM_ABOVE_4GB_LOW_BYTE); return LShiftU64 (Size, 16); } /** Installs SMBIOS information for SIMICS QSP @param ImageHandle Module's image handle @param SystemTable Pointer of EFI_SYSTEM_TABLE @retval EFI_SUCCESS Smbios data successfully installed @retval Other Smbios data was not installed **/ EFI_STATUS EFIAPI SmbiosTablePublishEntry ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; EFI_SMBIOS_PROTOCOL *Smbios; SMBIOS_TABLE_TYPE19 *Type19Record; EFI_SMBIOS_HANDLE MemArrayMappedAddrSmbiosHandle; UINT8 NumSlots; UINT64 TotalMemorySize; // // Find the SMBIOS protocol // Status = gBS->LocateProtocol ( &gEfiSmbiosProtocolGuid, NULL, (VOID**)&Smbios ); if (EFI_ERROR (Status)) { return Status; } // // Generate Memory Array Mapped Address info // NumSlots = 2; TotalMemorySize = 0; TotalMemorySize = GetSystemMemorySizeBelow4gb(); Type19Record = AllocatePool(sizeof(SMBIOS_TABLE_TYPE19)); ZeroMem(Type19Record, sizeof(SMBIOS_TABLE_TYPE19)); Type19Record->Hdr.Type = EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS; Type19Record->Hdr.Length = sizeof(SMBIOS_TABLE_TYPE19); Type19Record->Hdr.Handle = 0; Type19Record->StartingAddress = 0; Type19Record->EndingAddress = (UINT32)RShiftU64(TotalMemorySize, 10) - 1; Type19Record->MemoryArrayHandle = SMBIOS_HANDLE_PI_RESERVED; Type19Record->PartitionWidth = (UINT8)(NumSlots); MemArrayMappedAddrSmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; Status = Smbios->Add(Smbios, NULL, &MemArrayMappedAddrSmbiosHandle, (EFI_SMBIOS_TABLE_HEADER*)Type19Record); ASSERT_EFI_ERROR(Status); TotalMemorySize = GetSystemMemorySizeAbove4gb(); Type19Record->StartingAddress = 0xFFFFFFFF; Type19Record->ExtendedStartingAddress = 0xFFFFFFFF; Type19Record->ExtendedEndingAddress = TotalMemorySize + 0xFFFFFFFF - 1; MemArrayMappedAddrSmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; Status = Smbios->Add(Smbios, NULL, &MemArrayMappedAddrSmbiosHandle, (EFI_SMBIOS_TABLE_HEADER*)Type19Record); FreePool(Type19Record); ASSERT_EFI_ERROR(Status); return Status; }