]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MemoryConv.c
EdkCompatibilityPkg: Remove EdkCompatibilityPkg
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / PiSmbiosRecordOnDataHubSmbiosRecordThunk / MemoryConv.c
diff --git a/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MemoryConv.c b/EdkCompatibilityPkg/Compatibility/PiSmbiosRecordOnDataHubSmbiosRecordThunk/MemoryConv.c
deleted file mode 100644 (file)
index 2a84733..0000000
+++ /dev/null
@@ -1,1089 +0,0 @@
-/** @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