From 72570a1b4d81880b7316fc5f3200ed0db032f1e5 Mon Sep 17 00:00:00 2001 From: lushifex Date: Wed, 28 Jun 2017 11:37:41 +0800 Subject: Vlv2TbltDevicePkg: Add SMBIOS Type 19. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: lushifex --- .../SmBiosMiscDxe/MiscMemoryArrayMappedAddress.uni | Bin 0 -> 1318 bytes .../MiscMemoryArrayMappedAddressData.c | 29 ++++ .../MiscMemoryArrayMappedAddressFunction.c | 146 +++++++++++++++++++++ .../SmBiosMiscDxe/MiscSubclassDriverDataTable.c | 4 +- Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf | 5 +- 5 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddress.uni create mode 100644 Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddressData.c create mode 100644 Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddressFunction.c diff --git a/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddress.uni b/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddress.uni new file mode 100644 index 0000000000..27d298a2d8 Binary files /dev/null and b/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddress.uni differ diff --git a/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddressData.c b/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddressData.c new file mode 100644 index 0000000000..f71b548732 --- /dev/null +++ b/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddressData.c @@ -0,0 +1,29 @@ +/** @file + Static data of Physical Memory Array Mapped Address. SMBIOS Type 19. + + Copyright (c) 2012 - 2017, Intel Corporation. All rights reserved.
+ + 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 "CommonHeader.h" +#include "MiscSubclassDriver.h" + +// +// Static (possibly build generated) Physical Memory Array Mapped Address Data. +// +MISC_SMBIOS_TABLE_DATA(EFI_MEMORY_ARRAY_START_ADDRESS_DATA, MiscMemoryArrayMappedAddress) = +{ + 0, //< StartingAddress + 0, //< EndingAddress + 0, //< MemoryArrayHandle + 0x00 //< Partition Width +}; + diff --git a/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddressFunction.c b/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddressFunction.c new file mode 100644 index 0000000000..27d0ab7f52 --- /dev/null +++ b/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryArrayMappedAddressFunction.c @@ -0,0 +1,146 @@ +/** @file + Dynamic data of Physical Memory Array Mapped Address. SMBIOS Type 19. + + Copyright (c) 2012 - 2017, Intel Corporation. All rights reserved.
+ + 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 "CommonHeader.h" +#include "MiscSubclassDriver.h" +#include +#include +#include + +#define MAX_SOCKETS 2 +#define SMBIOS_TYPE19_USE_EXTENDED_ADDRESSES 0xFFFFFFFF + + +VOID +GetType16Handle ( + IN EFI_SMBIOS_PROTOCOL *Smbios, + OUT EFI_SMBIOS_HANDLE *Handle + ) +{ + EFI_STATUS Status; + EFI_SMBIOS_TYPE RecordType; + EFI_SMBIOS_TABLE_HEADER *Buffer; + + *Handle = 0; + RecordType = EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY; + + Status = Smbios->GetNext ( + Smbios, + Handle, + &RecordType, + &Buffer, + NULL + ); + if (!EFI_ERROR (Status)) { + return; + } + + *Handle = 0xFFFF; +} + + +/** + This function installs SMBIOS Type 19 Table(Physical Memory Array). + + @param RecordData Pointer to copy of RecordData from the Data Table. + + @retval EFI_SUCCESS All parameters were valid. + @retval EFI_UNSUPPORTED Unexpected RecordType value. + @retval EFI_INVALID_PARAMETER Invalid parameter was found. + +**/ +MISC_SMBIOS_TABLE_FUNCTION (MiscMemoryArrayMappedAddress) +{ + EFI_STATUS Status; + UINT64 TotalMemorySizeInKB; + UINT8 Dimm; + EFI_SMBIOS_HANDLE SmbiosHandle; + EFI_MEMORY_ARRAY_START_ADDRESS_DATA *ForType19InputData; + SMBIOS_TABLE_TYPE19 *SmbiosRecord; + MEM_INFO_PROTOCOL *MemInfoHob; + UINT16 Type16Handle = 0; + + TotalMemorySizeInKB = 0; + + // + // First check for invalid parameters. + // + if (RecordData == NULL) { + return EFI_INVALID_PARAMETER; + } + ForType19InputData = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *)RecordData; + + // + // Two zeros following the last string. + // + SmbiosRecord = AllocatePool (sizeof (SMBIOS_TABLE_TYPE19) + 1); + ZeroMem (SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE19) + 1); + + SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS; + SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE19); + + // + // Make handle chosen by smbios protocol.add automatically. + // + SmbiosRecord->Hdr.Handle = 0; + + // + // Get Memory size parameters for each rank from the chipset registers + // + Status = gBS->LocateProtocol ( + &gMemInfoProtocolGuid, + NULL, + (void **) &MemInfoHob + ); + ASSERT_EFI_ERROR (Status); + + // + // Calculate the TotalMemorySizeInKB by adding the size of all populated sockets + // + for (Dimm = 0; Dimm < MAX_SOCKETS; Dimm++) { + TotalMemorySizeInKB += LShiftU64 (MemInfoHob->MemInfoData.dimmSize[Dimm], 10); + } + + if (TotalMemorySizeInKB > SMBIOS_TYPE19_USE_EXTENDED_ADDRESSES) { + SmbiosRecord->StartingAddress = SMBIOS_TYPE19_USE_EXTENDED_ADDRESSES; + SmbiosRecord->EndingAddress = SMBIOS_TYPE19_USE_EXTENDED_ADDRESSES; + SmbiosRecord->ExtendedEndingAddress = TotalMemorySizeInKB - 1; + } else { + SmbiosRecord->EndingAddress = (UINT32) (TotalMemorySizeInKB - 1); + } + + // + // Memory Array Handle will be the 3rd optional string following the formatted structure. + // + GetType16Handle(Smbios, &Type16Handle); + SmbiosRecord->MemoryArrayHandle = Type16Handle; + SmbiosRecord->PartitionWidth = MAX_SOCKETS; + + // + // Now we have got the full smbios record, call smbios protocol to add this record. + // Generate Memory Array Mapped Address info (Type 19) + // + SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; + Status = Smbios-> Add ( + Smbios, + NULL, + &SmbiosHandle, + (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord + ); + FreePool (SmbiosRecord); + + return Status; +} + diff --git a/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c b/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c index 3b77a75443..36c31c0117 100644 --- a/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c +++ b/Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscSubclassDriverDataTable.c @@ -1,6 +1,6 @@ /** @file -Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License that accompanies this distribution. @@ -39,6 +39,7 @@ MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_CHASSIS_MANUFACTURER_DATA, MiscChassisManufac MISC_SMBIOS_TABLE_EXTERNS(EFI_CACHE_VARIABLE_RECORD, MiscProcessorCache, MiscProcessorCache); //type 7 MISC_SMBIOS_TABLE_EXTERNS(EFI_CPU_DATA_RECORD, MiscProcessorInformation, MiscProcessorInformation); //type 4 MISC_SMBIOS_TABLE_EXTERNS(EFI_MEMORY_ARRAY_LOCATION_DATA, MiscPhysicalMemoryArray,MiscPhysicalMemoryArray); +MISC_SMBIOS_TABLE_EXTERNS(EFI_MEMORY_ARRAY_START_ADDRESS_DATA, MiscMemoryArrayMappedAddress, MiscMemoryArrayMappedAddress); //type 19 MISC_SMBIOS_TABLE_EXTERNS(EFI_MEMORY_ARRAY_LINK_DATA, MiscMemoryDevice, MiscMemoryDevice); MISC_SMBIOS_TABLE_EXTERNS(EFI_MISC_PORT_INTERNAL_CONNECTOR_DESIGNATOR_DATA, MiscPortIde1, MiscPortInternalConnectorDesignator); @@ -72,6 +73,7 @@ EFI_MISC_SMBIOS_DATA_TABLE mMiscSubclassDataTable[] = { MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION(MiscProcessorInformation, MiscProcessorInformation), //type 4 MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION(MiscPhysicalMemoryArray, MiscPhysicalMemoryArray), //Type 16 MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION(MiscMemoryDevice, MiscMemoryDevice), //Type 17 + MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION(MiscMemoryArrayMappedAddress, MiscMemoryArrayMappedAddress), //Type 19 MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION(MiscPortIde1, MiscPortInternalConnectorDesignator), MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION(MiscPortIde2, MiscPortInternalConnectorDesignator), MISC_SMBIOS_TABLE_ENTRY_DATA_AND_FUNCTION(MiscPortAtxPower, MiscPortInternalConnectorDesignator), diff --git a/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf b/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf index f88dcbea74..b17e5b72d8 100644 --- a/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf +++ b/Vlv2TbltDevicePkg/SmBiosMiscDxe/SmBiosMiscDxe.inf @@ -2,7 +2,7 @@ # Component name for module MiscSubclass # # FIX ME! -# Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
# # This program and the accompanying materials are licensed and made available under # the terms and conditions of the BSD License that accompanies this distribution. @@ -88,6 +88,9 @@ MiscMemoryDevice.uni MiscMemoryDeviceData.c MiscMemoryDeviceFunction.c + MiscMemoryArrayMappedAddress.uni + MiscMemoryArrayMappedAddressData.c + MiscMemoryArrayMappedAddressFunction.c [Packages] MdeModulePkg/MdeModulePkg.dec -- cgit v1.2.3