+++ /dev/null
-/** @file\r
- Routines that support Memory SubClass data records translation.\r
- \r
-Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "Thunk.h"\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type 2 -- Physical Memory\r
- Array.\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType2 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_MEMORY_ARRAY_LOCATION_DATA *PhyMemArray;\r
- FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA *FrameworkPhyMemArray;\r
- UINT32 MemoryCapacity;\r
- UINT16 NumberMemoryDevices;\r
- UINT16 Test16;\r
-\r
- Status = EFI_SUCCESS;\r
- PhyMemArray = (EFI_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
- FrameworkPhyMemArray = (FRAMEWORK_MEMORY_ARRAY_LOCATION_DATA *) RecordData;\r
-\r
- *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Location)) = (UINT8) (PhyMemArray->MemoryArrayLocation);\r
- *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, Use)) = (UINT8) (PhyMemArray->MemoryArrayUse);\r
- *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorCorrection)) = (UINT8) (PhyMemArray->MemoryErrorCorrection);\r
-\r
- if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
- MemoryCapacity = (UINT32) (((UINTN) PhyMemArray->MaximumMemoryCapacity.Value) << PhyMemArray->MaximumMemoryCapacity.Exponent);\r
- NumberMemoryDevices = PhyMemArray->NumberMemoryDevices;\r
- } else {\r
- //\r
- // Support EDk/Framework defined Data strucutre.\r
- //\r
- MemoryCapacity = FrameworkPhyMemArray->MaximumMemoryCapacity;\r
- NumberMemoryDevices = FrameworkPhyMemArray->NumberMemoryDevices;\r
- }\r
-\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE16, MaximumCapacity),\r
- &MemoryCapacity,\r
- 4\r
- );\r
-\r
- Test16 = 0xfffe;\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, MemoryErrorInformationHandle),\r
- &Test16,\r
- 2\r
- );\r
- \r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE16, NumberOfMemoryDevices),\r
- &NumberMemoryDevices,\r
- 2\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type 3 -\r
- - Memory Device: SMBIOS Type 17\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType3 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_ARRAY_LINK_DATA *MemDevice;\r
- FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
- UINT64 MemoryDeviceSize;\r
- BOOLEAN MemoryDeviceSizeUnitMega;\r
- UINT16 MemoryDeviceSpeed;\r
- UINT16 MemoryDeviceExponent;\r
- UINT16 Test16;\r
-\r
- MemDevice = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
- FrameworkMemDevice = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
- MemoryDeviceSpeed = 0;\r
- MemoryDeviceExponent = 0;\r
-\r
- //\r
- // Memory Device Locator\r
- //\r
- SmbiosFldString (\r
- StructureNode,\r
- OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceLocator),\r
- &(MemDevice->MemoryDeviceLocator),\r
- sizeof (STRING_REF)\r
- );\r
-\r
- //\r
- // Memory Bank Locator\r
- //\r
- SmbiosFldString (\r
- StructureNode,\r
- OFFSET_OF (SMBIOS_TABLE_TYPE17, BankLocator),\r
- &(MemDevice->MemoryBankLocator),\r
- sizeof (STRING_REF)\r
- );\r
-\r
- //\r
- // Memory Manufacturer\r
- //\r
- SmbiosFldString (\r
- StructureNode,\r
- OFFSET_OF (SMBIOS_TABLE_TYPE17, Manufacturer),\r
- &(MemDevice->MemoryManufacturer),\r
- sizeof (STRING_REF)\r
- );\r
-\r
- //\r
- // Memory Serial Number\r
- //\r
- SmbiosFldString (\r
- StructureNode,\r
- OFFSET_OF (SMBIOS_TABLE_TYPE17, SerialNumber),\r
- &(MemDevice->MemorySerialNumber),\r
- sizeof (STRING_REF)\r
- );\r
-\r
- //\r
- // Memory Asset Tag\r
- //\r
- SmbiosFldString (\r
- StructureNode,\r
- OFFSET_OF (SMBIOS_TABLE_TYPE17, AssetTag),\r
- &(MemDevice->MemoryAssetTag),\r
- sizeof (STRING_REF)\r
- );\r
-\r
- //\r
- // Memory Part Number\r
- //\r
- SmbiosFldString (\r
- StructureNode,\r
- OFFSET_OF (SMBIOS_TABLE_TYPE17, PartNumber),\r
- &(MemDevice->MemoryPartNumber),\r
- sizeof (STRING_REF)\r
- );\r
-\r
- //\r
- // Memory Array Link\r
- //\r
- SmbiosFldInterLink (\r
- StructureNode,\r
- (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryArrayHandle),\r
- 16, // SMBIOS type 16\r
- &MemDevice->MemoryArrayLink,\r
- &gEfiMemorySubClassGuid\r
- );\r
-\r
- //\r
- // Set Memory Error Information Handle to Not supported\r
- //\r
- Test16 = 0xfffe;\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryErrorInformationHandle),\r
- &Test16,\r
- sizeof (EFI_SMBIOS_HANDLE)\r
- ); \r
- \r
- //\r
- // Total width\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TotalWidth),\r
- &MemDevice->MemoryTotalWidth,\r
- 2\r
- );\r
-\r
- //\r
- // Data Width\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DataWidth),\r
- &MemDevice->MemoryDataWidth,\r
- 2\r
- );\r
-\r
- //\r
- // Device Size\r
- //\r
- if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
- //\r
- // Form Factor\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
- &MemDevice->MemoryFormFactor,\r
- 1\r
- );\r
- \r
- //\r
- // Device Set\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
- &MemDevice->MemoryDeviceSet,\r
- 1\r
- );\r
- \r
- //\r
- // Type\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
- &MemDevice->MemoryType,\r
- 1\r
- );\r
- \r
- //\r
- // Type Detail\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
- &MemDevice->MemoryTypeDetail,\r
- 2\r
- );\r
- \r
- //\r
- // Speed\r
- //\r
- MemoryDeviceSpeed = MemDevice->MemorySpeed.Value;\r
- MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
- while (MemoryDeviceExponent-- > 0) {\r
- MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
- }\r
-\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
- &MemoryDeviceSpeed,\r
- 2\r
- );\r
-\r
- MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
- } else {\r
- //\r
- // Form Factor\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, FormFactor),\r
- &FrameworkMemDevice->MemoryFormFactor,\r
- 1\r
- );\r
- \r
- //\r
- // Device Set\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, DeviceSet),\r
- &FrameworkMemDevice->MemoryDeviceSet,\r
- 1\r
- );\r
- \r
- //\r
- // Type\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, MemoryType),\r
- &FrameworkMemDevice->MemoryType,\r
- 1\r
- );\r
- \r
- //\r
- // Type Detail\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, TypeDetail),\r
- &FrameworkMemDevice->MemoryTypeDetail,\r
- 2\r
- );\r
- \r
- //\r
- // Speed\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Speed),\r
- &FrameworkMemDevice->MemorySpeed,\r
- 2\r
- );\r
-\r
- MemoryDeviceSize = FrameworkMemDevice->MemoryDeviceSize;\r
- }\r
-\r
- MemoryDeviceSizeUnitMega = FALSE;\r
- MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 10);\r
- //\r
- // kilo as unit\r
- //\r
- if (MemoryDeviceSize > 0xffff) {\r
- MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 10);\r
- //\r
- // Mega as unit\r
- //\r
- MemoryDeviceSizeUnitMega = TRUE;\r
- }\r
-\r
- MemoryDeviceSize = MemoryDeviceSize & 0x7fff;\r
- if (MemoryDeviceSize != 0 && !MemoryDeviceSizeUnitMega) {\r
- MemoryDeviceSize |= 0x8000;\r
- }\r
-\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE17, Size),\r
- &MemoryDeviceSize,\r
- 2\r
- );\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type 3 -\r
- - Memory Device: SMBIOS Type 6\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldSMBIOSType6 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_ARRAY_LINK_DATA *MemDevice;\r
- UINT64 MemoryDeviceSize;\r
- UINT8 MemSize;\r
- UINT16 MemType;\r
- UINT8 MemSpeed;\r
- FRAMEWORK_MEMORY_ARRAY_LINK_DATA *FrameworkMemDevice;\r
- UINT16 MemoryDeviceSpeed;\r
- UINT16 MemoryDeviceExponent;\r
-\r
- MemDevice = (EFI_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
- FrameworkMemDevice = (FRAMEWORK_MEMORY_ARRAY_LINK_DATA *) RecordData;\r
- MemoryDeviceExponent = 0;\r
-\r
- //\r
- // Memory Device Locator\r
- //\r
- SmbiosFldString (\r
- StructureNode,\r
- OFFSET_OF (SMBIOS_TABLE_TYPE6, SocketDesignation),\r
- &(MemDevice->MemoryDeviceLocator),\r
- 2\r
- );\r
- \r
- if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
- MemoryDeviceSpeed = MemDevice->MemorySpeed.Value;\r
- MemoryDeviceExponent = MemDevice->MemorySpeed.Exponent;\r
- while (MemoryDeviceExponent-- > 0) {\r
- MemoryDeviceSpeed = (UINT16) (MemoryDeviceSpeed * 10);\r
- }\r
- MemoryDeviceSize = (UINT64) (((UINTN) MemDevice->MemoryDeviceSize.Value) << MemDevice->MemoryDeviceSize.Exponent);\r
- } else {\r
- //\r
- // Support EDk/Framework defined Data strucutre.\r
- //\r
- MemoryDeviceSpeed = FrameworkMemDevice->MemorySpeed;\r
- MemoryDeviceSize = FrameworkMemDevice->MemoryDeviceSize;\r
- }\r
- \r
- if (MemoryDeviceSpeed == 0) {\r
- MemSpeed = 0;\r
- } else {\r
- //\r
- // Memory speed is in ns unit\r
- //\r
- MemSpeed = (UINT8)(1000 / MemoryDeviceSpeed);\r
- }\r
-\r
- CopyMem (\r
- (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentSpeed),\r
- &MemSpeed,\r
- 1\r
- );\r
-\r
-\r
- //\r
- // Device Size\r
- //\r
- MemSize = 0;\r
- if (MemoryDeviceSize == 0) {\r
- MemSize = 0x7F;\r
- } else {\r
- MemoryDeviceSize = RShiftU64 (MemoryDeviceSize, 21);\r
- while (MemoryDeviceSize != 0) {\r
- MemSize++;\r
- MemoryDeviceSize = RShiftU64(MemoryDeviceSize,1);\r
- }\r
- }\r
-\r
- CopyMem (\r
- (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, InstalledSize),\r
- &MemSize,\r
- 1\r
- );\r
-\r
- CopyMem (\r
- (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, EnabledSize),\r
- &MemSize,\r
- 1\r
- );\r
-\r
- //\r
- // According SMBIOS SPEC Type 6 definition\r
- //\r
- MemType = 0;\r
- if (!FeaturePcdGet(PcdFrameworkCompatibilitySupport)) {\r
- if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
- MemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
- MemType |= 1<<8;\r
- }\r
- \r
- if (MemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
- MemType |= 1<<7;\r
- }\r
- \r
- if (MemDevice->MemoryType == EfiMemoryTypeSdram) {\r
- MemType |= 1<<10;\r
- }\r
- \r
- if (MemDevice->MemoryTypeDetail.Edo == 1) {\r
- MemType |= 1<<4;\r
- }\r
- \r
- if (MemDevice->MemoryTypeDetail.FastPaged == 1) {\r
- MemType |= 1<<3;\r
- }\r
- } else {\r
- //\r
- // Support EDk/Framework defined Data strucutre.\r
- //\r
- if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorDimm ||\r
- FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorFbDimm) {\r
- MemType |= 1<<8;\r
- }\r
- \r
- if (FrameworkMemDevice->MemoryFormFactor == EfiMemoryFormFactorSimm) {\r
- MemType |= 1<<7;\r
- }\r
- \r
- if (FrameworkMemDevice->MemoryType == EfiMemoryTypeSdram) {\r
- MemType |= 1<<10;\r
- }\r
- \r
- if (FrameworkMemDevice->MemoryTypeDetail.Edo == 1) {\r
- MemType |= 1<<4;\r
- }\r
- \r
- if (FrameworkMemDevice->MemoryTypeDetail.FastPaged == 1) {\r
- MemType |= 1<<3;\r
- }\r
- }\r
- //\r
- // Form Factor\r
- //\r
- CopyMem (\r
- (UINT8*)StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE6, CurrentMemoryType),\r
- &MemType,\r
- 2\r
- );\r
-\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type 4\r
- -- Memory Array Mapped Address: SMBIOS Type 19\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType4 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_ARRAY_START_ADDRESS_DATA *Masa;\r
- EFI_PHYSICAL_ADDRESS TempData;\r
-\r
- Masa = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) RecordData;\r
-\r
- //\r
- // Starting Address\r
- //\r
- TempData = RShiftU64 (Masa->MemoryArrayStartAddress, 10);\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, StartingAddress),\r
- &TempData,\r
- 4\r
- );\r
-\r
- //\r
- // Ending Address\r
- //\r
- TempData = RShiftU64 (Masa->MemoryArrayEndAddress, 10);\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, EndingAddress),\r
- &TempData,\r
- 4\r
- );\r
-\r
- //\r
- // Partition Width\r
- //\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE19, PartitionWidth),\r
- &Masa->MemoryArrayPartitionWidth,\r
- 1\r
- );\r
-\r
- //\r
- // Physical Memory Array Link\r
- //\r
- return SmbiosFldInterLink (\r
- StructureNode,\r
- (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE19, MemoryArrayHandle),\r
- 16, // SMBIOS type 16\r
- &Masa->PhysicalMemoryArrayLink,\r
- &gEfiMemorySubClassGuid\r
- );\r
-\r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type 5\r
- -- Memory Device Mapped Address: SMBIOS Type 20\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType5 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_DEVICE_START_ADDRESS_DATA *Mdsa;\r
- EFI_PHYSICAL_ADDRESS TempData;\r
-\r
- Mdsa = (EFI_MEMORY_DEVICE_START_ADDRESS_DATA *) RecordData;\r
-\r
- //\r
- // Starting Address\r
- //\r
- TempData = RShiftU64 (Mdsa->MemoryDeviceStartAddress, 10);\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, StartingAddress),\r
- &TempData,\r
- 4\r
- );\r
-\r
- //\r
- // Ending Address\r
- //\r
- TempData = RShiftU64 (Mdsa->MemoryDeviceEndAddress, 10);\r
- CopyMem (\r
- (UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, EndingAddress),\r
- &TempData,\r
- 4\r
- );\r
-\r
- //\r
- // Memory Device Link\r
- //\r
- SmbiosFldInterLink (\r
- StructureNode,\r
- (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryDeviceHandle),\r
- 17, // SMBIOS type 17\r
- &Mdsa->PhysicalMemoryDeviceLink,\r
- &gEfiMemorySubClassGuid\r
- );\r
-\r
- //\r
- // Memory Array Mapped Address Link\r
- //\r
- SmbiosFldInterLink (\r
- StructureNode,\r
- (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE20, MemoryArrayMappedAddressHandle),\r
- 19, // SMBIOS type 19\r
- &Mdsa->PhysicalMemoryArrayLink,\r
- &gEfiMemorySubClassGuid\r
- );\r
-\r
- //\r
- // Memory Device Partition Row Position\r
- //\r
- *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, PartitionRowPosition)) = (UINT8) Mdsa->MemoryDevicePartitionRowPosition;\r
-\r
- //\r
- // Memory Device Interleave Position\r
- //\r
- *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavePosition)) = (UINT8) Mdsa->MemoryDeviceInterleavePosition;\r
-\r
- //\r
- // Memory Device Interleave Data Depth\r
- //\r
- *(UINT8 *) ((UINT8 *) StructureNode->Structure + OFFSET_OF (SMBIOS_TABLE_TYPE20, InterleavedDataDepth)) = (UINT8) Mdsa->MemoryDeviceInterleaveDataDepth;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type 6\r
- -- Memory Channel Type: SMBIOS Type 37\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType6 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_CHANNEL_TYPE_DATA *McTa;\r
- EFI_STATUS Status;\r
-\r
- McTa = (EFI_MEMORY_CHANNEL_TYPE_DATA *) RecordData;\r
-\r
- *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, ChannelType)) = (UINT8) (McTa->MemoryChannelType);\r
-\r
- *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MaximumChannelLoad)) = (UINT8) (McTa->MemoryChannelMaximumLoad);\r
-\r
- *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDeviceCount)) = (UINT8) (McTa->MemoryChannelDeviceCount);\r
-\r
- //\r
- // Update the length field\r
- // Multiple device loads are filled through SmbiosFldMemoryType7\r
- //\r
- StructureNode->Structure->Length = (UINT8)(StructureNode->Structure->Length + \r
- sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount);\r
- Status = SmbiosEnlargeStructureBuffer(\r
- StructureNode, \r
- StructureNode->Structure->Length,\r
- StructureNode->StructureSize,\r
- StructureNode->StructureSize + sizeof(MEMORY_DEVICE) * McTa->MemoryChannelDeviceCount\r
- );\r
- return Status;\r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type 7\r
- -- Memory Channel Device: SMBIOS Type 37\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType7 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_CHANNEL_DEVICE_DATA *Mcdd;\r
- UINTN DeviceLoadOffset;\r
- UINTN DeviceLoadHandleOffset;\r
-\r
- Mcdd = (EFI_MEMORY_CHANNEL_DEVICE_DATA *) RecordData;\r
-\r
- if (Mcdd->DeviceId < 1) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- DeviceLoadOffset = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[0]) + 3 * (Mcdd->DeviceId - 1);\r
- DeviceLoadHandleOffset = OFFSET_OF (SMBIOS_TABLE_TYPE37, MemoryDevice[1]) + 3 * (Mcdd->DeviceId - 1);\r
-\r
- *(UINT8 *) ((UINT8 *) (StructureNode->Structure) + DeviceLoadOffset) = (UINT8) (Mcdd->MemoryChannelDeviceLoad);\r
-\r
- //\r
- // Memory Device Handle Link\r
- //\r
- return SmbiosFldInterLink (\r
- StructureNode,\r
- (UINT16) DeviceLoadHandleOffset,\r
- 17, // Smbios type 17 -- Physical Memory Device\r
- &Mcdd->DeviceLink,\r
- &gEfiMemorySubClassGuid\r
- );\r
-\r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type 8\r
- -- Memory Controller information: SMBIOS Type 5\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType8 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_CONTROLLER_INFORMATION_DATA *MemoryController;\r
- UINT32 NewMinimalSize;\r
- UINT16 Count;\r
- EFI_INTER_LINK_DATA *Link; \r
- EFI_STATUS Status;\r
- \r
- NewMinimalSize = 0;\r
-\r
- //\r
- // There is an update from EFI_MEMORY_CONTROLLER_INFORMATION to\r
- // EFI_MEMORY_CONTROLLER_INFORMATION_DATA. Multiple MemoryModuleConfig\r
- // handles are filled.\r
- //\r
- MemoryController = (EFI_MEMORY_CONTROLLER_INFORMATION_DATA *)RecordData;\r
- \r
- //\r
- // ErrorDetectingMethod\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrDetectMethod),\r
- &MemoryController->ErrorDetectingMethod,\r
- 1\r
- ); \r
-\r
- //\r
- // ErrorCorrectingCapability\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, ErrCorrectCapability),\r
- &MemoryController->ErrorCorrectingCapability,\r
- 1\r
- );\r
- \r
- //\r
- // MemorySupportedInterleave\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportInterleave),\r
- &MemoryController->MemorySupportedInterleave,\r
- 1\r
- );\r
- \r
- //\r
- // MemoryCurrentInterleave\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, CurrentInterleave),\r
- &MemoryController->MemoryCurrentInterleave,\r
- 1\r
- ); \r
- \r
- //\r
- // MaxMemoryModuleSize\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MaxMemoryModuleSize),\r
- &MemoryController->MaxMemoryModuleSize,\r
- 1\r
- );\r
- \r
- //\r
- // MemorySpeedType\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportSpeed),\r
- &MemoryController->MemorySpeedType,\r
- 2\r
- ); \r
-\r
- //\r
- // MemorySupportedType\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, SupportMemoryType),\r
- &MemoryController->MemorySupportedType,\r
- 2\r
- ); \r
-\r
- //\r
- // MemoryModuleVoltage\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleVoltage),\r
- &MemoryController->MemoryModuleVoltage,\r
- 1\r
- ); \r
-\r
- //\r
- // NumberofMemorySlot\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, AssociatedMemorySlotNum),\r
- &MemoryController->NumberofMemorySlot,\r
- 1\r
- ); \r
- \r
- if (MemoryController->NumberofMemorySlot == 0) {\r
- //\r
- // EnabledCorrectingCapability\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles),\r
- &MemoryController->EnabledCorrectingCapability,\r
- 1\r
- ); \r
- } else {\r
- //\r
- // Memory module configuration handles exist\r
- // we should enlarge smbios entry buffer from minimal size\r
- //\r
- NewMinimalSize = (MemoryController->NumberofMemorySlot) * sizeof(UINT16) + StructureNode->StructureSize;\r
- StructureNode->Structure->Length = (UINT8) (NewMinimalSize - 2);\r
- Status = SmbiosEnlargeStructureBuffer (StructureNode, StructureNode->Structure->Length, StructureNode->StructureSize, NewMinimalSize);\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- //\r
- // MemoryModuleConfigHandles\r
- //\r
- for (Count = 0, Link = MemoryController->MemoryModuleConfig; \r
- Count < MemoryController->NumberofMemorySlot; \r
- Count++, Link++) {\r
- SmbiosFldInterLink (\r
- StructureNode,\r
- (UINT16) (OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + Count * sizeof(UINT16)),\r
- 6, // SMBIOS type 6\r
- Link,\r
- &gEfiMemorySubClassGuid\r
- );\r
- }\r
- \r
- //\r
- // EnabledCorrectingCapability\r
- // \r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE5, MemoryModuleConfigHandles) + (MemoryController->NumberofMemorySlot) * sizeof(UINT16),\r
- &MemoryController->EnabledCorrectingCapability,\r
- 1\r
- );\r
- }\r
- \r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type \r
- -- Memory 32 Bit Error Information: SMBIOS Type 18\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType9 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_32BIT_ERROR_INFORMATION *MemoryInfo;\r
- \r
- MemoryInfo = (EFI_MEMORY_32BIT_ERROR_INFORMATION *)RecordData;\r
- \r
- //\r
- // MemoryErrorType\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorType),\r
- &MemoryInfo->MemoryErrorType,\r
- 1\r
- );\r
- \r
- //\r
- // MemoryErrorGranularity\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorGranularity),\r
- &MemoryInfo->MemoryErrorGranularity,\r
- 1\r
- ); \r
-\r
- //\r
- // MemoryErrorOperation\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorOperation),\r
- &MemoryInfo->MemoryErrorOperation,\r
- 1\r
- ); \r
-\r
- //\r
- // VendorSyndrome\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, VendorSyndrome),\r
- &MemoryInfo->VendorSyndrome,\r
- 4\r
- ); \r
-\r
- //\r
- // MemoryArrayErrorAddress\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, MemoryArrayErrorAddress),\r
- &MemoryInfo->MemoryArrayErrorAddress,\r
- 4\r
- ); \r
-\r
- //\r
- // DeviceErrorAddress\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, DeviceErrorAddress),\r
- &MemoryInfo->DeviceErrorAddress,\r
- 4\r
- ); \r
-\r
- //\r
- // DeviceErrorResolution\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE18, ErrorResolution),\r
- &MemoryInfo->DeviceErrorResolution,\r
- 4\r
- ); \r
- \r
- return EFI_SUCCESS; \r
-}\r
-\r
-/**\r
- Field Filling Function for Memory SubClass record type \r
- -- Memory 64 Bit Error Information: SMBIOS Type 33\r
- \r
- @param StructureNode Pointer to SMBIOS_STRUCTURE_NODE which is current processed.\r
- @param Offset Offset of SMBIOS record which RecordData will be filled.\r
- @param RecordData RecordData buffer will be filled.\r
- @param RecordDataSize The size of RecordData buffer.\r
- \r
- @retval EFI_SUCCESS Success fill RecordData into SMBIOS's record buffer.\r
-**/\r
-EFI_STATUS\r
-SmbiosFldMemoryType10 (\r
- IN OUT SMBIOS_STRUCTURE_NODE *StructureNode,\r
- IN UINT32 Offset,\r
- IN VOID *RecordData,\r
- IN UINT32 RecordDataSize\r
- )\r
-{\r
- EFI_MEMORY_64BIT_ERROR_INFORMATION *MemoryInfo;\r
- \r
- MemoryInfo = (EFI_MEMORY_64BIT_ERROR_INFORMATION *)RecordData;\r
- \r
- //\r
- // MemoryErrorType\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorType),\r
- &MemoryInfo->MemoryErrorType,\r
- 1\r
- );\r
- \r
- //\r
- // MemoryErrorGranularity\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorGranularity),\r
- &MemoryInfo->MemoryErrorGranularity,\r
- 1\r
- ); \r
-\r
- //\r
- // MemoryErrorOperation\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorOperation),\r
- &MemoryInfo->MemoryErrorOperation,\r
- 1\r
- ); \r
-\r
- //\r
- // VendorSyndrome\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, VendorSyndrome),\r
- &MemoryInfo->VendorSyndrome,\r
- 4\r
- ); \r
-\r
- //\r
- // MemoryArrayErrorAddress\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, MemoryArrayErrorAddress),\r
- &MemoryInfo->MemoryArrayErrorAddress,\r
- 8\r
- ); \r
-\r
- //\r
- // DeviceErrorAddress\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, DeviceErrorAddress),\r
- &MemoryInfo->DeviceErrorAddress,\r
- 8\r
- ); \r
-\r
- //\r
- // DeviceErrorResolution\r
- //\r
- CopyMem (\r
- (UINT8 *) (StructureNode->Structure) + OFFSET_OF (SMBIOS_TABLE_TYPE33, ErrorResolution),\r
- &MemoryInfo->DeviceErrorResolution,\r
- 4\r
- ); \r
- \r
- return EFI_SUCCESS; \r
-}\r